A lightweight background music & video player with a floating mini player.
Plays local files and streams YouTube playlists — always on top, always in reach.
| 🎵 Local playback | MP3, FLAC, WAV, OGG, AAC, M4A, OPUS, WMA, AIFF, APE + MP4, MKV, AVI, MOV, WEBM… |
| 📺 YouTube streaming | Import any YouTube playlist via yt-dlp, stream without downloading |
| ⬇️ Download | Save playlist as MP3 or MP4 with embedded thumbnail & metadata |
| 🪟 Floating Mini Player | Always-on-top overlay, drag anywhere on screen |
| 🔔 System Tray | Play / Pause / Skip without opening any window |
| 🔀 Shuffle & Repeat | None / One / All modes |
| 💾 Auto-save playlist | Playlist is restored automatically on next launch |
| 📋 Download Manager | Track download progress, speed, ETA — cancel anytime |
VIBLI runs entirely in the system tray — no window pops up on launch.
| Action | Result |
|---|---|
| Click tray icon | Toggle Mini Player overlay |
| Double-click tray icon | Open playlist window |
| Right-click tray icon | Quick controls menu |
- Open the playlist window (double-click tray icon)
- Click Add Folder — VIBLI scans all supported audio/video files recursively
- Double-click any track to start playing
- Click Import YouTube in the playlist window
- Paste a YouTube playlist URL
- Click Import Playlist — tracks appear as they load
- Click Import YouTube, paste a URL
- Choose ⬇ Download MP3 or ⬇ Download MP4
- Select an output folder — the Download Manager shows live progress
| OS | Windows 10 / 11 (64-bit) |
| Runtime | Included in the release package (Qt DLLs, yt-dlp 2026.02.04, ffmpeg 8.0.1) |
| Codecs | For MKV / FLAC / OPUS: install LAV Filters or K-Lite Codec Pack |
No installation required. Just unzip the release and run
VIBLI.exe.
🛠️ Developer Guide
Download from https://www.qt.io/download-qt-installer and install:
| Component | Required |
|---|---|
| Qt 6.x → MinGW 64-bit | ✅ |
| Qt 6.x → Qt Multimedia + MultimediaWidgets | ✅ |
| Developer Tools → MinGW 13.x 64-bit | ✅ |
| Developer Tools → CMake + Ninja | ✅ |
This project targets Qt 6.11.0 installed at
D:\data\qt.
If your Qt is elsewhere, updateCMAKE_PREFIX_PATHinCMakePresets.json.
# Add tools to PATH
$env:PATH = "D:\data\qt\Tools\mingw1310_64\bin;D:\data\qt\Tools\Ninja;D:\data\qt\Tools\CMake_64\bin;$env:PATH"
# Configure + Build
cmake --preset default
cmake --build build --parallelRun:
$env:PATH = "D:\data\qt\6.11.0\mingw_64\bin;D:\data\qt\Tools\mingw1310_64\bin;$env:PATH"
.\build\VIBLI.exepowershell -ExecutionPolicy Bypass -File tools\Release.ps1Output:
deploy\VIBLI.exe— portable, ready to zip and shipdist\VIBLI_Setup_x.y.z.exe— installer (requires Inno Setup 6)
Options:
-SkipBuild # Repackage only, skip rebuild
-SkipInstaller # Skip installer creation
-Version "2.0.0" # Override version stringEdit one line in CMakeLists.txt:
project(VIBLI VERSION 1.2.0 LANGUAGES CXX)CMake propagates the version to the binary, installer, and output filenames automatically.
src/
├── main.cpp # App entry, coordinator wiring
├── core/
│ ├── AudioPlayer # Qt Multimedia playback engine
│ ├── PlaylistManager # Track list, shuffle / repeat logic
│ ├── YtDlpService # yt-dlp process wrapper, stream URL resolver, downloader
│ ├── PlaylistImporter # YouTube playlist import pipeline
│ ├── MediaCache # Disk cache: thumbnails + stream URLs (6h TTL)
│ ├── ThumbnailCache # In-memory LRU thumbnail cache (max 30 images)
│ ├── PlaylistPersistence # Save / restore playlist as JSON
│ └── LogService # Structured logging with dedup
├── ui/
│ ├── MiniPlayer # Floating overlay player
│ ├── MainWindow # Playlist window
│ ├── DownloadManagerDialog # Download progress UI
│ ├── PlaylistImportDialog # YouTube URL input dialog
│ ├── PlaylistModel # QAbstractListModel for the playlist view
│ ├── PlaylistDelegate # Custom item renderer
│ ├── LogViewerDialog # In-app log viewer
│ └── LoadingOverlay # Spinner overlay during import
└── tray/
└── TrayManager # System tray icon & context menu
- No window on startup — the app lives in the system tray; windows are shown on demand.
- YouTube coordinator lives in
main.cpp: listens tocurrentTrackChanged→ callsresolveStreamUrl→ feeds the URL toAudioPlayer. Retry logic (up to 2 attempts) and format fallback (m4a → webm → best) are handled here. - Two-layer cache: in-memory
QMapfor instant hits +MediaCacheon disk for cross-session persistence. - Download pipeline:
YtDlpService::downloadMedia()runs yt-dlp with--embed-thumbnail --embed-metadata, parses stdout line-by-line for progress/speed/ETA/phase transitions (downloading → converting → embedding).
