Merge branch 'devel' of dev.sourcefabric.org:airtime into devel

This commit is contained in:
denise 2012-09-10 17:17:19 -04:00
commit bca7fbf50e
15 changed files with 124 additions and 127 deletions

View File

@ -337,6 +337,7 @@ class ApiController extends Zend_Controller_Action
$this->_helper->viewRenderer->setNoRender(true); $this->_helper->viewRenderer->setNoRender(true);
$data = Application_Model_Schedule::getSchedule(); $data = Application_Model_Schedule::getSchedule();
header("Content-Type: application/json");
echo json_encode($data, JSON_FORCE_OBJECT); echo json_encode($data, JSON_FORCE_OBJECT);
} }
@ -688,9 +689,12 @@ class ApiController extends Zend_Controller_Action
{ {
$request = $this->getRequest(); $request = $this->getRequest();
$dir_id = $request->getParam('dir_id'); $dir_id = $request->getParam('dir_id');
$all = $request->getParam('all');
Logging::info("All param is: $all");
$this->view->files = $this->view->files =
Application_Model_StoredFile::listAllFiles($dir_id,$all=true); Application_Model_StoredFile::listAllFiles($dir_id,$all);
} }
public function listAllWatchedDirsAction() public function listAllWatchedDirsAction()

View File

@ -339,7 +339,7 @@ class ScheduleController extends Zend_Controller_Action
return false; return false;
} }
if($user->isUserType(array(UTYPE_ADMIN, UTYPE_PROGRAM_MANAGER) && $user->isHostOfShow($show->getShowId()))) if($user->isUserType(array(UTYPE_ADMIN, UTYPE_PROGRAM_MANAGER)) || $user->isHostOfShow($show->getShowId()))
$show->clearShow(); $show->clearShow();
} }
@ -404,7 +404,7 @@ class ScheduleController extends Zend_Controller_Action
return false; return false;
} }
if ($user->isUserType(array(UTYPE_ADMIN, UTYPE_PROGRAM_MANAGER) && $user->isHostOfShow($show->getShowId()))) { if ($user->isUserType(array(UTYPE_ADMIN, UTYPE_PROGRAM_MANAGER)) || $user->isHostOfShow($show->getShowId())) {
$show->removeGroupFromShow($group_id); $show->removeGroupFromShow($group_id);
} }

View File

