DEV Community

yqqwe
yqqwe

Posted on

LinkedIn Video Akış Mimarisi Analizi: HLS ve FFmpeg ile Yüksek Performanslı Video Çıkarma Motoru Oluşturmak

Giriş

Bir yazılım geliştirici olarak, devasa platformların medya verilerini ölçeklenebilir bir şekilde nasıl dağıttığını anlamak her zaman büyüleyici bir uğraştır. Dünyanın en büyük profesyonel sosyal ağı olan LinkedIn, bu konuda harika bir vaka çalışması sunuyor. Platformun medya dağıtım altyapısı, basit statik MP4 bağlantılarından, modern ve karmaşık bir Dinamik Uyarlamalı Akış (DASH/HLS) mimarisine evrildi.
Birçok mühendis ve içerik üreticisi için LinkedIn'deki yüksek kaliteli video kaynaklarını arşivlemek teknik bir ihtiyaçtır. Ancak, bunu verimli bir şekilde yapmanın önündeki teknik engeller artık her zamankinden daha yüksek. Bu sorunu çözmek amacıyla geliştirdiğim LinkedIn Video İndirici projesinin arka planındaki mühendislik zorluklarını bu makalede soyutlayacağız: HLS protokolü tersine mühendisliği, Guest Token kimlik doğrulama döngüleri ve sunucu tarafında kayıpsız muxing.

1. Medya Dağıtımının Evrimi: MP4'ten HLS'ye

Web'in ilk günlerinde video indirmek önemsiz bir işti: Bir

  1. Master Playlist: Farklı çözünürlükler (örneğin 480p, 720p, 1080p) için alt oynatma listelerini içerir.
  2. Media Playlist: Belirli bir çözünürlük için video segmentlerinin sırasını listeler. Her segment genellikle 2 ila 4 saniye uzunluğundadır. Teknik Zorluk: Çıkarma motorumuz, m3u8 ağaç yapısını özyinelemeli (recursive) olarak analiz etmeli, kullanıcının düşük bant genişliğine sahip bulanık bir sürüm yerine en iyi orijinal kaliteyi almasını sağlamak için En Yüksek Bit Hızı (Highest Bitrate) yolunu otomatik olarak tanımlamalı ve izole etmelidir.

2. Tersine Mühendislik: Guest Token Kimlik Doğrulama Engelini Aşmak

LinkedIn, medya API'leri için çok katmanlı bir kimlik doğrulama bariyeri uygular. Standart bir curl komutuyla dahili medya API'lerine istekte bulunmaya çalışırsanız, muhtemelen 401 Unauthorized veya 403 Forbidden hatasıyla karşılaşırsınız.
Guest Token Mekanizması
LinkedIn web istemcisi, erişim için iki ana belirteç (token) türüne dayanır:
• Bearer Token: Platformun JavaScript paketleri içinde sabit kodlanmış (hardcoded) statik bir belirteç.
• Guest Token: activate.json uç noktası üzerinden alınan dinamik bir belirteç.
Uygulama: Backend sistemimiz, kendi kendini iyileştiren bir oturum havuzu (self-healing session pool) yönetir. Belirteç süresinin dolması veya hız sınırlaması (rate limit) nedeniyle bir istek başarısız olduğunda, motor yeni bir bağlam elde etmek için modern bir tarayıcının "aktivasyon akışını" otomatik olarak simüle eder. Bu, anti-bot sistemleri tarafından işaretlenmeyi önlemek için minimum düzeyde tarayıcı parmak izi (fingerprinting) emülasyonunu içerirken, yüksek frekanslı kullanım için yeterince hafif kalmayı başarır.

3. Arka Plan Mimarisi: Async I/O ile Yüksek Eşzamanlılık

Küresel trafiği desteklemek için linkedin_downloader_tu backend birimi, geleneksel bloklamalı (blocking) istek modelleri yerine tam bir Python Asyncio + Httpx yığınını benimser.
Neden Asenkron?
Video çıkarma işlemi temelde bir I/O-bound (Giriş/Çıkış odaklı) görevdir. Tek bir kullanıcı isteği şunları içerir:

  1. Meta veriler için LinkedIn gönderi HTML'inin ayrıştırılması.
  2. Medya yapılandırmaları için GraphQL veya dahili REST uç noktalarının sorgulanması.
  3. Çok seviyeli m3u8 dosyalarının ağ üzerinden özyinelemeli olarak getirilmesi. Senkron bir modelde, bir çalışan süreç (worker) ağ yanıtlarını beklerken boşta kalacaktır. asyncio ile tek bir süreç binlerce eşzamanlı çıkarma görevini yönetebilir, bu da sunucu donanım maliyetlerini radikal bir şekilde düşürür ve yanıt süresini hızlandırır.

4. Sunucu Tarafı İşleme: FFmpeg ile Kayıpsız Muxing

Tüm HLS segmentlerini analiz ettikten sonra, kullanıcıya tek bir MP4 dosyası sunmamız gerekir. Kullanıcıdan yüzlerce küçük TS parçasını manuel olarak indirmesini istemek felaket bir kullanıcı deneyimi (UX) olurdu.
Stream Copying (Akış Kopyalama) vs. Transcoding (Kod Dönüştürme)
Gerçek zamanlı muxing (birleştirme) işlemi için işlem hattımıza FFmpeg entegre edilmiştir. Buradaki kritik optimizasyon Stream Copying kullanımıdır:
Bash
ffmpeg -i "concat:segment1.ts|segment2.ts|..." -c copy -map 0✌️0 -map 1🅰️0 cikis.mp4
Teknik İçgörü: -c copy bayrağı işin püf noktasıdır. FFmpeg'e, alttaki piksellere dokunmadan veri paketlerini yalnızca TS kapsayıcısından MP4 kapsayıcısına "taşımasını" söyler. Bu, işlemi neredeyse anlık hale getirir ve CPU yoğunluklu yeniden kodlama olmadan %100 orijinal kalite ile sonuçlanır.

5. Front-End Optimizasyonu: Verimlilik Odaklı UX

Web arayüzü "Utility-First" (Önce Fayda) felsefesiyle tasarlanmıştır:
• Vanilla JS: 1 saniyenin altında bir İlk İçerikli Boyama (FCP) süresi sağlamak için ağır framework'lerden kaçındık.
• PWA Desteği: Site, bir Aşamalı Web Uygulaması olarak yüklenebilir; mobil ve masaüstünde yerel bir uygulama hissi verir.
• API Güvenliği: Tüm işlemler sunucuda gerçekleşir, yani kullanıcıların gizliliklerini tehlikeye atabilecek riskli tarayıcı uzantıları yüklemelerine gerek kalmaz.

6. Etik ve En İyi Uygulamalar

Böyle bir araç oluşturmak, fayda ve uyumluluk arasında bir denge gerektirir:
• Gizlilik Önceliği: Kullanıcıların video dosyalarını kalıcı olarak saklamıyoruz. Geçici veriler, teslimattan hemen sonra silinir.
• Rate-Limit Yönetimi: Motorumuzun LinkedIn altyapısına gereksiz yük bindirmemesini sağlamak için dahili kuyruklama (queuing) mekanizmaları uyguluyoruz.

Sonuç

Yüksek performanslı bir indirici oluşturmak, sadece bir scraping görevi değildir; modern web protokollerini, API tersine mühendisliğini ve verimli sunucu tarafı medya işlemeyi anlama egzersizidir. HLS ayrıştırma mantığını optimize ederek ve asenkron backend mimarileri kullanarak sorunsuz bir 1080p çıkarma deneyimi elde ettik.
LinkedIn üzerindeki değerli seminer videolarını veya profesyonel içerikleri arşivlemek için temiz, reklamsız ve teknik olarak sağlam bir yöntem arayan bir geliştiriciyseniz, aracımızı deneyebilirsiniz.
👉 Proje Bağlantısı: LinkedIn Video İndirici (Türkçe Versiyon)
Teknoloji Yığını Özeti:
• Backend: Python / Django / Redis / FFmpeg
• Mimari: Asyncio / Dağıtık Tarama Mantığı
• Frontend: HTML5 / Tailwind CSS / Vanilla JS
• Altyapı: Cloudflare / Docker / Nginx
HLS ayrıştırma veya FFmpeg muxing hakkında sorularınız mı var? Yorumlarda teknik detayları tartışalım!

WebDev #LinkedIn #Python #OpenSource #Programming #VideoStreaming #DevTools #TurkishDevelopers

Top comments (0)