📂 Pembuat Folder & File PHP
2
Total Folder
4
Total File
✏️ Edit File: movie/index.php
<?php $DATA_FILE = __DIR__ . '/data/films.json'; $UPLOAD_DIR = __DIR__ . '/uploads/'; $THUMB_DIR = $UPLOAD_DIR . 'thumbnails/'; $VIDEO_DIR = $UPLOAD_DIR . 'videos/'; foreach ([dirname($DATA_FILE), $THUMB_DIR, $VIDEO_DIR] as $dir) { if (!is_dir($dir)) mkdir($dir, 0755, true); } if (!file_exists($DATA_FILE)) file_put_contents($DATA_FILE, json_encode([])); function loadFilms($file) { $data = json_decode(file_get_contents($file), true); return is_array($data) ? $data : []; } function saveFilms($file, $films) { file_put_contents($file, json_encode($films, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); } function formatDurasi($detik) { $m = floor($detik / 60); $s = $detik % 60; return sprintf('%d:%02d', $m, $s); } function e($str) { return htmlspecialchars($str ?? '', ENT_QUOTES, 'UTF-8'); } $message = ''; $msgType = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'upload') { try { $judul = trim($_POST['judul'] ?? ''); $sutradara = trim($_POST['sutradara'] ?? ''); $deskripsi = trim($_POST['deskripsi'] ?? ''); $durasi = (int)($_POST['durasi'] ?? 0); $tahun = (int)($_POST['tahun'] ?? date('Y')); $genre = trim($_POST['genre'] ?? ''); if ($judul === '' || $sutradara === '') { throw new Exception('Judul dan sutradara wajib diisi.'); } if (!isset($_FILES['video']) || $_FILES['video']['error'] !== UPLOAD_ERR_OK) { throw new Exception('Video wajib diupload.'); } $videoExt = strtolower(pathinfo($_FILES['video']['name'], PATHINFO_EXTENSION)); $allowedVid = ['mp4', 'webm', 'ogg', 'mov']; if (!in_array($videoExt, $allowedVid)) { throw new Exception('Format video harus: ' . implode(', ', $allowedVid)); } if ($_FILES['video']['size'] > 200 * 1024 * 1024) { throw new Exception('Ukuran video maksimal 200MB.'); } $videoName = uniqid('vid_') . '.' . $videoExt; if (!move_uploaded_file($_FILES['video']['tmp_name'], $VIDEO_DIR . $videoName)) { throw new Exception('Gagal menyimpan video.'); } $thumbName = ''; if (isset($_FILES['thumbnail']) && $_FILES['thumbnail']['error'] === UPLOAD_ERR_OK) { $thumbExt = strtolower(pathinfo($_FILES['thumbnail']['name'], PATHINFO_EXTENSION)); $allowedImg = ['jpg', 'jpeg', 'png', 'webp', 'gif']; if (!in_array($thumbExt, $allowedImg)) { throw new Exception('Format thumbnail harus: ' . implode(', ', $allowedImg)); } $thumbName = uniqid('thumb_') . '.' . $thumbExt; move_uploaded_file($_FILES['thumbnail']['tmp_name'], $THUMB_DIR . $thumbName); } $films = loadFilms($DATA_FILE); $films[] = [ 'id' => uniqid(), 'judul' => $judul, 'sutradara' => $sutradara, 'deskripsi' => $deskripsi, 'durasi' => $durasi, 'tahun' => $tahun, 'genre' => $genre, 'thumbnail' => $thumbName, 'video' => $videoName, 'created_at'=> date('Y-m-d H:i:s'), ]; saveFilms($DATA_FILE, $films); $message = '🎉 Film berhasil diupload!'; $msgType = 'success'; } catch (Exception $ex) { $message = '❌ ' . $ex->getMessage(); $msgType = 'error'; } } if (isset($_GET['delete'])) { $id = $_GET['delete']; $films = loadFilms($DATA_FILE); $newFilms = []; foreach ($films as $f) { if ($f['id'] === $id) { if (!empty($f['video']) && file_exists($VIDEO_DIR . $f['video'])) { @unlink($VIDEO_DIR . $f['video']); } if (!empty($f['thumbnail']) && file_exists($THUMB_DIR . $f['thumbnail'])) { @unlink($THUMB_DIR . $f['thumbnail']); } } else { $newFilms[] = $f; } } saveFilms($DATA_FILE, $newFilms); header('Location: ' . strtok($_SERVER['REQUEST_URI'], '?')); exit; } $films = loadFilms($DATA_FILE); $search = trim($_GET['q'] ?? ''); $genreFilter = trim($_GET['genre'] ?? ''); $filtered = array_filter($films, function($f) use ($search, $genreFilter) { $matchSearch = true; $matchGenre = true; if ($search !== '') { $hay = strtolower($f['judul'] . ' ' . $f['sutradara'] . ' ' . $f['genre']); $matchSearch = str_contains($hay, strtolower($search)); } if ($genreFilter !== '') { $matchGenre = strtolower($f['genre']) === strtolower($genreFilter); } return $matchSearch && $matchGenre; }); usort($filtered, fn($a, $b) => strcmp($b['created_at'], $a['created_at'])); $genres = array_unique(array_filter(array_column($films, 'genre'))); sort($genres); $detailId = $_GET['id'] ?? null; $detailFilm = null; if ($detailId) { foreach ($films as $f) { if ($f['id'] === $detailId) { $detailFilm = $f; break; } } } ?> <!DOCTYPE html> <html lang="id"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>🎬 ShortFilm - Galeri Film Pendek</title> <style> * { margin:0; padding:0; box-sizing:border-box; } body { font-family:'Segoe UI', sans-serif; background:#0f0f0f; color:#e0e0e0; min-height:100vh; } .navbar { background:#1a1a1a; padding:15px 30px; display:flex; justify-content:space-between; align-items:center; border-bottom:2px solid #e50914; position:sticky; top:0; z-index:100; } .logo { font-size:24px; font-weight:bold; color:#e50914; text-decoration:none; } .nav-links a { color:#fff; text-decoration:none; margin-left:15px; padding:8px 16px; border-radius:5px; transition:.3s; } .nav-links a:hover { background:#e50914; } .container { max-width:1200px; margin:30px auto; padding:0 20px; } h1 { color:#fff; margin-bottom:20px; } h2 { color:#fff; margin-bottom:15px; } .alert { padding:15px; border-radius:8px; margin-bottom:20px; } .alert-success { background:#1e4620; color:#7fdb8a; border-left:4px solid #7fdb8a; } .alert-error { background:#461e1e; color:#f88; border-left:4px solid #f88; } .toolbar { display:flex; gap:10px; flex-wrap:wrap; margin-bottom:25px; background:#1a1a1a; padding:15px; border-radius:10px; } .toolbar input, .toolbar select { flex:1; min-width:150px; padding:10px 14px; background:#2a2a2a; border:1px solid #444; border-radius:6px; color:#fff; font-size:14px; } .toolbar button { padding:10px 20px; background:#e50914; color:#fff; border:none; border-radius:6px; cursor:pointer; font-weight:bold; } .toolbar button:hover { background:#b8070f; } .film-grid { display:grid; grid-template-columns:repeat(auto-fill, minmax(220px, 1fr)); gap:20px; } .film-card { background:#1f1f1f; border-radius:10px; overflow:hidden; transition:.3s; cursor:pointer; position:relative; } .film-card:hover { transform:translateY(-5px); box-shadow:0 10px 30px rgba(229,9,20,.3); } .film-card img, .film-card .no-thumb { width:100%; height:300px; object-fit:cover; background:#2a2a2a; display:flex; align-items:center; justify-content:center; color:#666; font-size:50px; } .film-info { padding:14px; } .film-info h3 { margin-bottom:6px; color:#fff; font-size:16px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } .film-info p { font-size:13px; color:#aaa; margin-bottom:6px; } .meta-row { display:flex; justify-content:space-between; align-items:center; margin-top:8px; } .badge { display:inline-block; background:#e50914; color:#fff; padding:3px 10px; border-radius:15px; font-size:11px; } .durasi-badge { background:rgba(0,0,0,.7); padding:3px 8px; border-radius:4px; font-size:11px; } .btn { display:inline-block; background:#e50914; color:#fff; padding:10px 20px; border:none; border-radius:6px; cursor:pointer; text-decoration:none; transition:.3s; font-size:14px; } .btn:hover { background:#b8070f; } .btn-secondary { background:#444; } .btn-secondary:hover { background:#555; } .btn-danger { background:#8b0000; } .btn-danger:hover { background:#a00000; } .form-group { margin-bottom:15px; } .form-group label { display:block; margin-bottom:6px; color:#fff; font-size:14px; } .form-group input, .form-group textarea, .form-group select { width:100%; padding:11px; background:#2a2a2a; border:1px solid #444; border-radius:6px; color:#fff; font-size:14px; } .form-group input:focus, .form-group textarea:focus, .form-group select:focus { outline:none; border-color:#e50914; } .form-group textarea { resize:vertical; min-height:90px; } .form-row { display:grid; grid-template-columns:1fr 1fr; gap:15px; } .upload-box { background:#1a1a1a; padding:25px; border-radius:10px; margin-bottom:30px; border:1px solid #222; } .detail-view { background:#1a1a1a; padding:25px; border-radius:10px; margin-bottom:30px; border:1px solid #222; } .detail-view video { width:100%; border-radius:10px; background:#000; margin-bottom:20px; max-height:500px; } .detail-view h1 { font-size:28px; margin-bottom:8px; } .detail-meta { color:#aaa; margin-bottom:15px; font-size:14px; } .detail-deskripsi { line-height:1.7; color:#ccc; margin-bottom:20px; } .empty-state { text-align:center; padding:60px 20px; color:#666; background:#1a1a1a; border-radius:10px; } .empty-state .icon { font-size:60px; margin-bottom:15px; } @media(max-width:600px) { .form-row { grid-template-columns:1fr; } .film-grid { grid-template-columns:repeat(2, 1fr); } .film-card img, .film-card .no-thumb { height:200px; } } </style> </head> <body> <nav class="navbar"> <a href="index.php" class="logo">🎬 SHORTFILM</a> <div class="nav-links"> <a href="index.php">Beranda</a> <a href="index.php#upload">Upload</a> </div> </nav> <div class="container"> <?php if ($message): ?> <div class="alert alert-<?= $msgType ?>"><?= e($message) ?></div> <?php endif; ?> <?php if ($detailFilm): ?> <a href="index.php" class="btn btn-secondary" style="margin-bottom:20px;">← Kembali</a> <div class="detail-view"> <video controls poster="<?= $detailFilm['thumbnail'] ? 'uploads/thumbnails/' . e($detailFilm['thumbnail']) : '' ?>"> <source src="uploads/videos/<?= e($detailFilm['video']) ?>"> Browser Anda tidak mendukung video. </video> <h1><?= e($detailFilm['judul']) ?></h1> <div class="detail-meta"> 🎬 <?= e($detailFilm['sutradara']) ?> | 📅 <?= e($detailFilm['tahun']) ?> | ⏱️ <?= formatDurasi($detailFilm['durasi']) ?> <?php if ($detailFilm['genre']): ?> | <span class="badge"><?= e($detailFilm['genre']) ?></span> <?php endif; ?> </div> <p class="detail-deskripsi"><?= nl2br(e($detailFilm['deskripsi'])) ?></p> <a href="?delete=<?= e($detailFilm['id']) ?>" onclick="return confirm('Yakin hapus film ini?')" class="btn btn-danger">🗑️ Hapus Film</a> </div> <?php else: ?> <h1>🎬 Galeri Film Pendek</h1> <div id="upload" class="upload-box"> <h2>📤 Upload Film Baru</h2> <form method="POST" enctype="multipart/form-data"> <input type="hidden" name="action" value="upload"> <div class="form-row"> <div class="form-group"> <label>Judul Film *</label> <input type="text" name="judul" required maxlength="200"> </div> <div class="form-group"> <label>Sutradara *</label> <input type="text" name="sutradara" required maxlength="100"> </div> </div> <div class="form-row"> <div class="form-group"> <label>Genre</label> <input type="text" name="genre" maxlength="50" placeholder="Drama, Horor, dll"> </div> <div class="form-group"> <label>Tahun</label> <input type="number" name="tahun" value="<?= date('Y') ?>" min="1900" max="<?= date('Y') + 1 ?>"> </div> </div> <div class="form-group"> <label>Durasi (detik)</label> <input type="number" name="durasi" min="0" placeholder="Misal: 300 untuk 5 menit"> </div> <div class="form-group"> <label>Deskripsi</label> <textarea name="deskripsi" placeholder="Sinopsis film pendek..."></textarea> </div> <div class="form-row"> <div class="form-group"> <label>Thumbnail (opsional)</label> <input type="file" name="thumbnail" accept="image/*"> </div> <div class="form-group"> <label>File Video * (max 200MB)</label> <input type="file" name="video" accept="video/*" required> </div> </div> <button type="submit" class="btn">🚀 Upload Film</button> </form> </div> <form method="GET" class="toolbar"> <input type="text" name="q" placeholder="🔍 Cari judul atau sutradara..." value="<?= e($search) ?>"> <select name="genre"> <option value="">Semua Genre</option> <?php foreach ($genres as $g): ?> <option value="<?= e($g) ?>" <?= $genreFilter === $g ? 'selected' : '' ?>> <?= e($g) ?> </option> <?php endforeach; ?> </select> <button type="submit">Filter</button> <?php if ($search || $genreFilter): ?> <a href="index.php" class="btn btn-secondary">Reset</a> <?php endif; ?> </form> <?php if (count($filtered) === 0): ?> <div class="empty-state"> <div class="icon">🎞️</div> <h2>Belum ada film</h2> <p>Upload film pendek pertama Anda di form atas!</p> </div> <?php else: ?> <p style="color:#888;margin-bottom:15px;"> Menampilkan <?= count($filtered) ?> film </p> <div class="film-grid"> <?php foreach ($filtered as $f): ?> <a href="?id=<?= e($f['id']) ?>" style="text-decoration:none;"> <div class="film-card"> <?php if ($f['thumbnail']): ?> <img src="uploads/thumbnails/<?= e($f['thumbnail']) ?>" alt="<?= e($f['judul']) ?>"> <?php else: ?> <div class="no-thumb">🎬</div> <?php endif; ?> <div class="film-info"> <h3><?= e($f['judul']) ?></h3> <p>🎬 <?= e($f['sutradara']) ?></p> <div class="meta-row"> <span class="durasi-badge">⏱️ <?= formatDurasi($f['durasi']) ?></span> <span style="font-size:12px;color:#888;"><?= e($f['tahun']) ?></span> </div> <?php if ($f['genre']): ?> <span class="badge" style="margin-top:8px;"><?= e($f['genre']) ?></span> <?php endif; ?> </div> </div> </a> <?php endforeach; ?> </div> <?php endif; ?> <?php endif; ?> </div> <div style="text-align:center;padding:40px 20px;color:#555;margin-top:40px;border-top:1px solid #222;"> © <?= date('Y') ?> ShortFilm Project - Dibuat dengan ❤️ </div> </body> </html>
💾 Simpan Perubahan
Batal
Nama Folder
Nama File PHP
Isi File (opsional)
🚀 Buat Folder & File
📋 Daftar Folder
game
🔗 Open
🗑 Hapus
index.php
👁 Lihat
✏️ Edit
🗑
✏️ Rename
+ Tambah File
movie
🔗 Open
🗑 Hapus
index.php
👁 Lihat
✏️ Edit
🗑
✏️ Rename
+ Tambah File