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