From 01191aa21eed056b47d3774b2f02960d73173164 Mon Sep 17 00:00:00 2001 From: Attente <19653207+wikrin@users.noreply.github.com> Date: Tue, 7 Oct 2025 15:26:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(mediasyncdel):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E9=AA=8C=E8=AF=81=EF=BC=8C=E9=99=8D=E4=BD=8E?= =?UTF-8?q?=E8=AF=AF=E5=88=A0=E5=8F=91=E7=94=9F=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins.v2/mediasyncdel/__init__.py | 44 +++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/plugins.v2/mediasyncdel/__init__.py b/plugins.v2/mediasyncdel/__init__.py index eb4003d..9333c2f 100644 --- a/plugins.v2/mediasyncdel/__init__.py +++ b/plugins.v2/mediasyncdel/__init__.py @@ -583,7 +583,7 @@ class MediaSyncDel(_PluginBase): if not self._enabled or str(self._sync_type) != "webhook": return - event_data = event.event_data + event_data: schemas.WebhookEventInfo = event.event_data event_type = event_data.event # Emby Webhook event_type = library.deleted @@ -602,6 +602,8 @@ class MediaSyncDel(_PluginBase): season_num = event_data.season_id # 集数 episode_num = event_data.episode_id + # 操作时间戳 + delete_time = self.format_timestamp(event_data.json_object) """ 执行删除逻辑 @@ -633,10 +635,11 @@ class MediaSyncDel(_PluginBase): media_path=media_path, tmdb_id=tmdb_id, season_num=season_num, - episode_num=episode_num) + episode_num=episode_num, + delete_time=delete_time) @eventmanager.register(EventType.WebhookMessage) - def sync_del_by_plugin(self, event): + def sync_del_by_plugin(self, event: Event): """ emby删除媒体库同步删除历史记录 Scripter X插件 @@ -644,7 +647,7 @@ class MediaSyncDel(_PluginBase): if not self._enabled or str(self._sync_type) != "plugin": return - event_data = event.event_data + event_data: schemas.WebhookEventInfo = event.event_data event_type = event_data.event # Scripter X插件 event_type = media_del @@ -746,8 +749,16 @@ class MediaSyncDel(_PluginBase): season_num=season_num, 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): + def __sync_del( + self, + media_type: str, + media_name: str, + media_path: str, + tmdb_id: int, + season_num: str, + episode_num: str, + delete_time: Optional[str] = None, + ): if not media_type: logger.error(f"{media_name} 同步删除失败,未获取到媒体类型,请检查媒体是否刮削") return @@ -774,14 +785,18 @@ class MediaSyncDel(_PluginBase): season_num=season_num, episode_num=episode_num) - logger.info(f"正在同步删除{msg}") - if not transfer_history: logger.warn( f"{media_type} {media_name} 未获取到可删除数据,请检查路径映射是否配置错误,请检查tmdbid获取是否正确") return - logger.info(f"获取到 {len(transfer_history)} 条转移记录,开始同步删除") + if delete_time: + latest_his = max(transfer_history, key=lambda x: x.date) + if delete_time < latest_his.date: + logger.warn(f"忽略删除 {msg}, 整理时间: {latest_his.date}, 发生在删除事件: {delete_time} 之后") + return + + logger.info(f"开始同步删除 {msg}, 获取到 {len(transfer_history)} 条转移记录") # 开始删除 year = None del_torrent_hashs = [] @@ -1223,3 +1238,14 @@ class MediaSyncDel(_PluginBase): return "" tmdb_image_url = f"https://{settings.TMDB_IMAGE_DOMAIN}" return tmdb_image_url + f"/t/p/{prefix}{path}" + + @staticmethod + def format_timestamp(json_data: dict) -> str: + from app.utils.string import StringUtils + + return StringUtils.format_timestamp( + StringUtils.str_to_timestamp( + json_data.get("UtcTimestamp") # jellyfin + or json_data.get("Date") # emby + ) + )