Bir video kurgucusunun çalışma masasında en tahammül edemeyeceği şey, yaratıcı sürecin teknik hantallıklarla ve öngörülemeyen dosya uyumsuzluklarıyla kesintiye uğramasıdır. Saatlerce timeline üzerinde kurgu yaparken internetten indirdiğiniz bir referans sahneyi ya da ses efektini Adobe Premiere Pro veya After Effects içerisine sürüklediğinizde karşılaştığınız o meşhur "ses var ama görüntü simsiyah" tablosu, aslında modern web yayıncılığı ile profesyonel kurgu yazılımları arasındaki derin codec uçurumunun bir sonucudur.

Web platformları (özellikle YouTube), kendi bant genişliklerini korumak adına içerikleri AV1 veya VP9 formatlarında paketleyip sunmayı sever. Ancak profesyonel montaj istasyonları bu sıkıştırma standartlarını timeline üzerinde yerel olarak işlerken çoğu zaman tekler, kare atlar ya da doğrudan siyah ekran verir. Kurgucunun aradığı şey bellidir: H.264 video, AAC ses ve 8-bit yuv420p piksel formatında, doğrudan zaman çizgisine atıldığında anında tepki veren kararlı bir MP4.

İşte MediaPull, tam olarak bu ihtiyacın bir ürünü olarak doğdu: Windows platformunda çalışan, hem YouTube hem de X (Twitter) üzerinden tek tıkla doğrudan kurgu masasına hazır (editor-ready) medya indiren Electron tabanlı bir masaüstü aracı. Ücretsiz sürümünde tavizsiz 1080p, Pro sürümünde ise 4K H.264, Apple ProRes ve stüdyo standardı WAV çıktıları sunmayı hedefliyor.

Fakat kağıt üzerinde harika duran her yazılım gibi, MediaPull’un da mutfağı bir gecede tertemiz bir fabrikaya dönüşmedi. Projenin 2.4.0 sürümünden 2.4.1 fix sürümüne uzanan süreç; kök dizin karmaşasıyla başlayan bir mimari temizlik, YouTube'un değişen kurallarıyla patlak veren 403 krizleri ve 4K indirmelerin yanlış format zincirine kurban gitmesiyle geçen hummalı bir refactor maratonuna sahne oldu.


1. İlk Cephe: Kök Dizin Kirliliği ve Modüler Mimarinin İnşası

Geliştirme sürecinin ilk aşamalarında hız kazanmak adına yapılan geçici hamleler, proje büyüdükçe teknik borç (technical debt) olarak geri döner. MediaPull’un kök dizini bir noktada tam bir savaş alanına dönmüştü: Kök klasöre gelişigüzel saçılmış main.js, preload.js, test amaçlı index.html dosyaları, farklı boyutlardaki ikon varyasyonları... Hangi kod parçasının derlemeye girdiği, hangi scriptin aktif olduğu belirsizleşmişti. Dahası, geliştirme ortamına ait hassas OAuth client_secret dosyalarının kök dizinde unutulma riski, sürüm kontrol sistemi açısından ciddi bir güvenlik açığı teşkil ediyordu.

İlk operasyon, projeyi endüstri standardı modüler bir Electron mimarisine kavuşturmak oldu:

mediapull/
├── assets/
│   └── icons/          # Platform ikonları (ico, png)
├── docs/               # Sürüm kayıtları
├── scripts/            # Build yardımcıları
├── src/
│   ├── main/           # Electron main process
│   ├── preload/        # IPC köprüsü
│   └── renderer/       # Arayüz ve UI bileşenleri
├── dev.bat             # Geliştirme başlatıcı
├── build-setup.bat     # Paketleme scripti
└── package.json

Bu yapılandırmayla birlikte:

  • package.json içerisindeki main giriş noktası src/main altındaki ilgili modüle yönlendirildi.
  • electron-builder yapılandırmasındaki NSIS yükleyici scriptleri ve ikon yolları senkronize edildi.
  • Hassas anahtarlar kök dizinden tamamen tecrit edildi, .gitignore katı kurallarla güncellenerek hassas verilerin sızması engellendi. Kök dizinde yalnızca projenin kimliğini temsil eden dosyalar bırakıldı.

