SAAS-794: Schedule/get-current-playlist can take too long to respond
Renamed function Removed old function
This commit is contained in:
parent
8b02002f5e
commit
099537a1b7
|
@ -98,10 +98,8 @@ SQL;
|
||||||
$utcNow = new DateTime("now", new DateTimeZone("UTC"));
|
$utcNow = new DateTime("now", new DateTimeZone("UTC"));
|
||||||
|
|
||||||
$shows = Application_Model_Show::getPrevCurrentNext($utcNow, $utcTimeEnd, $showsToRetrieve);
|
$shows = Application_Model_Show::getPrevCurrentNext($utcNow, $utcTimeEnd, $showsToRetrieve);
|
||||||
$previousShowID = count($shows['previousShow'])>0?$shows['previousShow'][0]['instance_id']:null;
|
|
||||||
$currentShowID = count($shows['currentShow'])>0?$shows['currentShow']['instance_id']:null;
|
$currentShowID = count($shows['currentShow'])>0?$shows['currentShow']['instance_id']:null;
|
||||||
$nextShowID = count($shows['nextShow'])>0?$shows['nextShow'][0]['instance_id']:null;
|
$results = Application_Model_Schedule::getPreviousCurrentNextMedia($utcNow, $currentShowID);
|
||||||
$results = self::GetPrevCurrentNext($previousShowID, $currentShowID, $nextShowID, $utcNow);
|
|
||||||
|
|
||||||
$range = array(
|
$range = array(
|
||||||
"station" => array (
|
"station" => array (
|
||||||
|
@ -136,11 +134,8 @@ SQL;
|
||||||
$utcNow = new DateTime("now", new DateTimeZone("UTC"));
|
$utcNow = new DateTime("now", new DateTimeZone("UTC"));
|
||||||
|
|
||||||
$shows = Application_Model_Show::getPrevCurrentNextOld($utcNow);
|
$shows = Application_Model_Show::getPrevCurrentNextOld($utcNow);
|
||||||
$previousShowID = count($shows['previousShow'])>0?$shows['previousShow'][0]['instance_id']:null;
|
|
||||||
$currentShowID = count($shows['currentShow'])>0?$shows['currentShow'][0]['instance_id']:null;
|
$currentShowID = count($shows['currentShow'])>0?$shows['currentShow'][0]['instance_id']:null;
|
||||||
$nextShowID = count($shows['nextShow'])>0?$shows['nextShow'][0]['instance_id']:null;
|
$results = Application_Model_Schedule::getPreviousCurrentNextMedia($utcNow, $currentShowID);
|
||||||
//$results = self::GetPrevCurrentNext($previousShowID, $currentShowID, $nextShowID, $utcNow);
|
|
||||||
$results = Application_Model_Schedule::getPVC($utcNow);
|
|
||||||
|
|
||||||
$range = array(
|
$range = array(
|
||||||
"env" => APPLICATION_ENV,
|
"env" => APPLICATION_ENV,
|
||||||
|
@ -157,7 +152,17 @@ SQL;
|
||||||
return $range;
|
return $range;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function getPVC($utcNow)
|
/**
|
||||||
|
* Attempts to find a media item (track or webstream) that is currently playing.
|
||||||
|
* If a current media item is currently playing, this function then attempts to
|
||||||
|
* find an item that played previously and is scheduled to play next.
|
||||||
|
*
|
||||||
|
* @param $utcNow DateTime current time in UTC
|
||||||
|
* @param $currentShowInstanceId cc_show_instance id of the show instance currently playing
|
||||||
|
* @return array with data about the previous, current, and next media items playing.
|
||||||
|
* Returns an empty arrays if there is no media item currently playing
|
||||||
|
*/
|
||||||
|
public static function getPreviousCurrentNextMedia($utcNow, $currentShowInstanceId)
|
||||||
{
|
{
|
||||||
$timeZone = new DateTimeZone("UTC"); //This function works entirely in UTC.
|
$timeZone = new DateTimeZone("UTC"); //This function works entirely in UTC.
|
||||||
assert(get_class($utcNow) === "DateTime");
|
assert(get_class($utcNow) === "DateTime");
|
||||||
|
@ -170,11 +175,12 @@ SQL;
|
||||||
$sql = "select s.id, s.starts, s.ends, s.file_id, s.stream_id, s.media_item_played,
|
$sql = "select s.id, s.starts, s.ends, s.file_id, s.stream_id, s.media_item_played,
|
||||||
s.instance_id, si.ends as show_ends from cc_schedule s left join cc_show_instances si
|
s.instance_id, si.ends as show_ends from cc_schedule s left join cc_show_instances si
|
||||||
on s.instance_id = si.id where s.playout_status > 0 and s.starts <= :p1
|
on s.instance_id = si.id where s.playout_status > 0 and s.starts <= :p1
|
||||||
and s.ends >= :p2 order by starts desc limit 1";
|
and s.ends >= :p2 and s.instance_id = :p3 order by starts desc limit 1";
|
||||||
|
|
||||||
$params = array(
|
$params = array(
|
||||||
":p1" => $utcNow->format("Y-m-d H:i:s"),
|
":p1" => $utcNow->format("Y-m-d H:i:s"),
|
||||||
":p2" => $utcNow->format("Y-m-d H:i:s")
|
":p2" => $utcNow->format("Y-m-d H:i:s"),
|
||||||
|
":p3" => $currentShowInstanceId
|
||||||
);
|
);
|
||||||
|
|
||||||
$rows = Application_Common_Database::prepareAndExecute($sql, $params);
|
$rows = Application_Common_Database::prepareAndExecute($sql, $params);
|
||||||
|
@ -300,132 +306,6 @@ SQL;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Queries the database for the set of schedules one hour before
|
|
||||||
* and after the given time. If a show starts and ends within that
|
|
||||||
* time that is considered the current show. Then the scheduled item
|
|
||||||
* before it is the previous show, and the scheduled item after it
|
|
||||||
* is the next show. This way the dashboard getCurrentPlaylist is
|
|
||||||
* very fast. But if any one of the three show types are not found
|
|
||||||
* through this mechanism a call is made to the old way of querying
|
|
||||||
* the database to find the track info.
|
|
||||||
**/
|
|
||||||
public static function GetPrevCurrentNext($p_previousShowID, $p_currentShowID, $p_nextShowID, $utcNow)
|
|
||||||
{
|
|
||||||
$timeZone = new DateTimeZone("UTC"); //This function works entirely in UTC.
|
|
||||||
assert(get_class($utcNow) === "DateTime");
|
|
||||||
assert($utcNow->getTimeZone() == $timeZone);
|
|
||||||
|
|
||||||
if ($p_previousShowID == null && $p_currentShowID == null && $p_nextShowID == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$sql = "SELECT %%columns%% st.starts as starts, st.ends as ends,
|
|
||||||
st.media_item_played as media_item_played, si.ends as show_ends
|
|
||||||
%%tables%% WHERE ";
|
|
||||||
|
|
||||||
$fileColumns = "ft.artist_name, ft.track_title, ";
|
|
||||||
$fileJoin = "FROM cc_schedule st JOIN cc_files ft ON st.file_id = ft.id
|
|
||||||
LEFT JOIN cc_show_instances si ON st.instance_id = si.id";
|
|
||||||
|
|
||||||
$streamColumns = "ws.name AS artist_name, wm.liquidsoap_data AS track_title, ";
|
|
||||||
$streamJoin = <<<SQL
|
|
||||||
FROM cc_schedule AS st
|
|
||||||
JOIN cc_webstream ws ON st.stream_id = ws.id
|
|
||||||
LEFT JOIN cc_show_instances AS si ON st.instance_id = si.id
|
|
||||||
LEFT JOIN cc_subjs AS sub ON sub.id = ws.creator_id
|
|
||||||
LEFT JOIN
|
|
||||||
(SELECT *
|
|
||||||
FROM cc_webstream_metadata
|
|
||||||
ORDER BY start_time DESC LIMIT 1) AS wm ON st.id = wm.instance_id
|
|
||||||
SQL;
|
|
||||||
|
|
||||||
$predicateArr = array();
|
|
||||||
$paramMap = array();
|
|
||||||
if (isset($p_previousShowID)) {
|
|
||||||
$predicateArr[] = 'st.instance_id = :previousShowId';
|
|
||||||
$paramMap[':previousShowId'] = $p_previousShowID;
|
|
||||||
}
|
|
||||||
if (isset($p_currentShowID)) {
|
|
||||||
$predicateArr[] = 'st.instance_id = :currentShowId';
|
|
||||||
$paramMap[':currentShowId'] = $p_currentShowID;
|
|
||||||
}
|
|
||||||
if (isset($p_nextShowID)) {
|
|
||||||
$predicateArr[] = 'st.instance_id = :nextShowId';
|
|
||||||
$paramMap[':nextShowId'] = $p_nextShowID;
|
|
||||||
}
|
|
||||||
|
|
||||||
$sql .= " (".implode(" OR ", $predicateArr).") ";
|
|
||||||
$sql .= ' AND st.playout_status > 0 ORDER BY st.starts';
|
|
||||||
|
|
||||||
$filesSql = str_replace("%%columns%%", $fileColumns, $sql);
|
|
||||||
$filesSql = str_replace("%%tables%%", $fileJoin, $filesSql);
|
|
||||||
|
|
||||||
$streamSql = str_replace("%%columns%%", $streamColumns, $sql);
|
|
||||||
$streamSql = str_replace("%%tables%%", $streamJoin, $streamSql);
|
|
||||||
|
|
||||||
$sql = "SELECT * FROM (($filesSql) UNION ($streamSql)) AS unioned ORDER BY starts";
|
|
||||||
|
|
||||||
$rows = Application_Common_Database::prepareAndExecute($sql, $paramMap);
|
|
||||||
$numberOfRows = count($rows);
|
|
||||||
|
|
||||||
$results['previous'] = null;
|
|
||||||
$results['current'] = null;
|
|
||||||
$results['next'] = null;
|
|
||||||
|
|
||||||
for ($i = 0; $i < $numberOfRows; ++$i) {
|
|
||||||
|
|
||||||
// if the show is overbooked, then update the track end time to the end of the show time.
|
|
||||||
if ($rows[$i]['ends'] > $rows[$i]["show_ends"]) {
|
|
||||||
$rows[$i]['ends'] = $rows[$i]["show_ends"];
|
|
||||||
}
|
|
||||||
|
|
||||||
$curShowStartTime = new DateTime($rows[$i]['starts'], $timeZone);
|
|
||||||
$curShowEndTime = new DateTime($rows[$i]['ends'], $timeZone);
|
|
||||||
|
|
||||||
if (($curShowStartTime <= $utcNow) && ($curShowEndTime >= $utcNow)) {
|
|
||||||
if ($i - 1 >= 0) {
|
|
||||||
$results['previous'] = array("name"=>$rows[$i-1]["artist_name"]." - ".$rows[$i-1]["track_title"],
|
|
||||||
"starts"=>$rows[$i-1]["starts"],
|
|
||||||
"ends"=>$rows[$i-1]["ends"],
|
|
||||||
"type"=>'track');
|
|
||||||
}
|
|
||||||
$results['current'] = array("name"=>$rows[$i]["artist_name"]." - ".$rows[$i]["track_title"],
|
|
||||||
"starts"=>$rows[$i]["starts"],
|
|
||||||
"ends"=> (($rows[$i]["ends"] > $rows[$i]["show_ends"]) ? $rows[$i]["show_ends"]: $rows[$i]["ends"]),
|
|
||||||
"media_item_played"=>$rows[$i]["media_item_played"],
|
|
||||||
"record"=>0,
|
|
||||||
"type"=>'track');
|
|
||||||
if (isset($rows[$i+1])) {
|
|
||||||
$results['next'] = array("name"=>$rows[$i+1]["artist_name"]." - ".$rows[$i+1]["track_title"],
|
|
||||||
"starts"=>$rows[$i+1]["starts"],
|
|
||||||
"ends"=>$rows[$i+1]["ends"],
|
|
||||||
"type"=>'track');
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if ($curShowEndTime < $utcNow ) {
|
|
||||||
$previousIndex = $i;
|
|
||||||
}
|
|
||||||
if ($curShowStartTime > $utcNow) {
|
|
||||||
$results['next'] = array("name"=>$rows[$i]["artist_name"]." - ".$rows[$i]["track_title"],
|
|
||||||
"starts"=>$rows[$i]["starts"],
|
|
||||||
"ends"=>$rows[$i]["ends"],
|
|
||||||
"type"=>'track');
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//If we didn't find a a current show because the time didn't fit we may still have
|
|
||||||
//found a previous show so use it.
|
|
||||||
if ($results['previous'] === null && isset($previousIndex)) {
|
|
||||||
$results['previous'] = array("name"=>$rows[$previousIndex]["artist_name"]." - ".$rows[$previousIndex]["track_title"],
|
|
||||||
"starts"=>$rows[$previousIndex]["starts"],
|
|
||||||
"ends"=>$rows[$previousIndex]["ends"]);;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $results;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function GetLastScheduleItem($p_timeNow)
|
public static function GetLastScheduleItem($p_timeNow)
|
||||||
{
|
{
|
||||||
$sql = <<<SQL
|
$sql = <<<SQL
|
||||||
|
|
Loading…
Reference in New Issue