From e92be3c186ca586626f790c729bcdd4dae3dda4b Mon Sep 17 00:00:00 2001 From: martin Date: Tue, 22 Mar 2011 18:04:27 -0400 Subject: [PATCH] CC-1990: Widget to display schedule and "Now Playing" on any website -First working version, needs to be called using: --- application/controllers/ApiController.php | 10 + application/models/Schedule.php | 2 +- application/models/Shows.php | 4 +- plugins/jquery.showinfo.js | 213 ++++++++++++++-------- 4 files changed, 146 insertions(+), 83 deletions(-) diff --git a/application/controllers/ApiController.php b/application/controllers/ApiController.php index b4dd0d3a2..f7ff37eb1 100644 --- a/application/controllers/ApiController.php +++ b/application/controllers/ApiController.php @@ -109,6 +109,16 @@ class ApiController extends Zend_Controller_Action $this->_helper->viewRenderer->setNoRender(true); $result = Schedule::GetPlayOrderRange(0, 1); + + $date = new Application_Model_DateHelper; + $timeNow = $date->getDate(); + $result = array("env"=>APPLICATION_ENV, + "schedulerTime"=>gmdate("Y-m-d H:i:s"), + "currentShow"=>Show_DAL::GetCurrentShow($timeNow), + "nextShow"=>Show_DAL::GetNextShows($timeNow, 5), + "timezone"=> date("T"), + "timezoneOffset"=> date("Z")); + //echo json_encode($result); header("Content-type: text/javascript"); echo $_GET['callback'].'('.json_encode($result).')'; diff --git a/application/models/Schedule.php b/application/models/Schedule.php index 6113eae2e..7435bf407 100644 --- a/application/models/Schedule.php +++ b/application/models/Schedule.php @@ -436,7 +436,7 @@ class Schedule { "current"=>Schedule::GetScheduledItemData($timeNow, 0), "next"=>Schedule::GetScheduledItemData($timeNow, 1, $next, "48 hours"), "currentShow"=>Show_DAL::GetCurrentShow($timeNow), - "nextShow"=>Show_DAL::GetNextShow($timeNow), + "nextShow"=>Show_DAL::GetNextShows($timeNow, 1), "timezone"=> date("T"), "timezoneOffset"=> date("Z"), "apiKey"=>$CC_CONFIG['apiKey'][0]); diff --git a/application/models/Shows.php b/application/models/Shows.php index ea2cf5401..f0a7a20bc 100644 --- a/application/models/Shows.php +++ b/application/models/Shows.php @@ -889,7 +889,7 @@ class Show_DAL { return $rows; } - public static function GetNextShow($timeNow) + public static function GetNextShows($timeNow, $limit) { global $CC_CONFIG, $CC_DBC; @@ -899,7 +899,7 @@ class Show_DAL { ." AND si.starts >= TIMESTAMP '$timeNow'" ." AND si.starts < TIMESTAMP '$timeNow' + INTERVAL '48 hours'" ." ORDER BY si.starts" - ." LIMIT 1"; + ." LIMIT $limit"; $rows = $CC_DBC->GetAll($sql); return $rows; diff --git a/plugins/jquery.showinfo.js b/plugins/jquery.showinfo.js index da5be1af8..c31381a10 100644 --- a/plugins/jquery.showinfo.js +++ b/plugins/jquery.showinfo.js @@ -2,25 +2,64 @@ $.fn.airtimeShowSchedule = function(options) { var defaults = { - updatePeriod: 5, //seconds + updatePeriod: 20, //seconds + sourceDomain: "http://localhost/", //where to get show status from }; var options = $.extend(defaults, options); return this.each(function() { var obj = $(this); + var sd; - obj.append("

On air today

"); - obj.append( - ""+ - "" + - "" + - "" + - ""+ - ""+ - ""+ - ""+ - ""+ - "
13:15 - 13:30Program name Listen
13:15 - 13:30Lorem ipsum dolor
"); + getServerData(); + + function updateWidget(){ + var currentShow = sd.getCurrentShow(); + var nextShows = sd.getNextShows(); + + var currentShowName = ""; + var nextShowName = "" + + if (currentShow.length > 0){ + currentShowName = currentShow[0].getName(); + } + + if (nextShows.length > 0){ + nextShowName = nextShows[0].getName(); + } + + tableString = ""; + tableString += "

On air today

"; + tableString += ""+ + ""; + + var shows=currentShow.concat(nextShows); + + obj.empty(); + for (var i=0; i" + + "" + + "" + + ""; + } + + tableString += "
"+shows[i].getRange()+""+shows[i].getName()+" Listen
"; + + obj.append(tableString); + } + + function processData(data){ + sd = new ScheduleData(data); + updateWidget(); + } + + function getServerData(){ + $.ajax({ url: options.sourceDomain + "api/live-info/", dataType:"jsonp", success:function(data){ + processData(data); + }, error:function(jqXHR, textStatus, errorThrown){}}); + setTimeout(getServerData, defaults.updatePeriod*1000); + } }); }; })(jQuery); @@ -42,24 +81,42 @@ getServerData(); function updateWidget(){ - var currentShow = sd.getCurrentShowName(); - var timeRemaining = sd.getCurrentShowTimeRemaining(); - var timeElapsed = sd.getCurrentShowTimeElapsed(); - var showStatus = sd.getCurrentShowStatus(); + var currentShow = sd.getCurrentShow(); + var nextShows = sd.getNextShows(); - var nextShow = sd.getNextShowName(); - var nextShowRange = sd.getNextShowRange(); + var showStatus = "Offline"; + var currentShowName = ""; + var timeElapsed = ""; + var timeRemaining = ""; + + var nextShowName = ""; + var nextShowRange = ""; + + if (currentShow.length > 0){ + showStatus = "On Air Now"; + currentShowName = currentShow[0].getName(); + + timeElapsed = sd.getShowTimeElapsed(currentShow[0]); + timeRemaining = sd.getShowTimeRemaining(currentShow[0]); + } + + if (nextShows.length > 0){ + nextShowName = nextShows[0].getName(); + nextShowRange = nextShows[0].getRange(); + } obj.empty(); obj.append("Listen WADR Live"); obj.append("

