Skip to content

feat: add HTTP server layer (clipper-server)#1

Draft
sandikodev wants to merge 3 commits intoHans02-Neo:mainfrom
sandikodev:feat/http-server
Draft

feat: add HTTP server layer (clipper-server)#1
sandikodev wants to merge 3 commits intoHans02-Neo:mainfrom
sandikodev:feat/http-server

Conversation

@sandikodev
Copy link
Copy Markdown
Collaborator

@sandikodev sandikodev commented Apr 9, 2026

Latar Belakang

Saat ini auto-clipper hanya bisa dipakai sebagai CLI tool. Web services seperti pocat-api dan ytmod-api tidak bisa memanggil clipper tanpa spawn subprocess — tidak praktis untuk production dan tidak bisa di-scale.

PR ini mengusulkan penambahan binary kedua clipper-server yang mengekspos fungsi yang sama sebagai HTTP REST API, tanpa mengubah behavior CLI yang sudah ada.


Kronologi Perubahan

1. Ekstrak logic ke src/lib.rs

Semua fungsi utama (get_video_info, download_video, get_video_duration, analyze_with_gemini, process_clips) dipindahkan ke library crate agar bisa dipakai oleh dua binary sekaligus.

Sebelum:

src/main.rs  ← semua logic di sini

Sesudah:

src/lib.rs     ← shared logic (pub functions + types)
src/main.rs    ← CLI binary, import dari lib.rs
src/server.rs  ← HTTP server binary, import dari lib.rs

Tidak ada perubahan behavior CLImain.rs tetap berjalan persis seperti sebelumnya.

2. Tambah src/server.rs — HTTP server via axum

Binary baru clipper-server yang expose tiga endpoint:

Method Path Deskripsi
GET /health Health check — untuk Docker/load balancer
POST /analyze Analisa video YouTube dengan Gemini AI, return suggested clips
POST /clip Proses clips dengan ffmpeg

BYOK design: caller menyertakan Gemini API key per-request di body — tidak ada key yang disimpan di server. Cocok untuk use case di mana end-user menyediakan key mereka sendiri.

3. Tambah Docker setup

Dockerfile multi-stage:

  • Stage 1 (builder): compile binary dengan Rust toolchain
  • Stage 2 (runtime): image minimal — hanya binary + ffmpeg + yt-dlp, tanpa Rust toolchain (~1GB lebih kecil)

docker-compose.yml untuk development lokal dan docker-compose.prod.yml untuk production dengan contoh konfigurasi berbagai reverse proxy (nginx-proxy, Traefik, Cloudflare Tunnel, manual nginx/Apache).

4. Update Cargo.toml

Tambah dependencies:

  • axum = "0.7" — HTTP framework
  • tower-http dengan feature cors — CORS middleware
  • uuid — generate unique temp filename untuk Gemini request (menghindari race condition)

Daftarkan [lib] dan [[bin]] clipper-server.


Cara Test

# Build semua binary
cargo build --release

# Jalankan HTTP server
PORT=8080 ./target/release/clipper-server

# Health check
curl http://localhost:8080/health

# Analyze (butuh yt-dlp + ffmpeg + Gemini API key)
curl -X POST http://localhost:8080/analyze \
  -H 'Content-Type: application/json' \
  -d '{"url": "https://youtube.com/watch?v=...", "gemini_api_key": "your-key"}'

# Atau via Docker
docker compose up

Catatan untuk Reviewer

Pertanyaan yang ingin saya diskusikan:

  1. Apakah struktur lib.rs sudah sesuai dengan arah project?
  2. Ada preferensi HTTP framework lain selain axum?
  3. Apakah Docker setup perlu masuk ke repo ini atau lebih baik di repo terpisah?

Expose CLI functionality as a REST API via axum so web services
(pocat-api, ytmod-api) can call the clipper without spawning subprocesses.

Changes:
- Extract shared logic to src/lib.rs (pub functions + types)
- Add src/server.rs — axum HTTP server binary (clipper-server)
- Update src/main.rs to use lib.rs
- Add axum, tower-http, uuid to Cargo.toml

Endpoints:
  GET  /health
  POST /analyze  { url, gemini_api_key }  → { config }
  POST /clip     { config }               → { results }

BYOK design: caller supplies their own Gemini API key per-request.
No breaking changes to existing CLI behavior.

Usage:
  PORT=8080 ./clipper-server
sandikodev added a commit to sandikodev/ytmod that referenced this pull request Apr 9, 2026
@sandikodev
Copy link
Copy Markdown
Collaborator Author

Catatan CI

Job Test ✅ dan Security Audit ✅ pass.

Job Build ❌ gagal bukan karena perubahan di PR ini, melainkan karena actions/upload-artifact@v3 yang sudah deprecated sejak April 2024 — ini juga terjadi di run sebelumnya di branch main.

Fix-nya cukup update .github/workflows/ci.yml:

- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@v4

Kalau berkenan, bisa saya sertakan fix ini di PR yang sama atau buat PR terpisah.

Multi-stage Dockerfile (builder + runtime) — final image hanya
berisi binary + ffmpeg + yt-dlp, tanpa Rust toolchain.

docker-compose.yml        — development lokal (port 8080)
docker-compose.prod.yml   — production overrides dengan contoh
                            konfigurasi nginx-proxy, Traefik,
                            Cloudflare Tunnel, dan manual nginx/Apache

Output clips di-persist via volume ./workspace.
@sandikodev
Copy link
Copy Markdown
Collaborator Author

Update terbaru — Docker setup

Baru saja push commit 17fd434 yang menambahkan Docker setup:

  • Dockerfile multi-stage (builder + runtime) — final image ~200MB vs ~1.5GB kalau tidak multi-stage
  • docker-compose.yml — untuk development lokal
  • docker-compose.prod.yml — production overrides dengan contoh konfigurasi nginx-proxy, Traefik, Cloudflare Tunnel, dan manual nginx/Apache

Ini melengkapi HTTP server layer agar langsung bisa di-deploy tanpa setup manual.


Saya update PR description di atas dengan kronologi lengkap semua perubahan agar lebih mudah di-review. Silakan kasih feedback di bagian mana saja — saya siap revisi sebelum PR ini di-mark ready.

sandikodev added a commit to sandikodev/ytmod that referenced this pull request Apr 9, 2026
Menambahkan Dockerfile multi-stage + docker-compose untuk
development dan production deployment clipper-server.

Diusulkan ke upstream via draft PR Hans02-Neo/clipper-rust#1.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant