CC-84: Smart Playlists

- static playlist is done.
This commit is contained in:
James 2012-07-16 17:18:37 -04:00
parent 1bb97c8603
commit fc09baacd7
4 changed files with 114 additions and 19 deletions

View File

@ -70,7 +70,7 @@ class PlaylistController extends Zend_Controller_Action
unset($this->view->pl); unset($this->view->pl);
} }
private function createFullResponse($pl = null) private function createFullResponse($pl = null, $isJson = false)
{ {
if (isset($pl)) { if (isset($pl)) {
$formatter = new LengthFormatter($pl->getLength()); $formatter = new LengthFormatter($pl->getLength());
@ -84,11 +84,19 @@ class PlaylistController extends Zend_Controller_Action
$this->view->pl = $pl; $this->view->pl = $pl;
$this->view->id = $pl->getId(); $this->view->id = $pl->getId();
$this->view->html = $this->view->render('playlist/playlist.phtml'); if ($isJson){
return $this->view->render('playlist/playlist.phtml');
}else{
$this->view->html = $this->view->render('playlist/playlist.phtml');
}
unset($this->view->pl); unset($this->view->pl);
} }
else { else {
$this->view->html = $this->view->render('playlist/playlist.phtml'); if ($isJson){
return $this->view->render('playlist/playlist.phtml');
}else{
$this->view->html = $this->view->render('playlist/playlist.phtml');
}
} }
} }
@ -451,15 +459,41 @@ class PlaylistController extends Zend_Controller_Action
$params = $request->getPost(); $params = $request->getPost();
$result = Application_Model_Playlist::saveSmartPlaylistCriteria($params['data'], $params['pl_id']); $result = Application_Model_Playlist::saveSmartPlaylistCriteria($params['data'], $params['pl_id']);
die(json_encode($result)); die(json_encode($result));
/*if ($result['result'] != 0) {
die(json_encode($result));
} else{
try {
$pl = new Application_Model_Playlist($params['pl_id']);
$this->createFullResponse($pl);
}
catch (PlaylistNotFoundException $e) {
$this->playlistNotFound();
}
catch (Exception $e) {
$this->playlistUnknownError($e);
}
}*/
} }
public function smartPlaylistGenerateAction() public function smartPlaylistGenerateAction()
{ {
$request = $this->getRequest(); $request = $this->getRequest();
$params = $request->getPost(); $params = $request->getPost();
Logging::log($params);
$result = Application_Model_Playlist::generateSmartPlaylist($params['data'], $params['pl_id']); $result = Application_Model_Playlist::generateSmartPlaylist($params['data'], $params['pl_id']);
die(json_encode($result)); if ($result['result'] == 0) {
try {
$pl = new Application_Model_Playlist($params['pl_id']);
die(json_encode(array("result"=>0, "html"=>$this->createFullResponse($pl, true))));
}
catch (PlaylistNotFoundException $e) {
$this->playlistNotFound();
}
catch (Exception $e) {
$this->playlistUnknownError($e);
}
}else{
die(json_encode($result));
}
} }
public function smartPlaylistGetAction() public function smartPlaylistGetAction()

View File

@ -848,6 +848,15 @@ class Application_Model_Playlist {
CcPlaylistQuery::create()->findPKs($p_ids)->delete(); CcPlaylistQuery::create()->findPKs($p_ids)->delete();
} }
/**
* Delete all files from playlist
* @param int $p_playlistId
*/
public static function deleteAllFilesFromPlaylist($p_playlistId)
{
CcPlaylistcontentsQuery::create()->findByDbPlaylistId($p_playlistId)->delete();
}
// smart playlist functions start // smart playlist functions start
/** /**
@ -963,34 +972,80 @@ class Application_Model_Playlist {
$result = self::saveSmartPlaylistCriteria($p_criteria, $p_playlistId); $result = self::saveSmartPlaylistCriteria($p_criteria, $p_playlistId);
if ($result['result'] != 0) { if ($result['result'] != 0) {
return $result; return $result;
}else{ } else {
//$data = self::organizeSmartPlyalistCriteria($p_criteria); $info = self::getListofFilesMeetCriteria($p_playlistId);
$list = self::getListofFilesMeetCriteria($p_playlist_id); $files = $info['files'];
return array("result"=>0); $limit = $info['limit'];
// construct ids of track candidates
self::deleteAllFilesFromPlaylist($p_playlistId);
$playlist = new self($p_playlistId);
$insertList = array();
$totalTime = 0;
while ($totalTime < $limit['time'] && !empty($files)) {
$key = array_rand($files);
$insertList[$key] = $files[$key];
$totalTime += $files[$key];
unset($files[$key]);
if ( !is_null($limit['items']) && $limit['items'] == count($insertList)) {
break;
}
}
$playlist->addAudioClips(array_keys($insertList));
return array("result"=>0, "ids"=>array_keys($insertList));
} }
} }
// this function return list of propel object // this function return list of propel object
private static function getListofFilesMeetCriteria($p_playlist_id) private static function getListofFilesMeetCriteria($p_playlistId)
{ {
$c = new Criteria(); $c = new Criteria();
$c->add(CcPlaylistcriteriaPeer::PLAYLIST_ID, $p_playlistId);
$out = CcPlaylistcriteriaPeer::doSelect($c);
foreach ($p_data as $criteria) { $storedCrit = array();
$spCriteria = self::$criteria2PeerMap[$criteria['sp_criteria_field']]; foreach ($out as $crit) {
$spCriteriaModifier = $criteria['sp_criteria_modifier']; $criteria = $crit->getDbCriteria();
$spCriteriaValue = $criteria['sp_criteria_value']; $modifier = $crit->getDbModifier();
$value = $crit->getDbValue();
$extra = $crit->getDbExtra();
if($criteria == "limit"){
$storedCrit["limit"] = array("value"=>$value, "modifier"=>$modifier);
}else{
$storedCrit["crit"][] = array("criteria"=>$criteria, "value"=>$value, "modifier"=>$modifier, "extra"=>$extra);
}
}
$ccFileCriteria = new Criteria();
foreach ($storedCrit["crit"] as $criteria) {
$spCriteria = self::$criteria2PeerMap[$criteria['criteria']];
$spCriteriaModifier = $criteria['modifier'];
$spCriteriaValue = $criteria['value'];
if ($spCriteriaModifier == "starts with") { if ($spCriteriaModifier == "starts with") {
$spCriteriaValue = "$spCriteriaValue%"; $spCriteriaValue = "$spCriteriaValue%";
} else if ($spCriteriaModifier == "ends with") { } else if ($spCriteriaModifier == "ends with") {
$spCriteriaValue = "%$spCriteriaValue"; $spCriteriaValue = "%$spCriteriaValue";
} else if ($spCriteriaModifier == "is in the range") { } else if ($spCriteriaModifier == "is in the range") {
$spCriteriaValue = "$spCriteria > '$spCriteriaValue' AND $spCriteria < '$criteria[sp_criteria_extra]'"; $spCriteriaValue = "$spCriteria > '$spCriteriaValue' AND $spCriteria < '$criteria[extra]'";
} }
$spCriteriaModifier = self::$modifier2CriteriaMap[$spCriteriaModifier]; $spCriteriaModifier = self::$modifier2CriteriaMap[$spCriteriaModifier];
$c->add($spCriteria, $spCriteriaValue, $spCriteriaModifier); $ccFileCriteria->add($spCriteria, $spCriteriaValue, $spCriteriaModifier);
}
// construct limit restriction
$limits = array();
if ($storedCrit['limit']['modifier'] == "items") {
$limits['time'] = 1440 * 60;
$limits['items'] = $storedCrit['limit']['value'];
} else {
$limits['time'] = $storedCrit['limit']['modifier'] == "hours" ? intval($storedCrit['limit']['value']) * 60 * 60 : intval($storedCrit['limit']['value'] * 60);
$limits['items'] = null;
} }
try{ try{
$out = CcFilesPeer::doSelect($c); $out = CcFilesPeer::doSelect($ccFileCriteria);
$files = array();
foreach ($out as $file) {
$files[$file->getDbId()] = Application_Common_DateHelper::calculateLengthInSeconds($file->getDbLength());
}
return array("files"=>$files, "limit"=>$limits);
}catch(Exception $e){ }catch(Exception $e){
//Logging::log($e); //Logging::log($e);
} }

View File

@ -658,6 +658,10 @@ var AIRTIME = (function(AIRTIME){
}); });
}; };
mod.fnOpenPlaylist = function(json) {
openPlaylist(json);
};
mod.enableUI = function() { mod.enableUI = function() {
$lib.unblock(); $lib.unblock();

View File

@ -221,9 +221,11 @@ function staticCallback(data) {
}); });
}); });
} else { } else {
AIRTIME.playlist.fnAddItems(json.ids, null, 'after'); AIRTIME.playlist.fnOpenPlaylist(json);
var form = $('#smart-playlist-form');
form.find('.success').text('Smart playlist generated'); form.find('.success').text('Smart playlist generated');
form.find('.success').show(); form.find('.success').show();
form.find('#smart_playlist_options').removeClass("closed");
} }
} }