TRAKKOUT is a modern, efficient desktop app for turning your music beats into full videos ready to publish on YouTube. It uses the official YouTube Data API v3 and local FFmpeg to process your audio and artwork, generating an optimized MP4 video you can upload straight to your favorite channel.
Beat/Audio + Artwork → FFmpeg → MP4 (1920x1080) → Select Channel → Upload to YouTube ✅
| Feature | Description |
|---|---|
| 🎵 Audio Processing | Supports MP3, WAV, Opus and AAC at 192kbps/48kHz quality |
| 🖼️ Smart Artwork | Auto-fit to 1920x1080 (crop or letterbox) + optional blurred background |
| 📺 YouTube Data API v3 | Secure OAuth authentication with automatic token refresh |
| ⏰ Publish Scheduling | Upload videos for future dates automatically (privacy: private by default) |
| 🎨 Custom Templates | {{variable}} syntax for dynamic title, description and tags |
| 📊 Real-Time Progress | GUI with progress bar that never freezes the main window |
| ⚡ Safe Cancellation | Correctly kills the child FFmpeg process on cancel |
| 💾 SQLite History | Stores every uploaded video for later reference |
- Operating System: Windows 10/11 (64-bit)
- Processor: Intel Core i5 or equivalent
- RAM: 8 GB minimum, 16 GB recommended
- Disk Space: ~1 GB free (app + libraries ≈ 800 MB) + audio/artwork file size
- Python: 3.11+ (with
Add to PATHenabled) - FFmpeg/FFprobe: installed locally or configurable via File > Settings
# Required Python packages (see requirements.txt)
PySide6>=6.6
requests>=2.31
google-auth>=2.23
google-auth-oauthlib>=1.1
google-api-python-client>=2.100
tzdata>=2024.1 # Windows only- Install Python 3.11+ from python.org/downloads (check "Add python.exe to PATH").
- Install FFmpeg:
winget install Gyan.FFmpeg(or set its path later in File > Settings). - Double-click
start.bat: it creates the environment, installs dependencies and launches the app. - Continue below with the one-time Google setup (required for uploads).
- Go to console.cloud.google.com and create a project (e.g.
trakkout) - APIs & Services > Library: find YouTube Data API v3 → press Enable
- OAuth consent screen:
- User type: External → Create
- App name:
TRAKKOUT, support email: your address - Scopes: add
.../auth/youtube.uploadand.../auth/youtube - Test users: add your Google account (while in "Testing")
- Credentials > OAuth client ID:
- Application type: Desktop app, name:
TRAKKOUT Desktop - Download JSON → save the file into
%APPDATA%\TRAKKOUT\(anyclient_secret*.jsonname works, no need to rename)
- Application type: Desktop app, name:
Without it you will see the clear error: "YouTube Data API v3 is not enabled…". Enable it in the Cloud Console and wait a few minutes.
If you prefer the terminal over start.bat:
cd C:\path\to\trakkout
python -m venv venv
venv\Scripts\Activate.ps1
pip install -r requirements.txt
python -m app.mainDouble-click start.bat (or run.bat if your venv is already set up).
-
Beat / Media: Press Browse on Audio and Artwork to pick your local files (or drag & drop them in)
audio: beat.mp3 + cover: cover.jpg ✅ -
Fill In Metadata: Complete the fields (Beat, Artist, Producer, Genre, BPM, Key, Purchase URL…)
-
Use Templates or write title/description/tags directly with
{{variable}}syntax -
Select Channel: Connect your Google account and pick the channel before uploading
-
Generate Video: Press Generate Video → review in Preview (title, description, length, resolution, channel, privacy)
-
Upload to YouTube: Confirm the dialog → resumable upload with progress, elapsed/remaining time and cancel
-
Verify: When done you will see video ID + URL + channel and a button to open it in the browser
trakkout/
├── app/
│ ├── main.py # Main entry point
│ ├── models/
│ │ └── models.py # Data models (BeatMetadata, etc.)
│ ├── services/
│ │ ├── video_generator.py # FFmpeg video generation
│ │ ├── queue_manager.py # Video processing queue
│ │ └── history_store.py # SQLite history
│ ├── templates/
│ │ ├── engine.py # {{variable}} template engine
│ │ ├── presets.py # Template preset manager
│ │ ├── tags.py # Tag parsing
│ │ └── compat.py # Legacy {variable} API
│ ├── ui/
│ │ ├── main_window.py # Main window shell (PySide6)
│ │ ├── mixins/ # MainWindow logic, split by domain
│ │ ├── workers.py # Background threads for progress
│ │ ├── dialogs.py # Settings / preview dialogs
│ │ ├── template_editor.py # Template editor dialog
│ │ └── sections.py # Sidebar + collapsible sections
│ ├── config/
│ │ └── settings.py # App configuration
│ ├── ffmpeg/
│ │ └── ffmpeg_service.py # FFmpeg service
│ ├── youtube/
│ │ ├── auth.py # OAuth authentication
│ │ ├── errors.py # API error handling
│ │ └── youtube_service.py # YouTube Data API v3
│ ├── providers/
│ │ ├── base.py # Abstract provider
│ │ └── local_provider.py # Local file provider
│ ├── utils/
│ │ ├── files.py # File utilities
│ │ ├── formatting.py # Metadata formatting
│ │ ├── logging_setup.py # Log configuration
│ │ ├── scheduling.py # Publish scheduling
│ │ ├── validators.py # Input validation
│ │ └── beat_names.py # Title/BPM/key filename detection
│ ├── resources/ # Static resources (presets, etc.)
│ ├── logs/ # Technical logs (app.log)
│ ├── client_secrets.json # OAuth credentials (editable)
│ └── run.bat # Quick-launch script
The minimalist icon was created with Pillow with the following details:
- Location:
trakkout\trakkout.ico(64x64 pixels, transparent PNG) - Design: Red circle (YouTube style) + white diagonal line (play/music) + yellow circle (minimalist detail)
- Colors: Red (#FF0000), Yellow (#FFC107), White
| Variable | Source | Example |
|---|---|---|
{{title}} |
Beat title field | [FREE] {{title}} |
{{artist}} |
Artist field | Artist: {{artist}} |
{{artist2}} |
Artist 2 field | x {{artist2}} |
{{producer}} |
Producer field | Prod: {{producer}} |
{{genre}} |
Genre field | Genre: {{genre}} |
{{bpm}} |
BPM field | BPM: {{bpm}} |
{{key}} |
Key field | Key: {{key}} |
{{purchase_url}} |
Purchase URL field | 📥 Purchase Link: {{purchase_url}} |
{{tags}} |
Tags (comma-joined) | Tags: {{tags}} |
{{channel}} |
Selected YouTube channel | Channel: {{channel}} |
{{date}} |
Current date | Date: {{date}} |
Bundled template example:
Title: [FREE] {{title}}
Description:
FREE FOR NON PROFIT ONLY
📥 Purchase Link: {{purchase_url}}
🎚️ BPM: {{bpm}}
🎵 Key: {{key}}
👤 IG: @producer
In the YouTube Metadata section enable "Publish later", pick date/time and timezone (e.g. Europe/Madrid). The app converts to UTC RFC 3339 and sends status.publishAt in videos.insert.
- ✅ The date must be in the future
- ✅ Privacy is forced to private when scheduling (the app does it automatically)
- ✅ The video shows as private/scheduled until the chosen date
- ✅ The queue shows the scheduled time per item and history marks it
Scheduled
| Symptom | Likely Cause / Fix |
|---|---|
FFmpeg not found |
Install FFmpeg (Installation, step 2) or set the path in File > Settings |
duration = 0 / corrupt file |
Audio/image are damaged; try another file |
| OAuth won't open / cancelled | Check your client_secret*.json is in %APPDATA%\TRAKKOUT\; accept permissions in the browser |
| API not enabled | Enable YouTube Data API v3 in Cloud Console |
quotaExceeded |
Daily quota exhausted; wait or request more quota |
| Interrupted upload / offline | Retry; uploads resume in 8 MB chunks |
| Wrong channel | Re-authenticate picking the right Brand Account (Installation, step 3) |
| Out of space | Free disk space; the app estimates ~1.5 MB/s + 20 MB margin |
expired token |
The app refreshes automatically; if it fails, reconnect |
Technical logs: logs/app.log (tokens are redacted automatically)
SQLite history: %APPDATA%\TRAKKOUT\history.db (History tab)
Settings: %APPDATA%\TRAKKOUT\settings.json (no secrets)
To improve the project, you can:
- Open a Pull Request with new features or fixes
- Report bugs in the Issues tab (if GitHub is set up)
- Add template variables using
TemplateEngine.register_variable(...)
pip install -r requirements-dev.txt
python -m pytest tests -qThe suite covers pure logic (no GUI, network or FFmpeg needed): utils, models, templates, settings, SQLite stores, YouTube error mapping and OAuth config validation.
Copyright © 2026 - TRAKKOUT
Distributed under the MIT license for personal and commercial use.
Made with ❤️ using Python + PySide6 + FFmpeg + YouTube Data API v3