Skip to content

v1.0.0 — Web arayüzü

Choose a tag to compare

@inanx12 inanx12 released this 27 Aug 23:16
· 138 commits to main since this release

Filler-Cut'ın web arayüzü geldi. fillercut ui yazın; tarayıcıda videonuzu
seçin, aracın bulduğu kesimleri kesmeden önce görün, dinleyin, düzeltin ve
onaylayın.

Bir koşu şöyle geçiyor: dosyayı sunucu taraflı gezginden seçiyorsunuz (GB'lık
video tarayıcıya yüklenmiyor, araç diskten okuyor), 6 aşamalı işleme canlı
akıyor, sonra gözden geçirme ekranında duruyor. Orada her kesim dalga
formunun üzerinde işaretli: atlamalı oynatmayla kesilmiş hâlini dinliyor,
beğenmediğiniz kesimi tek tıkla geri alıyor, sınırını sürükleyerek
düzeltiyorsunuz (tutamaç en yakın sessizliğe yapışıyor) ve aracın kaçırdığı
bir yeri kendiniz kesim olarak ekleyebiliyorsunuz. Başlıktaki satır siz
düzenledikçe "ne kadar kısalacak"ı anlık gösteriyor. Onaylayınca render
başlıyor; sonuç ekranı kazanımı, tür kırılımını (kesin/aday filler, sessizlik,
elle eklenen), kesilen filler sözcüklerinin dökümünü ve çıktı yollarını
veriyor — "Klasörde göster" ile dosyaya gidiyorsunuz.

CLI hiç değişmedi: fillercut video.mp4 akışı, çıktıları ve rapor.json
biçimi aynı. Düzenleme yapmadan onaylanan bir web koşusu, CLI'nin ürettiği
dosyanın byte-byte aynısını üretiyor (hash'le doğrulandı). Yeni runtime
bağımlılıkları yalnız fastapi + uvicorn (numpy zaten dolaylı geliyordu,
doğrudana terfi etti); npm/build adımı yok.

Bilinen sınır: işler yalnızca bellekte yaşar — sunucu yeniden başlatılırsa
kaybolurlar (arayüz bunu söyler). Üretilmiş dosyalar diskte kalır.

v1.0 UI Dilim 3 — istatistik paneli + cila

Eklendi

  • Sonuç ekranında istatistik paneli — tür kırılımı (kesin/aday filler,
    sessizlik, elle eklenen) mini çubuklarla, kesilen filler sözcüklerinin
    dökümü
    (eee ×3, ııı ×1…) ve kullanıcının kendi düzenlemelerinin
    sayıları. Panelin tek veri kaynağı yazılan rapordur; hiçbir sayı yeniden
    hesaplanmaz — ekrandaki sayı ile rapor.json'daki sayı ayrışamaz (kilit
    testte). Kelimeler reason zincirinden çıkarılır (KI-3 ailesi) ve görüntü
    formunda
    gruplanır: Eee, ile eee aynı kovaya düşer, ııı ekranda
    ii olmaz.
  • Review başlığında canlı özet — "N kesim · toplam X ms kesilecek · yeni
    süre Y (%kazanım)"; geri alma/ekleme/sürükleme sonrası anında güncellenir
    (onay öncesi kazanım önizlemesi).
  • Gezgin breadcrumb'ı — ev dizininden bulunulan klasöre kadar tıklanabilir
    parçalar. Ev'in üstü hiç listelenmez: gösterilse tıklandığında 403
    alınırdı; hapsin sınırı arayüzde de görünür (güvenlik testi her parçanın
    gerçekten açılabildiğini doğrular).
  • Koşu ekranında aşama süreleri — biten aşamada kalıcı, koşan aşamada
    canlı sayan süre. Damga sunucudadır: SSE kopup yeniden bağlanınca geçmiş
    toptan replay edilir, istemcide ölçülen süre o anda sıfırlanırdı.
  • "Klasörde göster" (çıktı/rapor/transkript) — POST /api/reveal;
    Windows'ta explorer /select,, macOS'ta open -R, Linux'ta xdg-open.
    Komut üretimi saf ve platform başına testli; kabuk kullanılmaz, yol ev
    dizini hapsinden geçer, desteklenmeyen platformda Türkçe 501.
  • Boş durum yüzeyleri — ana ekranda karşılama, video içermeyen klasörde
    ne yapılacağını söyleyen mesaj (önceki hâli yalnızca klasör de yokken
    görünüyordu; asıl sık durum "alt klasör var, video yok"tu).

Değişti

  • Pipeline hata mesajları eyleme dökülebilir hâle geldi. Her katman hatası
    artık "ne oldu" kadar "ne yapmalı"yı da söylüyor: ffmpeg PATH ipucu,
    disk/izin ipucu, encoder tercih sırası, silence_min_ms, girdi yolu.
    TRANSCRIBE ipucusu seçili backend'e göre değişir (faster-whisper'da
    model indirme/CUDA, whispercpp'de binary ve model yolu) — kullanıcı yanlış
    yere bakmasın. İstisna sınıf adı korunur (CUDA/DLL hatalarında ayırt
    edici); stack trace hiçbir yolda kullanıcıya gösterilmez. Envanter tablo
    hâlinde testlidir.

v1.0 UI Dilim 2 — review ekranı

Pipeline artık PLAN'dan sonra durur: kullanıcı kesimleri tarayıcıda
gözden geçirir, düzenler ve onaylayınca RENDER koşar. Yeni bağımlılık
YOK
(npm/build adımı yok; waveform peaks + canvas vanilla JS). numpy
dolaylı bağımlılıktan (faster-whisper/CTranslate2) doğrudan kullanıma
terfi etti — yeni paket değil, pyproject.toml'a not düşüldü.

Eklendi

  • Review ekranı — video oynatıcı + zaman çizelgesi (waveform, tür renkli
    kesim blokları, playhead) + kesim listesi (tür rozeti, aralık, süre, geri
    al/geri ver). Klavye: Space oynat/dur, ←/→ 5 sn.
  • Atlamalı oynatma (tamamen istemcide, sunucu round-trip'i yok): açıkken
    kesimler atlanır, kapalıyken orijinal kesintisiz oynar (karşılaştırma için).
  • Tek tık geri alma — kesim listeden SİLİNMEZ, aktif=false olur ve
    tek tıkla geri gelir. Elle eklenen kesimler de aynı şekilde toggle'lanır.
  • Sürüklenebilir kesim sınırları + snap-to-silence (150 ms eşik, ham
    sessizlik haritasından) ve sürükleyerek elle kesim ekleme (manuel).
  • manuel kesim türüSegmentKind/CutKind'e eklendi; kademe sayımı
    (KI-3) manuel: önekini DÖRDÜNCÜ kategori olarak tanır, mevcut üç reason
    kalıbına dokunulmadı (regresyon kilidi testte). Rapora tiers.manuel ve
    duzenleme (devre dışı / sınır değişen / elle eklenen) alanları girdi;
    ikisi de geriye uyumlu default'lu.
  • API: GET /review (kesim listesi + uygulanmış aralıklar + ham
    sessizlik haritası), POST /review/edits (overlay'in tam anlık görüntüsü),
    POST /approve, POST /cancel, GET /video (HTTP Range — seek şart),
    GET /peaks. Job durum makinesi genişledi:
    queued → running → review → rendering → done | failed | iptal.
  • "İş bulunamadı" yüzeyi (Dilim 1 bulgusu) — sunucu yeniden başlatıldıysa
    SSE sonsuza dek yeniden bağlanmaya çalışıyordu; artık durum sorulur ve 404
    ise açık bir ekran gösterilir.

Kurallar (kodda ve testte kilitli)

  • Düzenlemeler yıkıcı değil: orijinal plan hiç değişmez; kararlar ayrı bir
    overlay katmanında durur (web/review.py). Render her zaman "plan + overlay
    uygulanmış" görünümden beslenir.
  • Doğruluğun kaynağı sunucudur: istemcideki snap/clamp yalnız UX'tir; ms-int
    (float reddedilir), sınır doğrulaması, snap, min_keep clamp ve union sunucuda
    yeniden uygulanır ve saklanan değerler bunlardır.
  • Kullanıcının sürüklediği sınır padding'i EZER ve KI-5 anomali koruması
    o sınıra uygulanmaz — ikisinin de gerekçesi apply_review_edits'te yazılı.
  • min_keep clamp yalnız düzenlenmiş kesimlere uygulanır (dokunulmamış kesim
    çıpadır). Ölçülen kural: snap min_keep'i ihlal edemez — yasak bölgeye
    düşen snap iptal edilir, yoksa boşluk bırakmak isteyen kullanıcı komşu
    kesimle sessizce birleşirdi.
  • Çakışma union'la çözülür (reddetme yok), boş video yasağı onay anında
    uygulanır: plan tüm videoyu kesiyorsa onay Türkçe mesajla reddedilir ve
    pipeline beklemeye devam eder.

Düzeltildi

  • typer.Exit yutuluyordu. click'te RuntimeError türevidir, web job'ının
    genel except Exception'ı onu yakalıyordu: review'da vazgeçen kullanıcı
    UI'da "beklenmeyen hata" görürdü. Kod 0 artık temiz iptal.
  • Sunucu kapanışta asılıyordu. Review'da bekleyen worker threading.Event
    üzerindeydi ve ThreadPoolExecutor thread'leri daemon değildir — Ctrl+C
    sonrası süreç kapanmıyordu. JobKayit.kapat artık bekleyen işleri iptal eder.
  • Waveform sıfır genişlikte kayboluyordu (ekran henüz düzenlenmemişken
    çizim tuvali 1 px'e sabitliyordu) — ResizeObserver ile yeniden çizilir.

Doğrulandı (gerçek donanım — RX 9060 XT, whispercpp/Vulkan + h264_amf)

  • Test1.mp4 PLAN sonrası review'da durdu; 5 kesim tür rozetleriyle listelendi,
    video Range ile oynadı (süre 25.68 sn), 2000 binlik waveform yüklendi.
  • Düzenlemesiz onay CLI ile hash-identik (F5185E7E…9004) — Dilim 1'in
    CLI referansıyla birebir.
  • Snap: 11438 ms'e bırakılan tutamaç 11498 ms'lik sessizlik kenarına yapıştı.
    min_keep clamp: 250 ms boşluk denemesi 300 ms'e itildi, 65 ms denemesi
    komşuya değdirilip union oldu.
  • Tek kesim geri alma: kalan süre 20113 → 20543 ms (+430 ms, tam kesim süresi).
  • Elle kesim + geri alma birlikte: çıktı 19.60 sn, raporda tiers.manuel=1,
    duzenleme={devre_disi:1, sinir_degisen:0, manuel_eklenen:1}, rejected=1.
  • Atlamalı oynatma açıkken kesim atlandı (13.15 sn), kapalıyken kesimin içinde
    oynamaya devam etti (11.94 sn).
  • Her şeyi kesme denemesi: Türkçe uyarı + onay reddi, iş review'da kaldı.
  • Var olmayan job id → "İş bulunamadı" ekranı.

v1.0 UI Dilim 1 — iskelet + uçtan uca koşu

Localhost web arayüzü iskeleti + uçtan uca koşu. Yeni runtime
bağımlılıkları yalnız fastapi + uvicorn (v0.3 review server'ının
stdlib http.server'dan evrimi; şablon motoru / htmx / npm YOK — statik
HTML + vanilla JS + tek CSS). httpx yalnız dev extra'sına girdi: FastAPI
TestClient'ın zorunlu alt bağımlılığıdır, runtime'a girmez.

Eklendi

  • fillercut ui alt komutu — web arayüzünü YALNIZ 127.0.0.1'de
    başlatır (0.0.0.0 yok), portu basar, tarayıcıyı sunucu istekleri kabul
    etmeye hazır olunca açar (--port, --config, --no-browser; port
    doluysa Türkçe ön-hata). Mevcut tek-komut CLI şekli KORUNUR: dispatch
    main_entry'de argv üzerinden — ikinci bir typer komutu eklenmedi, VIDEO
    argümanı yerinden oynamadı ("ui" adında uzantısız video işlemek isteyen
    ./ui yazar).
  • src/fillercut/web/ — FastAPI app factory + üç ekran (tek sayfa,
    karanlık tema, sistem font stack, Türkçe): Başlangıç (sunucu taraflı dosya
    gezgini + Normal/Agresif mod — video tarayıcıya YÜKLENMEZ, sunucuya yalnız
    yol gider), Koşu (6 aşamalı gösterge: geçenler tikli, aktif vurgulu; SSE
    canlı ilerleme, kopuşta EventSource otomatik yeniden bağlanır), Sonuç
    (kazanım yüzdesi, orijinal → yeni süre, kesim sayısı, çıktı/rapor/
    transkript yolları, Yeni iş). /docs, /redoc, /openapi.json kapalı.
  • Dosya gezgini API'si (GET /api/fs/browse) — yalnız klasörler + video
    uzantılı dosyalar (gizli girdiler atlanır). Güvenlik: yol canonicalize
    edilir (resolve.. ve symlink/junction çözülür), ev dizini dışına
    her çıkış 403
    ve cevapta içerik sızmaz; .. traversal kilidi
    tests/test_web_fs.py'de.
  • Job modeli + SSE — in-memory kayıt (UUID, kalıcılık yok), tek işçilik
    thread executor, durum makinesi queued → running(aşama) → done | failed;
    GET /api/jobs/{id}/events olay geçmişi + Last-Event-ID replay'i taşır
    (kopuşta olay kaybolmaz), uzun aşamalarda keepalive ping. plan.json
    invariant'ı korunur:
    plan/rapor job nesnesinin İÇİNDE bellekte yaşar
    (Job.rapor), diske plan.json yazılmaz — kilidi testte. Job başlatma
    (POST /api/jobs) gezginle AYNI ev hapsinden geçer; doğrulama hataları
    temiz 4xx/JSON (Türkçe detail).
  • pipeline.run(progress_cb=...) — aşama geçişlerinin bant dışı,
    opsiyonel kanalı (ASAMALAR adlarıyla, o sırayla; REVIEW --yes'te de
    bildirilir). Default None CLI davranışını bit-birebir korur — parity
    kilidi cb'li/cb'siz koşunun stdout+stderr eşitliğini bayt bayt doğrular
    (TestProgressCb).
  • PipelineErrorpipeline._fail artık typer.Exit(1)'in bu alt
    sınıfını fırlatır: Türkçe/eyleme dökülebilir mesaj mesaj alanında
    taşınır ve web job'ına stack trace'siz düşer; beklenmeyen istisnalar UI'da
    genel Türkçe mesaj + ayrı log-detay alanı olur. CLI akışı değişmedi
    (click aynı şekilde yakalar, kod 1).

Doğrulandı (gerçek donanım — RX 9060 XT, whispercpp/Vulkan + h264_amf)

  • fillercut ui → netstat'ta yalnız 127.0.0.1:PORT LISTENING
    (0.0.0.0 bind yok).
  • Test1.mp4 UI'dan uçtan uca: aşamalar tarayıcıda CANLI aktı (EXTRACT tikli
    / TRANSCRIBE aktif ~1.5 sn'de gözlendi), çıktı üretildi;
    Test1_temiz.mp4 SHA-256'sı CLI koşusuyla BİREBİR AYNI
    (F5185E7E…9004), transkript de aynı. rapor.json'daki tek fark ffmpeg
    nvenc probe hata satırındaki süreç bellek adresi — iki CLI koşusu
    arasında da değişir, UI'a özgü değil.
  • Tamamen sessiz klip → UI'da Türkçe CutPlanError yüzeyi: "PLAN başarısız:
    kesim planı tüm videoyu kapsıyor — boş video üretilmez; eşikleri gözden
    geçir"; gösterge PLAN'da durdu, stack trace görünmedi.