2. Kırılma Noktası: YouTube / yt-dlp Krizleri ve 403 Kuşatması

Mimari toparlanırken dış dünyadan ilk darbe geldi. Kullanıcılar bir anda indirme butonuna bastıklarında 403 Forbidden: Video akışı reddedildi hatasıyla karşılaşmaya başladılar. Sorun yalnızca indirmelerin durmasıyla da kalmıyordu; arayüzdeki çözünürlük seçici de saçmalıyor, 1080p seçildiğinde kullanıcının önüne çamur gibi bir 360p video düşüyordu.

Krizin Arka Planı: Player Client Zinciri ve DASH Gerçeği

YouTube'un medya akışlarını çekmek için arka planda endüstri standardı olan yt-dlp motorunu kullanıyoruz. Ancak YouTube, bot tespit algoritmalarını sıkılaştırdıkça standart istemci isteklerini doğrudan 403 ile cezalandırmaya başladı.

Yaptığımız analizde iki kritik aksaklık tespit ettik:

  1. Basit mobil web (mweb) veya genel web istemcileri üzerinden sorgu atıldığında, YouTube botları atlatmak için kasti olarak tek parça (progressive) format 18'i (360p) sunuyor, yüksek çözünürlüklü DASH akışlarını gizliyordu.
  2. Gerçek 1080p ve 4K videolar ise görüntü ve sesin ayrı ayrı tutulduğu DASH (Dynamic Adaptive Streaming over HTTP) formatında barındırılıyordu ve bunu çekmek için doğru player client kimliğiyle istek atmak şarttı.

Çözüm olarak çok katmanlı bir Player Client Yedekleme Zinciri (Fallback Pipeline) kurduk. İstek mekanizması doğrudan tek bir kapıya yüklenmek yerine kademeli bir protokol izledi:

default ➔ web_creator ➔ web_embedded ➔ android_vr ➔ mweb fallback

Eğer varsayılan istemci 403 alırsa, sistem arka planda kullanıcıya hissettirmeden YouTube Studio içerik üretici istemcisine (web_creator) veya gömülü oynatıcıya (web_embedded) geçiş yapıyor; bu da başarısız olursa Android VR arayüzünü taklit ederek DASH manifestosunu başarıyla çekiyordu.

Ayrıca YouTube'un istemci tarafında çalıştırdığı karmaşık JavaScript doğrulamalarını (JS challenge) yerel ortamda çözebilmek adına mimariye Deno ve uzaktan bileşen desteği entegre edildi. Son adım olarak, olası bir engine kilitlenmesinde otomatik yt-dlp binary güncellemesi tetikleyen bir retry döngüsü oluşturuldu. 403 barikatı böylece aşıldı.


3. "Sözde 4K" Tuzağı: Çözünürlük Matrisinin Ayrıştırılması

403 krizini çözdüğümüzü düşündüğümüz gün, Pro kullanıcılarından ilginç bir geri bildirim geldi: "Interstellar fragmanını 4K seçip indiriyorum, dosya iniyor ama dosya özelliklerinde çözünürlük 1920x1080 görünüyor."

Sorunu incelediğimizde format seçim mantığındaki mantıksal bir öncelik hatasını fark ettik. MediaPull’un temel vaadi kurgu dostu H.264 (avc1) üretmek olduğu için, kod tabanındaki format seçici kural tablosunda önce vcodec^=avc1 arıyordu.

YouTube ise bant genişliği optimizasyonu sebebiyle 1080p üzerindeki çözünürlüklerde (2K, 4K) neredeyse hiçbir zaman yerel H.264 stream saklamaz. YouTube'daki bir 4K video ya VP9 ya da AV1 codec'i ile kodlanmıştır. Format zincirimiz önce H.264 aradığı için, 4K talebinde bile YouTube'un sunduğu en yüksek H.264 akış olan 1080p'ye kilitleniyor, gerçek 4K akışları (VP9/AV1) görmezden geliyordu.

