diff --git a/avsource.go b/avsource.go new file mode 100644 index 0000000..c07dd2c --- /dev/null +++ b/avsource.go @@ -0,0 +1,32 @@ +package main + +// epDataProvider中 + +// AVData av视频信息 +type AVData struct { + Cid int64 `json:"cid"` + Dimension struct { + Height int64 `json:"height"` + Rotate int64 `json:"rotate"` + Width int64 `json:"width"` + } `json:"dimension"` + Duration int64 `json:"duration"` + From string `json:"from"` + Page int64 `json:"page"` + Part string `json:"part"` + Vid string `json:"vid"` + Weblink string `json:"weblink"` +} + +// AVResponse av视频信息请求接口返回数据 +type AVResponse struct { + Code int64 `json:"code"` + Data []AVData `json:"data"` + Message string `json:"message"` + TTL int64 `json:"ttl"` +} + +// GetAVData 根据videoNo从bilibili获取av数据 +func (*episodeDataProvider) GetAVData(avNo int64) (avdatas []AVData, err error) { + return +} diff --git a/datasource.go b/datasource.go index 3488257..1dc0a1d 100644 --- a/datasource.go +++ b/datasource.go @@ -1,31 +1,17 @@ package main -// EPData 视频信息 -type EPData struct { - Cid int64 `json:"cid"` - Dimension struct { - Height int64 `json:"height"` - Rotate int64 `json:"rotate"` - Width int64 `json:"width"` - } `json:"dimension"` - Duration int64 `json:"duration"` - From string `json:"from"` - Page int64 `json:"page"` - Part string `json:"part"` - Vid string `json:"vid"` - Weblink string `json:"weblink"` -} +// 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 -// EPResponse 视频信息请求接口返回数据 -type EPResponse struct { - Code int64 `json:"code"` - Data []EPData `json:"data"` - Message string `json:"message"` - TTL int64 `json:"ttl"` -} - -// EPDataProvider 定义数据来源接口 -type EPDataProvider interface { +// EpisodeDataProvider 定义数据来源接口 +type EpisodeDataProvider interface { // GetEPData 根据视频号获取视频的集数据 - GetEPData(videoNo string) (epdatas []EPData, err error) + GetEPData(videoNo int64) (epdatas []EPData, err error) + // GetAvData 根据av号获取av视频的集数据 + GetAVData(avNo int64) (avdatas []AVData, err error) +} + +type episodeDataProvider struct { } diff --git a/epsource.go b/epsource.go new file mode 100644 index 0000000..2c9c63b --- /dev/null +++ b/epsource.go @@ -0,0 +1,41 @@ +package main + +// EPData 视频信息 +type EPData struct { + Aid int64 `json:"aid"` + Badge string `json:"badge"` + BadgeType int64 `json:"badge_type"` + Cid int64 `json:"cid"` + Cover string `json:"cover"` + From string `json:"from"` + ID int64 `json:"id"` + LongTitle string `json:"long_title"` + ShareURL string `json:"share_url"` + Stat struct { + Danmakus int64 `json:"danmakus"` + Play int64 `json:"play"` + } `json:"stat"` + Status int64 `json:"status"` + Title string `json:"title"` + Vid string `json:"vid"` +} + +// SectionResponse 获取section数据的返回 +type SectionResponse struct { + Code int64 `json:"code"` + Message string `json:"message"` + Result struct { + MainSection struct { + Episodes []EPData `json:"episodes"` + ID int64 `json:"id"` + Title string `json:"title"` + Type int64 `json:"type"` + } `json:"main_section"` + Section []interface{} `json:"section"` + } `json:"result"` +} + +// GetEPData 根据videoNo从bilibili获取av数据 +func (*episodeDataProvider) GetEPData(epNo int64) (epdatas []EPData, err error) { + return +} diff --git a/main.go b/main.go index 5ad8539..2c85fe9 100644 --- a/main.go +++ b/main.go @@ -2,15 +2,59 @@ package main import ( "fmt" + "strconv" ) +type episode struct { + Index int64 `json:"index"` + Cid int64 `json:"cid"` + Title string `json:"title"` +} + func main() { - epProvider := new(mockProvider) - epdatas, err := epProvider.GetEPData("av1742161") + episodeProvider := new(mockProvider) + // epdatas, err := getEPData(episodeProvider, "av1742161") + epdatas, err := getEPData(episodeProvider, "ep173262") if err != nil { panic(err) } for i, epdata := range epdatas { - fmt.Printf("ep %d Cid: %v, Part: %s\n", i, epdata.Cid, epdata.Part) + fmt.Printf("ep %d Cid: %v, Title: %s\n", i, epdata.Cid, epdata.Title) } } + +func getEPData(provider EpisodeDataProvider, videoNo string) (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 { + episodes = append(episodes, episode{ + Index: int64(i), + Cid: avdata.Cid, + Title: avdata.Part, + }) + } + case "ep": + epdatas, err := provider.GetEPData(videoID) + if err != nil { + return episodes, err + } + for i, epdata := range epdatas { + episodes = append(episodes, episode{ + Index: int64(i), + Cid: epdata.Cid, + Title: epdata.LongTitle, + }) + } + } + return +} diff --git a/mock.go b/mock.go index f40fb29..4c950c6 100644 --- a/mock.go +++ b/mock.go @@ -2,20 +2,52 @@ package main import ( "encoding/json" - "os" + "errors" + "io/ioutil" + "regexp" + "strconv" ) -type mockProvider struct{} +type mockProvider struct { + *episodeDataProvider +} -func (mock *mockProvider) GetEPData(videoNo string) (epdatas []EPData, err error) { - file, err := os.Open("mock/" + videoNo + ".json") +func (mock *mockProvider) GetAVData(avNo int64) (avdatas []AVData, err error) { + file, err := ioutil.ReadFile("mock/av" + strconv.FormatInt(avNo, 10) + ".json") if err != nil { - return epdatas, err + return avdatas, err } - var resp EPResponse - err = json.NewDecoder(file).Decode(&resp) + var resp AVResponse + err = json.Unmarshal(file, &resp) if err != nil { - return epdatas, err + return avdatas, err } return resp.Data, nil } + +func (mock *mockProvider) GetEPData(epNo int64) (epdatas []EPData, err error) { + htmlByte, err := ioutil.ReadFile("mock/ep" + strconv.FormatInt(epNo, 10) + ".html") + if err != nil { + return + } + // the regex rule is: \"ssId\":\d+ + re, err := regexp.Compile("\\\"ssId\\\":(\\d+)") + if err != nil { + return + } + ssidResult := re.Find(htmlByte) + if len(ssidResult) == 0 { + return epdatas, errors.New("ssid not found") + } + ssid := string(ssidResult)[7:] + ssByte, err := ioutil.ReadFile("mock/ss" + ssid + ".json") + if err != nil { + return + } + var resp SectionResponse + err = json.Unmarshal(ssByte, &resp) + if err != nil { + return + } + return resp.Result.MainSection.Episodes, err +} diff --git a/mock/ep173262.html b/mock/ep173262.html new file mode 100644 index 0000000..2f86e73 --- /dev/null +++ b/mock/ep173262.html @@ -0,0 +1,7 @@ +齐木楠雄的灾难 第二季:第1话_番剧_bilibili_哔哩哔哩
评论

