astrXbian/www/jukebox/utils/getInternetPlaylist.php

186 lines
5.3 KiB
PHP

<?php
// This is for getting a remote playlist from a radio station - eg PLS or ASX files
// This script parses that remote playlist and creates a local XSPF which will be
// used for adding the stream(s) to the playlist and for putting the info into the playlist
// Called with : url : The remote playlist to download or stream to add
// station : The name of the radio station (Groove Salad)
// image : The image to use in the playlist
// The generated playlists can be updated later if no information is known -
// the playlist will handle that when it gets stream info from mpd
function load_internet_playlist($url, $image, $station, $return_tracks = false) {
$playlist = download_internet_playlist($url, $image, $station);
if ($playlist !== false) {
if ($return_tracks) {
return $playlist->tracks;
} else {
$playlist->updateDatabase();
return $playlist->getTracksToAdd();
}
} else {
return array();
}
}
function download_internet_playlist($url, $image, $station) {
$station = ($station == 'null') ? ROMPR_UNKNOWN_STREAM : $station;
$image = ($image == 'null') ? '' : $image;
$url = trim($url);
logger::log("RADIO_PLAYLIST", "Getting Internet Stream:");
logger::log("RADIO_PLAYLIST", " url : ".$url);
logger::log("RADIO_PLAYLIST", " station : ".$station);
logger::log("RADIO_PLAYLIST", " image : ".$image);
if ($url) {
$path = $url;
$type = null;
$d = new url_downloader(array(
'url' => $url,
'timeout' => 10,
'connection_timeout' => 10
));
$d->get_data_to_string();
$content_type = $d->get_content_type();
// To cope with charsets in the header...
// case "audio/x-scpls;charset=UTF-8";
$content_type = trim_content_type($content_type);
logger::log("RADIO_PLAYLIST", "Content Type Is ".$content_type);
switch ($content_type) {
case "video/x-ms-asf":
logger::log("RADIO_PLAYLIST", "Playlist Is ".PHP_EOL.$d->get_data());
$type = asfOrasx($d->get_data());
break;
case "audio/x-scpls":
logger::log("RADIO_PLAYLIST", "Playlist Is ".PHP_EOL.$d->get_data());
$type = "pls";
break;
case "audio/x-mpegurl":
case "application/x-mpegurl":
logger::log("RADIO_PLAYLIST", "Playlist Is ".PHP_EOL.$d->get_data());
$type = "m3u";
break;
case "application/xspf+xml":
logger::log("RADIO_PLAYLIST", "Playlist Is ".PHP_EOL.$d->get_data());
$type = "xspf";
break;
case "audio/mpeg":
$type = "stream";
break;
case "text/html":
logger::log("RADIO_PLAYLIST", "HTML page returned!");
header('HTTP/1.1 404 Not Found');
exit(0);
}
logger::log("RADIO_PLAYLIST", "Playlist Type From Content Type is ".$type);
if ($type == "" || $type == null) {
$type = pathinfo($path, PATHINFO_EXTENSION);
$qpos = strpos($type, "?");
if ($qpos != false) $type = substr($type, 0, $qpos);
logger::log("RADIO_PLAYLIST", "Playlist Type From URL is ".$type);
}
if (($type == "" || $type == null) && preg_match('#www.radio-browser.info/webservice/v2/m3u#', $url)) {
$type = 'm3u';
logger::log("RADIO_PLAYLIST", "Playlist Type From URL is ".$type);
}
if (($type == "" || $type == null) && preg_match('#www.radio-browser.info/webservice/v2/pls#', $url)) {
$type = 'pls';
logger::log("RADIO_PLAYLIST", "Playlist Type From URL is ".$type);
}
$playlist = null;
switch ($d->get_status()) {
case '200':
switch ($type) {
case "pls":
case "PLS":
$playlist = new plsFile($d->get_data(), $url, $station, $image);
break;
case "asx":
case "ASX":
$playlist = new asxFile($d->get_data(), $url, $station, $image);
break;
case "asf":
case "ASF":
$playlist = new asfFile($d->get_data(), $url, $station, $image);
break;
case "xspf":
case "XSPF":
$playlist = new xspfFile($d->get_data(), $url, $station, $image);
break;
case "m3u":
case "m3u8":
case "M3U":
case "M3U8":
$playlist = new m3uFile($d->get_data(), $url, $station, $image);
break;
case "stream":
case "mp3":
$playlist = new possibleStreamUrl($url, $station, $image);
break;
default;
logger::warn("RADIO_PLAYLIST", "Unknown Playlist Type - treating as stream URL");
$playlist = new possibleStreamUrl($url, $station, $image);
break;
}
break;
case '404':
logger::fail("RADIO_PLAYLIST", "404 Error trying to download URL");
break;
default:
logger::warn("RADIO_PLAYLIST", "Unexpected cURL status ".$d->get_status()." - treating as stream URL");
$playlist = new possibleStreamUrl($url, $station, $image);
}
if ($playlist) {
return $playlist;
} else {
logger::fail("RADIO_PLAYLIST", "Could not determine playlist type");
header("HTTP/1.1 404 Not Found");
return false;
}
}
}
function asfOrasx($s) {
$type = null;
if (preg_match('/^\[Reference\]/', $s)) {
logger::log("RADIO_PLAYLIST", "Type of playlist determined as asf");
$type = "asf";
} else if (preg_match('/^<ASX /', $s)) {
logger::log("RADIO_PLAYLIST", "Type of playlist determined as asx");
$type = "asx";
} else if (preg_match('/^http/', $s)) {
logger::log("RADIO_PLAYLIST", "Type of playlist determined as m3u-like");
$type = "m3u";
}
return $type;
}
?>