ÖNEMLİ HUKUKİ NOTLAR
- Bu önizlemeler genelde hak sahiplerine aittir
Kullanım adımları:
- Python 3 kurulu olsun.
- pip install requests tqdm (indirme ilerleme çubuğu için).
- Aşağıdaki scripti download_previews.py olarak kaydet, çalıştır: python download_previews.py
Kaynak : Apple Music & iTunes Toplu İndirme
#!/usr/bin/env python3
# download_previews.py
# Apple iTunes Lookup API ile bir artistin şarkı önizlemelerini indirir.
# NOT: Preview dosyaları zaten ~30s olur; ek kırpmaya gerek yok.
import os
import re
import sys
import json
import requests
from pathlib import Path
from tqdm import tqdm
# Ayarlar
ARTIST_ID = "173099930" # Müslüm Gürses örneği; değiştir
COUNTRY = "TR" # Ülke kodu (TR, US, vb.)
OUT_DIR = Path("previews_{}".format(ARTIST_ID))
LIMIT = 200 # Maks sonuç sayısı
HEADERS = {
"User-Agent": "Mozilla/5.0 (compatible; preview-downloader/1.0)"
}
def sanitize_filename(s):
s = re.sub(r'[\\/:"*?<>|]+', '_', s)
s = re.sub(r'\s+', ' ', s).strip()
return s
def get_songs_for_artist(artist_id):
url = f"https://itunes.apple.com/lookup?id={artist_id}&entity=song&country={COUNTRY}&limit={LIMIT}"
print("Fetching metadata from:", url)
r = requests.get(url, headers=HEADERS, timeout=20)
r.raise_for_status()
data = r.json()
return data.get("results", [])
def download_url_to(path: Path, url: str):
# Stream download with progress bar
try:
r = requests.get(url, stream=True, headers=HEADERS, timeout=30)
r.raise_for_status()
except Exception as e:
print(f" ! İndirilemedi: {url} -> {e}")
return False
total = int(r.headers.get("content-length", 0))
with open(path, "wb") as f, tqdm(total=total if total>0 else None, unit="B", unit_scale=True, desc=path.name) as bar:
for chunk in r.iter_content(chunk_size=8192):
if not chunk:
continue
f.write(chunk)
bar.update(len(chunk))
return True
def main():
OUT_DIR.mkdir(parents=True, exist_ok=True)
results = get_songs_for_artist(ARTIST_ID)
# results[0] genelde artist meta; şarkılar sonraki öğeler
previews = []
for item in results:
# item wrapper örneği: {"wrapperType":"track","kind":"song", "trackName":"...", "previewUrl":"https://...m4a", ...}
preview_url = item.get("previewUrl") or (item.get("previews") and item["previews"][0].get("url"))
if preview_url:
title = item.get("trackName") or item.get("collectionName") or "unknown"
artist = item.get("artistName") or "artist"
track_id = item.get("trackId") or item.get("collectionId") or ""
previews.append((preview_url, artist, title, track_id))
if not previews:
print("Bu artist için preview bulunamadı veya API cevap başka formatta. Artist ID'yi kontrol et.")
sys.exit(1)
print(f"Toplam {len(previews)} preview bulundu. İndiriliyor...")
for url, artist, title, tid in previews:
safe_name = sanitize_filename(f"{artist} - {title}")
ext = os.path.splitext(url.split('?')[0])[-1] or ".m4a"
out_path = OUT_DIR / f"{safe_name}{ext}"
if out_path.exists():
print("Zaten var, atlanıyor:", out_path.name)
continue
success = download_url_to(out_path, url)
if not success:
print("Başarısız:", url)
print("Bitti. Dosyalar:", OUT_DIR.resolve())
if __name__ == "__main__":
main()Nasıl çalışıyor (kısa):
- https://itunes.apple.com/lookup?id=<ARTIST_ID>&entity=song&country=TR endpointine istek atıyor. iTunes API JSON içinde her track için previewUrl döner. (Apple Music / iTunes dokümantasyonu ve MusicKit preview nesnesi bilgisi için: Apple Developer docs.)
- previewUrl alanı yoksa veya artist ID farklı çıktı veriyorsa, alternatif yaklaşım: şarkıları search endpointiyle (şarkı isimleriyle) sorgulayıp previewUrl çekebilirsin. iTunes Search API dokümanı faydalı olacaktır. performance-partners.apple.com
- İndirdikten sonra otomatik metadata ekleme veya mp3e çevirme istersen pydub + ffmpeg ile dönüştürebilirsin.
- Kullanmadan önce Appleın hizmet şartlarını ve varsa telif sahibinin lisans şartlarını gözden geçir. (Previewleri kişisel, değerlendirme amaçlı indirmek genelde problem olmaz; yeniden dağıtım ve yayınlama sorun yaratır.)