Naver’dan bir video indirmek, sıradan kullanıcılar için sadece birkaç tıklama ile tamamlanan basit bir işlem gibi görünebilir. Ancak geliştiriciler için Naver TV, Sports ve V LIVE gibi platformlardaki içerikler, oldukça karmaşık ve korumalı bir altyapıya sahiptir. Naver Video Downloader projesini geliştirirken karşılaştığımız teknik zorluklar, sıradan web kazıma yöntemlerinin çok ötesine uzanıyordu. Bu içerikte, Naver’ın video dağıtım sisteminin mimarisini ve yüksek hızlı, kayıpsız indirmeyi nasıl başardığımızı adım adım anlatacağız.
Naver’ın Gizli Akış Sistemi: HLS ve Parçalanmış Dosyalar
Naver, kullanıcılarına statik video dosyaları sunmaz. Bunun yerine, Adaptive Bitrate Streaming (ABS) teknolojisini kullanarak HTTP Live Streaming (HLS) protokolüne dayanan bir sistem kullanır. Bu sistemin nasıl çalıştığını anlamak, indirme işleminin temelini oluşturur.
- Ana Oynatma Listesi (.m3u8): Video oynatılmaya başlandığında tarayıcıya gönderilen bu dosya, farklı çözünürlüklerdeki (1080p, 720p vb.) içeriklere ait bağlantıları içerir.
- Medya Oynatma Listeleri: Seçilen çözünürlük için özel olarak oluşturulan bu listeler, 2-5 saniyelik Transport Stream (.ts) segmentlerinin URL’lerini barındırır.
Naver’ın sunduğu her video aslında yüzlerce küçük dosyadan oluşur. Bu durum, indirme işlemini sıradan bir .mp4 indirmekten çok daha karmaşık hale getirir.
Güvenlik Duvarını Aşmak: Token ve Kimlik Doğrulama
Naver’ın video oynatıcısının arkasındaki "beyin" olarak adlandırılan vod_play_info API’si, içeriklerin güvenliğini sağlamak için çeşitli koruma mekanizmaları kullanır. Bu API’ye erişmek için iki anahtar gereklidir:
- Video Kimliği (vid): İçeriğin benzersiz tanıtıcısı.
- Oturum Anahtarı (inkey): Kullanıcı oturumunu doğrulayan dinamik bir token.
Bu tokenlar genellikle, JavaScript tarafından gizlenen ve sadece birkaç saniyelik bir ömre sahip olan dinamik anahtarlarla oluşturulur. Doğru imza olmadan gönderilen segment talepleri, 403 Yasak hatasıyla sonuçlanır. Bu nedenle, indirme motorunun bu tokenları otomatik olarak elde etmesi ve yenilemesi gerekir.
Arka Uç Mimarisi: Veri Akışını Kopyalamak
Naver’dan video indirmek için geliştirdiğimiz motor, resmi oynatıcı ile sunucu arasındaki "tokalaşmayı" (handshake) taklit eden bir yapıya sahiptir. Bu sürecin nasıl işlediğini aşağıda bulabilirsiniz:
1. Metaveri Toplama ve API Çağrıları
- Hedef sayfada gizlenmiş PRELOADED_STATE JSON nesnesini tarar ve vid değerini elde eder.
- Naver’ın VOD sunucularına, tarayıcı parmak izine benzer başlıklar taşıyan dinamik bir set kullanarak API çağrısı yapar.
- Dönen yanıtı analiz ederek, en yüksek bit hızına sahip .m3u8 bağlantısını bulur.
2. CORS Engellerini Aşmak: Saydam Proxy Çözümü
Tarayıcıların Same-Origin Policy (SOP) kuralları nedeniyle, üçüncü taraf sitelerden Naver’a doğrudan veri çekmek mümkün değildir. Bu sorunu çözmek için Node.js tabanlı Saydam Akış Proxy sistemi geliştirdik.
- Akış Yönlendirme Mekanizması: Kullanıcı bir segmenti proxy üzerinden talep eder. Sunucumuz, bu talebi Naver’ın CDN’inden alır, kısıtlayıcı CORS başlıklarını kaldırır ve yanıtı Access-Control-Allow-Origin: * ile gönderir.
- Sıfır Gecikmeli Veri Aktarımı: Segmentin tamamını sunucuda depolamak yerine, veriyi parçalar halinde kullanıcıya aktarırız. Bu sayede sunucunun RAM kullanımı sabit kalır ve video boyutu ne olursa olsun performans düşmez.
Tarayıcı İçi İşlemler: FFmpeg.wasm ile Segmentleri Birleştirmek
Naver’dan indirilen 500’den fazla .ts dosyasını sunucu tarafında birleştirmek, hem maliyetli hem de zaman alıcıdır. Bunun yerine, bu işlemi kullanıcının tarayıcısında gerçekleştiren WebAssembly (WASM) tabanlı bir çözüm geliştirdik.
Kayıpsız Dönüştürme: Remuxing Tekniği
Naver’ın HLS akışındaki segmentler zaten H.264 kodeğinde kodlanmıştır. Bu dosyaları yeniden kodlamak hem kalite kaybına yol açar hem de süreci yavaşlatır. Bunun yerine, remuxing adı verilen bir yöntem kullanırız:
- FFmpeg’e
-c copybayrağı gönderilir. Bu, video paketlerine dokunmadan sadece container formatını (TS’den MP4’e) değiştirir. - Sonuç: 1080p kalitesinde kayıpsız video, kullanıcının tarayıcısındaki RAM’de sadece birkaç saniyede oluşturulur.
Performans Optimizasyonları: Hız ve Güvenilirliği Artırmak
Eşzamanlı İndirme Kontrolü
500 segmenti tek tek indirmek hem yavaş hem de verimsizdir. Tüm segmentlere aynı anda erişmeye çalışmak ise Naver’ın CDN’i tarafından hız sınırlamasına yol açabilir. Bu sorunu çözmek için Eşzamanlı İndirme Havuzu adı verilen bir sistem geliştirdik:
// Örnek eşzamanlı indirme mantığı
async function downloadWithPool(urls, limit) {
const pool = new Set();
for (const url of urls) {
if (pool.size >= limit) {
await Promise.race(pool);
}
const promise = fetchSegment(url).then(() => pool.delete(promise));
pool.add(promise);
}
}Bu yapı sayesinde, 5-10 arası paralel indirme gerçekleştirerek hem bant genişliğinden maksimum verim alır hem de hız sınırlamasından kaçınırız.
Sıra Doğrulama Katmanı
HLS segmentleri, .m3u8 dosyasında belirtilen sıraya göre birleştirilmelidir. Tek bir segmentin eksik olması bile ses ve video senkronizasyonunu bozar. Bu nedenle, Sıra Doğrulama Katmanı adı verilen bir mekanizma ekledik:
- Başarısız olan segmentleri otomatik olarak yeniden indirir.
- Segmentlerin doğru sırada olup olmadığını kontrol eder.
- Son birleştirme işleminden önce tüm verilerin tam olarak hizalandığından emin olur.
Sonuç: Gizlilik ve Hıza Odaklanan Mühendislik
Naver gibi karmaşık bir platform için indirme aracı geliştirmek, modern web mimarisinin bir masterclass’ıdır. Node.js proxyleri, HLS analizleri ve WebAssembly’in birleşimiyle, hem hızlı hem de sunucu yükünden bağımsız, gizliliğe önem veren bir araç ortaya çıkardık.
Naver içeriklerini orijinal 1080p kalitesinde indirmek için geliştirmiş olduğumuz aracı kullanabilirsiniz. Tüm işlem modern web standartlarıyla tarayıcı içinde gerçekleşir ve herhangi bir kurulum gerektirmez.
Teknik Ayrıntılar:
- Orijinal Kalite: Yeniden sıkıştırma yapılmaz; video akışı olduğu gibi kopyalanır.
- WASM Gücü: Birleştirme işlemi tamamen tarayıcıda, yerel olarak gerçekleştirilir.
- Kolay Kullanım: Tarayıcı tabanlıdır ve ek yazılım gerektirmez.
HLS analizi veya WebAssembly hakkında sorularınız varsa, yorum bölümünde tartışabiliriz.
Yapay zeka özeti
Naver’dan video indirmek için HLS protokolü, dinamik tokenlar ve WebAssembly kullanarak nasıl kayıpsız ve yüksek performanslı bir indirme aracı geliştirilir? Ayrıntılı mühendislik rehberi.