From d11956550f8fa453998c0fb97c35b01b27846cd6 Mon Sep 17 00:00:00 2001 From: mayun110 Date: Tue, 8 Aug 2023 23:35:15 +0800 Subject: [PATCH] =?UTF-8?q?feat=20BestFilmVersion=20=E5=A2=9E=E5=BC=BA?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=81=A5=E5=A3=AE=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/plugins/bestfilmversion/__init__.py | 58 +++++++++++++++---------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/app/plugins/bestfilmversion/__init__.py b/app/plugins/bestfilmversion/__init__.py index 4307300e..96b2ba6c 100644 --- a/app/plugins/bestfilmversion/__init__.py +++ b/app/plugins/bestfilmversion/__init__.py @@ -1,4 +1,5 @@ import datetime +from functools import reduce from pathlib import Path from typing import Optional, Any, List, Dict, Tuple from xml.dom.minidom import parseString @@ -398,6 +399,8 @@ class BestFilmVersion(_PluginBase): "&Limit=20" \ "&apikey={APIKEY}" resp = self.get_items(Jellyfin().get_data(url)) + if not resp: + continue all_item.extend(resp) elif settings.MEDIASERVER == 'emby': # 获取所有user @@ -417,12 +420,21 @@ class BestFilmVersion(_PluginBase): "&EnableTotalRecordCount=false" \ "&Limit=20&api_key={APIKEY}" resp = self.get_items(Emby().get_data(url)) + if not resp: + continue all_item.extend(resp) else: resp = self.plex_get_watchlist() + if not resp: + return all_item.extend(resp) - for data in all_item: + def function(y, x): + return y if (x['Name'] in [i['Name'] for i in y]) else (lambda z, u: (z.append(u), z))(y, x)[1] + # all_item 根据电影名去重 + result = reduce(function, all_item, []) + + for data in result: # 检查缓存 if data.get('Name') in caches: continue @@ -520,6 +532,8 @@ class BestFilmVersion(_PluginBase): elem = dom.documentElement # 获取 指定元素 eles = elem.getElementsByTagName('Video') + if not eles: + return [] for ele in eles: data = {} # 获取标签中内容 @@ -539,20 +553,29 @@ class BestFilmVersion(_PluginBase): logger.error(f"连接Plex/Watchlist 出错:" + str(e)) return [] - def plex_get_iteminfo(self, itemid): + @staticmethod + def plex_get_iteminfo(itemid): url = f"https://metadata.provider.plex.tv/library/metadata/{itemid}" \ f"?X-Plex-Token={settings.PLEX_TOKEN}" + ids = [] try: - resp = RequestUtils().get_res(url=url) + resp = RequestUtils(accept_type="application/json, text/plain, */*").get_res(url=url) if resp: - dom = parseString(resp.text) - # 获取文档元素对象 - elem = dom.documentElement - # 获取 指定元素 - eles = elem.getElementsByTagName('Video') - for ele in eles: - # 获取标签中内容 - return {"ExternalUrls": "TheMovieDb", "Url": f"{self.ele_get_tmdbid(ele)}"} + metadata = resp.json().get('MediaContainer').get('Metadata') + for item in metadata: + _guid = item.get('Guid') + if not _guid: + continue + + id_list = [h.get('id') for h in _guid if h.get('id').__contains__("tmdb")] + if not id_list: + continue + + ids.append({'Name': 'TheMovieDb', 'Url': id_list[0]}) + + if not ids: + return [] + return {'ExternalUrls': ids} else: logger.error(f"Plex/Items 未获取到返回数据") return [] @@ -560,19 +583,6 @@ class BestFilmVersion(_PluginBase): logger.error(f"连接Plex/Items 出错:" + str(e)) return [] - @staticmethod - def ele_get_tmdbid(ele): - data = [] - for h in ele.getElementsByTagName('Guid'): - tmdbid = h.attributes['id'].nodeValue if h.attributes['id'].nodeValue.__contains__("tmdb") else "" - if not tmdbid: - continue - obj = {"Name": "TheMovieDb", "Url": f"{tmdbid}"} - data.append(obj) - return data - logger.warn(f"连接Plex/Guid 警告:" + "未获取到tmdbid数据") - return data - @eventmanager.register(EventType.WebhookMessage) def webhook_message_action(self, event):