Как скачать .mp3 по ссылке

foshechka

Постоялец
Регистрация
24 Мар 2009
Сообщения
658
Реакции
121
Доброго времени суток!
Есть ссылка типа:
Подскажите, пожалуйста, как правильно сделать, чтобы при нажатии на нее
появлялось окно с предложением сохранить "'артист'-'название песни'.mp3" файл?
А то сейчас при нажатии открывается новая вкладка и воспроизводится трек.
 
установить vkopt chrome
 
Для firefox плагин savefrom
 
Доброго времени суток!
Есть ссылка типа:

Подскажите, пожалуйста, как правильно сделать, чтобы при нажатии на нее
появлялось окно с предложением сохранить "'артист'-'название песни'.mp3" файл?
А то сейчас при нажатии открывается новая вкладка и воспроизводится трек.
Вы хотите где-то у себя на сайте разместить подобные ссылки?
 
Ребята, мне нужно сделать это в коде на сайте. Подскажите, как это сделать?
Без использования посторонних плагинов в браузерах.
 
Вам нужно готовый код написать или просто подсказать как реализовать? Если как реализовать, то вот так: на входе есть название автора и композиции, ссылка на песню. Далее все это передаем в скрипт обработчик-ретранслятор, который будет в реальном времени скачивать контент по ссылке и отдавать на скачивание юзеру. Вот и все.

А сделать так, чтобы можно было скачать без ретранслятора нельзя. Хотя в принципе можно на flash сделать, наверное.
 
Вам нужно готовый код написать или просто подсказать как реализовать? Если как реализовать, то вот так: на входе есть название автора и композиции, ссылка на песню. Далее все это передаем в скрипт обработчик-ретранслятор, который будет в реальном времени скачивать контент по ссылке и отдавать на скачивание юзеру. Вот и все.

А сделать так, чтобы можно было скачать без ретранслятора нельзя. Хотя в принципе можно на flash сделать, наверное.
Уважаемый, а можно теперь весь ваш текст написать в коде?:ah:
 
Уважаемый, а можно теперь весь ваш текст написать в коде?:ah:
Надеюсь вы освоили VK api, создали там свое приложение и ссылки получаете именно через него, иначе вся затея не имеет смысла. Предположим, что да - мало того, что VK генерирует не долго живущие файлы и ссылка не будет вечной (для этого и нужен апи), так еще и получить по ней файл может только запросивший, т.е. если ваш сервер отправлял запрос на VK, то песня будет доступна только ему. Можно воспользоваться методом, предложенным выше, т.е. скачивать файл на сервер и уже отдавать пользователю, но так и дольше и не удобней. Я реализовал другим способом - использовал Для просмотра ссылки Войди или Зарегистрируйся, с помощью которого можно сразу отдавать файл пользователю, без предварительного скачивания, а в моем случае еще и сразу начать воспроизводить песню в плеере на странице. Трафик конечно все равно будет идти через свой сервер, но задержек при этом уже не будет.
Хотите кода? Тут в пару строк не решается...
Простой класс для взаимодействия с VK
PHP:
class vkapi {
    var $api_secret;
    var $app_id;
    var $api_url;
    var $token;

    function vkapi($app_id, $api_secret, $api_url = 'api.vk.com/method', $token) {
        $this->app_id = $app_id;
        $this->token = $token;
        $this->api_secret = $api_secret;
        if (!strstr($api_url, 'https://')) $api_url = 'https://'.$api_url;
        $this->api_url = $api_url;
    }

    function api($method,$params=false) {
        if (!$params) $params = array();
        $params['api_id'] = $this->app_id;
        $params['v'] = '5.24';
        //$params['method'] = $method;
        $params['timestamp'] = time();
        $params['format'] = 'json';
        $params['random'] = rand(0,10000);
        $params['access_token'] = $this->token;
        ksort($params);
        $sig = '';
        foreach($params as $k=>$v) {
            $sig .= $k.'='.$v;
        }
        $sig .= $this->api_secret;
        $params['sig'] = md5($sig);
        $query = $this->api_url.'/'.$method.'?'.$this->params($params);
        $res = file_get_contents($query);
        return json_decode($res, true);
        //echo $query.'<br>';
    }

    function params($params) {
        $pice = array();
        foreach($params as $k=>$v) {
            $pice[] = $k.'='.urlencode($v);
        }
        return implode('&',$pice);
    }
}
Файл download.php на который передается запрос, т.е. ссылка будет иметь вид "Для просмотра ссылки Войди или Зарегистрируйся", т.е. передаем файлу только id песни, все остальное он сделает сам
PHP:
require_once('vk-class.php' );
$proxy_path = '/ph/index.php'; //путь к прокси

function vkh_download_mp3($song_id) { //в $song_id передается id песни вида ownerid_songid
    $api_id = get_vk_params('api_id');
    $secret_key = get_vk_params('api_key');
    $token = get_vk_params('token');

    $mid_arr = explode('_', $song_id);
    $owner_id = $mid_arr[0];
    $mid = $mid_arr[1];

    $VK = new vkapi($api_id, $secret_key, 'api.vk.com/method', $token);
    $type = 'audio_ids';
 
    $song_arr = $VK->api('audio.get', array('owner_id'=>$owner_id, $type=>$mid));
    $out = array();
    foreach($song_arr['response']['items'] as $song)
        {
            $song['name'] = $song['artist'].' - '.$song['title'].'.mp3'; //формируем название файла
            $song['oid'] = $owner_id.'_'.$song['id'];
            $song_pre_arr = explode('?',str_replace(array('http://', 'https://'), array('',''), $song['url']));
            $song_pre = $song_pre_arr[0];
            $song['url'] = site_url().$proxy_path.'?q='.$song_pre;
            $out[] = $song;
        }

    return $out;
}
//echo 'ok';

if(isset($_REQUEST['song_id']) && $_REQUEST['song_id'] != '')
    {
 
        $song_arr = vkh_download_mp3($_REQUEST['song_id']);
        $furl = $song_arr[0]['url'];
        //echo $furl.'--';
 
        $fname = $song_arr[0]['name'];
        $Headers = @get_headers($furl);

 
        if(strstr($Headers[0], '200')) {
            //echo 'ok';
     
            header('Content-Description: File Transfer');
            header('Content-Type: audio/mpeg');
            header('Content-Disposition: attachment; filename="'.$fname.'"');
            header('Content-Transfer-Encoding: binary');
            header('Expires: 0');
            header('Cache-Control: must-revalidate');
            header('Pragma: public');
            header($Headers[11]);
            ob_clean();
            flush();
            readfile($furl);
            exit;
     
        }
 
    }
Это почти готовое решение в вашем случае, тут нет только процедуры получения токена (get_vk_params в коде).
 
Последнее редактирование:
Скрытое содержимое для пользователя(ей): zaxap83, foshechka
 
Назад
Сверху