fullstack
ForkCheat Clip PRO
Alat pemotong video lokal dengan dua ruang kerja yang mengubah video panjang menjadi klip vertikal untuk TikTok, Shorts, dan Reels, dengan subtitle animasi, face centering, dan kompilasi ranking.
- Peran
- Backend & Video Engineering + Frontend
- Durasi
- Juni – Oktober 2026
- Tanggal
- Oktober 2026
Teknologi
- python
- fastapi
- ffmpeg
- openai-whisper
- opencv
- google-genai
- yt-dlp
- youtube-transcript-api
- react
- typescript
- vite
- server-sent events
- css custom properties
Dampak
43 endpoint di 6 router, 11.526 baris Python, dan 22 file TypeScript dengan 16.956 baris, dibangun dalam 178 commit.
Ruang kerja frontend berawal dari fork kode yang sudah ada. Pekerjaan yang dijelaskan di bagian itu adalah pengembangan dan perbaikan di atasnya; pipeline backend dan rekayasa video dibangun di sini.
Masalah
Membuat klip pendek dari video panjang terlihat mudah sampai tiga hal muncul. Pertama, momen viral tidak punya batas yang jelas: memotong di tengah kalimat merusak klip, dan memakai ambang skor absolut tidak reliable karena skor model bergantung pada video. Kedua, hasil render harus identik dengan yang dilihat di preview: pergeseran crop, label terpotong, atau durasi yang meleset beberapa detik langsung terlihat di platform tujuan. Ketiga, sumber video tidak kooperatif: YouTube membatasi unduhan dan embed, dan setiap kegagalan harus bisa dijelaskan ke pengguna, bukan berakhir sebagai file 0 byte.
Preview punya batasan kerasnya sendiri: YouTube hanya bisa di-embed pada rasio 16:9, sementara output selalu vertikal 1080×1920. Crop, posisi kamera, dan kanvas yang salah membuat pengguna melihat satu hal dan mengunduh hal lain.
Solusi
Analisis berjalan sebagai pipeline bertahap, bukan satu panggilan model. Sumber dideteksi lebih dulu, lalu heatmap retensi dan transkrip dikumpulkan: Whisper lokal untuk file yang diunggah, transkrip platform untuk YouTube, dengan proxy dan rotasi player karena satu jalur saja tidak cukup. Gemini hanya menerima transkrip ber-timestamp dan memilih momen; batas klip dirapatkan ke batas kalimat sehingga tidak ada kata yang terbelah. Daftar model Gemini ditemukan secara dinamis, diurutkan berdasarkan versi, dan dicoba berurutan: kuota habis pada satu model bukan kegagalan, dan error 429 dibedakan dari 502 agar pesan ke pengguna jujur.
Render adalah satu filtergraph ffmpeg yang disusun utuh: kanvas 1080×1920, latar blur, face tracking (YuNet dengan fallback Haar cascade), watermark, BGM, SFX hook, dan subtitle ASS yang ditulis tangan. Tag selalu di dalam blok override, dan font mengecil otomatis alih-alih memotong teks. Setiap output selalu di-re-encode (libx264 + aac, setsar=1, 48 kHz stereo) supaya penggabungan berikutnya presisi; tidak pernah -c copy.
Batch render punya registry sendiri: progres per klip, flag pembatalan, retry per indeks, dan ZIP berisi nama berbasis judul plus metadata .txt agar judul dan hashtag tidak perlu disalin manual. Kompilasi ranking menambahkan lapisan yang lebih rumit: overlay ASS dengan slot nomor tetap, skor multimodal berbobot yang jumlahnya 1.0, NMS berbasis temporal IoU pada jendela yang benar-benar dirender, dan urutan menaik supaya juara tampil terakhir.
Antarmuka terdiri dari dua ruang kerja, Clip dan Rank Clip, yang berbagi satu sesi data lewat navigasi berbasis state tanpa router. Preview memakai dua sumber sekaligus, IFrame API YouTube dan elemen video langsung, dengan satu aturan tetap: iframe selalu 16:9 dan wrapper yang memotong, karena memaksa iframe ke rasio lain membuat YouTube menambahkan letterbox internal. Kanvas mengikuti model render: bingkai tetap portrait untuk semua mode vertikal, hanya kotak kontennya yang berubah (9:16, 1:1, 4:3, letterbox), dan landscape benar-benar 16:9.
Pemutaran dijaga oleh satu timeline: posisi dibaca dari pemutar, batas klip dicek per tick, dan state pemutaran dibuat jujur per sumber: tombol tidak pernah menampilkan “jeda” saat pemutar sebenarnya berhenti. Untuk Rank Clip, preview menampilkan urutan penuh sebagai satu rangkaian dengan nomor tetap dan label yang muncul saat klipnya berjalan, memakai ref agar interval tidak membaca state basi. Spoiler hook diputar persis seperti render: fase hook lebih dulu, lalu lompat ke klip asli, dengan indikator fase. Analisis yang sudah pernah dijalankan disimpan di penyimpanan lokal dan bisa dipakai ulang, dan pengaturan pengguna (durasi, spoiler, layout ranking) bertahan lintas sesi tanpa merusak kartu ketika datanya rusak.
Sisi keamanan diperlakukan sebagai bagian desain: path media dikurung ke direktori yang diizinkan, URL unduhan divalidasi, endpoint hapus menolak permintaan lintas-origin, mass-delete butuh konfirmasi eksplisit, serta security header dipasang lewat middleware ASGI murni karena BaseHTTPMiddleware mengganggu streaming respons. Seluruh antarmuka tersedia dalam dua bahasa dengan jumlah kunci yang dijaga seimbang.
Catatan jujur: proyek ini tidak memiliki test suite otomatis. Verifikasi dilakukan pada output nyata: durasi lewat ffprobe, kesesuaian isi lewat perbandingan piksel antar-frame, dan pemeriksaan build/type, karena bug yang paling mahal di sini bersifat visual, bukan logis. Backend berisi 29 file Python dan 11.526 baris di 43 endpoint dalam 6 router; frontend berisi 22 file TypeScript dan 16.956 baris; seluruh pekerjaan mencakup 178 commit dari Juni sampai Oktober 2026.
Kontak
Tertarik untuk bekerja sama?
Ceritakan apa yang sedang Anda bangun dan apa yang dibutuhkan. Catatan singkat sudah cukup.