重新架构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
|
||||
|
||||
// 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 {
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 (
|
||||
"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
|
||||
}
|
||||
|
|
|
|||
52
mock.go
52
mock.go
|
|
@ -2,20 +2,52 @@ package main
|
|||
|
||||
import (
|
||||
"encoding/json"
|
||||
"os"
|
||||
"errors"
|
||||
"io/ioutil"
|
||||
"regexp"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
type mockProvider struct{}
|
||||
|
||||
func (mock *mockProvider) GetEPData(videoNo string) (epdatas []EPData, err error) {
|
||||
file, err := os.Open("mock/" + videoNo + ".json")
|
||||
if err != nil {
|
||||
return epdatas, err
|
||||
type mockProvider struct {
|
||||
*episodeDataProvider
|
||||
}
|
||||
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 {
|
||||
return epdatas, err
|
||||
return avdatas, err
|
||||
}
|
||||
var resp AVResponse
|
||||
err = json.Unmarshal(file, &resp)
|
||||
if err != nil {
|
||||
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
|
||||
}
|
||||
|
|
|
|||
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