Oke. Sekarang kita bikin full release satu perintah.
Targetnya begini:
npm run release -- "add new videos"
Lalu otomatis:
- upload ke R2
- skip file yang sudah ada
- generate
data.json git add .git commitgit push origin main
Jadi kamu tidak perlu ngetik satu-satu lagi.
1. Buat release.js
Bikin file baru release.js:
import { execSync } from "child_process";
function run(cmd) {
console.log(`\nβΆ ${cmd}`);
execSync(cmd, { stdio: "inherit" });
}
function getCommitMessage() {
const args = process.argv.slice(2).join(" ").trim();
return args || "update media library";
}
try {
const message = getCommitMessage();
console.log("π START RELEASE");
run("node upload-r2.js");
run("node generate.js");
run("git add .");
try {
run(`git commit -m "${message.replace(/"/g, '\\"')}"`);
} catch {
console.log("\nβΉ Tidak ada perubahan untuk di-commit.");
}
run("git push origin main");
console.log("\nβ
RELEASE DONE");
} catch (err) {
console.error("\nβ RELEASE FAILED");
process.exit(1);
}
2. Update package.json
Pastikan bagian scripts jadi seperti ini:
{
"name": "video-site",
"version": "1.0.0",
"type": "module",
"scripts": {
"build": "node build.js",
"generate": "node generate.js",
"thumb": "node generate-thumb.js",
"r2": "node upload-r2.js",
"publish": "node publish.js",
"release": "node release.js"
},
"dependencies": {
"@aws-sdk/client-s3": "^3.0.0",
"dotenv": "^16.4.0"
}
}
Kalau package.json kamu sudah ada field lain, cukup tambah "release": "node release.js" di scripts.
3. Cara pakai
Kalau ada media baru:
npm run release -- "add new reels"
Atau:
npm run release -- "update gallery"
Kalau tidak kasih pesan juga bisa:
npm run release
Default commit message:
update media library
4. Alur kerja kamu nanti
Sekarang workflow harian kamu jadi:
kalau ada video baru:
- taruh file di folder
media/ - jalankan:
npm run release -- "add new videos"
- selesai
Itu saja.
5. Catatan penting
Tentang thumbnail
Kalau kamu masih butuh generate thumbnail dulu, maka sebelum release jalankan:
npm run thumb
Kalau mau, nanti kita bisa bikin release.js versi lebih lengkap yang sekalian menjalankan:
generate-thumb.jsupload-r2.jsgenerate.js- git commit
- git push
Jadi benar-benar satu command total.
6. Saran terbaik sekarang
Versi paling enak justru sekalian kita upgrade release.js supaya include thumbnail juga.
Karena alur ideal kamu harusnya:
npm run release -- "add new videos"
dan otomatis:
- generate thumb
- upload R2
- generate data
- push GitHub
Bukan setengah manual.
Pakai versi ini saja kalau kamu mau langsung full:
import { execSync } from "child_process";
function run(cmd) {
console.log(`\nβΆ ${cmd}`);
execSync(cmd, { stdio: "inherit" });
}
function getCommitMessage() {
const args = process.argv.slice(2).join(" ").trim();
return args || "update media library";
}
try {
const message = getCommitMessage();
console.log("π START RELEASE");
run("node generate-thumb.js");
run("node upload-r2.js");
run("node generate.js");
run("git add .");
try {
run(`git commit -m "${message.replace(/"/g, '\\"')}"`);
} catch {
console.log("\nβΉ Tidak ada perubahan untuk di-commit.");
}
run("git push origin main");
console.log("\nβ
RELEASE DONE");
} catch (err) {
console.error("\nβ RELEASE FAILED");
process.exit(1);
}
Rekomendasi saya
Pilih versi full yang sekalian generate thumbnail.
Karena itu paling cocok dengan cara kerja kamu.
Setelah ini, langkah terbaik berikutnya adalah:
deteksi orientasi video otomatis supaya video TikTok/Instagram bisa ditandai VERTICAL dan nanti UI player lebih pintar.
baik.. saya menyiapkan video dulu dengan nama file yang bisa dibaca manusia sebentar ya saya ngarang2 dulu
Sip, itu langkah yang tepat π
Jangan disepelekanβnaming file itu fondasi sistem kamu ke depan.
Kalau kamu asal-asalan sekarang, nanti:
- susah search
- susah filter
- susah SEO
- data.json jadi berantakan
π― Rekomendasi naming (biar rapi & scalable)
Gunakan format sederhana tapi konsisten:
kategori_nama-deskripsi_tahun.mp4
Contoh bagus:
reels_cewek-manis-dance_2025.mp4
tiktok_funny-cat-jump_2024.mp4
shorts_kuliner-bakso-enak_2025.mp4
β‘ Untuk thumbnail (penting)
Pastikan sama nama:
reels_cewek-manis-dance_2025.mp4
reels_cewek-manis-dance_2025.jpg
π ini bikin script kamu auto detect β
β Hindari ini
VID_20250101_123123.mp4
video1.mp4
final_fix_beneran_fix.mp4
π ini bakal nyusahin kamu nanti
π₯ Bonus (kalau mau lebih rapi lagi)
Kamu bisa pakai format:
kategori__judul__tag.mp4
Contoh:
reels__cewek-manis__dance.mp4
tiktok__kucing-lucu__funny.mp4
π nanti gampang diparsing ke:
- category
- title
- tag
π¬ Saran jujur
Jangan terlalu lama di tahap ini.
π cukup:
- readable
- konsisten
- tidak terlalu panjang
π Setelah kamu siap
Lanjut:
npm run release -- "add new batch videos"
π Next upgrade setelah ini
Begitu kamu punya file naming bagus, kita bisa:
π₯ auto generate:
- title (dari filename)
- tag (dari filename)
- kategori (dari prefix)
π jadi kamu tidak perlu edit manual lagi
Kalau sudah siap batch pertama, langsung gas release saja.
Kalau ada yang aneh di hasil data.json, kirimβkita refine lagi sampai perfect.
oh iya.. apakah file di media/ sebelumnya sudah boleh dihapus? Jawaban jujurnya: boleh⦠tapi jangan langsung brutal hapus.
Kita bedakan dulu biar kamu nggak nyesel nanti.
π― Kondisi kamu sekarang
File kamu sudah:
- β upload ke R2
- β bisa diakses CDN
- β dipakai oleh website
π secara teknis:
file di media/ sudah tidak dibutuhkan untuk runtime website
β οΈ Tapiβ¦ ini penting
Folder media/ sekarang masih punya fungsi:
1. Source untuk generate
Script kamu pakai ini untuk:
- baca file
- generate
data.json - generate thumbnail
Kalau dihapus:
π script kamu tidak punya βinputβ
π₯ Jadi keputusan terbaik
β JANGAN langsung hapus semua
β Gunakan salah satu strategi ini
π₯ RECOMMENDED (aman & profesional)
Pisahkan jadi 2 folder:
/media β (hapus nanti)
/source β
(untuk file asli)
Ganti di script:
const mediaDir = "./source";
π artinya:
source/= tempat file asli (local backup)- R2 = production storage
π₯ Alternatif (kalau mau minimal)
Hapus hanya setelah upload
Flow:
- taruh file di
media/ - setelah yakin sukses:
π hapus file dimedia/
jalankan:
npm run release
β οΈ Tapi ini berisiko:
- kalau R2 error β file hilang
- tidak ada backup lokal
π§ Best practice (yang saya sarankan)
π lakukan ini:
/source β file asli (backup)
/media β kosong / temporary
Atau langsung pakai:
/media = source
tapi jangan hapus isi sembarangan.
π¬ Saran jujur (penting banget)
Kalau kamu serius lanjut project ini:
π JANGAN hapus file asli
Karena nanti kamu butuh untuk:
- re-encode video
- generate ulang thumbnail
- convert ke HLS
- upload ke platform lain
π₯ Versi ideal kamu sekarang
/source (master file)
R2 (delivery)
Pages (frontend)
data.json (metadata)
π ini sudah level production workflow
π Kesimpulan
| Aksi | Aman? |
|---|---|
Hapus semua media/ | β jangan |
| Hapus setelah upload | β οΈ boleh tapi risk |
Simpan di source/ | β terbaik |
π Saran saya
Pindahkan dulu:
media β source
lalu update script.
Kalau kamu mau, next saya bantu:
π auto parsing filename β jadi title + tag + category otomatis
Itu bakal bikin sistem kamu makin βpintarβ π₯