From 6b9042bee13f5044d29be0c4a9d21186824b5a84 Mon Sep 17 00:00:00 2001 From: stirelshka8 Date: Sun, 15 Mar 2026 18:53:28 +0300 Subject: [PATCH] EXE --- .idea/AnimeVideoEditot.iml | 2 +- .idea/material_theme_project_new.xml | 9 ++++++++- .idea/misc.xml | 2 +- README.md | 21 ++++++++++++++++++++- asets/icon.png | Bin 0 -> 37111 bytes build_exe.ps1 | 27 +++++++++++++++++++++++++++ core/video_processor.py | 11 ++++++++++- gui/main_window.py | 12 ++++++++++++ pyi_hooks/hook-moviepy.py | 5 +++++ requirements-build.txt | 2 ++ requirements.txt | 3 +-- 11 files changed, 87 insertions(+), 7 deletions(-) create mode 100644 asets/icon.png create mode 100644 build_exe.ps1 create mode 100644 pyi_hooks/hook-moviepy.py create mode 100644 requirements-build.txt diff --git a/.idea/AnimeVideoEditot.iml b/.idea/AnimeVideoEditot.iml index 8746ecd..5e38f9c 100644 --- a/.idea/AnimeVideoEditot.iml +++ b/.idea/AnimeVideoEditot.iml @@ -4,7 +4,7 @@ - + diff --git a/.idea/material_theme_project_new.xml b/.idea/material_theme_project_new.xml index ec7f734..1f861cc 100644 --- a/.idea/material_theme_project_new.xml +++ b/.idea/material_theme_project_new.xml @@ -3,8 +3,15 @@ + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 24f69a0..c0e76d1 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,5 +3,5 @@ - + \ No newline at end of file diff --git a/README.md b/README.md index 0de00b1..617a4d4 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,22 @@ # Anime Video Editor -Приложение для объединения нескольких видео в один файл. Поддерживает выбор временных диапазонов для каждого ролика, настройку формата (MP4, AVI, MOV, MKV) и качества экспорта. \ No newline at end of file +Приложение для объединения нескольких видео в один файл. Поддерживает выбор временных диапазонов для каждого ролика, настройку формата (MP4, AVI, MOV, MKV) и качества экспорта. + +## Сборка в exe (Windows) + +1. Установите зависимости проекта и сборки (обязательно в том же окружении, где будете запускать PyInstaller): + ```bash + pip install -r requirements.txt + pip install -r requirements-build.txt + ``` +2. Соберите exe: + ```bash + pyinstaller --noconfirm AnimeVideoEditor.spec + ``` + или запустите скрипт: + ```powershell + .\build_exe.ps1 + ``` +3. Готовый файл: `dist\AnimeVideoEditor.exe` (один файл, консоль не показывается). + +FFmpeg включается в сборку автоматически (через imageio_ffmpeg). \ No newline at end of file diff --git a/asets/icon.png b/asets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3ee95f8d509d1151a04a66b3b3dfc2f775f0d2a2 GIT binary patch literal 37111 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 NO)py+R~UNS{~s*fWu*WB literal 0 HcmV?d00001 diff --git a/build_exe.ps1 b/build_exe.ps1 new file mode 100644 index 0000000..c5adbc7 --- /dev/null +++ b/build_exe.ps1 @@ -0,0 +1,27 @@ +# Build Anime Video Editor to exe (Windows) +# Run: .\build_exe.ps1 + +$ErrorActionPreference = "Stop" +Set-Location $PSScriptRoot + +Write-Host "Checking project dependencies..." -ForegroundColor Cyan +pip install -r requirements.txt -q +if (-not $?) { exit 1 } +Write-Host "Checking PyInstaller..." -ForegroundColor Cyan +pip show pyinstaller 2>$null | Out-Null +if ($LASTEXITCODE -ne 0) { + Write-Host "Installing PyInstaller..." -ForegroundColor Yellow + pip install pyinstaller +} + +Write-Host "Building exe..." -ForegroundColor Cyan +pyinstaller --noconfirm AnimeVideoEditor.spec + +if (Test-Path "dist\AnimeVideoEditor.exe") { + Write-Host "" + Write-Host "Done: dist\AnimeVideoEditor.exe" -ForegroundColor Green +} else { + Write-Host "" + Write-Host "Build failed. Check output above." -ForegroundColor Red + exit 1 +} diff --git a/core/video_processor.py b/core/video_processor.py index 2c96501..ceab7c9 100644 --- a/core/video_processor.py +++ b/core/video_processor.py @@ -1,7 +1,9 @@ import os import subprocess +import sys import tempfile import warnings +import glob from moviepy import VideoFileClip, concatenate_videoclips from moviepy.video.fx import Resize from datetime import datetime @@ -53,7 +55,14 @@ warnings.filterwarnings( def _get_ffmpeg_exe(): - """Путь к FFmpeg (тот же, что использует MoviePy/imageio).""" + """Путь к FFmpeg (тот же, что использует MoviePy/imageio). В exe (PyInstaller) — из папки сборки.""" + if getattr(sys, "frozen", False) and getattr(sys, "_MEIPASS", None): + base = sys._MEIPASS + for folder in ("imageio_ffmpeg", "."): + search = os.path.join(base, folder, "*.exe") + for path in glob.glob(search): + if "ffmpeg" in os.path.basename(path).lower(): + return path try: import imageio_ffmpeg return imageio_ffmpeg.get_ffmpeg_exe() diff --git a/gui/main_window.py b/gui/main_window.py index 8d4df7e..4db3130 100644 --- a/gui/main_window.py +++ b/gui/main_window.py @@ -12,6 +12,12 @@ import sys import subprocess +def _icon_path(): + if getattr(sys, "frozen", False) and getattr(sys, "_MEIPASS", None): + return os.path.join(sys._MEIPASS, "asets", "icon.png") + return os.path.join(os.path.dirname(os.path.dirname(__file__)), "asets", "icon.png") + + class MainWindow: def __init__(self, root): self.root = root @@ -19,6 +25,12 @@ class MainWindow: self.root.geometry("1000x780") self.root.minsize(800, 600) self.root.configure(bg=COLORS["bg"]) + try: + _path = _icon_path() + if os.path.isfile(_path): + self.root.iconphoto(True, tk.PhotoImage(file=_path)) + except Exception: + pass setup_theme(root) self.video_items = [] diff --git a/pyi_hooks/hook-moviepy.py b/pyi_hooks/hook-moviepy.py new file mode 100644 index 0000000..e8dac22 --- /dev/null +++ b/pyi_hooks/hook-moviepy.py @@ -0,0 +1,5 @@ +# PyInstaller hook: force moviepy into the bundle +from PyInstaller.utils.hooks import collect_all, collect_submodules + +datas, binaries, hiddenimports = collect_all("moviepy") +hiddenimports += list(collect_submodules("moviepy")) diff --git a/requirements-build.txt b/requirements-build.txt new file mode 100644 index 0000000..a3636c8 --- /dev/null +++ b/requirements-build.txt @@ -0,0 +1,2 @@ +# Для сборки exe (установить: pip install -r requirements-build.txt) +pyinstaller>=6.0.0 diff --git a/requirements.txt b/requirements.txt index de870a8..3160637 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,3 @@ -# Видеоредактор — зависимости (Windows и Linux) -# Используются версии с готовыми wheel-пакетами для обеих платформ. +# Anime Video Editor - dependencies (Windows and Linux) moviepy>=1.0.3 Pillow>=10.1.0