Spotify ve YouTube Music çalma listelerini iki yönde senkronize eden, fark-bazlı çalışan bir araç. Şarkı adı + sanatçı + süre ile eşleştirir. Telegram botu ile butonlu yönetim ve zamanlanmış otomatik senkron destekler.
- Fark-bazlı senkron: Spotify listesinin önceki hâli ile güncel hâlini karşılaştırır; yalnızca yeni eklenen şarkıları YouTube'a ekler, çıkarılanları siler.
- Müzik/video ayrımı: YouTube Music aramalarında gerçek müzik kayıtlarını (Topic kanalları / song sonuçları) tercih eder, video versiyonlarını cezalandırır.
- Güvenli silme: Yalnızca programın eklediği şarkılar silinir; elle eklediklerin korunur.
- İlk dolum (
--import): Mevcut bir listeyi YouTube'a aktarır, zaten var olanları atlar. - Şüpheli eşleşme incelemesi: Düşük skorlu eşleşmeler kuyruğa alınır, elle/Telegram üzerinden onaylanır.
- Mükerrer temizliği: Aynı isim+sanatçıya sahip tekrar eden şarkıları bulur ve temizler.
- En yeni en üstte sıralama:
sort_watchlist.txt'teki Spotify listelerini her senkronun sonundaadded_at'e göre yeniden dizer (en son eklenen en üstte). Spotify'daki sıralama görünümü kişiye özel olduğu için listenin gerçek sırası değiştirilir; böylece herkes aynı sırayı görür. Yalnız gereken parçalar taşınır; ilk çalışma elle verilmiş özel sırayı siler. - Telegram botu: Butonlu arayüzle senkron, import, mükerrer kontrol, şüpheli inceleme.
- YouTube → Spotify: YouTube Music listesini aynı adlı Spotify listesine aktarır; mevcut şarkıları korur ve yalnızca aracın eklediği şarkıları siler. Yalnızca elle tetiklenir (
reverse_sync.pyveya Telegram butonu//ytsync) — zamanlanmış otomatik senkron sadece Spotify → YouTube yönünde çalışır.
git clone https://github.com/osmanevski/music-sync.git
cd music-sync
python -m venv venv
# Windows:
venv\Scripts\activate
# macOS/Linux:
source venv/bin/activate
pip install -r requirements.txt-
.env.exampledosyasını.envolarak kopyalayıp doldurun:- Spotify: https://developer.spotify.com/dashboard adresinden bir uygulama oluşturun, Redirect URI olarak
http://127.0.0.1:8888/callbackekleyin. - YouTube Music: browser authentication kullanılır (aşağıya bakın).
- Telegram (opsiyonel): @BotFather'dan bir bot oluşturup token alın; chat ID'nizi
getUpdatesile öğrenin.
- Spotify: https://developer.spotify.com/dashboard adresinden bir uygulama oluşturun, Redirect URI olarak
-
watchlist.example.txtdosyasınıwatchlist.txtolarak kopyalayıp takip etmek istediğiniz Spotify liste ID'lerini ekleyin. ID'leri görmek için:python sync.py --list -
YouTube Music browser auth:
- Tarayıcıda music.youtube.com'a girin (oturum açık olmalı).
- Geliştirici araçları → Network →
youtubeifiltreleyin → birbrowseisteğine sağ tık → "Copy as cURL". - Çıktıyı
headers.txtdosyasına yapıştırın. python setup_yt_browser.py headers.txtçalıştırın →browser.jsonoluşur.
python sync.py --list # Spotify listelerini ve ID'lerini göster
python sync.py # watchlist'teki listeleri senkronla
python sync.py --playlist <id> # tek liste
python sync.py --all # tüm listeler
python sync.py --dry-run # önizleme (hiçbir şey yapmaz)
python sync.py --playlist <id> --import # ilk dolum (tüm şarkıları aktar)
python reverse_sync.py --list # YouTube Music listelerini göster
python reverse_sync.py --playlist <id> # YouTube Music'ten Spotify'a senkronla
python reverse_sync.py --playlist <id> --dry-run # ters yön önizleme
python review.py [spotify_id] # şüpheli eşleşmeleri incele
python find_duplicates.py <id|isim> # YouTube'da mükerrer bul
python clean_duplicates.py <id|isim> # YouTube'da mükerrer temizle
python sort_playlists.py --list # sort_watchlist.txt'teki listeleri göster
python sort_playlists.py --dry-run # sıralama için kaç hamle gerektiğini göster
python sort_playlists.py # listeleri en yeni en üstte sırala (sync.py sonunda otomatik çalışır)
python bot.py # Telegram botunu başlatBot, senkronu Telegram'dan butonlarla yönetmenizi ve bildirim almanızı sağlar.
- Telegram'da @BotFather'a yazın.
/newbotgönderin, bota bir ad ve kullanıcı adı verin.- BotFather bir token verir (örn.
123456789:ABCdef...). Bunu.env'dekiTELEGRAM_TOKEN'a yazın.
- Oluşturduğunuz bota Telegram'da herhangi bir mesaj gönderin (örn. "merhaba").
- Tarayıcıda şu adrese gidin (TOKEN yerine kendi token'ınız):
https://api.telegram.org/bot<TOKEN>/getUpdates - Çıkan JSON'da
"chat":{"id":123456789...kısmındaki sayı sizin chat ID'nizdir. - Bu sayıyı
.env'dekiTELEGRAM_CHAT_ID'ye yazın.
Bot yalnızca bu chat ID'den gelen komutları işler (güvenlik). Başkaları botu kullanamaz.
python bot.pyTelegram'da /menu yazın; butonlu arayüz açılır. Bot sürekli açık kalmalıdır (sunucuda Görev Zamanlayıcı ile otomatik başlatılabilir — bkz. WINDOWS_KURULUM.md).
Komutlar: /menu, /sync, /sync <liste adı>, /ytsync <liste adı>, /list, /review
run_sync.bat (günlük senkron) ve run_bot.bat (Telegram botu) dosyalarını Görev Zamanlayıcı ile çalıştırın. Detaylar için WINDOWS_KURULUM.md.
Not:
.batdosyalarındakiC:\ytmusic-syncyolunu kendi kurulum dizininize göre düzenleyin.
YouTube auth: cURL'de cookie yok
Chrome cookie'yi -b bayrağında verir; setup_yt_browser.py bunu yakalar. Opera bazı sürümlerde cookie'yi cURL'e hiç eklemez — bu durumda Chrome kullanın. cURL'de cookie olup olmadığını grep -c cookie headers.txt (Windows: findstr /c:"-b " headers.txt) ile kontrol edebilirsiniz.
Windows'ta Türkçe/özel karakter hatası (UnicodeEncodeError / charmap)
Konsolun kod sayfası UTF-8 değilse Türkçe liste isimleri çökmeye yol açar. .bat dosyaları chcp 65001 ve PYTHONUTF8=1 ile bunu çözer; elle çalıştırırken set PYTHONUTF8=1 yapabilirsiniz.
ytmusicapi OAuth expires_in / HTTP 400 hatası
OAuth yöntemi YouTube Music'in dahili API'siyle sorun çıkarabiliyor. Bu araç bu yüzden browser authentication kullanır (setup_yt_browser.py). OAuth'u denemeyin.
Kurumsal ağ / SSL sertifika hatası (CERTIFICATE_VERIFY_FAILED)
Telegram bağlantıları sertifikayı certifi CA paketiyle doğrular. Sorun sürerse ağ/DNS ayarlarını kontrol edin; sertifika doğrulamasını kapatmayın.
"Liste ilk kez görülüyor, ekleme yapılmadı"
Fark-bazlı çalışma gereği: ilk görülen liste referans olarak kaydedilir, şarkılar eklenmez. Mevcut bir listenin tüm şarkılarını aktarmak için --import kullanın.
Boş YouTube listesinde 'contents' hatası
ytmusicapi, tamamen boş bir listeyi okurken hata verebilir. Araç bunu yakalar ve "liste boş" diyerek geçer; bir şey yapmanız gerekmez.
.env, .spotify_cache, browser.json, headers.txt, sync.db, watchlist.txt gibi kişisel/gizli dosyalar .gitignore ile hariç tutulmuştur. Bu dosyaları asla depoya yüklemeyin — API anahtarları, oturum çerezleri ve token'lar içerirler.
YouTube Music entegrasyonu resmi olmayan ytmusicapi kütüphanesini kullanır. YouTube arayüz değişikliklerinde kütüphanenin güncellenmesi gerekebilir. Bu araç kişisel kullanım içindir.
MIT