Răsfoiți Sursa

修复 ScanPlayedVideoSubInfo 路径转换的bug

Signed-off-by: allan716 <[email protected]>
allan716 3 ani în urmă
părinte
comite
b60c0ec2ea

+ 14 - 12
cmd/chinesesubfinder/main.go

@@ -50,11 +50,8 @@ func init() {
 	global_value.SetAppVersion(AppVersion)
 
 	global_value.SetExtEnCode(ExtEnCode)
-
 	global_value.SetBaseKey(BaseKey)
-
 	global_value.SetAESKey16(AESKey16)
-
 	global_value.SetAESIv16(AESIv16)
 
 	if my_util.OSCheck() == false {
@@ -64,14 +61,6 @@ func init() {
 
 func main() {
 
-	go func() {
-		// 开启pprof,监听请求
-		ip := "0.0.0.0:8080"
-		if err := http.ListenAndServe(ip, nil); err != nil {
-			fmt.Printf("start pprof failed on %s\n", ip)
-		}
-	}()
-
 	// ------------------------------------------------------------------------
 	// 如果是 Debug 模式,那么就需要写入特殊文件
 	if settings.GetSettings().AdvancedSettings.DebugMode == true {
@@ -98,7 +87,20 @@ func main() {
 		common.SetApiToken("")
 	}
 	// 是否开启开发模式,跳过某些流程
-	//settings.GetSettings().SpeedDevMode = true
+	settings.GetSettings().SpeedDevMode = true
+	if settings.GetSettings().SpeedDevMode == true {
+
+		loggerBase.Infoln("Speed Dev Mode is On")
+		go func() {
+			// 开启pprof,监听请求
+			ip := "0.0.0.0:8080"
+			if err := http.ListenAndServe(ip, nil); err != nil {
+				fmt.Printf("start pprof failed on %s\n", ip)
+			}
+		}()
+	} else {
+		loggerBase.Infoln("Speed Dev Mode is Off")
+	}
 	// ------------------------------------------------------------------------
 	// 前置的任务,热修复、字幕修改文件名格式、提前下载好浏览器
 	if settings.GetSettings().SpeedDevMode == false {

+ 3 - 3
go.mod

@@ -69,8 +69,11 @@ require (
 
 require (
 	github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de
+	github.com/cyruzin/golang-tmdb v1.4.3
 	github.com/elazarl/goproxy v0.0.0-20220417044921-416226498f94
 	github.com/longbridgeapp/opencc v0.1.7
+	github.com/urfave/cli/v2 v2.6.0
+	github.com/wumansgy/goEncrypt v1.0.0
 )
 
 require (
@@ -85,7 +88,6 @@ require (
 	github.com/bodgit/windows v1.0.0 // indirect
 	github.com/connesc/cipherio v0.2.1 // indirect
 	github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
-	github.com/cyruzin/golang-tmdb v1.4.3 // indirect
 	github.com/dsnet/compress v0.0.1 // indirect
 	github.com/gin-contrib/sse v0.1.0 // indirect
 	github.com/go-git/gcfg v1.5.0 // indirect
@@ -124,8 +126,6 @@ require (
 	github.com/tidwall/match v1.1.1 // indirect
 	github.com/tidwall/pretty v1.2.0 // indirect
 	github.com/ugorji/go/codec v1.2.6 // indirect
-	github.com/urfave/cli/v2 v2.6.0 // indirect
-	github.com/wumansgy/goEncrypt v1.0.0 // indirect
 	github.com/xanzy/ssh-agent v0.3.0 // indirect
 	github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect
 	github.com/ysmood/goob v0.4.0 // indirect

+ 3 - 4
go.sum

@@ -19,6 +19,7 @@ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7
 dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
 gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/EDDYCJY/fake-useragent v0.2.0 h1:Jcnkk2bgXmDpX0z+ELlUErTkoLb/mxFBNd2YdcpvJBs=
 github.com/EDDYCJY/fake-useragent v0.2.0/go.mod h1:5wn3zzlDxhKW6NYknushqinPcAqZcAPHy8lLczCdJdc=
@@ -121,6 +122,7 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7
 github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
 github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
 github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
 github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
@@ -209,8 +211,6 @@ github.com/go-playground/validator/v10 v10.10.0 h1:I7mrTYv78z8k8VXa/qJlOlEXn/nBh
 github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
 github.com/go-resty/resty/v2 v2.6.0 h1:joIR5PNLM2EFqqESUjCMGXrWmXNHEU9CEiK813oKYS4=
 github.com/go-resty/resty/v2 v2.6.0/go.mod h1:PwvJS6hvaPkjtjNg9ph+VrSD92bi5Zq73w/BIH7cC3Q=
-github.com/go-rod/rod v0.106.5 h1:HQOxmOb/xjZ+QnnK4D8t+3+CWFreKSuqid/65zH4poA=
-github.com/go-rod/rod v0.106.5/go.mod h1:N/ZJik0+EYXNpW/74q0V1H7K3/UTfwHV/tRxY0CY/Vw=
 github.com/go-rod/rod v0.106.8 h1:pVMVz0jMtLVyx8FhJEEA6l+EY9Iw/nJTDYT/he4+UJc=
 github.com/go-rod/rod v0.106.8/go.mod h1:xkZOchuKqTOkMOBkrzb7uJpbKZRab1haPCWDvuZkS2U=
 github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
@@ -598,6 +598,7 @@ github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oW
 github.com/ulikunitz/xz v0.5.10 h1:t92gobL9l3HE202wg3rlk19F6X+JOxl9BBrCCMYEYd8=
 github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
 github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
+github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY=
 github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
 github.com/urfave/cli/v2 v2.6.0 h1:yj2Drkflh8X/zUrkWlWlUjZYHyWN7WMmpVxyxXIUyv8=
 github.com/urfave/cli/v2 v2.6.0/go.mod h1:oDzoM7pVwz6wHn5ogWgFUU1s4VJayeQS+aEZDqXIEJs=
@@ -610,8 +611,6 @@ github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMx
 github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
 github.com/ysmood/goob v0.4.0 h1:HsxXhyLBeGzWXnqVKtmT9qM7EuVs/XOgkX7T6r1o1AQ=
 github.com/ysmood/goob v0.4.0/go.mod h1:u6yx7ZhS4Exf2MwciFr6nIM8knHQIE22lFpWHnfql18=
-github.com/ysmood/got v0.28.2 h1:2dtVOneu4YGDk9skgzq8aqW9vZ1ssBla+ddqrE91bNs=
-github.com/ysmood/got v0.28.2/go.mod h1:pE1l4LOwOBhQg6A/8IAatkGp7uZjnalzrZolnlhhMgY=
 github.com/ysmood/got v0.29.1 h1:7TNTm3Bw5kdBGXFp04qnZ9DqlZ1XS1z1JdeobeJY6Mo=
 github.com/ysmood/got v0.29.1/go.mod h1:pE1l4LOwOBhQg6A/8IAatkGp7uZjnalzrZolnlhhMgY=
 github.com/ysmood/gotrace v0.6.0 h1:SyI1d4jclswLhg7SWTL6os3L1WOKeNn/ZtzVQF8QmdY=

+ 11 - 3
internal/logic/cron_helper/cron_helper.go

@@ -1,6 +1,9 @@
 package cron_helper
 
 import (
+	"sync"
+	"time"
+
 	"github.com/allanpk716/ChineseSubFinder/internal/logic/file_downloader"
 	"github.com/allanpk716/ChineseSubFinder/internal/logic/scan_played_video_subinfo"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/downloader"
@@ -10,8 +13,6 @@ import (
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/video_scan_and_refresh_helper"
 	"github.com/robfig/cron/v3"
 	"github.com/sirupsen/logrus"
-	"sync"
-	"time"
 )
 
 type CronHelper struct {
@@ -45,7 +46,7 @@ func NewCronHelper(fileDownloader *file_downloader.FileDownloader) *CronHelper {
 	var err error
 	// ----------------------------------------------
 	// 扫描已播放
-	ch.scanPlayedVideoSubInfo, err = scan_played_video_subinfo.NewScanPlayedVideoSubInfo(ch.log, ch.Settings)
+	ch.scanPlayedVideoSubInfo, err = scan_played_video_subinfo.NewScanPlayedVideoSubInfo(ch.log, ch.Settings, fileDownloader)
 	if err != nil {
 		ch.log.Panicln(err)
 	}
@@ -98,6 +99,13 @@ func (ch *CronHelper) Start(runImmediately bool) {
 	}
 	// ----------------------------------------------
 	ch.c = cron.New(cron.WithChain(cron.SkipIfStillRunning(cron.DefaultLogger)))
+	{
+		// 测试部分定时器代码,提前运行
+		if ch.Settings.SpeedDevMode == true {
+			ch.scanPlayedVideoSub()
+		}
+	}
+
 	// 定时器
 	// 这个暂时无法被取消执行
 	ch.entryIDScanVideoProcess, err = ch.c.AddFunc(ch.Settings.CommonSettings.ScanInterval, ch.scanVideoProcessAdd2DownloadQueue)

+ 40 - 17
internal/logic/emby_helper/embyhelper.go

@@ -3,6 +3,12 @@ package emby_helper
 import (
 	"errors"
 	"fmt"
+	"path"
+	"path/filepath"
+	"strings"
+	"sync"
+	"time"
+
 	embyHelper "github.com/allanpk716/ChineseSubFinder/internal/pkg/emby_api"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/imdb_helper"
 	"github.com/allanpk716/ChineseSubFinder/internal/pkg/my_util"
@@ -17,11 +23,6 @@ import (
 	"github.com/panjf2000/ants/v2"
 	"github.com/sirupsen/logrus"
 	"golang.org/x/net/context"
-	"path"
-	"path/filepath"
-	"strings"
-	"sync"
-	"time"
 )
 
 type EmbyHelper struct {
@@ -231,6 +232,9 @@ func (em *EmbyHelper) GetPlayedItemsSubtitle() (map[string]string, map[string]st
 
 		userPlayedItemsList = append(userPlayedItemsList, oneUserPlayedItems)
 	}
+
+	var EpisodeIdList = make([]string, 0)
+	var MovieIdList = make([]string, 0)
 	// 把这些用户看过的视频根据 userID 和 videoID 进行查询,使用的是第几个字幕
 	// 这里需要区分是 Movie 还是 Series,这样后续的路径映射才能够生效
 	// 视频 emby 路径 - 字幕 emby 路径
@@ -263,36 +267,55 @@ func (em *EmbyHelper) GetPlayedItemsSubtitle() (map[string]string, map[string]st
 			}
 			// 将这个字幕的 Emby 内部路径保存下来,后续还需要进行一次路径转换才能使用,转换到本程序的路径上
 			if item.Type == videoTypeEpisode {
+				EpisodeIdList = append(EpisodeIdList, item.Id)
 				seriesEmbyFPathMap[videoInfo.Path] = videoInfo.MediaStreams[videoInfoByUserId.GetDefaultSubIndex()].Path
 			} else if item.Type == videoTypeMovie {
+				MovieIdList = append(MovieIdList, item.Id)
 				movieEmbyFPathMap[videoInfo.Path] = videoInfo.MediaStreams[videoInfoByUserId.GetDefaultSubIndex()].Path
 			}
 		}
 	}
+	// 路径转换
+	phyMovieList, err := em.getMoreVideoInfoList(MovieIdList, true)
+	if err != nil {
+		return nil, nil, err
+	}
+	phySeriesList, err := em.getMoreVideoInfoList(EpisodeIdList, false)
+	if err != nil {
+		return nil, nil, err
+	}
+
 	// 转换 Emby 内部路径到本程序识别的视频目录上
+	// phyVideoFPath -- phySubFPath
 	moviePhyFPathMap := make(map[string]string)
 	seriesPhyFPathMap := make(map[string]string)
 	// movie
-	for key, value := range movieEmbyFPathMap {
-		bok, prefixOldPath, prefixNewPath := em.findMappingPath(key, true)
+	for _, mixInfo := range phyMovieList {
+		movieEmbyFPath := mixInfo.VideoInfo.Path
+		// 得到字幕的 emby 内部绝对路径
+		subEmbyFPath, bok := movieEmbyFPathMap[movieEmbyFPath]
 		if bok == false {
-			em.log.Warningln("GetPlayedItemsSubtitle.findMappingPath miss matched,", key)
+			// 没找到
 			continue
 		}
-		phyVideoPath := strings.ReplaceAll(key, prefixOldPath, prefixNewPath)
-		phySubPath := strings.ReplaceAll(value, prefixOldPath, prefixNewPath)
-		moviePhyFPathMap[phyVideoPath] = phySubPath
+		movieDirFPath := filepath.Dir(mixInfo.PhysicalVideoFileFullPath)
+		subFileName := filepath.Base(subEmbyFPath)
+		nowPhySubFPath := filepath.Join(movieDirFPath, subFileName)
+		moviePhyFPathMap[mixInfo.PhysicalVideoFileFullPath] = nowPhySubFPath
 	}
 	// series
-	for key, value := range seriesEmbyFPathMap {
-		bok, prefixOldPath, prefixNewPath := em.findMappingPath(key, false)
+	for _, mixInfo := range phySeriesList {
+		epsEmbyFPath := mixInfo.VideoInfo.Path
+		// 得到字幕的 emby 内部绝对路径
+		subEmbyFPath, bok := seriesEmbyFPathMap[epsEmbyFPath]
 		if bok == false {
-			em.log.Warningln("GetPlayedItemsSubtitle.findMappingPath miss matched,", key)
+			// 没找到
 			continue
 		}
-		phyVideoPath := strings.ReplaceAll(key, prefixOldPath, prefixNewPath)
-		phySubPath := strings.ReplaceAll(value, prefixOldPath, prefixNewPath)
-		seriesPhyFPathMap[phyVideoPath] = phySubPath
+		epsDirFPath := filepath.Dir(mixInfo.PhysicalVideoFileFullPath)
+		subFileName := filepath.Base(subEmbyFPath)
+		nowPhySubFPath := filepath.Join(epsDirFPath, subFileName)
+		seriesPhyFPathMap[mixInfo.PhysicalVideoFileFullPath] = nowPhySubFPath
 	}
 
 	return moviePhyFPathMap, seriesPhyFPathMap, nil

+ 36 - 8
internal/logic/scan_played_video_subinfo/scan_played_video_subinfo.go

@@ -3,6 +3,15 @@ package scan_played_video_subinfo
 import (
 	"errors"
 	"fmt"
+	"os"
+	"path/filepath"
+	"strings"
+	"sync"
+
+	"github.com/allanpk716/ChineseSubFinder/internal/logic/file_downloader"
+
+	"github.com/allanpk716/ChineseSubFinder/internal/pkg/mix_media_info"
+
 	"github.com/allanpk716/ChineseSubFinder/internal/dao"
 	"github.com/allanpk716/ChineseSubFinder/internal/ifaces"
 	embyHelper "github.com/allanpk716/ChineseSubFinder/internal/logic/emby_helper"
@@ -25,15 +34,12 @@ import (
 	"github.com/huandu/go-clone"
 	"github.com/sirupsen/logrus"
 	"golang.org/x/net/context"
-	"os"
-	"path/filepath"
-	"strings"
-	"sync"
 )
 
 type ScanPlayedVideoSubInfo struct {
-	settings *settings.Settings
-	log      *logrus.Logger
+	settings       *settings.Settings
+	log            *logrus.Logger
+	fileDownloader *file_downloader.FileDownloader
 
 	embyHelper *embyHelper.EmbyHelper
 
@@ -54,10 +60,12 @@ type ScanPlayedVideoSubInfo struct {
 	cacheImdbInfoCacheLocker sync.Mutex
 }
 
-func NewScanPlayedVideoSubInfo(log *logrus.Logger, _settings *settings.Settings) (*ScanPlayedVideoSubInfo, error) {
+func NewScanPlayedVideoSubInfo(log *logrus.Logger, _settings *settings.Settings, fileDownloader *file_downloader.FileDownloader) (*ScanPlayedVideoSubInfo, error) {
 	var err error
 	var scanPlayedVideoSubInfo ScanPlayedVideoSubInfo
 	scanPlayedVideoSubInfo.log = log
+	// 下载实例
+	scanPlayedVideoSubInfo.fileDownloader = fileDownloader
 	// 参入设置信息
 	// 最大获取的视频数目设置到 100W
 	scanPlayedVideoSubInfo.settings = clone.Clone(_settings).(*settings.Settings)
@@ -403,9 +411,29 @@ func (s *ScanPlayedVideoSubInfo) dealOneVideo(index int, videoFPath, orgSubFPath
 		imdbInfoCache[imdbInfo4Video.ImdbId] = imdbInfo
 		s.cacheImdbInfoCacheLocker.Unlock()
 	}
-
 	s.log.Debugln(3)
 
+	// 这里需要判断是否已经获取了 TMDB Info,如果没有则需要去获取
+	if imdbInfo.TmdbId == "" {
+
+		s.log.Debugln("3-2")
+		videoType := "movie"
+		if imdbInfo.IsMovie == false {
+			videoType = "series"
+		}
+		_, err = mix_media_info.GetMediaInfoAndSave(
+			s.log,
+			s.fileDownloader.SubtitleBestApi,
+			imdbInfo,
+			imdbInfo.IMDBID, "imdb", videoType)
+		if err != nil {
+			s.log.Errorln("dealOneVideo.GetMediaInfoAndSave,", imdbInfo.Name, err)
+			return
+		}
+	}
+
+	s.log.Debugln("3-2")
+
 	// 当前扫描到的找个字幕的 sha256 是否已经存在与缓存中了
 	tmpSHA256String, err := my_util.GetFileSHA256String(orgSubFPath)
 	if err != nil {

+ 4 - 3
internal/pkg/mix_media_info/mix_media_info.go

@@ -34,7 +34,7 @@ func GetMixMediaInfo(log *logrus.Logger,
 	if imdbInfo.TmdbId == "" {
 		// 需要去 web 查询
 		source = "imdb"
-		return getMediaInfoAndSave(log, SubtitleBestApi, imdbInfo, imdbInfo.IMDBID, source, videoType)
+		return GetMediaInfoAndSave(log, SubtitleBestApi, imdbInfo, imdbInfo.IMDBID, source, videoType)
 	} else {
 		// 已经存在,从本地拿去信息
 		// 首先从数据库中查找是否存在这个 IMDB 信息,如果不存在再使用 Web 查找,且写入数据库
@@ -48,7 +48,7 @@ func GetMixMediaInfo(log *logrus.Logger,
 		} else {
 			// 没有找到本地缓存的 TMDB ID 信息,需要去 web 查询
 			source = "imdb"
-			return getMediaInfoAndSave(log, SubtitleBestApi, imdbInfo, imdbInfo.IMDBID, source, videoType)
+			return GetMediaInfoAndSave(log, SubtitleBestApi, imdbInfo, imdbInfo.IMDBID, source, videoType)
 		}
 	}
 }
@@ -100,7 +100,8 @@ func getMediaInfoEx(log *logrus.Logger, SubtitleBestApi *subtitle_best_api.Subti
 	return mediaInfo, nil
 }
 
-func getMediaInfoAndSave(log *logrus.Logger, SubtitleBestApi *subtitle_best_api.SubtitleBestApi, imdbInfo *models.IMDBInfo, id, source, videoType string) (*models.MediaInfo, error) {
+// GetMediaInfoAndSave 通过 IMDB ID 查询媒体信息,并保存到数据库,IMDB 和 MediaInfo 都会进行保存
+func GetMediaInfoAndSave(log *logrus.Logger, SubtitleBestApi *subtitle_best_api.SubtitleBestApi, imdbInfo *models.IMDBInfo, id, source, videoType string) (*models.MediaInfo, error) {
 
 	mediaInfo, err := getMediaInfoEx(log, SubtitleBestApi, id, source, videoType)
 	if err != nil {