This commit is contained in:
jxxghp 2023-08-07 10:56:57 +08:00
parent e58d45923a
commit 3258e71a5f
4 changed files with 58 additions and 92 deletions

View File

@ -3,6 +3,8 @@ import re
from pathlib import Path from pathlib import Path
from typing import List, Optional, Union, Dict, Generator from typing import List, Optional, Union, Dict, Generator
from requests import Response
from app.core.config import settings from app.core.config import settings
from app.log import logger from app.log import logger
from app.schemas import RefreshMediaItem, WebhookEventInfo from app.schemas import RefreshMediaItem, WebhookEventInfo
@ -598,41 +600,16 @@ class Emby(metaclass=Singleton):
return eventItem return eventItem
def get_log(self): def get_data(self, url: str) -> Optional[Response]:
""" """
获取日志 自定义URL从媒体服务器获取数据其中{HOST}{APIKEY}{USER}会被替换成实际的值
:param url: 请求地址
""" """
if not self._host or not self._apikey: url = url.replace("{HOST}", self._host)\
return "" .replace("{APIKEY}", self._apikey)\
# emby 日志url .replace("{USER}", self._user)
log_url = "%sSystem/Logs/embyserver.txt?api_key=%s" % (self._host, self._apikey)
log_res = RequestUtils().get_res(url=log_url)
if not log_res or log_res.status_code != 200:
return ""
return log_res.text
def get_fav_items(self, user: str = None) -> list:
"""
获取已收藏媒体列表
"""
# 根据加入日期 降序排序
url = f"{self._host}emby/Users/{user or self._user}/Items?SortBy=DateCreated%2CSortName" \
f"&SortOrder=Descending" \
f"&Filters=IsFavorite" \
f"&Recursive=true" \
f"&Fields=PrimaryImageAspectRatio%2CBasicSyncInfo" \
f"&CollapseBoxSetItems=false" \
f"&ExcludeLocationTypes=Virtual" \
f"&EnableTotalRecordCount=false" \
f"&Limit=20&api_key={self._apikey}"
try: try:
resp = RequestUtils().get_res(url=url) return RequestUtils().get_res(url=url)
if resp:
return resp.json().get("Items")
else:
logger.error(f"User/Items 未获取到返回数据")
return []
except Exception as e: except Exception as e:
logger.error(f"连接User/Items 出错:" + str(e)) logger.error(f"连接Emby出错" + str(e))
return [] return None

View File

@ -1,8 +1,9 @@
import datetime
import json import json
import re import re
from typing import List, Union, Optional, Dict, Generator from typing import List, Union, Optional, Dict, Generator
from requests import Response
from app.core.config import settings from app.core.config import settings
from app.log import logger from app.log import logger
from app.schemas import MediaType, WebhookEventInfo from app.schemas import MediaType, WebhookEventInfo
@ -439,44 +440,16 @@ class Jellyfin(metaclass=Singleton):
logger.error(f"连接Users/Items出错" + str(e)) logger.error(f"连接Users/Items出错" + str(e))
yield {} yield {}
def get_log(self): def get_data(self, url: str) -> Optional[Response]:
""" """
获取日志 自定义URL从媒体服务器获取数据其中{HOST}{APIKEY}{USER}会被替换成实际的值
:param url: 请求地址
""" """
if not self._host or not self._apikey: url = url.replace("{HOST}", self._host)\
return "" .replace("{APIKEY}", self._apikey)\
# 日志url .replace("{USER}", self._user)
log_url = "%sSystem/Logs/Log?name=log_%s.log&api_key=%s" % (
self._host, datetime.date.today().strftime("%Y%m%d"), self._apikey)
log_res = RequestUtils().get_res(url=log_url)
if not log_res or log_res.status_code != 200:
return ""
else:
return log_res.text
def get_fav_items(self, user: str = None) -> list:
"""
获取已收藏媒体列表
"""
# 根据加入日期 降序排序
url = f"{self._host}Users/{user or self._user}/Items?SortBy=DateCreated%2CSortName" \
f"&SortOrder=Descending" \
f"&Filters=IsFavorite" \
f"&Recursive=true" \
f"&Fields=PrimaryImageAspectRatio%2CBasicSyncInfo" \
f"&CollapseBoxSetItems=false" \
f"&ExcludeLocationTypes=Virtual" \
f"&EnableTotalRecordCount=false" \
f"&Limit=20" \
f"&apikey={self._apikey}"
try: try:
resp = RequestUtils().get_res(url=url) return RequestUtils().get_res(url=url)
if resp:
return resp.json().get("Items")
else:
logger.error(f"User/Items 未获取到返回数据")
return []
except Exception as e: except Exception as e:
logger.error(f"连接User/Items 出错:" + str(e)) logger.error(f"连接Jellyfin出错" + str(e))
return [] return None

View File

