Kullanici "a-b karisimi" secti. A'nin daraltilabilir rayi (v1.4.0) + B'nin merkez
now-playing hero'su. Tasarim 8-ajanli judge-panel workflow'uyla secildi ("Center
Stage" — #view icine showView('now')), spec canliya birebir kuruldu.
- Yeni showView('now') -> renderNowHero(): buyuk kapak (kapak-accent blur backdrop) +
baslik/eyebrow + genis scrubber + iri transport + tek satir canli soz; #view icinde
in-flow (sabit overlay DEGIL), rail + alt player bar + sag panel ile birlikte yasar
- Tek motor saati: hero scrubber'i + alt bar ayni updateSeek/updatePlayBtn'den beslenir
(seeking guard'li, view==='now' ile kapaliyken sifir maliyet). Ayri ID'ler, catisma yok
- Giris: alt bardaki #pHeroBtn (💿) / mini kapak / .p-meta tik / komut paleti; buyuk kapak
+ expand -> openFullscreen theater (mini->merkez->tam ekran zoom merdiveni)
- Mevcut makineyi yeniden kullanir (--np-cover backdrop, applyCoverAccent, .bar geometri,
parseLRC memoize, viewIn); prefers-reduced-motion + feature-test'li view-transition kapak
morph'u; TR/EN i18n. Tumuyle opt-in/geri-alinabilir
- Harness: 14 spec kontrolu + 0 JS hatasi (motor aynasi, drag guard, bos durum,
vt-name cakismasi yok, i18n, geri-alinabilirlik)
🎵 Just Music Premium
Windows için profesyonel müzik çalar — Spotify tarzı QtWebEngine arayüzü + yerli DSP ses motoru (gerçek zamanlı EQ & efektler) + gömülü yt-dlp/ffmpeg + htdemucs stüdyo karaoke + crossfade/gapless + Discord Rich Presence.
📸 Ekran Görüntüleri
Klip modu — ekranı kaplamaz, ana alana gömülür; zaman kodlu sözler klibin üstünde senkron akar:
Kalıcı mini oynatıcı — sekme değiştirince klip köşeye iner ve çalmaya devam eder (akış kesilmez):
⬇ İndir & Kur (Windows)
⬇ JustMusic-Setup.msi indir · Tüm sürümler · 🌐 Tanıtım sayfası
.msikullanıcı bazlı kurar (yönetici/UAC gerekmez); Başlat menüsü + masaüstü kısayolu ekler.- Otomatik güncelleme: uygulama açılışta GitHub'da yeni sürüm arar; varsa
.msi'yi arka planda sessizce indirir ve kapanışta kurup yeniden başlatır (istersen "Şimdi yeniden başlat" ile hemen). .msiGitHub Actions'ta bulutta derlenir (bkz..github/workflows/build.yml):v*etiketi push edilince ffmpeg/yt-dlp/deno indirilir, PyInstaller derler, WiX ile.msipaketlenir ve Release'e yüklenir.
🆕 v1.5.0 — merkez "Şimdi Çalıyor" (A+B karışımı)
- 🎧 Merkez now-playing hero (Apple Music tarzı): çalan parça ana alanda büyük görünür — dev kapak solda (kapak-renginden blur backdrop), sağda başlık + geniş scrubber + iri transport + tek satır canlı söz. Alt player bar'daki 💿 düğmesi (ya da mini kapağa/parça adına tıkla, ya da komut paleti) ile açılır.
- Tek motor saati: merkez hero'nun scrubber'ı ve alt bar aynı DSP saatinden beslenir — sapma yok; büyük kapağa/expand'a tıkla → theater (mini → merkez → tam ekran zoom merdiveni).
- Tümüyle opt-in ve geri alınabilir: A'nın daraltılabilir rayı (v1.4.0) + bu B hero'su = A+B karışımı.
prefers-reduced-motionsaygılı, View-Transition kapak morph'u özellik-testli.
🆕 v1.4.0 — daraltılabilir kabuk
- 📐 Daraltılabilir kenar çubuğu: üst bardaki ☰ ile kenar çubuğu tam (300px) ↔ ikon rayı (64px) arasında geçer — içeriğe daha çok yer. Daralınca nav ikonları ve çalma listesi kapakları kalır, üzerine gelince isimleri ipucu (tooltip) olarak görünür. Durum kaydedilir; kısayol B, komut paletinde de var.
- 🪟 Kayan "Şimdi Çalıyor": sağ panel çağrılınca yumuşak kayarak gelir (Apple Music tarzı çekmece),
prefers-reduced-motionsaygılı.
🆕 v1.3.0 — kesintisiz geçiş + Discord
- 🎚 Crossfade + boşluksuz (gapless) çalma: parçalar arasında eş-güçlü geçiş (0–12 sn) ya da sınırda boşluksuz devam. Sıradaki parça önden çözülür → geçişte tek saniye boşluk/tıkırtı kalmaz. Albüm, canlı kayıt ve DJ setleri için. Varsayılan kapalı; sıralı çalmada devreye girer.
- 🎮 Discord Rich Presence: çalan parça + oynat/duraklat durumu Discord profilinde görünür (opsiyonel). Ayarlardaki alana kendi Discord Application ID'ni gir, toggle'ı aç (Discord açık olmalı).
- Kontroller Efektler → "Geçiş & Discord" kartında (crossfade kaydırıcısı, gapless düğmesi, Discord). TR/EN.
🆕 v1.2.1 — theater modu
- 🎭 Theater modu: tam ekran "Şimdi Çalıyor"da kapak solda, zaman kodlu sözler sağda yan yana; çalarken aktif satır vurgulanır (Apple Music tarzı sürükleyici görünüm).
🆕 v1.2.0 — modern görünüm
- 🫧 Cam arayüz (glassmorphism): menüler, komut paleti, bildirimler, mini-oynatıcı ve alt player bar buzlu cam; arkasındaki içerik yumuşak blur'lü görünür.
- 🎨 Kapak-renginden adaptif tema: çalan parçanın kapak rengi tüm arayüze (accent, görselleştirici, butonlar) yansır — okunabilir aralığa clamp'lenir; özel renk seçilince kapanır.
- 🖼 "Şimdi Çalıyor" hero: sağ panel ve tam ekranda blurlu kapak arka planı (Apple Music tarzı immersive).
- 🎤 Dinamik söz adası: yüzen cam söz penceresi — Enhanced-LRC ile kelime kelime (karaoke) vurgulanır,
sürüklenebilir.
Ituşu veya komut paletinden aç. - ✨ Hareket: kart/parça giriş animasyonu (kademeli), buton "spring" tepkileri.
🆕 v1.1.0
- 🌍 Dil desteği (TR + EN) — üst bardaki dil seçicisinden anında geçiş; seçim kaydedilir. İç veri (mood, korumalı liste adları) Türkçe kalır, yalnız arayüz çevrilir — kütüphanen bozulmaz.
🆕 v1.0.4
- 📃 Playlist toplu indirme — YouTube playlist URL'si → önizle, seç, X/Y sayaçlı toplu indir.
- ⬅➡ Geri / İleri gezinme — üst bardaki oklar artık görünüm geçmişinde dolaşıyor.
- Düzeltmeler: komut paletinden karaoke menüsü artık kapanmıyor; arama/akıllı-liste görünümünde yanlışlıkla sürükle-sırala kaldırıldı; indirme/ayırma bildirimleri üst üste binmiyor.
- Bakım: yt-dlp güncellendi (YouTube tarafı değişince indirmedeki HTTP 403 düzeldi).
📚 Geliştirici Belgeleri
docs/ altında — projeyi hızlı kavramak için:
Mimari · Köprü Sinyalleri ·
Bilinen Sorunlar · Geliştirici Rehberi + TR→EN sözlük.
Kod grafiği: graphify-out/ (graphify query "...").
🏗 Mimari
- Arayüz: HTML/CSS/JS (
justmusic/web/),QWebEngineViewiçinde render edilir → gerçek Spotify seviyesi görsel (gradyan başlıklar, kartlar, animasyonlar). - Ses & tüm mantık: yerli Python (
engine.pyDSP motoru,library.py,downloader.py,covers.py,naming.py). Arayüz ↔ Python QWebChannel köprüsüyle konuşur (bridge.py). - Sunucu / port YOK: her şey in-process. Varlıklar ve kapaklar özel
app://şemasıyla servis edilir (scheme.py). Eski pywebview sürümündeki port çakışması / sonsuz kilitlenme burada imkânsız.
✨ Özellikler
- Spotify düzeni: üstte arama, solda kütüphane (kapaklı çalma listeleri), ortada gradyanlı liste görünümü + sütunlu şarkı tablosu, sağda "çalınıyor" paneli, altta player bar, ana sayfa kartları, şarkı sözleri görünümü.
- Gerçek DSP ses motoru (numpy/scipy + sounddevice): 30 EQ preset + 10 bant özel EQ + 🤖 Oto EQ + efekt paneli (Preamp, Bass Boost, Echo, Reverb, 8D Spatial) — çalarken anında. Gerçek FFT görselleştirici.
- yt-dlp Python kütüphanesi + gömülü
ffmpeg.exe/deno.exe: kurulum gerekmez. Ara → 20 sonucu kapaklarıyla gör → satıra tıkla, anında insin (tek tık = tek indirme); dilersen checkbox ile seçip toplu indir; ya da bağlantı yapıştır → direkt mp3. - 📃 Playlist toplu indirme: YouTube playlist URL'si yapıştır → tüm parçalar kapaklarıyla önizlenir, seç ve indir; ilerleme X/Y sayacıyla gösterilir, hepsi "İndirilenler" listesine düşer. (v1.0.4)
- 🎤 Stüdyo karaoke (htdemucs / Demucs, YALNIZCA CPU): şarkıyı gerçekten
vokal + enstrüman olarak ayırır. Player'daki mikrofon düğmesi bir menü açar:
Enstrümantal (karaoke), Akapella (sadece vokal), ⚡ Hızlı karaoke
(anında mid-side, motor gerektirmez) ve Kapat. Ayrılan stem'ler
~/Music/JustMusic/stems/altında önbelleğe alınır → aynı şarkı bir daha ayrılmaz (anında geçiş). CPU'da ilk ayırma şarkı başına ~4-5 dk sürer, ilerleme gösterilir; geçiş çaldığın saniyeyi koruyarak yapılır. - Akıllı isim & kapak: dağınık MP3 adları temizlenip "Sanatçı - Başlık"a ayrıştırılır, bu temiz adla YouTube kapağı çekilir. "🖼 İsim & Kapak" ile toplu senkron.
- Otomatik kütüphane:
~/Musictaranır, her alt klasör bir çalma listesi. - Kuyruk (Sıradaki): sıraya ekle / sıradaki çal, kuyruk sayfası.
- Tam ekran "Şimdi Çalıyor": kapak renginden gradyan + canlı görselleştirici.
- İstatistik sayfası: toplam parça/liste/süre + en çok dinlenenler (grafik).
- Genel arama: kütüphanede anında arar (şarkı+liste), Enter → YouTube indirme.
- Kapak mozaiği (2×2), özel vurgu rengi seçici, gerçek şarkı süreleri (ffmpeg ile), indirme göstergesi, sürükle-bırak ile listeye ekleme, klavye kısayolları penceresi, alt bar mini görselleştirici.
- 🎚 Crossfade + boşluksuz (gapless) geçiş: sıradaki parça önden çözülür; eş-güçlü eritme (0–12 sn) veya sınırda boşluksuz devam. (v1.3.0)
- 🎮 Discord Rich Presence: çalan parçayı Discord profilinde göster (opsiyonel, Client ID ile). (v1.3.0)
- 🎭 Theater modu: tam ekranda kapak + senkron sözler yan yana, aktif satır vurgulu. (v1.2.1)
- Premium tipografi: gömülü Sora (başlıklar) + Manrope (gövde) fontları.
🚀 Çağ açıcı (bize özel DSP) özellikler
- 🎙 Karaoke / Vokal Azaltma: gerçek zamanlı merkez-kanal iptaliyle vokali kısar.
- 🌈 Ruh Hali Motoru: sesin enerji + parlaklığını analiz edip parçanın "ruh halini" (Enerjik/Sakin/Güçlü…) bulur, isteğe bağlı arayüz rengini ona uydurur.
- 🌊 Şarkı DNA'sı: parçanın tüm dalga formu (SoundCloud tarzı) — tıklayarak seek.
- 🔁 A-B Döngü / Pratik Modu: iki nokta arasında döngü (öğrenmek/çalışmak için).
- 💡 Ambiyans Işığı: pencere kenarları müziğin rengi + bası ile titreşir.
- 🌊 Odak Sesleri: DSP ile üretilen yağmur / beyaz / kahverengi gürültü (müzikle veya tek başına — odak/uyku için).
- 🎬 Klip Modu (akış — indirme yok): alt bardaki film tuşu, çalan parçanın
klibini yt-dlp ile çözüp internetten oynatır (
playVideo→VideoStreamThread). Ekranı kaplamaz: Spotify gibi ana alana gömülür, kenar çubuğu + alt bar durur ve alt bar klibi sürer (oynat/duraklat, seek, ses). "Sese geç" ile müziğe dönülür — müzik varsayılan dinleme biçimidir. Zaman kodlu sözler varsa klibin üstünde senkron akar. YouTube'dan inen parçalarda kayıt birebir aynı olduğu için konum iki yönde devredilir (müziğin 40. sn'si → klip 40. sn'den).- Kalıcı mini oynatıcı: klip açıkken sekme/menü değiştirmek akışı KESMEZ — video, YouTube/Spotify gibi köşedeki bir mini oynatıcıya iner ve çalmaya devam eder; film tuşuna basınca yeniden büyür. Video/ses elementleri bir kez kurulup DOM'da yalnızca taşınır (yeniden yaratılmaz), böylece yt-dlp'yi her seferinde tekrar beklemek gerekmez.
- Not: QtWebEngine H.264/AAC oynatamaz ve YouTube muxed webm vermez → VP9 video + Opus ses ayrı akış olarak gelir ve arayüzde senkron tutulur.
Ayrıca: 3 durumlu tekrar, liste sıralama, kompakt mod, dosya konumunu aç,
kalp animasyonu ve daha fazlası. Ses işleme tamamen yerli DspEngine'de.
🎤 Otomatik şarkı sözleri (Lyrica API)
- Bir parça çalınca sözü yoksa otomatik olarak
Lyrica servisinden çekilir
(
/lyrics/?artist=…&song=…×tamps=true&fast=true). - Sözler zaman kodlu (LRC) gelir → satırlar çalarken senkron vurgulanır,
satıra tıklayınca o ana atlar. Sanatçı bilgisi yoksa önce
/suggestionile bulunur. - Sağ paneldeki "Getir" butonuyla elle de çekilebilir; kaynak (lrclib, Genius, Musixmatch…) bildirilir. Sözler kütüphaneye kaydedilir.
🧬 Daha da radikal (analiz + üretim)
- BPM/tempo tespiti, ses eşitleme (loudness normalize), spektrogram, zaman kodlu (LRC) şarkı sözleri senkronu, Komut Paleti (Ctrl+K), Ruh Hali Radyosu, reverb ortam presetleri (Oda/Salon/Katedral…), parça kırpma & dışa aktarma (A-B ile), akıllı çalma listeleri.
- Ayrıca: liste içi sürükle-sırala, özel liste kapağı, M3U dışa aktar, tekrarları kaldır, tümünü kuyruğa ekle, 12 tema, sıradaki önizleme.
🔧 İndirme mimarisi (ve düzeltmesi)
- Arama/indirme yt-dlp'nin PYTHON kütüphanesiyle yapılır (exe değil):
gerçek ilerleme kancaları, dönüşüm sonrası kesin dosya yolu
(
requested_downloads[].filepath) ve anlaşılır hatalar. - Modern yt-dlp, YouTube
nsigkorumasını çözmek için bir JS çalışma zamanı ister → Deno (bin/deno.exe) gömüldü;config.pybin/'i sürecin PATH'ine ekler, kütüphane Deno'yu otomatik bulur. - Sonuç: "sonuç bulunamadı / indirme başarısız" giderildi (gerçek müzik videosu indirmesiyle doğrulandı).
🎨 İkonlar
Emoji tuşlar FontAwesome (gömülü) ile değiştirildi — renk ve arka plan tema ile kontrol edilebilir.
- Sürükle-bırak, favoriler, künye düzenleme, listeler arası kopyalama, hız (0.5x–2x), ses boost (100+), uyku zamanlayıcı, 6 tema, JSON yedek.
- Klavye:
Boşluk·←/→10 sn ·↑/↓ses ·Skarışık ·Ltekrar ·N/P.
Veriler ~/Music/JustMusic/ altında (library.json, downloads/, covers/).
🛠 Kullanılan Araçlar
| Katman | Araç | Neden |
|---|---|---|
| Arayüz kabuğu | PyQt6 + PyQt6-WebEngine (QWebEngineView, QWebChannel) |
Chromium tabanlı web arayüzü + JS↔Python köprüsü, sunucusuz |
| Web arayüzü | Saf HTML/CSS/JS (framework yok) | Spotify seviyesi görsel, tam kontrol |
| Ses motoru | NumPy · SciPy (sosfilt, lfilter) · sounddevice |
Gerçek zamanlı DSP: EQ, efektler, karaoke, FFT — QMediaPlayer'ın yapamadığı |
| İndirme | yt-dlp (Python kütüphanesi) | İlerleme kancaları + kesin dosya yolu + anlaşılır hata |
| Kod çözme / MP3 | FFmpeg (gömülü ffmpeg.exe) |
Her biçimi f32 PCM'e çöz, mp3 dönüştür |
| JS çalışma zamanı | Deno (gömülü deno.exe) |
YouTube nsig korumasını çözmek için şart |
| Şarkı sözleri | Lyrica API | Zaman kodlu (LRC) senkron sözler |
| İkonlar | Font Awesome Free (gömülü, çevrimdışı) | SVG ikon — rengi/arka planı tema ile değişir |
| Tipografi | Sora + Manrope (gömülü) | Başlık + gövde fontları (latin-ext = Türkçe) |
| Paketleme | PyInstaller | Tek dist\JustMusic\ klasörü (WebEngine + bin + web gömülü) |
| Logo | OpenRouter → Google Nano Banana Pro (Gemini Image) | logo.png + logo.ico üretimi |
Ses tarayıcıda değil, tamamen yerli
DspEngine'de (sounddevice) çalınır; QtWebEngine yalnızca görseldir. Böylece EQ/efekt kalitesi ve "sunucu yok" garantisi korunur.
🧩 Kurulum & Çalıştırma
setup.bat REM .venv + bağımlılıklar (PyQt6, PyQt6-WebEngine, numpy, scipy, sounddevice, yt-dlp)
run.bat REM çalıştır
build.bat REM dist\JustMusic\JustMusic.exe üret (~880 MB; WebEngine+ffmpeg gömülü)
Gömülü ikili araçlar depoda yok (GitHub 100 MB/dosya sınırı). Çalıştırmadan önce
bin/klasörüne şunları koyun:ffmpeg.exe(indir),yt-dlp.exe(indir),deno.exe(indir). (yt-dlp Python kütüphane olarak darequirements.txtüzerinden kurulur;bin/'deki exe yalnızca yedektir.ffmpegvedenozorunludur.)
📁 Yapı
main.py # QtWebEngine giriş noktası (şema + köprü + pencere)
justmusic/
bridge.py # JS↔Python köprüsü (KONTROLÖR): ses, kütüphane, indirme, EQ
scheme.py # app:// özel şema (web varlıkları + kapaklar)
engine.py # DSP motoru (EQ+efekt+hız+FFT) — projenin kalbi
eqpresets.py # 30 EQ profili + bant/efekt tanımları
library.py # veri modeli + JSON + müzik klasörü tarama
downloader.py # yt-dlp PYTHON kütüphanesi ile indirme (+ffmpeg mp3)
covers.py # yt-dlp PYTHON kütüphanesi ile kapak arama/önbellek
naming.py # MP3 adı temizleme
config.py # yollar, gömülü bin/web çözümleme
web/ # index.html, app.css, app.js, qwebchannel.js + fontawesome/ + fonts/
assets/logo.png
bin/ffmpeg.exe bin/deno.exe bin/yt-dlp.exe # depoda YOK — kendiniz indirin (deno: nsig/JS çözümü)
docs/ # README ekran görüntüleri
setup.bat run.bat build.bat build.py requirements.txt
ℹ️ Not
Ses tarayıcıda değil, tamamen yerli DspEngine'de (sounddevice) çalınır;
QtWebEngine yalnızca görseldir. Hız artışı pitch'i değiştirir (nightcore); reverb
çok-taplı "oda" hissidir.