选集

1/24
    齐木楠雄的灾难 系列
    会员专享
    第一季 日播&精选版

    全120话

    1.8亿播放  ·  122.5万追番
    会员专享
    第一季 TV

    全24话

    6739.2万播放  ·  127.3万追番
    会员专享
    完结篇

    全2话

    225.5万播放  ·  27.1万追番
    相关视频推荐
    diff --git a/mock/ss21469.json b/mock/ss21469.json new file mode 100644 index 0000000..19e9cfa --- /dev/null +++ b/mock/ss21469.json @@ -0,0 +1 @@ +{"code":0,"message":"success","result":{"main_section":{"episodes":[{"aid":19700194,"badge":"会员","badge_type":0,"cid":32122281,"cover":"http://i0.hdslb.com/bfs/archive/d108d360396598785385a735b8941c5fae4ca262.jpg","from":"bangumi","id":173262,"long_title":"再次开始!「一如既往」的日常","share_url":"https://m.bilibili.com/bangumi/play/ep173262","stat":{"danmakus":65662,"play":1966888},"status":13,"title":"1","vid":""},{"aid":19702568,"badge":"会员","badge_type":0,"cid":32557171,"cover":"http://i0.hdslb.com/bfs/archive/0d3156123aaebec4b4508a45f82d5c7ce5c67d9c.jpg","from":"bangumi","id":173263,"long_title":"体验科幻","share_url":"https://m.bilibili.com/bangumi/play/ep173263","stat":{"danmakus":30677,"play":1800222},"status":13,"title":"2","vid":""},{"aid":19702582,"badge":"会员","badge_type":0,"cid":32558324,"cover":"http://i0.hdslb.com/bfs/archive/b7badd031bf22117702eefdf0a9c5221fc7a6a63.jpg","from":"bangumi","id":173264,"long_title":"深冬的灾难","share_url":"https://m.bilibili.com/bangumi/play/ep173264","stat":{"danmakus":25947,"play":1691486},"status":13,"title":"3","vid":""},{"aid":19700180,"badge":"会员","badge_type":0,"cid":32558368,"cover":"http://i0.hdslb.com/bfs/archive/f642d65f3b5d85af1941293cf15758a276dfbf1b.jpg","from":"bangumi","id":173265,"long_title":"梨歩田依舞的灾难","share_url":"https://m.bilibili.com/bangumi/play/ep173265","stat":{"danmakus":36589,"play":1770511},"status":13,"title":"4","vid":""},{"aid":19705516,"badge":"会员","badge_type":0,"cid":32561680,"cover":"http://i0.hdslb.com/bfs/archive/91cdabe6aab9bee89ca7613a4e33a6775fb0048e.jpg","from":"bangumi","id":173266,"long_title":"再战!梨歩田VS照桥","share_url":"https://m.bilibili.com/bangumi/play/ep173266","stat":{"danmakus":35948,"play":1813462},"status":13,"title":"5","vid":""},{"aid":19824773,"badge":"会员","badge_type":0,"cid":32339915,"cover":"http://i0.hdslb.com/bfs/archive/6e5b6ca3249c6e69620e62ae8e07885370e14722.jpg","from":"bangumi","id":173267,"long_title":"才虎财阀的豪华海上观光","share_url":"https://m.bilibili.com/bangumi/play/ep173267","stat":{"danmakus":36502,"play":1804184},"status":13,"title":"6","vid":""},{"aid":20140783,"badge":"会员","badge_type":0,"cid":32877155,"cover":"http://i0.hdslb.com/bfs/archive/88f6e4bdaad48e9bf5d707b077cfcdde08f4df3c.jpg","from":"bangumi","id":173268,"long_title":"齐木楠雄的遇难","share_url":"https://m.bilibili.com/bangumi/play/ep173268","stat":{"danmakus":31277,"play":1860626},"status":13,"title":"7","vid":""},{"aid":20445220,"badge":"会员","badge_type":0,"cid":33422928,"cover":"http://i0.hdslb.com/bfs/archive/e1ef45ad2480d50c48c698c0dc1ecb3e8a6292ab.jpg","from":"bangumi","id":173269,"long_title":"神烦!超级不妙的转学生出现!","share_url":"https://m.bilibili.com/bangumi/play/ep173269","stat":{"danmakus":36403,"play":1994403},"status":13,"title":"8","vid":""},{"aid":20728312,"badge":"会员","badge_type":0,"cid":34220196,"cover":"http://i0.hdslb.com/bfs/archive/0a65e298faa2c4d25662b6376b665409ac7898e7.jpg","from":"bangumi","id":173270,"long_title":"超能力者要留心注意(前/后篇) / 梦幻的超能力马戏表演(前/后篇) / 祈祷你无病无灾!!","share_url":"https://m.bilibili.com/bangumi/play/ep173270","stat":{"danmakus":31942,"play":2012814},"status":13,"title":"9","vid":""},{"aid":21010313,"badge":"会员","badge_type":0,"cid":34452753,"cover":"http://i0.hdslb.com/bfs/archive/f69992201125329de9b7fcd7418ee4b493ba0be4.jpg","from":"bangumi","id":173271,"long_title":"齐木家集结!!","share_url":"https://m.bilibili.com/bangumi/play/ep173271","stat":{"danmakus":24486,"play":1941983},"status":13,"title":"10","vid":""},{"aid":21302575,"badge":"会员","badge_type":0,"cid":35232337,"cover":"http://i0.hdslb.com/bfs/archive/a53545910f48dd0e8ac4765ced043a9b16e42a98.jpg","from":"bangumi","id":173272,"long_title":"笨拙 晴天霹雳","share_url":"https://m.bilibili.com/bangumi/play/ep173272","stat":{"danmakus":38340,"play":2079286},"status":13,"title":"11","vid":""},{"aid":21590125,"badge":"会员","badge_type":0,"cid":35821836,"cover":"http://i0.hdslb.com/bfs/archive/9988769902e7d0c0dbe4b3d04bd8a495915528dc.jpg","from":"bangumi","id":173273,"long_title":"心跳加速的交往宣言","share_url":"https://m.bilibili.com/bangumi/play/ep173273","stat":{"danmakus":32899,"play":2116143},"status":13,"title":"12","vid":""},{"aid":21908227,"badge":"会员","badge_type":0,"cid":36175756,"cover":"http://i0.hdslb.com/bfs/archive/dc93ac0a5d4d5503503ca2d702750698bd6db991.jpg","from":"bangumi","id":173274,"long_title":"目良千里的再会","share_url":"https://m.bilibili.com/bangumi/play/ep173274","stat":{"danmakus":31807,"play":1964402},"status":13,"title":"13","vid":""},{"aid":22216117,"badge":"会员","badge_type":0,"cid":36759045,"cover":"http://i0.hdslb.com/bfs/archive/dc68a1d0a959b5f1ceaf623c5dca1ebaecc18cd4.jpg","from":"bangumi","id":173275,"long_title":"才虎一族最大的试炼","share_url":"https://m.bilibili.com/bangumi/play/ep173275","stat":{"danmakus":26905,"play":1915760},"status":13,"title":"14","vid":""},{"aid":22516657,"badge":"会员","badge_type":0,"cid":37328174,"cover":"http://i0.hdslb.com/bfs/archive/766328b3c47aa69b456bf7d389befac7c58d10cb.jpg","from":"bangumi","id":173276,"long_title":"重建棒球部吧!","share_url":"https://m.bilibili.com/bangumi/play/ep173276","stat":{"danmakus":24182,"play":1861328},"status":13,"title":"15","vid":""},{"aid":22844368,"badge":"会员","badge_type":0,"cid":37949322,"cover":"http://i0.hdslb.com/bfs/archive/573dcddf6e26271cde7760359eaf4207a2feb3ee.jpg","from":"bangumi","id":173277,"long_title":"如果要找交往对象…","share_url":"https://m.bilibili.com/bangumi/play/ep173277","stat":{"danmakus":23780,"play":1978674},"status":13,"title":"16","vid":""},{"aid":23153902,"badge":"会员","badge_type":0,"cid":38533394,"cover":"http://i0.hdslb.com/bfs/archive/4fac64de0b4b3a22422e528509fa6282e25438af.jpg","from":"bangumi","id":173278,"long_title":"再访!哥哥的5个指令","share_url":"https://m.bilibili.com/bangumi/play/ep173278","stat":{"danmakus":41008,"play":2025735},"status":13,"title":"17","vid":""},{"aid":23480245,"badge":"会员","badge_type":0,"cid":39162226,"cover":"http://i0.hdslb.com/bfs/archive/ec41d7be6c26866b83191eefe271d8571f42deb0.jpg","from":"bangumi","id":173279,"long_title":"神烦转校生!明智透真","share_url":"https://m.bilibili.com/bangumi/play/ep173279","stat":{"danmakus":24780,"play":1796057},"status":13,"title":"18","vid":""},{"aid":23787887,"badge":"会员","badge_type":0,"cid":40715221,"cover":"http://i0.hdslb.com/bfs/archive/dcf6951c9e82a96e260008304e93b3b85cd832e8.jpg","from":"bangumi","id":173280,"long_title":"全班的灾难","share_url":"https://m.bilibili.com/bangumi/play/ep173280","stat":{"danmakus":34012,"play":1844974},"status":13,"title":"19","vid":""},{"aid":24109953,"badge":"会员","badge_type":0,"cid":40715298,"cover":"http://i0.hdslb.com/bfs/archive/b84818a2871753ad44e1abdbeb49d0761510f3a3.jpg","from":"bangumi","id":173281,"long_title":"用催眠能力来冒充!","share_url":"https://m.bilibili.com/bangumi/play/ep173281","stat":{"danmakus":21042,"play":1753147},"status":13,"title":"20","vid":""},{"aid":24421253,"badge":"会员","badge_type":0,"cid":41007826,"cover":"http://i0.hdslb.com/bfs/archive/63177aad74e8831d151bad8552278d2be748eb2f.jpg","from":"bangumi","id":173282,"long_title":"再次来访!外公外婆流浪记","share_url":"https://m.bilibili.com/bangumi/play/ep173282","stat":{"danmakus":33178,"play":1824989},"status":13,"title":"21","vid":""},{"aid":24753887,"badge":"会员","badge_type":0,"cid":41652762,"cover":"http://i0.hdslb.com/bfs/archive/e25b642474fd9cf6aa1a47828a0f2fb64322fcb7.jpg","from":"bangumi","id":173283,"long_title":"放学同行的最佳选择","share_url":"https://m.bilibili.com/bangumi/play/ep173283","stat":{"danmakus":20739,"play":1765913},"status":13,"title":"22","vid":""},{"aid":25215328,"badge":"会员","badge_type":0,"cid":42754693,"cover":"http://i0.hdslb.com/bfs/archive/c089a16ed1678bf52f8df2db6340e4a4c3ca9e4f.jpg","from":"bangumi","id":173284,"long_title":"微调非日常的过去 1-5","share_url":"https://m.bilibili.com/bangumi/play/ep173284","stat":{"danmakus":17431,"play":1594832},"status":13,"title":"23","vid":""},{"aid":25641568,"badge":"会员","badge_type":0,"cid":43719898,"cover":"http://i0.hdslb.com/bfs/archive/4171f596c6484406a080eca6e020b7c10e59797b.jpg","from":"bangumi","id":173285,"long_title":"看穿差异!完美美少女的试炼","share_url":"https://m.bilibili.com/bangumi/play/ep173285","stat":{"danmakus":53564,"play":1805549},"status":13,"title":"24","vid":""}],"id":30429,"title":"正片","type":0},"section":[]}}