diff --git a/README.md b/README.md index c58f969..574e16b 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ MoviePilot三方插件市场:https://github.com/thsrite/MoviePilot-Plugins/ - [订阅提醒 1.1](docs%2FSubscribeReminder.md) - [Emby观影报告 1.5](docs%2FEmbyReporter.md) - [豆瓣明星热映订阅 1.3](docs%2FActorSubscribe.md) -- [短剧刮削 3.0](docs%2FShortPlayMonitor.md) +- [短剧刮削 3.1](docs%2FShortPlayMonitor.md) - [云盘实时链接 1.2](docs%2FCloudLinkMonitor.md) - [源文件恢复 1.2](docs%2FLinkToSrc.md) diff --git a/docs/ShortPlayMonitor.md b/docs/ShortPlayMonitor.md index 974bb54..b440da4 100644 --- a/docs/ShortPlayMonitor.md +++ b/docs/ShortPlayMonitor.md @@ -2,6 +2,7 @@ ### 更新记录 +- 3.1 支持自定义转移方式 - 3.0 默认从tmdb刮削,刮削失败则从pt站刮削 - 2.5 fix裁剪bug - 2.4 支持一键裁剪封面 diff --git a/package.json b/package.json index 0c3411c..49010ac 100644 --- a/package.json +++ b/package.json @@ -114,7 +114,7 @@ "ShortPlayMonitor": { "name": "短剧刮削", "description": "监控视频短剧创建,刮削。", - "version": "3.0", + "version": "3.1", "icon": "Amule_B.png", "author": "thsrite", "level": 1 diff --git a/plugins/shortplaymonitor/__init__.py b/plugins/shortplaymonitor/__init__.py index e2e8067..72ac966 100644 --- a/plugins/shortplaymonitor/__init__.py +++ b/plugins/shortplaymonitor/__init__.py @@ -5,7 +5,7 @@ from pathlib import Path from typing import Any, List, Dict, Tuple, Optional from xml.dom import minidom - +from threading import Lock from app.chain.tmdb import TmdbChain from app.core.metainfo import MetaInfoPath from app.schemas import MediaInfo, TransferInfo @@ -36,6 +36,7 @@ from app.helper.sites import SitesHelper from app.utils.http import RequestUtils ffmpeg_lock = threading.Lock() +lock = Lock() class FileMonitorHandler(FileSystemEventHandler): @@ -63,7 +64,7 @@ class ShortPlayMonitor(_PluginBase): # 插件图标 plugin_icon = "Amule_B.png" # 插件版本 - plugin_version = "3.0" + plugin_version = "3.1" # 插件作者 plugin_author = "thsrite" # 作者主页 @@ -81,6 +82,7 @@ class ShortPlayMonitor(_PluginBase): _onlyonce = False _image = False _exclude_keywords = "" + _transfer_type = "link" _observer = [] _timeline = "00:00:10" _dirconf = {} @@ -104,6 +106,7 @@ class ShortPlayMonitor(_PluginBase): self._image = config.get("image") self._monitor_confs = config.get("monitor_confs") self._exclude_keywords = config.get("exclude_keywords") or "" + self._transfer_type = config.get("transfer_type") or "link" # 停止现有任务 self.stop_service() @@ -304,7 +307,7 @@ class ShortPlayMonitor(_PluginBase): # 转移 transferinfo: TransferInfo = self.chain.transfer(mediainfo=mediainfo, path=Path(event_path), - transfer_type="link", + transfer_type=self._transfer_type, target=Path(dest_dir), meta=file_meta, episodes_info=episodes_info) @@ -314,7 +317,7 @@ class ShortPlayMonitor(_PluginBase): else: self.chain.scrape_metadata(path=transferinfo.target_path, mediainfo=mediainfo, - transfer_type="link") + transfer_type=self._transfer_type) transfer_flag = True except Exception as e: print(str(e)) @@ -383,7 +386,9 @@ class ShortPlayMonitor(_PluginBase): return # 硬链接 - retcode, retmsg = SystemUtils.link(Path(event_path), target_path) + retcode = self.__transfer_command(file_item=Path(event_path), + target_file=target_path, + transfer_type=self._transfer_type) if retcode == 0: logger.info(f"文件 {event_path} 硬链接完成") # 生成 tvshow.nfo @@ -423,6 +428,41 @@ class ShortPlayMonitor(_PluginBase): logger.error(f"event_handler_created error: {e}") print(str(e)) + @staticmethod + def __transfer_command(file_item: Path, target_file: Path, transfer_type: str) -> int: + """ + 使用系统命令处理单个文件 + :param file_item: 文件路径 + :param target_file: 目标文件路径 + :param transfer_type: RmtMode转移方式 + """ + with lock: + + # 转移 + if transfer_type == 'link': + # 硬链接 + retcode, retmsg = SystemUtils.link(file_item, target_file) + elif transfer_type == 'softlink': + # 软链接 + retcode, retmsg = SystemUtils.softlink(file_item, target_file) + elif transfer_type == 'move': + # 移动 + retcode, retmsg = SystemUtils.move(file_item, target_file) + elif transfer_type == 'rclone_move': + # Rclone 移动 + retcode, retmsg = SystemUtils.rclone_move(file_item, target_file) + elif transfer_type == 'rclone_copy': + # Rclone 复制 + retcode, retmsg = SystemUtils.rclone_copy(file_item, target_file) + else: + # 复制 + retcode, retmsg = SystemUtils.copy(file_item, target_file) + + if retcode != 0: + logger.error(retmsg) + + return retcode + def __save_poster(self, input_path, poster_path, cover_conf): """ 截取图片做封面 @@ -669,6 +709,7 @@ class ShortPlayMonitor(_PluginBase): self.update_config({ "enabled": self._enabled, "exclude_keywords": self._exclude_keywords, + "transfer_type": self._transfer_type, "onlyonce": self._onlyonce, "image": self._image, "monitor_confs": self._monitor_confs @@ -699,7 +740,7 @@ class ShortPlayMonitor(_PluginBase): 'component': 'VCol', 'props': { 'cols': 12, - 'md': 4 + 'md': 3 }, 'content': [ { @@ -715,7 +756,7 @@ class ShortPlayMonitor(_PluginBase): 'component': 'VCol', 'props': { 'cols': 12, - 'md': 4 + 'md': 3 }, 'content': [ { @@ -731,7 +772,7 @@ class ShortPlayMonitor(_PluginBase): 'component': 'VCol', 'props': { 'cols': 12, - 'md': 4 + 'md': 3 }, 'content': [ { @@ -742,7 +783,31 @@ class ShortPlayMonitor(_PluginBase): } } ] - } + }, + { + 'component': 'VCol', + 'props': { + 'cols': 12, + 'md': 3 + }, + 'content': [ + { + 'component': 'VSelect', + 'props': { + 'model': 'transfer_type', + 'label': '转移方式', + 'items': [ + {'title': '移动', 'value': 'move'}, + {'title': '复制', 'value': 'copy'}, + {'title': '硬链接', 'value': 'link'}, + {'title': '软链接', 'value': 'softlink'}, + {'title': 'Rclone复制', 'value': 'rclone_copy'}, + {'title': 'Rclone移动', 'value': 'rclone_move'} + ] + } + } + ] + }, ] }, { @@ -860,7 +925,8 @@ class ShortPlayMonitor(_PluginBase): "onlyonce": False, "image": False, "monitor_confs": "", - "exclude_keywords": "" + "exclude_keywords": "", + "transfer_type": "link" } def get_page(self) -> List[dict]: