DEV Community

yqqwe
yqqwe

Posted on

Pinterest Medya Yığınını Çözümlemek: Async I/O ve FFmpeg ile Yüksek Performanslı Bir Çıkarma Motoru İnşa Etmek

Giriş

Yazılım geliştiriciler olarak, küresel ölçekteki platformların devasa multimedya verilerini nasıl yönettiği ve dağıttığı bizi her zaman büyülemiştir. Pinterest, mühendislik perspektifinden bakıldığında; sadece bir görsel pano sitesi değil, farklı ağ koşullarına uyum sağlamak için tasarlanmış, HLS (HTTP Live Streaming) ve adaptif bit hızı (ABR) teknolojilerini kullanan karmaşık bir içerik dağıtım sistemidir.
Ancak, arşivleme araçları veya platformlar arası kaynak çıkarıcılar geliştiren mühendisler için Pinterest'in "kapalı bahçesi"—özellikle dinamik render yapısı ve parçalı medya protokolleri—ciddi bir teknik engel teşkil eder. Bu boşluğu doldurmak amacıyla, Pinterest Video Downloader projesini geliştirdim.
Bu yazıda, teknik "kara kutunun" içine bakacağız: Pinterest meta veri yapılarının tersine mühendisliğinden, gerçek zamanlı HLS akış birleştirmeye ve geleneksel darboğazları aşan sunucu tarafı veri hattı (pipeline) mimarisine kadar tüm süreci inceleyeceğiz.

1. Pinterest Medya Mimarisinin Derinlikleri

Pinterest, videoları basit bir statik MP4 bağlantısı olarak sunmaz. Kesintisiz bir oynatma deneyimi sağlamak için HLS teknolojisini kullanırlar.
1.1 Pin Kimliğinden Medya Haritalamaya
Bir kullanıcı bir Pin URL'si girdiğinde, sistem ilk olarak ağır şekilde karartılmış (obfuscated) bir HTML ön ucuyla karşılaşır. Pinterest verilerini birkaç farklı yolla enjekte eder:
• JSON-LD Enjeksiyonu: SEO için temel meta verileri içerir.
PWS_DATA Komut Dosyası Bloğu: Bu, en kapsamlı medya kaynağı bilgilerini içeren Redux durum ağacının (state tree) çekirdeğidir.
Mühendislik Zorluğu: 1080p veya 4K gibi yüksek çözünürlüklü versiyonlar, genellikle dinamik olarak değişen iç içe geçmiş nesnelerin derinliklerine gömülüdür. Mevcut en yüksek bit hızına sahip kaynağı tanımlamak için bu React durum ağaçlarını dinamik olarak eşleyen bir Schema Parser geliştirdik.

2. Çekirdek Arka Uç Mimarisi: Asenkron I/O Gücü

Küresel talepleri minimum gecikmeyle karşılamak için Pinterest Downloader arka ucu, geleneksel bloklamalı (blocking) istek modelini terk ederek tam bir Python Asyncio + FastAPI + Redis yığınına geçiş yaptı.
2.1 Asenkron İstek Zinciri
Geleneksel sunucu tarafı indirme stratejileri "Önce İndir, Sonra İlet" modelini izler; bu da bellek ve bant genişliği açısından büyük bir israftır. Biz bir Streaming Pipe (Akış Hattı) uyguladık:
• Bloklamasız Çözümleme: Bir istek geldiğinde, motor işçiyi (worker) hemen serbest bırakır ve bir olay döngüsü (event loop) aracılığıyla uzak CDN yanıtını bekler.
• Sıfır Depolama Hattı: Pinterest CDN'inden gelen veriler bellekten "parçalar" (chunks) halinde geçer ve gerçek zamanlı olarak uç kullanıcıya iletilir.
Teknik Metrik: Bu mimari, sunucu bellek yükünü %85'ten fazla azaltır ve İlk Bayt Süresini (TTFB) 200 ms'nin altındaki seviyelere çeker.

3. HLS Segmentlerini Yönetmek ve Akış Sentezi

Pinterest'in yüksek kaliteli kaynakları genellikle .m3u8 çalma listeleri olarak dağıtılır. Bir web indirme aracı için kullanıcıya m3u8 bağlantısı vermek yararsızdır; son kullanıcının tek bir MP4 dosyasına ihtiyacı vardır.
3.1 Gerçek Zamanlı Muxing Hattı
Akışları anında işlemek için çekirdek düzeyinde bir FFmpeg runtime entegre ettik:

  1. Bellek Tabanlı Segmentler: Sistem, TS (Transport Stream) segmentleri için bellekte dairesel bir tampon (circular buffer) tutar.
  2. Kayıpsız Birleştirme (Lossless Muxing): Kodlama (H.264/HEVC) standart profillerle eşleştiği sürece -c copy bayrağını kullanırız. Bu, pikselleri yeniden hesaplamadan konteyneri (TS'den MP4'e) değiştirir; bu işlem CPU dostudur ve neredeyse anında gerçekleşir.
  3. Paralel Getirme: Bir coroutine havuzu kullanarak, sistem düzinelerce TS segmentini eş zamanlı olarak getirir ve 5 dakikalık bir videonun sentezini saniyeler içinde tamamlar.

4. Rate Limiting ve WAF Atlatma Yönetimi

Pinterest, yüksek frekanslı kazımayı (scraping) önlemek için katı bir Web Uygulama Güvenlik Duvarı (WAF) kullanır.
4.1 Akıllı Yönlendirme ve TLS Parmak İzi
%99,9 çalışma süresini korumak için kendi kendini onaran bir proxy katmanı tasarladık:
• Parmak İzi Simülasyonu: Gerçek bir tarayıcı davranışını taklit etmek için TLS parmak izlerini ve HTTP/2 çerçeve özelliklerini simüle ederek temel bot algılama mekanizmalarını baypas ediyoruz.
• Dağıtık Oturum Yönetimi: Redis kümeleri kısa ömürlü kimlik bilgilerini depolayarak, Pinterest API'lerine yönelik tekrarlanan ve şüpheli görünen kimlik doğrulama çağrılarını azaltır.

5. Ön Uç Optimizasyonu: Utility-First Felsefesi

Dev.to okuyucuları, yığının her iki ucunda da performansa değer verir.
• Tailwind CSS Entegrasyonu: Son derece hafif bir stil katmanı, İlk İçerikli Boyama (FCP) süresinin 0,5 saniyenin altında olmasını sağlar.
• PWA Desteği: Site bir Progresif Web Uygulamasıdır (PWA). Kullanıcılar, gerçek bir kurulum paketinin yükü olmadan yerel uygulama hissi için siteyi masaüstlerine "yükleyebilirler".
• Sıfır JS Ayrıştırma: Tüm karmaşık mantık sunucu tarafında kapsüllenmiştir. Ön uç, düşük kaliteli mobil cihazlarla bile uyumluluk sağlayarak ince bir istemci (thin client) görevi görür.

6. Sonuç ve Proje Geleceği

Yüksek performanslı bir Pinterest Video Downloader inşa etmek, basit bir API çağrısından çok daha fazlasıdır; modern protokolleri anlama, ağ I/O yönetimi ve kaynak orkestrasyonu üzerine bir mühendislik egzersizidir. Dağıtım mantığını optimize ederek ve asenkron bir arka uçtan yararlanarak, neredeyse anında 4K kaynak çıkarımı elde ettik.
Eğer siz de Pinterest medya varlıklarını arşivlemek için temiz, reklamsız ve teknik olarak sağlam bir yol arayan bir geliştiriciyseniz, aracımızı keşfetmekten ve test etmekten çekinmeyin.
👉 Proje URL'si: Pinterest Video Downloader (Türkçe Versiyon)
Teknik Yığın Özeti:
• Arka Uç: Python / FastAPI / Redis / FFmpeg
• Çekirdek: Async Coroutine Pool + Gerçek Zamanlı HLS Muxing Motoru
• Mimari: Docker Mikro Hizmetleri
• Ön Uç: HTML5 / Tailwind CSS / Vanilla JS / PWA
• Altyapı: Cloudflare / Nginx
HLS yönetimi veya büyük ölçekli kazıyıcı mimarileri hakkındaki düşünceleriniz neler? Yorumlarda tartışalım!

WebDev #Pinterest #Python #OpenSource #Programming #VideoStreaming #DevTools #SoftwareArchitecture #TurkishDevelopers

Top comments (0)