add dead simple transcoding with ffmpeg
[noxon-gateway.git] / src / mediatomb.php
index e8bbfcb9d9c97b26c8b55d47125df186f1390f6a..11ffe5ad42f64a1171edda74df4f9bd0166998c1 100644 (file)
@@ -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');
+    }
+}
 ?>