Bu hatayı gidermek için format seçim mimarisini iki bağımsız pipeline'a böldük:

  • 1080p ve Altı Modu: Öncelikle yerel H.264 (avc1) akışını hedefler. Varsa yeniden kodlamaya (encode) gerek kalmadan akışı doğrudan alır.
  • 4K (2160p) Modu: Codec kısıtlamasını ilk aşamada kaldırır; önce çözünürlüğü <= 2160p olan mutlak en yüksek kaliteli video stream'ini (VP9 veya AV1 olsa dahi) yakalar. Ardından bu yüksek kaliteli kaynak, bir sonraki aşamada hedeflediğimiz H.264 konteynerine dönüştürülür.

4. Dönüşüm Mühendisliği: Render Süresi, Kalite ve Timeline Kararlılığı

4K akışı indirmek işin yarısıydı; asıl mesele o devasa VP9/AV1 dosyasını kurgu yazılımının içine atıldığında teklemeden oynatacak bir MP4 haline getirmekti. Burada "her şeyi baştan encode et" yaklaşımı hem CPU'yu tüketir hem de kullanıcıyı dakikalarca bekletir. Bu sebeple Akıllı Çıktı (Smart Remux/Encode) motorunu devreye aldık:

indirilen_akis:
  video:
    avc1_h264: "Copy (Remux)"
    vp9_av1: "NVENC / libx264 (Encode)"
  ses:
    aac: "Copy (Doğrudan Kopyala)"
    opus: "AAC 320k (Encode)"

Remux vs. Encode Ayrımı

  • Remux (Yeniden Paketleme): Eğer indirilen video kaynağı zaten H.264 ve ses AAC ise, tek bir piksel bile yeniden işlenmez. FFmpeg dosyayı birkaç saniye içinde sadece kap (container) değiştirerek MP4 içine kopyalar (-c copy). Sıfır kalite kaybı, sıfır işlemci yükü.
  • Hibrit Kopyalama: Video H.264 ancak ses YouTube'un standart Opus formatındaysa; video akışı doğrudan kopyalanır (-c:v copy), yalnızca ses akışı kurgu dostu AAC standardına dönüştürülür.
  • Zorunlu Encode: Kaynak VP9 veya AV1 ise dönüştürme kaçınılmazdır. Burada sistemde NVIDIA GPU varsa NVENC (h264_nvenc) devreye girerek yüksek kalite profilleriyle (p5/p7) saniyeler içinde işi bitirir. GPU yoksa libx264 superfast preset'i ile optimize edilmiş bir CPU dönüşümü yapılır.

Açık ve dürüst bir parantez: Sihirli bir değnek yok. Eğer elinizdeki kaynak 4K VP9 ise ve güçlü bir donanım ivmelendirmeniz (GPU) bulunmuyorsa, dosyanın H.264'e dönüştürülmesi CPU üzerinde belirli bir süre alacaktır. MediaPull'un yaptığı şey gereksiz dönüşümleri sıfıra indirmek ve zorunlu dönüşümleri donanımın izin verdiği maksimum hızda yapmaktır.

Kurgu Yazılımı Kilitlenmelerine Karşı "Faststart" ve CFR Tahkimi

Yalnızca dosyayı H.264 yapmak yetmiyordu. Premiere Pro veya VLC'de dosyanın sonuna doğru sararken donmalar, ses-görüntü senkron kaymaları yaşanabiliyordu. Bunun önüne geçmek için FFmpeg parametrelerimize şu kurumsal standartları ekledik:

  1. -movflags +faststart: MP4 dosyalarındaki meta veriyi (moov atom) dosyanın en sonundan alıp en başına taşır. Böylece kurgu programı veya medya oynatıcı tüm 4 GB'lık dosyayı taramak zorunda kalmaz, timeline'a atıldığı an ilk kareyi ekrana basar.
  2. Sabit Kare Hızı (CFR): Web videolarının en büyük belası olan Değişken Kare Hızını (VFR) dizginleyerek kurgu programlarında sesin önden veya arkadan gitmesini engeller.
  3. Kısa GOP (Group of Pictures) ve Mantıklı Bitrate Tavanı: Hızlı sarma işlemlerinde arama karelerini sıklaştırarak timeline fırçalamayı (scrubbing) tereyağı kıvamına getirir.
  4. Artık Dosya Hijyeni: İndirme esnasında arkada kalan .f270.mp4 gibi ara DASH parçaları, indirme bittiği an --no-keep-video bayrağı ve dahili dosya temizleme rutini ile diskten silinir; kurgucunun sabit diski çöp dosyalarla doldurulmaz.