@ -13,6 +13,9 @@ class Application_Model_Datatables
if ($dbname == 'utime' || $dbname == 'mtime') { if ($dbname == 'utime' || $dbname == 'mtime') {
$input1 = isset($info[0])?Application_Common_DateHelper::ConvertToUtcDateTimeString($info[0]):null; $input1 = isset($info[0])?Application_Common_DateHelper::ConvertToUtcDateTimeString($info[0]):null;
$input2 = isset($info[1])?Application_Common_DateHelper::ConvertToUtcDateTimeString($info[1]):null; $input2 = isset($info[1])?Application_Common_DateHelper::ConvertToUtcDateTimeString($info[1]):null;
} else if($dbname == 'bit_rate') {
$input1 = isset($info[0])?intval($info[0]) * 1000:null;
$input2 = isset($info[1])?intval($info[1]) * 1000:null;
} else { } else {
$input1 = isset($info[0])?$info[0]:null; $input1 = isset($info[0])?$info[0]:null;
$input2 = isset($info[1])?$info[1]:null; $input2 = isset($info[1])?$info[1]:null;

View File

@ -79,16 +79,29 @@ class Application_Model_MusicDir
$music_dir_id = $this->getId(); $music_dir_id = $this->getId();
$sql = "SELECT DISTINCT s.instance_id from cc_music_dirs as md " $sql = <<<SQL
." LEFT JOIN cc_files as f on f.directory = md.id" SELECT DISTINCT s.instance_id
." RIGHT JOIN cc_schedule as s on s.file_id = f.id WHERE md.id = $music_dir_id"; FROM cc_music_dirs AS md
LEFT JOIN cc_files AS f ON f.directory = md.id
$show_instances = $con->query($sql)->fetchAll(); RIGHT JOIN cc_schedule AS s ON s.file_id = f.id
WHERE md.id = :musicDirId;
SQL;
$show_instances = Application_Common_Database::prepareAndExecute($sql,
array( ':musicDirId' => $music_dir_id ), 'all' );
// get all the files on this dir // get all the files on this dir
$sql = "UPDATE cc_files SET file_exists = 'f' WHERE id IN (SELECT f.id FROM cc_music_dirs as md " $sql = <<<SQL
." LEFT JOIN cc_files as f on f.directory = md.id WHERE md.id = $music_dir_id)"; UPDATE cc_files
$affected = $con->exec($sql); SET file_exists = 'f'
WHERE id IN
(SELECT f.id
FROM cc_music_dirs AS md
LEFT JOIN cc_files AS f ON f.directory = md.id
WHERE md.id = :musicDirId);
SQL;
$affected = Application_Common_Database::prepareAndExecute($sql,
array( ':musicDirId' => $music_dir_id ), 'all');
// set RemovedFlag to true // set RemovedFlag to true
if ($userAddedWatchedDir) { if ($userAddedWatchedDir) {

View File

@ -172,20 +172,21 @@ class Application_Model_Schedule
public static function GetLastScheduleItem($p_timeNow) public static function GetLastScheduleItem($p_timeNow)
{ {
global $CC_CONFIG; global $CC_CONFIG;
$sql = "SELECT" $sql = <<<SQL
." ft.artist_name, ft.track_title," SELECT ft.artist_name,
." st.starts as starts, st.ends as ends" ft.track_title,
." FROM $CC_CONFIG[scheduleTable] st" st.starts AS starts,
." LEFT JOIN $CC_CONFIG[filesTable] ft" st.ends AS ends
." ON st.file_id = ft.id" FROM $CC_CONFIG[scheduleTable] st
." LEFT JOIN $CC_CONFIG[showInstances] sit" LEFT JOIN $CC_CONFIG[filesTable] ft ON st.file_id = ft.id
." ON st.instance_id = sit.id" LEFT JOIN $CC_CONFIG[showInstances] sit ON st.instance_id = sit.id
." WHERE st.ends < TIMESTAMP :timeNow" -- this and the next line are necessary since we can overbook shows.
." AND st.starts >= sit.starts" //this and the next line are necessary since we can overbook shows. WHERE st.ends < TIMESTAMP :timeNow
." AND st.starts < sit.ends"
." ORDER BY st.ends DESC"
." LIMIT 1";
AND st.starts >= sit.starts
AND st.starts < sit.ends
ORDER BY st.ends DESC LIMIT 1;
SQL;
$row = Application_Common_Database::prepareAndExecute($sql, array(':timeNow'=>$p_timeNow)); $row = Application_Common_Database::prepareAndExecute($sql, array(':timeNow'=>$p_timeNow));
return $row; return $row;
@ -527,14 +528,17 @@ SQL;
//." st.type AS type," //." st.type AS type,"
." si.starts AS show_start," ." si.starts AS show_start,"
." si.ends AS show_end," ." si.ends AS show_end,"
." s.name AS show_name,"
." f.id AS file_id," ." f.id AS file_id,"
." f.replay_gain AS replay_gain," ." f.replay_gain AS replay_gain,"
." ws.id as stream_id," ." ws.id as stream_id,"
." ws.url as url" ." ws.url as url"
." FROM $CC_CONFIG[scheduleTable] AS st" ." FROM cc_schedule AS st"
." LEFT JOIN $CC_CONFIG[showInstances] AS si" ." LEFT JOIN cc_show_instances AS si"
." ON st.instance_id = si.id" ." ON st.instance_id = si.id"
." LEFT JOIN $CC_CONFIG[filesTable] AS f" ." LEFT JOIN cc_show as s"
." ON s.id = si.show_id"
." LEFT JOIN cc_files AS f"
." ON st.file_id = f.id" ." ON st.file_id = f.id"
." LEFT JOIN cc_webstream AS ws" ." LEFT JOIN cc_webstream AS ws"
." ON st.stream_id = ws.id"; ." ON st.stream_id = ws.id";
@ -547,11 +551,10 @@ SQL;
$sql = $baseQuery.$predicates; $sql = $baseQuery.$predicates;
$rows = Application_Common_Database::prepareAndExecute($sql, array(':startTime1'=>$p_startTime, ':endTime'=>$p_endTime, ':startTime2'=>$p_startTime)); $rows = Application_Common_Database::prepareAndExecute($sql,
array(':startTime1'=>$p_startTime, ':endTime'=>$p_endTime, ':startTime2'=>$p_startTime));
if (count($rows) < 3) { if (count($rows) < 3) {
Logging::debug("Get Schedule: Less than 3 results returned. Doing another query since we need a minimum of 3 results.");
$dt = new DateTime("@".time()); $dt = new DateTime("@".time());
$dt->add(new DateInterval("PT24H")); $dt->add(new DateInterval("PT24H"));
$range_end = $dt->format("Y-m-d H:i:s"); $range_end = $dt->format("Y-m-d H:i:s");
@ -564,12 +567,31 @@ SQL;
." LIMIT 3"; ." LIMIT 3";
$sql = $baseQuery.$predicates; $sql = $baseQuery.$predicates;
$rows = Application_Common_Database::prepareAndExecute($sql, array(':startTime1'=>$p_startTime, ':rangeEnd'=>$range_end, ':startTime2'=>$p_startTime)); $rows = Application_Common_Database::prepareAndExecute($sql,
array(':startTime1'=>$p_startTime, ':rangeEnd'=>$range_end, ':startTime2'=>$p_startTime));
} }
return $rows; return $rows;
} }
/**
* This function will ensure that an existing index in the
* associative array is never overwritten, instead appending
* _0, _1, _2, ... to the end of the key to make sure it is unique
*/
private static function appendScheduleItem(&$data, $time, $item)
{
$key = $time;
$i = 0;
while (array_key_exists($key, $data["media"])) {
$key = "{$time}_{$i}";
$i++;
}
$data["media"][$key] = $item;
}
private static function createInputHarborKickTimes(&$data, $range_start, $range_end) private static function createInputHarborKickTimes(&$data, $range_start, $range_end)
{ {
$utcTimeZone = new DateTimeZone("UTC"); $utcTimeZone = new DateTimeZone("UTC");
@ -601,7 +623,7 @@ SQL;
} }
} }
private static function createFileScheduleEvent(&$data, $item, $media_id) private static function createFileScheduleEvent(&$data, $item, $media_id, $uri)
{ {
$start = self::AirtimeTimeToPypoTime($item["start"]); $start = self::AirtimeTimeToPypoTime($item["start"]);
$end = self::AirtimeTimeToPypoTime($item["end"]); $end = self::AirtimeTimeToPypoTime($item["end"]);
@ -617,14 +639,14 @@ SQL;
'cue_out' => Application_Common_DateHelper::CalculateLengthInSeconds($item["cue_out"]), 'cue_out' => Application_Common_DateHelper::CalculateLengthInSeconds($item["cue_out"]),
'start' => $start, 'start' => $start,
'end' => $end, 'end' => $end,
'show_name' => $showName, 'show_name' => $item["show_name"],
'replay_gain' => is_null($item["replay_gain"]) ? "0": $item["replay_gain"], 'replay_gain' => is_null($item["replay_gain"]) ? "0": $item["replay_gain"],
'independent_event' => true 'independent_event' => true
); );
$data["media"][$start] = $schedule_item; self::appendScheduleItem($data, $start, $schedule_item);
} }
private static function createStreamScheduleEvent(&$data, $item, $media_id) private static function createStreamScheduleEvent(&$data, $item, $media_id, $uri)
{ {
$start = self::AirtimeTimeToPypoTime($item["start"]); $start = self::AirtimeTimeToPypoTime($item["start"]);
$end = self::AirtimeTimeToPypoTime($item["end"]); $end = self::AirtimeTimeToPypoTime($item["end"]);
@ -644,8 +666,8 @@ SQL;
'independent_event' => true 'independent_event' => true
); );
//TODO: Make sure no other media is being overwritten! self::appendScheduleItem($data, $start, $schedule_item);
$data["media"][$stream_buffer_start] = $schedule_item;
$schedule_item = array( $schedule_item = array(
'id' => $media_id, 'id' => $media_id,
'type' => 'stream_output_start', 'type' => 'stream_output_start',
@ -653,21 +675,16 @@ SQL;
'uri' => $uri, 'uri' => $uri,
'start' => $start, 'start' => $start,
'end' => $end, 'end' => $end,
'show_name' => $showName, 'show_name' => $item["show_name"],
'independent_event' => true 'independent_event' => true
); );
$data["media"][$start] = $schedule_item; self::appendScheduleItem($data, $start, $schedule_item);
//since a stream never ends we have to insert an additional "kick stream" event. The "start" //since a stream never ends we have to insert an additional "kick stream" event. The "start"
//time of this event is the "end" time of the stream minus 1 second. //time of this event is the "end" time of the stream minus 1 second.
$dt = new DateTime($item["end"], new DateTimeZone('UTC')); $dt = new DateTime($item["end"], new DateTimeZone('UTC'));
$dt->sub(new DateInterval("PT1S")); $dt->sub(new DateInterval("PT1S"));
//make sure the webstream doesn't play past the end time of the show
if ($dt->getTimestamp() > $showEndDateTime->getTimestamp()) {
$dt = $showEndDateTime;
}
$stream_end = self::AirtimeTimeToPypoTime($dt->format("Y-m-d H:i:s")); $stream_end = self::AirtimeTimeToPypoTime($dt->format("Y-m-d H:i:s"));
$schedule_item = array( $schedule_item = array(
@ -677,8 +694,7 @@ SQL;
'type' => 'stream_buffer_end', 'type' => 'stream_buffer_end',
'independent_event' => true 'independent_event' => true
); );
$data["media"][$stream_end] = $schedule_item; self::appendScheduleItem($data, $stream_end, $schedule_item);
$schedule_item = array( $schedule_item = array(
'start' => $stream_end, 'start' => $stream_end,
@ -687,7 +703,7 @@ SQL;
'type' => 'stream_output_end', 'type' => 'stream_output_end',
'independent_event' => true 'independent_event' => true
); );
$data["media"][$stream_end] = $schedule_item; self::appendScheduleItem($data, $stream_end, $schedule_item);
} }
private static function getRangeStartAndEnd($p_fromDateTime, $p_toDateTime) private static function getRangeStartAndEnd($p_fromDateTime, $p_toDateTime)
@ -723,28 +739,14 @@ SQL;
return array($range_start, $range_end); return array($range_start, $range_end);
} }
public static function getSchedule($p_fromDateTime = null, $p_toDateTime = null)
private static function createScheduledEvents(&$data, $range_start, $range_end)
{ {
list($range_start, $range_end) = self::getRangeStartAndEnd($p_fromDateTime, $p_toDateTime);
$data = array();
$utcTimeZone = new DateTimeZone("UTC"); $utcTimeZone = new DateTimeZone("UTC");
$data["status"] = array();
$data["media"] = array();
self::createInputHarborKickTimes($data, $range_start, $range_end);
$items = self::getItems($range_start, $range_end); $items = self::getItems($range_start, $range_end);
foreach ($items as $item) { foreach ($items as $item) {
$showInstance = CcShowInstancesQuery::create()->findPK($item["instance_id"]);
$showId = $showInstance->getDbShowId();
$show = CcShowQuery::create()->findPK($showId);
$showName = $show->getDbName();
$showEndDateTime = new DateTime($item["show_end"], $utcTimeZone); $showEndDateTime = new DateTime($item["show_end"], $utcTimeZone);
$trackStartDateTime = new DateTime($item["start"], $utcTimeZone); $trackStartDateTime = new DateTime($item["start"], $utcTimeZone);
$trackEndDateTime = new DateTime($item["end"], $utcTimeZone); $trackEndDateTime = new DateTime($item["end"], $utcTimeZone);
@ -773,29 +775,21 @@ SQL;
self::createStreamScheduleEvent($data, $item, $media_id, $uri); self::createStreamScheduleEvent($data, $item, $media_id, $uri);
} }
} }
}
public static function getSchedule($p_fromDateTime = null, $p_toDateTime = null)
{
list($range_start, $range_end) = self::getRangeStartAndEnd($p_fromDateTime, $p_toDateTime);
$data = array();
$data["media"] = array();
self::createInputHarborKickTimes($data, $range_start, $range_end);
self::createScheduledEvents($data, $range_start, $range_end);
return $data; return $data;
} }
/*
private static function collapseEvents($data)
{
$keys = array_keys($data);
for ($i = 0, $len = count($keys); $i < $len; $i++) {
$cur = $data[$keys[$i]];
$next = null;
if ($i+1 < $len) {
$next = $data[$keys[$i+1]];
}
if ($cur['type'] == 'stream_buffer_end' && !is_null($next) && $next['type'] == 'stream_buffer_start') {
unset($data[$keys[$i]]);
}
}
}
*/
public static function deleteAll() public static function deleteAll()
{ {
global $CC_CONFIG; global $CC_CONFIG;
@ -896,10 +890,12 @@ SQL;
$when = $formWhen->isValid($data); $when = $formWhen->isValid($data);
if ($when && $formWhen->checkReliantFields($data, true, null, true)) { if ($when && $formWhen->checkReliantFields($data, true, null, true)) {
$start_dt = new DateTime($data['add_show_start_date']." ".$data['add_show_start_time'], new DateTimeZone(date_default_timezone_get())); $start_dt = new DateTime($data['add_show_start_date']." ".$data['add_show_start_time'],
new DateTimeZone(date_default_timezone_get()));
$start_dt->setTimezone(new DateTimeZone('UTC')); $start_dt->setTimezone(new DateTimeZone('UTC'));
$end_dt = new DateTime($data['add_show_end_date_no_repeat']." ".$data['add_show_end_time'], new DateTimeZone(date_default_timezone_get())); $end_dt = new DateTime($data['add_show_end_date_no_repeat']." ".$data['add_show_end_time'],
new DateTimeZone(date_default_timezone_get()));
$end_dt->setTimezone(new DateTimeZone('UTC')); $end_dt->setTimezone(new DateTimeZone('UTC'));
$ccShowInstance = CcShowInstancesQuery::create()->findPK($data["add_show_instance_id"]); $ccShowInstance = CcShowInstancesQuery::create()->findPK($data["add_show_instance_id"]);
@ -1122,12 +1118,6 @@ SQL;
*/ */
//$se = $show_end->format('Y-m-d H:i:s'); //$se = $show_end->format('Y-m-d H:i:s');
if ($update) { if ($update) {
$sql = "SELECT id, starts, ends FROM ".$CC_CONFIG["showInstances"]."
where (ends <= '{$show_end->format('Y-m-d H:i:s')}'
or starts <= '{$show_end->format('Y-m-d H:i:s')}')
and date(starts) >= (date('{$show_end->format('Y-m-d H:i:s')}') - INTERVAL '2 days')
and modified_instance = false and id != ".$instanceId. " order by ends";
$stmt = $con->prepare("SELECT id, starts, ends FROM {$CC_CONFIG['showInstances']} $stmt = $con->prepare("SELECT id, starts, ends FROM {$CC_CONFIG['showInstances']}
where (ends <= :show_end1 where (ends <= :show_end1
or starts <= :show_end2) or starts <= :show_end2)
@ -1141,13 +1131,6 @@ SQL;
':instanceId' => $instanceId ':instanceId' => $instanceId
)); ));
} else { } else {
// TODO : Remove raw sql later
$sql = "SELECT id, starts, ends FROM ".$CC_CONFIG["showInstances"]."
where (ends <= '{$show_end->format('Y-m-d H:i:s')}'
or starts <= '{$show_end->format('Y-m-d H:i:s')}')
and date(starts) >= (date('{$show_end->format('Y-m-d H:i:s')}') - INTERVAL '2 days')
and modified_instance = false order by ends";
$stmt = $con->prepare("SELECT id, starts, ends FROM $stmt = $con->prepare("SELECT id, starts, ends FROM
{$CC_CONFIG['showInstances']} {$CC_CONFIG['showInstances']}
where (ends <= :show_end1 or starts <= :show_end2) where (ends <= :show_end1 or starts <= :show_end2)
@ -1160,7 +1143,6 @@ SQL;
':show_end3' => $show_end->format('Y-m-d H:i:s') ':show_end3' => $show_end->format('Y-m-d H:i:s')
)); ));
} }
//$rows = $con->query($sql);
$rows = $stmt->fetchAll(); $rows = $stmt->fetchAll();
foreach ($rows as $row) { foreach ($rows as $row) {

View File

@ -51,11 +51,6 @@ class Application_Model_StoredFile
"owner_id" => "DbOwnerId" "owner_id" => "DbOwnerId"
); );
public function __construct()
{
}
public function getId() public function getId()
{ {
return $this->_file->getDbId(); return $this->_file->getDbId();

View File

@ -262,7 +262,6 @@ class Application_Model_Webstream implements Application_Model_LibraryEditable
private static function getPlsUrl($url) private static function getPlsUrl($url)
{ {
$content = self::getUrlData($url); $content = self::getUrlData($url);
$ini = parse_ini_string($content, true); $ini = parse_ini_string($content, true);
if ($ini !== false && isset($ini["playlist"]) && isset($ini["playlist"]["File1"])) { if ($ini !== false && isset($ini["playlist"]) && isset($ini["playlist"]["File1"])) {

View File

@ -416,7 +416,7 @@ var AIRTIME = (function(AIRTIME) {
/* Language */ { "sTitle" : "Language" , "mDataProp" : "language" , "bVisible" : false , "sClass" : "library_language" , "sWidth" : "125px" } , /* Language */ { "sTitle" : "Language" , "mDataProp" : "language" , "bVisible" : false , "sClass" : "library_language" , "sWidth" : "125px" } ,
/* Owner */ { "sTitle" : "Owner" , "mDataProp" : "owner" , "bVisible" : false , "sClass" : "library_language" , "sWidth" : "125px" } , /* Owner */ { "sTitle" : "Owner" , "mDataProp" : "owner" , "bVisible" : false , "sClass" : "library_language" , "sWidth" : "125px" } ,
/* Conductor */ { "sTitle" : "Conductor" , "mDataProp" : "conductor" , "bVisible" : false , "sClass" : "library_conductor" , "sWidth" : "125px" }, /* Conductor */ { "sTitle" : "Conductor" , "mDataProp" : "conductor" , "bVisible" : false , "sClass" : "library_conductor" , "sWidth" : "125px" },
/* Replay Gain */ { "sTitle" : "Replay Gain" , "mDataProp" : "replay_gain" , "bVisible" : false , "sClass" : "library_language" , "sWidth" : "125px" } /* Replay Gain */ { "sTitle" : "Replay Gain" , "mDataProp" : "replay_gain" , "bVisible" : false , "sClass" : "library_language" , "sWidth" : "80px" }
], ],
"bProcessing": true, "bProcessing": true,

View File

@ -64,15 +64,15 @@ apt-get -y --force-yes install libmp3lame-dev lame icecast2
#Ubuntu Lucid has both zendframework and zend-framework. Difference appears to be that zendframework is for #Ubuntu Lucid has both zendframework and zend-framework. Difference appears to be that zendframework is for
#1.10 and zend-framework is 1.11 #1.10 and zend-framework is 1.11
if [ "$dist" = "Debian" ]; then if [ "$dist" = "Debian" ]; then
apt-get -y install zendframework apt-get -y --force-yes install zendframework
else else
apt-get -y install libzend-framework-php apt-get -y --force-yes install libzend-framework-php
fi fi
if [ "$code" = "lucid" ]; then if [ "$code" = "lucid" ]; then
apt-get -y install timeout apt-get -y --force-yes install timeout
else else
apt-get -y install coreutils apt-get -y --force-yes install coreutils
fi fi

View File

@ -38,7 +38,7 @@ fi
apt-get update apt-get update
# Updated package list # Updated package list
apt-get -y install tar gzip curl nginx php5-pgsql php5-fpm \ apt-get -y --force-yes install tar gzip curl nginx php5-pgsql php5-fpm \
php-pear php5-gd postgresql odbc-postgresql python libsoundtouch-ocaml \ php-pear php5-gd postgresql odbc-postgresql python libsoundtouch-ocaml \
libtaglib-ocaml libao-ocaml libmad-ocaml ecasound \ libtaglib-ocaml libao-ocaml libmad-ocaml ecasound \
libesd0 libportaudio2 libsamplerate0 rabbitmq-server patch \ libesd0 libportaudio2 libsamplerate0 rabbitmq-server patch \
@ -54,15 +54,15 @@ apt-get -y --force-yes install libmp3lame-dev lame icecast2
#Ubuntu Lucid has both zendframework and zend-framework. Difference appears to be that zendframework is for #Ubuntu Lucid has both zendframework and zend-framework. Difference appears to be that zendframework is for
#1.10 and zend-framework is 1.11 #1.10 and zend-framework is 1.11
if [ "$dist" = "Debian" ]; then if [ "$dist" = "Debian" ]; then
apt-get -y install zendframework apt-get -y install --force-yes zendframework
else else
apt-get -y install libzend-framework-php apt-get -y install --force-yes libzend-framework-php
fi fi
if [ "$code" = "lucid" ]; then if [ "$code" = "lucid" ]; then
apt-get -y install timeout apt-get -y install --force-yes timeout
else else
apt-get -y install coreutils apt-get -y install --force-yes coreutils
fi fi
# NGINX Config File # NGINX Config File

View File

@ -34,7 +34,7 @@ upload_recorded = 'upload-recorded/format/json/api_key/%%api_key%%/fileid/%%file
update_media_url = 'reload-metadata/format/json/api_key/%%api_key%%/mode/%%mode%%' update_media_url = 'reload-metadata/format/json/api_key/%%api_key%%/mode/%%mode%%'
# URL to tell Airtime we want a listing of all files it knows about # URL to tell Airtime we want a listing of all files it knows about
list_all_db_files = 'list-all-files/format/json/api_key/%%api_key%%/dir_id/%%dir_id%%' list_all_db_files = 'list-all-files/format/json/api_key/%%api_key%%/dir_id/%%dir_id%%/all/%%all%%'
# URL to tell Airtime we want a listing of all dirs its watching (including the stor dir) # URL to tell Airtime we want a listing of all dirs its watching (including the stor dir)
list_all_watched_dirs = 'list-all-watched-dirs/format/json/api_key/%%api_key%%' list_all_watched_dirs = 'list-all-watched-dirs/format/json/api_key/%%api_key%%'

View File

@ -474,11 +474,12 @@ class AirtimeApiClient():
#{"files":["path/to/file1", "path/to/file2"]} #{"files":["path/to/file1", "path/to/file2"]}
#Note that these are relative paths to the given directory. The full #Note that these are relative paths to the given directory. The full
#path is not returned. #path is not returned.
def list_all_db_files(self, dir_id): def list_all_db_files(self, dir_id, all_files=True):
logger = self.logger logger = self.logger
try: try:
url = self.construct_url("list_all_db_files") url = self.construct_url("list_all_db_files")
url = url.replace("%%dir_id%%", dir_id) url = url.replace("%%dir_id%%", dir_id)
url = url.replace("%%all%%", all_files)
response = self.get_response_from_server(url) response = self.get_response_from_server(url)
response = json.loads(response) response = json.loads(response)
except Exception, e: except Exception, e:
@ -488,7 +489,8 @@ class AirtimeApiClient():
try: try:
return response["files"] return response["files"]
except KeyError: except KeyError:
self.logger.error("Could not find index 'files' in dictionary: %s", str(response)) self.logger.error("Could not find index 'files' in dictionary: %s",
str(response))
return [] return []
def list_all_watched_dirs(self): def list_all_watched_dirs(self):

View File

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from kombu.messaging import Exchange, Queue, Consumer from kombu.messaging import Exchange, Queue, Consumer
from kombu.connection import BrokerConnection from kombu.connection import BrokerConnection
from os.path import normpath
import json import json
import os import os
@ -125,7 +126,10 @@ class AirtimeMessageReceiver(Loggable):
except Exception as e: except Exception as e:
self.fatal_exception("Failed to create watched dir '%s'" % self.fatal_exception("Failed to create watched dir '%s'" %
msg['directory'],e) msg['directory'],e)
else: self.new_watch(msg) else:
self.logger.info("Created new watch directory: '%s'" %
msg['directory'])
self.new_watch(msg)
else: else:
self.__request_now_bootstrap( directory=msg['directory'] ) self.__request_now_bootstrap( directory=msg['directory'] )
self.manager.add_watch_directory(msg['directory']) self.manager.add_watch_directory(msg['directory'])
@ -133,7 +137,7 @@ class AirtimeMessageReceiver(Loggable):
def remove_watch(self, msg): def remove_watch(self, msg):
self.logger.info("Removing watch from directory: '%s'" % self.logger.info("Removing watch from directory: '%s'" %
msg['directory']) msg['directory'])
self.manager.remove_watch_directory(msg['directory']) self.manager.remove_watch_directory(normpath(msg['directory']))
def rescan_watch(self, msg): def rescan_watch(self, msg):
self.logger.info("Trying to rescan watched directory: '%s'" % self.logger.info("Trying to rescan watched directory: '%s'" %

View File

@ -239,7 +239,7 @@ def normalized_metadata(md, original_path):
""" """
new_md = copy.deepcopy(md) new_md = copy.deepcopy(md)
# replace all slashes with dashes # replace all slashes with dashes
for k,v in new_md.iteritems(): new_md[k] = unicode(v).replace('/','-') #for k,v in new_md.iteritems(): new_md[k] = unicode(v).replace('/','-')
# Specific rules that are applied in a per attribute basis # Specific rules that are applied in a per attribute basis
format_rules = { format_rules = {
'MDATA_KEY_TRACKNUMBER' : parse_int, 'MDATA_KEY_TRACKNUMBER' : parse_int,

View File

@ -456,11 +456,6 @@ class PypoFetch(Thread):
for key in media: for key in media:
media_item = media[key] media_item = media[key]
"""
{u'end': u'2012-07-26-04-05-00', u'fade_out': 500, u'show_name': u'Untitled Show', u'uri': u'http://',
u'cue_in': 0, u'start': u'2012-07-26-04-00-00', u'replay_gain': u'0', u'row_id': 16, u'cue_out': 300, u'type':
u'stream', u'id': 1, u'fade_in': 500}
"""
if (media_item['type'] == 'file'): if (media_item['type'] == 'file'):
fileExt = os.path.splitext(media_item['uri'])[1] fileExt = os.path.splitext(media_item['uri'])[1]
dst = os.path.join(download_dir, unicode(media_item['id']) + fileExt) dst = os.path.join(download_dir, unicode(media_item['id']) + fileExt)