重新架构app
parent
9c96d182d7
commit
d548495ce8
17
avsource.go
17
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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
33
epsource.go
33
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
|
||||
}
|
||||
|
|
|
|||
54
main.go
54
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 {
|
||||
|
|
|
|||
53
mock.go
53
mock.go
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
Loading…
Reference in New Issue