浏览代码

正在实现 TMDB ID 查询 IMDB 的接口

Signed-off-by: allan716 <[email protected]>
allan716 3 年之前
父节点
当前提交
e66adb626c
共有 3 个文件被更改,包括 55 次插入27 次删除
  1. 35 24
      pkg/imdb_helper/imdb.go
  2. 19 3
      pkg/logic/emby_helper/embyhelper.go
  3. 1 0
      pkg/types/emby/type.go

+ 35 - 24
pkg/imdb_helper/imdb.go

@@ -1,6 +1,7 @@
 package imdb_helper
 
 import (
+	"errors"
 	"fmt"
 	"strconv"
 	"strings"
@@ -58,39 +59,49 @@ func GetVideoIMDBInfoFromLocal(log *logrus.Logger, imdbInfo types.VideoNfoInfo,
 		3. 因为现在默认是不跳过中文视频扫描的,所以如果开启后,则会再判断的时候访问外网获取,然后写入本地,过程会比较慢
 		4. 同时,再发送字幕和 IMDB Info 到服务器的时候,也需要判断是否 IMDB Info 信息是否齐全,否则就需要从外网获取齐全后再上传
 	*/
-	log.Debugln(imdbInfo.Title, imdbInfo.Season, imdbInfo.Episode)
+	log.Debugln("GetVideoIMDBInfoFromLocal", "IMDBID:", imdbInfo.ImdbId, "TMDBID:", imdbInfo.TmdbId, imdbInfo.Title, imdbInfo.Season, imdbInfo.Episode)
 	log.Debugln("GetVideoIMDBInfoFromLocal", 0)
 
-	// 首先从数据库中查找是否存在这个 IMDB 信息,如果不存在再使用 Web 查找,且写入数据库
-	var imdbInfos []models.IMDBInfo
-	// 把嵌套关联的 has many 的信息都查询出来
-	dao.GetDb().
-		Preload("VideoSubInfos").
-		Limit(1).Where(&models.IMDBInfo{IMDBID: imdbInfo.ImdbId}).Find(&imdbInfos)
+	if imdbInfo.ImdbId != "" {
+		// 优先从 IMDB ID 去查找本地的信息
+		// 首先从数据库中查找是否存在这个 IMDB 信息,如果不存在再使用 Web 查找,且写入数据库
+		var imdbInfos []models.IMDBInfo
+		// 把嵌套关联的 has many 的信息都查询出来
+		dao.GetDb().
+			Preload("VideoSubInfos").
+			Limit(1).Where(&models.IMDBInfo{IMDBID: imdbInfo.ImdbId}).Find(&imdbInfos)
 
-	log.Debugln("GetVideoIMDBInfoFromLocal", 1)
+		log.Debugln("GetVideoIMDBInfoFromLocal", 1)
 
-	if len(imdbInfos) <= 0 {
+		if len(imdbInfos) <= 0 {
 
-		if len(skipCreate) > 0 && skipCreate[0] == true {
-			log.Debugln(fmt.Sprintf("skip insert, imdbInfo.ImdbId = %v", imdbInfo.ImdbId))
-			return nil, common.SkipCreateInDB
-		}
+			if len(skipCreate) > 0 && skipCreate[0] == true {
+				log.Debugln(fmt.Sprintf("skip insert, imdbInfo.ImdbId = %v", imdbInfo.ImdbId))
+				return nil, common.SkipCreateInDB
+			}
 
-		// 没有找到,新增,存储本地,但是信息肯定是不完整的,需要在判断是否是中文的时候再次去外网获取补全信息
-		log.Debugln("GetVideoIMDBInfoFromLocal", 2)
-		// 存入数据库
-		nowIMDBInfo := models.NewIMDBInfo(imdbInfo.ImdbId, "", 0, "", []string{}, []string{})
-		dao.GetDb().Create(nowIMDBInfo)
+			// 没有找到,新增,存储本地,但是信息肯定是不完整的,需要在判断是否是中文的时候再次去外网获取补全信息
+			log.Debugln("GetVideoIMDBInfoFromLocal", 2)
+			// 存入数据库
+			nowIMDBInfo := models.NewIMDBInfo(imdbInfo.ImdbId, "", 0, "", []string{}, []string{})
+			dao.GetDb().Create(nowIMDBInfo)
 
-		log.Debugln("GetVideoIMDBInfoFromLocal", 3)
+			log.Debugln("GetVideoIMDBInfoFromLocal", 3)
 
-		return nowIMDBInfo, nil
-	} else {
+			return nowIMDBInfo, nil
+		} else {
 
-		log.Debugln("GetVideoIMDBInfoFromLocal", 4)
-		// 找到
-		return &imdbInfos[0], nil
+			log.Debugln("GetVideoIMDBInfoFromLocal", 4)
+			// 找到
+			return &imdbInfos[0], nil
+		}
+	} else if imdbInfo.TmdbId != "" {
+		// 如果 IMDB ID 在本地没有获取到,但是 TMDB ID 获取到了,那么就从 Web 去查询 IMDB ID 出来
+
+	} else {
+		// 都没有,那么就报错
+		log.Debugln("GetVideoIMDBInfoFromLocal IMDB TMDB ID is empty")
+		return nil, errors.New("IMDB TMDB ID is empty")
 	}
 }
 

+ 19 - 3
pkg/logic/emby_helper/embyhelper.go

@@ -428,7 +428,12 @@ func (em *EmbyHelper) getMoreVideoInfo(videoID string, isMovieOrSeries bool) (*e
 			return nil, err
 		}
 
-		mixInfo := emby2.EmbyMixInfo{IMDBId: info.ProviderIds.Imdb, Ancestors: ancs, VideoInfo: info}
+		mixInfo := emby2.EmbyMixInfo{
+			IMDBId:    info.ProviderIds.Imdb,
+			TMDBId:    info.ProviderIds.Tmdb,
+			Ancestors: ancs,
+			VideoInfo: info,
+		}
 
 		return &mixInfo, nil
 	} else {
@@ -466,7 +471,12 @@ func (em *EmbyHelper) getMoreVideoInfo(videoID string, isMovieOrSeries bool) (*e
 			return nil, err
 		}
 
-		mixInfo := emby2.EmbyMixInfo{IMDBId: nowSeriesIMDBID, Ancestors: ancs, VideoInfo: info}
+		mixInfo := emby2.EmbyMixInfo{
+			IMDBId:    nowSeriesIMDBID,
+			TMDBId:    info.ProviderIds.Tmdb,
+			Ancestors: ancs,
+			VideoInfo: info,
+		}
 
 		return &mixInfo, nil
 	}
@@ -482,7 +492,13 @@ func (em *EmbyHelper) autoFindMappingPathWithMixInfoByIMDBId(mixInfo *emby2.Emby
 	}
 
 	// 获取 IMDB 信息
-	localIMDBInfo, err := imdb_helper.GetVideoIMDBInfoFromLocal(em.log, types.VideoNfoInfo{ImdbId: mixInfo.IMDBId}, true)
+	localIMDBInfo, err := imdb_helper.GetVideoIMDBInfoFromLocal(
+		em.log,
+		types.VideoNfoInfo{
+			ImdbId: mixInfo.IMDBId,
+			TmdbId: mixInfo.TMDBId,
+		},
+		true)
 	if err != nil {
 
 		if errors.Is(err, common.SkipCreateInDB) == true {

+ 1 - 0
pkg/types/emby/type.go

@@ -163,6 +163,7 @@ func (info EmbyVideoInfoByUserId) GetDefaultSubIndex() int {
 
 type EmbyMixInfo struct {
 	IMDBId                    string // 这个视频的 IMDB ID,注意,连续剧一集是没有 IMDB ID 这个概念的,所以会向上获取到 series 这个级别再取拿 IMDB ID 的
+	TMDBId                    string // 这个视频的 TMDb ID
 	VideoFolderName           string // 电影就是电影的文件夹名称,连续剧就是对应的剧集的 root 文件夹
 	VideoFileName             string // 视频文件名
 	PhysicalVideoFileFullPath string // 视频的物理路径(这里指的物理路径是相对于本程序而言,如果是用 docker 使用的话,那么就是映射容器内的路径,如果是用物理机器比如 Windows 使用的话,那么就是相对于物理机器的路径)