1 окт в 21:45 (OFF) XopmoH : Написал скрипт, который скачивает всю музыку пользователя ;-)
Всем привет!
Написал скрипт, который скачивает всю музыку пользователя или отельную папку с музыкой (по ссылке). Скрипт скачивает все вложенные папки (независимо от уровня вложенности) и создаёт такую же структуру папок с такими же названиями на ПК, куда качаете музыку.
Скрипт сохраняет музыку с нормальными красивыми именами файлов, например: "Illenium & Liam ODonnell - Its All On U (Original Mix).mp3", название файла будет такое же, как название трека на сайте.
Скрипт работает через API spaces.ru.
Скрипт написан на языке PHP (php-cli), т.е. чтобы его запустить нужно установить php-интерпретатор.

Запуск скрипта под linux/MacOS:
1. chmod +x spaces.php
2. ./spaces.php (не забудьте точку в начале команды)
Запуск скрипта под Windows:
php -f spaces.php Скриншоты с примером работы скрипта + сам скрипт приложил к записи.
+вот ещё листинг файла скрипта:
#!/usr/bin/env php
<?php
set_time_limit(0);
error_reporting(E_ALL);

function getContent($ch) {
return json_decode(curl_exec($ch))->content;
}

function countPages($html) {
preg_match('/> 1 из (\d+) </', $html, $pages);

return isset($pages[1]) ? $pages[1] : 1;
}

function getMP3($html) {
preg_match_all('/"([^"]+\.mp3)"/', $html, $links);

return (count($links[1]) > 0 ? $links[1] : []);
}

function getNames($html) {
preg_match_all('/m break-word darkblue break-word">(.*?)</', $html, $names);
$decodedNames = [];
if(count($names[1]) > 0) {
foreach($names[1] as $name) {
$name = str_replace('/', '', $name);
$name = str_replace('\\', '', $name);
$name = preg_replace('/\s{2,}/', ' ', $name);
$decodedNames[] = htmlspecialchars_decode($name);
}
}

return $decodedNames;
}

function getDirs($html, $parent = '') {
$allDirs = [];
preg_match_all('/index\/(\S+)\/(\d+).*?m break-word">([^\(]+)\(/', $html, $dirs);
if(count($dirs[3]) > 0) {
$username = $dirs[1][0];
foreach($dirs[3] as $key => $value) {
$value = str_replace('/', '', $value);
$value = str_replace('\\', '', $value);
$value = preg_replace('/\s{2,}/', ' ', $value);
$allDirs[((!empty($parent) ? $parent . DIRECTORY_SEPARATOR : '') . trim($value))] = "https://gdespaces.com/ajax/music/index/{$username}/{$dirs[2][$key]}/";
}
}

return $allDirs;
}

function downloadMusic($mp3, $mp3_names, $save_to, &$files_counter) {
global $mp3_counter;

foreach($mp3_names as $key => $name) {
echo "{$files_counter}. {$name} -> ";
if(file_exists("{$save_to}/{$name}.mp3")) {
$save_name = "{$save_to}/{$name}_" . time() . ".mp3";
} else {
$save_name = "{$save_to}/{$name}.mp3";
}
if(copy($mp3[$key], $save_name)) {
echo "OK! :-)\n";
} else {
echo "ОШИБКА! :-(\n";
}

$files_counter++;
$mp3_counter++;
}
}

function timeFormat($time) {
$sec = $time % 60;
$time = floor($time / 60);
$min = $time % 60;
$time = floor($time / 60);
$hours = $time % 60;

if($min{strlen($min) - 1} == 1 && $min != 11) {
$min_ru = 'минуту';
} elseif($min{strlen($min) - 1} >= 2 && $min{strlen($min) - 1} <= 4) {
$min_ru = 'минуты';
} else {
$min_ru = 'минут';
}

if($sec{strlen($sec) - 1} == 1 && $sec != 11) {
$sec_ru = 'секунду';
} elseif($sec{strlen($sec) - 1} >= 2 && $sec{strlen($sec) - 1} <= 4) {
$sec_ru = 'секунды';
} else {
$sec_ru = 'секунд';
}

if($hours{strlen($hours) - 1} == 1) {
$hours_ru = 'час';
} elseif($hours{strlen($hours) - 1} >= 2 && $hours{strlen($hours) - 1} <= 4) {
$hours_ru = 'часа';
} else {
$hours_ru = 'часов';
}

if($min > 0 && $sec == 0) {
$sec_str = '';
} else {
$sec_str = "{$sec} {$sec_ru}";
}

return (($hours > 0) ? "{$hours} {$hours}, " : '') . (($min > 0) ? "{$min} {$min_ru}, " : '') . $sec_str;
}

