Explorar o código

保存进度

Signed-off-by: allan716 <[email protected]>
allan716 %!s(int64=4) %!d(string=hai) anos
pai
achega
b1a50ce009

+ 1 - 0
common/seriesInfo.go

@@ -9,6 +9,7 @@ type SeriesInfo struct {
 	Year	   int
 	EpList	   []EpisodeInfo
 	DirPath    string
+	SeasonDict map[int]int
 }
 
 type EpisodeInfo struct {

+ 1 - 0
go.mod

@@ -5,6 +5,7 @@ go 1.15
 require (
 	github.com/PuerkitoBio/goquery v1.6.1
 	github.com/StalkR/imdb v1.0.7
+	github.com/Tnze/go.num/v2 v2.0.0-20191006170829-cb483d4c9152 // indirect
 	github.com/abadojack/whatlanggo v1.0.1
 	github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394
 	github.com/beevik/etree v1.1.0

+ 2 - 0
go.sum

@@ -21,6 +21,8 @@ github.com/StalkR/httpcache v1.0.0 h1:Px+QK86m7FEEvCfpfC+C0sNiUnRrLQyMVVJ6LKiXNv
 github.com/StalkR/httpcache v1.0.0/go.mod h1:yvbaYwH6w1USHPqgspMSwumbLwWE+B7jIZgfLYkTw1M=
 github.com/StalkR/imdb v1.0.7 h1:T9ra3IObhWoNB2I2CNT6EFe8sTQH56adKJdEQi1q0Ig=
 github.com/StalkR/imdb v1.0.7/go.mod h1:nxQmP4/nGtTVICl2+UmwhCnosVwVClmksdyptjE5Lj8=
+github.com/Tnze/go.num/v2 v2.0.0-20191006170829-cb483d4c9152 h1:6Ny2zcG2k/0aOE8rLbDdLdPMr0o7lqMfdnYJe6pZj9w=
+github.com/Tnze/go.num/v2 v2.0.0-20191006170829-cb483d4c9152/go.mod h1:fNGLFjpxgDvBqQPv1HYSuGi6pRuI8wdKvvspYvUQufc=
 github.com/abadojack/whatlanggo v1.0.1 h1:19N6YogDnf71CTHm3Mp2qhYfkRdyvbgwWdd2EPxJRG4=
 github.com/abadojack/whatlanggo v1.0.1/go.mod h1:66WiQbSbJBIlOZMsvbKe5m6pzQovxCH9B/K8tQB2uoc=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=

+ 3 - 1
seriesHelper.go → series_helper/seriesHelper.go

@@ -1,4 +1,4 @@
-package main
+package series_helper
 
 import (
 	"github.com/allanpk716/ChineseSubFinder/common"
@@ -30,6 +30,7 @@ func ReadSeriesInfoFromDir(seriesDir string) (*common.SeriesInfo, error) {
 	seriesInfo.Year = imdbInfo.Year
 	seriesInfo.DirPath = seriesDir
 	seriesInfo.EpList = make([]common.EpisodeInfo, 0)
+	seriesInfo.SeasonDict = make(map[int]int)
 	// 搜索所有的视频
 	videoFiles, err := model.SearchMatchedVideoFile(seriesDir)
 	if err != nil {
@@ -106,6 +107,7 @@ func ReadSeriesInfoFromDir(seriesDir string) (*common.SeriesInfo, error) {
 
 	for _, episodeInfo := range EpisodeDict {
 		seriesInfo.EpList = append(seriesInfo.EpList, episodeInfo)
+		seriesInfo.SeasonDict[episodeInfo.Season] = episodeInfo.Season
 	}
 
 	return &seriesInfo, nil

+ 4 - 2
seriesHelper_test.go → series_helper/seriesHelper_test.go

@@ -1,4 +1,4 @@
-package main
+package series_helper
 
 import (
 	"testing"
@@ -6,7 +6,9 @@ import (
 
 func TestReadSeriesInfoFromDir(t *testing.T) {
 
-	series := "X:\\连续剧\\Money.Heist"
+	series := "X:\\连续剧\\杀死伊芙 (2018)"
+	//series := "X:\\连续剧\\Money.Heist"
+
 	seriesInfo, err := ReadSeriesInfoFromDir(series)
 	if err != nil {
 		t.Fatal(err)

+ 38 - 5
sub_supplier/zimuku/zimuku.go

@@ -3,8 +3,10 @@ package zimuku
 import (
 	"fmt"
 	"github.com/PuerkitoBio/goquery"
+	"github.com/Tnze/go.num/v2/zh"
 	"github.com/allanpk716/ChineseSubFinder/common"
 	"github.com/allanpk716/ChineseSubFinder/model"
+	"github.com/allanpk716/ChineseSubFinder/series_helper"
 	"github.com/sirupsen/logrus"
 	"path/filepath"
 	"regexp"
@@ -44,15 +46,35 @@ func (s Supplier) GetSubListFromFile4Series(seriesPath string) ([]common.Supplie
 
 	/*
 		去网站搜索的时候,有个比较由意思的逻辑,有些剧集,哪怕只有一季,sonarr 也会给它命名为 Season 1
-		但是在 zimuku 搜索的时候,如果你加上 XXX 第一季 就搜索不出来
+		但是在 zimuku 搜索的时候,如果你加上 XXX 第一季 就搜索不出来,那么目前比较可行的办法是查询两次
+		第一次优先查询 XXX 第一季 ,如果返回的列表是空的,那么再查询 XXX
 	*/
-
-	subInfoList, err := s.GetSubListFromKeyword(seriesPath)
+	// 读取本地的视频和字幕信息
+	seriesInfo, err := series_helper.ReadSeriesInfoFromDir(seriesPath)
 	if err != nil {
 		return nil, err
 	}
+	// 这里打算牺牲效率,提高代码的复用度,不然后续得维护一套电影的查询逻辑,一套剧集的查询逻辑
+	// 比如,其实可以搜索剧集名称,应该可以得到多个季的列表,然后分析再继续
+	// 现在粗暴点,直接一季搜索一次,跟电影的搜索一样,在首个影片就停止,然后继续往下
+
+	for value := range seriesInfo.SeasonDict {
+		// 第一级界面,找到影片的详情界面
+		keyword := seriesInfo.Name + " 第" + zh.Uint64(value).String() + "季"
+		filmDetailPageUrl, err := s.Step0(keyword)
+		if err != nil {
+			return nil, err
+		}
+		// 第二级界面,有多少个字幕
+		subResult, err := s.Step1(filmDetailPageUrl)
+		if err != nil {
+			return nil, err
+		}
+		println(subResult.SubInfos.Len())
+	}
 
-	return subInfoList, nil
+
+	return nil, nil
 }
 
 func (s Supplier) GetSubListFromFile4Anime(animePath string) ([]common.SupplierSubInfo, error){
@@ -206,6 +228,15 @@ func (s Supplier) Step1(filmDetailPageUrl string) (SubResult, error) {
 	}
 	var subResult SubResult
 	subResult.SubInfos = SubInfos{}
+
+	counterIndex := 3
+	// 先找到页面”下载“关键词是第几列,然后下面的下载量才能正确的解析。否则,电影是[3],而在剧集中,因为多了字幕组的筛选,则为[4]
+	doc.Find("#subtb thead tr th").Each(func(i int, th *goquery.Selection) {
+		if th.Text() == "下载" {
+			counterIndex = i
+		}
+	})
+
 	doc.Find("#subtb tbody tr").Each(func(i int, tr *goquery.Selection) {
 		// 字幕下载页面地址
 		href, exists := tr.Find("a").Attr("href")
@@ -245,7 +276,7 @@ func (s Supplier) Step1(filmDetailPageUrl string) (SubResult, error) {
 		}
 		// 下载次数统计
 		downCountNub := 0
-		downCount := tr.Find("td").Eq(3).Text()
+		downCount := tr.Find("td").Eq(counterIndex).Text()
 		if strings.Contains(downCount, "万") {
 			fNumb, err := model.GetNumber2Float(downCount)
 			if err != nil {
@@ -261,6 +292,7 @@ func (s Supplier) Step1(filmDetailPageUrl string) (SubResult, error) {
 
 		var subInfo SubInfo
 		subResult.Title = title
+		subInfo.Name = title
 		subInfo.DetailUrl = href
 		subInfo.Ext = ext
 		subInfo.AuthorInfo = authorInfo
@@ -340,6 +372,7 @@ type SubResult struct {
 }
 
 type SubInfo struct {
+	Name				string	// 字幕的名称
 	Lang				string	// 语言
 	AuthorInfo			string	// 作者
 	Ext					string	// 后缀名

+ 14 - 0
sub_supplier/zimuku/zimuku_test.go

@@ -51,4 +51,18 @@ func TestSupplier_GetSubListFromFile4Series(t *testing.T) {
 	for i, sublist := range outList {
 		println(i, sublist.Name, sublist.Ext, sublist.Language.String(), sublist.Score, len(sublist.Data))
 	}
+}
+
+func TestSupplier_GetSubListFromFile4Series1(t *testing.T) {
+
+	series := "X:\\连续剧\\杀死伊芙 (2018)"
+	//series := "X:\\连续剧\\Money.Heist"
+
+	s := NewSupplier()
+	file4Series, err := s.GetSubListFromFile4Series(series)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	println(file4Series)
 }