add paging support
[noxon-gateway.git] / src / mediatomb.php
1 <?php
2 require_once 'Services/MediaTomb.php';
3
4 function handleMediatomb($action, $fullPath, $prefix)
5 {
6     global $mediatomb;
7
8     extract($mediatomb);
9     try {
10         $smt = new Services_MediaTomb($user, $pass, $host, $port);
11         if ($action == 'browse') {
12             mediatombBrowse($smt, $fullPath, $prefix);
13         } else if ($action == 'single') {
14             mediatombSingle($smt, $fullPath, $prefix);
15         }
16     } catch (Exception $e) {
17         sendMessage('Mediatomb error: ' . $e->getMessage());
18         return;
19     }
20 }
21
22 function mediatombBrowse(Services_MediaTomb $smt, $fullPath, $prefix)
23 {
24     global $mediatomb;
25
26     $path = substr($fullPath, strlen($prefix));
27     $container = $smt->getContainerByPath($path);
28     $listItems = array();
29
30     $it = $container->getItemIterator(false);
31     $it->rewind();
32     $hasFiles = $it->valid();
33     if ($hasFiles && is_array($mediatomb['singleFileDirectories'])) {
34         $enableSingle = false;
35         foreach ($mediatomb['singleFileDirectories'] as $dir) {
36             if (substr($fullPath, 0, strlen($dir)) == $dir) {
37                 $enableSingle = true;
38             }
39         }
40         if ($enableSingle) {
41             $listItems[] = getDirItem(
42                 'Einzeln',
43                 pathEncode('.mt-single/' . $path)
44             );
45         }
46     }
47
48     foreach ($container->getContainers() as $subContainer) {
49         $listItems[] = getDirItem(
50             $subContainer->title,
51             pathEncode($fullPath . $subContainer->title) . '/'
52         );
53     }
54
55     foreach ($container->getItemIterator(false) as $item) {
56         mediatombAddFile($listItems, $item);
57     }
58
59     sendListItems($listItems, buildPreviousItem($fullPath));
60 }
61
62 function mediatombAddFile(&$listItems, $item)
63 {
64     global $host1;
65
66     $di = $item->getDetailedItem();
67     $itemUrl = $item->url;
68     if ($di->mimetype !== 'audio/mpeg') {
69         //noxon iRadio cube does not want to play .ogg files
70         $itemUrl = $host1 . 'transcode-nocache.php'
71             . '?url=' . urlencode($itemUrl);
72     }
73     $listItems[] = getEpisodeItem(
74         $item->title,
75         $itemUrl,
76         '',
77         'MP3'
78     );
79 }
80
81 /**
82  * Single file mode - shows directories that only have a single file in them.
83  * Each audio file gets its own virtual directory, containing only the
84  * audio file itself.
85  *
86  * Useful children who want to listen a single story before sleeping,
87  * but the noxon's auto switch-off timer is not exactly at the end of
88  * the story. So the next story starts already, and the kid complains
89  * that it wanted to listen to that as well...
90  */
91 function mediatombSingle(Services_MediaTomb $smt, $fullPath, $prefix)
92 {
93     $path = substr($fullPath, strlen($prefix));
94
95     $parts = explode('/', $path);
96     $fileMode = false;
97     if (substr(end($parts), 0, 5) == 'file-') {
98         $fileMode = true;
99         $fileTitle = substr(end($parts), 5);
100         $path = substr($path, 0, -strlen($fileTitle) - 5);
101     }
102
103     $container = $smt->getContainerByPath($path);
104     $listItems = array();
105
106     $previous = null;
107     if ($fileMode) {
108         //show single file to play
109         $previous = buildPreviousItem(pathEncode($fullPath));
110         $item = $smt->getSingleItem($container, $fileTitle, false);
111         mediatombAddFile($listItems, $item);
112     } else {
113         $previous = buildPreviousItem(pathEncode('internetradio/' . $path . '/dummy'));
114
115         //browse directory
116         foreach ($container->getItemIterator(false) as $item) {
117             $listItems[] = getDirItem(
118                 $item->title,
119                 pathEncode($fullPath . 'file-' . $item->title)
120             );
121         }
122     }
123
124     sendListItems($listItems, $previous);
125 }
126 ?>