重新架构app
parent
9c96d182d7
commit
d548495ce8
17
avsource.go
17
avsource.go
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
31
epsource.go
31
epsource.go
|
|
@ -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
54
main.go
|
|
@ -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
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