将 SHOUTcast 曲目信息拆分为 "Song title" 和 "Artist name"

Splitting SHOUTcast track info into "Song title" and "Artist name"

我正在使用这个 'Now playing' jQuery plugin 并且想知道是否有办法 拆分从 SHOUTcast 获取的曲目信息 (艺术家姓名 - 曲目标题) 分别分成两个不同的字符串:'Artist name' 和 'Track title'。

这是插件的基本配置:

$.SHOUTcast({
   host : '91.109.241.252',
   port : 8170,
   interval : 5000,
   stats : function(){
     $('#songtitle').text(this.get('songtitle','Temporarily Off Air'));
   }
}).startStats();

上面的代码将 return,每 5 秒,格式为 艺术家姓名 - 曲目标题.

有没有一种方法可以调整当前配置以实现与拆分字符串相同的效果?

遗憾的是,SHOUTcast 样式元数据包含一个字段。如您所见,要获取艺术家和曲目,标准格式是在艺术家和曲目之间使用连字符。

const artist = meta.substr(0, meta.indexOf(' - '));
const title = meta.substr(meta.indexOf(' - ') + 3);

这将拆分到第一个 -,给你一个艺术家和标题(理论上),假设艺术家姓名中没有 -。它将允许在标题中使用连字符,因为我们只拆分到第一个。

请注意,如果这不是正在使用的格式,这将会中断。您可能想先测试字符串以查看是否有任何连字符。 DJ 节目不使用这种格式很常见。

可以得到字符串"artist - song"并进行拆分:

var fullTitle = this.get('songtitle','Off Air').split(" - ");

然后分别获取每一项:

var artist = fullTitle[0];
var title = fullTitle[1];

并将其写在不同的 html 标签中:

$('#title').text(title);
$('#artist').text(artist);

另一个可能的答案,似乎没有被覆盖是重写 artist/track 分隔符,使用正则表达式在艺术家 - 曲目组合中找到它,然后把它放回它的存储来自正则表达式的 $ 匹配项后的原始值。这就是我们如何处理我们的艺术作品 API,我们用它来查找 artist/title 组合的图像,我们发现这是在 PHP 中最可靠的方法.

preg_match('/^(.*)%space%hyphen%space(.*)$/mi', $artist.'%space%hyphen%space'.$track, $matches, PREG_OFFSET_CAPTURE);
$matches[0][0] = str_replace('%space%hyphen%space', ' - ', $matches[0][0]);

这是流媒体的一个特殊问题,其中艺术家或标题中可能使用了连字符,这会破坏试图找到分隔符的正则表达式。

我想我会添加更多关于从 Shoutcast 流中获取 artist/title 数据的方法的信息,因为提出原始问题的用户似乎仍然不确定。 $songArray 数组包含流中的所有可用信息,但在本例中,我们只对艺术家和标题感兴趣。

     $splitSongRegex = "/\ \-\ /";    
     $streamUrl = "http://".$server.":".$port."/stats?sid=1"; //    Convert stream 
//  Convert stream XML data to lowercase Json array
    $xml = simplexml_load_string(strtolower($streamData), "SimpleXMLElement", LIBXML_NOCDATA);
    $json = json_encode($xml);
    $streamDataArray = json_decode($json, TRUE);
    $song = ucwords(trim($streamDataArray['songtitle']));
    $songArray = preg_split($splitSongRegex, $song, -1, PREG_SPLIT_DELIM_CAPTURE);
    $artist = ucwords(trim($songArray[0]));
    $track = ucwords(trim($songArray[1]));

我们使用它从我们的流中获取 artist/title 信息,因此它已经过试验和测试。