From 382035768e83cb5cf317c5f53509af8f419f5c1b Mon Sep 17 00:00:00 2001 From: thsrite Date: Wed, 1 Nov 2023 11:51:07 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix=20=E5=85=BC=E5=AE=B9emby=20webhook?= =?UTF-8?q?=E5=88=A0=E9=99=A4season=E6=B2=A1=E6=9C=89tmdbid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/db/models/transferhistory.py | 7 +++++++ app/plugins/mediasyncdel/__init__.py | 26 +++++++++++++++----------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/app/db/models/transferhistory.py b/app/db/models/transferhistory.py index 9ba25c78..a906b8a0 100644 --- a/app/db/models/transferhistory.py +++ b/app/db/models/transferhistory.py @@ -158,6 +158,13 @@ class TransferHistory(Base): # 电视剧所有季集 result = db.query(TransferHistory).filter(TransferHistory.title == title, TransferHistory.year == year).all() + # 类型 + 转移路径(emby webhook season无tmdbid场景) + elif mtype and season and dest: + # 电视剧某季 + result = db.query(TransferHistory).filter(TransferHistory.type == mtype, + TransferHistory.seasons == season, + TransferHistory.dest.like(f"{dest}%")).all() + if result: return list(result) return [] diff --git a/app/plugins/mediasyncdel/__init__.py b/app/plugins/mediasyncdel/__init__.py index 48ca2ca0..dc4f32ab 100644 --- a/app/plugins/mediasyncdel/__init__.py +++ b/app/plugins/mediasyncdel/__init__.py @@ -4,7 +4,7 @@ import os import re import time from pathlib import Path -from typing import List, Tuple, Dict, Any, Optional +from typing import List, Tuple, Dict, Any, Optional, Union from apscheduler.schedulers.background import BackgroundScheduler from apscheduler.triggers.cron import CronTrigger @@ -581,7 +581,7 @@ class MediaSyncDel(_PluginBase): episode_num=episode_num) def __sync_del(self, media_type: str, media_name: str, media_path: str, - tmdb_id: int, season_num: str, episode_num: str): + tmdb_id: Union[int, str], season_num: str, episode_num: str): """ 执行删除逻辑 """ @@ -604,9 +604,6 @@ class MediaSyncDel(_PluginBase): if not media_type: logger.error(f"{media_name} 同步删除失败,未获取到媒体类型,请检查媒体是否刮削") return - if not tmdb_id or not str(tmdb_id).isdigit(): - logger.error(f"{media_name} 同步删除失败,未获取到TMDB ID,请检查媒体是否刮削") - return # 查询转移记录 msg, transfer_history = self.__get_transfer_his(media_type=media_type, @@ -714,8 +711,8 @@ class MediaSyncDel(_PluginBase): "title": media_name, "year": year, "path": media_path, - "season": season_num, - "episode": episode_num, + "season": season_num if season_num and str(season_num).isdigit() else None, + "episode": episode_num if episode_num and str(episode_num).isdigit() else None, "image": poster_image, "del_time": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())) }) @@ -724,7 +721,7 @@ class MediaSyncDel(_PluginBase): self.save_data("history", history) def __get_transfer_his(self, media_type: str, media_name: str, media_path: str, - tmdb_id: int, season_num: str, episode_num: str): + tmdb_id: Union[int, str], season_num: str, episode_num: str): """ 查询转移记录 """ @@ -768,9 +765,16 @@ class MediaSyncDel(_PluginBase): logger.error(f"{media_name} 季同步删除失败,未获取到具体季") return msg = f'剧集 {media_name} S{season_num} {tmdb_id}' - transfer_history: List[TransferHistory] = self._transferhis.get_by(tmdbid=tmdb_id, - mtype=mtype.value, - season=f'S{season_num}') + if tmdb_id and str(tmdb_id).isdigit(): + # 根据tmdb_id查询转移记录 + transfer_history: List[TransferHistory] = self._transferhis.get_by(tmdbid=tmdb_id, + mtype=mtype.value, + season=f'S{season_num}') + else: + # 兼容emby webhook不发送tmdb场景 + transfer_history: List[TransferHistory] = self._transferhis.get_by(mtype=mtype.value, + season=f'S{season_num}', + dest=media_path) # 删除剧集S02E02 elif mtype == MediaType.TV and season_num and episode_num: if not season_num or not str(season_num).isdigit() or not episode_num or not str(episode_num).isdigit(): From b4d07cf6ab7944ad936ee9aa7c02974afc39bccf Mon Sep 17 00:00:00 2001 From: thsrite Date: Wed, 1 Nov 2023 12:06:05 +0800 Subject: [PATCH 2/2] fix --- app/modules/emby/emby.py | 1 + app/modules/jellyfin/jellyfin.py | 1 + app/plugins/mediasyncdel/__init__.py | 17 +++++++++++++---- app/schemas/mediaserver.py | 1 + 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/app/modules/emby/emby.py b/app/modules/emby/emby.py index 4435f6c1..a867b16a 100644 --- a/app/modules/emby/emby.py +++ b/app/modules/emby/emby.py @@ -803,6 +803,7 @@ class Emby(metaclass=Singleton): logger.debug(f"接收到emby webhook:{message}") eventItem = schemas.WebhookEventInfo(event=eventType, channel="emby") if message.get('Item'): + eventItem.media_type = message.get('Item', {}).get('Type') if message.get('Item', {}).get('Type') == 'Episode' \ or message.get('Item', {}).get('Type') == 'Series' \ or message.get('Item', {}).get('Type') == 'Season': diff --git a/app/modules/jellyfin/jellyfin.py b/app/modules/jellyfin/jellyfin.py index aade1704..835c95fa 100644 --- a/app/modules/jellyfin/jellyfin.py +++ b/app/modules/jellyfin/jellyfin.py @@ -466,6 +466,7 @@ class Jellyfin(metaclass=Singleton): eventItem.device_name = message.get('DeviceName') eventItem.user_name = message.get('NotificationUsername') eventItem.client = message.get('ClientName') + eventItem.media_type = message.get('ItemType') if message.get("ItemType") == "Episode" \ or message.get("ItemType") == "Series" \ or message.get("ItemType") == "Season": diff --git a/app/plugins/mediasyncdel/__init__.py b/app/plugins/mediasyncdel/__init__.py index dc4f32ab..12f61e0e 100644 --- a/app/plugins/mediasyncdel/__init__.py +++ b/app/plugins/mediasyncdel/__init__.py @@ -4,7 +4,7 @@ import os import re import time from pathlib import Path -from typing import List, Tuple, Dict, Any, Optional, Union +from typing import List, Tuple, Dict, Any, Optional from apscheduler.schedulers.background import BackgroundScheduler from apscheduler.triggers.cron import CronTrigger @@ -506,7 +506,7 @@ class MediaSyncDel(_PluginBase): return # 媒体类型 - media_type = event_data.item_type + media_type = event_data.media_type # 媒体名称 media_name = event_data.item_name # 媒体路径 @@ -518,6 +518,11 @@ class MediaSyncDel(_PluginBase): # 集数 episode_num = event_data.episode_id + # 兼容emby webhook season删除没有发送tmdbid + if not tmdb_id and str(media_type) != 'Season': + logger.error(f"{media_name} 同步删除失败,未获取到TMDB ID,请检查媒体库媒体是否刮削") + return + self.__sync_del(media_type=media_type, media_name=media_name, media_path=media_path, @@ -573,6 +578,10 @@ class MediaSyncDel(_PluginBase): # 集数 episode_num = event_data.episode_id + if not tmdb_id or not str(tmdb_id).isdigit(): + logger.error(f"{media_name} 同步删除失败,未获取到TMDB ID,请检查媒体库媒体是否刮削") + return + self.__sync_del(media_type=media_type, media_name=media_name, media_path=media_path, @@ -581,7 +590,7 @@ class MediaSyncDel(_PluginBase): episode_num=episode_num) def __sync_del(self, media_type: str, media_name: str, media_path: str, - tmdb_id: Union[int, str], season_num: str, episode_num: str): + tmdb_id: int, season_num: str, episode_num: str): """ 执行删除逻辑 """ @@ -721,7 +730,7 @@ class MediaSyncDel(_PluginBase): self.save_data("history", history) def __get_transfer_his(self, media_type: str, media_name: str, media_path: str, - tmdb_id: Union[int, str], season_num: str, episode_num: str): + tmdb_id: int, season_num: str, episode_num: str): """ 查询转移记录 """ diff --git a/app/schemas/mediaserver.py b/app/schemas/mediaserver.py index 9da086d5..cad8a947 100644 --- a/app/schemas/mediaserver.py +++ b/app/schemas/mediaserver.py @@ -138,3 +138,4 @@ class WebhookEventInfo(BaseModel): item_favorite: Optional[bool] = None save_reason: Optional[str] = None item_isvirtual: Optional[bool] = None + media_type: Optional[str] = None