From a876d2bdbadbcb35c117fac6e604e23959c8075d Mon Sep 17 00:00:00 2001 From: thsrite Date: Thu, 15 Aug 2024 14:16:28 +0800 Subject: [PATCH] =?UTF-8?q?feat=20Emby=E8=A7=86=E9=A2=91=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=20v1.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + icons/extendtype.png | Bin 0 -> 4134 bytes package.json | 12 + plugins/embyextendtype/__init__.py | 348 ++++++++++++++++++++++++++++ plugins/embymetarefresh/__init__.py | 6 +- 5 files changed, 364 insertions(+), 3 deletions(-) create mode 100644 icons/extendtype.png create mode 100644 plugins/embyextendtype/__init__.py diff --git a/README.md b/README.md index 0ed6f74..8f1fb14 100644 --- a/README.md +++ b/README.md @@ -50,3 +50,4 @@ MoviePilot三方插件市场:https://github.com/thsrite/MoviePilot-Plugins/ - 文件复制 v1.1 - Emby合集媒体排序 v1.1 - 影视将映订阅 v1.1 +- Emby视频类型检查 v1.0 diff --git a/icons/extendtype.png b/icons/extendtype.png new file mode 100644 index 0000000000000000000000000000000000000000..d4685aa11bd0664ab316d2657a422f6507f083db GIT binary patch literal 4134 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 list: + """ + 获取媒体库视频类型 + """ + if not self._EMBY_HOST or not self._EMBY_APIKEY: + return [] + req_url = f"%semby/ExtendedVideoTypes?ParentId=%s&Recursive=true&IncludeItemTypes=Episode,Movie&Limit=10&api_key=%s" % ( + self._EMBY_HOST, parent_id, self._EMBY_APIKEY) + try: + with RequestUtils().get_res(req_url) as res: + if res: + return res.json().get("Items") + else: + logger.info(f"获取媒体库视频类型失败,无法连接Emby!") + return [] + except Exception as e: + logger.error(f"连接ExtendedVideoTypes出错:" + str(e)) + return [] + + def __update_config(self): + """ + 更新配置 + """ + self.update_config({ + "enabled": self._enabled, + "onlyonce": self._onlyonce, + "librarys": self._librarys, + "cron": self._cron, + "extend": self._extend, + "notify": self._notify, + "msgtype": self._msgtype, + }) + + def get_state(self) -> bool: + return self._enabled + + @staticmethod + def get_command() -> List[Dict[str, Any]]: + pass + + def get_api(self) -> List[Dict[str, Any]]: + pass + + def get_service(self) -> List[Dict[str, Any]]: + pass + + def get_form(self) -> Tuple[List[dict], Dict[str, Any]]: + librarys = Emby().get_librarys() + library_items = [{'title': library.name, 'value': f'{library.name} {library.id}'} for library in librarys] + + MsgTypeOptions = [] + for item in NotificationType: + MsgTypeOptions.append({ + "title": item.value, + "value": item.name + }) + return [ + { + 'component': 'VForm', + 'content': [ + { + 'component': 'VRow', + 'content': [ + { + 'component': 'VCol', + 'props': { + 'cols': 12, + 'md': 4 + }, + 'content': [ + { + 'component': 'VSwitch', + 'props': { + 'model': 'enabled', + 'label': '启用插件', + } + } + ] + }, + { + 'component': 'VCol', + 'props': { + 'cols': 12, + 'md': 4 + }, + 'content': [ + { + 'component': 'VSwitch', + 'props': { + 'model': 'onlyonce', + 'label': '立即运行一次', + } + } + ] + }, + { + 'component': 'VCol', + 'props': { + 'cols': 12, + 'md': 4 + }, + 'content': [ + { + 'component': 'VSwitch', + 'props': { + 'model': 'notify', + 'label': '开启通知', + } + } + ] + }, + ] + }, + { + 'component': 'VRow', + 'content': [ + { + 'component': 'VCol', + 'props': { + 'cols': 12, + 'md': 4 + }, + 'content': [ + { + 'component': 'VTextField', + 'props': { + 'model': 'cron', + 'label': '定时全量同步周期', + 'placeholder': '5位cron表达式,留空关闭' + } + } + ] + }, + { + 'component': 'VCol', + 'props': { + 'cols': 12, + 'md': 4 + }, + 'content': [ + { + 'component': 'VSelect', + 'props': { + 'multiple': False, + 'chips': True, + 'model': 'msgtype', + 'label': '消息类型', + 'items': MsgTypeOptions + } + } + ] + }, + { + 'component': 'VCol', + 'props': { + 'cols': 12, + 'md': 4 + }, + 'content': [ + { + 'component': 'VTextField', + 'props': { + 'model': 'extend', + 'label': '视频类型', + 'placeholder': '多个英文逗号拼接' + } + } + ] + } + ] + }, + { + 'component': 'VRow', + 'content': [ + { + 'component': 'VCol', + 'props': { + 'cols': 12, + }, + 'content': [ + { + 'component': 'VSelect', + 'props': { + 'multiple': True, + 'chips': True, + 'model': 'librarys', + 'label': '媒体库', + 'items': library_items + } + } + ] + }, + ] + }, + ] + } + ], { + "enabled": False, + "onlyonce": False, + "notify": False, + "cron": "", + "extend": "", + "librarys": [], + } + + def get_page(self) -> List[dict]: + pass + + def stop_service(self): + """ + 退出插件 + """ + if self._scheduler: + self._scheduler.remove_all_jobs() + if self._scheduler.running: + self._event.set() + self._scheduler.shutdown() + self._event.clear() + self._scheduler = None diff --git a/plugins/embymetarefresh/__init__.py b/plugins/embymetarefresh/__init__.py index 1b70e57..ffb025c 100644 --- a/plugins/embymetarefresh/__init__.py +++ b/plugins/embymetarefresh/__init__.py @@ -738,7 +738,7 @@ class EmbyMetaRefresh(_PluginBase): 获取最新入库项目 """ if not self._EMBY_HOST or not self._EMBY_APIKEY: - return False + return [] req_url = "%semby/Users/%s/Items?Limit=%s&api_key=%s&SortBy=DateCreated,SortName&SortOrder=Descending&IncludeItemTypes=Episode,Movie&Recursive=true&Fields=DateCreated" % ( self._EMBY_HOST, self._EMBY_USER, limit, self._EMBY_APIKEY) try: @@ -747,10 +747,10 @@ class EmbyMetaRefresh(_PluginBase): return res.json().get("Items") else: logger.info(f"获取最新入库项目失败,无法连接Emby!") + return [] except Exception as e: logger.error(f"连接Items出错:" + str(e)) - return False - return False + return [] def __get_emby_series_id_by_name(self, name: str, year: str) -> Optional[str]: """