2019'da ilk broadcast otomasyon scriptimi yazdığımda Python'u seçmemdeki neden basitti: başka bir şey bilmiyordum. Şimdi geriye bakınca, bilinçsizce doğru kararı verdiğimi görüyorum.

Broadcast'te Python Neden Mantıklı?

Broadcast ortamında iş arkadaşlarınız yazılım mühendisi değil. Sistem operatörleri, yayın mühendisleri, editörler. Yazdığınız kodu birisinin bakımını yapabilmesi lazım.

Python bu açıdan kazanıyor:

  • Düz, okunabilir syntax
  • Kütüphane ekosistemine kolayca erişim
  • API istemcisi olarak mükemmel
  • Hata mesajları anlaşılır

JavaScript veya Go daha hızlı olabilir. Ama sabah 3'te sistem çöküğünde kodu okuyacak kişi muhtemelen siz değilsiniz.

Temel Kütüphane Seti

Broadcast projelerinde sürekli döndüğüm kütüphaneler:

requests          # HTTP API çağrıları — haber ajansı beslemeleri, REST endpoint'ler
paramiko          # SSH üzerinden uzak sistem kontrolü
schedule          # Cron alternatifi, daha okunabilir
watchdog          # Klasör değişikliklerini izle (hot folder sistemi)
ffmpeg-python     # Transcode, remux, probe işlemleri
pymysql / psycopg2 # Veritabanı bağlantıları
plumbum           # Shell komutlarını Python içinde çalıştır

Gerçek Bir Örnek: Hot Folder Sistemi

TV24'te kurduğumuz hot folder sistemi şu sorunu çözüyordu: yapım ekibi dosyayı bir klasöre atıyor, sistem otomatik olarak transcoding yapıyor, metadata ekliyor, MAM'a ingest ediyor.

from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import ffmpeg
import time

class HotFolderHandler(FileSystemEventHandler):
    def on_created(self, event):
        if event.is_directory:
            return
        
        src = event.src_path
        
        # Dosya yazımının bitmesini bekle
        self.wait_for_stable_size(src)
        
        # Probe et
        probe = ffmpeg.probe(src)
        duration = float(probe['format']['duration'])
        
        if duration < 5:
            print(f"Çok kısa dosya atlandı: {src}")
            return
        
        # Transcode → MAM destinasyon
        dest = self.build_destination(src)
        self.transcode(src, dest)
        self.notify_mam(dest, probe)

    def wait_for_stable_size(self, path, interval=2, retries=10):
        """Dosya hâlâ kopyalanıyor mu diye kontrol et."""
        last_size = -1
        for _ in range(retries):
            size = os.path.getsize(path)
            if size == last_size:
                return
            last_size = size
            time.sleep(interval)

wait_for_stable_size olmadan sistem yarım dosyaları işlemeye çalışır. Bu tuzağa ilk haftada düştüm.

Üretim Ortamında Dikkat Edilmesi Gerekenler

1. Log Her Şeyi

Broadcast ekibine "sistem çalışıyor" demek yetmez. Ne yaptığını, ne zaman yaptığını, neden dur durdu — hepsini log'lamanız lazım.

import logging

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s [%(levelname)s] %(message)s',
    handlers=[
        logging.FileHandler('/var/log/broadcast-auto/hotfolder.log'),
        logging.StreamHandler(),
    ]
)

2. Her Hatayı Sessizce Geçme

# YANLIŞ:
try:
    process_file(path)
except Exception:
    pass  # Sessiz ölüm

# DOĞRU:
try:
    process_file(path)
except Exception as e:
    logger.error(f"Dosya işlenemedi: {path} — {e}", exc_info=True)
    notify_on_call(f"HOT FOLDER HATA: {path}")

3. Servisi Daemonize Et

Script değil, servis olarak çalışmalı. Linux'ta systemd unit dosyası yazın. Windows'ta görev zamanlayıcı veya NSSM.


Broadcast otomasyon projeleriniz için konuşmak isterseniz: hamdidemirkan@gmail.com