@ -1,10 +1,10 @@
import datetime import datetime
from pathlib import Path from pathlib import Path
from threading import Lock
from typing import Optional, Any, List, Dict, Tuple from typing import Optional, Any, List, Dict, Tuple
from apscheduler.schedulers.background import BackgroundScheduler from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.cron import CronTrigger from apscheduler.triggers.cron import CronTrigger
from requests import Response
from app.chain.subscribe import SubscribeChain from app.chain.subscribe import SubscribeChain
from app.core.config import settings from app.core.config import settings
@ -14,9 +14,6 @@ from app.modules.emby import Emby
from app.modules.jellyfin import Jellyfin from app.modules.jellyfin import Jellyfin
from app.plugins import _PluginBase from app.plugins import _PluginBase
from app.schemas.types import MediaType from app.schemas.types import MediaType
from app.utils.http import RequestUtils
lock = Lock()
class BestFilmVersion(_PluginBase): class BestFilmVersion(_PluginBase):
@ -305,9 +302,30 @@ class BestFilmVersion(_PluginBase):
# 读取收藏 # 读取收藏
if settings.MEDIASERVER == 'jellyfin': if settings.MEDIASERVER == 'jellyfin':
resp = Jellyfin().get_fav_items() # 根据加入日期 降序排序
url = "{HOST}Users/{USER}/Items?SortBy=DateCreated%2CSortName" \
"&SortOrder=Descending" \
"&Filters=IsFavorite" \
"&Recursive=true" \
"&Fields=PrimaryImageAspectRatio%2CBasicSyncInfo" \
"&CollapseBoxSetItems=false" \
"&ExcludeLocationTypes=Virtual" \
"&EnableTotalRecordCount=false" \
"&Limit=20" \
"&apikey={APIKEY}"
resp = self.get_items(Jellyfin().get_data(url))
elif settings.MEDIASERVER == 'emby': elif settings.MEDIASERVER == 'emby':
resp = Emby().get_fav_items() # 根据加入日期 降序排序
url = "{HOST}emby/Users/{USER}/Items?SortBy=DateCreated%2CSortName" \
"&SortOrder=Descending" \
"&Filters=IsFavorite" \
"&Recursive=true" \
"&Fields=PrimaryImageAspectRatio%2CBasicSyncInfo" \
"&CollapseBoxSetItems=false" \
"&ExcludeLocationTypes=Virtual" \
"&EnableTotalRecordCount=false" \
"&Limit=20&api_key={APIKEY}"
resp = self.get_items(Emby().get_data(url))
else: else:
# TODO plex待开发 # TODO plex待开发
return return
@ -374,14 +392,12 @@ class BestFilmVersion(_PluginBase):
self._cache_path.write_text("\n".join(caches)) self._cache_path.write_text("\n".join(caches))
@staticmethod @staticmethod
def media_simple_filter(url): def get_items(resp: Response):
try: try:
resp = RequestUtils().get_res(url=url)
if resp: if resp:
return resp.json().get("Items") return resp.json().get("Items") or []
else: else:
logger.error(f"User/Items 未获取到返回数据")
return [] return []
except Exception as e: except Exception as e:
logger.error(f"连接User/Items 出错:" + str(e)) print(str(e))
return [] return []

View File

@ -470,15 +470,15 @@ class MediaSyncDel(_PluginBase):
@staticmethod @staticmethod
def parse_emby_log(last_time): def parse_emby_log(last_time):
# emby log_url = "{HOST}System/Logs/embyserver.txt?api_key={APIKEY}"
log_text = Emby().get_log() log_res = Emby().get_data(log_url)
if not log_text: if not log_res or log_res.status_code != 200:
logger.error("获取emby日志失败请检查服务器配置") logger.error("获取emby日志失败请检查服务器配置")
return [] return []
# 正则解析删除的媒体信息 # 正则解析删除的媒体信息
pattern = r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{3}) Info App: Removing item from database, Type: (\w+), Name: (.*), Path: (.*), Id: (\d+)' pattern = r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{3}) Info App: Removing item from database, Type: (\w+), Name: (.*), Path: (.*), Id: (\d+)'
matches = re.findall(pattern, log_text) matches = re.findall(pattern, log_res.text)
del_medias = [] del_medias = []
# 循环获取媒体信息 # 循环获取媒体信息
@ -542,16 +542,16 @@ class MediaSyncDel(_PluginBase):
@staticmethod @staticmethod
def parse_jellyfin_log(last_time): def parse_jellyfin_log(last_time):
# jellyfin # 根据加入日期 降序排序
log_text = Jellyfin().get_log() log_url = "{HOST}System/Logs/Log?name=log_%s.log&api_key={APIKEY}" % datetime.date.today().strftime("%Y%m%d")
log_res = Jellyfin().get_data(log_url)
if not log_text: if not log_res or log_res.status_code != 200:
logger.error("获取jellyfin日志失败请检查服务器配置") logger.error("获取jellyfin日志失败请检查服务器配置")
return [] return []
# 正则解析删除的媒体信息 # 正则解析删除的媒体信息
pattern = r'\[(.*?)\].*?Removing item, Type: "(.*?)", Name: "(.*?)", Path: "(.*?)"' pattern = r'\[(.*?)\].*?Removing item, Type: "(.*?)", Name: "(.*?)", Path: "(.*?)"'
matches = re.findall(pattern, log_text) matches = re.findall(pattern, log_res.text)
del_medias = [] del_medias = []
# 循环获取媒体信息 # 循环获取媒体信息