diff --git a/VideoSubtitleRemover_vsr.spec b/VideoSubtitleRemover_vsr.spec new file mode 100644 index 0000000..7b1c603 --- /dev/null +++ b/VideoSubtitleRemover_vsr.spec @@ -0,0 +1,312 @@ +# -*- mode: python ; coding: utf-8 -*- +from PyInstaller.utils.hooks import collect_data_files +from PyInstaller.utils.hooks import collect_dynamic_libs +from PyInstaller.utils.hooks import copy_metadata + +import os +import sys + +# 使用当前工作目录作为基准路径 +current_dir = os.getcwd() + +datas = [ + (os.path.join(current_dir, 'backend/models/big-lama'), 'backend/models/big-lama'), + (os.path.join(current_dir, 'backend/models/sttn-auto'), 'backend/models/sttn-auto'), + (os.path.join(current_dir, 'backend/models/sttn-det'), 'backend/models/sttn-det'), + (os.path.join(current_dir, 'backend/models/V5'), 'backend/models/V5'), + (os.path.join(current_dir, 'backend/interface'), 'backend/interface'), + (os.path.join(current_dir, 'backend/ffmpeg/win_x64/ffmpeg.exe'), 'backend/ffmpeg/win_x64'), + (os.path.join(current_dir, 'config/config.json'), 'config'), + (os.path.join(current_dir, 'design/vsr.ico'), 'design'), + (os.path.join(current_dir, 'ui/icon'), 'ui/icon'), +] + +binaries = [] + +# 收集重要包的数据文件 +try: + datas += collect_data_files('paddleocr') +except: + pass + +try: + datas += collect_data_files('skimage') +except: + pass + +try: + datas += collect_data_files('opencv-python') +except: + pass + +try: + datas += collect_data_files('opencv-contrib-python') +except: + pass + +try: + datas += collect_data_files('cv2') +except: + pass + +try: + datas += collect_data_files('pypdfium2') +except: + pass + +try: + datas += collect_data_files('pyclipper') +except: + pass + +try: + datas += collect_data_files('matplotlib') +except: + pass + +try: + datas += collect_data_files('pandas') +except: + pass + +try: + datas += collect_data_files('huggingface_hub') +except: + pass + +try: + datas += collect_data_files('modelscope') +except: + pass + +try: + datas += collect_data_files('paddlex') +except: + pass + +# 收集Paddle的二进制文件 +try: + binaries += collect_dynamic_libs('paddle') +except: + pass + +# 复制重要包的元数据 +try: + datas += copy_metadata('numpy') +except: + pass + +try: + datas += copy_metadata('PySide6') +except: + pass + +try: + datas += copy_metadata('torch') +except: + pass + +try: + datas += copy_metadata('torchvision') +except: + pass + +try: + datas += copy_metadata('matplotlib') +except: + pass + +try: + datas += copy_metadata('scipy') +except: + pass + +try: + datas += copy_metadata('Pillow') +except: + pass + +try: + datas += copy_metadata('opencv-python') +except: + pass + +try: + datas += copy_metadata('opencv-contrib-python') +except: + pass + +try: + datas += copy_metadata('pypdfium2') +except: + pass + +try: + datas += copy_metadata('pandas') +except: + pass + +try: + datas += copy_metadata('paddleocr') +except: + pass + +try: + datas += copy_metadata('paddlex') +except: + pass + +try: + datas += copy_metadata('pyclipper') +except: + pass + +hiddenimports = [ + # GUI 相关 + 'PySide6.QtCore', + 'PySide6.QtGui', + 'PySide6.QtWidgets', + 'PySide6.QtNetwork', + 'qfluentwidgets', + 'qframelesswindow', + + # 深度学习相关 + 'torch', + 'torchvision', + 'paddle', + 'paddleocr', + 'paddleocr.ppocr', + 'paddleocr.ppocr.api', + 'paddleocr.ppocr.utils', + + # 图像处理 + 'cv2', + 'cv2.data', + 'cv2.matplotlib', + 'cv2.typing', + 'cv2.xfeatures2d', # opencv-contrib-python + 'cv2.xphoto', # opencv-contrib-python + 'matplotlib', + 'matplotlib.pyplot', + 'pandas', + 'pandas._libs', + 'pandas._libs.tslibs', + 'numpy', + 'PIL', + 'pypdfium2', # PaddleOCR PDF backend + 'pypdfium2._helpers', # PaddleOCR PDF backend + 'scipy', + 'scipy.spatial', + 'scipy.spatial.transform', + 'scipy.ndimage', + + # 视频处理 + 'av', + + # 工具库 + 'tqdm', + 'requests', + 'configparser', + 'einops', + 'darkdetect', + 'je_showinfilemanager', + 'filesplit', + 'pyclipper', # PaddleOCR DBPostProcess dependency + # PaddleX 相关依赖 + 'paddlex', + 'PyYAML', + 'chardet', + 'ujson', + 'pydantic', + 'prettytable', + 'ruamel.yaml', + 'huggingface_hub', + 'modelscope', + 'colorlog', + 'filelock', + 'py_cpuinfo', + + # 项目模块 + 'backend', + 'backend.inpaint', + 'backend.inpaint.lama_inpaint', + 'backend.inpaint.sttn_auto_inpaint', + 'backend.inpaint.sttn_det_inpaint', + 'backend.inpaint.opencv_inpaint', + 'backend.tools', + 'backend.tools.ocr', + 'backend.tools.subtitle_detect', + 'backend.tools.subtitle_remover_remote_call', + 'backend.tools.video_io', + 'backend.tools.ffmpeg_cli', + 'backend.tools.process_manager', + 'backend.tools.hardware_accelerator', + 'backend.tools.inpaint_tools', + 'backend.tools.common_tools', + 'backend.config', + 'backend.scenedetect', + 'ui', + 'ui.home_interface', + 'ui.advanced_setting_interface', + 'ui.setting_interface', + 'ui.component', + 'ui.component.video_display_component', + 'ui.component.task_list_component', + 'ui.icon.my_fluent_icon', +] + +excludes = [ + 'pytest', 'test', 'tests', + 'IPython', 'jupyter', 'notebook', 'ipykernel', + 'paddle.fluid.contrib', 'paddle.fluid.dygraph', 'paddle.fluid.optimizer', + 'torch.utils.tensorboard', 'torch.utils.bottleneck', + 'sphinx', 'docutils', 'seaborn', + 'scrapy', 'beautifulsoup4', 'lxml', 'sklearn', 'xgboost', 'lightgbm', +] + +a = Analysis( + ['gui.py'], + pathex=[], + binaries=binaries, + datas=datas, + hiddenimports=hiddenimports, + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=excludes, + noarchive=False, + optimize=0, +) + +pyz = PYZ(a.pure) + +exe = EXE( + pyz, + a.scripts, + [], + exclude_binaries=True, + name='VideoSubtitleRemover', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=False, + console=True, # 显示控制台(调试用,后续可通过启动器隐藏) + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, + icon=['design\\vsr.ico'], + # 请求管理员权限 + uac_admin=True, # 以管理员身份运行 +) + +coll = COLLECT( + exe, + a.binaries, + a.datas, + strip=False, + upx=False, + upx_exclude=[], + name='VideoSubtitleRemover', +) \ No newline at end of file diff --git a/管理员权限说明.md b/管理员权限说明.md new file mode 100644 index 0000000..0b365c1 --- /dev/null +++ b/管理员权限说明.md @@ -0,0 +1,157 @@ +# 程序管理员权限说明 + +## 重要更新 + +**版本要求**: 当前版本(v1.4.0+) + +**权限要求**: 程序运行时需要管理员权限 + +## 为什么需要管理员权限? + +视频字幕去除器需要管理员权限的原因: + +1. **文件系统访问权限** + - 读取和修改受保护的文件系统区域 + - 处理不同用户权限下的视频文件 + - 访问可能受权限限制的目录 + +2. **系统级操作** + - 进程管理功能(终止和启动子进程) + - 多进程操作需要提升权限 + - 避免权限不足导致的操作失败 + +3. **FFmpeg 等系统工具** + - FFmpeg 某些操作需要提升权限 + - 视频文件编码解码的某些特性需要管理员访问 + +4. **更好的兼容性** + - 避免在不同 Windows 版本上出现权限问题 + - 确保在用户配置文件中保存设置 + - 访问网络共享资源 + +## 用户使用指南 + +### 正常启动方式 + +**方式一:直接启动(推荐)** +``` +双击 VideoSubtitleRemover.exe +``` +系统会自动弹出 UAC(用户账户控制)提示,点击"是"即可。 + +**方式二:右键启动** +``` +右键点击 VideoSubtitleRemover.exe → 以管理员身份运行 +``` + +**方式三:通过快捷方式启动** +``` +双击桌面快捷方式或开始菜单项 +``` +(如果快捷方式已经配置,会自动请求管理员权限) + +### UAC 提示说明 + +当您启动程序时,会看到以下提示: + +``` +用户账户控制 +您要允许此应用对您的设备进行更改吗? +程序名称: 视频字幕去除器 +发布者: YaoFANGUK +[是] [否] +``` + +**点击"是"** 继续启动程序。 + +### 权限不足的后果 + +如果程序没有获得管理员权限,可能会出现: + +- ❌ 无法读取某些视频文件 +- ❌ 无法保存处理后的视频 +- ❌ 多进程功能异常 +- ❌ FFmpeg 操作失败 +- ❌ 配置文件保存失败 + +## 安装程序版本 + +如果使用安装程序(VideoSubtitleRemover-Setup.exe)安装,程序会: + +1. **自动配置快捷方式** + - 桌面快捷方式:自动请求管理员权限 + - 开始菜单项:自动请求管理员权限 + +2. **UAC 集成** + - 程序图标会显示"盾牌"图标,表示需要管理员权限 + - Windows 系统会记住您的选择 + +## 技术实现 + +程序通过 PyInstaller 的 `uac_admin=True` 配置请求管理员权限: + +```python +exe = EXE( + # ... 其他配置 + uac_admin=True, # 请求管理员权限 +) +``` + +这会在程序的可执行文件中嵌入 UAC 清单,Windows 会自动识别并请求权限。 + +## 安全说明 + +### 为什么是安全的? + +1. **数字签名**(如果已签名) + - 程序发布者信息可见 + - 可以验证文件完整性 + +2. **开源透明** + - 代码在 GitHub 上公开 + - 可以审计安全性 + +3. **本地运行** + - 所有处理都在本地进行 + - 不需要网络连接(更新功能除外) + +### 最佳实践 + +1. **始终从官方来源下载** + - GitHub: https://github.com/YaoFANGUK/video-subtitle-remover + - 官方发布页面 + +2. **验证文件哈希** + - 检查下载文件的完整性 + - 防止文件被篡改 + +3. **保持系统更新** + - Windows 系统安全补丁 + - 杀毒软件病毒库更新 + +## 常见问题 + +**Q: 为什么每次启动都要请求权限?** +A: 这是 Windows 安全机制,确保用户知道程序需要提升权限。 + +**Q: 可以禁用这个提示吗?** +A: 不建议禁用。可以通过调整 UAC 设置来减少提示,但这会降低系统安全性。 + +**Q: 程序是否会在后台做坏事?** +A: 不会。程序是开源的,所有功能都公开透明。你可以查看源代码。 + +**Q: 不给管理员权限能用吗?** +A: 某些功能可能无法正常使用。强烈建议授予管理员权限。 + +## 联系支持 + +如果遇到权限相关问题: + +1. 查看日志文件(如果有的话) +2. 以管理员身份运行命令提示符,手动启动程序 +3. 在 GitHub 上提交 Issue: https://github.com/YaoFANGUK/video-subtitle-remover/issues + +--- + +**最后更新**: 2026-04-10 +**版本**: v1.4.0+