From 01fb6e87729eb44e18f5be4908756115b3e73c4b Mon Sep 17 00:00:00 2001 From: jxxghp Date: Thu, 9 Nov 2023 21:15:36 +0800 Subject: [PATCH] fix bug --- README.md | 1 - app/api/endpoints/subscribe.py | 8 +++++++- app/chain/search.py | 3 +++ app/chain/subscribe.py | 4 ++++ app/core/config.py | 2 -- app/core/context.py | 18 +++++++++++++----- app/db/models/subscribe.py | 14 +++++++++----- app/db/subscribe_oper.py | 24 +++++++++++++++++------- app/modules/douban/__init__.py | 4 ++-- app/modules/douban/douban_cache.py | 18 +++++++++++------- app/modules/themoviedb/__init__.py | 2 +- 11 files changed, 67 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 0118a7d4..bafe443a 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,6 @@ MoviePilot需要配套下载器和媒体服务器配合使用。 - **TMDB_API_DOMAIN:** TMDB API地址,默认`api.themoviedb.org`,也可配置为`api.tmdb.org`或其它中转代理服务地址,能连通即可 - **TMDB_IMAGE_DOMAIN:** TMDB图片地址,默认`image.tmdb.org`,可配置为其它中转代理以加速TMDB图片显示,如:`static-mdb.v.geilijiasu.com` - **WALLPAPER:** 登录首页电影海报,`tmdb`/`bing`,默认`tmdb` -- **SEARCH_SOURCE:** 媒体信息搜索来源,`themoviedb`/`douban`,默认`themoviedb` - **RECOGNIZE_SOURCE:** 媒体信息识别来源,`themoviedb`/`douban`,默认`themoviedb` - **SCRAP_SOURCE:** 刮削元数据及图片使用的数据源,`themoviedb`/`douban`,默认`themoviedb` --- diff --git a/app/api/endpoints/subscribe.py b/app/api/endpoints/subscribe.py index 0bfc148f..78f4889f 100644 --- a/app/api/endpoints/subscribe.py +++ b/app/api/endpoints/subscribe.py @@ -7,6 +7,7 @@ from sqlalchemy.orm import Session from app import schemas from app.chain.subscribe import SubscribeChain from app.core.config import settings +from app.core.metainfo import MetaInfo from app.core.security import verify_token from app.db import get_db from app.db.models.subscribe import Subscribe @@ -55,6 +56,11 @@ def create_subscribe( mtype = MediaType(subscribe_in.type) else: mtype = None + # 豆瓣标理 + if subscribe_in.doubanid: + meta = MetaInfo(subscribe_in.name) + subscribe_in.name = meta.name + subscribe_in.season = meta.begin_season # 标题转换 if subscribe_in.name: title = subscribe_in.name @@ -117,7 +123,7 @@ def subscribe_mediaid( tmdbid = mediaid[5:] if not tmdbid or not str(tmdbid).isdigit(): return Subscribe() - result = Subscribe.exists(db, int(tmdbid), season) + result = Subscribe.exists(db, tmdbid=int(tmdbid), season=season) elif mediaid.startswith("douban:"): doubanid = mediaid[7:] if not doubanid: diff --git a/app/chain/search.py b/app/chain/search.py index 85050184..0b3f9a16 100644 --- a/app/chain/search.py +++ b/app/chain/search.py @@ -94,6 +94,9 @@ class SearchChain(ChainBase): :param filter_rule: 过滤规则,为空是使用默认过滤规则 :param area: 搜索范围,title or imdbid """ + # 豆瓣标题处理 + if mediainfo.douban_id: + mediainfo.title = MetaInfo(title=mediainfo.title).name logger.info(f'开始搜索资源,关键词:{keyword or mediainfo.title} ...') # 补充媒体信息 if not mediainfo.names: diff --git a/app/chain/subscribe.py b/app/chain/subscribe.py index efa44021..28ca4dc8 100644 --- a/app/chain/subscribe.py +++ b/app/chain/subscribe.py @@ -75,6 +75,9 @@ class SubscribeChain(ChainBase): else: # 豆瓣识别模式 mediainfo = self.recognize_media(meta=metainfo, mtype=mtype, doubanid=doubanid) + if mediainfo: + # 豆瓣标题处理 + mediainfo.title = MetaInfo(mediainfo.title).name # 识别失败 if not mediainfo: logger.warn(f'未识别到媒体信息,标题:{title},tmdbid:{tmdbid},doubanid:{doubanid}') @@ -143,6 +146,7 @@ class SubscribeChain(ChainBase): 判断订阅是否已存在 """ if self.subscribeoper.exists(tmdbid=mediainfo.tmdb_id, + doubanid=mediainfo.douban_id, season=meta.begin_season if meta else None): return True return False diff --git a/app/core/config.py b/app/core/config.py index f703b078..f063a3e1 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -45,8 +45,6 @@ class Settings(BaseSettings): PROXY_HOST: str = None # 媒体识别来源 themoviedb/douban RECOGNIZE_SOURCE: str = "themoviedb" - # 媒体信息搜索来源 themoviedb/douban - SEARCH_SOURCE: str = "themoviedb" # 刮削来源 themoviedb/douban SCRAP_SOURCE: str = "themoviedb" # 刮削入库的媒体文件 diff --git a/app/core/context.py b/app/core/context.py index e7687ce4..67848934 100644 --- a/app/core/context.py +++ b/app/core/context.py @@ -417,20 +417,28 @@ class MediaInfo: if not self.type: if isinstance(info.get('media_type'), MediaType): self.type = info.get('media_type') - else: + elif info.get("type"): self.type = MediaType.MOVIE if info.get("type") == "movie" else MediaType.TV + elif info.get("type_name"): + self.type = MediaType(info.get("type_name")) # 标题 if not self.title: - # 识别标题中的季 - meta = MetaInfo(info.get("title")) - self.season = meta.begin_season - self.title = meta.name + self.title = info.get("title") # 原语种标题 if not self.original_title: self.original_title = info.get("original_title") # 年份 if not self.year: self.year = info.get("year")[:4] if info.get("year") else None + # 识别标题中的季 + meta = MetaInfo(info.get("title")) + # 季 + if not self.season: + self.season = meta.begin_season + if self.season: + self.type = MediaType.TV + else: + self.type = MediaType.MOVIE # 评分 if not self.vote_average: rating = info.get("rating") diff --git a/app/db/models/subscribe.py b/app/db/models/subscribe.py index efec6262..c478a426 100644 --- a/app/db/models/subscribe.py +++ b/app/db/models/subscribe.py @@ -69,11 +69,15 @@ class Subscribe(Base): @staticmethod @db_query - def exists(db: Session, tmdbid: int, season: int = None): - if season: - return db.query(Subscribe).filter(Subscribe.tmdbid == tmdbid, - Subscribe.season == season).first() - return db.query(Subscribe).filter(Subscribe.tmdbid == tmdbid).first() + def exists(db: Session, tmdbid: int = None, doubanid: str = None, season: int = None): + if tmdbid: + if season: + return db.query(Subscribe).filter(Subscribe.tmdbid == tmdbid, + Subscribe.season == season).first() + return db.query(Subscribe).filter(Subscribe.tmdbid == tmdbid).first() + elif doubanid: + return db.query(Subscribe).filter(Subscribe.doubanid == doubanid).first() + return None @staticmethod @db_query diff --git a/app/db/subscribe_oper.py b/app/db/subscribe_oper.py index 9cda995f..7b4b8ef7 100644 --- a/app/db/subscribe_oper.py +++ b/app/db/subscribe_oper.py @@ -15,7 +15,10 @@ class SubscribeOper(DbOper): """ 新增订阅 """ - subscribe = Subscribe.exists(self._db, tmdbid=mediainfo.tmdb_id, season=kwargs.get('season')) + subscribe = Subscribe.exists(self._db, + tmdbid=mediainfo.tmdb_id, + doubanid=mediainfo.douban_id, + season=kwargs.get('season')) if not subscribe: subscribe = Subscribe(name=mediainfo.title, year=mediainfo.year, @@ -32,19 +35,26 @@ class SubscribeOper(DbOper): **kwargs) subscribe.create(self._db) # 查询订阅 - subscribe = Subscribe.exists(self._db, tmdbid=mediainfo.tmdb_id, season=kwargs.get('season')) + subscribe = Subscribe.exists(self._db, + tmdbid=mediainfo.tmdb_id, + doubanid=mediainfo.douban_id, + season=kwargs.get('season')) return subscribe.id, "新增订阅成功" else: return subscribe.id, "订阅已存在" - def exists(self, tmdbid: int, season: int) -> bool: + def exists(self, tmdbid: int = None, doubanid: str = None, season: int = None) -> bool: """ 判断是否存在 """ - if season: - return True if Subscribe.exists(self._db, tmdbid=tmdbid, season=season) else False - else: - return True if Subscribe.exists(self._db, tmdbid=tmdbid) else False + if tmdbid: + if season: + return True if Subscribe.exists(self._db, tmdbid=tmdbid, season=season) else False + else: + return True if Subscribe.exists(self._db, tmdbid=tmdbid) else False + elif doubanid: + return True if Subscribe.exists(self._db, doubanid=doubanid) else False + return False def get(self, sid: int) -> Subscribe: """ diff --git a/app/modules/douban/__init__.py b/app/modules/douban/__init__.py index 42b3573b..4e576bd8 100644 --- a/app/modules/douban/__init__.py +++ b/app/modules/douban/__init__.py @@ -484,7 +484,7 @@ class DoubanModule(_ModuleBase): :reutrn: 媒体信息 """ # 未启用豆瓣搜索时返回None - if settings.SEARCH_SOURCE != "douban": + if settings.RECOGNIZE_SOURCE != "douban": return None if not meta.name: @@ -495,7 +495,7 @@ class DoubanModule(_ModuleBase): # 返回数据 ret_medias = [] for item_obj in result.get("items"): - if meta.type and meta.type.value != item_obj.get("type_name"): + if meta.type and meta.type != MediaType.UNKNOWN and meta.type.value != item_obj.get("type_name"): continue if item_obj.get("type_name") not in (MediaType.TV.value, MediaType.MOVIE.value): continue diff --git a/app/modules/douban/douban_cache.py b/app/modules/douban/douban_cache.py index c595abc4..ad68255c 100644 --- a/app/modules/douban/douban_cache.py +++ b/app/modules/douban/douban_cache.py @@ -7,6 +7,7 @@ from typing import Optional from app.core.config import settings from app.core.meta import MetaBase +from app.core.metainfo import MetaInfo from app.utils.singleton import Singleton from app.schemas.types import MediaType @@ -128,24 +129,27 @@ class DoubanCache(metaclass=Singleton): with lock: if info: # 缓存标题 - cache_title = info.get("title") \ - if info.get("media_type") == MediaType.MOVIE else info.get("name") + cache_title = info.get("title") # 缓存年份 - cache_year = info.get('release_date') \ - if info.get("media_type") == MediaType.MOVIE else info.get('first_air_date') - if cache_year: - cache_year = cache_year[:4] + cache_year = info.get('year') # 类型 if isinstance(info.get('media_type'), MediaType): mtype = info.get('media_type') - else: + elif info.get("type"): mtype = MediaType.MOVIE if info.get("type") == "movie" else MediaType.TV + else: + meta = MetaInfo(cache_title) + if meta.begin_season: + mtype = MediaType.TV + else: + mtype = MediaType.MOVIE # 海报 poster_path = info.get("pic", {}).get("large") if not poster_path and info.get("cover_url"): poster_path = info.get("cover_url") if not poster_path and info.get("cover"): poster_path = info.get("cover").get("url") + self._meta_data[self.__get_key(meta)] = { "id": info.get("id"), "type": mtype, diff --git a/app/modules/themoviedb/__init__.py b/app/modules/themoviedb/__init__.py index 3cf80bab..b4a4509d 100644 --- a/app/modules/themoviedb/__init__.py +++ b/app/modules/themoviedb/__init__.py @@ -188,7 +188,7 @@ class TheMovieDbModule(_ModuleBase): :reutrn: 媒体信息列表 """ # 未启用时返回None - if settings.SEARCH_SOURCE != "themoviedb": + if settings.RECOGNIZE_SOURCE != "themoviedb": return None if not meta.name: