Çalma listesi dışa aktarımında süreleri dosyadan değil kütüphaneden okumak

这篇内容暂时只有 Türkçe 版本,以下是原文。

Geçen ay 1.240 parçalık bir arşivi üç ayrı çalma listesine böldüm ve hepsini m3u8 olarak dışa aktardım. Arşiv FLAC, çoğu 16/44.1, bir kısmı 24/96; dosya adlarında parça numarası ve tempo etiketi var. Dışa aktarımdan sonra VLC’de listeyi açtığımda toplam süre 78 saat 12 dakika çıktı, oysa kütüphanedeki toplam 74 saat 40 dakikaydı. Fark tek tek parçalarda değil, toplamda birikiyordu.

Önce hangi parçalarda sapma olduğunu çıkardım. Süreyi iki yerden okuyup karşılaştırdım: dosyanın kendisinden (ffprobe) ve kütüphane veritabanındaki kayıttan.

ffprobe -v error -show_entries format=duration \
  -of default=nw=1:nk=1 "$f"

Aynı parça için veritabanı satırını da çektim:

SELECT path, duration_ms FROM tracks
WHERE path IN (SELECT path FROM export_batch_3);

Sonuç: 1.240 parçanın 61’inde 0,4–3,1 saniye arası fark vardı. Hepsi 24/96 dosyalardı ve hepsinin başında ya da sonunda kısa bir sessizlik bloğu vardı; ffprobe bunu süreye katıyor, kütüphane ise ses taramasında kırpıyordu. Toplam fark tam olarak bu 61 parçadan geliyordu, geri kalan 1.179 parça birebir uyuşuyordu.

Dışa aktarım aracını değiştirdim: süre artık dosyadan değil, kütüphane satırından yazılıyor. m3u8 satırı şöyle:

# tracks: path, duration_ms, title
with open(out, "w", encoding="utf-8") as fh:
    fh.write("#EXTM3U\n")
    for t in tracks:
        secs = round(t.duration_ms / 1000)
        fh.write(f"#EXTINF:{secs},{t.title}\n{t.path}\n")

Bunu yapmamın nedeni şu: m3u8’deki süre alanı çoğu oynatıcıda yalnızca gösterim için kullanılıyor, ama toplam süre ve kalan süre göstergesi bu alandan hesaplanıyor. Dosyadan okumak “gerçek” süreyi veriyor, kütüphaneden okumak ise kullanıcının listede gördüğü süreyle tutarlı olanı veriyor. Ben ikincisini seçtim çünkü amaç arşivi doğrulamak değil, listeyi paylaşmak. Bedeli şu: kütüphane kaydı bayatsa (dosya yeniden encode edilmiş ama tarama yapılmamışsa) yanlış süre yazıyorum. Bu yüzden dışa aktarım öncesi hızlı bir tazelik kontrolü ekledim:

touch -m -d "$LAST_SCAN" /tmp/scan_marker
find "$LIB" -newer /tmp/scan_marker -name '*.flac' | head

Çıktı boş değilse dışa aktarımı durduruyorum ve önce taramayı çalıştırıyorum.

Nerede işe yaramıyor: parça ortasından kesilmiş dosyalarda (örneğin bir DJ setinden alınmış 90 saniyelik bölümler) kütüphane süresi ile dosya süresi arasında sistematik fark kalıyor, çünkü kesim noktası veritabanına yazılmamış. Bir de CUE ile bölünmüş albümlerde tek dosya birden çok satıra düşüyor; o durumda süreyi satırdan okumak zorunlu, dosyadan okumak tamamen yanlış sonuç veriyor. Kendi hatam: ilk denemede bu 61 parçayı “bozuk” sanıp yeniden encode ettim, sonra farkın sessizlikten geldiğini görünce gereksiz yere iki saat harcadığımı anladım.

Sizin arşivinizde dışa aktarım sonrası toplam süre ile kütüphane toplamı tutuyor mu, yoksa sapma belirli bir formatta mı birikiyor?

0
赞同度 100% · 0 条评论 · 3 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

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