Skip to content

Instantly share code, notes, and snippets.

@bagart
Last active September 30, 2019 16:38
Show Gist options
  • Save bagart/bf95ffd4e2a854f473979c546a279217 to your computer and use it in GitHub Desktop.
Save bagart/bf95ffd4e2a854f473979c546a279217 to your computer and use it in GitHub Desktop.
vk music downloader (однопоточный)
<?php
# Download m3u with https://t.me/BeatSpotBot
ini_set('memory_limit', '1G').
$PATH_DOWNLOAD = './download';
$PLAYLIST_FILENAME = 'playlist.m3u8';
$EXIT_ON_DOUBLE = false;
$STRIP_SOURCE = true;
$STRIP_NAME = true;
$SKIP_DOWNLOAD_REPEAT = true;
if (!is_dir($PATH_DOWNLOAD) && !mkdir($PATH_DOWNLOAD, 0777, true) && !is_dir($PATH_DOWNLOAD)) {
throw new \RuntimeException(sprintf('Directory "%s" was not created', $PATH_DOWNLOAD));
}
$tracks = preg_split(
'~#EXTINF:\d+,~',
preg_replace(
'~^#EXTM3U\n~',
'',
file_get_contents($PLAYLIST_FILENAME)
)
);
$prepared_tracks = [];
$error = 0;
$double = 0;
foreach ($tracks as $track) {
if ($track === '') {
continue;
}
$track_fields = explode("\n", trim($track));
if (
array_key_exists(2, $track_fields)
|| !array_key_exists(1, $track_fields)
|| !preg_match('~^https?://[^\s]+~', $track_fields[1])
|| !$track_fields[0]
) {
echo 'ERROR: ';
var_dump($track, $track_fields);
++$error;
}
list($name, $url) = $track_fields;
$orig_name = $name;
if ($STRIP_SOURCE) {
$name = preg_replace('~\[(\s*(OST|ост|Remix|feat|\d{2})[^\]\[]*)\]~iu', '($1)', $name);
$name = preg_replace('~\[[^\]\[]*\]~', '', $name);
}
if ($STRIP_NAME) {
$name = preg_replace('~[^a-z0-9а-яёЁ\-\(\)\.!`\'$&,#+]+~iu', ' ', $name);
$name = preg_replace('~\s+\)~iu', ')', $name);
$name = preg_replace('~\(\s+~iu', '(', $name);
$name = mb_substr($name, 0, 250);
}
$name = trim($name);
$key = strtolower($name);
if (
!empty($prepared_tracks[$key])
&& $prepared_tracks[$key]['url'] !== $url
) {
echo "DOUBLE: {$name}\n";
++$double;
} else {
$prepared_tracks[$key] = [
'name' => $name,
'url' => $url,
'orig_name' => $orig_name,
];
}
}
if (
$error
|| ($EXIT_ON_DOUBLE && $double)
) {
exit;
}
unset($tracks);
foreach ($prepared_tracks as $track) {
$filename = "{$PATH_DOWNLOAD}/{$track['name']}.mp3";
if (!$SKIP_DOWNLOAD_REPEAT || !file_exists($filename) || !filesize($filename)) {
file_put_contents(
$filename,
file_get_contents($track['url'])
);
echo '.';
} else {
echo '-';
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment