Tunetti 🎵
A desktop YouTube Music player — search, play, and manage your music without opening a browser. 🖥️
🤖 A note about this project
This project is approximately 99% AI-generated code. It was created by prompting large language models — not by hand. The code works, but it may not follow every best practice you'd expect from hand-written software. Contributions, bug reports, and suggestions are very welcome! 🙏
✨ What can it do?
- 🎶 YouTube Music search & playback — Find songs, albums, and artists right from the app.
- 🎧 Play music in the background — Keep listening while you work.
- 🎨 Good-looking interface — Dark theme with a modern, clean design.
- 🎤 Discord Rich Presence — Show your friends what you're listening to.
- 📊 Play history & stats — See your most-played tracks, listening trends, and daily counts.
- ⭐ Favourites — Save songs you love and find them again instantly.
- 📈 Audio visualizer — A colorful spectrum display that moves with the music.
- ⏯️ Full playback controls — Play, pause, skip, seek, volume, loop, shuffle, and queue.
- ⚙️ Configurable — Toggle Discord RPC, visualizer, and more in settings.
- 💾 Lightweight — Streams audio on demand; no big music library to store.
📋 What you'll need
- Python 3.10 or newer
- Linux with PulseAudio or PipeWire for sound
- FFmpeg installed and on your
PATH
🚀 Getting started
# Download the code
git clone https://git.huitsinnevada.fi/NikkeDoy/Tunetti.git
cd Tunetti
# Set up a virtual environment
python -m venv .venv
source .venv/bin/activate
# Install everything
pip install -r requirements.txt
⚠️ You might also need system packages like
libegl1orlibxkbcommon0— your package manager will tell you what's missing.
▶️ Running Tunetti
# Normal mode
python main.py
# Debug mode (see what's happening under the hood)
TUNETTI_VERBOSE=1 python main.py
On first launch, Tunetti creates ~/.config/tunetti/ and sets everything up for you.
🔧 Environment variables
| Variable | What it does |
|---|---|
TUNETTI_VERBOSE |
Set to 1, true, or yes to see detailed debug logs. |
📁 How the code is organized
Tunetti/
├── main.py # App start & logging
├── gui.py # All the visual stuff (window, search bar, visualizer, stats, settings)
├── player.py # Audio playback, downloads, queue
├── config.py # Settings loader
├── music_db.py # History, favourites, stats database
├── discord_rpc.py # Discord integration
├── requirements.txt # List of Python packages needed
├── sonar-project.properties
└── .gitea/
└── workflows/
└── sonar.yaml # Automated code checks
⚙️ Settings
Tunetti stores its settings in ~/.config/tunetti/config.json. Here's what you can change:
| Setting | Default | What it does |
|---|---|---|
volume |
50 |
Playback volume (0–100) |
max_history |
5000 |
Max number of plays to remember |
discord_rpc_enabled |
true |
Show what you're listening to on Discord |
visualizer_enabled |
true |
Show the audio spectrum visualizer |
db_path |
~/.config/tunetti/music_history.db |
Where the database is stored |
📦 What's under the hood
| Package | What it's used for |
|---|---|
| yt-dlp | Downloads audio from YouTube |
| ytmusicapi | Searches YouTube Music |
| PySide6 | The graphical interface (Qt6) |
| pypresence | Discord Rich Presence |
🧪 Quality checks
Code quality is analyzed automatically by SonarQube whenever changes are pushed.
📄 License
See LICENSE.
