From e9b25a9a784662ae2f652c290af9c31197dd828a Mon Sep 17 00:00:00 2001 From: InfinityPacer <160988576+InfinityPacer@users.noreply.github.com> Date: Thu, 10 Oct 2024 02:10:53 +0800 Subject: [PATCH 1/2] feat(MediaServerRefresh): add support for v2 plugin --- plugins.v2/mediaserverrefresh/__init__.py | 107 ++++++++++++++++------ 1 file changed, 81 insertions(+), 26 deletions(-) diff --git a/plugins.v2/mediaserverrefresh/__init__.py b/plugins.v2/mediaserverrefresh/__init__.py index cc6578b..f860312 100644 --- a/plugins.v2/mediaserverrefresh/__init__.py +++ b/plugins.v2/mediaserverrefresh/__init__.py @@ -1,16 +1,14 @@ import time -from typing import Any, List, Dict, Tuple +from pathlib import Path +from typing import Any, List, Dict, Tuple, Optional -from app.core.config import settings from app.core.context import MediaInfo from app.core.event import eventmanager, Event -from app.modules.emby import Emby -from app.modules.jellyfin import Jellyfin -from app.modules.plex import Plex -from app.plugins import _PluginBase -from app.schemas import TransferInfo, RefreshMediaItem -from app.schemas.types import EventType +from app.helper.mediaserver import MediaServerHelper from app.log import logger +from app.plugins import _PluginBase +from app.schemas import TransferInfo, RefreshMediaItem, ServiceInfo +from app.schemas.types import EventType class MediaServerRefresh(_PluginBase): @@ -33,20 +31,47 @@ class MediaServerRefresh(_PluginBase): # 可使用的用户级别 auth_level = 1 + mediaserver_helper = None # 私有属性 _enabled = False _delay = 0 - _emby = None - _jellyfin = None - _plex = None + _mediaservers = None + + # Property + + @property + def service_infos(self) -> Optional[Dict[str, ServiceInfo]]: + """ + 服务信息 + """ + if not self._mediaservers: + logger.warning("尚未配置媒体服务器,请检查配置") + return None + + services = self.mediaserver_helper.get_services(name_filters=self._mediaservers) + if not services: + logger.warning("获取媒体服务器实例失败,请检查配置") + return None + + active_services = {} + for service_name, service_info in services.items(): + if service_info.instance.is_inactive(): + logger.warning(f"媒体服务器 {service_name} 未连接,请检查配置") + else: + active_services[service_name] = service_info + + if not active_services: + logger.warning("没有已连接的媒体服务器,请检查配置") + return None + + return active_services def init_plugin(self, config: dict = None): - self._emby = Emby() - self._jellyfin = Jellyfin() - self._plex = Plex() + self.mediaserver_helper = MediaServerHelper() if config: self._enabled = config.get("enabled") self._delay = config.get("delay") or 0 + self._mediaservers = config.get("mediaservers") or [] def get_state(self) -> bool: return self._enabled @@ -87,6 +112,31 @@ class MediaServerRefresh(_PluginBase): } ] }, + { + 'component': 'VRow', + 'content': [ + { + 'component': 'VCol', + 'props': { + 'cols': 12 + }, + 'content': [ + { + 'component': 'VSelect', + 'props': { + 'multiple': True, + 'chips': True, + 'clearable': True, + 'model': 'mediaservers', + 'label': '媒体服务器', + 'items': [{"title": config.name, "value": config.name} + for config in self.mediaserver_helper.get_configs().values()] + } + } + ] + } + ] + }, { 'component': 'VRow', 'content': [ @@ -131,7 +181,7 @@ class MediaServerRefresh(_PluginBase): return # 刷新媒体库 - if not settings.MEDIASERVER: + if not self.service_infos: return if self._delay: @@ -140,6 +190,9 @@ class MediaServerRefresh(_PluginBase): # 入库数据 transferinfo: TransferInfo = event_info.get("transferinfo") + if not transferinfo or not transferinfo.target_diritem or not transferinfo.target_diritem.path: + return + mediainfo: MediaInfo = event_info.get("mediainfo") items = [ RefreshMediaItem( @@ -147,21 +200,23 @@ class MediaServerRefresh(_PluginBase): year=mediainfo.year, type=mediainfo.type, category=mediainfo.category, - target_path=transferinfo.target_path + target_path=Path(transferinfo.target_diritem.path) ) ] - # Emby - if "emby" in settings.MEDIASERVER: - self._emby.refresh_library_by_items(items) - # Jeyllyfin - if "jellyfin" in settings.MEDIASERVER: - # FIXME Jellyfin未找到刷新单个项目的API - self._jellyfin.refresh_root_library() + for name, service in self.service_infos.items(): + # Emby + if self.mediaserver_helper.is_emby(service=service): + service.instance.refresh_library_by_items(items) - # Plex - if "plex" in settings.MEDIASERVER: - self._plex.refresh_library_by_items(items) + # Jeyllyfin + if self.mediaserver_helper.is_jellyfin(service=service): + # FIXME Jellyfin未找到刷新单个项目的API + service.instance.refresh_root_library() + + # Plex + if self.mediaserver_helper.is_plex(service=service): + service.instance.refresh_library_by_items(items) def stop_service(self): """ From aee0a654752806c33008a02c1fa39d5eadcb8cfd Mon Sep 17 00:00:00 2001 From: InfinityPacer <160988576+InfinityPacer@users.noreply.github.com> Date: Thu, 10 Oct 2024 02:11:58 +0800 Subject: [PATCH 2/2] feat(MediaServerRefresh): v1.3 --- package.v2.json | 12 ++++++++++++ plugins.v2/mediaserverrefresh/__init__.py | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/package.v2.json b/package.v2.json index 87b8990..824313a 100644 --- a/package.v2.json +++ b/package.v2.json @@ -46,5 +46,17 @@ "history": { "v2.2": "MoviePilot V2 版本下载任务分类与标签插件" } + }, + "MediaServerRefresh": { + "name": "媒体库服务器刷新", + "description": "入库后自动刷新Emby/Jellyfin/Plex服务器海报墙。", + "labels": "媒体库", + "version": "1.3", + "icon": "refresh2.png", + "author": "jxxghp", + "level": 1, + "history": { + "v1.3": "MoviePilot V2 版本媒体库服务器刷新插件" + } } } \ No newline at end of file diff --git a/plugins.v2/mediaserverrefresh/__init__.py b/plugins.v2/mediaserverrefresh/__init__.py index f860312..75b1b53 100644 --- a/plugins.v2/mediaserverrefresh/__init__.py +++ b/plugins.v2/mediaserverrefresh/__init__.py @@ -19,7 +19,7 @@ class MediaServerRefresh(_PluginBase): # 插件图标 plugin_icon = "refresh2.png" # 插件版本 - plugin_version = "1.2" + plugin_version = "1.3" # 插件作者 plugin_author = "jxxghp" # 作者主页