532bbef892ed36d7fc2adc71863907e93c713a14
[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 (!clientSupportsType($di->mimetype)) {
69         //client wants transcoded file
70         //noxon iRadio cube does not want to play .ogg files
71         $itemUrl = $host1 . 'transcode-nocache.php'
72             . '?url=' . urlencode($itemUrl);
73     }
74     $listItems[] = getEpisodeItem(
75         $item->title,
76         $itemUrl,
77         '',
78         'MP3'
79     );
80 }
81
82 function clientSupportsType($mimetype)
83 {
84     if ($mimetype === 'audio/mpeg') {
85         return true;
86     }
87     $ip = $_SERVER['REMOTE_ADDR'];
88     if (isset($GLOBALS['clientSupport'][$ip][$mimetype])
89         && $GLOBALS['clientSupport'][$ip][$mimetype] === true
90     ) {
91         return true;
92     }
93     return false;
94 }
95
96 /**
97  * Single file mode - shows directories that only have a single file in them.
98  * Each audio file gets its own virtual directory, containing only the
99  * audio file itself.
100  *
101  * Useful children who want to listen a single story before sleeping,
102  * but the noxon's auto switch-off timer is not exactly at the end of
103  * the story. So the next story starts already, and the kid complains
104  * that it wanted to listen to that as well...
105  */
106 function mediatombSingle(Services_MediaTomb $smt, $fullPath, $prefix)
107 {
108     $path = substr($fullPath, strlen($prefix));
109
110     $parts = explode('/', $path);
111     $fileMode = false;
112     if (substr(end($parts), 0, 5) == 'file-') {
113         $fileMode = true;
114         $fileTitle = substr(end($parts), 5);
115         $path = substr($path, 0, -strlen($fileTitle) - 5);
116     }
117
118     $container = $smt->getContainerByPath($path);
119     $listItems = array();
120
121     $previous = null;
122     if ($fileMode) {
123         //show single file to play
124         $previous = buildPreviousItem(pathEncode($fullPath));
125         $item = $smt->getSingleItem($container, $fileTitle, false);
126         mediatombAddFile($listItems, $item);
127     } else {
128         $previous = buildPreviousItem(pathEncode('internetradio/' . $path . '/dummy'));
129
130         //browse directory
131         foreach ($container->getItemIterator(false) as $item) {
132             $listItems[] = getDirItem(
133                 $item->title,
134                 pathEncode($fullPath . 'file-' . $item->title)
135             );
136         }
137     }
138
139     sendListItems($listItems, $previous);
140 }
141 ?>