package main import ( "fmt" "strconv" "github.com/ikuiki/go-component/language" ) // AV: // [GET]https://api.bilibili.com/x/player/pagelist?aid=1742929&jsonp=jsonp // EP: // [GET]https://api.bilibili.com/pgc/web/season/section?season_id=53&season_type=1 // EpisodeDataProvider 定义数据来源接口 type EpisodeDataProvider interface { // GetEpisodeData 获取分集数据 GetEpisodeData(videoNo string, skipIndex ...int64) (episodes []episode, err error) // GetEPData 根据视频号获取视频的集数据 GetEPData(videoNo int64) (epdatas []EPData, err error) // GetAvData 根据av号获取av视频的集数据 GetAVData(avNo int64) (avdatas []AVData, err error) } type episode struct { Index int64 `json:"index"` Cid int64 `json:"cid"` Title string `json:"title"` } type episodeDataProvider struct { dataSource DataSource } // NewEpisodeDataProvider 创建episodeDataProvider func NewEpisodeDataProvider(dataSource DataSource) EpisodeDataProvider { provider := new(episodeDataProvider) provider.dataSource = dataSource return provider } func (provider *episodeDataProvider) GetEpisodeData(videoNo string, skipIndex ...int64) (episodes []episode, err error) { videoType := videoNo[0:2] videoID, err := strconv.ParseInt(videoNo[2:], 10, 64) if err != nil { return } fmt.Println(videoType, videoID) switch videoType { case "av": avdatas, err := provider.GetAVData(videoID) if err != nil { return episodes, err } for i, avdata := range avdatas { index := int64(i) + 1 if language.ArrayIn(skipIndex, index) == -1 { episodes = append(episodes, episode{ Index: index, Cid: avdata.Cid, Title: avdata.Part, }) } } case "ep": epdatas, err := provider.GetEPData(videoID) if err != nil { return episodes, err } for i, epdata := range epdatas { index := int64(i) + 1 if language.ArrayIn(skipIndex, index) == -1 { episodes = append(episodes, episode{ Index: index, Cid: epdata.Cid, Title: epdata.LongTitle, }) } } } return }