Files
SunShineMusic/api.php
2025-09-24 14:14:45 +00:00

279 lines
8.2 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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();
?>