From 161fa80d6487683ee3cb07ec845511d5a169cbb8 Mon Sep 17 00:00:00 2001 From: Yuchen Wang Date: Wed, 23 Nov 2011 12:00:54 -0500 Subject: [PATCH 1/4] CC-3091: Widget "Today's Program" doesn't show any content It's not showing anything because I thought it's not suppose to display the currently playing show. Fixed by retrieving the currently playing show along with next shows, and display them. todayInfoAction is no longer needed since liveInfoAction does the same thing. --- .../application/controllers/ApiController.php | 26 ------------------- widgets/js/jquery.showinfo.js | 6 +++-- 2 files changed, 4 insertions(+), 28 deletions(-) diff --git a/airtime_mvc/application/controllers/ApiController.php b/airtime_mvc/application/controllers/ApiController.php index 590edb35e..2d42aff47 100644 --- a/airtime_mvc/application/controllers/ApiController.php +++ b/airtime_mvc/application/controllers/ApiController.php @@ -202,32 +202,6 @@ class ApiController extends Zend_Controller_Action exit; } } - - public function todayInfoAction() - { - if (Application_Model_Preference::GetAllow3rdPartyApi()){ - // disable the view and the layout - $this->view->layout()->disableLayout(); - $this->_helper->viewRenderer->setNoRender(true); - - $date = new Application_Model_DateHelper; - $utcTimeNow = $date->getUtcTimestamp(); - $utctimeEnd = Application_Model_DateHelper::GetDayEndTimestampInUtc(); - - $result = array("env"=>APPLICATION_ENV, - "schedulerTime"=>gmdate("Y-m-d H:i:s"), - "nextShow"=>Application_Model_Show::GetNextShows($utcTimeNow, 5, $utcTimeEnd)); - - Application_Model_Show::ConvertToLocalTimeZone($result["nextShow"], array("starts", "ends", "start_timestamp", "end_timestamp")); - - header("Content-type: text/javascript"); - echo $_GET['callback'].'('.json_encode($result).')'; - } else { - header('HTTP/1.0 401 Unauthorized'); - print 'You are not allowed to access this resource. '; - exit; - } - } public function weekInfoAction() { diff --git a/widgets/js/jquery.showinfo.js b/widgets/js/jquery.showinfo.js index b57f8d7c4..1c75b7918 100644 --- a/widgets/js/jquery.showinfo.js +++ b/widgets/js/jquery.showinfo.js @@ -16,7 +16,9 @@ getServerData(); function updateWidget(){ - var shows = sd.getNextShows(); + var currentShow = sd.getCurrentShow(); + var nextShows = sd.getNextShows(); + var shows = currentShow.length == 0 ? nextShows : currentShow.concat(nextShows); tableString = ""; tableString += "

" + options.text.onAirToday + "

