Compare commits

...

1 Commits

Author SHA1 Message Date
e73ac3a5c8 test 2024-11-27 14:24:42 +08:00
3 changed files with 128 additions and 38 deletions

View File

@ -6,7 +6,7 @@ on:
workflow_dispatch: workflow_dispatch:
permissions: permissions:
contents: write # 添加这个权限声明 contents: write
jobs: jobs:
create-release: create-release:
@ -16,13 +16,11 @@ jobs:
version: ${{ steps.version.outputs.version }} version: ${{ steps.version.outputs.version }}
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- name: Generate version number - name: Generate version number
id: version id: version
run: | run: |
SHA_SHORT=$(git rev-parse --short HEAD) SHA_SHORT=$(git rev-parse --short HEAD)
echo "version=1.0.0-${SHA_SHORT}" >> $GITHUB_OUTPUT echo "version=1.0.0-${SHA_SHORT}" >> $GITHUB_OUTPUT
- name: Create Release - name: Create Release
id: create_release id: create_release
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v1
@ -39,12 +37,11 @@ jobs:
runs-on: windows-latest runs-on: windows-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v4 uses: actions/setup-python@v4
with: with:
python-version: '3.11' python-version: '3.11'
- name: Download FFmpeg - name: Download FFmpeg
run: | run: |
mkdir ffmpeg mkdir ffmpeg
@ -62,8 +59,7 @@ jobs:
- name: Build with PyInstaller - name: Build with PyInstaller
shell: cmd shell: cmd
run: | run: |
pyinstaller --name video2webp --onefile --windowed --hidden-import ffmpeg --add-data "ffmpeg/ffmpeg.exe;ffmpeg" --add-data "ffmpeg/ffprobe.exe;ffmpeg" --add-data "README.md;." --clean --noconfirm --log-level=INFO gui.py pyinstaller --name video2webp --onefile --windowed --add-data "ffmpeg/ffmpeg.exe;ffmpeg" --add-data "ffmpeg/ffprobe.exe;ffmpeg" --add-data "README.md;." --icon=icon.ico --clean gui.py
- name: Upload Release Asset - name: Upload Release Asset
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v1
@ -84,16 +80,7 @@ jobs:
with: with:
python-version: '3.11' python-version: '3.11'
- name: Download FFmpeg - name: Install FFmpeg
run: |
mkdir ffmpeg
curl -L https://github.com/eugeneware/ffmpeg-static/releases/download/b4.4/darwin-x64 -o ffmpeg/ffmpeg
curl -L https://github.com/eugeneware/ffmpeg-static/releases/download/b4.4/darwin-x64 -o ffmpeg/ffprobe
chmod +x ffmpeg/ffmpeg ffmpeg/ffprobe
# 或者使用 Homebrew备选方案
- name: Install FFmpeg using Homebrew
if: failure()
run: | run: |
brew install ffmpeg brew install ffmpeg
mkdir -p ffmpeg mkdir -p ffmpeg
@ -106,34 +93,75 @@ jobs:
pip install -r requirements.txt pip install -r requirements.txt
pip install pyinstaller pip install pyinstaller
# 创建启动器脚本 # 创建 macOS 专用的启动器
- name: Create launcher script - name: Create macOS launcher
run: | run: |
echo 'import os, sys; os.environ["PATH"] = os.path.join(os.path.dirname(sys.executable), "ffmpeg") + os.pathsep + os.environ["PATH"]' > launcher.py cat > macos_launcher.py << EOL
cat gui.py >> launcher.py import os
import sys
import tkinter.filedialog
import tkinter.messagebox
from tkinter import *
# macOS 原生拖放支持
def drop_handler(event):
if not hasattr(event, 'data'): return
files = event.data.split('\n')
files = [f.strip() for f in files if f.strip()]
if files:
app.handle_drop_files(files)
# 修改主程序以支持原生拖放
with open('gui.py', 'r') as f:
code = f.read()
code = code.replace(
'from tkinterdnd2 import TkinterDnD, DND_FILES',
'# Using native macOS drag and drop'
)
# 添加原生拖放支持
code = code.replace(
'self.root = TkinterDnD.Tk()',
'self.root = tk.Tk()\n self.root.drop_target_register = lambda *args: None\n self.root.bind("<<DropFiles>>", drop_handler)'
)
with open('gui_macos.py', 'w') as f:
f.write(code)
EOL
- name: Build with PyInstaller - name: Build with PyInstaller
run: | run: |
pyinstaller --name video2webp --onefile --windowed --add-data "ffmpeg/ffmpeg:ffmpeg" --add-data "ffmpeg/ffprobe:ffmpeg" --add-data "README.md:." launcher.py pyinstaller --name video2webp \
--onefile \
- name: Create DMG --windowed \
--add-data "ffmpeg/ffmpeg:ffmpeg" \
--add-data "ffmpeg/ffprobe:ffmpeg" \
--add-data "README.md:." \
--icon=icons/logo800.icns \
--clean \
macos_launcher.py
- name: Create App Bundle
run: | run: |
cd dist mkdir -p "dist/Video2Webp.app/Contents/MacOS"
mkdir -p video2webp.app/Contents/MacOS mkdir -p "dist/Video2Webp.app/Contents/Resources"
mkdir -p video2webp.app/Contents/Resources/ffmpeg cp dist/video2webp "dist/Video2Webp.app/Contents/MacOS/"
mv video2webp video2webp.app/Contents/MacOS/ cp -r ffmpeg "dist/Video2Webp.app/Contents/Resources/"
cp ../ffmpeg/* video2webp.app/Contents/Resources/ffmpeg/ cp icons/logo800.icns "dist/Video2Webp.app/Contents/Resources/video2webp.icns"
# 创建 Info.plist # 创建 Info.plist
cat > video2webp.app/Contents/Info.plist << EOL cat > "dist/Video2Webp.app/Contents/Info.plist" << EOL
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>video2webp</string> <string>video2webp</string>
<key>CFBundleIconFile</key>
<string>video2webp.icns</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>com.example.video2webp</string> <string>com.video2webp.app</string>
<key>CFBundleName</key> <key>CFBundleName</key>
<string>Video2Webp</string> <string>Video2Webp</string>
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
@ -144,17 +172,34 @@ jobs:
<string>10.10</string> <string>10.10</string>
<key>NSHighResolutionCapable</key> <key>NSHighResolutionCapable</key>
<true/> <true/>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>mp4</string>
<string>avi</string>
<string>mov</string>
<string>mkv</string>
<string>webm</string>
<string>gif</string>
</array>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
</array>
</dict> </dict>
</plist> </plist>
EOL EOL
# 创建 DMG - name: Create DMG
hdiutil create -volname "Video2Webp" -srcfolder video2webp.app -ov -format UDZO video2webp.dmg run: |
hdiutil create -volname "Video2Webp" -srcfolder "dist/Video2Webp.app" -ov -format UDZO "dist/Video2Webp.dmg"
- name: Upload Release Asset - name: Upload Release Asset
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v1
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with: with:
tag_name: v${{ needs.create-release.outputs.version }} tag_name: v${{ needs.create-release.outputs.version }}
files: ./dist/video2webp.dmg files: ./dist/Video2Webp.dmg

48
gui.py
View File

@ -8,6 +8,15 @@ import webbrowser
from threading import Thread from threading import Thread
import traceback import traceback
# 修改 tkinterdnd2 的导入和初始化方式
ENABLE_DND = False
try:
from tkinterdnd2 import TkinterDnD, DND_FILES
ENABLE_DND = True
except ImportError:
print("tkinterdnd2 导入失败,拖放功能将不可用")
# 设置 FFmpeg 路径 # 设置 FFmpeg 路径
if getattr(sys, "frozen", False): if getattr(sys, "frozen", False):
# 运行在 PyInstaller 打包后的环境 # 运行在 PyInstaller 打包后的环境
@ -36,8 +45,12 @@ def get_subprocess_config():
class VideoToWebpConverter: class VideoToWebpConverter:
def __init__(self): def __init__(self):
# 创建主窗口 # 创建主窗口,使用 TkinterDnD.Tk() 替代 tk.Tk()
self.root = tk.Tk() if ENABLE_DND:
self.root = TkinterDnD.Tk()
else:
self.root = tk.Tk()
self.root.title("视频或gif转WEBP工具") self.root.title("视频或gif转WEBP工具")
# 设置窗口大小和位置 # 设置窗口大小和位置
@ -54,6 +67,17 @@ class VideoToWebpConverter:
style.configure("TButton", padding=6) style.configure("TButton", padding=6)
style.configure("TLabelframe", background="#f0f0f0") style.configure("TLabelframe", background="#f0f0f0")
# 只在支持拖放时启用相关功能
if ENABLE_DND:
self.root.drop_target_register(DND_FILES)
self.root.dnd_bind("<<Drop>>", self.handle_drop)
# 添加拖放提示标签
self.drop_label = ttk.Label(
self.root, text="将视频文件拖放到此处", font=("", 12), foreground="gray"
)
self.drop_label.pack(pady=10)
# 设置UI # 设置UI
self.setup_ui() self.setup_ui()
@ -454,6 +478,26 @@ class VideoToWebpConverter:
def run(self): def run(self):
self.root.mainloop() self.root.mainloop()
def handle_drop(self, event):
"""处理文件拖放事件"""
files = self.root.tk.splitlist(event.data)
valid_extensions = (".mp4", ".avi", ".mov", ".mkv", ".webm", ".gif")
# 过滤出支持的文件格式
valid_files = [f for f in files if f.lower().endswith(valid_extensions)]
if valid_files:
# 清空现有列表
self.files_list.delete(0, tk.END)
# 添加新文件
for file in valid_files:
self.files_list.insert(tk.END, file)
else:
messagebox.showwarning(
"格式不支持",
"请拖放支持的视频格<EFBFBD><EFBFBD><EFBFBD>文件\n" + ", ".join(valid_extensions),
)
if __name__ == "__main__": if __name__ == "__main__":
try: try:

View File

@ -1,2 +1,3 @@
# 核心依赖 # 核心依赖
Pillow>=9.0.0 Pillow>=9.0.0
tkinterdnd2==0.3.0