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:
|
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,7 +37,6 @@ 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:
|
||||||
@ -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 \
|
||||||
|
--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: |
|
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,12 +172,29 @@ 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
|
||||||
@ -157,4 +202,4 @@ jobs:
|
|||||||
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
|
||||||
|
46
gui.py
46
gui.py
@ -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()
|
||||||
|
if ENABLE_DND:
|
||||||
|
self.root = TkinterDnD.Tk()
|
||||||
|
else:
|
||||||
self.root = tk.Tk()
|
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:
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
# 核心依赖
|
# 核心依赖
|
||||||
Pillow>=9.0.0
|
Pillow>=9.0.0
|
||||||
|
tkinterdnd2==0.3.0
|
||||||
|
Loading…
x
Reference in New Issue
Block a user