v1.0.0 — Web arayüzü
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ı ilerapor.json'daki sayı ayrışamaz (kilit
testte). Kelimeler reason zincirinden çıkarılır (KI-3 ailesi) ve görüntü
formunda gruplanır:Eee,ileeeeaynı kovaya düşer,ıııekranda
iiolmaz. - 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'taexplorer /select,, macOS'taopen -R, Linux'taxdg-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=falseolur 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). manuelkesim 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). Raporatiers.manuelve
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çesiapply_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.Exityutuluyordu. click'teRuntimeErrortürevidir, web job'ının
genelexcept 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 veThreadPoolExecutorthread'leri daemon değildir — Ctrl+C
sonrası süreç kapanmıyordu.JobKayit.kapatartı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) —ResizeObserverile 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 uialt komutu — web arayüzünü YALNIZ127.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
./uiyazar).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.jsonkapalı.- 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 makinesiqueued → running(aşama) → done | failed;
GET /api/jobs/{id}/eventsolay geçmişi +Last-Event-IDreplay'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çedetail). pipeline.run(progress_cb=...)— aşama geçişlerinin bant dışı,
opsiyonel kanalı (ASAMALARadlarıyla, o sırayla; REVIEW--yes'te de
bildirilir). DefaultNoneCLI davranışını bit-birebir korur — parity
kilidi cb'li/cb'siz koşunun stdout+stderr eşitliğini bayt bayt doğrular
(TestProgressCb).PipelineError—pipeline._failartıktyper.Exit(1)'in bu alt
sınıfını fırlatır: Türkçe/eyleme dökülebilir mesajmesajalanı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ız127.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.mp4SHA-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.