5. Dağıtım ve Derleme Mücadelesi: v2.4.1 Yama Sürümü

Kod düzeyindeki sorunları çözdükten sonra Windows ekosisteminin klasik derleme kilitlenmeleri baş gösterdi. electron-builder çalışırken özellikle dist/app.asar dosyası üzerinde işletim sisteminin koyduğu EBUSY: resource busy or locked hatası, standart rimraf temizlik komutlarını kilitliyordu.

Bu sorunu aşmak için:

  • Her derlemede kilitli dizinleri zorlamak yerine zaman damgalı alternatif çıktı yolları (dist-build-*) üreten ve süreç bitiminde kilit kalkınca temizlik yapan akıllı bir derleme hattı kuruldu.
  • Geliştirme döngüsünü hızlandırmak adına kök dizine tek tıkla geliştirme sunucusunu ayağa kaldıran dev.bat ve dağıtım paketini hazırlayan build-setup.bat scriptleri bağlandı.

Tüm bu YouTube player güncellemeleri, format zinciri ayrıştırmaları ve kütüphane revizyonları yeni bir özellik paketi değil, doğrudan bir istikrar hamlesi olduğu için sürüm numarası 2.4.0'dan doğrudan bir fix sürümü olan 2.4.1'e güncellendi.


Sonuç: Sahada Test ve v2.4.1'in Getirdikleri

Somut bir örnekle özetleyelim: Diyelim ki bir kurgucu The Office dizisinden kısa bir diyalog klibini veya YouTube'daki yüksek kaliteli bir belgesel sekansını timeline'ına çekmek istiyor.

  • Önceki senaryoda: Sıradan bir indiriciyle çekilen video, Premiere Pro'ya atıldığında ya siyah ekran veriyor ya da kullanıcı farkında olmadan 360p indirilmiş çamur gibi bir görüntüyle karşılaşıyordu.
  • MediaPull v2.4.1 ile: Link yapıştırıldığı an arka planda en doğru YouTube istemcisi devreye giriyor, 1080p seçildiğinde doğrudan H.264 akışı bulunup saniyeler içinde remux ediliyor. Pro kullanıcıları 4K talep ettiğinde ise video kaliteden ödün vermeden yakalanıp NVENC hızlandırmasıyla montaja hazır bir MP4 veya ProRes formatına çevriliyor.

v2.4.1 ile Neler Değişti?

  1. Sıfır 403 Hatası: Akıllı YouTube fallback zinciri sayesinde indirmeler kesintiye uğramaz.
  2. Gerçek 4K Desteği: 4K modunda 1080p'ye düşme hatası tamamen giderildi.
  3. Kurgucu Dostu Çıktı: Faststart bayraklı, CFR uyumlu, siyah ekran vermeyen H.264/AAC MP4 standardı tam güvenceye alındı.

Yasal bir not olarak belirtmek gerekir ki MediaPull, kullanıcıların yalnızca telif haklarına sahip oldukları ya da adil kullanım (fair use) kapsamında eğitim ve kurgu amacıyla yararlandıkları içerikleri yerel iş akışlarına dahil etmeleri prensibiyle tasarlanmıştır.

Projeyi denemek ve kurgu iş akışınızı hızlandırmak isterseniz güncel sürüme media-pull.vercel.app üzerinden ulaşabilir, 4K H.264, ProRes ve WAV kabiliyetleri sunan Pro lisansını Gumroad üzerinden temin edebilirsiniz.