Рендеринг виджета SoundCloud для приватной дорожки с использованием PHP API

Я пытаюсь отобразить виджет SoundCloud HTML5 с помощью PHP API, но каждый раз, когда я запускаю команду, которая, по моему мнению, должна возвращать HTML для виджета, я просто получаю исключение:

The requested URL responded with HTTP code 302

Я понимаю, что это редирект. Чего я не знаю, так это почему это все, что я когда-либо получаю, или что с этим делать, чтобы действительно получить HTML-код виджета.

В документации по API сказано, что для встраивания виджета с помощью PHP нужно сделать так:

<?php
    require_once 'Services/Soundcloud.php';

    // create a client object with your app credentials
    $client = new Services_Soundcloud('YOUR_CLIENT_ID', 'YOUR_CLIENT_SECRET');

    // get a tracks oembed data
    $track_url = 'http://soundcloud.com/forss/flickermood';
    $embed_info = $client->get('/oembed', array('url' => $track_url));

    // render the html for the player widget
    print $embed_info['html'];

Я запускаю это:

// NB: Fully authorised SoundCloud API instance all working prior to this line
// $this->api refers to an authorised instance of Services_Soundcloud

try {   
        $widget = array_pop(
            json_decode( $this->api->get('oembed', array('url' => $track_url)) )
        );

        print_r($widget);

    } catch (Exception $e)
    {
        print_r($e->getMessage());
    }

где «track_url» на самом деле является URL-адресом, который я получаю, когда запрашиваю у SoundCloud объект дорожки ранее в приложении с использованием того же API.

На самом деле я не уверен, что этот URL-адрес верен, потому что возвращаемый объект трека дает «uri» в форме:

[uri] => https://api.soundcloud.com/tracks/62556508

Все примеры документации имеют прямую ссылку http://soundcloud.com/username/track-permalink. - но даже при использовании известного пути к общедоступной дорожке попытка запустить метод API oembed не удалась... Я все еще получаю исключение 302.

Наконец, есть упоминания о настройке «allow_redirects» на false в команде «get», но это не действует, когда я добавляю параметры, используемые для построения запроса к API. Я также пытался добавить дополнительные параметры cURL, но это тоже не дало никакого эффекта.

Я определенно включил API-доступ к треку в SoundCloud.

Типа биться головой об стену по этому поводу. Если у кого-то есть какие-либо указатели, я был бы очень благодарен их услышать. Просто для ясности я могу получить доступ ко всем пользовательским данным, комментариям и т. д. через созданный мной экземпляр API, поэтому он работает нормально.


person codewithfeeling    schedule 08.10.2012    source источник
comment
HTTP code 302 прямолинейно ... Это означает, что вы были перенаправлены ..... CURLOPT_FOLLOWLOCATION активируется только при использовании метода download   -  person Baba    schedule 08.10.2012
comment
Я понимаю, что 302 — это редирект. Чего я не понимаю, так это почему так происходит. Спасибо за разъяснения по поводу CURLOPT_FOLLOWLOCATION.   -  person codewithfeeling    schedule 08.10.2012
comment
Приведенное ниже исправление Пола Османа делает свое дело — отлично. Небольшое примечание (которое я пропустил в первый раз): при попытке использовать URL-адрес ЧАСТНОЙ дорожки убедитесь, что вы используете URL-адрес секретной ссылки, который отображается на панели справа от страницы дорожки. Это будет красивый URL трека со случайной строкой символов в конце.   -  person codewithfeeling    schedule 11.10.2012


Ответы (1)


Спасибо за указание на это. В документации была ошибка, которая ввела вас в заблуждение. Извини за это. Я обновил документы, чтобы исправить ошибку. Вот обновленный пример кода:

<?php

require_once 'Services/Soundcloud.php';

// create a client object with your app credentials
$client = new Services_Soundcloud('YOUR_CLIENT_ID', 'YOUR_CLIENT_SECRET');
$client->setCurlOptions(array(CURLOPT_FOLLOWLOCATION => 1));

// get a tracks oembed data
$track_url = 'http://soundcloud.com/forss/flickermood';
$embed_info = json_decode($client->get('oembed', array('url' => $track_url)));

// render the html for the player widget
print $embed_info->html;

Обратите внимание на различия:

  • Вам нужно установить для CURLOPT_FOLLOWLOCATION значение 1, как указано в комментариях выше.
  • Вам нужно обернуть возврат из $client->get в json_decode
  • Результатом является объект stdClass, а не Array, поэтому доступ к свойству html должен осуществляться с помощью оператора ->.

Надеюсь, это поможет. Не стесняйтесь комментировать, если у вас все еще есть проблемы, и я исправлю свой ответ.

person Paul Osman    schedule 10.10.2012
comment
Великолепно - это оно! Большое спасибо Пол. - person codewithfeeling; 11.10.2012
comment
У меня похожая проблема с oembed на частных треках в драгоценном камне Ruby. Я получаю 404, когда запускаю $sc_client.get('/oembed', :url =› track.permalink_url) на приватных дорожках -- публичные дорожки работают нормально -- приватная дорожка включена для всех виджетов и включено приложение - person Joe Sak; 07.06.2013
comment
поцарапать это, вы должны использовать #secret_uri - person Joe Sak; 07.06.2013