diff --git a/avsource.go b/avsource.go index c07dd2c..cb7dd40 100644 --- a/avsource.go +++ b/avsource.go @@ -1,5 +1,11 @@ package main +import ( + "encoding/json" + "io/ioutil" + "strconv" +) + // epDataProvider中 // AVData av视频信息 @@ -28,5 +34,14 @@ type AVResponse struct { // GetAVData 根据videoNo从bilibili获取av数据 func (*episodeDataProvider) GetAVData(avNo int64) (avdatas []AVData, err error) { - return + file, err := ioutil.ReadFile("mock/av" + strconv.FormatInt(avNo, 10) + ".json") + if err != nil { + return avdatas, err + } + var resp AVResponse + err = json.Unmarshal(file, &resp) + if err != nil { + return avdatas, err + } + return resp.Data, nil } diff --git a/datasource.go b/datasource.go index 1dc0a1d..50026d4 100644 --- a/datasource.go +++ b/datasource.go @@ -1,17 +1,11 @@ package main -// 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 { - // GetEPData 根据视频号获取视频的集数据 - GetEPData(videoNo int64) (epdatas []EPData, err error) - // GetAvData 根据av号获取av视频的集数据 - GetAVData(avNo int64) (avdatas []AVData, err error) -} - -type episodeDataProvider struct { +// DataSource 获取数据源 +type DataSource interface { + // GetAVData 根据av号获取av数据源 + GetAVData(avNo int64) (data []byte, err error) + // GetEPData 根据ep号获取ep数据源 + GetEPData(epNo int64) (data []byte, err error) + // GetSSData 根据ss号获取ss数据源 + GetSSData(ssNo int64) (data []byte, err error) } diff --git a/episodeprovider.go b/episodeprovider.go new file mode 100644 index 0000000..669d09f --- /dev/null +++ b/episodeprovider.go @@ -0,0 +1,82 @@ +package main + +import ( + "fmt" + "strconv" + + "github.com/yinhui87/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 +} diff --git a/epsource.go b/epsource.go index 2c9c63b..1edb4c9 100644 --- a/epsource.go +++ b/epsource.go @@ -1,5 +1,13 @@ package main +import ( + "encoding/json" + "errors" + "io/ioutil" + "regexp" + "strconv" +) + // EPData 视频信息 type EPData struct { Aid int64 `json:"aid"` @@ -37,5 +45,28 @@ type SectionResponse struct { // GetEPData 根据videoNo从bilibili获取av数据 func (*episodeDataProvider) GetEPData(epNo int64) (epdatas []EPData, err error) { - return + 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/main.go b/main.go index 4be9656..b3af948 100644 --- a/main.go +++ b/main.go @@ -4,20 +4,14 @@ import ( "fmt" "os" "path" - "strconv" "github.com/yinhui87/go-component/language" ) -type episode struct { - Index int64 `json:"index"` - Cid int64 `json:"cid"` - Title string `json:"title"` -} - func main() { - episodeProvider := new(mockProvider) - epdatas, err := getEPData(episodeProvider, "av1742161", 143, 147) + dataSource := new(mockSource) + episodeProvider := NewEpisodeDataProvider(dataSource) + epdatas, err := episodeProvider.GetEpisodeData("av1742161", 143, 147) // epdatas, err := getEPData(episodeProvider, "ep173262") if err != nil { panic(err) @@ -42,48 +36,6 @@ func main() { } } -func getEPData(provider EpisodeDataProvider, 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 -} - func getFileList() (filenames []string, err error) { pwd, err := os.Open(".") if err != nil { diff --git a/mock.go b/mock.go deleted file mode 100644 index 4c950c6..0000000 --- a/mock.go +++ /dev/null @@ -1,53 +0,0 @@ -package main - -import ( - "encoding/json" - "errors" - "io/ioutil" - "regexp" - "strconv" -) - -type mockProvider struct { - *episodeDataProvider -} - -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 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 -} diff --git a/mocksource.go b/mocksource.go new file mode 100644 index 0000000..ef17ec4 --- /dev/null +++ b/mocksource.go @@ -0,0 +1,24 @@ +package main + +import ( + "io/ioutil" + "strconv" +) + +type mockSource struct { + *episodeDataProvider +} + +func (mock *mockSource) GetAVData(avNo int64) (avdata []byte, err error) { + avdata, err = ioutil.ReadFile("mock/av" + strconv.FormatInt(avNo, 10) + ".json") + return +} + +func (mock *mockSource) GetEPData(epNo int64) (epdata []byte, err error) { + epdata, err = ioutil.ReadFile("mock/ep" + strconv.FormatInt(epNo, 10) + ".html") + return +} +func (mock *mockSource) GetSSData(ssNo int64) (ssdata []byte, err error) { + ssdata, err = ioutil.ReadFile("mock/ss" + strconv.FormatInt(ssNo, 10) + ".json") + return +}