Skip to content

Instantly share code, notes, and snippets.

@MrCheatEugene
Created June 8, 2022 23:06
Show Gist options
  • Save MrCheatEugene/0b8e914dc3f5b67e8e63dc5b48255b9f to your computer and use it in GitHub Desktop.
Save MrCheatEugene/0b8e914dc3f5b67e8e63dc5b48255b9f to your computer and use it in GitHub Desktop.
REST API для треков с сайта "Пушного".
<?php
$disablePlayDirect = true; // Отключить прямое воспроизведение (по умолчанию - true)
$useURL = "http://files.pushnoy.ru/tut/"; // Базовый URL, от которого отталкиваются все другие ссылки
$songDOM = new DOMDocument;// Новый DOMDocument
$songDOM->loadHTML(file_get_contents($useURL)); // Загружаем в DOMDocument сгенерированный сервером HTML-код со списком файлов(в том числе музыкальных)
function randomTrack($songDOM,$useURL){ // Случайный трек; Возвращет URL к песне(String)
$links = $songDOM->getElementsByTagName('a'); // Берём все элементы ссылок
$validLinks = array(); // Создаём массив "Верных" ссылок
foreach ($links as $link) {// Перебираем все элементы ссылок
$url =$link->getAttribute("href"); // Получаем ссылку у элемента ссылки
if(strpos($url, ".mp3")!== false){// Если ссылка содержит в себе ".mp3"
array_push($validLinks, $useURL.$url); // Запихиваем в массив "верных" ссылок полную ссылку на файл.
}
}
return strval($validLinks[array_rand($validLinks)]); // Возвращаем случайную композицию
}
function getTrack($songDOM,$name,$useURL){ // Найти трек с названием файла $name, возвращает URL к песне(String), или если песня не найдена - false.
$linksDOM = $songDOM->getElementsByTagName('a');// Берём все элементы ссылок
foreach ($linksDOM as $link) {
$url = $link->getAttribute("href"); // Получаем ссылку из элемента ссылки
similar_text($name, $url,$similar); // Сравниваем ссылку из элемента ссылки с нашим запросом
if ($similar > 50) {// Если нашли похожий по названию файл(ссылка и наш запрос схожи на 50%), возвращаем эту ссылку.
return $useURL.$url;
}elseif (strpos($url,$name) !== false) { // Если не нашли - проверяем входит ли наш запрос в одно из названий файла (similar_text не проверяет - входит ли строка 1 в строку 2), если да - возвращаем ссылку.
return $useURL.$url;
}
}
return false; // Если при прошлых двух проверках foreach не прервался и завершился безрезултьтатно, возвращаем false.
}
// Небольшой обработчик GET-запросов
if (isset($_GET['playDirect']) and $_GET['playDirect'] !== yes) // Если параметр playDirect стоит, но он не имеет значение "yes", то
unset($_GET['playDirect']); // Удалить этот параметр, чтобы не городить кучу условий в обработчике ниже
if (isset($_GET['do']) and $_GET['do'] == "randomTrack" and isset($_GET['playDirect']) == false)
header("Location: ".randomTrack($songDOM,$useURL));// Редирект
elseif (isset($_GET['do']) and $_GET['do'] == "randomTrack" and isset($_GET['playDirect']) and $_GET['playDirect'] == "yes" and $disablePlayDirect == false){// Играть музыку напрямую, без редиректов(композиция скачивается и отдаётся клиенту напрямую). Эта функция не рекомендуется к использованию, в связи с тем, что композиции могут быть защищены авторским правом. Вы можете её отключить установив значение переменной "$disablePlayDirect" на TRUE
header("Content-Type: audio/mpeg");
echo file_get_contents(randomTrack($songDOM,$useURL));// Внимание! Композиция является не цельным файлом, а стримом. Это значит, что длинна композиции и некоторые другие данные могут быть недоступны до конца композиции. Перемотка возможна до конца буфера браузера.
}
elseif (isset($_GET['do']) and $_GET['do'] == "getTrack" and isset($_GET['q']) == false)// Ошибка в запросе(нету параметра q)
echo '"q" (search query) GET parameter required to use getTrack';
elseif (isset($_GET['do']) and $_GET['do'] == "getTrack" and isset($_GET['q'])){ // Воспроизвести трек по названию
$track = getTrack($songDOM,$_GET['q'],$useURL);
if ($track !== false and isset($_GET['playDirect']) == false) // Воспроизвести случайный трек
header("Location: ".$track);// Редирект
elseif (isset($_GET['playDirect']) and $_GET['playDirect'] == "yes"and $disablePlayDirect == false){// Играть музыку напрямую, без редиректов(композиция скачивается и отдаётся клиенту напрямую). Эта функция не рекомендуется к использованию, в связи с тем, что композиции могут быть защищены авторским правом. Вы можете её отключить установив значение переменной "$disablePlayDirect" на TRUE
header("Content-Type: audio/mpeg");
echo file_get_contents($track); // Внимание! Композиция является не цельным файлом, а стримом. Это значит, что длинна композиции и некоторые другие данные могут быть недоступны до конца композиции. Перемотка возможна до конца буфера браузера.
}
else
echo "Track not found";// Если трек не найден(вернулось false)
}
elseif (isset($_GET['do']) and isset($_GET['playDirect']) and $_GET['playDirect'] == "yes" and $disablePlayDirect == true) {// При попытке задействовать отключенное прямое воспроизведение, вывести:
echo "This feature is disabled on this server";// Сообщение о том, что прямое воспроизведение отключено
}
else
echo 'Unknown function';// Неизвестная функция(функция не найдена)
/*
Пример использования GET-Обработчика:
Случайная песня: /api.php?do=randomTrack
Случайная песня с прямым воспроизведением: /api.php?do=randomTrack&playDirect=yes
Песня "Hello": /api.php?do=getTrack&q=Hello
Песня "Hello" с прямым воспроизведением: /api.php?do=getTrack&q=Hello&playDirect=yes
Где /api.php - URL к php-файлу этого API
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment