ansandClaude Fable 5 f8bdd7f08f feat: feed 回源支持指定 User-Agent(FeedOptions)
新增 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>
2026-08-07 11:51:23 +08:00
2025-03-28 22:27:08 +08:00

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文件。

S
Description
No description provided
Readme
123 KiB
Languages
Go 100%