From 2cb17a3b08aeb157f5b234f04201c7d5149b08fd Mon Sep 17 00:00:00 2001 From: James Date: Tue, 24 Apr 2012 11:26:22 -0400 Subject: [PATCH 1/9] CC-3660: Cannot click Airtime Manual link on override info popup - replaced the popup with qtip --- .../forms/LiveStreamingPreferences.php | 4 +--- .../scripts/form/preferences_livestream.phtml | 10 ++------- airtime_mvc/public/css/styles.css | 11 ++++++++++ .../js/airtime/preferences/streamsetting.js | 22 +++++++++++++++++++ 4 files changed, 36 insertions(+), 11 deletions(-) diff --git a/airtime_mvc/application/forms/LiveStreamingPreferences.php b/airtime_mvc/application/forms/LiveStreamingPreferences.php index 9e89cae92..fe318d692 100644 --- a/airtime_mvc/application/forms/LiveStreamingPreferences.php +++ b/airtime_mvc/application/forms/LiveStreamingPreferences.php @@ -99,10 +99,8 @@ class Application_Form_LiveStreamingPreferences extends Zend_Form_SubForm $live_dj_connection_url = "N/A"; } - $overrideDescription = "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151. For more detail, please read the Airtime manual."; - $this->setDecorators(array( - array('ViewScript', array('viewScript' => 'form/preferences_livestream.phtml', 'master_dj_connection_url'=>$master_dj_connection_url, 'live_dj_connection_url'=>$live_dj_connection_url,'overrideDescription' => $overrideDescription)) + array('ViewScript', array('viewScript' => 'form/preferences_livestream.phtml', 'master_dj_connection_url'=>$master_dj_connection_url, 'live_dj_connection_url'=>$live_dj_connection_url)) )); } diff --git a/airtime_mvc/application/views/scripts/form/preferences_livestream.phtml b/airtime_mvc/application/views/scripts/form/preferences_livestream.phtml index 9e48cb6ff..8fbafee9f 100644 --- a/airtime_mvc/application/views/scripts/form/preferences_livestream.phtml +++ b/airtime_mvc/application/views/scripts/form/preferences_livestream.phtml @@ -77,10 +77,7 @@
master_dj_connection_url ?> override   - - - overrideDescription ?> - +
@@ -118,10 +115,7 @@
live_dj_connection_url ?> override   - - - overrideDescription?> - +
diff --git a/airtime_mvc/public/css/styles.css b/airtime_mvc/public/css/styles.css index d00131463..c58c3d3e4 100644 --- a/airtime_mvc/public/css/styles.css +++ b/airtime_mvc/public/css/styles.css @@ -93,6 +93,17 @@ select { } /* Version Notification Ends*/ +.override_help_icon { + cursor: help; + position: relative; + + display:inline-block; zoom:1; display:inline; + width:14px; height:14px; + background:url(/css/images/icon_info.png) 0 0 no-repeat; + float:right; position:relative; top:2px; right:7px; + line-height:16px !important; +} + /* Info Tooltip Starts */ .info-tooltip { cursor: help; diff --git a/airtime_mvc/public/js/airtime/preferences/streamsetting.js b/airtime_mvc/public/js/airtime/preferences/streamsetting.js index 3c05bd8e5..20cd2d943 100644 --- a/airtime_mvc/public/js/airtime/preferences/streamsetting.js +++ b/airtime_mvc/public/js/airtime/preferences/streamsetting.js @@ -235,4 +235,26 @@ $(document).ready(function() { showErrorSections() setInterval('checkLiquidsoapStatus()', 1000) + + // qtip for help text + $(".override_help_icon").qtip({ + content: { + text: "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151. For more detail, please read the Airtime manual." + }, + hide: { + delay: 500, + fixed: true + }, + style: { + border: { + width: 0, + radius: 4 + }, + classes: "ui-tooltip-dark ui-tooltip-rounded" + }, + position: { + my: "left bottom", + at: "right center" + }, + }) }); From 3c4d01aa9308224bd17616f91db8b4ad6e9bf783 Mon Sep 17 00:00:00 2001 From: James Date: Tue, 24 Apr 2012 12:59:07 -0400 Subject: [PATCH 2/9] CC-3675: Playlist -> the files from Disconnected Mediafolder can still be previewed (played) - done --- .../controllers/AudiopreviewController.php | 4 ++-- .../controllers/ScheduleController.php | 2 +- airtime_mvc/application/models/Playlist.php | 20 +++++++++++++------ .../airtime/audiopreview/preview_jplayer.js | 7 ++++++- 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/airtime_mvc/application/controllers/AudiopreviewController.php b/airtime_mvc/application/controllers/AudiopreviewController.php index 607d39dd8..efb14b7e4 100644 --- a/airtime_mvc/application/controllers/AudiopreviewController.php +++ b/airtime_mvc/application/controllers/AudiopreviewController.php @@ -98,7 +98,7 @@ class AudiopreviewController extends Zend_Controller_Action $pl = new Application_Model_Playlist($playlistID); $result = Array(); - foreach ( $pl->getContents() as $track ){ + foreach ( $pl->getContents(true) as $track ){ $elementMap = array( 'element_title' => isset($track['CcFiles']['track_title'])?$track['CcFiles']['track_title']:"", 'element_artist' => isset($track['CcFiles']['artist_name'])?$track['CcFiles']['artist_name']:"", @@ -115,7 +115,7 @@ class AudiopreviewController extends Zend_Controller_Action } $result[] = $elementMap; } - + $this->_helper->json($result); } diff --git a/airtime_mvc/application/controllers/ScheduleController.php b/airtime_mvc/application/controllers/ScheduleController.php index c71794a83..c5acd6ef3 100644 --- a/airtime_mvc/application/controllers/ScheduleController.php +++ b/airtime_mvc/application/controllers/ScheduleController.php @@ -373,7 +373,7 @@ class ScheduleController extends Zend_Controller_Action $this->view->switch_status = $switch_status; $this->view->entries = $range; - $this->view->show_name = $show[0]["name"]; + $this->view->show_name = isset($show[0])?$show[0]["name"]:""; } public function removeGroupAction() diff --git a/airtime_mvc/application/models/Playlist.php b/airtime_mvc/application/models/Playlist.php index bc48bb2d0..63d33409a 100644 --- a/airtime_mvc/application/models/Playlist.php +++ b/airtime_mvc/application/models/Playlist.php @@ -140,18 +140,26 @@ class Application_Model_Playlist { /** * Get the entire playlist as a two dimentional array, sorted in order of play. + * @param boolean $filterFiles if this is true, it will only return files that has + * file_exists flag set to true * @return array */ - public function getContents() { + public function getContents($filterFiles=false) { Logging::log("Getting contents for playlist {$this->id}"); $files = array(); - $rows = CcPlaylistcontentsQuery::create() - ->joinWith('CcFiles') - ->orderByDbPosition() - ->filterByDbPlaylistId($this->id) - ->find($this->con); + $query = CcPlaylistcontentsQuery::create() + ->filterByDbPlaylistId($this->id); + + if($filterFiles){ + $query->useCcFilesQuery() + ->filterByDbFileExists(true) + ->endUse(); + } + $query->orderByDbPosition() + ->leftJoinWith('CcFiles'); + $rows = $query->find($this->con); $i = 0; $offset = 0; diff --git a/airtime_mvc/public/js/airtime/audiopreview/preview_jplayer.js b/airtime_mvc/public/js/airtime/audiopreview/preview_jplayer.js index 6d4975f25..cfcbe2c86 100644 --- a/airtime_mvc/public/js/airtime/audiopreview/preview_jplayer.js +++ b/airtime_mvc/public/js/airtime/audiopreview/preview_jplayer.js @@ -114,7 +114,9 @@ function buildplaylist(p_url, p_playIndex) { } myPlaylist[index] = media; - _idToPostionLookUp[data[index]['element_id']] = data[index]['element_position']; + // we should create a map according to the new position in the player itself + // total is the index on the player + _idToPostionLookUp[data[index]['element_id']] = total; total++; } @@ -135,6 +137,9 @@ function buildplaylist(p_url, p_playIndex) { */ function play(p_playlistIndex){ playlistIndex = _idToPostionLookUp[p_playlistIndex]; + if(playlistIndex == undefined){ + playlistIndex = 0 + } //_playlist_jplayer.select(playlistIndex); _playlist_jplayer.play(playlistIndex); } From 5be12c0a938c487c9895c4f35fe2b673542d3ee4 Mon Sep 17 00:00:00 2001 From: James Date: Tue, 24 Apr 2012 15:57:43 -0400 Subject: [PATCH 3/9] CC-3695: Non-admin user cannot preview the contents - guest doesn't have access to playlist builder, hence allowing DJ, PM and admin to access the preview. --- airtime_mvc/application/configs/ACL.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/airtime_mvc/application/configs/ACL.php b/airtime_mvc/application/configs/ACL.php index f2f685a02..91167dd93 100644 --- a/airtime_mvc/application/configs/ACL.php +++ b/airtime_mvc/application/configs/ACL.php @@ -37,12 +37,13 @@ $ccAcl->allow('G', 'index') ->allow('H', 'usersettings') ->allow('H', 'plupload') ->allow('H', 'library') - ->allow('H', 'playlist') - ->allow('A', 'playouthistory') - ->allow('A', 'user') - ->allow('A', 'systemstatus') - ->allow('A', 'preference') - ->allow('A', 'audiopreview'); + ->allow('H', 'playlist') + ->allow('H', 'audiopreview') + ->allow('A', 'playouthistory') + ->allow('A', 'user') + ->allow('A', 'systemstatus') + ->allow('A', 'preference'); + $aclPlugin = new Zend_Controller_Plugin_Acl($ccAcl); From 6e755b000b859baf178146dbad17098e3acd5d38 Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Tue, 24 Apr 2012 16:15:22 -0400 Subject: [PATCH 4/9] CC-3707: copy files to stor, extra forwardslash -fixed --- airtime_mvc/application/common/OsPath.php | 21 +++++++++++++++++++ airtime_mvc/application/models/StoredFile.php | 3 +-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/airtime_mvc/application/common/OsPath.php b/airtime_mvc/application/common/OsPath.php index 47161301d..957545dc4 100644 --- a/airtime_mvc/application/common/OsPath.php +++ b/airtime_mvc/application/common/OsPath.php @@ -42,4 +42,25 @@ class Application_Common_OsPath{ else return '.'; } + + /* Similar to the os.path.join python method + * http://stackoverflow.com/a/1782990/276949 */ + function join() { + $args = func_get_args(); + $paths = array(); + + foreach($args as $arg) { + $paths = array_merge($paths, (array)$arg); + } + + foreach($paths as &$path) { + $path = trim($path, DIRECTORY_SEPARATOR); + } + + if (substr($args[0], 0, 1) == DIRECTORY_SEPARATOR) { + $paths[0] = DIRECTORY_SEPARATOR . $paths[0]; + } + + return join(DIRECTORY_SEPARATOR, $paths); + } } diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index 06e788095..fcac1a8db 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -841,8 +841,7 @@ Logging::log("getting media! - 2"); //check to see if there is enough space in $stor to continue. $enough_space = Application_Model_StoredFile::checkForEnoughDiskSpaceToCopy($stor, $audio_file); if ($enough_space){ - $stor .= "/organize"; - $audio_stor = $stor . DIRECTORY_SEPARATOR . $fileName; + $audio_stor = Application_Common_OsPath::join($stor, "organize", $fileName); Logging::log("copyFileToStor: moving file $audio_file to $audio_stor"); //Martin K.: changed to rename: Much less load + quicker since this is an atomic operation From ec8115828ae0214a949d9271a8a2c3e37e4a5b12 Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Tue, 24 Apr 2012 16:24:54 -0400 Subject: [PATCH 5/9] CC-3673: media monitor encoding problem -made media-monitor not start if non UTF-8 encoding detected. --- python_apps/media-monitor/MediaMonitor.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/python_apps/media-monitor/MediaMonitor.py b/python_apps/media-monitor/MediaMonitor.py index 3fa9fe912..bcf9a0a3b 100644 --- a/python_apps/media-monitor/MediaMonitor.py +++ b/python_apps/media-monitor/MediaMonitor.py @@ -5,6 +5,7 @@ import sys import os import signal import traceback +import locale from api_clients import api_client as apc from std_err_override import LogWriter @@ -38,7 +39,16 @@ except Exception, e: logger.info("\n\n*** Media Monitor bootup ***\n\n") + try: + fs_encoding = locale.getdefaultlocale()[1].lower() + if fs_encoding not in ['utf-8', 'utf8']: + logger.error("Filesystem encoding needs to be UTF-8. Currently '%s'. Exiting..." % fs_encoding) + sys.exit(1) + else: + logger.debug("Filesystem encoding: '%s'" % fs_encoding) + + config = AirtimeMediaConfig(logger) api_client = apc.api_client_factory(config.cfg) api_client.register_component("media-monitor") From dd72090c3f0bba1b21562bd8373051e68f2b7ef1 Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Tue, 24 Apr 2012 16:46:51 -0400 Subject: [PATCH 6/9] CC-3711: Verify Propel hasn't broken anything with its different handling of boolean columns compared to Pear. -fixed in ShowBuilder controller --- airtime_mvc/application/models/ShowBuilder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/application/models/ShowBuilder.php b/airtime_mvc/application/models/ShowBuilder.php index 25ff01933..7ca926e15 100644 --- a/airtime_mvc/application/models/ShowBuilder.php +++ b/airtime_mvc/application/models/ShowBuilder.php @@ -224,7 +224,7 @@ class Application_Model_ShowBuilder { $this->getScheduledStatus($startsEpoch, min($endsEpoch, $showEndEpoch), $row); $row["id"] = intval($p_item["sched_id"]); - $row["image"] = $p_item["file_exists"] == "t" ? true : false; + $row["image"] = $p_item["file_exists"]; $row["instance"] = intval($p_item["si_id"]); $row["starts"] = $schedStartDT->format("H:i:s"); $row["ends"] = $schedEndDT->format("H:i:s"); From 957b750d6ae46c7676d3b3a03927d65dfb92b198 Mon Sep 17 00:00:00 2001 From: James Date: Tue, 24 Apr 2012 16:49:14 -0400 Subject: [PATCH 7/9] CC-3711: Verify Propel hasn't broken anything with its different handling of boolean columns compared to Pear - fixed --- airtime_mvc/public/js/airtime/dashboard/playlist.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/airtime_mvc/public/js/airtime/dashboard/playlist.js b/airtime_mvc/public/js/airtime/dashboard/playlist.js index 077d9b780..c3b796da8 100644 --- a/airtime_mvc/public/js/airtime/dashboard/playlist.js +++ b/airtime_mvc/public/js/airtime/dashboard/playlist.js @@ -85,8 +85,8 @@ function updateProgressBarValue(){ if (songPercentDone < 0 || songPercentDone > 100){ songPercentDone = 0; currentSong = null; - } else { - if (currentSong.media_item_played == "t" && currentShow.length > 0){ + } else { + if (currentSong.media_item_played == true && currentShow.length > 0){ scheduled_play_line_to_switch.attr("class", "line-to-switch on"); scheduled_play_div.addClass("ready") scheduled_play_source = true; From 3bc919affbf3a6df94a10e32c37b2f469702a725 Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Tue, 24 Apr 2012 17:52:07 -0400 Subject: [PATCH 8/9] CC-3696: more rebroadcast show instances will be created after change the calendar -fixed --- airtime_mvc/application/models/Show.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/airtime_mvc/application/models/Show.php b/airtime_mvc/application/models/Show.php index 85107dfad..67914093f 100644 --- a/airtime_mvc/application/models/Show.php +++ b/airtime_mvc/application/models/Show.php @@ -856,8 +856,8 @@ class Application_Model_Show { ." WHERE date(starts) = date(TIMESTAMP '$timestamp') " ." AND show_id = $showId"; - $query = $con->query(); - $row = $query ? $query->fetchColumn(0) : null; + $query = $con->query($sql); + $row = ($query !== false) ? $query->fetchColumn(0) : null; return CcShowInstancesQuery::create() ->findPk($row); } From 63a5f45e9bca12402fb1795262d5a7c72f8be459 Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Tue, 24 Apr 2012 18:22:39 -0400 Subject: [PATCH 9/9] CC-3690: Able to create repeat show in the past, by editing an already ON AIR show -fixed --- .../controllers/ScheduleController.php | 5 +-- airtime_mvc/application/models/Show.php | 40 ++++++++----------- 2 files changed, 19 insertions(+), 26 deletions(-) diff --git a/airtime_mvc/application/controllers/ScheduleController.php b/airtime_mvc/application/controllers/ScheduleController.php index c5acd6ef3..bdcc4e2b7 100644 --- a/airtime_mvc/application/controllers/ScheduleController.php +++ b/airtime_mvc/application/controllers/ScheduleController.php @@ -752,12 +752,11 @@ class ScheduleController extends Zend_Controller_Action //Changing the start date was disabled, since the //array key does not exist. We need to repopulate this entry from the db. //The start date will be returned in UTC time, so lets convert it to local time. - $dt = Application_Common_DateHelper::ConvertToLocalDateTime($show->getStartDate()); + $dt = Application_Common_DateHelper::ConvertToLocalDateTime($show->getStartDateAndTime()); $data['add_show_start_date'] = $dt->format("Y-m-d"); if (!array_key_exists('add_show_start_time', $data)){ - $startTime = Application_Common_DateHelper::ConvertToLocalDateTime($show->getStartTime()); - $data['add_show_start_time'] = $startTime->format("H:i"); + $data['add_show_start_time'] = $dt->format("H:i"); $validateStartTime = false; } $validateStartDate = false; diff --git a/airtime_mvc/application/models/Show.php b/airtime_mvc/application/models/Show.php index 67914093f..3675879b6 100644 --- a/airtime_mvc/application/models/Show.php +++ b/airtime_mvc/application/models/Show.php @@ -557,15 +557,15 @@ class Application_Model_Show { $con->exec($sql); } - + /** * Get the start date of the current show in UTC timezone. * * @return string * The start date in the format YYYY-MM-DD */ - public function getStartDate(){ - $con = Propel::getConnection(); + public function getStartDateAndTime(){ + $con = Propel::getConnection(); $showId = $this->getId(); $sql = "SELECT first_show, start_time, timezone FROM cc_show_days" @@ -583,10 +583,21 @@ class Application_Model_Show { $dt = new DateTime($row["first_show"]." ".$row["start_time"], new DateTimeZone($row["timezone"])); $dt->setTimezone(new DateTimeZone("UTC")); - return $dt->format("Y-m-d"); + return $dt->format("Y-m-d H:i"); } } + /** + * Get the start date of the current show in UTC timezone. + * + * @return string + * The start date in the format YYYY-MM-DD + */ + public function getStartDate(){ + list($date,) = explode(" ", $this->getStartDateAndTime()); + return $date; + } + /** * Get the start time of the current show in UTC timezone. * @@ -595,25 +606,8 @@ class Application_Model_Show { */ public function getStartTime(){ - $con = Propel::getConnection(); - - $showId = $this->getId(); - $sql = "SELECT first_show, start_time, timezone FROM cc_show_days" - ." WHERE show_id = $showId" - ." ORDER BY first_show" - ." LIMIT 1"; - - $query = $con->query($sql); - - if ($query->rowCount() == 0){ - return ""; - } else { - $rows = $query->fetchAll(); - $row = $rows[0]; - $dt = new DateTime($row["first_show"]." ".$row["start_time"], new DateTimeZone($row["timezone"])); - $dt->setTimezone(new DateTimeZone("UTC")); - return $dt->format("H:i"); - } + list(,$time) = explode(" ", $this->getStartDateAndTime()); + return $time; } /**