prepare(" INSERT INTO videos (title, description, slug, thumbnail, duration, sort_order, published) VALUES (?, ?, ?, ?, ?, ?, ?) ")->execute([$title, $description, $slug, $thumbnail, $duration, $sort_order, $published]); $video_id = (int)$db->lastInsertId(); // Handle video source files $source_labels = $_POST['source_label'] ?? []; $source_quality = $_POST['source_quality'] ?? []; $source_order = $_POST['source_sort'] ?? []; $source_files = $_FILES['source_file'] ?? []; $videos_dir = MEDIA_DIR . 'videos/'; if (!is_dir($videos_dir)) mkdir($videos_dir, 0755, true); $inserted_sources = 0; $allowed_video = ['mp4','webm','ogv','ogg','mov','mkv','avi']; if (!empty($source_files['tmp_name'])) { foreach ($source_files['tmp_name'] as $i => $tmp) { if (empty($tmp) || !is_uploaded_file($tmp)) continue; $orig_name = $source_files['name'][$i]; $ext = strtolower(pathinfo($orig_name, PATHINFO_EXTENSION)); if (!in_array($ext, $allowed_video)) continue; $fname = $slug . '_' . ($i+1) . '_' . time() . '.' . $ext; if (move_uploaded_file($tmp, $videos_dir . $fname)) { $label = trim($source_labels[$i] ?? ''); $quality = trim($source_quality[$i] ?? ''); $mime = mime_from_ext($fname); $sort = (int)($source_order[$i] ?? $i); $db->prepare(" INSERT INTO video_sources (video_id, label, file_path, mime_type, quality, sort_order) VALUES (?,?,?,?,?,?) ")->execute([$video_id, $label, 'videos/' . $fname, $mime, $quality, $sort]); $inserted_sources++; } } } header('Location: edit.php?id=' . $video_id . '&saved=1'); exit; } } } render_head('Add Video — Admin', ' .form-grid { display:grid; grid-template-columns:1fr; gap:1.2rem; } @media(min-width:700px) { .form-grid { grid-template-columns:1fr 1fr; } } .form-grid .span2 { grid-column:1/-1; } .sources-section { display:flex; flex-direction:column; gap:.85rem; } .source-row { background:var(--surface-2); border:1px solid var(--border); border-radius:var(--r); padding:1rem; display:grid; grid-template-columns:1fr 1fr 1fr auto; gap:.75rem; align-items:end; } @media(max-width:700px) { .source-row { grid-template-columns:1fr 1fr; } } .add-source-btn { align-self:flex-start; } .section-divider { border:none; border-top:1px solid var(--border); margin:1.5rem 0 .5rem; } .section-heading { font-family:"Share Tech Mono",monospace; font-size:.65rem; letter-spacing:.15em; text-transform:uppercase; color:var(--text-3); margin-bottom:.75rem; } .hint { font-size:.72rem; color:var(--text-3); margin-top:.2rem; } .admin-layout { display:grid; grid-template-columns:1fr; gap:1.5rem; } @media(min-width:900px) { .admin-layout { grid-template-columns:220px 1fr; } } .admin-nav { background:var(--surface); border:1px solid var(--border); border-radius:calc(var(--r)+2px); padding:1.2rem; display:flex; flex-direction:column; gap:.4rem; align-self:start; position:sticky; top:1rem; } .admin-nav-label { font-family:"Share Tech Mono",monospace; font-size:.58rem; letter-spacing:.18em; text-transform:uppercase; color:var(--text-3); margin-bottom:.3rem; padding-left:.5rem; } .admin-nav a { display:flex; align-items:center; gap:.6rem; padding:.55rem .75rem; border-radius:var(--r); font-size:.82rem; color:var(--text-2); text-decoration:none; transition:background .15s,color .15s; } .admin-nav a:hover { background:rgba(255,255,255,.05); color:var(--text); } .admin-nav a.active { background:rgba(176,96,255,.12); color:var(--purple); } .nav-divider { border:none; border-top:1px solid var(--border); margin:.4rem 0; } '); ?> Ty Clifford admin / add video View Site Logout = h($error) ?> New Entry Add Video ← Back Video Details Title * Description = h($_POST['description'] ?? '') ?> Duration (seconds) e.g. 3600 = 1 hour. Leave 0 if unknown. Sort Order Lower numbers appear first. Thumbnail Image JPG, PNG, WebP or GIF. Shown as 16:9 preview. > Published Uncheck to save as draft. Video Sources (Multiple Formats) Upload the same video in multiple formats/qualities. The browser will automatically pick the best one it can play. Accepted: MP4, WebM, OGV, MOV, MKV, AVI. Video File Quality Label 1080p 720p 480p 360p 4K — Display Label Sort Add Another Format Save Video Cancel
New Entry
Video Details
Video Sources (Multiple Formats)
Upload the same video in multiple formats/qualities. The browser will automatically pick the best one it can play. Accepted: MP4, WebM, OGV, MOV, MKV, AVI.