astrXbian/www/jukebox/player/mpd/player.php

253 lines
9.3 KiB
PHP

<?php
require_once ('player/mpd/mpdinterface.php');
$PLAYER_TYPE = 'mpdPlayer';
class mpdPlayer extends base_mpd_player {
private $monitor;
public function check_track_load_command($uri) {
$ext = strtolower(pathinfo($uri, PATHINFO_EXTENSION));
switch ($ext) {
case 'm3u':
case 'm3u8':
case 'asf':
case 'asx':
return 'load';
break;
default:
if (preg_match('#www\.radio-browser\.info/webservice/v2/m3u#', $uri)) {
return 'load';
} else {
return 'add';
}
break;
}
}
public function musicCollectionUpdate() {
global $prefs;
logger::mark("MPD", "Starting Music Collection Update");
$collection = new musicCollection();
$this->monitor = fopen('prefs/monitor','w');
$dirs = array("/");
while (count($dirs) > 0) {
$dir = array_shift($dirs);
fwrite($this->monitor, "\n<b>".get_int_text('label_scanningf', array($dir))."</b><br />".get_int_text('label_fremaining', array(count($dirs))));
foreach ($this->parse_list_output('lsinfo "'.format_for_mpd($dir).'"', $dirs, false) as $filedata) {
$collection->newTrack($filedata);
}
$collection->tracks_to_database();
}
saveCollectionPlayer('mpd');
fwrite($this->monitor, "\nUpdating Database");
}
public function collectionUpdateDone() {
fwrite($this->monitor, "\nRompR Is Done");
fclose($this->monitor);
}
protected function player_specific_fixups(&$filedata) {
global $prefs;
switch($filedata['domain']) {
case 'local':
$this->check_undefined_tags($filedata);
$filedata['folder'] = dirname($filedata['unmopfile']);
if ($prefs['audiobook_directory'] != '') {
$f = rawurldecode($filedata['folder']);
if (strpos($f, $prefs['audiobook_directory']) === 0) {
$filedata['type'] = 'audiobook';
}
}
break;
case "soundcloud":
$this->preprocess_soundcloud($filedata);
break;
case 'http':
case 'https':
case 'mms':
case 'mmsh':
case 'mmst':
case 'mmsu':
case 'gopher':
case 'rtp':
case 'rtsp':
case 'rtmp':
case 'rtmpt':
case 'rtmps':
$this->preprocess_stream($filedata);
break;
default:
$this->check_undefined_tags($filedata);
$filedata['folder'] = dirname($filedata['unmopfile']);
break;
}
}
private function preprocess_stream(&$filedata) {
$filedata['Track'] = null;
list ( $filedata['Title'],
$filedata['Time'],
$filedata['Artist'],
$filedata['Album'],
$filedata['folder'],
$filedata['type'],
$filedata['X-AlbumImage'],
$filedata['station'],
$filedata['stream'],
$filedata['AlbumArtist'],
$filedata['StreamIndex'],
$filedata['Comment'],
$filedata['ImgKey']) = $this->check_radio_and_podcasts($filedata);
if (strrpos($filedata['file'], '#') !== false) {
# Fave radio stations added by Cantata/MPDroid
$filedata['Album'] = substr($filedata['file'], strrpos($filedata['file'], '#')+1, strlen($filedata['file']));
}
}
private function preprocess_soundcloud(&$filedata) {
if ($filedata['Name'] != null) {
$filedata['Title'] = $filedata['Name'];
$filedata['Album'] = "SoundCloud";
$arse = explode(' - ',$filedata['Name']);
$filedata['Artist'] = array($arse[0]);
} else {
$filedata['Artist'] = array("Unknown Artist");
$filedata['Title'] = "Unknown Track";
$filedata['Album'] = "SoundCloud";
}
}
private function check_radio_and_podcasts($filedata) {
$url = $filedata['file'];
// Do podcasts first. Podcasts played fro TuneIn get added as radio stations, and then if we play that track again
// via podcasts we want to make sure we pick up the details.
$result = find_podcast_track_from_url($url);
foreach ($result as $obj) {
logger::log("STREAMHANDLER", "Found PODCAST ".$obj->title);
return array(
($obj->title == '') ? $filedata['Title'] : $obj->title,
$obj->duration,
($obj->artist == '') ? $filedata['Artist'] : array($obj->artist),
($obj->album == '') ? $filedata['Album'] : $obj->album,
md5($obj->album),
'podcast',
$obj->image,
null,
'',
($obj->albumartist == '') ? $filedata['AlbumArtist'] : array($obj->albumartist),
null,
$obj->comment,
null
);
}
$result = find_radio_track_from_url($url);
foreach ($result as $obj) {
logger::log("STREAMHANDLER", "Found Radio Station ".$obj->StationName);
// Munge munge munge to make it looks pretty
if ($obj->StationName != '') {
logger::log("STREAMHANDLER", " Setting Album from database ".$obj->StationName);
$album = $obj->StationName;
} else if ($filedata['Name'] && strpos($filedata['Name'], ' ') !== false) {
logger::log("STREAMHANDLER", " Setting Album from Name ".$filedata['Name']);
$album = $filedata['Name'];
} else if ($filedata['Name'] == null && $filedata['Title'] != null && $filedata['Artist'] == null && $filedata['Album'] == null && strpos($filedata['Title'], ' ') !== false) {
logger::log("STREAMHANDLER", " Setting Album from Title ".$filedata['Title']);
$album = $filedata['Title'];
$filedata['Title'] = null;
} else {
logger::log("STREAMHANDLER", " No information to set Album field");
$album = ROMPR_UNKNOWN_STREAM;
}
return array (
$filedata['Title'] === null ? '' : $filedata['Title'],
0,
$filedata['Artist'],
$album,
$obj->PlaylistUrl,
"stream",
($obj->Image == '') ? $filedata['X-AlbumImage'] : $obj->Image,
getDummyStation($url),
$obj->PrettyStream,
$filedata['AlbumArtist'],
$obj->Stationindex,
array_key_exists('Comment', $filedata) ? $filedata['Comment'] : '',
null
);
}
logger::fail("STREAMHANDLER", "Stream Track",$filedata['file'],"from",$filedata['domain'],"was not found indatabase");
if ($filedata['Name']) {
logger::log("STREAMHANDLER", " Setting Album from Name ".$filedata['Name']);
$album = $filedata['Name'];
if ($filedata['Pos'] !== null) {
update_radio_station_name(array('streamid' => null,'uri' => $filedata['file'], 'name' => $album));
}
} else if ($filedata['Name'] == null && $filedata['Title'] != null && $filedata['Artist'] == null && $filedata['Album'] == null) {
logger::log("STREAMHANDLER", " Setting Album from Title ".$filedata['Title']);
$album = $filedata['Title'];
$filedata['Title'] = null;
if ($filedata['Pos'] !== null) {
update_radio_station_name(array('streamid' => null,'uri' => $filedata['file'], 'name' => $album));
}
} else {
logger::log("STREAMHANDLER", " No information to set Album field");
$album = ROMPR_UNKNOWN_STREAM;
}
return array(
$filedata['Title'],
0,
$filedata['Artist'],
$album,
getStreamFolder(unwanted_array($url)),
"stream",
($filedata['X-AlbumImage'] == null) ? '' : $filedata['X-AlbumImage'],
getDummyStation(unwanted_array($url)),
null,
$filedata['AlbumArtist'],
null,
array_key_exists('Comment', $filedata) ? $filedata['Comment'] : '',
null
);
}
public function get_checked_url($url) {
$matches = array();
if (preg_match("/api\.soundcloud\.com\/tracks\/(\d+)\//", $url, $matches)) {
return array('clickcue', "soundcloud://track/".$matches[1]);
} else {
return array('clicktrack', $url);
}
}
public function get_replay_gain_state() {
$arse = $this->do_mpd_command('replay_gain_status', true, false);
if (array_key_exists('error', $arse)) {
unset($arse['error']);
$this->send_command('clearerror');
}
return $arse;
}
public static function is_personal_playlist($pl) {
return true;
}
}
?>