重新架构app

master
kuiki 2019-02-21 13:53:17 +08:00
parent 9c96d182d7
commit d548495ce8
7 changed files with 165 additions and 120 deletions

View File

@ -1,5 +1,11 @@
package main package main
import (
"encoding/json"
"io/ioutil"
"strconv"
)
// epDataProvider中 // epDataProvider中
// AVData av视频信息 // AVData av视频信息
@ -28,5 +34,14 @@ type AVResponse struct {
// GetAVData 根据videoNo从bilibili获取av数据 // GetAVData 根据videoNo从bilibili获取av数据
func (*episodeDataProvider) GetAVData(avNo int64) (avdatas []AVData, err error) { 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
} }

View File

@ -1,17 +1,11 @@
package main package main
// AV: // DataSource 获取数据源
// [GET]https://api.bilibili.com/x/player/pagelist?aid=1742929&jsonp=jsonp type DataSource interface {
// EP: // GetAVData 根据av号获取av数据源
// [GET]https://api.bilibili.com/pgc/web/season/section?season_id=53&season_type=1 GetAVData(avNo int64) (data []byte, err error)
// GetEPData 根据ep号获取ep数据源
// EpisodeDataProvider 定义数据来源接口 GetEPData(epNo int64) (data []byte, err error)
type EpisodeDataProvider interface { // GetSSData 根据ss号获取ss数据源
// GetEPData 根据视频号获取视频的集数据 GetSSData(ssNo int64) (data []byte, err error)
GetEPData(videoNo int64) (epdatas []EPData, err error)
// GetAvData 根据av号获取av视频的集数据
GetAVData(avNo int64) (avdatas []AVData, err error)
}
type episodeDataProvider struct {
} }

82
episodeprovider.go Normal file
View File

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

View File

@ -1,5 +1,13 @@
package main package main
import (
"encoding/json"
"errors"
"io/ioutil"
"regexp"
"strconv"
)
// EPData 视频信息 // EPData 视频信息
type EPData struct { type EPData struct {
Aid int64 `json:"aid"` Aid int64 `json:"aid"`
@ -37,5 +45,28 @@ type SectionResponse struct {
// GetEPData 根据videoNo从bilibili获取av数据 // GetEPData 根据videoNo从bilibili获取av数据
func (*episodeDataProvider) GetEPData(epNo int64) (epdatas []EPData, err error) { func (*episodeDataProvider) GetEPData(epNo int64) (epdatas []EPData, err error) {
htmlByte, err := ioutil.ReadFile("mock/ep" + strconv.FormatInt(epNo, 10) + ".html")
if err != nil {
return 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
View File

@ -4,20 +4,14 @@ import (
"fmt" "fmt"
"os" "os"
"path" "path"
"strconv"
"github.com/yinhui87/go-component/language" "github.com/yinhui87/go-component/language"
) )
type episode struct {
Index int64 `json:"index"`
Cid int64 `json:"cid"`
Title string `json:"title"`
}
func main() { func main() {
episodeProvider := new(mockProvider) dataSource := new(mockSource)
epdatas, err := getEPData(episodeProvider, "av1742161", 143, 147) episodeProvider := NewEpisodeDataProvider(dataSource)
epdatas, err := episodeProvider.GetEpisodeData("av1742161", 143, 147)
// epdatas, err := getEPData(episodeProvider, "ep173262") // epdatas, err := getEPData(episodeProvider, "ep173262")
if err != nil { if err != nil {
panic(err) 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) { func getFileList() (filenames []string, err error) {
pwd, err := os.Open(".") pwd, err := os.Open(".")
if err != nil { if err != nil {

53
mock.go
View File

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

24
mocksource.go Normal file
View File

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