refactor: 推进后端分层架构治理

This commit is contained in:
jxxghp
2026-08-18 00:29:14 +08:00
parent 5d0bacabd5
commit 5128ae9e1e
363 changed files with 34179 additions and 6019 deletions
+14 -9
View File
@@ -1,6 +1,11 @@
from typing import Any, Dict, Generator, List, Optional, Tuple, Union
from app import schemas
from app.schemas.dashboard import Statistic as _SchemaStatistic
from app.schemas.mediaserver import MediaServerItem as _SchemaMediaServerItem
from app.schemas.mediaserver import MediaServerLibrary as _SchemaMediaServerLibrary
from app.schemas.mediaserver import MediaServerPlayItem as _SchemaMediaServerPlayItem
from app.schemas.mediaserver import MediaServerSeasonInfo as _SchemaMediaServerSeasonInfo
from app.schemas.mediaserver import WebhookEventInfo as _SchemaWebhookEventInfo
from app.runtime.log import logger
from app.modules._base import _MediaServerModuleBase
from app.modules.emby.emby import Emby
@@ -50,7 +55,7 @@ class EmbyModule(_MediaServerModuleBase[Emby]):
def init_setting(self) -> Tuple[str, Union[str, bool]]:
pass
def webhook_parser(self, body: Any, form: Any, args: Any) -> Optional[schemas.WebhookEventInfo]:
def webhook_parser(self, body: Any, form: Any, args: Any) -> Optional[_SchemaWebhookEventInfo]:
"""
解析Webhook报文体
:param body: 请求体
@@ -75,7 +80,7 @@ class EmbyModule(_MediaServerModuleBase[Emby]):
return result
return None
def media_statistic(self, server: Optional[str] = None) -> Optional[List[schemas.Statistic]]:
def media_statistic(self, server: Optional[str] = None) -> Optional[List[_SchemaStatistic]]:
"""
媒体数量统计
"""
@@ -97,7 +102,7 @@ class EmbyModule(_MediaServerModuleBase[Emby]):
def mediaserver_librarys(self, server: str,
username: Optional[str] = None,
hidden: Optional[bool] = False) -> Optional[List[schemas.MediaServerLibrary]]:
hidden: Optional[bool] = False) -> Optional[List[_SchemaMediaServerLibrary]]:
"""
媒体库列表
"""
@@ -136,7 +141,7 @@ class EmbyModule(_MediaServerModuleBase[Emby]):
return server_obj.get_items_count(library_id)
return None
def mediaserver_iteminfo(self, server: str, item_id: str) -> Optional[schemas.MediaServerItem]:
def mediaserver_iteminfo(self, server: str, item_id: str) -> Optional[_SchemaMediaServerItem]:
"""
媒体库项目详情
"""
@@ -146,7 +151,7 @@ class EmbyModule(_MediaServerModuleBase[Emby]):
return None
def mediaserver_tv_episodes(self, server: str,
item_id: Union[str, int]) -> Optional[List[schemas.MediaServerSeasonInfo]]:
item_id: Union[str, int]) -> Optional[List[_SchemaMediaServerSeasonInfo]]:
"""
获取剧集信息
"""
@@ -156,13 +161,13 @@ class EmbyModule(_MediaServerModuleBase[Emby]):
_, seasoninfo = server_obj.get_tv_episodes(item_id=item_id)
if not seasoninfo:
return []
return [schemas.MediaServerSeasonInfo(
return [_SchemaMediaServerSeasonInfo(
season=season,
episodes=episodes
) for season, episodes in seasoninfo.items()]
def mediaserver_playing(self, server: str, count: Optional[int] = 20,
username: Optional[str] = None) -> Optional[List[schemas.MediaServerPlayItem]]:
username: Optional[str] = None) -> Optional[List[_SchemaMediaServerPlayItem]]:
"""
获取媒体服务器正在播放信息
"""
@@ -196,7 +201,7 @@ class EmbyModule(_MediaServerModuleBase[Emby]):
return server_obj.get_season_episode_ids(str(item_id), season)
def mediaserver_latest(self, server: Optional[str] = None, count: Optional[int] = 20,
username: Optional[str] = None) -> Optional[List[schemas.MediaServerPlayItem]]:
username: Optional[str] = None) -> Optional[List[_SchemaMediaServerPlayItem]]:
"""
获取媒体服务器最新入库条目
"""
+29 -23
View File
@@ -7,11 +7,17 @@ from typing import List, Optional, Union, Dict, Generator, Tuple, Any
from requests import Response
from app import schemas
from app.schemas.dashboard import Statistic as _SchemaStatistic
from app.schemas.mediaserver import MediaServerItem as _SchemaMediaServerItem
from app.schemas.mediaserver import MediaServerItemUserState as _SchemaMediaServerItemUserState
from app.schemas.mediaserver import MediaServerLibrary as _SchemaMediaServerLibrary
from app.schemas.mediaserver import MediaServerPlayItem as _SchemaMediaServerPlayItem
from app.schemas.mediaserver import RefreshMediaItem as _SchemaRefreshMediaItem
from app.schemas.mediaserver import WebhookEventInfo as _SchemaWebhookEventInfo
from app.runtime.config import settings
from app.application.mediaserver import MediaServerIdentityHelper, MusicMediaServerHelper
from app.runtime.log import logger
from app.schemas import MediaServerItem
from app.schemas.mediaserver import MediaServerItem
from app.schemas.types import MediaSource, MediaType
from app.adapters.network.http import RequestUtils
from app.foundation.url import UrlUtils
@@ -149,7 +155,7 @@ class Emby:
self,
username: Optional[str] = None,
hidden: Optional[bool] = False,
) -> Optional[List[schemas.MediaServerLibrary]]:
) -> Optional[List[_SchemaMediaServerLibrary]]:
"""
获取媒体服务器所有媒体库列表
"""
@@ -175,7 +181,7 @@ class Emby:
server_id = library.get("ServerId") or self.serverid
server_query = f"serverId={server_id}&" if server_id else ""
libraries.append(
schemas.MediaServerLibrary(
_SchemaMediaServerLibrary(
server="emby",
id=library.get("Id"),
item_id=library.get("Id"),
@@ -314,13 +320,13 @@ class Emby:
logger.error(f"连接Users/Query出错:" + str(e))
return 0
def get_medias_count(self) -> schemas.Statistic:
def get_medias_count(self) -> _SchemaStatistic:
"""
获得电影、电视剧、动漫媒体数量
:return: MovieCount SeriesCount SongCount
"""
if not self._host or not self._apikey:
return schemas.Statistic()
return _SchemaStatistic()
url = f"{self._host}emby/Items/Counts"
params = {
'api_key': self._apikey
@@ -329,7 +335,7 @@ class Emby:
res = RequestUtils().get_res(url, params)
if res:
result = res.json()
return schemas.Statistic(
return _SchemaStatistic(
movie_count=result.get("MovieCount") or 0,
tv_count=result.get("SeriesCount") or 0,
episode_count=result.get("EpisodeCount") or 0,
@@ -338,10 +344,10 @@ class Emby:
)
else:
logger.error(f"Items/Counts 未获取到返回数据")
return schemas.Statistic()
return _SchemaStatistic()
except Exception as e:
logger.error(f"连接Items/Counts出错:" + str(e))
return schemas.Statistic()
return _SchemaStatistic()
def __get_emby_series_id_by_name(self, name: str, year: str) -> Optional[str]:
"""
@@ -381,7 +387,7 @@ class Emby:
title: str,
year: Optional[str] = None,
media_source: Optional[MediaSource] = None,
media_id: Optional[str] = None) -> Optional[List[schemas.MediaServerItem]]:
media_id: Optional[str] = None) -> Optional[List[_SchemaMediaServerItem]]:
"""
根据标题和年份,检查电影是否在Emby中存在,存在则返回列表
:param title: 标题
@@ -429,7 +435,7 @@ class Emby:
def get_music(
self, title: Optional[str] = None, artist: Optional[str] = None,
album: Optional[str] = None,
) -> List[schemas.MediaServerItem]:
) -> List[_SchemaMediaServerItem]:
"""按歌曲、艺术家或专辑名称查询 Emby 音乐条目。"""
if not self._host or not self._apikey or not self.user:
return []
@@ -657,7 +663,7 @@ class Emby:
return False
return False
def refresh_library_by_items(self, items: List[schemas.RefreshMediaItem]) -> Optional[bool]:
def refresh_library_by_items(self, items: List[_SchemaRefreshMediaItem]) -> Optional[bool]:
"""
按类型、名称、年份来刷新媒体库
:param items: 已识别的需要刷新媒体库的媒体信息列表
@@ -682,7 +688,7 @@ class Emby:
logger.info(f"Emby媒体库刷新完成")
return success
def __get_emby_library_id_by_item(self, item: schemas.RefreshMediaItem) -> Optional[str]:
def __get_emby_library_id_by_item(self, item: _SchemaRefreshMediaItem) -> Optional[str]:
"""
根据媒体信息查询在哪个媒体库,返回要刷新的位置的ID
:param item: {title, year, type, category, target_path}
@@ -722,7 +728,7 @@ class Emby:
return "/"
@staticmethod
def __format_item_info(item) -> Optional[schemas.MediaServerItem]:
def __format_item_info(item) -> Optional[_SchemaMediaServerItem]:
"""
格式化item
"""
@@ -736,7 +742,7 @@ class Emby:
last_played_date = item.get("UserData", {}).get("LastPlayedDate")
if last_played_date is not None and "." in last_played_date:
last_played_date = last_played_date.split(".")[0]
user_state = schemas.MediaServerItemUserState(
user_state = _SchemaMediaServerItemUserState(
played=item.get("UserData", {}).get("Played"),
resume=resume,
last_played_date=datetime.strptime(last_played_date, "%Y-%m-%dT%H:%M:%S").strftime(
@@ -747,7 +753,7 @@ class Emby:
media_source, media_id = MediaServerIdentityHelper.from_provider_ids(
item.get("ProviderIds")
)
return schemas.MediaServerItem(
return _SchemaMediaServerItem(
server="emby",
library=item.get("ParentId"),
server_id=item.get("ServerId"),
@@ -768,7 +774,7 @@ class Emby:
logger.error(e)
return None
def get_iteminfo(self, itemid: str) -> Optional[schemas.MediaServerItem]:
def get_iteminfo(self, itemid: str) -> Optional[_SchemaMediaServerItem]:
"""
获取单个项目详情
"""
@@ -859,7 +865,7 @@ class Emby:
logger.error(f"连接Users/Items出错:" + str(e))
return None
def get_webhook_message(self, form: Any, args: dict) -> Optional[schemas.WebhookEventInfo]:
def get_webhook_message(self, form: Any, args: dict) -> Optional[_SchemaWebhookEventInfo]:
"""
解析Emby Webhook报文
电影:
@@ -1112,7 +1118,7 @@ class Emby:
if not eventType:
return None
logger.debug(f"接收到emby webhook{message}")
eventItem = schemas.WebhookEventInfo(event=eventType, channel="emby")
eventItem = _SchemaWebhookEventInfo(event=eventType, channel="emby")
if message.get('Item'):
eventItem.media_type = message.get('Item', {}).get('Type')
if message.get('Item', {}).get('Type') == 'Episode' \
@@ -1266,7 +1272,7 @@ class Emby:
return "%sItems/%s/Images/Primary" % (self._host, item_id)
def get_resume(self, num: Optional[int] = 12, username: Optional[str] = None) -> Optional[
List[schemas.MediaServerPlayItem]]:
List[_SchemaMediaServerPlayItem]]:
"""
获得继续观看
"""
@@ -1321,7 +1327,7 @@ class Emby:
image_tag=item.get("SeriesPrimaryImageTag"))
if not image:
image = self.__get_local_image_by_id(item.get("SeriesId"))
ret_resume.append(schemas.MediaServerPlayItem(
ret_resume.append(_SchemaMediaServerPlayItem(
id=item.get("Id"),
item_id=item.get("Id"),
server_id=server_id,
@@ -1341,7 +1347,7 @@ class Emby:
return None
def get_latest(self, num: Optional[int] = 20, username: Optional[str] = None) -> Optional[
List[schemas.MediaServerPlayItem]]:
List[_SchemaMediaServerPlayItem]]:
"""
获得最近更新
"""
@@ -1380,7 +1386,7 @@ class Emby:
server_id = item.get("ServerId") or self.serverid
link = self.get_play_url(item.get("Id"), server_id=server_id)
image = self.__get_local_image_by_id(item_id=item.get("Id"))
ret_latest.append(schemas.MediaServerPlayItem(
ret_latest.append(_SchemaMediaServerPlayItem(
id=item.get("Id"),
item_id=item.get("Id"),
server_id=server_id,