Çalma listesi önerilerinde 30 saniyelik önizleme dosyalarını yerel önbellekle test etmek
这篇内容暂时只有 Türkçe 版本,以下是原文。
Geçen hafta kendi arşivimdeki 480 parçalık bir listeyi öneri motoruna verip her parça için 30 saniyelik önizleme dosyası indirmeye çalıştım. Masaüstünde Linux, Python 3.11, ffmpeg 6.1. Amaç şuydu: öneri sırasında parçaların ilk 30 saniyesine bakıp tempo/gürültü kabaca eşleşiyor mu diye kontrol etmek. İlk denemede 480 isteğin 112’si 429 döndü, kalanların bir kısmı da yarım indi. Sorun ağ değil, benim istekleri seri atmam ve her seferinde aynı dosyayı yeniden çekmemdi.
Çözümü basit tuttum: her parça için sha1 tabanlı bir önbellek anahtarı, tek bir dizin ve indirme başına 25 saniyelik zaman aşımı. Parça kimliği olarak dosya yolunu değil, parçanın sanatçı+başlık+süre üçlüsünün hash’ini kullandım; böylece aynı parça farklı listelerde geçse de tekrar inmiyor.
import hashlib, pathlib, subprocess, time
CACHE = pathlib.Path.home() / ".cache" / "onizleme"
CACHE.mkdir(parents=True, exist_ok=True)
def anahtar(sanatci, baslik, sure):
ham = f"{sanatci}|{baslik}|{int(sure)}".encode()
return hashlib.sha1(ham).hexdigest()[:16]
def onizleme_al(kimlik, url):
hedef = CACHE / f"{kimlik}.m4a"
if hedef.exists() and hedef.stat().st_size > 40000:
return hedef
gecici = hedef.with_suffix(".part")
r = subprocess.run(
["curl", "-sSL", "--max-time", "25", "-o", str(gecici), url],
capture_output=True,
)
if r.returncode != 0 or gecici.stat().st_size < 40000:
gecici.unlink(missing_ok=True)
return None
gecici.rename(hedef)
return hedef
Neden bu kadar küçük bir eşik (40 KB)? Çünkü yarım kalan indirmeler genelde 10-20 KB civarında kalıyor ve ffmpeg bunları sessizce açıyor, sonra süre 2 saniye çıkıyor. --max-time ile birlikte boyut kontrolü, bozuk dosyayı önbelleğe sokmadan eliyor. Önbellek diski şişiriyor: 480 parça × ~500 KB yaklaşık 240 MB. Kabul edilebilir, ama 5000 parçaya çıkarsanız bunu ayrı bir disk bölümüne taşımanız gerekir.
İkinci turda istekleri 4’lü gruplara böldüm ve aralarına 1.5 saniye koydum. 480 istek 3 dakikada bitti, 429 sayısı 4’e düştü. Daha agresif paralellik denedim (16 eşzamanlı), 429 patladı ve toplam süre kısalmadı; sunucu tarafındaki sınır muhtemelen IP başına ve bu benim kontrolümde değil.
Nerede işe yaramıyor: canlı yayınlanan veya önizlemesi olmayan parçalarda onizleme_al sürekli None dönüyor ve her çalıştırmada aynı başarısız isteği tekrar deniyor. Bunu fark ettiğimde başarısız kimlikleri basarisiz.txt içine yazıp 7 gün boyunca atlamaya başladım; yoksa 40 parçalık bir liste her seferinde 40 gereksiz istek üretiyordu. Bir de dosya adında Türkçe karakter olan parçalarda curl’ün yol kodlaması bende iki kez bozuldu; artık kimlik olarak yalnızca hash kullanıyorum, okunabilirlik için ayrı bir index.tsv tutuyorum.
Sizin listenizde önizlemesi hiç gelmeyen parçalar için ne yapıyorsunuz: tamamen atlıyor musunuz, yoksa süre/etiket gibi ikincil bir sinyalle mi karar veriyorsunuz?


0 条评论
还没有评论,写下第一条。