+<?php
+/**
+* Syncs all dreambox radio bouqets into a folder on mediatomb.
+* Renames/changes existing entries instead of deleting
+* everything first.
+*
+* @author Christian Weiske <cweiske@php.net>
+* @license LGPL http://www.gnu.org/copyleft/lesser.html
+*/
+require_once 'DreamboxBouqets.php';
+require_once 'Services/MediaTomb.php';
+require_once 'config.php';
+require_once dirname(__FILE__) . '/syncfunctions.php';
+
+$bReally = true;
+
+echo "Synchronizing dreambox radio bouqets and mediatomb radion station list\n";
+echo " fetching bouqets\n";
+$arBouqets = DreamboxBouqets::fetchRadioBouqets(
+ $GLOBALS['enigtombConfig']['dreambox']['host']
+);
+
+$mt = new Services_MediaTomb(
+ $GLOBALS['enigtombConfig']['mediatomb']['user'],
+ $GLOBALS['enigtombConfig']['mediatomb']['pass'],
+ $GLOBALS['enigtombConfig']['mediatomb']['host'],
+ $GLOBALS['enigtombConfig']['mediatomb']['port']
+);
+
+$strRadiodir = $GLOBALS['enigtombConfig']['mediatomb']['radiodir'];
+
+$radiodir = $mt->createContainerByPath($strRadiodir);
+
+/**
+* create bouqet/container sync list
+*/
+$arBouqetNames = array_keys($arBouqets);
+$arRadiodirContainers = $radiodir->getContainers();
+$arContainerNames = array();
+foreach ($arRadiodirContainers as $nId => $container) {
+ $arBouqetNames[] = $container->title;
+ $arContainerNames[$container->title] = $nId;
+}
+
+if (isset($GLOBALS['enigtombConfig']['mediatomb']['rootBouqet'])
+ && $GLOBALS['enigtombConfig']['mediatomb']['rootBouqet']
+) {
+ $arBouqetNames[] = $GLOBALS['enigtombConfig']['mediatomb']['rootBouqet'];
+ $arContainerNames[$GLOBALS['enigtombConfig']['mediatomb']['rootBouqet']] = $radiodir->id;
+ $arRadiodirContainers[$radiodir->id] = $radiodir;
+}
+
+$arBouqetNames = array_unique($arBouqetNames);
+
+/**
+* sync bouqets and containers
+* Does not know about renamed bouqets
+*/
+echo " syncing bouqets and containers\n";
+$arValidContainers = array();
+foreach ($arBouqetNames as $strBouqetName) {
+ if (isset($arContainerNames[$strBouqetName]) && isset($arBouqets[$strBouqetName])) {
+ //everything is ok
+ echo " " . $strBouqetName . " already exists, ok\n";
+ $nContainerId = $arContainerNames[$strBouqetName];
+ $arValidContainers[$nContainerId] = $arRadiodirContainers[$nContainerId];
+ } else if (!isset($arContainerNames[$strBouqetName])) {
+ //container does not exist
+ if ($strBouqetName != $GLOBALS['enigtombConfig']['mediatomb']['rootBouqet']) {
+ echo " creating " . $strBouqetName . "\n";
+ $container = $mt->createContainerByPath($strRadiodir . '/' . $strBouqetName);
+ $arValidContainers[$container->id] = $container;
+ }
+ } else if (!isset($arBouqets[$strBouqetName])) {
+ if ($strBouqetName != $GLOBALS['enigtombConfig']['mediatomb']['rootBouqet']) {
+ //bouqet does not exist anymore -> delete container
+ echo " deleting container " . $strBouqetName . "\n";
+ if ($bReally) {
+ $mt->delete($arContainerNames[$strBouqetName]);
+ }
+ }
+ }
+}
+
+/**
+* Sync radio stations
+*/
+echo " syncing stations\n";
+foreach ($arValidContainers as $nContainerId => $container) {
+ /**
+ * Build stations sync list
+ */
+ if (isset($GLOBALS['enigtombConfig']['mediatomb']['rootBouqet'])
+ && $GLOBALS['enigtombConfig']['mediatomb']['rootBouqet']
+ && $container == $radiodir
+ ) {
+ $strContainerTitle = $GLOBALS['enigtombConfig']['mediatomb']['rootBouqet'];
+ } else {
+ $strContainerTitle = $container->title;
+ }
+ echo " syncing stations in " . $strContainerTitle . "\n";
+
+ //existing stations in mediatomb
+ $arStationItems = $container->getItems(0, 1000);
+ $arStationUris = array();
+ $arStationItemsByUri = array();
+ foreach ($arStationItems as $item) {
+ $arStationUris[] = $item->url;
+ $arStationItemsByUri[$item->url] = $item;
+ }
+ unset($arStationItems);
+
+ //stations in bouqet
+ foreach ($arBouqets[$strContainerTitle] as $arStation) {
+ $arStationUris[] = $arStation['stream'];
+ $arBouqetStationsByUri[$arStation['stream']] = $arStation;
+ }
+ unset($arBouqets[$strContainerTitle]);
+
+ $arStationUris = array_unique($arStationUris);
+
+ //sync stations
+ foreach ($arStationUris as $strUri) {
+ echo ' syncing station ' . $strUri . "\n";
+ if (isset($arBouqetStationsByUri[$strUri]) && isset($arStationItemsByUri[$strUri])) {
+ //station exists on both dreambox and mediatomb
+ //update title
+ echo " updating title and description\n";
+ $arTitles = enigtombGetStationTitle($arBouqetStationsByUri[$strUri]);
+ echo " " . $arTitles['title'] . "\n";
+ if ($arTitles['description'] && $arTitles['description'] != $arTitles['title']) {
+ echo " " . $arTitles['description'] . "\n";
+ }
+ $arStationItemsByUri[$strUri]->title = $arTitles['title'];
+ $arStationItemsByUri[$strUri]->description = $arTitles['description'];
+ if ($bReally) {
+ $arStationItemsByUri[$strUri]->save();
+ }
+ } else if (!isset($arBouqetStationsByUri[$strUri])) {
+ //station does not exist on dreambox
+ //delete it in mediatomb
+ echo " deleting\n";
+ if ($bReally) {
+ $arStationItemsByUri[$strUri]->delete();
+ }
+ } else if (!isset($arStationItemsByUri[$strUri])) {
+ //station exists on dreambox only
+ //create it in mediatomb
+ echo " creating\n";
+ $arTitles = enigtombGetStationTitle($arBouqetStationsByUri[$strUri]);
+ echo " " . $arTitles['title'] . "\n";
+ if ($bReally) {
+ $arStationItemsByUri[$strUri]->createExternalLink(
+ $arTitles['title'], $strUri, $arTitles['description'],
+ $GLOBALS['enigtombConfig']['mediatomb']['mimetype'],
+ 'http-get', 'object.item', false
+ );
+ }
+ }
+ }
+}
+
+
+echo "done\n";
+?>
\ No newline at end of file