CC-84: Smart Playlists

- audio preview on playlist
- cleaning up some code
This commit is contained in:
James 2012-08-02 16:36:12 -04:00
parent 3b5a3e6713
commit 0d2d8218bf
14 changed files with 202 additions and 72 deletions

View file

@ -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)
{

View file

@ -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.
*/

View file

@ -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);

View file

@ -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();

View file

@ -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();

View file

@ -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) {

View file

@ -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();
}

View file

@ -3,6 +3,9 @@
<?php if (isset($this->playlistID)): ?>
<span class='playlistID'><?php echo "$this->playlistID" ?></span>
<span class='playlistIndex'><?php echo "$this->playlistIndex" ?></span>
<?php elseif (isset($this->blockId)): ?>
<span class='blockId'><?php echo "$this->blockId" ?></span>
<span class='blockIndex'><?php echo "$this->blockIndex" ?></span>
<?php elseif (isset($this->audioFileID)): ?>
<span class='audioFileID'><?php echo "$this->audioFileID" ?></span>
<span class='audioFileTitle'><?php echo "$this->audioFileTitle" ?></span>

View file

@ -26,23 +26,7 @@
<div><span>Name:</span><span><?php echo ($this->md["dc:title"]);?></span></div>
<div><span>Creator:</span><span><?php echo ($this->md["dc:creator"]);?></span></div>
<?php if ($this->type == "block" && $this->blType == "Dynamic") { ?>
<?php if ($this->contents["limit"]["modifier"] == "items") { ?>
<?php $len = $this->contents["limit"]["value"]." tracks"; ?>
<?php } elseif ($this->contents["limit"]["modifier"] == "minutes") { ?>
<?php
$mins = $this->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";
}
?>
<?php } else {?>
<?php $len = $this->contents["limit"]["value"].":00:00.0"; ?>
<?php } ?>
<div><span>Length:</span><span><?php echo $len;?></span></div>
<div><span>Length:</span><span><?php echo $this->block->getFormattedLength();?></span></div>
<?php } else { ?>
<div><span>Length:</span><span><?php echo ($this->md["dcterms:extent"]);?></span></div>
<?php } ?>
@ -74,13 +58,7 @@
<tr class='file-md-qtip-playlist <?php if ($isStatic) echo 'static'; else echo 'dynamic';?>'>
<td class='file-md-qtip-row-width-title'><?php echo $row["track_title"] ?></td>
<td class='file-md-qtip-row-width-artist'><?php echo $row["creator"] ?></td>
<?php if (!$isStatic) { ?>
<?php $criteria = $bl->getCriteria();?>
<?php $len = $bl->getLength();?>
<td class='file-md-qtip-row-width-small'><?php echo $len ?></td>
<?php } else { ?>
<td class='file-md-qtip-row-width-small'><?php echo $row["length"] ?></td>
<?php } ?>
<td class='file-md-qtip-row-width-small'><?php echo $bl->getFormattedLength(); ?></td>
</tr>
<?php } else { ?>
<tr>

View file

@ -17,7 +17,7 @@ if ($item['type'] == 2) {
<span class="ui-icon ui-icon-play"></span>
</div>
<?php elseif ($item['type'] == 2 && $item['exists']): ?>
<div class="big_play ui-state-hover">
<div class="big_play ui-state-hover" blockId="<?php echo $item["item_id"]; ?>">
<span class="ui-icon ui-icon-alert"></span>
</div>
<?php else: ?>
@ -31,9 +31,9 @@ if ($item['type'] == 2) {
<span class="spl_cue ui-state-default"></span>
<?php } else if ($item['type'] == 2) {
if ($staticBlock) {?>
<span class="spl_block_expand close" id="expand_block_<?php echo $item['item_id']?>">Static Block Expand</span>
<span class="spl_block_expand close" blockId="<?php echo $item["item_id"]; ?>" id="expand_block_<?php echo $item["id"]?>">Static Block Expand</span>
<?php } else { ?>
<span class="spl_block_expand close" id="expand_block_<?php echo $item['item_id']?>">Dynamic Block</span>
<span class="spl_block_expand close" blockId="<?php echo $item["item_id"]; ?>" id="expand_block_<?php echo $item["id"]?>">Dynamic Block</span>
<?php }
} ?>
<span class="spl_title"><?php echo $item['track_title'] ?></span>
@ -75,7 +75,7 @@ if ($item['type'] == 2) {
</div>
<?php endif; ?>
<?php if ($item['type'] == 2) {?>
<div id="block_<?php echo $item['item_id']?>_info"></div>
<div id="block_<?php echo $item["id"]?>_info"></div>
<?php } ?>
</li>
<?php $i = $i+1; ?>