X-Git-Url: https://git.cweiske.de/noxon-gateway.git/blobdiff_plain/daeda7055cd10cc88ca0966c8791c1c001e4e30f..49f9d0097f92966d8d09cb8eb05708425ea3e5ab:/src/mediatomb.php diff --git a/src/mediatomb.php b/src/mediatomb.php index 11ffe5a..ffc123a 100644 --- a/src/mediatomb.php +++ b/src/mediatomb.php @@ -1,109 +1,151 @@ getContainerByPath($path); - $listItems = array(); - addPreviousItem($listItems, $fullPath); - - foreach ($container->getContainers() as $subContainer) { - $listItems[] = getDirItem( - $subContainer->title, - pathEncode($fullPath . $subContainer->title) . '/' - ); - } - - foreach ($container->getItemIterator(false) as $item) { - $di = $item->getDetailedItem(); - $itemUrl = $item->url; - if ($di->mimetype !== 'audio/mpeg') { - //noxon iRadio cube does not want to play .ogg files - $itemUrl = $host1 . 'transcode' - . '?mtParentId=' . $container->id - . '&mtItemTitle=' . urlencode($item->title); - } - $listItems[] = getEpisodeItem( - $item->title, - $itemUrl, - '', - 'MP3' - ); + if ($action == 'browse') { + mediatombBrowse($smt, $fullPath, $prefix); + } else if ($action == 'single') { + mediatombSingle($smt, $fullPath, $prefix); } } catch (Exception $e) { sendMessage('Mediatomb error: ' . $e->getMessage()); return; } - - sendListItems($listItems); } -function transcodeMediatombItem($parentId, $title) +function mediatombBrowse(Services_MediaTomb $smt, $fullPath, $prefix) { - global $mediatomb, $host1, $cacheDir, $cacheDirUrl; + global $mediatomb; - if (!is_writable($cacheDir)) { - sendMessage('Cache dir not writable'); + $path = substr($fullPath, strlen($prefix)); + $container = $smt->getContainerByPath($path); + if ($container === null) { + sendMessage('Error accessing ' . $fullPath); return; } - extract($mediatomb); - try { - $smt = new Services_MediaTomb($user, $pass, $host, $port); - $item = $smt->getSingleItem((int) $parentId, $title, false); + $listItems = array(); - $filename = $item->id . '.mp3'; - $cacheFilePath = $cacheDir . $filename; - if (!file_exists($cacheFilePath)) { - transcodeUrlToMp3($item->url, $cacheFilePath); + $it = $container->getItemIterator(false); + $it->rewind(); + $hasFiles = $it->valid(); + if ($hasFiles && is_array($mediatomb['singleFileDirectories'])) { + $enableSingle = false; + foreach ($mediatomb['singleFileDirectories'] as $dir) { + if (substr($fullPath, 0, strlen($dir)) == $dir) { + $enableSingle = true; + } } - if (!file_exists($cacheFilePath)) { - sendMessage('Error: No mp3 file found'); - return; + if ($enableSingle) { + $listItems[] = getDirItem( + 'Einzeln', + pathEncode('.mt-single/' . $path) + ); } - $cacheFileUrl = $cacheDirUrl . $filename; - header('Location: ' . $cacheFileUrl); - } catch (Exception $e) { - sendMessage('Mediatomb error: ' . $e->getMessage()); } + + foreach ($container->getContainers() as $subContainer) { + $listItems[] = getDirItem( + $subContainer->title, + pathEncode($fullPath . $subContainer->title) . '/' + ); + } + + foreach ($container->getItemIterator(false) as $item) { + mediatombAddFile($listItems, $item); + } + + sendListItems($listItems, buildPreviousItem($fullPath)); } -function transcodeUrlToMp3($url, $mp3CacheFilePath) +function mediatombAddFile(&$listItems, $item) { - $tmpfile = tempnam(sys_get_temp_dir(), 'transcode'); - exec( - 'wget --quiet ' - . escapeshellarg($url) - . ' -O ' . escapeshellarg($tmpfile), - $output, - $retval + global $host1; + + $di = $item->getDetailedItem(); + $itemUrl = $item->url; + if (!clientSupportsType($di->mimetype)) { + //client wants transcoded file + //noxon iRadio cube does not want to play .ogg files + if (isset($GLOBALS['enableCache']) && $GLOBALS['enableCache']) { + $itemUrl = $host1 . 'transcode-cache.php' + . '?url=' . urlencode($itemUrl); + } else { + $itemUrl = $host1 . 'transcode-nocache.php' + . '?url=' . urlencode($itemUrl); + } + } + $listItems[] = getEpisodeItem( + $item->title, + $itemUrl, + '', + 'MP3' ); - if ($retval !== 0) { - throw new Exception('Error downloading URL'); +} + +function clientSupportsType($mimetype) +{ + if ($mimetype === 'audio/mpeg') { + return true; + } + $ip = $_SERVER['REMOTE_ADDR']; + if (isset($GLOBALS['clientSupport'][$ip][$mimetype]) + && $GLOBALS['clientSupport'][$ip][$mimetype] === true + ) { + return true; } + return false; +} - exec( - 'ffmpeg' - . ' -i ' . escapeshellarg($tmpfile) - . ' ' . escapeshellarg($mp3CacheFilePath) - . ' 2>&1', - $output, - $retval - ); - unlink($tmpfile); - if ($retval !== 0) { - if (file_exists($mp3CacheFilePath)) { - unlink($mp3CacheFilePath); +/** + * Single file mode - shows directories that only have a single file in them. + * Each audio file gets its own virtual directory, containing only the + * audio file itself. + * + * Useful children who want to listen a single story before sleeping, + * but the noxon's auto switch-off timer is not exactly at the end of + * the story. So the next story starts already, and the kid complains + * that it wanted to listen to that as well... + */ +function mediatombSingle(Services_MediaTomb $smt, $fullPath, $prefix) +{ + $path = substr($fullPath, strlen($prefix)); + + $parts = explode('/', $path); + $fileMode = false; + if (substr(end($parts), 0, 5) == 'file-') { + $fileMode = true; + $fileTitle = substr(end($parts), 5); + $path = substr($path, 0, -strlen($fileTitle) - 5); + } + + $container = $smt->getContainerByPath($path); + $listItems = array(); + + $previous = null; + if ($fileMode) { + //show single file to play + $previous = buildPreviousItem(pathEncode($fullPath)); + $item = $smt->getSingleItem($container, $fileTitle, false); + mediatombAddFile($listItems, $item); + } else { + $previous = buildPreviousItem(pathEncode('internetradio/' . $path . '/dummy')); + + //browse directory + foreach ($container->getItemIterator(false) as $item) { + $listItems[] = getDirItem( + $item->title, + pathEncode($fullPath . 'file-' . $item->title) + ); } - //var_dump($tmpfile, $output); - throw new Exception('Error transcoding file'); } + + sendListItems($listItems, $previous); } ?>