f8bdd7f08f70840f307d7ed2c47c55216e25d567
新增 LoadFeedWithOptions(ctx, feedURL, FeedOptions{Proxy, Timeout, UserAgent}),
LoadFeed / LoadFeedContext 签名一字不改、降级为它的包装——库自身 main.go 与四个
既有测试的 5 处调用因此零改动。
动机:调用方要把「回源 feed」和「可达性探测」用同一个 UA 发出去,两者视角不一致
则打标不可信;而此前 UA 写死在函数体里、无从覆盖。
空 UA 不原样发出而是回落默认:gofeed 无条件 Header.Set("User-Agent", …),net/http
见到空值会把整条头省掉,而不发 UA 比发任何 UA 都更容易被拒(实测有源站对无 UA
请求直接 403)。
默认值保持原样并提为导出常量 DefaultUserAgent。顺带把它的 doc comment 从「不知道
当年为什么设成 Chrome」改成实测得出的可检验规则:约束是「不得是 HTTP 库出厂 UA、
不得为空」,而非「必须是浏览器」——feed.xyzfm.space 对 "Gofeed/1.0"(ec79b8b 之前
本函数实际发出的值)与 "Go-http-client/1.1" 返回 403 且响应头写明
X-Tengine-Error: denied by UA ACL = blacklist,而 Chrome、txpodcast/1.0、
podcast-search-go/0.1 一律放行。
补 UA 断言测试(此前四个测试从未断言过 UA):显式 UA 逐字节发出、空串回落默认、
旧签名仍发默认、timeout<=0 仍回落 30s。已验证注入回归时会红。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Podcast Search for Go
这是一个用于搜索播客和解析播客RSS订阅的Go库。支持iTunes和PodcastIndex目录,以及章节和转录等新功能。
功能
- 通过iTunes和PodcastIndex搜索播客
- 解析播客RSS订阅
- 获取播客剧集详情
- 支持播客章节和转录
安装
go get github.com/amugofjava/podcast_search/golang
使用方法
搜索播客
package main
import (
"fmt"
"github.com/amugofjava/podcast_search/golang/search"
)
func main() {
// 创建iTunes搜索提供者
searchProvider := search.NewITunesProvider()
// 搜索播客
result, err := searchProvider.SearchPodcasts("golang", nil)
if err != nil {
fmt.Printf("搜索错误: %v\n", err)
return
}
// 打印结果
fmt.Printf("找到 %d 个播客\n", result.ResultCount)
for _, item := range result.Items {
fmt.Printf("标题: %s\n", item.Title)
fmt.Printf("作者: %s\n", item.Author)
fmt.Printf("Feed URL: %s\n\n", item.FeedURL)
}
}
加载播客订阅
package main
import (
"fmt"
"github.com/amugofjava/podcast_search/golang/model"
)
func main() {
// 加载播客订阅
podcast, err := model.LoadFeed("https://feeds.simplecast.com/XA_851k3")
if err != nil {
fmt.Printf("加载订阅错误: %v\n", err)
return
}
// 打印播客信息
fmt.Printf("标题: %s\n", podcast.Title)
fmt.Printf("描述: %s\n", podcast.Description)
fmt.Printf("剧集数量: %d\n\n", len(podcast.Episodes))
// 打印剧集信息
for i, episode := range podcast.Episodes {
if i >= 3 {
break // 只显示前3个剧集
}
fmt.Printf("剧集: %s\n", episode.Title)
fmt.Printf("发布日期: %s\n\n", episode.PublicationDate)
}
}
许可证
此库使用MIT许可证。详情请参阅LICENSE文件。
Languages
Go
100%