重新架构dataProvider,添加ep的mock

master
kuiki 2019-02-19 11:27:39 +08:00
parent a74d1c6a12
commit 2c592ed54e
7 changed files with 180 additions and 37 deletions

32
avsource.go Normal file
View File

@ -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
}

View File

@ -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 {
} }

41
epsource.go Normal file
View File

@ -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
View File

@ -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
View File

@ -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
}

7
mock/ep173262.html Normal file

File diff suppressed because one or more lines are too long

1
mock/ss21469.json Normal file

File diff suppressed because one or more lines are too long