From daeda7055cd10cc88ca0966c8791c1c001e4e30f Mon Sep 17 00:00:00 2001 From: Christian Weiske Date: Thu, 26 Nov 2015 00:34:10 +0100 Subject: [PATCH] add dead simple transcoding with ffmpeg --- .gitignore | 1 + src/mediatomb.php | 72 ++++++++++++++++++++++++++++++++++++++++++++--- www/index.php | 8 +++++- 3 files changed, 76 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index b0e72d9..21c7895 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ /var/podcasts/* /README.html /data/config.php +/www/cache/ diff --git a/src/mediatomb.php b/src/mediatomb.php index e8bbfcb..11ffe5a 100644 --- a/src/mediatomb.php +++ b/src/mediatomb.php @@ -3,7 +3,7 @@ require_once 'Services/MediaTomb.php'; function handleRequestMediatomb($fullPath, $prefix) { - global $mediatomb; + global $mediatomb, $host1; extract($mediatomb); try { @@ -23,14 +23,16 @@ function handleRequestMediatomb($fullPath, $prefix) 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' ); @@ -42,4 +44,66 @@ function handleRequestMediatomb($fullPath, $prefix) 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'); + } +} ?> diff --git a/www/index.php b/www/index.php index d64436c..65f6715 100644 --- a/www/index.php +++ b/www/index.php @@ -8,12 +8,14 @@ if (isset($_SERVER['REDIRECT_URL'])) { } $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; @@ -41,6 +43,10 @@ if (strtolower($fullUri) == '/setupapp/radio567/asp/browsexpa/loginxml.asp?token } 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, '/')); @@ -193,7 +199,7 @@ function getEpisodeItem($title, $fullUrl, $desc, $type) return '' . 'ShowEpisode' . '' . utf8_decode(htmlspecialchars($title)) . '' - . '' . $fullUrl . '' + . '' . htmlspecialchars($fullUrl) . '' . '' . utf8_decode(htmlspecialchars($desc)) . '' . '' . $type . '' . ''; -- 2.30.2