Nah ini problem klasik ffmpeg šŸ‘ — kamu ketemu masalah yang real banget.

šŸ‘‰ Penyebabnya:

  • video awalnya hitam / fade in / intro kosong
  • kamu ambil frame di detik ke-2 → hasilnya blank

šŸŽÆ SOLUSI YANG BENAR

Jangan fix di 2 detik.
šŸ‘‰ ambil frame di tengah video (ini best practice)


⚔ SOLUSI 1 — Ambil di tengah video (RECOMMENDED)

Kita upgrade script kamu.

šŸ”§ Update generate-thumb.js

Ganti jadi ini:

import fs from "fs";
import { execSync } from "child_process";

const mediaDir = "./media";

const files = fs.readdirSync(mediaDir);
const videos = files.filter(f => f.endsWith(".mp4"));

videos.forEach(file => {
  const name = file.replace(".mp4", "");
  const input = `${mediaDir}/${file}`;
  const output = `${mediaDir}/${name}.jpg`;

  if (!fs.existsSync(output)) {
    try {
      // ambil durasi video
      const duration = execSync(
        `ffprobe -i "${input}" -show_entries format=duration -v quiet -of csv="p=0"`
      ).toString().trim();

      const middle = Math.floor(duration / 2);

      console.log(`Thumbnail ${file} at ${middle}s`);

      execSync(
        `ffmpeg -ss ${middle} -i "${input}" -vframes 1 "${output}"`
      );

    } catch (err) {
      console.log(`Error processing ${file}`);
    }
  }
});

console.log("Done!");

🧠 Kenapa ini lebih bagus?

šŸ‘‰ Karena:

  • frame tengah hampir selalu ada isi
  • gak kena intro kosong
  • hasil lebih representatif

⚔ SOLUSI 2 — fallback kalau masih blank (advanced)

Kalau kamu mau lebih gila lagi:

šŸ‘‰ ambil beberapa frame:

1 detik
3 detik
5 detik
tengah

pilih yang paling "tidak gelap"

Tapi ini sudah masuk level advance — belum perlu sekarang.


⚔ SOLUSI 3 — quick fix (kalau gak mau ribet)

Ganti saja:

-ss 00:00:02

jadi:

-ss 00:00:05

atau:

-ss 00:00:10

šŸ‘‰ tapi ini kurang pintar dibanding middle method


šŸ’¬ Saran jujur (biar kamu gak buang waktu)

šŸ‘‰ Pakai middle video method
Itu yang dipakai banyak platform juga.


šŸš€ Bonus upgrade (opsional tapi bagus)

Biar thumbnail lebih bagus:

-vf "scale=320:-1"

jadi:

execSync(
  `ffmpeg -ss ${middle} -i "${input}" -vframes 1 -vf "scale=320:-1" "${output}"`
);

šŸ‘‰ hasil:

  • ringan
  • konsisten ukuran

šŸŽÆ Summary kamu sekarang

Kamu sudah punya:

āœ… auto detect
āœ… auto pairing
āœ… auto thumbnail (smart)
āœ… multi format player

šŸ‘‰ ini sudah production-ready pipeline dasar


šŸ‘‰ Next step (kalau kamu lanjut)

Kalau kamu mau:
šŸ‘‰ kita bikin:

  • šŸŽ¬ auto scan .m3u8
  • 🧠 generate metadata (duration, resolution)
  • ā˜ļø deploy ke Cloudflare Pages

šŸ‘ Sekarang

Coba update script tadi.

Kalau sudah:
šŸ‘‰ bilang "thumb smart done"

Kalau ada error:
šŸ‘‰ kirim errornya

Kita refine lagi sampai bener-bener solid šŸ”„