mirror of
https://github.com/woodchen-ink/video2webp.git
synced 2025-07-18 22:11:58 +08:00
Compare commits
1 Commits
main
...
v1.0.0-e73
Author | SHA1 | Date | |
---|---|---|---|
e73ac3a5c8 |
109
.github/workflows/release.yml
vendored
109
.github/workflows/release.yml
vendored
@ -6,7 +6,7 @@ on:
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: write # 添加这个权限声明
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
create-release:
|
||||
@ -16,13 +16,11 @@ jobs:
|
||||
version: ${{ steps.version.outputs.version }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Generate version number
|
||||
id: version
|
||||
run: |
|
||||
SHA_SHORT=$(git rev-parse --short HEAD)
|
||||
echo "version=1.0.0-${SHA_SHORT}" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Create Release
|
||||
id: create_release
|
||||
uses: softprops/action-gh-release@v1
|
||||
@ -39,7 +37,6 @@ jobs:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
@ -62,8 +59,7 @@ jobs:
|
||||
- name: Build with PyInstaller
|
||||
shell: cmd
|
||||
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
|
||||
uses: softprops/action-gh-release@v1
|
||||
@ -84,16 +80,7 @@ jobs:
|
||||
with:
|
||||
python-version: '3.11'
|
||||
|
||||
- name: Download 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()
|
||||
- name: Install FFmpeg
|
||||
run: |
|
||||
brew install ffmpeg
|
||||
mkdir -p ffmpeg
|
||||
@ -106,34 +93,75 @@ jobs:
|
||||
pip install -r requirements.txt
|
||||
pip install pyinstaller
|
||||
|
||||
# 创建启动器脚本
|
||||
- name: Create launcher script
|
||||
# 创建 macOS 专用的启动器
|
||||
- name: Create macOS launcher
|
||||
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 gui.py >> launcher.py
|
||||
cat > macos_launcher.py << EOL
|
||||
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
|
||||
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 \
|
||||
--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 DMG
|
||||
- name: Create App Bundle
|
||||
run: |
|
||||
cd dist
|
||||
mkdir -p video2webp.app/Contents/MacOS
|
||||
mkdir -p video2webp.app/Contents/Resources/ffmpeg
|
||||
mv video2webp video2webp.app/Contents/MacOS/
|
||||
cp ../ffmpeg/* video2webp.app/Contents/Resources/ffmpeg/
|
||||
mkdir -p "dist/Video2Webp.app/Contents/MacOS"
|
||||
mkdir -p "dist/Video2Webp.app/Contents/Resources"
|
||||
cp dist/video2webp "dist/Video2Webp.app/Contents/MacOS/"
|
||||
cp -r ffmpeg "dist/Video2Webp.app/Contents/Resources/"
|
||||
cp icons/logo800.icns "dist/Video2Webp.app/Contents/Resources/video2webp.icns"
|
||||
|
||||
# 创建 Info.plist
|
||||
cat > video2webp.app/Contents/Info.plist << EOL
|
||||
cat > "dist/Video2Webp.app/Contents/Info.plist" << EOL
|
||||
<?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">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>video2webp</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>video2webp.icns</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.example.video2webp</string>
|
||||
<string>com.video2webp.app</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>Video2Webp</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
@ -144,12 +172,29 @@ jobs:
|
||||
<string>10.10</string>
|
||||
<key>NSHighResolutionCapable</key>
|
||||
<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>
|
||||
</plist>
|
||||
EOL
|
||||
|
||||
# 创建 DMG
|
||||
hdiutil create -volname "Video2Webp" -srcfolder video2webp.app -ov -format UDZO video2webp.dmg
|
||||
- name: Create DMG
|
||||
run: |
|
||||
hdiutil create -volname "Video2Webp" -srcfolder "dist/Video2Webp.app" -ov -format UDZO "dist/Video2Webp.dmg"
|
||||
|
||||
- name: Upload Release Asset
|
||||
uses: softprops/action-gh-release@v1
|
||||
@ -157,4 +202,4 @@ jobs:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
tag_name: v${{ needs.create-release.outputs.version }}
|
||||
files: ./dist/video2webp.dmg
|
||||
files: ./dist/Video2Webp.dmg
|
||||
|
48
gui.py
48
gui.py
@ -8,6 +8,15 @@ import webbrowser
|
||||
from threading import Thread
|
||||
import traceback
|
||||
|
||||
# 修改 tkinterdnd2 的导入和初始化方式
|
||||
ENABLE_DND = False
|
||||
try:
|
||||
from tkinterdnd2 import TkinterDnD, DND_FILES
|
||||
|
||||
ENABLE_DND = True
|
||||
except ImportError:
|
||||
print("tkinterdnd2 导入失败,拖放功能将不可用")
|
||||
|
||||
# 设置 FFmpeg 路径
|
||||
if getattr(sys, "frozen", False):
|
||||
# 运行在 PyInstaller 打包后的环境
|
||||
@ -36,8 +45,12 @@ def get_subprocess_config():
|
||||
|
||||
class VideoToWebpConverter:
|
||||
def __init__(self):
|
||||
# 创建主窗口
|
||||
self.root = tk.Tk()
|
||||
# 创建主窗口,使用 TkinterDnD.Tk() 替代 tk.Tk()
|
||||
if ENABLE_DND:
|
||||
self.root = TkinterDnD.Tk()
|
||||
else:
|
||||
self.root = tk.Tk()
|
||||
|
||||
self.root.title("视频或gif转WEBP工具")
|
||||
|
||||
# 设置窗口大小和位置
|
||||
@ -54,6 +67,17 @@ class VideoToWebpConverter:
|
||||
style.configure("TButton", padding=6)
|
||||
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
|
||||
self.setup_ui()
|
||||
|
||||
@ -454,6 +478,26 @@ class VideoToWebpConverter:
|
||||
def run(self):
|
||||
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__":
|
||||
try:
|
||||
|
@ -1,2 +1,3 @@
|
||||
# 核心依赖
|
||||
Pillow>=9.0.0
|
||||
tkinterdnd2==0.3.0
|
||||
|
Loading…
x
Reference in New Issue
Block a user