"+showStatus+" >>

"); obj.append(""); - //refresh the UI + //refresh the UI to update the elapsed/remaining time setTimeout(updateWidget, 1000); } @@ -78,12 +135,23 @@ }; })(jQuery); -/* The rest of this file is the ScheduleData class */ +/* ScheduleData class BEGIN */ function ScheduleData(data){ this.data = data; this.estimatedSchedulePosixTime; - this.schedulePosixTime = this.convertDateToPosixTime(data.schedulerTime); + this.currentShow = new Array(); + for (var i=0; i< data.currentShow.length; i++){ + this.currentShow[i] = new Show(data.currentShow[i]); + } + + this.nextShows = new Array(); + for (var i=0; i< data.nextShow.length; i++){ + this.nextShows[i] = new Show(data.nextShow[i]); + } + + + this.schedulePosixTime = convertDateToPosixTime(data.schedulerTime); this.schedulePosixTime += parseInt(data.timezoneOffset)*1000; var date = new Date(); this.localRemoteTimeOffset = date.getTime() - this.schedulePosixTime; @@ -95,72 +163,57 @@ ScheduleData.prototype.secondsTimer = function(){ this.estimatedSchedulePosixTime = date.getTime() - this.localRemoteTimeOffset; } -ScheduleData.prototype.getCurrentShowName = function() { - var currentShow = this.data.currentShow; - if (currentShow.length > 0){ - return "Current: " + currentShow[0].name; - } else { - return ""; - } -}; +ScheduleData.prototype.getCurrentShow = function(){ + return this.currentShow; +} -ScheduleData.prototype.getCurrentShowStatus = function() { - var currentShow = this.data.currentShow; - if (currentShow.length > 0){ - return "On Air Now"; - } else { - return "Offline"; - } -}; +ScheduleData.prototype.getNextShows = function() { + return this.nextShows; +} -ScheduleData.prototype.getNextShowName = function() { - var nextShow = this.data.nextShow; - if (nextShow.length > 0){ - return "Next: " + nextShow[0].name; - } else { - return ""; - } -}; - -ScheduleData.prototype.getNextShowRange = function() { - var nextShow = this.data.nextShow; - if (nextShow.length > 0){ - return this.getTime(nextShow[0].start_timestamp) + " - " + this.getTime(nextShow[0].end_timestamp); - } else { - return ""; - } -}; - -ScheduleData.prototype.getCurrentShowTimeElapsed = function() { +ScheduleData.prototype.getShowTimeElapsed = function(show) { this.secondsTimer(); - var currentShow = this.data.currentShow; - if (currentShow.length > 0){ - var showStart = this.convertDateToPosixTime(currentShow[0].start_timestamp); - return this.convertToHHMMSS(this.estimatedSchedulePosixTime - showStart); - } else { - return ""; - } + + var showStart = convertDateToPosixTime(show.getStartTimestamp()); + return convertToHHMMSS(this.estimatedSchedulePosixTime - showStart); }; -ScheduleData.prototype.getCurrentShowTimeRemaining = function() { +ScheduleData.prototype.getShowTimeRemaining = function(show) { this.secondsTimer(); - var currentShow = this.data.currentShow; - if (currentShow.length > 0){ - var showEnd = this.convertDateToPosixTime(currentShow[0].end_timestamp); - return this.convertToHHMMSS(showEnd - this.estimatedSchedulePosixTime); - } else { - return ""; - } -}; -ScheduleData.prototype.getTime = function(timestamp) { - return timestamp.split(" ")[1]; + var showEnd = convertDateToPosixTime(show.getEndTimestamp()); + return convertToHHMMSS(showEnd - this.estimatedSchedulePosixTime); }; +/* ScheduleData class END */ +/* Show class BEGIN */ +function Show(showData){ + this.showData = showData; +} + +Show.prototype.getName = function(){ + return this.showData.name; +} +Show.prototype.getRange = function(){ + return getTime(this.showData.start_timestamp) + " - " + getTime(this.showData.end_timestamp); +} +Show.prototype.getStartTimestamp = function(){ + return this.showData.start_timestamp; +} +Show.prototype.getEndTimestamp = function(){ + return this.showData.end_timestamp; +} +/* Show class END */ + + +function getTime(timestamp) { + var time = timestamp.split(" ")[1].split(":"); + return time[0] + ":" + time[1]; +}; /* Takes an input parameter of milliseconds and converts these into * the format HH:MM:SS */ -ScheduleData.prototype.convertToHHMMSS = function(timeInMS){ +function convertToHHMMSS(timeInMS){ var time = parseInt(timeInMS); var hours = parseInt(time / 3600000); @@ -189,7 +242,7 @@ ScheduleData.prototype.convertToHHMMSS = function(timeInMS){ /* Takes in a string of format similar to 2011-02-07 02:59:57, * and converts this to epoch/posix time. */ -ScheduleData.prototype.convertDateToPosixTime = function(s){ +function convertDateToPosixTime(s){ var datetime = s.split(" "); var date = datetime[0].split("-");