Files
podcast-search-go/model/podcast.go
2025-04-09 15:26:25 +08:00

95 lines
2.0 KiB
Go

// Package model 提供播客和剧集的数据模型
package model
import (
"errors"
"fmt"
"github.com/mmcdole/gofeed"
)
// Podcast 表示一个播客及其剧集
type Podcast struct {
// 播客的唯一标识符
GUID string `json:"guid,omitempty"`
// 播客的URL
URL string `json:"url,omitempty"`
// 播客的链接
Link string `json:"link,omitempty"`
// 播客的标题
Title string `json:"title,omitempty"`
// 播客的描述
Description string `json:"description,omitempty"`
// 播客的图片URL
Image string `json:"image,omitempty"`
// 版权信息
Copyright string `json:"copyright,omitempty"`
// 语言
Language string `json:"language,omitempty"`
// 是否锁定,表示此订阅是否可以被导入到其他平台
Locked *Locked `json:"locked,omitempty"`
// 资金支持信息
Funding []Funding `json:"funding,omitempty"`
// 人员信息
Persons []Person `json:"persons,omitempty"`
// 价值交换信息
Value []Value `json:"value,omitempty"`
// 阻止标签
Block []Block `json:"block,omitempty"`
// 剧集列表
Episodes []*gofeed.Item `json:"episodes,omitempty"`
// 远程项目
RemoteItems []RemoteItem `json:"remote_items,omitempty"`
// 媒体类型
Medium Medium `json:"medium,omitempty"`
}
// LoadFeed 从URL加载播客RSS订阅
func LoadFeed(url string) (*Podcast, error) {
fp := gofeed.NewParser()
feed, err := fp.ParseURL(url)
if err != nil {
return nil, fmt.Errorf("解析播客订阅失败: %w", err)
}
if feed == nil {
return nil, errors.New("解析播客订阅失败: 空订阅")
}
imageURL := ""
if feed.Image != nil {
imageURL = feed.Image.URL
}
podcast := &Podcast{
Title: feed.Title,
Description: feed.Description,
Link: feed.Link,
Image: imageURL,
Copyright: feed.Copyright,
Language: feed.Language,
Episodes: feed.Items,
Funding: make([]Funding, 0),
Persons: make([]Person, 0),
Value: make([]Value, 0),
Block: make([]Block, 0),
Medium: MediumPodcast,
}
return podcast, nil
}