From 0decff023ec7af04719dae6d179e596a8dba93fb Mon Sep 17 00:00:00 2001 From: wood chen Date: Sat, 16 Nov 2024 10:17:36 +0800 Subject: [PATCH] chore(workflow): update build process with PyInstaller spec file Update the GitHub Actions workflow to use the PyInstaller spec file for building the application, ensuring proper inclusion of FFmpeg executables and improving the build process. --- .github/workflows/release.yml | 3 ++- gui.py | 46 +++++++++++++++++++++++++++++++---- video2gif.spec | 6 +---- 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index dc38cfe..5de730f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -63,7 +63,8 @@ jobs: - name: Build with PyInstaller shell: cmd run: | - pyinstaller --name video2gif --onefile --windowed --add-data "ffmpeg/ffmpeg.exe;ffmpeg" --add-data "ffmpeg/ffprobe.exe;ffmpeg" --add-data "README.md;." --clean --noconfirm --log-level=INFO gui.py + pyinstaller --clean video2gif.spec + - name: Upload Release Asset uses: softprops/action-gh-release@v1 diff --git a/gui.py b/gui.py index a196016..be8f00a 100644 --- a/gui.py +++ b/gui.py @@ -6,19 +6,43 @@ import platform import os import webbrowser from threading import Thread -import ffmpeg import traceback # 在类定义前添加 FFmpeg 路径设置 if getattr(sys, "frozen", False): # 运行在 PyInstaller 打包后的环境 - ffmpeg_path = os.path.join(sys._MEIPASS, "ffmpeg") + ffmpeg_path = os.path.join( + sys._MEIPASS, + "ffmpeg", + "ffmpeg.exe" if platform.system().lower() == "windows" else "ffmpeg", + ) + ffprobe_path = os.path.join( + sys._MEIPASS, + "ffmpeg", + "ffprobe.exe" if platform.system().lower() == "windows" else "ffprobe", + ) else: # 运行在开发环境 - ffmpeg_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ffmpeg") + ffmpeg_path = os.path.join( + os.path.dirname(os.path.abspath(__file__)), + "ffmpeg", + "ffmpeg.exe" if platform.system().lower() == "windows" else "ffmpeg", + ) + ffprobe_path = os.path.join( + os.path.dirname(os.path.abspath(__file__)), + "ffmpeg", + "ffprobe.exe" if platform.system().lower() == "windows" else "ffprobe", + ) -if ffmpeg_path not in os.environ["PATH"]: - os.environ["PATH"] = ffmpeg_path + os.pathsep + os.environ["PATH"] +# 设置 ffmpeg-python 包使用的 FFmpeg 路径 +import ffmpeg + +ffmpeg._run.DEFAULT_FFMPEG_PATH = ffmpeg_path +ffmpeg._run.DEFAULT_FFPROBE_PATH = ffprobe_path + +# 添加到系统 PATH +if os.path.dirname(ffmpeg_path) not in os.environ["PATH"]: + os.environ["PATH"] = os.path.dirname(ffmpeg_path) + os.pathsep + os.environ["PATH"] class VideoToGifConverter: @@ -267,6 +291,16 @@ class VideoToGifConverter: def convert_video_to_gif(self, video_path): try: + # 打印环境信息 + print(f"FFmpeg path: {ffmpeg_path}") + print(f"FFprobe path: {ffprobe_path}") + print(f"System PATH: {os.environ['PATH']}") + # 验证 FFmpeg 是否可用 + try: + version_info = ffmpeg.probe(ffmpeg._run.DEFAULT_FFMPEG_PATH) + print(f"FFmpeg version info: {version_info}") + except Exception as e: + print(f"FFmpeg probe error: {e}") # 验证输入 if not self.validate_inputs(): return False @@ -362,6 +396,8 @@ class VideoToGifConverter: except Exception as e: error_msg = str(e) print(f"Conversion error: {error_msg}") + print(f"Error type: {type(e)}") + traceback.print_exc() messagebox.showerror("错误", f"转换失败:\n{error_msg}") return False diff --git a/video2gif.spec b/video2gif.spec index 1f61972..03db9f2 100644 --- a/video2gif.spec +++ b/video2gif.spec @@ -1,7 +1,4 @@ # video2gif.spec -import sys -from PyInstaller.utils.hooks import collect_data_files - block_cipher = None a = Analysis( @@ -13,7 +10,7 @@ a = Analysis( ('ffmpeg/ffprobe.exe', 'ffmpeg'), ('README.md', '.') ], - hiddenimports=['tkinter', 'tkinter.ttk', 'tkinterdnd2'], + hiddenimports=['ffmpeg', 'ffmpeg-python'], hookspath=[], hooksconfig={}, runtime_hooks=[], @@ -45,5 +42,4 @@ exe = EXE( target_arch=None, codesign_identity=None, entitlements_file=None, - icon='icon.ico' # 如果你有图标的话 )