- yt-dlp'de YouTube indirmeyi normal şekilde kullanmaya devam etmek için yakında Deno (veya desteklenen bir JavaScript çalışma zamanı) kurulumu zorunlu hale gelecek
- YouTube tarafındaki son değişiklikler nedeniyle, yerleşik JavaScript "yorumlayıcısı" tek başına artık JS challenge'ı çözemiyor
- PyInstaller çalıştırılabilir dosyası kullanıcıları yalnızca Deno'yu hazırlarsa yeterli olacak; PyPI paketi kullanılıyorsa ek JavaScript bileşenlerinin kurulması gerekecek
- Diğer JavaScript çalışma zamanları (Node, Bun vb.) için destek olasılığı açık tutuluyor, ancak güvenlik ve sandboxing açısından şu anda yalnızca Deno uygun görülüyor
- Deno ve ilgili bağımlılıkların kurulumu ile yol belirtme konusunda ayrı seçenekler ve yönlendirmeler sunulacak
yt-dlp'nin YouTube indirme değişiklikleri ve yeni gereksinimleri duyuruldu
Yeni gereksinimin getirilme nedeni
- Yakın zamanda YouTube indirme işlevini sorunsuz kullanmak için Deno ya da desteklenen başka bir JavaScript çalışma zamanının kurulması zorunlu olacak
- yt-dlp şimdiye kadar YouTube tarafındaki JS challenge'ı çözmek için yerleşik JavaScript yorumlayıcısını kullanıyordu, ancak YouTube'un iç mantığındaki son değişiklikler nedeniyle bu yöntem artık tek başına yeterli değil
- Değişimin kapsamı o kadar büyük ki, yt-dlp'nin düzgün çalışabilmesi için artık YouTube isteklerini geçebilecek resmi JavaScript çalışma zamanı tabanlı bir algoritma kullanması gerekiyor
Kullanıcıya göre hazırlık ve yapılması gerekenler
- Deno'nun (veya desteklenen bir JS çalışma zamanının) kurulması
- Desteklenecek ek çalışma zamanları hakkında daha sonra FAQ vb. üzerinden bilgi verilecek
- yt-dlp'nin ihtiyaç duyduğu bazı JavaScript bileşenlerinin de kurulması gerekebilir
- Ek iş gerekip gerekmediği, kurulum yöntemine ve yt-dlp'nin dağıtım biçimine göre değişir
Resmi dağıtımlara göre kontrol listesi
- PyInstaller ile sunulan resmi çalıştırılabilir dosyalar (
yt-dlp.exe, yt-dlp_macos, yt-dlp_linux vb.)
- Yalnızca Deno'yu kurmak yeterlidir; ek bileşenler zaten çalıştırılabilir dosyanın içinde yer alır
- PyPI paketi (
pip, pipx vb.)
- yt-dlp'nin
default seçenek bağımlılık grubuyla kurulması ve en güncel sürüme yükseltilmesi gerekir
- Örnek:
pip install -U "yt-dlp[default]"
- Resmi zipimport ikili dosyası (Unix için yt-dlp)
- Deno'nun npm bağımlılıklarını indirebilmesi için ek bir bayrak gerekebilir
- Ya da Python ortamına yt-dlp için ayrı bir JS çözme paketinin kurulması gerekebilir (seçenek ve paket adı daha sonra duyurulacak)
- Üçüncü taraf paketler (
pacman, brew vb.)
- İzlenecek yol ilgili dağıtımın politikasına göre değişebilir, ancak zipimport ikili dosyası kullanıcıları için önerilen yöntem burada da uygulanabilir
Çalışma zamanı ve güvenlik tartışmaları
- Node, Bun gibi alternatif JS çalışma zamanları için destek ihtimali olsa da, şu an bu çalışma zamanları Deno kadar güçlü güvenlik ve sandboxing özellikleri sunmuyor
- İleride başka JS çalışma zamanlarının desteklenip desteklenmeyeceği hâlâ tartışılıyor; kesin karar verilene kadar yönlendirmeler Deno temel alınarak yapılacak
Deno kurulumu hakkında ek bilgiler
- Deno da tıpkı yt-dlp gibi GitHub üzerinden sunulan tek bir çalıştırılabilir dosya indirilip uygun bir konuma yerleştirilerek kullanılabiliyor
- İleride yt-dlp'ye
--js-runtimes seçeneği eklenerek Deno çalıştırılabilir dosyasının yolunun belirtilebilmesi planlanıyor (seçenek adı ve kullanım şekli değişebilir)
- Deno
curl vb. araçlarla indirildikten sonra yt-dlp çalıştırılabilir dosyasıyla aynı klasöre yerleştirilirse sorunsuz çalışabilir
FAQ ve ek yönlendirmeler
- Kullanılan işletim sistemi veya paket yöneticisine bağlı olarak PATH'e ekleme gibi işlemler gerekebilir
- Linux gibi bazı ortamlarda Deno otomatik olarak PATH'e eklenebilir
- Ek sorular ve kurulumla ilgili sorunlar için FAQ veya topluluk kanallarında destek sağlanacak
Diğer topluluk tepkileri ve sonraki güncellemeler
- Bazı kullanıcılar 32 bit sistem desteğinin bırakılması ihtimali, dağıtım seçenekleri ve benzeri etkiler hakkında sorular soruyor
- yt-dlp geliştirici ekibi, issue açma, yama hazırlama ve topluluk geri bildirimlerine dayanarak daha iyi yönlendirme ve destek yöntemleri hazırlıyor
Sonuç ve özet
- YouTube'un sistem yapısındaki değişiklikler nedeniyle yt-dlp'nin çalışma yapısı ve gereksinimleri önemli ölçüde değişiyor
- En kritik değişiklik olarak, YouTube'dan sorunsuz indirme yapmak isteyenlerin Deno gibi bir JS çalışma zamanını hazırlaması zorunlu hale geliyor
- Resmi dağıtım yöntemine göre belirtilen yönergelere hızlıca uyum sağlanması gerekiyor
- Ek yönlendirmeler, FAQ ve kurulum rehberleri düzenli olarak paylaşılacak
1 yorum
Hacker News görüşleri
YouTube Premium için ücretli aboneliğim var. Geçen hafta sonu trende izlemek için video indirmeye çalıştım ama hem iPad’de hem iPhone’da “İndirme bekleniyor..” aşamasında takılı kaldı. Yeniden başlatmak da işe yaramadı; 1 saat uğraştıktan sonra vazgeçtim. Videoyu yt-dlp ile indirip USB-C flash sürücüye taşıyarak izledim. Yakında “aile arasında Premium paylaşım kısıtlaması” politikası gelirse, o zaman gerçekten iptal etmeyi düşünüyorum. Çünkü ailem reklamsız deneyimi çok seviyor
Ben de Premium abonesiyim ama iPad uygulamasında benzer bir sorun yaşıyorum. Bebeğe göstermek için videolar indirmeye çalışsam da çoğu zaman tek seferde düzgün çalışmıyor. O kadar sinirlendim ki ikinci el bir Samsung Galaxy Tab A7 alıp üstüne LineageOS tabanlı özel ROM kurdum. İstediğim tüm medyayı 1TB SD karta koyup VLC ile sorunsuz oynatıyorum. Ayrıca F-Droid mağazasından indirdiğim NewPipe, YouTube videolarını resmi uygulamadan çok daha kararlı biçimde indirebiliyor. Başta medyayı yt-dlp gibi bir şeyle doldurmayı düşünüyordum ama artık gerek kalmadı
YouTube Premium’a para ödüyorum ama telefonda otomatik çeviriyi kapatmak zorunda kaldığım için ReVanced kullanarak izliyorum. Resmi uygulamada kullanıcının bu ayarı değiştirememesini anlayamıyorum
YouTube’a bir video yükleyip sonra creator dashboard’dan indirmeye çalışırsanız (örneğin canlı yayın yapıp yerel yedek almadıysanız ya da bilgisayarınız zorlanıyorsa) sadece 720p düşük kalite olarak alabiliyorsunuz. Buna karşılık yt-dlp ile indirince en yüksek kaliteyi alabiliyorsunuz
Reklamsız deneyim YouTube Kids’te çalışmadığı için (ShieldTV kullanıyorum) aboneliğimi iptal ettim. Muhtemelen bir bug’dı ama müşteri desteği olmadığı için çözemedim. Eskiden Play Music ücretli abonesiydim; YouTube’a zorla geçirildikten sonra bu benim için son büyük hayal kırıklığı oldu
Aile paylaşımı kısıtlama politikasının gelmesini bekliyorsanız, bununla ilgili haberler zaten var. Bana da YouTube’dan bununla ilgili bir e-posta geldi. Şu an hâlâ reklamsız kullanıyorum ama fiilen ne zaman uygulanacağını bilmiyorum. İlgili yazı incelenebilir
yt-dlp’nin “JavaScript yorumlayıcısı” için harcanan mühendislik çabasına hayran kaldım yt-dlp jsinterp.py
Soruna tam uygun bir yaklaşım. Ek yük yaratmadan bunu bu seviyeye kadar getirmiş olmaları gerçekten etkileyici
Bu duyurudaki en gizli asıl nokta tam olarak buydu. Yapının zaten bu kadar karmaşık hale geldiğini bilmiyordum ve çok etkilendim
Bu, JavaScript’in sadece bir alt kümesini yorumlama yaklaşımı. İlgili HN tartışması için bağlantı
Koda kısaca bakınca Python’daki ChainMap’i öğrenmiş oldum
Gerçekte ne kadar JavaScript yorumladığını merak ediyorum; ayrıca kod 1.000 satır bile değilken bunu derleyiciye giriş derslerinde kullanmak mümkün olabilir mi diye düşünüyorum
30 yılı aşkın süredir dijital medya biriktiren bir “digital hoarder”ım. VHS, DVD gibi fiziksel medyam yok; her şeyi dijital saklıyorum. Nadir ya da kaybolma ihtimali olan içeriklerden de biraz var. “Evde Netflix gibi işlettiğim” sistemime eşim de ilgi duymaya başladı ve reklamsız izlemeyi sevdi. Kendimi özel biri sanmıyordum; herkesin streaming kullanacağını düşünüyordum. Yıllardır çevreme “Bende olan medyada sevdiğin bir program varsa söyle” diyordum. Son 2 yılda ailem ve arkadaşlarım ya Jellyfin sunucuma erişmek istedi ya da televizyonlarının altına küçük bir sunucu kurmamı rica etti. Son dönemde Jellyfin’e YouTube kanal arşivlemeyi de ekledim; her kanal için bir dizin ve yt-dlp komutları kullanarak videoları otomatik indiriyorum. Yalnız istediğim h264 codec ile indirme olmuyor, bu yüzden yeniden encode ediyorum. YouTube videoları AV1 codec ile geliyor ama akıllı televizyonum henüz bunu desteklemediği için kendim encode ediyorum
Eskiden basit bir script çalıştırıyordum ama şimdi ytdltt ytdltt GitHub ile Telegram botu üzerinden annem sesli kitap gibi YouTube videoları istediğinde bunları dizin bazında düzenleyip indiriyor ve Jellyfin üzerinden erişmesini sağlıyorum. Annemin 3 yılda biriktirdiği sesli kitaplar yaklaşık 1.2TB tuttu
Benzer amaç için tubesync de denenebilir
h264 içerik indirme çalışmıyorsa, yt-dlp belgeleri bana da zor gelmişti ama şu an çalışan yöntem şöyle
yt-dlp -f "bestvideo[width<800][vcodec~='^(avc|h264)']+bestaudio[acodec~='^((mp|aa))']"Yakın zamanda Pinchflat’i öğrendim Pinchflat GitHub; *arr tarzı bir web alternatifi ve arka planda yt-dlp kullanıyor. İndirmek istediğiniz videoyu playlist’e ekliyorsunuz, gerisini otomatik hallediyor
Bot tespitini aşmak için cookie kaydı gibi şeyler gerekiyor mu, VPN de lazım mı diye merak ediyorum
Artık web’den basitçe veri çekme dönemi bitti; şimdi binlerce satır obfuscate edilmiş JavaScript çalıştırma dönemi. Eskiden 1KB’lık bir json dosyasını rahatça alıp cache’leyebiliyorduk; şimdi ise tam bir browser çalıştırıp 100 istekle 10MB veri alışverişi yapıyorsunuz ve analiz ortamı ile güvenlik profili karmakarışık oluyor. Herkes için kayıp
İyi tarafından bakarsak, böyle kullanışsız bir ortam 10.000 scraping şirketine 10MB çöpü çekip üstüne düzgün API sunma fırsatı verdi. Ama artık web sitesi içeriğinin kalitesi de düştüğü için bu mesele giderek daha az önemli hale geliyor
Şu anda web karmaşıklaştıkça scraping-engelleme-atlatma sonsuz tekrar eden bir oyuna döndü. Ama AI/LLM’ler ortaya çıkınca (daha pahalı olsa da) her türlü bilgiyi çekmek mümkün hale geldi. Yakında LLM’ler tüm CAPTCHA’ları da geçecek. “Analog hole” her zaman açık olabilir. Kamera ve mikrofonla ekrana ve sese bakmak bile yeterli; AI bunları insanlardan daha iyi yorumlayabilecek bir döneme giriyoruz
Neyse ki yt-dlp tarzı küçük ölçekli scraping hiç olmadığı kadar kolay. Bir iki saat ayırıp headless Firefox ve mitmproxy ile rahatça script yazabilirsiniz; tüm bir web sitesini çekmek için çok sayıda VPS döndürmediğiniz sürece istediğim içeriği arşivlemekte zorlanmıyorum. Cloudflare da düşük hacimli sıradan kullanıcıları engellemiyor. Modern browser otomasyonu o kadar kolay ki, site SPA olsa bile tekil kullanıcılar rahatça çekebiliyor. CAPTCHA’lar da küçük ölçekte elle çözülebiliyor. Ben de son zamanlarda CAPTCHA çıkınca Discord bildirimi alıp dizüstü bilgisayardan çözüyor, sonra scraping’e devam ettiriyorum. Satın aldığım webtoon’ları “World Garden” uygulaması kontrol etmeye kalkınca, verimin kontrolünün bende olması gerektiğini düşündüm
Aslında 1KB json bile modern web’de MB seviyesinde JavaScript indirilmeden çalışıp veriyi göstermiyor. Benim istediğim şey sadece 10-20KB HTML, biraz CSS ve görsel dosyaları. Video da doğrudan mp4 olarak indirilebiliyorsa mesele bitiyor. Basit ve verimli; ama bir şey satmaya çalışıyorsanız iş değişiyor
Bu karmaşıklığın tek nedeni daha fazla reklam satmak
Nsig/sig - API çağrısına mutlaka eklenmesi gereken özel token’lar. base.js (oynatıcı kodu) içinde üretiliyorlar ve yt-dlp gibi üçüncü taraf istemciler bunları tersine mühendislikle çıkarıp atlatmak zorunda kalıyor. Eskiden regex gibi yöntemlerle kodun bir kısmı çekilip token elde edilebiliyordu; şimdi ise token alabilmek için neredeyse tüm base.js’i çalıştırmak gerekiyor çünkü kod parçalara ayrılmış durumda
PoToken - Google’ın yakın dönemde güçlendirdiği origin proof (token) mekanizması. Olmazsa 403 hatası geliyor. Android’de DroidGuard, iOS’ta uygulama içi yerleşik modül, web’de ise JS kodu (challenge) çalıştırılması gerekiyor. Eskiden harici araçlarla alınması gerekirken, yt-dlp’nin Deno tabanlı güncellemesiyle yakında yerleşik hale gelmesi bekleniyor
SABR - Sunucu taraflı uyarlanabilir bitrate streaming teknolojisi; Google’ın UMP protokolüyle birlikte kullanılıyor ve sunucu oynatma konumu/buffer durumunu alarak en uygun buffering’i ve hatta reklam eklemeyi bile kontrol ediyor. Üçüncü taraf istemci desteği için çalışmalar hâlâ sürüyor
Nsig/sig çıkarma örnekleri:
PoToken rehberi:
SABR:
(Ek kod örnekleri ve rehber bağlantıları güncellendi)
Google ve Cloudflare’ın web’i neden sadece imzalı ve bütünlüğü doğrulanmış birkaç browser ile sınırlamak istediğini artık anlıyorum
Web’deki PoToken konusunda, bir JS snippet çalıştırmanın bir bot olmadığını nasıl kanıtladığını merak ediyorum. Eğer sadece istemci tarafı JS ise headless Chromium’da da çalışmaz mı?
Google bunu daha yeni devreye almışken şimdiden atlatma yöntemleri çıktı. Sonuçta dev bir şirket olsanız bile içeriği istemciye gönderiyorsanız er ya da geç aşılabiliyor. Bu yüzden hepsi kapalı ve tekelci ekosistemler kurmak istiyor — böylece ya reklamı sonuna kadar izletiyorlar ya da kullanım ücreti alıyorlar
Kısa süre önce HN’de YouTube’un indirme araçlarının çalışmasını aslında istediğini öne süren bir yazı da vardı ilgili yazı 1 ilgili yazı 2. YouTube dünya çapında 3 milyar kişinin kullandığı küresel bir hizmet işletirken, indirmeyi hiçbir zaman tamamen engellemeyip hep “yeterince” zorlaştırıyor gibi görünüyor. Bence tüm dünya en yeni iPhone veya Android cihazlar kullansaydı DRM’i anında her yere yayarlardı
yt-dlp, eski akıllı TV’lere yönelik API’yi kullanıyor. Bu cihazlar artık yazılım güncellemesi almadığı için o trafik ortadan kalkarsa bu işlev de bitebilir
Bir içerik platformunun gelir modelini bozacak şekilde indirmeyi desteklemek isteyeceğine dair komplo teorisinin hiç mantıklı gelmediğini düşünüyorum
YouTube oynatıcısı ve sayfası giderek ağırlaşıyor; eski PC’lerde daha da yavaş hale gelmesi gibi tuhaf bir durum oluştu. Son zamanlarda “watch?v=” kısmını “/embed/” ile değiştirip 480p izliyordum ama aynı videoyu indirip izlediğimde CPU kullanımı yaklaşık %3 oluyor. Fakat bu yöntem bile giderek daha kötü çalışıyor. Bu arada başka siteler (ör. porno siteleri) deneyimi optimize etmeye daha çok önem veriyor ve indirme araçlarını engellemeyi pek umursamıyor
Video (normal)
Video (embed)
GitHub da benzer şekilde optimize değil; 8. nesil i5’li bir PC’de bile neredeyse kullanılamaz durumda. Bu yüzden ben doğrudan snapshot alıp offline inceliyorum
Bugünlerde YouTube performansının düşmesinin nedeni herkesi en yeni ve ağır codec’leri kullanmaya zorlamaları. Benim dizüstü bilgisayarım 4K h264 videoyu sorunsuz açıyor ama sadece 720p YouTube videosu izlesem bile cihaz hemen ısınıp takılmaya başlıyor. h264ify adlı browser eklentisiyle belirli codec’leri engelleyebiliyorsunuz ama bunun neden varsayılan davranış olarak ayarlanamadığını anlamıyorum. Videoyu indirip izlemek açıkçası daha rahat ve daha kararlı
Sadece ben değilim. 2025’in ilk çeyreğinde embed player ile izliyordum ama üçüncü çeyrekte Google embed player’ı bilerek bozdu. Şu anda YouTube’a yalnızca yt-dlp ile erişebiliyorum. yt-dlp ve geliştiricileri sonsuza kadar yaşasın
YouTube’dan çıkıp PeerTube / peer tabanlı platformlara geçmeyi düşünüyorum
QuickJS’nin (hafif bir JS yorumlayıcısı) o kadar yavaş olduğu ve video başına 20 dakikadan fazla sürdüğüne dair raporlar var. Deno ise çok daha hızlı; bu kadar fark nasıl oluşuyor diye merak ediyorum
(bkz. issue #14404 / yanıt)
QuickJS, bytecode tabanlı bir yorumlayıcı (Python kadar yavaş) ve önceliği sadelik ile kararlılık. Deno ise Chrome seviyesinde yüksek verimli bir JIT derleyici kullanıyor; bu fark özellikle bazı kod türlerinde çalışma hızını 20 katın da üstüne çıkarabiliyor. QuickJIT (QuickJS’nin TCC kullanan JIT eklenmiş bir fork’u) Deno kadar hızlı olmayabilir ama yine de iyileştirme potansiyeli var
Performansın bu kadar dramatik kötüleşmiş olması biraz korkutucu; sanki Google özellikle diğer yorumlayıcılarda yavaş çalışsın diye yapmış gibi geliyor
İlginç bir bilgi. Minecraft’ta (Bedrock, modlama amaçlı) QuickJS kullanıyoruz; V8’den yavaş ama fark bu kadar büyük görünmüyor
Kolay ripping döneminin sona ermek üzere olduğuna dair işaretler artık çok net. Uzun süre saklamak istediğiniz YT videoları varsa hemen şimdi tubearchivist gibi bir şey kurup yedeklemenizi öneririm
pinchflat Pinchflat GitHub da alternatif olarak önerilir. tubearchivist kadar olgun değil ama benim deneyimimde daha az bug vardı
YT’nin tekel gücüyle biriktirdiği değerli kültürel ve eğitsel varlıkları korumak için son fırsatın şimdi olduğunu düşünüyorum. tubearchivist ilginç görünüyor ama kurulum ve bakım zahmetli gibi; bu da beni zorluyor. Üstelik yaklaşımı tüm abonelik kanallarını topluca indirmek üzerine kurulu. Benim için indirilmiş klasörler varsa, video adlarını yorumlayıp link sayfaları oluşturan çok hafif bir yerel web sunucusu çözümü yeterli olur. Birkaç tıklamayla kurulabilen ultra hafif bir alternatif varsa öneri isterim
YouTube filmlerinde DRM çözümü zaten var; neden bunu henüz tüm kanallara uygulamadıklarını da merak ediyorum
Deno’nun seçilmiş olması beni şaşırttı ama Deno tek yürütülebilir dosya olarak kolay dağıtılabildiği için kurulum sorunlarını azaltıyor. Python tabanlı yorumlayıcı inanılmaz bir hack’ti ama sınırları vardı; bu konu geçmişte Youtube-dl projesinde de konuşulmuştu eski HN tartışması
Node, Deno’daki gibi güvenlik ve yalıtım özelliklerine sahip değil. Aynı başlıkta maintainer’ın görüşlerini de görebilirsiniz
Deno’nun sandbox özellikleri de önemli bir tercih sebebi. %100 güvenilir olmasa da hiç olmamasından iyidir diye düşünüyorum
yt-dlp sadece YouTube’u değil, çok sayıda başka (bazen riskli) video streaming sitesini de destekliyor. Bu yüzden browser benzeri asgari sandboxing şart. Tasarım gereği güvenilmeyen kod çalıştırıldığı için temel güvenliğin sağlanması gerekiyor