2013-07-08 2 views
1

В настоящее время я пытаюсь использовать метаданные нашего потокового провайдера StreamOn, чтобы отправить запрос в Last.FM, чтобы получить оригинальные обложки альбомов. Я новичок в мире API, так что это довольно запутанно для меня, однако я управляю. Моя проблема возникает при отправке и получении изображения по XML. В приведенном ниже коде содержимое страницы метаданных устанавливается как переменные, которые затем отображаются A.) и B.) используется для поиска соответствующих обложек альбомов.Ошибка Отправка запроса для Last.FM Обложка альбома

<?php 

$request = file_get_contents('http://ckpk.streamon.fm/card.php'); 
$doubleQuotation = '"'; 

//Artist Request 

$artistTitle = '"artist": "'; 
$artistTitlePosition = intval(strpos($request, $artistTitle)); 
$artistBeginningPosition = $artistTitlePosition + 11; 
$artistEndingPosition = intval(strpos($request, $doubleQuotation, $artistBeginningPosition)); 
$artistName = substr($request, $artistBeginningPosition, $artistEndingPosition - $artistBeginningPosition); 
echo '<b>' . $artistName . '</b>'; 
echo '<br />'; 
$artist = $artistName; 


//Track Request 

$trackTitle = '"title": "'; 
$trackTitlePosition = intval(strpos($request, $trackTitle)); 
$trackBeginningPosition = $trackTitlePosition + 10; 
$trackEndingPosition = intval(strpos($request, $doubleQuotation, $trackBeginningPosition)); 
$trackName = substr($request, $trackBeginningPosition, $trackEndingPosition - $trackBeginningPosition); 
echo '<i>' . $trackName . '</i>'; 
echo '<br />'; 


//Album Name Request 

$albumTitle = '"album": "'; 
$albumTitlePosition = intval(strpos($request, $albumTitle)); 
$albumBeginningPosition = $albumTitlePosition + 10; 
$albumEndingPosition = intval(strpos($request, $doubleQuotation, $albumBeginningPosition)); 
$albumName = substr($request, $albumBeginningPosition, $albumEndingPosition - $albumBeginningPosition); 
echo $albumName; 
$album = $albumName; 



/* 
* Last.FM Artwork Class 
* Author: Caleb Mingle (@dentafrice) 
* http://dentafrice.com 
*/ 

class LastFM { 
    const API_KEY = "7facb82a2a573dd483d931044030e30c"; 
    public static $size_map = array("small" => 0, "medium" => 1, "large" => 2, "extralarge" => 3, "mega" => 4); 
    public static function getArtwork($artist, $return_image = false, $size = "image_mega", $album) { 
     $artist = urlencode($artist); 
     $returnedInfo = "http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&api_key=" . self::API_KEY . "&artist=" . $artist . "&album=" . $album . "&image=" . self::$size_map[$size] . "&format=json"; 
     $returnedInfo = @file_get_contents($returnedInfo); 

     if(!$returnedInfo) { 
      return; // Artist lookup failed. 
     } 

     $xml = new SimpleXMLElement($xml); 
     $xml = $xml->artist; 
     $xml = $xml->image[self::$size_map[$size]]; 

     return (!$return_image) ? $xml : '<img src="' . $xml . '" alt="' . urldecode($artist) . '" />'; 
    } 
} 


$artwork = LastFM::getArtwork($artist, true, $size, $album); 


if($artwork) { 
echo $artwork; 
} 
else{ 
return; 
} 

?> 

Я временно стилизовал элементы, чтобы различать их, и я буду беспокоиться о стилизации позже. Тем не менее, я хотел бы знать, как использовать данные для отправки запроса на сервер Lsat.FM и получать изображение, чтобы правильно отобразить его. С StreamOn отличается от других, например, ShoutCast.

+0

Каков ваш точный вопрос? Не могу понять это на данный момент. Кстати, формат указан как JSON, в то время как он предполагает объект XML .. 'self :: $ size_map [$ size]. "& format = json"; ' – edwardmp

