// 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 }