&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//"; $output = shell_exec($command); if ($output) { $duration = trim($output); // 转换为 MM:SS 格式 list($hours, $minutes, $seconds) = explode(':', $duration); $seconds = floor((float)$seconds); if ((int)$hours > 0) { $minutes = (int)$minutes + (int)$hours * 60; } return sprintf('%d:%02d', $minutes, $seconds); } } // 方法2: 使用getid3库(如果安装了) if (class_exists('getID3')) { $getID3 = new getID3; $fileInfo = $getID3->analyze($file_path); if (!empty($fileInfo['playtime_seconds'])) { $seconds = floor($fileInfo['playtime_seconds']); $minutes = floor($seconds / 60); $seconds = $seconds % 60; return sprintf('%d:%02d', $minutes, $seconds); } } return false; // 无法获取时长 } // 处理审核操作 if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (isset($_POST['approve_id'])) { $id = $_POST['approve_id']; try { // 1. 获取待审核音乐信息(包含BV号和用户输入的时长) $stmt = $conn->prepare("SELECT * FROM pending_music WHERE id = ?"); $stmt->execute([$id]); $music = $stmt->fetch(PDO::FETCH_ASSOC); if ($music) { // 2. 验证音频时长(如果可能) $duration_mismatch = false; $actual_duration = getActualAudioDuration($music['file_path']); if ($actual_duration && $actual_duration !== $music['duration']) { // 时长不匹配,设置标志但仍继续处理(只是提醒管理员) $duration_mismatch = true; $message .= "注意:用户填写的时长({$music['duration']})与实际音频时长({$actual_duration})不匹配。"; } // 3. 将信息插入正式音乐表(包含BV号字段) // 如果有实际时长,使用实际时长覆盖用户输入 $final_duration = $actual_duration ?: $music['duration']; $stmt_insert = $conn->prepare("INSERT INTO music (title, artist, category, description, file_path, duration, upload_time, uploader_name, bvid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"); $stmt_insert->execute([ $music['title'], $music['artist'], $music['category'], $music['description'], $music['file_path'], $final_duration, $music['upload_time'], $music['uploader_name'], $music['bvid'] ?? '' ]); // 4. 从待审核表中删除 $stmt_delete = $conn->prepare("DELETE FROM pending_music WHERE id = ?"); $stmt_delete->execute([$id]); // 构建成功消息 $base_message = "音乐《" . htmlspecialchars($music['title']) . "》已通过审核!"; if ($duration_mismatch) { $message = $base_message . " " . $message; } else { $message = $base_message; } $message_type = "success"; } } catch (PDOException $e) { $message = "数据库错误: " . $e->getMessage(); $message_type = "error"; } } elseif (isset($_POST['reject_id'])) { $id = $_POST['reject_id']; try { // 获取文件路径用于删除 $stmt = $conn->prepare("SELECT file_path, title FROM pending_music WHERE id = ?"); $stmt->execute([$id]); $music = $stmt->fetch(PDO::FETCH_ASSOC); if ($music) { // 删除服务器上的文件 if (file_exists($music['file_path'])) { unlink($music['file_path']); } // 从待审核表中删除记录 $stmt_delete = $conn->prepare("DELETE FROM pending_music WHERE id = ?"); $stmt_delete->execute([$id]); $message = "音乐《" . htmlspecialchars($music['title']) . "》已驳回并删除。"; $message_type = "success"; } } catch (PDOException $e) { $message = "数据库错误: " . $e->getMessage(); $message_type = "error"; } } } // 获取所有待审核音乐(包含BV号)并计算实际时长 try { $stmt = $conn->query("SELECT * FROM pending_music ORDER BY upload_time DESC"); $pending_music = $stmt->fetchAll(PDO::FETCH_ASSOC); // 为每条音乐获取实际时长并检查是否匹配 foreach ($pending_music as &$music) { $actual_duration = getActualAudioDuration($music['file_path']); $music['actual_duration'] = $actual_duration; $music['duration_match'] = ($actual_duration === $music['duration']); } unset($music); // 解除引用 } catch (PDOException $e) { $message = "无法加载待审核列表: " . $e->getMessage(); $message_type = "error"; $pending_music = []; } $categories = [ 'cantonese' => '粤语歌曲', 'mandarin' => '国语歌曲', 'waiyu' => '外语歌曲', 'classic' => '经典老歌', 'other' => '其他音乐' ]; ?> 管理员审核 - 音乐分享平台

音乐审核管理

返回首页

当前没有待审核的音乐。

ID 标题 歌手 上传者 分类 BV号 时长信息 上传时间 预览 操作
用户输入:
实际时长:
时长不匹配,通过审核后将使用实际时长
用户输入:
无法获取实际音频时长