1
0
Fork 0
mirror of https://github.com/Yetangitu/ampache synced 2025-10-03 17:59:21 +02:00
ampache/upnp/control-reply.php
SeregaPru 1569f8019d UPNP fixes and optimization
1) optimization: _xxxChilds: slice whole items array BEFORE converting to output objects
2) fix with special chars in items title.
Some players stops after receiving some special chars.
Don't know which exactly char is wrong, replace all special chars to '-'
2014-09-14 21:46:42 +04:00

104 lines
3.9 KiB
PHP

<?php
define('NO_SESSION','1');
require_once '../lib/init.php';
if (!AmpConfig::get('upnp_backend')) {
echo "Disabled.";
exit;
}
set_time_limit(600);
header ("Content-Type: text/html; charset=UTF-8");
$rootMediaItems = array();
$rootMediaItems[] = Upnp_Api::_musicMetadata('');
$rootMediaItems[] = Upnp_Api::_videoMetadata('');
// Parse the request from UPnP player
$requestRaw = file_get_contents('php://input');
if ($requestRaw != '') {
$upnpRequest = Upnp_Api::parseUPnPRequest($requestRaw);
debug_event('upnp', 'Request: ' . $requestRaw, '5');
} else {
echo 'Error: no UPnP request.';
debug_event('upnp', 'No request', '5');
exit;
}
$items = array();
$totMatches = 0;
$responseType = "u:Error";
switch ($upnpRequest['action']) {
case 'search':
$responseType = 'u:SearchResponse';
$items = Upnp_Api::_callSearch($upnpRequest['searchcriteria']);
break;
case 'browse':
$responseType = 'u:BrowseResponse';
if ($upnpRequest['objectid'] == '0') {
// Root items
if ($upnpRequest['browseflag'] == 'BrowseMetadata') {
$items[] = array(
'id' => '0',
'parentID' => '-1',
'childCount' => '2',
'dc:title' => T_('root'),
'upnp:class' => 'object.container',
);
} else {
$items = $rootMediaItems;
}
break;
} else {
# The parse_url function returns an array in this format:
# Array (
# [scheme] => http
# [host] => hostname
# [user] => username
# [pass] => password
# [path] => /path
# [query] => arg=value
# [fragment] => anchor
# )
$reqObjectURL = parse_url($upnpRequest['objectid']);
switch ($reqObjectURL['scheme']) {
case 'amp':
switch ($reqObjectURL['host']) {
case 'music':
if ($upnpRequest['browseflag'] == 'BrowseMetadata') {
$items = Upnp_Api::_musicMetadata($reqObjectURL['path'], $reqObjectURL['query']);
} else {
list($totMatches, $items) = Upnp_Api::_musicChilds($reqObjectURL['path'], $reqObjectURL['query'], $upnpRequest['startingindex'], $upnpRequest['requestedcount']);
}
break;
case 'video':
if ($upnpRequest['browseflag'] == 'BrowseMetadata') {
$items = Upnp_Api::_videoMetadata($reqObjectURL['path'], $reqObjectURL['query']);
} else {
list($totMatches, $items) = Upnp_Api::_videoChilds($reqObjectURL['path'], $reqObjectURL['query'], $upnpRequest['startingindex'], $upnpRequest['requestedcount']);
}
break;
}
break;
}
};
break;
}
$totMatches = ($totMatches == 0) ? count($items) : $totMatches;
if ($items == null || $totMatches == 0) {
$domDIDL = Upnp_Api::createDIDL('');
$numRet = 0;
} else {
$domDIDL = Upnp_Api::createDIDL($items);
$numRet = count($items);
}
$xmlDIDL = $domDIDL->saveXML();
$domSOAP = Upnp_Api::createSOAPEnvelope($xmlDIDL, $numRet, $totMatches, $responseType);
$soapXML = $domSOAP->saveXML();
echo $soapXML;
debug_event('upnp', 'Response: ' . $soapXML, '5');
?>