Чем скачать yandex-плейлист целиком?

Доброго дня,
подскажите, пожалуйста, как скачать плейлист с сервиса яндекс-музыка целиком. В плейлистах по 150-200 треков, выдирать по одному не хотелось бы. Интересуют в первую очередь подборки со страницы music.yandex.ru/oldschool (доступны также по адресу music.yandex.ru/#!/users/Muz-winamp/playlists). Поиск по трекерам ничего не дал, плагины для браузеров качают по 1 записи.
  • Вопрос задан
  • 80311 просмотров
Решения вопроса 1
написал php-скрипт
<?php

const MP3_DIR = '/drive2/Dropbox/backup/mp3/';

require_once __DIR__ . '/vendor/autoload.php';

$curl = new \Zelenin\Curl();

$playlist_url = 'http://music.yandex.ru/?ncrnd=6537#!/users/Muz-winamp/playlists/1046';

preg_match_all( '/users\/(.*)\/playlists\/(.*)/isu', $playlist_url, $matches );

$owner = $matches[1][0];
$playlist_id = $matches[2][0];

$response = $curl->get( 'http://music.yandex.ru/get/playlist2.xml?kinds=' . $playlist_id . '&owner=' . $owner );

$playlist = json_decode( $response['body'], true );

$playlist_title = $playlist['playlists'][0]['title'];

$tracks = implode( ',', $playlist['playlists'][0]['tracks'] );

$response = $curl->get( 'http://music.yandex.ru/get/tracks.xml?tracks=' . urlencode( $tracks ) );

$tracks = json_decode( $response['body'], true );
$tracks = $tracks['tracks'];

$playlist_dir = MP3_DIR . $playlist_title;
if ( !file_exists( $playlist_dir ) && !is_dir( $playlist_dir ) ) {
	mkdir( $playlist_dir );
}

foreach ( $tracks as $track ) {
	$artist =  $track['artist'];
	$title = $track['title'];

	$response = $curl->get( 'http://storage.music.yandex.ru/download-info/' . $track['storage_dir'] . '/2.mp3' );

	$xml = new DOMDocument();
	$xml->loadXML( $response['body'] );

	$host = $xml->getElementsByTagName( 'host' )->item(0)->nodeValue;
	$ts = $xml->getElementsByTagName( 'ts' )->item(0)->nodeValue;
	$path = $xml->getElementsByTagName( 'path' )->item(0)->nodeValue;
	$s = $xml->getElementsByTagName( 's' )->item(0)->nodeValue;
	$n = md5( 'XGRlBW9FXlekgbPrRHuSiA' . substr( $path, 1 ) . $s );

	$mp3_url = 'http://' . $host . '/get-mp3/' . $n . '/' . $ts . $path;
	
	//echo $mp3_url . PHP_EOL;

	$response = $curl->get( $mp3_url );
	$mp3_name = addslashes( $artist . ' - ' . $title . '.mp3' );
	echo $mp3_name . PHP_EOL;
	file_put_contents( MP3_DIR . $playlist_title . '/' . $mp3_name, $response['body'] );
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@dedmaroz
Поиск по трекерам ничего не дал, плагины для браузеров качают по 1 записи.

Написал расширение для браузеров Chrome, Yandex, Opera: https://github.com/egoroof/yandex-music-fisher
Можно качать как треки, так и плейлисты, альбомы и даже дискографию исполнителей.
UPD (01.07.15) - добавлена поддержка ID3 тегов!
Ответ написан
@AnjeyTsibylskij
Ответ написан
Комментировать
MyCTuK
@MyCTuK
использовал денвер на windows, поэтому пришлось немного оптимизировать скрипты

Необходимо в php.ini увеличить время обработки скрипта
max_execution_time = 150

для упрощения задачи, пришлось изменить подключаемый файл (да простит меня автор)
<?php

/**
 * A simple curl wrapper
 *
 * @package Curl
 * @author  Aleksandr Zelenin <aleksandr@zelenin.me>
 * @link    https://github.com/zelenin/Curl
 * @license MIT
 * @version 0.5.0
 */

//namespace Zelenin;

class mCurl
{


добавил проверку на спец.символы и существование скачанного файла:
<?php
const MP3_DIR = 'music/';
include("Curl.php");

$curl = new mCurl();

//$playlist_url = 'http://music.yandex.ru/#!/users/Muz-winamp/playlists/1047';
$playlist_url = 'http://music.yandex.ru/#!/users/muz-winamp/playlists/1046';

preg_match_all( '/users\/(.*)\/playlists\/(.*)/isu', $playlist_url, $matches );

$owner = $matches[1][0];
$playlist_id = $matches[2][0];

$response = $curl->get( 'http://music.yandex.ru/get/playlist2.xml?kinds=' . $playlist_id . '&owner=' . $owner );

$playlist = json_decode( $response['body'], true );

$playlist_title = $playlist['playlists'][0]['title'];
$playlist_title = str_replace("\'","_", $playlist_title);

$tracks = implode( ',', $playlist['playlists'][0]['tracks'] );

$response = $curl->get( 'http://music.yandex.ru/get/tracks.xml?tracks=' . urlencode( $tracks ) );

$tracks = json_decode( $response['body'], true );
$tracks = $tracks['tracks'];

$denied = array ('\\','/',':','?','*','<','>','|','"');
$playlist_title = str_ireplace($denied,"_", $playlist_title);

$playlist_dir = MP3_DIR . $playlist_title;

//iconv('utf-8','windows-1251', $playlist_dir);
echo $playlist_dir ."<br/>";

if ( !file_exists( $playlist_dir ) && !is_dir( $playlist_dir ) ) {
    mkdir( $playlist_dir );
}

$index = 1;
echo "<table>";
foreach ( $tracks as $track ) {
    $artist =  $track['artist'];
    $title = $track['title'];
    
    $response = $curl->get( 'http://storage.music.yandex.ru/download-info/' . $track['storage_dir'] . '/2.mp3' );
    
    $xml = new DOMDocument();
    $xml->loadXML( $response['body'] );

    $host = $xml->getElementsByTagName( 'host' )->item(0)->nodeValue;
    $ts = $xml->getElementsByTagName( 'ts' )->item(0)->nodeValue;
    $path = $xml->getElementsByTagName( 'path' )->item(0)->nodeValue;
    $s = $xml->getElementsByTagName( 's' )->item(0)->nodeValue;
    $n = md5( 'XGRlBW9FXlekgbPrRHuSiA' . substr( $path, 1 ) . $s );

    $mp3_url = 'http://' . $host . '/get-mp3/' . $n . '/' . $ts . $path;
    
    //echo $mp3_url . PHP_EOL;
    
    $mp3_name = addslashes( $artist . ' - ' . $title . '.mp3' );
    echo "<tr><td>".$index."</td><td>" . $mp3_name . PHP_EOL . "</td>";
    //iconv('UTF-8','WINDOWS-1251', $playlist_title);
    //iconv('UTF-8','WINDOWS-1251', $mp3_name);
    
    
    $mp3_name = str_ireplace($denied,"_", $mp3_name);
    
    echo "<td>".$mp3_name . PHP_EOL . "</td>";
    
    if ( !file_exists( MP3_DIR . $playlist_title . '/' . $mp3_name ))  {
        $response = $curl->get( $mp3_url ); 
        file_put_contents( MP3_DIR . $playlist_title . '/' . $mp3_name, $response['body'] );
        echo "<td>downloaded</td></tr>";
    } else {
        echo "<td>exists</td><t/r>";
    };
    $index=$index+1;
 };
 
 echo "</table>";


с кодировкой было лень разбираться, потому что автомагнитола понимает только utf :)
Ответ написан
bobahvas
@bobahvas
Senior Full Stack Developer
с кодировкой было лень разбираться, потому что автомагнитола понимает только utf :)


Так у вас все написано уже. Под windows и denwer

// for folder name
$playlist_title = iconv('utf-8', 'windows-1251',  $playlist_title);
// for song name
$mp3_name = iconv('utf-8', 'windows-1251',  $mp3_name );
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы