3 * Syncs all dreambox radio bouqets into a folder on mediatomb.
4 * Renames/changes existing entries instead of deleting
7 * @author Christian Weiske <cweiske@php.net>
8 * @license LGPL http://www.gnu.org/copyleft/lesser.html
10 require_once 'DreamboxBouqets.php';
11 require_once 'Services/MediaTomb.php';
12 require_once 'config.php';
13 require_once dirname(__FILE__) . '/syncfunctions.php';
17 echo "Synchronizing dreambox radio bouqets and mediatomb radion station list\n";
18 echo " fetching bouqets\n";
19 $arBouqets = DreamboxBouqets::fetchRadioBouqets(
20 $GLOBALS['enigtombConfig']['dreambox']['host']
23 $mt = new Services_MediaTomb(
24 $GLOBALS['enigtombConfig']['mediatomb']['user'],
25 $GLOBALS['enigtombConfig']['mediatomb']['pass'],
26 $GLOBALS['enigtombConfig']['mediatomb']['host'],
27 $GLOBALS['enigtombConfig']['mediatomb']['port']
30 $strRadiodir = $GLOBALS['enigtombConfig']['mediatomb']['radiodir'];
32 $radiodir = $mt->createContainerByPath($strRadiodir);
35 * create bouqet/container sync list
37 $arBouqetNames = array_keys($arBouqets);
38 $arRadiodirContainers = $radiodir->getContainers();
39 $arContainerNames = array();
40 foreach ($arRadiodirContainers as $nId => $container) {
41 $arBouqetNames[] = $container->title;
42 $arContainerNames[$container->title] = $nId;
45 if (isset($GLOBALS['enigtombConfig']['mediatomb']['rootBouqet'])
46 && $GLOBALS['enigtombConfig']['mediatomb']['rootBouqet']
48 $arBouqetNames[] = $GLOBALS['enigtombConfig']['mediatomb']['rootBouqet'];
49 $arContainerNames[$GLOBALS['enigtombConfig']['mediatomb']['rootBouqet']] = $radiodir->id;
50 $arRadiodirContainers[$radiodir->id] = $radiodir;
53 $arBouqetNames = array_unique($arBouqetNames);
56 * sync bouqets and containers
57 * Does not know about renamed bouqets
59 echo " syncing bouqets and containers\n";
60 $arValidContainers = array();
61 foreach ($arBouqetNames as $strBouqetName) {
62 if (isset($arContainerNames[$strBouqetName]) && isset($arBouqets[$strBouqetName])) {
64 echo " " . $strBouqetName . " already exists, ok\n";
65 $nContainerId = $arContainerNames[$strBouqetName];
66 $arValidContainers[$nContainerId] = $arRadiodirContainers[$nContainerId];
67 } else if (!isset($arContainerNames[$strBouqetName])) {
68 //container does not exist
69 if ($strBouqetName != $GLOBALS['enigtombConfig']['mediatomb']['rootBouqet']) {
70 echo " creating " . $strBouqetName . "\n";
71 $container = $mt->createContainerByPath($strRadiodir . '/' . $strBouqetName);
72 $arValidContainers[$container->id] = $container;
74 } else if (!isset($arBouqets[$strBouqetName])) {
75 if ($strBouqetName != $GLOBALS['enigtombConfig']['mediatomb']['rootBouqet']) {
76 //bouqet does not exist anymore -> delete container
77 echo " deleting container " . $strBouqetName . "\n";
79 $mt->deleteItem($arContainerNames[$strBouqetName]);
88 echo " syncing stations\n";
89 foreach ($arValidContainers as $nContainerId => $container) {
91 * Build stations sync list
93 if (isset($GLOBALS['enigtombConfig']['mediatomb']['rootBouqet'])
94 && $GLOBALS['enigtombConfig']['mediatomb']['rootBouqet']
95 && $container == $radiodir
97 $strContainerTitle = $GLOBALS['enigtombConfig']['mediatomb']['rootBouqet'];
99 $strContainerTitle = $container->title;
101 echo " syncing stations in " . $strContainerTitle . "\n";
103 //existing stations in mediatomb
104 $arStationItems = $container->getItems(0, 1000);
105 $arStationUris = array();
106 $arStationItemsByUri = array();
107 foreach ($arStationItems as $item) {
108 $arStationUris[] = $item->url;
109 $arStationItemsByUri[$item->url] = $item;
111 unset($arStationItems);
114 foreach ($arBouqets[$strContainerTitle] as $arStation) {
115 $arStationUris[] = $arStation['stream'];
116 $arBouqetStationsByUri[$arStation['stream']] = $arStation;
118 unset($arBouqets[$strContainerTitle]);
120 $arStationUris = array_unique($arStationUris);
123 foreach ($arStationUris as $strUri) {
124 echo ' syncing station ' . $strUri . "\n";
125 if (isset($arBouqetStationsByUri[$strUri]) && isset($arStationItemsByUri[$strUri])) {
126 //station exists on both dreambox and mediatomb
128 echo " updating title and description\n";
129 $arTitles = enigtombGetStationTitle($arBouqetStationsByUri[$strUri]);
130 echo " " . $arTitles['title'] . "\n";
131 if ($arTitles['description'] && $arTitles['description'] != $arTitles['title']) {
132 echo " " . $arTitles['description'] . "\n";
134 $arStationItemsByUri[$strUri]->title = $arTitles['title'];
135 $arStationItemsByUri[$strUri]->description = $arTitles['description'];
137 $arStationItemsByUri[$strUri]->save();
139 } else if (!isset($arBouqetStationsByUri[$strUri])) {
140 //station does not exist on dreambox
141 //delete it in mediatomb
144 $arStationItemsByUri[$strUri]->deleteItem();
146 } else if (!isset($arStationItemsByUri[$strUri])) {
147 //station exists on dreambox only
148 //create it in mediatomb
150 $arTitles = enigtombGetStationTitle($arBouqetStationsByUri[$strUri]);
151 echo " " . $arTitles['title'] . "\n";
153 $container->createExternalLink(
154 $arTitles['title'], $strUri, $arTitles['description'],
155 $GLOBALS['enigtombConfig']['mediatomb']['mimetype'],
156 'http-get', 'object.item', false