function handleRequestMediatomb($fullPath, $prefix)
{
- global $mediatomb;
+ global $mediatomb, $host1;
extract($mediatomb);
try {
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
- //FIXME: convert to mp3
- //$di->location (on the server)
+ $itemUrl = $host1 . 'transcode'
+ . '?mtParentId=' . $container->id
+ . '&mtItemTitle=' . urlencode($item->title);
}
$listItems[] = getEpisodeItem(
$item->title,
- $item->url,
+ $itemUrl,
'',
'MP3'
);
sendListItems($listItems);
}
+
+function transcodeMediatombItem($parentId, $title)
+{
+ global $mediatomb, $host1, $cacheDir, $cacheDirUrl;
+
+ if (!is_writable($cacheDir)) {
+ sendMessage('Cache dir not writable');
+ return;
+ }
+
+ extract($mediatomb);
+ try {
+ $smt = new Services_MediaTomb($user, $pass, $host, $port);
+ $item = $smt->getSingleItem((int) $parentId, $title, false);
+
+ $filename = $item->id . '.mp3';
+ $cacheFilePath = $cacheDir . $filename;
+ if (!file_exists($cacheFilePath)) {
+ transcodeUrlToMp3($item->url, $cacheFilePath);
+ }
+ if (!file_exists($cacheFilePath)) {
+ sendMessage('Error: No mp3 file found');
+ return;
+ }
+ $cacheFileUrl = $cacheDirUrl . $filename;
+ header('Location: ' . $cacheFileUrl);
+ } catch (Exception $e) {
+ sendMessage('Mediatomb error: ' . $e->getMessage());
+ }
+}
+
+function transcodeUrlToMp3($url, $mp3CacheFilePath)
+{
+ $tmpfile = tempnam(sys_get_temp_dir(), 'transcode');
+ exec(
+ 'wget --quiet '
+ . escapeshellarg($url)
+ . ' -O ' . escapeshellarg($tmpfile),
+ $output,
+ $retval
+ );
+ if ($retval !== 0) {
+ throw new Exception('Error downloading URL');
+ }
+
+ exec(
+ 'ffmpeg'
+ . ' -i ' . escapeshellarg($tmpfile)
+ . ' ' . escapeshellarg($mp3CacheFilePath)
+ . ' 2>&1',
+ $output,
+ $retval
+ );
+ unlink($tmpfile);
+ if ($retval !== 0) {
+ if (file_exists($mp3CacheFilePath)) {
+ unlink($mp3CacheFilePath);
+ }
+ //var_dump($tmpfile, $output);
+ throw new Exception('Error transcoding file');
+ }
+}
?>
}
$dataDir = __DIR__ . '/../data/';
$varDir = realpath(__DIR__ . '/../var') . '/';
+$cacheDir = __DIR__ . '/../www/cache/';
$host1 = 'http://radio567.vtuner.com/';
$host2 = 'http://radio5672.vtuner.com/';
if ($_SERVER['HTTP_HOST'] !== '') {
$host1 = 'http://' . $_SERVER['HTTP_HOST'] . '/';
$host2 = 'http://' . $_SERVER['HTTP_HOST'] . '/';
}
+$cacheDirUrl = $host1 . 'cache/';
$cfgFile = $dataDir . 'config.php';
if (file_exists($cfgFile)) {
include $cfgFile;
} else if ($path == '/RadioNativeFavorites.php') {
//Favorites, defined via web interface
sendMessage('Unsupported');
+} else if ($path == '/transcode') {
+ require_once 'mediatomb.php';
+ transcodeMediatombItem($_GET['mtParentId'], $_GET['mtItemTitle']);
+ exit();
}
handleRequest(ltrim($path, '/'));
return '<Item>'
. '<ItemType>ShowEpisode</ItemType>'
. '<ShowEpisodeName>' . utf8_decode(htmlspecialchars($title)) . '</ShowEpisodeName>'
- . '<ShowEpisodeURL>' . $fullUrl . '</ShowEpisodeURL>'
+ . '<ShowEpisodeURL>' . htmlspecialchars($fullUrl) . '</ShowEpisodeURL>'
. '<ShowDesc>' . utf8_decode(htmlspecialchars($desc)) . '</ShowDesc>'
. '<ShowMime>' . $type . '</ShowMime>'
. '</Item>';