Browse Source

Merge remote-tracking branch 'upstream/master'

SuperNG6 4 years ago
parent
commit
3db3a72b54

+ 1 - 0
common/selferr.go

@@ -5,6 +5,7 @@ import "errors"
 var(
 	NoMetadataFile         = errors.New("no metadata file, movie.xml or *.nfo")
 	CanNotFindIMDBID       = errors.New("can not find IMDB Id")
+	CanNotFindEpAiredTime       = errors.New("can not find Ep Aired Time")
 	XunLeiCIdIsEmpty       = errors.New("cid is empty")
 	VideoFileIsTooSmall    = errors.New("video file is too small")
 	ShooterFileHashIsEmpty = errors.New("filehash is empty")

+ 1 - 0
common/seriesInfo.go

@@ -26,6 +26,7 @@ type EpisodeInfo struct {
 	Dir                      string    // 这里需要记录字幕的位置,因为需要在同级目录匹配相应的字幕才行
 	FileFullPath             string    // 视频文件的全路径
 	ModifyTime               time.Time // 创建时间
+	AiredTime				 string    // 播出的时间
 }
 
 type SubInfo struct {

+ 1 - 0
go.mod

@@ -13,6 +13,7 @@ require (
 	github.com/go-creed/sat v1.0.3
 	github.com/go-resty/resty/v2 v2.6.0
 	github.com/go-rod/rod v0.97.2
+	github.com/jinzhu/now v1.1.2 // indirect
 	github.com/jonboulle/clockwork v0.2.2 // indirect
 	github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
 	github.com/lestrrat-go/strftime v1.0.4 // indirect

+ 2 - 0
go.sum

@@ -128,6 +128,8 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO
 github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
 github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
 github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
+github.com/jinzhu/now v1.1.2 h1:eVKgfIdy9b6zbWBMgFpfDPoAMifwSZagU9HmEU6zgiI=
+github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
 github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
 github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ=
 github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=

+ 23 - 51
model/decode.go

@@ -183,65 +183,37 @@ func GetImdbInfo4SeriesDir(seriesDir string) (common.VideoIMDBInfo, error) {
 	return imdbInfo, nil
 }
 
-// TODO 需要拆分出三个方向,一个是电影,输入电影文件全路径,一个是连续剧,输入的是连续剧的目录,最后一个是连续剧的一集文件的全路径
-func GetImdbInfo(dirPth string) (common.VideoIMDBInfo, error) {
+func GetImdbInfo4OneSeriesEpisode(oneEpFPath string) (common.VideoIMDBInfo, error) {
 
+	// 从这一集的视频文件全路径去推算对应的 nfo 文件是否存在
+	EPdir := filepath.Dir(oneEpFPath)
+	// 与 EP 文件名一致的 nfo 文件名称
+	EpNfoFileName := filepath.Base(oneEpFPath)
+	EpNfoFileName = strings.ReplaceAll(EpNfoFileName, filepath.Ext(oneEpFPath), "")
+	// 全路径
+	EpNfoFPath := path.Join(EPdir, EpNfoFileName)
+	//
 	imdbInfo := common.VideoIMDBInfo{}
-	dir, err := ioutil.ReadDir(dirPth)
+	doc := etree.NewDocument()
+	// 这里会遇到一个梗,下面的关键词,可能是小写、大写、首字母大写
+	// 读取文件转换为全部的小写,然后在解析 xml ? etree 在转换为小写后,某些类型的文件的内容会崩溃···
+	// 所以这里很傻的方式解决
+	err := doc.ReadFromFile(EpNfoFPath)
 	if err != nil {
 		return imdbInfo, err
 	}
-	pathSep := string(os.PathSeparator)
-	// 优先找 movie.xml 这个是 raddarr 下载的电影会存下来的,可以在 Metadata 设置 Emby
-	var movieFilePath = ""
-	// 这个是使用 tinyMediaManager 削刮器按 Kodi 来存储的
-	var nfoFilePath = ""
-
-	for _, fi := range dir {
-		if fi.IsDir() == true {
-			continue
-		}
-		upperName := strings.ToUpper(fi.Name())
-		// 找 movie.xml
-		if upperName == strings.ToUpper(MetadataMovieXml) {
-			movieFilePath = dirPth + pathSep + fi.Name()
-			break
-		} else if upperName == strings.ToUpper(MetadateTVNfo) {
-			// 连续剧的 nfo 文件
-			nfoFilePath = dirPth + pathSep + fi.Name()
-			break
-		} else {
-			// 找 *.nfo
-			ok := strings.HasSuffix(fi.Name(), suffixNameNfo)
-			if ok {
-				nfoFilePath = dirPth + pathSep + fi.Name()
-			}
-		}
-	}
-	// 根据找到的开始解析
-	if movieFilePath == "" && nfoFilePath == "" {
-		return imdbInfo, common.NoMetadataFile
+	for _, t := range doc.FindElements("./episodedetails/aired") {
+		imdbInfo.ReleaseDate = t.Text()
+		break
 	}
-
-	if movieFilePath != "" {
-		imdbInfo, err = getImdbAndYearMovieXml(movieFilePath)
-		if err != nil {
-			GetLogger().Errorln("getImdbAndYearMovieXml error, move on:", err)
-		} else {
-			return imdbInfo, nil
-		}
+	for _, t := range doc.FindElements("./episodedetails/premiered") {
+		imdbInfo.ReleaseDate = t.Text()
+		break
 	}
-
-	if nfoFilePath != "" {
-		imdbInfo, err = getImdbAndYearNfo(nfoFilePath)
-		if err != nil {
-			return imdbInfo, err
-		} else {
-			return imdbInfo, nil
-		}
+	if imdbInfo.ReleaseDate != "" {
+		return imdbInfo, nil
 	}
-
-	return imdbInfo, common.CanNotFindIMDBID
+	return imdbInfo, common.CanNotFindEpAiredTime
 }
 
 //GetVideoInfoFromFileFullPath 从全文件路径推断文件信息

+ 0 - 10
model/decode_test.go

@@ -4,16 +4,6 @@ import (
 	"testing"
 )
 
-func Test_GetIMDB_Info(t *testing.T)  {
-
-	serPath := "X:\\连续剧\\The Bad Batch"
-	imdbInfo, err := GetImdbInfo(serPath)
-	if err != nil {
-		t.Fatal(err)
-	}
-	println(imdbInfo.ImdbId, imdbInfo.Year)
-}
-
 func Test_get_IMDB_movie_xml(t *testing.T) {
     wantid := "tt0993840"
     wantyear:= "2021"

+ 22 - 3
movie_helper/movieHelper.go

@@ -4,6 +4,7 @@ import (
 	"github.com/allanpk716/ChineseSubFinder/common"
 	_interface "github.com/allanpk716/ChineseSubFinder/interface"
 	"github.com/allanpk716/ChineseSubFinder/model"
+	"github.com/jinzhu/now"
 	"io/ioutil"
 	"path/filepath"
 	"strings"
@@ -117,13 +118,31 @@ func MovieNeedDlSub(videoFullPath string) (bool, error) {
 			return false, nil
 		}
 	} else {
+		// 读取不到 IMDB 信息也能接受
+		videoIMDBInfo, err := model.GetImdbInfo4Movie(videoFullPath)
+		if err != nil {
+			model.GetLogger().Errorln("MovieNeedDlSub.GetImdbInfo4Movie", err)
+		}
+		// 如果播出时间能够读取到,那么就以这个完后推算 3个月
+		// 如果读取不到 Aired Time 那么,下载后的 ModifyTime 3个月天内,都进行字幕的下载
+		var baseTime time.Time
+		if videoIMDBInfo.ReleaseDate != "" {
+			baseTime, err = now.Parse(videoIMDBInfo.ReleaseDate)
+			if err != nil {
+				model.GetLogger().Errorln("Movie parse AiredTime", err)
+				baseTime = modifyTime
+			}
+		} else {
+			baseTime = modifyTime
+		}
+
 		// 3个月内,或者没有字幕都要进行下载
-		if modifyTime.Add(dayRange).After(currentTime) == true || found == false {
+		if baseTime.Add(dayRange).After(currentTime) == true || found == false {
 			// 需要下载的
 			return true, nil
 		} else {
-			if modifyTime.Add(dayRange).After(currentTime) == false {
-				model.GetLogger().Infoln("Skip", filepath.Base(videoFullPath), "Sub Download, because movie has sub and downloaded more than 3 months")
+			if baseTime.Add(dayRange).After(currentTime) == false {
+				model.GetLogger().Infoln("Skip", filepath.Base(videoFullPath), "Sub Download, because movie has sub and downloaded or aired more than 3 months")
 				return false, nil
 			}
 			if found == true {

+ 25 - 5
series_helper/seriesHelper.go

@@ -7,6 +7,7 @@ import (
 	"github.com/allanpk716/ChineseSubFinder/model"
 	"github.com/allanpk716/ChineseSubFinder/sub_parser/ass"
 	"github.com/allanpk716/ChineseSubFinder/sub_parser/srt"
+	"github.com/jinzhu/now"
 	"io/ioutil"
 	"path"
 	"path/filepath"
@@ -95,7 +96,12 @@ func ReadSeriesInfoFromDir(seriesDir string, imdbInfo *imdb.Title) (*common.Seri
 		// 正常来说,一集只有一个格式的视频,也就是 S01E01 只有一个,如果有多个则会只保存第一个
 		info, modifyTime, err := model.GetVideoInfoFromFileFullPath(videoFile)
 		if err != nil {
-			model.GetLogger().Errorln(err)
+			model.GetLogger().Errorln("model.GetVideoInfoFromFileFullPath", err)
+			continue
+		}
+		episodeInfo, err := model.GetImdbInfo4OneSeriesEpisode(videoFile)
+		if err != nil {
+			model.GetLogger().Errorln("model.GetImdbInfo4OneSeriesEpisode", err)
 			continue
 		}
 		epsKey := model.GetEpisodeKeyName(info.Season, info.Episode)
@@ -109,6 +115,7 @@ func ReadSeriesInfoFromDir(seriesDir string, imdbInfo *imdb.Title) (*common.Seri
 				Dir: filepath.Dir(videoFile),
 				FileFullPath: videoFile,
 				ModifyTime: modifyTime,
+				AiredTime: episodeInfo.ReleaseDate,
 			}
 			// 需要匹配同级目录下的字幕
 			oneFileEpInfo.SubAlreadyDownloadedList = make([]common.SubInfo, 0)
@@ -224,16 +231,29 @@ func whichSeasonEpsNeedDownloadSub(seriesInfo *common.SeriesInfo) (map[string]co
 	dayRange, _ := time.ParseDuration(common.DownloadSubDuring3Months)
 	for _, epsInfo := range seriesInfo.EpList {
 		// 如果没有字幕,则加入下载列表
-		// 这一集下载后的30天内,都进行字幕的下载
-		if len(epsInfo.SubAlreadyDownloadedList) < 1 || epsInfo.ModifyTime.Add(dayRange).After(currentTime) == true {
+		// 如果每一集的播出时间能够读取到,那么就以这个完后推算 3个月
+		// 如果读取不到 Aired Time 那么,这一集下载后的 ModifyTime 3个月天内,都进行字幕的下载
+		var err error
+		var baseTime time.Time
+		if epsInfo.AiredTime != "" {
+			baseTime, err = now.Parse(epsInfo.AiredTime)
+			if err != nil {
+				model.GetLogger().Errorln("SeriesInfo parse AiredTime", err)
+				baseTime = epsInfo.ModifyTime
+			}
+		} else {
+			baseTime = epsInfo.ModifyTime
+		}
+
+		if len(epsInfo.SubAlreadyDownloadedList) < 1 || baseTime.Add(dayRange).After(currentTime) == true {
 			// 添加
 			epsKey := model.GetEpisodeKeyName(epsInfo.Season, epsInfo.Episode)
 			needDlSubEpsList[epsKey] = epsInfo
 			needDlSeasonList[epsInfo.Season] = epsInfo.Season
 		} else {
 			if len(epsInfo.SubAlreadyDownloadedList) > 0 {
-				model.GetLogger().Infoln("Skip because find sub file and over 3 months,", epsInfo.Title, epsInfo.Season, epsInfo.Episode)
-			} else if epsInfo.ModifyTime.Add(dayRange).After(currentTime) == false {
+				model.GetLogger().Infoln("Skip because find sub file and downloaded or aired over 3 months,", epsInfo.Title, epsInfo.Season, epsInfo.Episode)
+			} else if baseTime.Add(dayRange).After(currentTime) == false {
 				model.GetLogger().Infoln("Skip because 3 months pass,", epsInfo.Title, epsInfo.Season, epsInfo.Episode)
 			}
 		}

+ 1 - 1
series_helper/seriesHelper_test.go

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