重新架构dataProvider,添加ep的mock
parent
a74d1c6a12
commit
2c592ed54e
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -1,31 +1,17 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
// EPData 视频信息
|
// AV:
|
||||||
type EPData struct {
|
// [GET]https://api.bilibili.com/x/player/pagelist?aid=1742929&jsonp=jsonp
|
||||||
Cid int64 `json:"cid"`
|
// EP:
|
||||||
Dimension struct {
|
// [GET]https://api.bilibili.com/pgc/web/season/section?season_id=53&season_type=1
|
||||||
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"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// EPResponse 视频信息请求接口返回数据
|
// EpisodeDataProvider 定义数据来源接口
|
||||||
type EPResponse struct {
|
type EpisodeDataProvider interface {
|
||||||
Code int64 `json:"code"`
|
|
||||||
Data []EPData `json:"data"`
|
|
||||||
Message string `json:"message"`
|
|
||||||
TTL int64 `json:"ttl"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// EPDataProvider 定义数据来源接口
|
|
||||||
type EPDataProvider interface {
|
|
||||||
// GetEPData 根据视频号获取视频的集数据
|
// 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 {
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
50
main.go
50
main.go
|
|
@ -2,15 +2,59 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type episode struct {
|
||||||
|
Index int64 `json:"index"`
|
||||||
|
Cid int64 `json:"cid"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
epProvider := new(mockProvider)
|
episodeProvider := new(mockProvider)
|
||||||
epdatas, err := epProvider.GetEPData("av1742161")
|
// epdatas, err := getEPData(episodeProvider, "av1742161")
|
||||||
|
epdatas, err := getEPData(episodeProvider, "ep173262")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
for i, epdata := range epdatas {
|
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
|
||||||
|
}
|
||||||
|
|
|
||||||
52
mock.go
52
mock.go
|
|
@ -2,20 +2,52 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"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")
|
|
||||||
if err != nil {
|
|
||||||
return epdatas, err
|
|
||||||
}
|
}
|
||||||
var resp EPResponse
|
|
||||||
err = json.NewDecoder(file).Decode(&resp)
|
func (mock *mockProvider) GetAVData(avNo int64) (avdatas []AVData, err error) {
|
||||||
|
file, err := ioutil.ReadFile("mock/av" + strconv.FormatInt(avNo, 10) + ".json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return epdatas, err
|
return avdatas, err
|
||||||
|
}
|
||||||
|
var resp AVResponse
|
||||||
|
err = json.Unmarshal(file, &resp)
|
||||||
|
if err != nil {
|
||||||
|
return avdatas, err
|
||||||
}
|
}
|
||||||
return resp.Data, nil
|
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
|
||||||
|
}
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue