From e83a895d37a7002842cb5fcb64fadbfa8774252b Mon Sep 17 00:00:00 2001 From: thsrite Date: Fri, 13 Dec 2024 11:25:18 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E6=94=AF=E6=8C=81=E9=9F=B3=E9=A2=91?= =?UTF-8?q?=E6=A0=87=E7=AD=BE=E7=BC=93=E5=AD=98=EF=BC=8C=E9=98=B2=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E8=AF=B7=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.v2.json | 3 +- plugins.v2/embymetatag/__init__.py | 95 ++++++++++++++++++++++++++---- 2 files changed, 85 insertions(+), 13 deletions(-) diff --git a/package.v2.json b/package.v2.json index 833931b..c603892 100644 --- a/package.v2.json +++ b/package.v2.json @@ -33,11 +33,12 @@ "name": "Emby媒体标签", "description": "自动给媒体库媒体添加标签。", "labels": "Emby", - "version": "1.4", + "version": "1.5", "icon": "https://raw.githubusercontent.com/thsrite/MoviePilot-Plugins/main/icons/tag.png", "author": "thsrite", "level": 1, "history": { + "v1.5": "支持音频标签缓存,防重复请求", "v1.4": "支持给音频添加语言标签", "v1.3": "适配v2多媒体服务器", "v1.2": "支持指定特殊媒体名称添加标签", diff --git a/plugins.v2/embymetatag/__init__.py b/plugins.v2/embymetatag/__init__.py index 3694da3..c4b2067 100644 --- a/plugins.v2/embymetatag/__init__.py +++ b/plugins.v2/embymetatag/__init__.py @@ -1,5 +1,8 @@ +import json +import os import re from datetime import datetime, timedelta +from pathlib import Path from typing import Optional, Any, List, Dict, Tuple import pytz @@ -27,7 +30,7 @@ class EmbyMetaTag(_PluginBase): # 插件图标 plugin_icon = "https://raw.githubusercontent.com/thsrite/MoviePilot-Plugins/main/icons/tag.png" # 插件版本 - plugin_version = "1.4" + plugin_version = "1.5" # 插件作者 plugin_author = "thsrite" # 作者主页 @@ -41,6 +44,7 @@ class EmbyMetaTag(_PluginBase): # 私有属性 _enabled = False + _rebuild = False _onlyonce = False _cron = None _tag_confs = None @@ -53,19 +57,23 @@ class EmbyMetaTag(_PluginBase): _EMBY_USER = None _EMBY_APIKEY = None _scheduler: Optional[BackgroundScheduler] = None + _audio_files_json = "audio_files.json" _tags = {} _acc_tags = [] _media_tags = {} _media_type = {} + _audio_files = [] def init_plugin(self, config: dict = None): # 停止现有任务 self.stop_service() self.mediaserver_helper = MediaServerHelper() + self._audio_files_json = os.path.join(self.get_data_path(), self._audio_files_json) if config: self._enabled = config.get("enabled") + self._rebuild = config.get("rebuild") self._onlyonce = config.get("onlyonce") self._cron = config.get("cron") self._tag_confs = config.get("tag_confs") @@ -73,6 +81,15 @@ class EmbyMetaTag(_PluginBase): self._name_tag_confs = config.get("name_tag_confs") self._mediaservers = config.get("mediaservers") or [] + if self._rebuild: + logger.info("开始清理媒体音频标签缓存") + self._rebuild = False + self._audio_files = [] + if Path(self._audio_files_json).exists(): + Path(self._audio_files_json).unlink() + logger.info("媒体音频标签缓存清理完成") + self.__update_config() + self._tags = {} if self._tag_confs: tag_confs = self._tag_confs.split("\n") @@ -150,6 +167,7 @@ class EmbyMetaTag(_PluginBase): self.update_config( { "onlyonce": self._onlyonce, + "rebuild": self._rebuild, "cron": self._cron, "enabled": self._enabled, "tag_confs": self._tag_confs, @@ -234,14 +252,27 @@ class EmbyMetaTag(_PluginBase): # 媒体音频标签 if self._acc_tags and len(self._acc_tags) > 0: + if Path(self._audio_files_json).exists(): + logger.info("尝试加载本地媒体音频标签缓存") + # 尝试加载本地 + with open(self._audio_files_json, 'r') as file: + content = file.read() + if content: + self._audio_files = json.loads(content) + MediaServerChain().sync() media_items = self.__get_media_items(db=None) logger.info(f"获取到同步媒体数据:{len(media_items)} 个") + __save_flag = False for media_item in media_items: if not media_item: continue + if str(media_item.item_id) in self._audio_files: + logger.info(f"音频文件标签已处理过:{media_item.item_type} {media_item.title}") + continue + if media_item.item_type == "电影": item_id = media_item.item_id else: @@ -272,18 +303,35 @@ class EmbyMetaTag(_PluginBase): if not match_flag: continue - logger.info(f"匹配到媒体音频:{media_item.item_type} {media_item.title} {acc_tags}") - add_tags += acc_tags + if acc_tags: + logger.info(f"匹配到媒体音频:{media_item.item_type} {media_item.title} {acc_tags}") + add_tags += acc_tags # 给媒体添加tag - logger.info(f"开始给媒体添加标签:{media_item.item_type} {media_item.title} {add_tags}") - self.__add_tags(item_name=media_item.title, - item_id=media_item.item_id, - media_tags=add_tags, - type="媒体音频") + if add_tags: + # logger.info(f"开始给媒体添加标签:{media_item.item_type} {media_item.title} {add_tags}") + __save_flag = self.__add_tags(item_name=media_item.title, + item_id=media_item.item_id, + media_tags=add_tags, + type="媒体音频") + if __save_flag: + self._audio_files.append(str(media_item.item_id)) + + # 重新保存json文件 + if __save_flag: + self.__sava_json() logger.info(f"{emby_name} 媒体标签任务完成") + def __sava_json(self): + """ + 保存json文件 + """ + logger.info(f"开始写入本地文件 {self._audio_files_json}") + file = open(self._audio_files_json, 'w') + file.write(json.dumps(self._audio_files)) + file.close() + def __add_tags(self, item_name, item_id, media_tags, type): """ 给单个项目添加标签 @@ -303,6 +351,10 @@ class EmbyMetaTag(_PluginBase): tags = {"Tags": tags} add_flag = self.__add_tag(item_id, tags) logger.info(f"{type} 添加标签成功:{item_name} {tags} {add_flag}") + return True + else: + logger.info(f"{type} 已有标签:{item_name} {media_tags}") + return False @eventmanager.register(EventType.PluginAction) def remote_sync(self, event: Event): @@ -382,10 +434,12 @@ class EmbyMetaTag(_PluginBase): with RequestUtils().get_res(req_url) as res: if res and res.status_code == 200: item = res.json() - return [media_stream.get('Title') or media_stream.get('Language') for media_stream in + return [media_stream.get('Title') or media_stream.get('Language') or media_stream.get( + 'DisplayTitle') or media_stream.get('DisplayLanguage') for media_stream in item.get("MediaSources", {})[0].get("MediaStreams", []) if media_stream.get('Type') == 'Audio' and ( - media_stream.get('Title') or media_stream.get('Language'))] + media_stream.get('Title') or media_stream.get('Language') or media_stream.get( + 'DisplayTitle') or media_stream.get('DisplayLanguage'))] except Exception as e: logger.error(f"连接Items/Id/PlaybackInfo出错:" + str(e)) return [] @@ -439,7 +493,7 @@ class EmbyMetaTag(_PluginBase): 'component': 'VCol', 'props': { 'cols': 12, - 'md': 6 + 'md': 4 }, 'content': [ { @@ -455,7 +509,7 @@ class EmbyMetaTag(_PluginBase): 'component': 'VCol', 'props': { 'cols': 12, - 'md': 6 + 'md': 4 }, 'content': [ { @@ -467,6 +521,22 @@ class EmbyMetaTag(_PluginBase): } ] }, + { + 'component': 'VCol', + 'props': { + 'cols': 12, + 'md': 4 + }, + 'content': [ + { + 'component': 'VSwitch', + 'props': { + 'model': 'rebuild', + 'label': '清理媒体音频标签缓存', + } + } + ] + }, ] }, { @@ -608,6 +678,7 @@ class EmbyMetaTag(_PluginBase): ], { "enabled": False, "onlyonce": False, + "rebuild": False, "cron": "5 1 * * *", "tag_confs": "", "name_tag_confs": "",