279 lines
8.2 KiB
PHP
279 lines
8.2 KiB
PHP
|
|
<?php
|
|||
|
|
header('Content-Type: application/json; charset=utf-8');
|
|||
|
|
|
|||
|
|
// 允许跨域请求(方便其他网站调用)
|
|||
|
|
header("Access-Control-Allow-Origin: *");
|
|||
|
|
header("Access-Control-Allow-Methods: GET");
|
|||
|
|
|
|||
|
|
// 数据库连接信息
|
|||
|
|
$servername = "localhost";
|
|||
|
|
$username = "a1sax1m9i";
|
|||
|
|
$password = "a1sax1m9i";
|
|||
|
|
$dbname = "a1sax1m9i";
|
|||
|
|
|
|||
|
|
// 创建数据库连接
|
|||
|
|
$conn = new mysqli($servername, $username, $password, $dbname);
|
|||
|
|
|
|||
|
|
// 检查连接
|
|||
|
|
if ($conn->connect_error) {
|
|||
|
|
die(json_encode(array(
|
|||
|
|
"success" => false,
|
|||
|
|
"message" => "数据库连接失败: " . $conn->connect_error
|
|||
|
|
)));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 设置数据库连接字符集
|
|||
|
|
$conn->set_charset("utf8mb4");
|
|||
|
|
|
|||
|
|
// 获取硬编码音乐数据
|
|||
|
|
function getHardcodedMusic() {
|
|||
|
|
$musicPath = __DIR__ . '/data/music.php';
|
|||
|
|
|
|||
|
|
// 检查文件是否存在
|
|||
|
|
if (!file_exists($musicPath)) {
|
|||
|
|
return array(
|
|||
|
|
"success" => false,
|
|||
|
|
"message" => "硬编码音乐文件不存在",
|
|||
|
|
"data" => array()
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 读取硬编码音乐(使用require_once并捕获返回值)
|
|||
|
|
$hardcodedMusic = require_once $musicPath;
|
|||
|
|
|
|||
|
|
// 验证数据格式
|
|||
|
|
if (is_array($hardcodedMusic)) {
|
|||
|
|
return array(
|
|||
|
|
"success" => true,
|
|||
|
|
"message" => "成功获取硬编码音乐",
|
|||
|
|
"data" => $hardcodedMusic
|
|||
|
|
);
|
|||
|
|
} else {
|
|||
|
|
return array(
|
|||
|
|
"success" => false,
|
|||
|
|
"message" => "硬编码音乐格式不正确",
|
|||
|
|
"data" => array()
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 从数据库获取音乐
|
|||
|
|
function getDatabaseMusic($conn) {
|
|||
|
|
$sql = "SELECT id, title, artist, category, mp3, bvid, duration FROM music";
|
|||
|
|
$result = $conn->query($sql);
|
|||
|
|
|
|||
|
|
$musicList = array();
|
|||
|
|
if ($result && $result->num_rows > 0) {
|
|||
|
|
while ($row = $result->fetch_assoc()) {
|
|||
|
|
$musicList[] = $row;
|
|||
|
|
}
|
|||
|
|
return array(
|
|||
|
|
"success" => true,
|
|||
|
|
"message" => "成功获取数据库音乐",
|
|||
|
|
"data" => $musicList
|
|||
|
|
);
|
|||
|
|
} else {
|
|||
|
|
return array(
|
|||
|
|
"success" => false,
|
|||
|
|
"message" => "数据库中没有找到音乐数据",
|
|||
|
|
"data" => array()
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取所有音乐(合并数据库和硬编码)
|
|||
|
|
function getAllMusic($conn) {
|
|||
|
|
// 获取两种来源的音乐
|
|||
|
|
$dbMusic = getDatabaseMusic($conn);
|
|||
|
|
$hardcodedMusic = getHardcodedMusic();
|
|||
|
|
|
|||
|
|
// 合并音乐列表(去重处理)
|
|||
|
|
$allMusic = array();
|
|||
|
|
$ids = array();
|
|||
|
|
|
|||
|
|
// 添加数据库音乐
|
|||
|
|
foreach ($dbMusic['data'] as $music) {
|
|||
|
|
$id = $music['id'];
|
|||
|
|
if (!in_array($id, $ids)) {
|
|||
|
|
$ids[] = $id;
|
|||
|
|
$allMusic[] = $music;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 添加硬编码音乐
|
|||
|
|
foreach ($hardcodedMusic['data'] as $music) {
|
|||
|
|
$id = $music['id'];
|
|||
|
|
if (!in_array($id, $ids)) {
|
|||
|
|
$ids[] = $id;
|
|||
|
|
$allMusic[] = $music;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return array(
|
|||
|
|
"success" => true,
|
|||
|
|
"message" => "共获取 " . count($allMusic) . " 首音乐(数据库: " . count($dbMusic['data']) . ", 硬编码: " . count($hardcodedMusic['data']) . ")",
|
|||
|
|
"data" => $allMusic,
|
|||
|
|
"sources" => array(
|
|||
|
|
"database" => $dbMusic['success'],
|
|||
|
|
"hardcoded" => $hardcodedMusic['success']
|
|||
|
|
)
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取音乐标签(合并数据库和硬编码)
|
|||
|
|
function getMusicTags($conn) {
|
|||
|
|
// 获取所有音乐
|
|||
|
|
$allMusic = getAllMusic($conn);
|
|||
|
|
$tags = array();
|
|||
|
|
|
|||
|
|
if ($allMusic['success']) {
|
|||
|
|
foreach ($allMusic['data'] as $music) {
|
|||
|
|
if (!empty($music['category']) && !in_array($music['category'], $tags)) {
|
|||
|
|
$tags[] = $music['category'];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return array(
|
|||
|
|
"success" => !empty($tags),
|
|||
|
|
"message" => empty($tags) ? "没有找到音乐标签" : "成功获取 " . count($tags) . " 个标签",
|
|||
|
|
"data" => $tags
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取音乐地址(同时检查数据库和硬编码)
|
|||
|
|
/**
|
|||
|
|
* 获取音乐地址(同时检查数据库和硬编码)- 修复版
|
|||
|
|
* 增加了对 SQL 语句准备失败的检查,避免触发 500 错误。
|
|||
|
|
*/
|
|||
|
|
/**
|
|||
|
|
* 获取音乐的分享播放URL
|
|||
|
|
* 直接返回格式为 shanwogou.cn/audio/play.php?play=音乐id 的链接
|
|||
|
|
*/
|
|||
|
|
function getMusicUrl($conn) {
|
|||
|
|
// 1. 验证输入的音乐ID
|
|||
|
|
$musicId = $_GET['id'] ?? '';
|
|||
|
|
if (empty($musicId)) {
|
|||
|
|
return array(
|
|||
|
|
"success" => false,
|
|||
|
|
"message" => "音乐 ID 不能为空"
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 2. 核心逻辑:检查该ID的音乐是否存在于系统中
|
|||
|
|
// (我们不再返回真实MP3地址,但需要确认音乐ID是有效的)
|
|||
|
|
$musicExists = false;
|
|||
|
|
|
|||
|
|
// 2.1 先检查数据库
|
|||
|
|
$sql = "SELECT id FROM music WHERE id = ?"; // 只需检查ID是否存在
|
|||
|
|
$stmt = $conn->prepare($sql);
|
|||
|
|
|
|||
|
|
if ($stmt) { // 检查prepare是否成功
|
|||
|
|
$stmt->bind_param("s", $musicId);
|
|||
|
|
$stmt->execute();
|
|||
|
|
$stmt->store_result();
|
|||
|
|
|
|||
|
|
if ($stmt->num_rows > 0) {
|
|||
|
|
$musicExists = true;
|
|||
|
|
}
|
|||
|
|
$stmt->close();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 2.2 如果数据库中不存在,再检查硬编码文件
|
|||
|
|
if (!$musicExists) {
|
|||
|
|
$hardcodedMusic = getHardcodedMusic();
|
|||
|
|
if ($hardcodedMusic['success']) {
|
|||
|
|
foreach ($hardcodedMusic['data'] as $music) {
|
|||
|
|
if ((string)$music['id'] === (string)$musicId) {
|
|||
|
|
$musicExists = true;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 3. 根据检查结果返回响应
|
|||
|
|
if ($musicExists) {
|
|||
|
|
// 如果音乐存在,生成并返回分享URL
|
|||
|
|
$shareUrl = "https://shanwogou.cn/audio/play.php?play=" . urlencode($musicId);
|
|||
|
|
return array(
|
|||
|
|
"success" => true,
|
|||
|
|
"data" => $shareUrl,
|
|||
|
|
"source" => "share_link" // 标记来源为分享链接
|
|||
|
|
);
|
|||
|
|
} else {
|
|||
|
|
// 如果音乐不存在,返回错误信息
|
|||
|
|
return array(
|
|||
|
|
"success" => false,
|
|||
|
|
"message" => "没有找到该 ID 的音乐"
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function getAnnouncements($conn) {
|
|||
|
|
// 准备SQL查询,从announcements表中获取所有记录,并按ID倒序排列(最新的在前)
|
|||
|
|
$sql = "SELECT id, nr, time FROM announcements ORDER BY id DESC";
|
|||
|
|
|
|||
|
|
// 执行查询
|
|||
|
|
$result = $conn->query($sql);
|
|||
|
|
|
|||
|
|
// 初始化一个空数组来存储公告数据
|
|||
|
|
$announcementList = array();
|
|||
|
|
|
|||
|
|
// 检查查询是否成功且有结果
|
|||
|
|
if ($result && $result->num_rows > 0) {
|
|||
|
|
// 循环遍历所有结果行
|
|||
|
|
while ($row = $result->fetch_assoc()) {
|
|||
|
|
// 将每一行公告数据添加到数组中
|
|||
|
|
$announcementList[] = $row;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 返回成功响应,包含公告数据
|
|||
|
|
return array(
|
|||
|
|
"success" => true,
|
|||
|
|
"message" => "成功获取 " . count($announcementList) . " 条公告",
|
|||
|
|
"data" => $announcementList
|
|||
|
|
);
|
|||
|
|
} else {
|
|||
|
|
// 如果查询失败或没有数据,返回失败响应
|
|||
|
|
return array(
|
|||
|
|
"success" => false,
|
|||
|
|
"message" => "没有找到公告数据或查询失败",
|
|||
|
|
"data" => array()
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 处理请求
|
|||
|
|
// 处理请求
|
|||
|
|
$action = $_GET['action'] ?? '';
|
|||
|
|
|
|||
|
|
switch ($action) {
|
|||
|
|
case 'getAllMusic':
|
|||
|
|
$response = getAllMusic($conn);
|
|||
|
|
break;
|
|||
|
|
case 'getMusicTags':
|
|||
|
|
$response = getMusicTags($conn);
|
|||
|
|
break;
|
|||
|
|
case 'getMusicUrl':
|
|||
|
|
$response = getMusicUrl($conn);
|
|||
|
|
break;
|
|||
|
|
// --- 新增部分 ---
|
|||
|
|
case 'getAnnouncements':
|
|||
|
|
$response = getAnnouncements($conn);
|
|||
|
|
break;
|
|||
|
|
// --- 新增结束 ---
|
|||
|
|
default:
|
|||
|
|
$response = array(
|
|||
|
|
"success" => false,
|
|||
|
|
"message" => "无效的操作,请使用 action=getAllMusic、getMusicTags、getMusicUrl 或 getAnnouncements"
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 输出JSON响应
|
|||
|
|
echo json_encode($response, JSON_UNESCAPED_UNICODE);
|
|||
|
|
|
|||
|
|
// 关闭数据库连接
|
|||
|
|
$conn->close();
|
|||
|
|
?>
|