From 0e35cec6e287d4d849a3aee83272774f499e0c7d Mon Sep 17 00:00:00 2001 From: jxxghp Date: Wed, 11 Oct 2023 12:16:41 +0800 Subject: [PATCH] =?UTF-8?q?fix=20#743=20=E6=94=AF=E6=8C=81Rclone?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 1 + README.md | 2 +- app/modules/filetransfer/__init__.py | 6 ++++ app/plugins/dirmonitor/__init__.py | 4 +-- app/schemas/history.py | 2 +- app/utils/system.py | 49 ++++++++++++++++++++++++++++ config/app.env | 2 +- 7 files changed, 61 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index a5433cda..74c8f8a6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -31,6 +31,7 @@ RUN apt-get update -y \ dumb-init \ jq \ haproxy \ + rclone \ && \ if [ "$(uname -m)" = "x86_64" ]; \ then ln -s /usr/lib/x86_64-linux-musl/libc.so /lib/libc.musl-x86_64.so.1; \ diff --git a/README.md b/README.md index 62a98c22..caca1325 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ MoviePilot需要配套下载器和媒体服务器配合使用。 - **SCRAP_SOURCE:** 刮削元数据及图片使用的数据源,`themoviedb`/`douban`,默认`themoviedb` - **SCRAP_FOLLOW_TMDB:** 新增已入库媒体是否跟随TMDB信息变化,`true`/`false`,默认`true` --- -- **TRANSFER_TYPE $\color{red}{*}$ :** 整理转移方式,支持`link`/`copy`/`move`/`softlink` **注意:在`link`和`softlink`转移方式下,转移后的文件会继承源文件的权限掩码,不受`UMASK`影响** +- **TRANSFER_TYPE $\color{red}{*}$ :** 整理转移方式,支持`link`/`copy`/`move`/`softlink`/`rclone_copy`/`rclone_move` **注意:在`link`和`softlink`转移方式下,转移后的文件会继承源文件的权限掩码,不受`UMASK`影响;rclone需要自行映射rclone配置目录到容器中或在容器内完成rclone配置,节点名称必须为:`MP`** - **LIBRARY_PATH $\color{red}{*}$ :** 媒体库目录,多个目录使用`,`分隔 - **LIBRARY_MOVIE_NAME:** 电影媒体库目录名称(不是完整路径),默认`电影` - **LIBRARY_TV_NAME:** 电视剧媒体库目录称(不是完整路径),默认`电视剧` diff --git a/app/modules/filetransfer/__init__.py b/app/modules/filetransfer/__init__.py index 62c6944a..564e03b7 100644 --- a/app/modules/filetransfer/__init__.py +++ b/app/modules/filetransfer/__init__.py @@ -80,6 +80,12 @@ class FileTransferModule(_ModuleBase): 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) diff --git a/app/plugins/dirmonitor/__init__.py b/app/plugins/dirmonitor/__init__.py index ddced187..23765b20 100644 --- a/app/plugins/dirmonitor/__init__.py +++ b/app/plugins/dirmonitor/__init__.py @@ -619,9 +619,9 @@ class DirMonitor(_PluginBase): 'rows': 5, 'placeholder': '每一行一个目录,支持三种配置方式:\n' '监控目录\n' - '监控目录#转移方式(move|copy|link|softlink)\n' + '监控目录#转移方式(move|copy|link|softlink|rclone_copy|rclone_move)\n' '监控目录:转移目的目录(需同时在媒体库目录中配置该目的目录)\n' - '监控目录:转移目的目录#转移方式(move|copy|link|softlink)' + '监控目录:转移目的目录#转移方式(move|copy|link|softlink|rclone_copy|rclone_move)' } } ] diff --git a/app/schemas/history.py b/app/schemas/history.py index da8a9bbf..749f5399 100644 --- a/app/schemas/history.py +++ b/app/schemas/history.py @@ -56,7 +56,7 @@ class TransferHistory(BaseModel): src: Optional[str] = None # 目的目录 dest: Optional[str] = None - # 转移模式link/copy/move/softlink + # 转移模式 mode: Optional[str] = None # 类型:电影、电视剧 type: Optional[str] = None diff --git a/app/utils/system.py b/app/utils/system.py index 47cbe5f1..f6d6c957 100644 --- a/app/utils/system.py +++ b/app/utils/system.py @@ -3,6 +3,7 @@ import os import platform import re import shutil +import subprocess import sys from pathlib import Path from typing import List, Union, Tuple @@ -118,6 +119,54 @@ class SystemUtils: print(str(err)) return -1, str(err) + @staticmethod + def rclone_move(src: Path, dest: Path): + """ + Rclone移动 + """ + try: + retcode = subprocess.run( + [ + 'rclone', 'moveto', + str(src), + f'MP:{dest}' + ], + startupinfo=SystemUtils.__get_hidden_shell() + ).returncode + return retcode, "" + except Exception as err: + print(str(err)) + return -1, str(err) + + @staticmethod + def rclone_copy(src: Path, dest: Path): + """ + Rclone复制 + """ + try: + retcode = subprocess.run( + [ + 'rclone', 'copyto', + str(src), + f'MP:{dest}' + ], + startupinfo=SystemUtils.__get_hidden_shell() + ).returncode + return retcode, "" + except Exception as err: + print(str(err)) + return -1, str(err) + + @staticmethod + def __get_hidden_shell(): + if SystemUtils.is_windows(): + st = subprocess.STARTUPINFO() + st.dwFlags = subprocess.STARTF_USESHOWWINDOW + st.wShowWindow = subprocess.SW_HIDE + return st + else: + return None + @staticmethod def list_files(directory: Path, extensions: list, min_filesize: int = 0) -> List[Path]: """ diff --git a/config/app.env b/config/app.env index da5a754b..c7118a2c 100644 --- a/config/app.env +++ b/config/app.env @@ -39,7 +39,7 @@ SCRAP_SOURCE=themoviedb #################################### # 媒体库 # #################################### -# 【*】转移方式 link/copy/move/softlink +# 【*】转移方式 link/copy/move/softlink/rclone_copy/rclone_move TRANSFER_TYPE=copy # 【*】媒体库目录,多个目录使用,分隔 LIBRARY_PATH=