+0

Может ли быть проблема? Мой вопрос касался того, как загрузить изображение XML, потому что я думал, что правильно его отправляю в Last.FM. Я должен использовать метаданные и вставлять их в этот URL через конкатенацию. Когда вы переходите к файлу JSON, он ссылается на исходное изображение. Мне нужен этот образ, но я не знаю, как туда добраться. Это страница, которую я использовал для тестирования: http://wpovfm.org/moldycheese/asdf.php – montelc0

ответ

0

В соответствии с вашим ответом в комментариях моя гипотеза подтверждается.

Поскольку вы запрашиваете на Last.FM API, чтобы вернуть JSON, вы получите ошибку:

Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML

Потому что это JSON, а не XML.

Вы можете исправить это двумя способами. Либо измените формат ответа на XML, либо не используйте SimpleXML, а вместо этого - json_decode().

Первый, вероятно, самый простой в настройке. Попытаться изменить часть &format=json на &format=xml

Я не тестировал это, но очень вероятно, что это будет поддерживаться Last.fm.

Также обратите внимание, что вы не задаете размер изображения, а значение «image_mega» по умолчанию не является допустимым значением (см. Спецификации API @http://www.last.fm/api/show/artist.getInfo). Вы, наверное, хотите хотите использовать "мега" не "image_mega"

Изменено, работающий код с использованием JSON:

<?php 

class LastFM { 
    const API_KEY = "7facb82a2a573dd483d931044030e30c"; 
    public static $size_map = array("small" => 0, "medium" => 1, "large" => 2, "extralarge" => 3, "mega" => 4); 

    public static function getArtwork($artist, $return_image = false, $size = "mega", $album) { 
     $artist = urlencode($artist); 
     $album = urlencode($album); 

     $returnedInfo = "http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&api_key=" . self::API_KEY . "&artist=" . $artist . "&album=" . $album . "&image=" . self::$size_map[$size] . "&format=json"; 
     $returnedInfo = @file_get_contents($returnedInfo); 

     if(!$returnedInfo) { 
      return; // Artist lookup failed. 
     } 

     $json = json_decode($returnedInfo, true); 
     $albumArt = $json["artist"]["image"][self::$size_map[$size]]["#text"]; 

     return (!$return_image) ? print_r($json) : '<img src="' . $albumArt . '" alt="' . urldecode($artist) . '" />'; 
    } 
} 

$artist = "Daft Punk"; 
$album = "Random Access Memories"; 
$size = "mega"; 

$artwork = LastFM::getArtwork($artist, true, $size, $album); 

if($artwork) { 
    echo $artwork; 
} 
else{ 
    return; 
} 

Я знаю, что рок. Я выбираю JSON, потому что мне легче работать. Она возвращает именно то, что вы хотите, например .:

<img src="http://userserve-ak.last.fm/serve/500/10923145/Daft+Punk+6a00e398210d13883300e55ui6.png" alt="Daft Punk" /> 

Наконец, я добавил urlencoding() для названия альбома, так как у меня были проблемы с этим в моем примере.

Working PHPFiddle

+0

http://ws.audioscrobbler.com/2.0/?method=album.getinfo&artist=Chris+Tomlin%20&album = Burning + Lights & api_key = 7facb82a2a573dd483d931044030e30c Я попробовал это, чтобы посмотреть, как будет выглядеть XML. Я гораздо ближе к окончательному решению, однако, я не уверен, как выбрать только мега изображение.Если вы посмотрите на приведенную выше ссылку, то они не отображаются в виде массива. Мне нужен этот мега-образ, так как я должен быстро его масштабировать в реализации игрока реального сайта. Заранее благодарю за вашу дальнейшую помощь. – montelc0

+0

ОК, потому что я рок, я проверил его и немного изменил. Я выбираю JSON, потому что мне легче работать. Проверьте мой отредактированный ответ :) – edwardmp

+0

Вы серьезно рок. 10/10. – montelc0

Смежные вопросы