feat 媒体库刷新移植为插件

This commit is contained in:
jxxghp 2023-11-01 16:20:15 +08:00
parent 00052efbbc
commit c7a869b750
11 changed files with 159 additions and 70 deletions

View File

@ -153,7 +153,6 @@ MoviePilot需要配套下载器和媒体服务器配合使用。
- **TR_PASSWORD** transmission密码 - **TR_PASSWORD** transmission密码
--- ---
- **REFRESH_MEDIASERVER** 入库后是否刷新媒体服务器,`true`/`false`,默认`true`
- **❗MEDIASERVER** 媒体服务器,支持`emby`/`jellyfin`/`plex`,同时开启多个使用`,`分隔。还需要配置对应媒体服务器的环境变量,非对应媒体服务器的变量可删除,推荐使用`emby` - **❗MEDIASERVER** 媒体服务器,支持`emby`/`jellyfin`/`plex`,同时开启多个使用`,`分隔。还需要配置对应媒体服务器的环境变量,非对应媒体服务器的变量可删除,推荐使用`emby`
- `emby`设置项: - `emby`设置项:

View File

@ -362,15 +362,6 @@ class ChainBase(metaclass=ABCMeta):
""" """
return self.run_module("media_exists", mediainfo=mediainfo, itemid=itemid) return self.run_module("media_exists", mediainfo=mediainfo, itemid=itemid)
def refresh_mediaserver(self, mediainfo: MediaInfo, file_path: Path) -> None:
"""
刷新媒体库
:param mediainfo: 识别的媒体信息
:param file_path: 文件路径
:return: 成功或失败
"""
self.run_module("refresh_mediaserver", mediainfo=mediainfo, file_path=file_path)
def post_message(self, message: Notification) -> None: def post_message(self, message: Notification) -> None:
""" """
发送消息 发送消息

View File

@ -375,9 +375,6 @@ class TransferChain(ChainBase):
# 媒体目录 # 媒体目录
if transfer_info.target_path.is_file(): if transfer_info.target_path.is_file():
transfer_info.target_path = transfer_info.target_path.parent transfer_info.target_path = transfer_info.target_path.parent
# 刷新媒体库,根目录或季目录
if settings.REFRESH_MEDIASERVER:
self.refresh_mediaserver(mediainfo=media, file_path=transfer_info.target_path)
# 发送通知 # 发送通知
se_str = None se_str = None
if media.type == MediaType.TV: if media.type == MediaType.TV:

View File

@ -155,8 +155,6 @@ class Settings(BaseSettings):
DOWNLOAD_SUBTITLE: bool = True DOWNLOAD_SUBTITLE: bool = True
# 媒体服务器 emby/jellyfin/plex多个媒体服务器,分割 # 媒体服务器 emby/jellyfin/plex多个媒体服务器,分割
MEDIASERVER: str = "emby" MEDIASERVER: str = "emby"
# 入库刷新媒体库
REFRESH_MEDIASERVER: bool = True
# 媒体服务器同步间隔(小时) # 媒体服务器同步间隔(小时)
MEDIASERVER_SYNC_INTERVAL: int = 6 MEDIASERVER_SYNC_INTERVAL: int = 6
# 媒体服务器同步黑名单,多个媒体库名称,分割 # 媒体服务器同步黑名单,多个媒体库名称,分割

View File

@ -1,4 +1,3 @@
from pathlib import Path
from typing import Optional, Tuple, Union, Any, List, Generator from typing import Optional, Tuple, Union, Any, List, Generator
from app import schemas from app import schemas
@ -96,24 +95,6 @@ class EmbyModule(_ModuleBase):
itemid=itemid itemid=itemid
) )
def refresh_mediaserver(self, mediainfo: MediaInfo, file_path: Path) -> None:
"""
刷新媒体库
:param mediainfo: 识别的媒体信息
:param file_path: 文件路径
:return: 成功或失败
"""
items = [
schemas.RefreshMediaItem(
title=mediainfo.title,
year=mediainfo.year,
type=mediainfo.type,
category=mediainfo.category,
target_path=file_path
)
]
self.emby.refresh_library_by_items(items)
def media_statistic(self) -> List[schemas.Statistic]: def media_statistic(self) -> List[schemas.Statistic]:
""" """
媒体数量统计 媒体数量统计

View File

@ -1,4 +1,3 @@
from pathlib import Path
from typing import Optional, Tuple, Union, Any, List, Generator from typing import Optional, Tuple, Union, Any, List, Generator
from app import schemas from app import schemas
@ -94,15 +93,6 @@ class JellyfinModule(_ModuleBase):
itemid=itemid itemid=itemid
) )
def refresh_mediaserver(self, mediainfo: MediaInfo, file_path: Path) -> None:
"""
刷新媒体库
:param mediainfo: 识别的媒体信息
:param file_path: 文件路径
:return: 成功或失败
"""
self.jellyfin.refresh_root_library()
def media_statistic(self) -> List[schemas.Statistic]: def media_statistic(self) -> List[schemas.Statistic]:
""" """
媒体数量统计 媒体数量统计

View File

@ -1,4 +1,3 @@
from pathlib import Path
from typing import Optional, Tuple, Union, Any, List, Generator from typing import Optional, Tuple, Union, Any, List, Generator
from app import schemas from app import schemas
@ -88,24 +87,6 @@ class PlexModule(_ModuleBase):
itemid=item_id itemid=item_id
) )
def refresh_mediaserver(self, mediainfo: MediaInfo, file_path: Path) -> None:
"""
刷新媒体库
:param mediainfo: 识别的媒体信息
:param file_path: 文件路径
:return: 成功或失败
"""
items = [
schemas.RefreshMediaItem(
title=mediainfo.title,
year=mediainfo.year,
type=mediainfo.type,
category=mediainfo.category,
target_path=file_path
)
]
self.plex.refresh_library_by_items(items)
def media_statistic(self) -> List[schemas.Statistic]: def media_statistic(self) -> List[schemas.Statistic]:
""" """
媒体数量统计 媒体数量统计

View File

@ -490,9 +490,6 @@ class DirMonitor(_PluginBase):
} }
self._medias[mediainfo.title_year + " " + file_meta.season] = media_list self._medias[mediainfo.title_year + " " + file_meta.season] = media_list
# 汇总刷新媒体库
if settings.REFRESH_MEDIASERVER:
self.chain.refresh_mediaserver(mediainfo=mediainfo, file_path=transferinfo.target_path)
# 广播事件 # 广播事件
self.eventmanager.send_event(EventType.TransferComplete, { self.eventmanager.send_event(EventType.TransferComplete, {
'meta': file_meta, 'meta': file_meta,

View File

@ -11,9 +11,9 @@ from app.utils.web import WebUtils
class MediaServerMsg(_PluginBase): class MediaServerMsg(_PluginBase):
# 插件名称 # 插件名称
plugin_name = "媒体服务器通知" plugin_name = "媒体服务器通知"
# 插件描述 # 插件描述
plugin_desc = "发送媒体服务器播入、入库等通知消息。" plugin_desc = "发送Emby/Jellyfin/Plex服务器的播放、入库等通知消息。"
# 插件图标 # 插件图标
plugin_icon = "mediaplay.png" plugin_icon = "mediaplay.png"
# 主题色 # 主题色
@ -129,6 +129,27 @@ class MediaServerMsg(_PluginBase):
} }
] ]
}, },
{
'component': 'VRow',
'content': [
{
'component': 'VCol',
'props': {
'cols': 12,
},
'content': [
{
'component': 'VAlert',
'props': {
'type': 'info',
'variant': 'tonal',
'text': '需要设置媒体服务器Webhook回调相对路径为 /api/v1/webhook?token=moviepilot3001端口其中 moviepilot 为设置的 API_TOKEN。'
}
}
]
}
]
}
] ]
} }
], { ], {

View File

@ -0,0 +1,136 @@
from typing import Any, List, Dict, Tuple
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
class MediaServerRefresh(_PluginBase):
# 插件名称
plugin_name = "媒体库服务器刷新"
# 插件描述
plugin_desc = "入库后自动刷新Emby/Jellyfin/Plex服务器海报墙。"
# 插件图标
plugin_icon = "refresh2.png"
# 主题色
plugin_color = "#347180"
# 插件版本
plugin_version = "1.0"
# 插件作者
plugin_author = "jxxghp"
# 作者主页
author_url = "https://github.com/jxxghp"
# 插件配置项ID前缀
plugin_config_prefix = "mediaserverrefresh_"
# 加载顺序
plugin_order = 14
# 可使用的用户级别
auth_level = 1
# 私有属性
_enabled = False
def init_plugin(self, config: dict = None):
if config:
self._enabled = config.get("enabled")
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_form(self) -> Tuple[List[dict], Dict[str, Any]]:
"""
拼装插件配置页面需要返回两块数据1页面配置2数据结构
"""
return [
{
'component': 'VForm',
'content': [
{
'component': 'VRow',
'content': [
{
'component': 'VCol',
'props': {
'cols': 12,
'md': 6
},
'content': [
{
'component': 'VSwitch',
'props': {
'model': 'enabled',
'label': '启用插件',
}
}
]
}
]
}
]
}
], {
"enabled": False
}
def get_page(self) -> List[dict]:
pass
@eventmanager.register(EventType.TransferComplete)
def refresh(self, event: Event):
"""
发送通知消息
"""
if not self._enabled:
return
event_info: dict = event.event_data
if not event_info:
return
# 刷新媒体库
if not settings.MEDIASERVER:
return
# 入库数据
transferinfo: TransferInfo = event_info.get("transferinfo")
mediainfo: MediaInfo = event_info.get("mediainfo")
items = [
RefreshMediaItem(
title=mediainfo.title,
year=mediainfo.year,
type=mediainfo.type,
category=mediainfo.category,
target_path=transferinfo.target_path
)
]
# Emby
if "emby" in settings.MEDIASERVER:
Emby().refresh_library_by_items(items)
# Jeyllyfin
if "jellyfin" in settings.MEDIASERVER:
# FIXME Jellyfin未找到刷新单个项目的API
Jellyfin().refresh_root_library()
# Plex
if "plex" in settings.MEDIASERVER:
Plex().refresh_library_by_items(items)
def stop_service(self):
"""
退出插件
"""
pass

View File

@ -171,8 +171,6 @@ DOWNLOAD_SUBTITLE=true
#################################### ####################################
# 【*】媒体服务器 emby/jellyfin/plex多个媒体服务器,分割 # 【*】媒体服务器 emby/jellyfin/plex多个媒体服务器,分割
MEDIASERVER=emby MEDIASERVER=emby
# 入库刷新媒体库
REFRESH_MEDIASERVER=true
# 媒体服务器同步间隔(小时) # 媒体服务器同步间隔(小时)
MEDIASERVER_SYNC_INTERVAL=6 MEDIASERVER_SYNC_INTERVAL=6
# 媒体服务器同步黑名单,多个媒体库名称,分割 # 媒体服务器同步黑名单,多个媒体库名称,分割