"; @@ -50,7 +52,7 @@ } function getServerData(){ - $.ajax({ url: options.sourceDomain + "api/today-info/", dataType:"jsonp", success:function(data){ + $.ajax({ url: options.sourceDomain + "api/live-info/", dataType:"jsonp", success:function(data){ processData(data); }, error:airtimeScheduleJsonpError}); setTimeout(getServerData, options.updatePeriod*1000); From 65fb00ad8d5f9863a3f051f8cc3899661353b4cd Mon Sep 17 00:00:00 2001 From: Naomi Aro Date: Wed, 23 Nov 2011 18:47:44 +0100 Subject: [PATCH 2/4] CC-3083 Must convert to UTC start/end times using the timezone start/end times --- airtime_mvc/application/models/Show.php | 141 ++++++++++++++---------- 1 file changed, 83 insertions(+), 58 deletions(-) diff --git a/airtime_mvc/application/models/Show.php b/airtime_mvc/application/models/Show.php index 2d07001ed..d8ce40c68 100644 --- a/airtime_mvc/application/models/Show.php +++ b/airtime_mvc/application/models/Show.php @@ -468,13 +468,13 @@ class Application_Model_Show { return ""; } else { $row = $rows[0]; - + $dt = new DateTime($row["first_show"]." ".$row["start_time"], new DateTimeZone($row["timezone"])); $dt->setTimezone(new DateTimeZone("UTC")); return $dt->format("Y-m-d"); } } - + /** * Get the start time of the current show in UTC timezone. * @@ -673,34 +673,34 @@ class Application_Model_Show { return $days; } - /* Only used for shows that aren't repeating. - * + /* Only used for shows that aren't repeating. + * * @return Boolean: true if show has an instance, otherwise false. */ public function hasInstance(){ return (!is_null($this->getInstance())); } - /* Only used for shows that aren't repeating. - * - * @return CcShowInstancesQuery: An propel object representing a + /* Only used for shows that aren't repeating. + * + * @return CcShowInstancesQuery: An propel object representing a * row in the cc_show_instances table. */ public function getInstance(){ $showInstance = CcShowInstancesQuery::create() ->filterByDbShowId($this->getId()) ->findOne(); - + return $showInstance; } /* Only used for shows that are repeating. Note that this will return - * true even for dates that only have a "modified" show instance (does not + * true even for dates that only have a "modified" show instance (does not * check if the "modified_instance" column is set to true). This is intended - * behaviour. - * - * @param $p_dateTime: Date for which we are checking if instance + * behaviour. + * + * @param $p_dateTime: Date for which we are checking if instance * exists. - * - * @return Boolean: true if show has an instance on $p_dateTime, + * + * @return Boolean: true if show has an instance on $p_dateTime, * otherwise false. */ public function hasInstanceOnDate($p_dateTime){ return (!is_null($this->getInstanceOnDate($p_dateTime))); @@ -710,10 +710,10 @@ class Application_Model_Show { /* Only used for shows that are repeating. Note that this will return * shows that have been "modified" (does not check if the "modified_instance" * column is set to true). This is intended behaviour. - * + * * @param $p_dateTime: Date for which we are getting an instance. - * - * @return CcShowInstancesQuery: An propel object representing a + * + * @return CcShowInstancesQuery: An propel object representing a * row in the cc_show_instances table. */ public function getInstanceOnDate($p_dateTime){ global $CC_DBC; @@ -1071,16 +1071,13 @@ class Application_Model_Show { $timezone = $p_showRow["timezone"]; $start = $first_show." ".$start_time; - $utcStartDateTime = Application_Model_DateHelper::ConvertToUtcDateTime($start, $timezone); + + //start & end UTC DateTimes for the show. + list($utcStartDateTime, $utcEndDateTime) = Application_Model_Show::createUTCStartEndDateTime($start, $duration, $timezone); if ($utcStartDateTime->getTimestamp() < $p_dateTime->getTimestamp()) { - $utcStart = $utcStartDateTime->format("Y-m-d H:i:s"); - $sql = "SELECT timestamp '{$utcStart}' + interval '{$duration}'"; - $utcEndDateTime = new DateTime($CC_DBC->GetOne($sql), new DateTimeZone("UTC")); - - $date = new Application_Model_DateHelper(); - $currentUtcTimestamp = $date->getUtcTimestamp(); + $currentUtcTimestamp = gmdate("Y-m-d H:i:s"); $show = new Application_Model_Show($show_id); if ($show->hasInstance()){ @@ -1141,8 +1138,7 @@ class Application_Model_Show { $record = $p_showRow["record"]; $timezone = $p_showRow["timezone"]; - $date = new Application_Model_DateHelper(); - $currentUtcTimestamp = $date->getUtcTimestamp(); + $currentUtcTimestamp = gmdate("Y-m-d H:i:s"); if(isset($next_pop_date)) { $start = $next_pop_date." ".$start_time; @@ -1162,9 +1158,7 @@ class Application_Model_Show { while($utcStartDateTime->getTimestamp() <= $p_dateTime->getTimestamp() && (is_null($utcLastShowDateTime) || $utcStartDateTime->getTimestamp() < $utcLastShowDateTime->getTimestamp())){ - $utcStart = $utcStartDateTime->format("Y-m-d H:i:s"); - $sql = "SELECT timestamp '{$utcStart}' + interval '{$duration}'"; - $utcEndDateTime = new DateTime($CC_DBC->GetOne($sql), new DateTimeZone("UTC")); + list($utcStartDateTime, $utcEndDateTime) = Application_Model_Show::createUTCStartEndDateTime($start, $duration, $timezone); if ($show->hasInstanceOnDate($utcStartDateTime)){ $ccShowInstance = $show->getInstanceOnDate($utcStartDateTime); @@ -1209,49 +1203,80 @@ class Application_Model_Show { Application_Model_Show::setNextPop($start, $show_id, $day); } + /* + * @param $p_start + * timestring format "Y-m-d H:i:s" (not UTC) + * @param $p_duration + * string time interval (h)h:(m)m(:ss) + * @param $p_timezone + * string "Europe/Prague" + * @param $p_offset + * array (days, hours, mins) used for rebroadcast shows. + * + * @return + * array of 2 DateTime objects, start/end time of the show in UTC. + */ + private static function createUTCStartEndDateTime($p_start, $p_duration, $p_timezone=null, $p_offset=null) + { + $timezone = $p_timezone ? $p_timezone : date_default_timezone_get(); + + $startDateTime = new DateTime($p_start, new DateTimeZone($timezone)); + if (isset($p_offset)) { + $startDateTime->add(new DateInterval("P{$p_offset["days"]}DT{$p_offset["hours"]}H{$p_offset["mins"]}M")); + } + + $endDateTime = new DateTime($startDateTime->format("Y-m-d H:i:s"), new DateTimeZone($timezone)); + $duration = explode(":", $p_duration); + list($hours, $mins) = array_slice($duration, 0, 2); + $endDateTime->add(new DateInterval("PT{$hours}H{$mins}M")); + + //convert times to UTC + $startDateTime->setTimezone(new DateTimeZone('UTC')); + $endDateTime->setTimezone(new DateTimeZone('UTC')); + + return array($startDateTime, $endDateTime); + } + /* Create rebroadcast instances for a created show marked for recording * - * @param $p_rebroadcasts rows gotten from the db table cc_show_rebroadcasts, tells airtime when to schedule the rebroadcasts. - * @param $p_currentUtcTimestamp a timestring in format "Y-m-d H:i:s", current UTC time. - * @param $p_showId int of the show it belongs to (from cc_show) - * @param $p_showInstanceId the instance id of the created recorded show instance + * @param $p_rebroadcasts + * rows gotten from the db table cc_show_rebroadcasts, tells airtime when to schedule the rebroadcasts. + * @param $p_currentUtcTimestamp + * a timestring in format "Y-m-d H:i:s", current UTC time. + * @param $p_showId + * int of the show it belongs to (from cc_show) + * @param $p_showInstanceId + * the instance id of the created recorded show instance * (from cc_show_instances), used to associate rebroadcasts to this show. - * @param $p_startTime a timestring in format "Y-m-d H:i:s" in the timezone, not UTC of the rebroadcasts' parent recorded show. - * @param $p_duration duration of the show in format 1:0 - * @param $p_timezone string of user's timezone "Europe/Prague" + * @param $p_startTime + * a timestring in format "Y-m-d H:i:s" in the timezone, not UTC of the rebroadcasts' parent recorded show. + * @param $p_duration + * string time interval (h)h:(m)m:(ss) length of the show. + * @param $p_timezone + * string of user's timezone "Europe/Prague" * */ private static function createRebroadcastInstances($p_rebroadcasts, $p_currentUtcTimestamp, $p_showId, $p_showInstanceId, $p_startTime, $p_duration, $p_timezone=null){ - global $CC_DBC; - Logging::log('Count of rebroadcasts '. count($p_rebroadcasts)); + //Y-m-d + //use only the date part of the show start time stamp for the offsets to work properly. + $date = explode(" ", $p_startTime); + $start_date = $date[0]; foreach($p_rebroadcasts as $rebroadcast) { - //use only the date part of the show start time stamp for the offsets to work properly. - $sql = "SELECT date '{$p_startTime}' + interval '{$rebroadcast["day_offset"]}' + interval '{$rebroadcast["start_time"]}'"; - $rebroadcast_start_time = $CC_DBC->GetOne($sql); - Logging::log('rebroadcast start '.$rebroadcast_start_time); + $days = explode(" ", $rebroadcast["day_offset"]); + $time = explode(":", $rebroadcast["start_time"]); + $offset = array("days"=>$days[0], "hours"=>$time[0], "mins"=>$time[1]); - $sql = "SELECT timestamp '{$rebroadcast_start_time}' + interval '{$p_duration}'"; - $rebroadcast_end_time = $CC_DBC->GetOne($sql); - Logging::log('rebroadcast end '.$rebroadcast_end_time); + list($utcStartDateTime, $utcEndDateTime) = Application_Model_Show::createUTCStartEndDateTime($start_date, $p_duration, $p_timezone, $offset); - //convert to UTC, after we have used the defined offsets to calculate rebroadcasts. - $utc_rebroadcast_start_time = Application_Model_DateHelper::ConvertToUtcDateTime($rebroadcast_start_time, $p_timezone); - $utc_rebroadcast_end_time = Application_Model_DateHelper::ConvertToUtcDateTime($rebroadcast_end_time, $p_timezone); - - Logging::log('UTC rebroadcast start '.$utc_rebroadcast_start_time->format("Y-m-d H:i:s")); - Logging::log('UTC rebroadcast end '.$utc_rebroadcast_end_time->format("Y-m-d H:i:s")); - Logging::log('Current UTC timestamp '.$p_currentUtcTimestamp); - - if ($utc_rebroadcast_start_time->format("Y-m-d H:i:s") > $p_currentUtcTimestamp){ - Logging::log('Creating rebroadcast show starting at UTC '.$utc_rebroadcast_start_time->format("Y-m-d H:i:s")); + if ($utcStartDateTime->format("Y-m-d H:i:s") > $p_currentUtcTimestamp){ $newRebroadcastInstance = new CcShowInstances(); $newRebroadcastInstance->setDbShowId($p_showId); - $newRebroadcastInstance->setDbStarts($utc_rebroadcast_start_time->format("Y-m-d H:i:s")); - $newRebroadcastInstance->setDbEnds($utc_rebroadcast_end_time->format("Y-m-d H:i:s")); + $newRebroadcastInstance->setDbStarts($utcStartDateTime); + $newRebroadcastInstance->setDbEnds($utcEndDateTime); $newRebroadcastInstance->setDbRecord(0); $newRebroadcastInstance->setDbRebroadcast(1); $newRebroadcastInstance->setDbOriginalShow($p_showInstanceId); @@ -1525,7 +1550,7 @@ class Application_Model_Show { ." AND si.starts >= TIMESTAMP '$timeStart'" ." AND si.starts < TIMESTAMP $timeEnd" ." ORDER BY si.starts"; - + // defaults to retrieve all shows within the interval if $limit not set if($limit != 0) { $sql = $sql . " LIMIT $limit"; From d3df4b14d2ca2eb997bf5c31b017502ca59cb15b Mon Sep 17 00:00:00 2001 From: Yuchen Wang Date: Wed, 23 Nov 2011 12:52:35 -0500 Subject: [PATCH 3/4] CC-3093: SoundCloud preferences do not have email or password as required fields + firefox auto-fills the password field - Make the form fields required - Append "Required" label to the fields - Disable autocomplete for the fields --- .../application/forms/SoundcloudPreferences.php | 10 ++++++---- .../views/scripts/form/preferences_soundcloud.phtml | 8 ++++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/airtime_mvc/application/forms/SoundcloudPreferences.php b/airtime_mvc/application/forms/SoundcloudPreferences.php index ad85b22b1..1597bbe19 100644 --- a/airtime_mvc/application/forms/SoundcloudPreferences.php +++ b/airtime_mvc/application/forms/SoundcloudPreferences.php @@ -42,9 +42,10 @@ class Application_Form_SoundcloudPreferences extends Zend_Form_SubForm //SoundCloud Username $this->addElement('text', 'SoundCloudUser', array( 'class' => 'input_text', - 'label' => 'SoundCloud Email:', - 'required' => false, + 'label' => 'SoundCloud Email', + 'required' => true, 'filters' => array('StringTrim'), + 'autocomplete' => 'off', 'value' => Application_Model_Preference::GetSoundCloudUser(), 'decorators' => array( 'ViewHelper' @@ -54,9 +55,10 @@ class Application_Form_SoundcloudPreferences extends Zend_Form_SubForm //SoundCloud Password $this->addElement('password', 'SoundCloudPassword', array( 'class' => 'input_text', - 'label' => 'SoundCloud Password:', - 'required' => false, + 'label' => 'SoundCloud Password', + 'required' => true, 'filters' => array('StringTrim'), + 'autocomplete' => 'off', 'value' => Application_Model_Preference::GetSoundCloudPassword(), 'decorators' => array( 'ViewHelper' diff --git a/airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml b/airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml index 99456616a..20bcc92c9 100644 --- a/airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml +++ b/airtime_mvc/application/views/scripts/form/preferences_soundcloud.phtml @@ -40,7 +40,9 @@
- +
element->getElement('SoundCloudUser') ?> @@ -53,7 +55,9 @@
- +
element->getElement('SoundCloudPassword') ?> From 87886b039f503b2c382b11d3b8d05a5ce11bab99 Mon Sep 17 00:00:00 2001 From: Naomi Aro Date: Wed, 23 Nov 2011 19:11:48 +0100 Subject: [PATCH 4/4] CC-3083 Must convert to UTC start/end times using the timezone start/end times --- airtime_mvc/application/models/Show.php | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/airtime_mvc/application/models/Show.php b/airtime_mvc/application/models/Show.php index 8da2ae4f2..799c98e08 100644 --- a/airtime_mvc/application/models/Show.php +++ b/airtime_mvc/application/models/Show.php @@ -1193,25 +1193,25 @@ class Application_Model_Show { if ($p_interval == 'P1M'){ - /* When adding months, there is a problem if we are on January 31st and add one month with PHP. + /* When adding months, there is a problem if we are on January 31st and add one month with PHP. * What ends up happening is that since February 31st doesn't exist, the date returned is * March 3rd. For now let's ignore the day and assume we are always working with the * first of each month, and use PHP to add 1 month to this (this will take care of rolling - * over the years 2011->2012, etc.). Then let's append the actual day, and use the php + * over the years 2011->2012, etc.). Then let's append the actual day, and use the php * checkdate() function, to see if it is valid. If not, then we'll just skip this month. */ - + $startDt = new DateTime($start, new DateTimeZone($timezone)); - + /* pass in only the year and month (not the day) */ $dt = new DateTime($startDt->format("Y-m"), new DateTimeZone($timezone)); - + /* Keep adding 1 month, until we find the next month that contains the day * we are looking for (31st day for example) */ do { $dt->add(new DateInterval($p_interval)); } while(!checkdate($dt->format("m"), $startDt->format("d"), $dt->format("Y"))); $dt->setDate($dt->format("Y"), $dt->format("m"), $startDt->format("d")); - + $start = $dt->format("Y-m-d H:i:s"); $dt->setTimezone(new DateTimeZone('UTC')); @@ -1251,16 +1251,14 @@ class Application_Model_Show { if (isset($p_offset)) { $startDateTime->add(new DateInterval("P{$p_offset["days"]}DT{$p_offset["hours"]}H{$p_offset["mins"]}M")); } + //convert time to UTC + $startDateTime->setTimezone(new DateTimeZone('UTC')); - $endDateTime = new DateTime($startDateTime->format("Y-m-d H:i:s"), new DateTimeZone($timezone)); + $endDateTime = clone $startDateTime; $duration = explode(":", $p_duration); list($hours, $mins) = array_slice($duration, 0, 2); $endDateTime->add(new DateInterval("PT{$hours}H{$mins}M")); - //convert times to UTC - $startDateTime->setTimezone(new DateTimeZone('UTC')); - $endDateTime->setTimezone(new DateTimeZone('UTC')); - return array($startDateTime, $endDateTime); }