繁体   English   中英

发送对Last.FM专辑插图的请求时出错

[英]Error Sending Request for Last.FM Album Artwork

目前,我正在尝试使用来自流媒体提供商StreamOn的元数据将请求发送到Last.FM,以获取原始尺寸的专辑插图。 我对API领域是陌生的,因此对我来说相当混乱,但是我正在管理。 我的问题出现在通过XML发送和接收图像上。 在下面的代码中,元数据页面的内容设置为变量,然后将其显示为A.),然后显示B.)以查找适当的专辑插图。

<?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)不同。

根据您在评论中的答复,我的假设得到证实。

由于您正在请求Last.FM API返回JSON,因此会出现错误:

致命错误:无法将消息“ String”的未捕获异常“ Exception”解析为XML

因为它是JSON,而不是XML。

您可以通过两种方式解决此问题。 将响应格式更改为XML,或者不使用SimpleXML而是使用json_decode()

第一个可能是最容易调整的。 尝试将&format=json部分更改为&format=xml

我尚未对此进行测试,但是很有可能将由Last.fm支持。

另请注意,您没有提供图片大小,并且“ image_mega”的默认值不是有效值(请参阅API规范@ http://www.last.fm/api/show/artist.getInfo )。 您可能想使用“ mega”而不是“ 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() ,因为在示例中我对此有疑问。

工作PHPFiddle

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM