Catch mediatomb browse errors
[noxon-gateway.git] / src / mediatomb.php
index bdfa4ebae10d290b64af01944b4e9deb964ffc82..33b9bd87305fbeedf076e65d341c4a3cbd72223e 100644 (file)
@@ -25,8 +25,12 @@ function mediatombBrowse(Services_MediaTomb $smt, $fullPath, $prefix)
 
     $path = substr($fullPath, strlen($prefix));
     $container = $smt->getContainerByPath($path);
+    if ($container === null) {
+        sendMessage('Error accessing ' . $fullPath);
+        return;
+    }
+
     $listItems = array();
-    addPreviousItem($listItems, $fullPath);
 
     $it = $container->getItemIterator(false);
     $it->rewind();
@@ -57,7 +61,7 @@ function mediatombBrowse(Services_MediaTomb $smt, $fullPath, $prefix)
         mediatombAddFile($listItems, $item);
     }
 
-    sendListItems($listItems);
+    sendListItems($listItems, buildPreviousItem($fullPath));
 }
 
 function mediatombAddFile(&$listItems, $item)
@@ -66,10 +70,16 @@ function mediatombAddFile(&$listItems, $item)
 
     $di = $item->getDetailedItem();
     $itemUrl = $item->url;
-    if ($di->mimetype !== 'audio/mpeg') {
+    if (!clientSupportsType($di->mimetype)) {
+        //client wants transcoded file
         //noxon iRadio cube does not want to play .ogg files
-        $itemUrl = $host1 . 'transcode-nocache.php'
-            . '?url=' . urlencode($itemUrl);
+        if (isset($GLOBALS['cacheDir']) && $GLOBALS['cacheDir'] != '') {
+            $itemUrl = $host1 . 'transcode-cache.php'
+                . '?url=' . urlencode($itemUrl);
+        } else {
+            $itemUrl = $host1 . 'transcode-nocache.php'
+                . '?url=' . urlencode($itemUrl);
+        }
     }
     $listItems[] = getEpisodeItem(
         $item->title,
@@ -79,6 +89,20 @@ function mediatombAddFile(&$listItems, $item)
     );
 }
 
+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;
+}
+
 /**
  * Single file mode - shows directories that only have a single file in them.
  * Each audio file gets its own virtual directory, containing only the
@@ -104,13 +128,14 @@ function mediatombSingle(Services_MediaTomb $smt, $fullPath, $prefix)
     $container = $smt->getContainerByPath($path);
     $listItems = array();
 
+    $previous = null;
     if ($fileMode) {
         //show single file to play
-        addPreviousItem($listItems, pathEncode($fullPath));
+        $previous = buildPreviousItem(pathEncode($fullPath));
         $item = $smt->getSingleItem($container, $fileTitle, false);
         mediatombAddFile($listItems, $item);
     } else {
-        addPreviousItem($listItems, pathEncode('internetradio/' . $path . '/dummy'));
+        $previous = buildPreviousItem(pathEncode('internetradio/' . $path . '/dummy'));
 
         //browse directory
         foreach ($container->getItemIterator(false) as $item) {
@@ -121,6 +146,6 @@ function mediatombSingle(Services_MediaTomb $smt, $fullPath, $prefix)
         }
     }
 
-    sendListItems($listItems);
+    sendListItems($listItems, $previous);
 }
 ?>