From 0d2d8218bfacc981f55a347a1e092a8556f6c62a Mon Sep 17 00:00:00 2001 From: James Date: Thu, 2 Aug 2012 16:36:12 -0400 Subject: [PATCH] CC-84: Smart Playlists - audio preview on playlist - cleaning up some code --- airtime_mvc/application/common/DateHelper.php | 5 ++ .../controllers/AudiopreviewController.php | 47 ++++++++++ .../controllers/LibraryController.php | 14 +-- .../controllers/PlaylistController.php | 1 - airtime_mvc/application/models/Block.php | 86 ++++++++++++++----- airtime_mvc/application/models/Datatables.php | 4 +- airtime_mvc/application/models/Playlist.php | 35 +++++--- .../scripts/audiopreview/audio-preview.phtml | 3 + .../library/get-file-metadata.ajax.phtml | 26 +----- .../views/scripts/playlist/update.phtml | 8 +- .../airtime/audiopreview/preview_jplayer.js | 15 ++++ .../public/js/airtime/common/common.js | 24 +++++- .../public/js/airtime/library/library.js | 3 + airtime_mvc/public/js/airtime/library/spl.js | 3 +- 14 files changed, 202 insertions(+), 72 deletions(-) diff --git a/airtime_mvc/application/common/DateHelper.php b/airtime_mvc/application/common/DateHelper.php index 0c3b880c5..7a8861283 100644 --- a/airtime_mvc/application/common/DateHelper.php +++ b/airtime_mvc/application/common/DateHelper.php @@ -152,6 +152,11 @@ class Application_Common_DateHelper { return strtotime($time2) - strtotime($time1); } + + public static function TimeAdd($time1, $time2) + { + return strtotime($time2) + strtotime($time1); + } public static function ConvertMSToHHMMSSmm($time) { diff --git a/airtime_mvc/application/controllers/AudiopreviewController.php b/airtime_mvc/application/controllers/AudiopreviewController.php index 43e3bbf94..478b7ef19 100644 --- a/airtime_mvc/application/controllers/AudiopreviewController.php +++ b/airtime_mvc/application/controllers/AudiopreviewController.php @@ -81,6 +81,53 @@ class AudiopreviewController extends Zend_Controller_Action $this->_helper->viewRenderer->setRender('audio-preview'); } + public function blockPreviewAction() + { + global $CC_CONFIG; + + $blockIndex = $this->_getParam('blockIndex'); + $blockId = $this->_getParam('blockId'); + + $request = $this->getRequest(); + $baseUrl = $request->getBaseUrl(); + + $baseDir = dirname($_SERVER['SCRIPT_FILENAME']); + + $this->view->headScript()->appendFile($baseUrl.'/js/airtime/audiopreview/preview_jplayer.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); + $this->view->headScript()->appendFile($baseUrl.'/js/jplayer/jplayer.playlist.min.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); + $this->view->headLink()->appendStylesheet($baseUrl.'/js/jplayer/skin/jplayer.airtime.audio.preview.css?'.$CC_CONFIG['airtime_version']); + $this->_helper->layout->setLayout('audioPlayer'); + + $logo = Application_Model_Preference::GetStationLogo(); + if ($logo) { + $this->view->logo = "data:image/png;base64,$logo"; + } else { + $this->view->logo = "$baseUrl/css/images/airtime_logo_jp.png"; + } + $this->view->blockIndex= $blockIndex; + $this->view->blockId = $blockId; + + $this->_helper->viewRenderer->setRender('audio-preview'); + } + public function getBlockAction() + { + // disable the view and the layout + $this->view->layout()->disableLayout(); + $this->_helper->viewRenderer->setNoRender(true); + + $blockId = $this->_getParam('blockId'); + + if (!isset($blockId)) { + return; + } + + $bl = new Application_Model_Block($blockId); + $result = array(); + foreach ($bl->getContents(true) as $ele) { + $result[] = $this->createElementMap($ele); + } + $this->_helper->json($result); + } /** *Function will load and return the contents of the requested playlist. */ diff --git a/airtime_mvc/application/controllers/LibraryController.php b/airtime_mvc/application/controllers/LibraryController.php index 9e0119f20..78fd1abe5 100644 --- a/airtime_mvc/application/controllers/LibraryController.php +++ b/airtime_mvc/application/controllers/LibraryController.php @@ -76,6 +76,9 @@ class LibraryController extends Zend_Controller_Action $obj = new Application_Model_Playlist($id); } else { $obj = new Application_Model_Block($id); + if (!$obj->isStatic()){ + unset($menu["play"]); + } if ($isAdminOrPM || $obj->getCreatorId() == $user->getId()) { if ($this->obj_sess->type === "playlist") { $menu["pl_add"] = array("name"=> "Add to Playlist", "icon" => "add-playlist", "icon" => "copy"); @@ -312,21 +315,22 @@ class LibraryController extends Zend_Controller_Action $this->view->md = $md; $this->view->contents = $file->getContents(); } else if ($type == "block") { - $file = new Application_Model_Block($id); + $block = new Application_Model_Block($id); $this->view->type = $type; - $md = $file->getAllPLMetaData(); + $md = $block->getAllPLMetaData(); $formatter = new LengthFormatter($md["dcterms:extent"]); $md["dcterms:extent"] = $formatter->format(); $this->view->md = $md; - if ($file->isStatic()) { + if ($block->isStatic()) { $this->view->blType = 'Static'; - $this->view->contents = $file->getContents(); + $this->view->contents = $block->getContents(); } else { $this->view->blType = 'Dynamic'; - $this->view->contents = $file->getCriteria(); + $this->view->contents = $block->getCriteria(); } + $this->view->block = $block; } else if ($type == "stream") { $file = new Application_Model_Webstream($id); diff --git a/airtime_mvc/application/controllers/PlaylistController.php b/airtime_mvc/application/controllers/PlaylistController.php index 43103edf9..044ebde34 100644 --- a/airtime_mvc/application/controllers/PlaylistController.php +++ b/airtime_mvc/application/controllers/PlaylistController.php @@ -71,7 +71,6 @@ class PlaylistController extends Zend_Controller_Action $this->view->length = $formatter->format(); $this->view->obj = $obj; - Logging::log($obj->getContents()); $this->view->html = $this->view->render('playlist/update.phtml'); $this->view->name = $obj->getName(); $this->view->description = $obj->getDescription(); diff --git a/airtime_mvc/application/models/Block.php b/airtime_mvc/application/models/Block.php index 3e4a91e4c..1752bd441 100644 --- a/airtime_mvc/application/models/Block.php +++ b/airtime_mvc/application/models/Block.php @@ -250,30 +250,50 @@ EOT; } else { $length = $this->getDynamicBlockLength(); } - $length = $length == null ? "N/A" : $length; return $length; } + public function getFormattedLength() + { + $prepend = ""; + if ($this->isStatic()){ + $length = $this->block->getDbLength(); + } else { + $length = $this->getDynamicBlockLength(); + if (!$this->hasItemLimit()) { + $prepend = "~"; + } + } + $formatter = new LengthFormatter($length); + $length = $prepend.$formatter->format(); + return $length; + } + public function getDynamicBlockLength() { - $result = CcBlockcriteriaQuery::create()->filterByDbBlockId($this->id) - ->filterByDbCriteria('limit')->findOne(); - $modifier = $result->getDbModifier(); - $value = $result->getDbValue(); + list($value, $modifier) = $this->getLimitValueAndModifier(); if ($modifier == "items") { $length = $value." ".$modifier; } else { + $value = str_pad($value, 2, "0", STR_PAD_LEFT); if ($modifier == "minutes") { - $timestamp = "00:".$value.":00"; + $length = "00:".$value.":00"; } else if ($modifier == "hours") { - $timestamp = $value."00:00"; + $length = $value."00:00"; } - $formatter = new LengthFormatter($timestamp); - $length = "~".$formatter->format(); } return $length; } + public function getLimitValueAndModifier() + { + $result = CcBlockcriteriaQuery::create()->filterByDbBlockId($this->id) + ->filterByDbCriteria('limit')->findOne(); + $modifier = $result->getDbModifier(); + $value = $result->getDbValue(); + return array($value, $modifier); + } + // public function getStaticLength(){ $sql = "SELECT SUM(cliplength) as length FROM cc_blockcontents WHERE block_id={$this->id}"; @@ -886,6 +906,7 @@ EOT; public function setLength($value){ $this->block->setDbLength($value); $this->block->save($this->con); + $this->updateBlockLengthInAllPlaylist(); } @@ -1056,18 +1077,31 @@ EOT; // if the block is dynamic, put null to the length // as it cannot be calculated if ($blockType == 'dynamic') { - $this->setLength(null); - $output['blockLength'] = $this->getDynamicBlockLength(); + if ($this->hasItemLimit()) { + $this->setLength(null); + } else { + $this->setLength($this->getDynamicBlockLength()); + } } else { $length = $this->getStaticLength(); $this->setLength($length); - $formatter = new LengthFormatter($length); - $output['blockLength'] = $formatter->format(); } + $output['blockLength'] = $this->getFormattedLength(); } + $this->updateBlockLengthInAllPlaylist(); return $output; } + public function hasItemLimit() + { + list($value, $modifier) = $this->getLimitValueAndModifier(); + if ($modifier == 'items') { + return true; + } else { + return false; + } + } + public function storeCriteriaIntoDb($p_criteriaData){ // delete criteria under $p_blockId CcBlockcriteriaQuery::create()->findByDbBlockId($this->id)->delete(); @@ -1128,18 +1162,28 @@ EOT; $this->deleteAllFilesFromBlock(); $this->addAudioClips(array_keys($insertList)); // update length in playlist contents. - $blocks = CcPlaylistcontentsQuery::create()->filterByDbBlockId($this->id)->find(); - $blocks->getFirst(); - $iterator = $blocks->getIterator(); - while ($iterator->valid()) { - $iterator->current()->setDbClipLength($this->getLength()); - $iterator->current()->save(); - $iterator->next(); - } + $this->updateBlockLengthInAllPlaylist(); return array("result"=>0); } } + public function updateBlockLengthInAllPlaylist() + { + $blocks = CcPlaylistcontentsQuery::create()->filterByDbBlockId($this->id)->find(); + $blocks->getFirst(); + $iterator = $blocks->getIterator(); + while ($iterator->valid()) { + $length = $this->getLength(); + if (!preg_match("/^[0-9]{2}:[0-9]{2}:[0-9]{2}/", $length)) { + $iterator->current()->setDbClipLength(null); + } else { + $iterator->current()->setDbClipLength($length); + } + $iterator->current()->save(); + $iterator->next(); + } + } + public function getListOfFilesUnderLimit() { $info = $this->getListofFilesMeetCriteria(); diff --git a/airtime_mvc/application/models/Datatables.php b/airtime_mvc/application/models/Datatables.php index f54631cb7..a807757ad 100644 --- a/airtime_mvc/application/models/Datatables.php +++ b/airtime_mvc/application/models/Datatables.php @@ -94,8 +94,8 @@ class Application_Model_Datatables $pl = new Application_Model_Playlist($r['id']); $r['length'] = $pl->getLength(); } else if ($r['ftype'] == "block") { - $bl = new Application_Model_Block($r['id']); - $r['length'] = $bl->getLength(); + $bl = new Application_Model_Block($r['id']); + $r['length'] = $bl->getFormattedLength(); } } } catch (Exception $e) { diff --git a/airtime_mvc/application/models/Playlist.php b/airtime_mvc/application/models/Playlist.php index f560c4f37..bc8f353a8 100644 --- a/airtime_mvc/application/models/Playlist.php +++ b/airtime_mvc/application/models/Playlist.php @@ -198,7 +198,7 @@ EOT; //format the length for UI. if ($row['type'] == 2){ $bl = new Application_Model_Block($row['item_id']); - $formatter = new LengthFormatter($bl->getLength()); + $formatter = new LengthFormatter($bl->getFormattedLength()); } else { $formatter = new LengthFormatter($row['length']); } @@ -257,24 +257,39 @@ EOT; return $fade; } - public function hasDynamicBlockOrWebStream(){ - $sql = "SELECT count(*) as count FROM cc_playlistcontents as pc - JOIN cc_block as bl ON pc.type=2 AND pc.block_id=bl.id AND bl.type='dynamic' - WHERE playlist_id={$this->id} AND (pc.type=2 OR pc.type=1)"; - $r = $this->con->query($sql); - $result = $r->fetchAll(PDO::FETCH_NUM); - if (intval($result[0][0]) > 0) { + // returns true/false and ids of dynamic blocks + public function hasDynamicBlock(){ + $ids = $this->getIdsOfDynamicBlocks(); + if (count($ids) > 0) { return true; } else { return false; } } + + public function getIdsOfDynamicBlocks() { + $sql = "SELECT bl.id FROM cc_playlistcontents as pc + JOIN cc_block as bl ON pc.type=2 AND pc.block_id=bl.id AND bl.type='dynamic' + WHERE playlist_id={$this->id} AND pc.type=2"; + $r = $this->con->query($sql); + $result = $r->fetchAll(PDO::FETCH_ASSOC); + return $result; + } //aggregate column on playlistcontents cliplength column. public function getLength() { - if ($this->hasDynamicBlockOrWebStream()){ - return "N/A"; + if ($this->hasDynamicBlock()){ + $ids = $this->getIdsOfDynamicBlocks(); + $length = $this->pl->getDbLength(); + foreach ($ids as $id){ + $bl = new Application_Model_Block($id['id']); + if ($bl->hasItemLimit()) { + return "N/A"; + } + } + $formatter = new LengthFormatter($length); + return "~".$formatter->format(); } else { return $this->pl->getDbLength(); } diff --git a/airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml b/airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml index d5d1b2dc4..d440d96ca 100644 --- a/airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml +++ b/airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml @@ -3,6 +3,9 @@ playlistID)): ?> playlistID" ?> playlistIndex" ?> +blockId)): ?> + blockId" ?> + blockIndex" ?> audioFileID)): ?> audioFileID" ?> audioFileTitle" ?> diff --git a/airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml b/airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml index 3579b1d7c..c192e9ddb 100644 --- a/airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml +++ b/airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml @@ -26,23 +26,7 @@
Name:md["dc:title"]);?>
Creator:md["dc:creator"]);?>
type == "block" && $this->blType == "Dynamic") { ?> - contents["limit"]["modifier"] == "items") { ?> - contents["limit"]["value"]." tracks"; ?> - contents["limit"]["modifier"] == "minutes") { ?> - contents["limit"]["value"]; - if ($mins > 59) { - $hours = intval($mins / 60); - $minutes = $mins % 60; - $len = $hours.":".str_pad($minutes, 2, "0", STR_PAD_LEFT).":00.0"; - } else { - $len = $this->contents["limit"]["value"].":00.0"; - } - ?> - - contents["limit"]["value"].":00:00.0"; ?> - -
Length:
+
Length:block->getFormattedLength();?>
Length:md["dcterms:extent"]);?>
@@ -74,13 +58,7 @@ '> - - getCriteria();?> - getLength();?> - - - - + getFormattedLength(); ?> diff --git a/airtime_mvc/application/views/scripts/playlist/update.phtml b/airtime_mvc/application/views/scripts/playlist/update.phtml index 21a9b6477..a389265ca 100644 --- a/airtime_mvc/application/views/scripts/playlist/update.phtml +++ b/airtime_mvc/application/views/scripts/playlist/update.phtml @@ -17,7 +17,7 @@ if ($item['type'] == 2) { -
+
">
@@ -31,9 +31,9 @@ if ($item['type'] == 2) { - Static Block Expand + " id="expand_block_">Static Block Expand - Dynamic Block + " id="expand_block_">Dynamic Block @@ -75,7 +75,7 @@ if ($item['type'] == 2) {
-
+
_info">
diff --git a/airtime_mvc/public/js/airtime/audiopreview/preview_jplayer.js b/airtime_mvc/public/js/airtime/audiopreview/preview_jplayer.js index 149cd82ce..dcc33f11d 100644 --- a/airtime_mvc/public/js/airtime/audiopreview/preview_jplayer.js +++ b/airtime_mvc/public/js/airtime/audiopreview/preview_jplayer.js @@ -40,6 +40,8 @@ $(document).ready(function(){ var playlistIndex = $('.playlistIndex').text(); var showID = $('.showID').text(); var showIndex = $('.showIndex').text(); + var blockId = $('.blockId').text(); + var blockIndex = $('.blockIndex').text(); var numOfItems = 0; @@ -49,6 +51,8 @@ $(document).ready(function(){ playOne(audioFileID); }else if (showID != "") { playAllShow(showID, showIndex); + }else if(blockId != "" && blockIndex != ""){ + playBlock(blockId, blockIndex); } $("#jp_container_1").on("mouseenter", "ul.jp-controls li", function(ev) { @@ -76,6 +80,17 @@ function playAllPlaylist(p_playlistID, p_playlistIndex) { } } +function playBlock(p_blockId, p_blockIndex) +{ + var viewsBlockId = $('.blockId').text(); + + if ( _idToPostionLookUp !== undefined && viewsBlockId == p_blockId ) { + play(p_blockIndex); + }else { + buildplaylist("/audiopreview/get-block/blockId/"+p_blockId, p_blockIndex); + } +} + /** * Sets up the show to play. * checks with the show id given to the show id on the page/view diff --git a/airtime_mvc/public/js/airtime/common/common.js b/airtime_mvc/public/js/airtime/common/common.js index 236f52879..074c6f267 100644 --- a/airtime_mvc/public/js/airtime/common/common.js +++ b/airtime_mvc/public/js/airtime/common/common.js @@ -31,11 +31,16 @@ function openAudioPreview(p_event) { p_event.stopPropagation(); var audioFileID = $(this).attr('audioFile'); - var playlistID = $('#pl_id:first').attr('value'); - var playlistIndex = $(this).parent().parent().attr('id'); - playlistIndex = playlistIndex.substring(4); //remove the spl_ + var objId = $('#obj_id:first').attr('value'); + var objType = $('#obj_type:first').attr('value'); + var playIndex = $(this).parent().parent().attr('id'); + playIndex = playIndex.substring(4); //remove the spl_ - open_playlist_preview(playlistID, playlistIndex); + if (objType == "playlist") { + open_playlist_preview(objId, playIndex); + } else if (objType == "block") { + open_block_preview(objId, playIndex); + } } function open_audio_preview(audioFileID, audioFileTitle, audioFileArtist) { @@ -65,6 +70,17 @@ function open_playlist_preview(p_playlistID, p_playlistIndex) { _preview_window.focus(); } +function open_block_preview(p_blockId, p_blockIndex) { + if (p_blockIndex == undefined) //Use a resonable default. + p_blockIndex = 0; + + if (_preview_window != null && !_preview_window.closed) + _preview_window.playBlock(p_blockId, p_blockIndex); + else + openPreviewWindow('audiopreview/block-preview/blockIndex/'+p_blockIndex+'/blockId/'+p_blockId); + _preview_window.focus(); +} + /** *Opens a jPlayer window for the specified info, for either an audio file or playlist. *If audioFile, audioFileTitle, audioFileArtist is supplied the jplayer opens for one file diff --git a/airtime_mvc/public/js/airtime/library/library.js b/airtime_mvc/public/js/airtime/library/library.js index 1b262c709..c1b0f4663 100644 --- a/airtime_mvc/public/js/airtime/library/library.js +++ b/airtime_mvc/public/js/airtime/library/library.js @@ -629,6 +629,9 @@ var AIRTIME = (function(AIRTIME) { open_playlist_preview(playlistIndex, 0); } else if (data.ftype === 'audioclip') { open_audio_preview(data.audioFile, data.track_title, data.artist_name); + } else if (data.ftype === 'block') { + blockIndex = $(this).parent().attr('id').substring(3); //remove the pl_ + open_block_preview(blockIndex, 0); } }; oItems.play.callback = callback; diff --git a/airtime_mvc/public/js/airtime/library/spl.js b/airtime_mvc/public/js/airtime/library/spl.js index 8c256ca8b..83fd83430 100644 --- a/airtime_mvc/public/js/airtime/library/spl.js +++ b/airtime_mvc/public/js/airtime/library/spl.js @@ -356,10 +356,11 @@ var AIRTIME = (function(AIRTIME){ $pl.delegate(".spl_block_expand", {"click": function(ev){ var id = parseInt($(this).attr("id").split("_").pop(), 10); + var blockId = parseInt($(this).attr("blockId"), 10); if ($(this).hasClass('close')) { var sUrl = "/playlist/get-block-info"; mod.disableUI(); - $.post(sUrl, {format:"json", id:id}, function(json){ + $.post(sUrl, {format:"json", id:blockId}, function(json){ $html = ""; var data = $.parseJSON(json); var isStatic = data.isStatic;