From 259a3eb79204620505c6c21a9ca3602273eb9020 Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Mon, 10 Sep 2012 14:51:29 -0400 Subject: [PATCH 1/6] cc-4359: normpath'd music dir before passing it to manager.py to remove watch --- python_apps/media-monitor2/media/monitor/airtime.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python_apps/media-monitor2/media/monitor/airtime.py b/python_apps/media-monitor2/media/monitor/airtime.py index eba1f76e4..208556f71 100644 --- a/python_apps/media-monitor2/media/monitor/airtime.py +++ b/python_apps/media-monitor2/media/monitor/airtime.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from kombu.messaging import Exchange, Queue, Consumer from kombu.connection import BrokerConnection +from os.path import normpath import json import os @@ -133,7 +134,7 @@ class AirtimeMessageReceiver(Loggable): def remove_watch(self, msg): self.logger.info("Removing watch from directory: '%s'" % msg['directory']) - self.manager.remove_watch_directory(msg['directory']) + self.manager.remove_watch_directory(normpath(msg['directory'])) def rescan_watch(self, msg): self.logger.info("Trying to rescan watched directory: '%s'" % From 987b65af28970d6cf39c4fd85d9c1ae729a46612 Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Mon, 10 Sep 2012 14:53:26 -0400 Subject: [PATCH 2/6] cc-4347: Extra pdo work --- airtime_mvc/application/models/MusicDir.php | 29 +++++++++++++++------ 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/airtime_mvc/application/models/MusicDir.php b/airtime_mvc/application/models/MusicDir.php index f8e950821..373ad35f1 100644 --- a/airtime_mvc/application/models/MusicDir.php +++ b/airtime_mvc/application/models/MusicDir.php @@ -79,16 +79,29 @@ class Application_Model_MusicDir $music_dir_id = $this->getId(); - $sql = "SELECT DISTINCT s.instance_id from cc_music_dirs as md " - ." LEFT JOIN cc_files as f on f.directory = md.id" - ." RIGHT JOIN cc_schedule as s on s.file_id = f.id WHERE md.id = $music_dir_id"; - - $show_instances = $con->query($sql)->fetchAll(); + $sql = << $music_dir_id ), 'all' ); // 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 " - ." LEFT JOIN cc_files as f on f.directory = md.id WHERE md.id = $music_dir_id)"; - $affected = $con->exec($sql); + $sql = << $music_dir_id ), 'all'); // set RemovedFlag to true if ($userAddedWatchedDir) { From 2e0b29b14e29e1f5c176ae8fbc3cc0a09c27fe3f Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Mon, 10 Sep 2012 15:31:56 -0400 Subject: [PATCH 3/6] Removed unused code --- airtime_mvc/application/models/Schedule.php | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/airtime_mvc/application/models/Schedule.php b/airtime_mvc/application/models/Schedule.php index f97b21325..925dcd54b 100644 --- a/airtime_mvc/application/models/Schedule.php +++ b/airtime_mvc/application/models/Schedule.php @@ -1122,12 +1122,6 @@ SQL; */ //$se = $show_end->format('Y-m-d H:i:s'); 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']} where (ends <= :show_end1 or starts <= :show_end2) @@ -1141,13 +1135,6 @@ SQL; ':instanceId' => $instanceId )); } 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 {$CC_CONFIG['showInstances']} where (ends <= :show_end1 or starts <= :show_end2) From 9d825a55b3bb017a027694212b33fa226d0e946a Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Mon, 10 Sep 2012 15:32:31 -0400 Subject: [PATCH 4/6] Crap comment removed --- airtime_mvc/application/models/Schedule.php | 1 - 1 file changed, 1 deletion(-) diff --git a/airtime_mvc/application/models/Schedule.php b/airtime_mvc/application/models/Schedule.php index 925dcd54b..76c0ad6af 100644 --- a/airtime_mvc/application/models/Schedule.php +++ b/airtime_mvc/application/models/Schedule.php @@ -1147,7 +1147,6 @@ SQL; ':show_end3' => $show_end->format('Y-m-d H:i:s') )); } - //$rows = $con->query($sql); $rows = $stmt->fetchAll(); foreach ($rows as $row) { From 0c1c4aa27d85d605b6ca2e6207a59484974da943 Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Mon, 10 Sep 2012 15:35:30 -0400 Subject: [PATCH 5/6] Put sql in heredoc for better readability --- airtime_mvc/application/models/Schedule.php | 27 +++++++++++---------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/airtime_mvc/application/models/Schedule.php b/airtime_mvc/application/models/Schedule.php index 76c0ad6af..5abf081ac 100644 --- a/airtime_mvc/application/models/Schedule.php +++ b/airtime_mvc/application/models/Schedule.php @@ -172,20 +172,21 @@ class Application_Model_Schedule public static function GetLastScheduleItem($p_timeNow) { global $CC_CONFIG; - $sql = "SELECT" - ." ft.artist_name, ft.track_title," - ." st.starts as starts, st.ends as ends" - ." FROM $CC_CONFIG[scheduleTable] st" - ." LEFT JOIN $CC_CONFIG[filesTable] ft" - ." ON st.file_id = ft.id" - ." LEFT JOIN $CC_CONFIG[showInstances] sit" - ." ON st.instance_id = sit.id" - ." WHERE st.ends < TIMESTAMP :timeNow" - ." AND st.starts >= sit.starts" //this and the next line are necessary since we can overbook shows. - ." AND st.starts < sit.ends" - ." ORDER BY st.ends DESC" - ." LIMIT 1"; + $sql = <<= 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)); return $row; From 3107286799f667c010318728b553791b9a788247 Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Mon, 10 Sep 2012 15:35:32 -0400 Subject: [PATCH 6/6] CC-4370: Transitioning between two webstreams a hiccup in the stream is audible --- airtime_mvc/application/models/Schedule.php | 119 ++++++++++---------- python_apps/pypo/pypofetch.py | 5 - 2 files changed, 57 insertions(+), 67 deletions(-) diff --git a/airtime_mvc/application/models/Schedule.php b/airtime_mvc/application/models/Schedule.php index f97b21325..3bc7064ff 100644 --- a/airtime_mvc/application/models/Schedule.php +++ b/airtime_mvc/application/models/Schedule.php @@ -527,14 +527,17 @@ SQL; //." st.type AS type," ." si.starts AS show_start," ." si.ends AS show_end," + ." s.name AS show_name," ." f.id AS file_id," ." f.replay_gain AS replay_gain," ." ws.id as stream_id," ." ws.url as url" - ." FROM $CC_CONFIG[scheduleTable] AS st" - ." LEFT JOIN $CC_CONFIG[showInstances] AS si" + ." FROM cc_schedule AS st" + ." LEFT JOIN cc_show_instances AS si" ." 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" ." LEFT JOIN cc_webstream AS ws" ." ON st.stream_id = ws.id"; @@ -547,11 +550,10 @@ SQL; $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) { - 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->add(new DateInterval("PT24H")); $range_end = $dt->format("Y-m-d H:i:s"); @@ -564,12 +566,31 @@ SQL; ." LIMIT 3"; $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; } + /** + * 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) { $utcTimeZone = new DateTimeZone("UTC"); @@ -601,7 +622,7 @@ SQL; } } - private static function createFileScheduleEvent(&$data, $item, $media_id) + private static function createFileScheduleEvent(&$data, $item, $media_id, $uri) { $start = self::AirtimeTimeToPypoTime($item["start"]); $end = self::AirtimeTimeToPypoTime($item["end"]); @@ -617,14 +638,14 @@ SQL; 'cue_out' => Application_Common_DateHelper::CalculateLengthInSeconds($item["cue_out"]), 'start' => $start, 'end' => $end, - 'show_name' => $showName, + 'show_name' => $item["show_name"], 'replay_gain' => is_null($item["replay_gain"]) ? "0": $item["replay_gain"], '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"]); $end = self::AirtimeTimeToPypoTime($item["end"]); @@ -644,8 +665,8 @@ SQL; 'independent_event' => true ); - //TODO: Make sure no other media is being overwritten! - $data["media"][$stream_buffer_start] = $schedule_item; + self::appendScheduleItem($data, $start, $schedule_item); + $schedule_item = array( 'id' => $media_id, 'type' => 'stream_output_start', @@ -653,21 +674,16 @@ SQL; 'uri' => $uri, 'start' => $start, 'end' => $end, - 'show_name' => $showName, + 'show_name' => $item["show_name"], '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" //time of this event is the "end" time of the stream minus 1 second. $dt = new DateTime($item["end"], new DateTimeZone('UTC')); $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")); $schedule_item = array( @@ -677,8 +693,7 @@ SQL; 'type' => 'stream_buffer_end', 'independent_event' => true ); - $data["media"][$stream_end] = $schedule_item; - + self::appendScheduleItem($data, $stream_end, $schedule_item); $schedule_item = array( 'start' => $stream_end, @@ -687,7 +702,7 @@ SQL; 'type' => 'stream_output_end', 'independent_event' => true ); - $data["media"][$stream_end] = $schedule_item; + self::appendScheduleItem($data, $stream_end, $schedule_item); } private static function getRangeStartAndEnd($p_fromDateTime, $p_toDateTime) @@ -723,28 +738,14 @@ SQL; 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"); - - $data["status"] = array(); - $data["media"] = array(); - - self::createInputHarborKickTimes($data, $range_start, $range_end); - $items = self::getItems($range_start, $range_end); 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); + $trackStartDateTime = new DateTime($item["start"], $utcTimeZone); $trackEndDateTime = new DateTime($item["end"], $utcTimeZone); @@ -773,29 +774,21 @@ SQL; 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; } - /* - 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() { global $CC_CONFIG; @@ -896,10 +889,12 @@ SQL; $when = $formWhen->isValid($data); 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')); - $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')); $ccShowInstance = CcShowInstancesQuery::create()->findPK($data["add_show_instance_id"]); diff --git a/python_apps/pypo/pypofetch.py b/python_apps/pypo/pypofetch.py index 3f7cceb6e..9cd069b44 100644 --- a/python_apps/pypo/pypofetch.py +++ b/python_apps/pypo/pypofetch.py @@ -456,11 +456,6 @@ class PypoFetch(Thread): for key in media: 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'): fileExt = os.path.splitext(media_item['uri'])[1] dst = os.path.join(download_dir, unicode(media_item['id']) + fileExt)