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; }