216 lines
6.7 KiB
PHP
216 lines
6.7 KiB
PHP
<?php
|
|
|
|
if (!isset($_GET['type']) || !isset($_GET['id'])) {
|
|
echo '参数错误';
|
|
exit;
|
|
}
|
|
|
|
$server = isset($_GET['server']) ? $_GET['server'] : 'netease';
|
|
$type = $_GET['type'];
|
|
$id = $_GET['id'];
|
|
|
|
if (AUTH) {
|
|
$auth = isset($_GET['auth']) ? $_GET['auth'] : '';
|
|
if (in_array($type, ['url', 'pic', 'lrc'])) {
|
|
if ($auth == '' || $auth != auth($server . $type . $id)) {
|
|
http_response_code(403);
|
|
exit;
|
|
}
|
|
}
|
|
}
|
|
|
|
// 数据格式
|
|
if (in_array($type, ['song', 'playlist'])) {
|
|
header('content-type: application/json; charset=utf-8;');
|
|
} else if (in_array($type, ['name', 'lrc', 'artist'])) {
|
|
header('content-type: text/plain; charset=utf-8;');
|
|
}
|
|
|
|
// 允许跨站
|
|
header('Access-Control-Allow-Origin: *');
|
|
header('Access-Control-Allow-Methods: GET');
|
|
|
|
// include __DIR__ . '/vendor/autoload.php';
|
|
// you can use 'Meting.php' instead of 'autoload.php'
|
|
include __DIR__ . '/src/Meting.php';
|
|
|
|
use Metowolf\Meting;
|
|
|
|
$api = new Meting($server);
|
|
$api->format(true);
|
|
|
|
// 设置cookie
|
|
/*if ($server == 'netease') {
|
|
$api->cookie('os=pc; osver=Microsoft-Windows-10-Professional-build-10586-64bit; appver=2.0.3.131777; channel=netease; MUSIC_U=****** ; __remember_me=true');
|
|
}*/
|
|
|
|
if ($type == 'playlist') {
|
|
|
|
if (CACHE) {
|
|
$file_path = __DIR__ . '/cache/playlist/' . $server . '_' . $id . '.json';
|
|
if (file_exists($file_path)) {
|
|
if ($_SERVER['REQUEST_TIME'] - filectime($file_path) < CACHE_TIME) {
|
|
echo file_get_contents($file_path);
|
|
exit;
|
|
}
|
|
}
|
|
}
|
|
|
|
$data = $api->playlist($id);
|
|
if ($data == '[]') {
|
|
echo '{"error":"unknown playlist id"}';
|
|
exit;
|
|
}
|
|
$data = json_decode($data);
|
|
$playlist = array();
|
|
foreach ($data as $song) {
|
|
$playlist[] = array(
|
|
'title' => $song->name,
|
|
'artist' => implode('/', $song->artist),
|
|
'mp3' => API_URI . '?server=' . $song->source . '&type=url&id=' . $song->url_id . (AUTH ? '&auth=' . auth($song->source . 'url' . $song->url_id) : ''),
|
|
'cover' => API_URI . '?server=' . $song->source . '&type=pic&id=' . $song->pic_id . (AUTH ? '&auth=' . auth($song->source . 'pic' . $song->pic_id) : ''),
|
|
);
|
|
}
|
|
$playlist = json_encode($playlist);
|
|
|
|
if (CACHE) {
|
|
// ! mkdir /cache/playlist
|
|
file_put_contents($file_path, $playlist);
|
|
}
|
|
|
|
echo $playlist;
|
|
} else {
|
|
$need_song = !in_array($type, ['url', 'pic', 'lrc']);
|
|
if ($need_song && !in_array($type, ['name', 'artist', 'song'])) {
|
|
echo '{"error":"unknown type"}';
|
|
exit;
|
|
}
|
|
|
|
if (APCU_CACHE) {
|
|
$apcu_time = $type == 'url' ? 600 : 36000;
|
|
$apcu_type_key = $server . $type . $id;
|
|
if (apcu_exists($apcu_type_key)) {
|
|
$data = apcu_fetch($apcu_type_key);
|
|
return_data($type, $data);
|
|
}
|
|
if ($need_song) {
|
|
$apcu_song_id_key = $server . 'song_id' . $id;
|
|
if (apcu_exists($apcu_song_id_key)) {
|
|
$song = apcu_fetch($apcu_song_id_key);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!$need_song) {
|
|
$data = song2data($api, null, $type, $id);
|
|
} else {
|
|
if (!isset($song)) $song = $api->song($id);
|
|
if ($song == '[]') {
|
|
echo '{"error":"unknown song"}';
|
|
exit;
|
|
}
|
|
if (APCU_CACHE) {
|
|
apcu_store($apcu_song_id_key, $song, $apcu_time);
|
|
}
|
|
$data = song2data($api, json_decode($song)[0], $type, $id);
|
|
}
|
|
|
|
if (APCU_CACHE) {
|
|
apcu_store($apcu_type_key, $data, $apcu_time);
|
|
}
|
|
|
|
return_data($type, $data);
|
|
}
|
|
|
|
function api_uri() // static
|
|
{
|
|
return (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . strtok($_SERVER['REQUEST_URI'], '?');
|
|
}
|
|
|
|
function auth($name)
|
|
{
|
|
return hash_hmac('sha1', $name, AUTH_SECRET);
|
|
}
|
|
|
|
function song2data($api, $song, $type, $id)
|
|
{
|
|
$data = '';
|
|
switch ($type) {
|
|
case 'name':
|
|
$data = $song->name;
|
|
break;
|
|
|
|
case 'artist':
|
|
$data = implode('/', $song->artist);
|
|
break;
|
|
|
|
case 'url':
|
|
$m_url = json_decode($api->url($id, 320))->url;
|
|
if ($m_url == '') break;
|
|
// url format
|
|
if ($api->server == 'netease') {
|
|
if ($m_url[4] != 's') $m_url = str_replace('http', 'https', $m_url);
|
|
}
|
|
|
|
$data = $m_url;
|
|
break;
|
|
|
|
case 'pic':
|
|
$data = json_decode($api->pic($id, 90))->url;
|
|
break;
|
|
|
|
case 'lrc':
|
|
$lrc_data = json_decode($api->lyric($id));
|
|
if ($lrc_data->lyric == '') {
|
|
$lrc = '[00:00.00]这似乎是一首纯音乐呢,请尽情欣赏它吧!';
|
|
} else if ($lrc_data->tlyric == '') {
|
|
$lrc = $lrc_data->lyric;
|
|
} else if (TLYRIC) { // lyric_cn
|
|
$lrc_arr = explode("\n", $lrc_data->lyric);
|
|
$lrc_cn_arr = explode("\n", $lrc_data->tlyric);
|
|
$lrc_cn_map = array();
|
|
foreach ($lrc_cn_arr as $i => $v) {
|
|
if ($v == '') continue;
|
|
$line = explode(']', $v, 2);
|
|
// 格式化处理
|
|
$line[1] = trim(preg_replace('/\s\s+/', ' ', $line[1]));
|
|
$lrc_cn_map[$line[0]] = $line[1];
|
|
unset($lrc_cn_arr[$i]);
|
|
}
|
|
foreach ($lrc_arr as $i => $v) {
|
|
if ($v == '') continue;
|
|
$key = explode(']', $v, 2)[0];
|
|
if (!empty($lrc_cn_map[$key]) && $lrc_cn_map[$key] != '//') {
|
|
$lrc_arr[$i] .= ' (' . $lrc_cn_map[$key] . ')';
|
|
unset($lrc_cn_map[$key]);
|
|
}
|
|
}
|
|
$lrc = implode("\n", $lrc_arr);
|
|
} else {
|
|
$lrc = $lrc_data->lyric;
|
|
}
|
|
$data = $lrc;
|
|
break;
|
|
|
|
case 'song':
|
|
$data = json_encode(array(array(
|
|
'title' => $song->name,
|
|
'artist' => implode('/', $song->artist),
|
|
'mp3' => API_URI . '?server=' . $song->source . '&type=url&id=' . $song->url_id . (AUTH ? '&auth=' . auth($song->source . 'url' . $song->url_id) : ''),
|
|
'cover' => API_URI . '?server=' . $song->source . '&type=pic&id=' . $song->pic_id . (AUTH ? '&auth=' . auth($song->source . 'pic' . $song->pic_id) : ''),
|
|
)));
|
|
break;
|
|
}
|
|
if ($data == '') exit;
|
|
return $data;
|
|
}
|
|
|
|
function return_data($type, $data)
|
|
{
|
|
if (in_array($type, ['url', 'pic'])) {
|
|
header('Location: ' . $data);
|
|
} else {
|
|
echo $data;
|
|
}
|
|
exit;
|
|
} |