echo "--- SPACES MUSIC DOWNLOADER ---\n";
echo "----- Developed by XopmoH -----\n\n";

echo "Введите ник пользователя, музыку которого хотите скачать.\n";
$user = strtolower(trim(readline("Ник: ")));
echo "Если хотите скачать какую-то отдельную папку с музыкой, введите в поле ссылку на папку или оставьте поле пустым если хотите скачать всю музыку пользователя '{$user}'\n";
$dirUrl = trim(readline("Ссылка на папку: "));
if(!empty($dirUrl)) {
if(preg_match('/\/(\d+)\//', $dirUrl, $dirId)) {
$dirUrl = "https://gdespaces.com/ajax/music/index/{$user}/{$dirId[1]}/";
} else {
$dirUrl = "";
echo "Некорректная ссылка на папку, но ничего страшно, пробуем скачать всю музыку пользователя '{$user}' ;-)\n";
}
}

$startTime = time();
echo "Время начала операции: " . date('Y-m-d H:i:s', $startTime) . "\n";

$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,
]);

$mp3_counter = 0;
function recursiveDownloadMusic($dirsAll = [], $path = "", $pathname = "") {
global $ch;
global $user;

if(empty($path)) {
$url = "https://gdespaces.com/ajax/music/index/{$user}/";
} else {
$url = $path;
}
curl_setopt($ch, CURLOPT_URL, $url);
$content = getContent($ch);
$pages = countPages($content);
$dirs = getDirs($content, $pathname);
$mp3 = getMP3($content);
$mp3_names = getNames($content);

if(!empty($pathname)) {
echo "\n--- {$pathname} ---\n";
}
echo "Найдено папок: " . count($dirs) . "\n";
if(count($mp3) > 0) {
echo "Найдено страниц музыки: {$pages}\n";
$save_to = "SPACES MUSIC - {$user}" . (!empty($pathname) ? DIRECTORY_SEPARATOR . $pathname : '');
echo "Музыка будет сохранена в папку '{$save_to}'\n";
if(!is_dir($save_to)) {
mkdir($save_to);
}
$files_counter = 1;
for($i = 1; $i <= $pages; $i++) {
if($i > 1) {
curl_setopt($ch, CURLOPT_URL, "$url?p={$i}");
$content = getContent($ch);
$mp3 = getMP3($content);
$mp3_names = getNames($content);
}
downloadMusic($mp3, $mp3_names, $save_to, $files_counter);
}

reset($dirsAll);
if(count($dirsAll) > 0) {
unset($dirsAll[key($dirsAll)]);
}
$dirsAll = array_merge($dirsAll, $dirs);
reset($dirsAll);
if(count($dirsAll) > 0) {
$dir = key($dirsAll);
recursiveDownloadMusic($dirsAll, $dirsAll[$dir], $dir);
}
} else {
echo "В этой папке нет музыки! :-(\n";
}
}
if(empty($dirUrl)) {
recursiveDownloadMusic();
} else {
recursiveDownloadMusic([], $dirUrl, $dirId[1]);
}

$endTime = time();
echo "Время конца операции: " . date('Y-m-d H:i:s', $endTime) . "\n";
$processTime = timeFormat($endTime - $startTime);
echo "\nВсего загружено {$mp3_counter} треков за {$processTime}!\n";

curl_close($ch);

Метки: php, музыка, api, spaces
68 0 7 0
← Пред. След. →

Комментарии (3)

у сракеса есть апи?
Да, приложение для Android через него работает +вроде ajax самого сайта тоже. Но документации открытой нет, я сниффал трафик моб. прилажки с помощью mitmproxy. Правда хреновое у них api, отдаёт части html-кода в json, вместо нормальных массивов)
Показать комментарий
Скрыть комментарий
Для добавления комментариев необходимо авторизоваться
Варвары
Варвары - это непрерывная война между Севером и...
Версия: Mobile | Lite | Touch | Доступно в Google Play