From 647de9ed39df042aebe09055a9867f9171f7fd75 Mon Sep 17 00:00:00 2001 From: denise Date: Thu, 19 Jul 2012 18:07:39 -0400 Subject: [PATCH 1/9] CC-84: Smart Playlists - started storing last played time in cc_files - db column (lptime) already existed but was not being used before this - will use this as a criteria for smart playlists --- .../application/controllers/ApiController.php | 12 ++++++++++ airtime_mvc/application/models/Schedule.php | 6 +++++ airtime_mvc/application/models/StoredFile.php | 24 +++++++++++++------ 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/airtime_mvc/application/controllers/ApiController.php b/airtime_mvc/application/controllers/ApiController.php index f3e44f5c4..3faa771e9 100644 --- a/airtime_mvc/application/controllers/ApiController.php +++ b/airtime_mvc/application/controllers/ApiController.php @@ -349,6 +349,18 @@ class ApiController extends Zend_Controller_Action $schedule_group_id = $this->_getParam("schedule_id"); $media_id = $this->_getParam("media_id"); $result = Application_Model_Schedule::UpdateMediaPlayedStatus($media_id); + + //set a 'last played' timestamp for media item + //needed for smart playlists + try{ + $file_id = Application_Model_Schedule::GetFileId($media_id); + $file = Application_Model_StoredFile::Recall($file_id); + $now = new DateTime("now", new DateTimeZone("UTC")); + $file->setLastPlayedTime($now); + }catch(Exception $e){ + Logging::log($e); + } + echo json_encode(array("status"=>1, "message"=>"")); } diff --git a/airtime_mvc/application/models/Schedule.php b/airtime_mvc/application/models/Schedule.php index 2db022b50..57920904f 100644 --- a/airtime_mvc/application/models/Schedule.php +++ b/airtime_mvc/application/models/Schedule.php @@ -966,4 +966,10 @@ class Application_Model_Schedule return $overlapping; } + + public static function GetFileId($p_scheduleId) + { + $scheduledItem = CcScheduleQuery::create()->findPK($p_scheduleId); + return $scheduledItem->getDbFileId(); + } } diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index abc6bb9b6..37bd9f5fb 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -79,6 +79,19 @@ class Application_Model_StoredFile { $this->_file->setDbFtype($p_format); } + + /* This function is only called after liquidsoap + * has notified that a track has started playing. + */ + public function setLastPlayedTime($p_now) + { + $this->_file->setDbLPtime($p_now); + /* Normally we would only call save after all columns have been set + * like in setDbColMetadata(). But since we are only setting one + * column in this case it is OK. + */ + $this->_file->save(); + } /** * Set multiple metadata values using defined metadata constants. @@ -120,9 +133,6 @@ class Application_Model_StoredFile } $this->setDbColMetadata($dbMd); } - - $this->_file->setDbMtime(new DateTime("now"), new DateTimeZone("UTC")); - $this->_file->save(); } /** @@ -152,8 +162,8 @@ class Application_Model_StoredFile } } } - - $this->_file->setDbMtime(new DateTime("now"), new DateTimeZone("UTC")); +Logging::log(new DateTime("now", new DateTimeZone("UTC"))); + $this->_file->setDbMtime(new DateTime("now", new DateTimeZone("UTC"))); $this->_file->save(); } @@ -476,8 +486,8 @@ Logging::log("getting media! - 2"); { $file = new CcFiles(); $file->setDbGunid(md5(uniqid("", true))); - $file->setDbUtime(new DateTime("now"), new DateTimeZone("UTC")); - $file->setDbMtime(new DateTime("now"), new DateTimeZone("UTC")); + $file->setDbUtime(new DateTime("now", new DateTimeZone("UTC"))); + $file->setDbMtime(new DateTime("now", new DateTimeZone("UTC"))); $storedFile = new Application_Model_StoredFile(); $storedFile->_file = $file; From 624986e9736b4f4146c0288e3b81bdb63c2b9bfc Mon Sep 17 00:00:00 2001 From: denise Date: Thu, 19 Jul 2012 18:11:31 -0400 Subject: [PATCH 2/9] - removed unnecessary logging line --- airtime_mvc/application/models/StoredFile.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index 37bd9f5fb..bafaffb35 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -162,7 +162,7 @@ class Application_Model_StoredFile } } } -Logging::log(new DateTime("now", new DateTimeZone("UTC"))); + $this->_file->setDbMtime(new DateTime("now", new DateTimeZone("UTC"))); $this->_file->save(); } From 14712d4d7833f4b28b77cf0b4459e1b63d4b8c79 Mon Sep 17 00:00:00 2001 From: denise Date: Thu, 19 Jul 2012 19:09:51 -0400 Subject: [PATCH 3/9] CC-84: Smart Playlists - fixed undefined index warnings --- airtime_mvc/application/models/Playlist.php | 58 +++++++++++---------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/airtime_mvc/application/models/Playlist.php b/airtime_mvc/application/models/Playlist.php index 4f9c6d764..003e2a6a0 100644 --- a/airtime_mvc/application/models/Playlist.php +++ b/airtime_mvc/application/models/Playlist.php @@ -1099,37 +1099,41 @@ class Application_Model_Playlist } $qry = CcFilesQuery::create(); - foreach ($storedCrit["crit"] as $criteria) { - $spCriteriaPhpName = self::$criteria2PeerMap[$criteria['criteria']]; - $spCriteria = $criteria['criteria']; - - $spCriteriaModifier = $criteria['modifier']; - $spCriteriaValue = $criteria['value']; - if ($spCriteriaModifier == "starts with") { - $spCriteriaValue = "$spCriteriaValue%"; - } else if ($spCriteriaModifier == "ends with") { - $spCriteriaValue = "%$spCriteriaValue"; - } else if ($spCriteriaModifier == "contains" || $spCriteriaModifier == "does not contain") { - $spCriteriaValue = "%$spCriteriaValue%"; - } else if ($spCriteriaModifier == "is in the range") { - $spCriteriaValue = "$spCriteria > '$spCriteriaValue' AND $spCriteria < '$criteria[extra]'"; - } - $spCriteriaModifier = self::$modifier2CriteriaMap[$spCriteriaModifier]; - try{ - $qry->filterBy($spCriteriaPhpName, $spCriteriaValue, $spCriteriaModifier); - $qry->addAscendingOrderByColumn('random()'); - }catch (Exception $e){ - Logging::log($e); + if (isset($storedCrit["crit"])) { + foreach ($storedCrit["crit"] as $criteria) { + $spCriteriaPhpName = self::$criteria2PeerMap[$criteria['criteria']]; + $spCriteria = $criteria['criteria']; + + $spCriteriaModifier = $criteria['modifier']; + $spCriteriaValue = $criteria['value']; + if ($spCriteriaModifier == "starts with") { + $spCriteriaValue = "$spCriteriaValue%"; + } else if ($spCriteriaModifier == "ends with") { + $spCriteriaValue = "%$spCriteriaValue"; + } else if ($spCriteriaModifier == "contains" || $spCriteriaModifier == "does not contain") { + $spCriteriaValue = "%$spCriteriaValue%"; + } else if ($spCriteriaModifier == "is in the range") { + $spCriteriaValue = "$spCriteria > '$spCriteriaValue' AND $spCriteria < '$criteria[extra]'"; + } + $spCriteriaModifier = self::$modifier2CriteriaMap[$spCriteriaModifier]; + try{ + $qry->filterBy($spCriteriaPhpName, $spCriteriaValue, $spCriteriaModifier); + $qry->addAscendingOrderByColumn('random()'); + }catch (Exception $e){ + Logging::log($e); + } } } // 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; + if (isset($storedCrit['limit'])) { + 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{ $out = $qry->setFormatter(ModelCriteria::FORMAT_ON_DEMAND)->find(); From d801139a124ad4190f6f83a1bbcff5af1efd4247 Mon Sep 17 00:00:00 2001 From: denise Date: Thu, 19 Jul 2012 19:11:42 -0400 Subject: [PATCH 4/9] CC-84: Smart Playlists - utime and mtime in library were displaying in UTC --- airtime_mvc/application/models/StoredFile.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index bafaffb35..accb02f9d 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -723,6 +723,15 @@ Logging::log("getting media! - 2"); $formatter = new BitrateFormatter($row['bit_rate']); $row['bit_rate'] = $formatter->format(); } + + //convert mtime and utime to localtime + $row['mtime'] = new DateTime($row['mtime'], new DateTimeZone('UTC')); + $row['mtime']->setTimeZone(new DateTimeZone(date_default_timezone_get())); + $row['mtime'] = $row['mtime']->format('Y-m-d H:i:s'); + + $row['utime'] = new DateTime($row['utime'], new DateTimeZone('UTC')); + $row['utime']->setTimeZone(new DateTimeZone(date_default_timezone_get())); + $row['utime'] = $row['utime']->format('Y-m-d H:i:s'); // add checkbox row $row['checkbox'] = ""; From a67b2fa3002de3ec47205c3900d8f77ef8c080e9 Mon Sep 17 00:00:00 2001 From: denise Date: Fri, 20 Jul 2012 11:25:54 -0400 Subject: [PATCH 5/9] CC-84: Smart Playlists - removed soundcloud_id criteria - added last_played criteria --- airtime_mvc/application/forms/SmartPlaylistCriteria.php | 6 +++--- airtime_mvc/application/models/Playlist.php | 2 +- .../public/js/airtime/playlist/smart_playlistbuilder.js | 9 +++++---- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/airtime_mvc/application/forms/SmartPlaylistCriteria.php b/airtime_mvc/application/forms/SmartPlaylistCriteria.php index 2ac39aeb5..432c1c719 100644 --- a/airtime_mvc/application/forms/SmartPlaylistCriteria.php +++ b/airtime_mvc/application/forms/SmartPlaylistCriteria.php @@ -21,6 +21,7 @@ class Application_Form_SmartPlaylistCriteria extends Zend_Form_SubForm "label" => "Label", "language" => "Language", "mtime" => "Last Modified", + "lptime" => "Last Played", "length" => "Length", "lyricist" => "Lyricist", "mood" => "Mood", @@ -29,7 +30,6 @@ class Application_Form_SmartPlaylistCriteria extends Zend_Form_SubForm "radio_station_name" => "Radio Station Name", "rating" => "Rating", "sample_rate" => "Sample Rate", - "soundcloud_id" => "Soundcloud Upload", "track_title" => "Title", "track_num" => "Track Number", "utime" => "Uploaded", @@ -46,7 +46,8 @@ class Application_Form_SmartPlaylistCriteria extends Zend_Form_SubForm "composer" => "s", "conductor" => "s", "utime" => "n", - "mtime" => "n", + "mtime" => "n", + "lptime" => "n", "disc_number" => "n", "genre" => "s", "isrc_number" => "s", @@ -60,7 +61,6 @@ class Application_Form_SmartPlaylistCriteria extends Zend_Form_SubForm "radio_station_name" => "s", "rating" => "n", "sample_rate" => "n", - "soundcloud_id" => "n", "track_title" => "s", "track_num" => "n", "year" => "n" diff --git a/airtime_mvc/application/models/Playlist.php b/airtime_mvc/application/models/Playlist.php index 003e2a6a0..cfd1c80d0 100644 --- a/airtime_mvc/application/models/Playlist.php +++ b/airtime_mvc/application/models/Playlist.php @@ -68,6 +68,7 @@ class Application_Model_Playlist "conductor" => "DbConductor", "utime" => "DbUtime", "mtime" => "DbMtime", + "lptime" => "DbLPtime", "disc_number" => "DbDiscNumber", "genre" => "DbGenre", "isrc_number" => "DbIsrcNumber", @@ -81,7 +82,6 @@ class Application_Model_Playlist "radio_station_name" => "DbRadioStation", "rating" => "DbRating", "sample_rate" => "DbSampleRate", - "soundcloud_id" => "DbSoundcloudId", "track_title" => "DbTrackTitle", "track_num" => "DbTrackNum", "year" => "DbYear" diff --git a/airtime_mvc/public/js/airtime/playlist/smart_playlistbuilder.js b/airtime_mvc/public/js/airtime/playlist/smart_playlistbuilder.js index 76d2fd20e..914c77bbc 100644 --- a/airtime_mvc/public/js/airtime/playlist/smart_playlistbuilder.js +++ b/airtime_mvc/public/js/airtime/playlist/smart_playlistbuilder.js @@ -279,7 +279,7 @@ function callback(data, type) { if (type == 'shuffle') { form.find('.success').text('Playlist shuffled'); } else { - form.find('.success').text('Smart playlist generated'); + form.find('.success').text('Smart playlist generated and saved'); } form.find('.success').show(); form.find('#smart_playlist_options').removeClass("closed"); @@ -287,8 +287,9 @@ function callback(data, type) { form.find('.success').text('Criteria saved'); form.find('.success').show(); - /* Update number of files that meet criteria and - * change icon to success/warning as appropriate + /* Update number of files that meet criteria and change icon to success/warning + * as appropriate. This is also done in the form but we do not pass the form + * back on a 'Save' callback. */ if (json.poolCount > 1) { $('#sp_pool_count').text(json.poolCount+' files meet the criteria'); @@ -358,6 +359,7 @@ var criteriaTypes = { "conductor" : "s", "utime" : "n", "mtime" : "n", + "lptime" : "n", "disc_number" : "n", "genre" : "s", "isrc_number" : "s", @@ -371,7 +373,6 @@ var criteriaTypes = { "radio_station_name" : "s", "rating" : "n", "sample_rate" : "n", - "soundcloud_id" : "n", "track_title" : "s", "track_num" : "n", "year" : "n" From 9bdb4a40e0f460d0b0c3ac413f1f6866ad6eccd8 Mon Sep 17 00:00:00 2001 From: denise Date: Fri, 20 Jul 2012 12:32:18 -0400 Subject: [PATCH 6/9] CC-84: Smart Playlists -fixed playlist type spacing on UI --- .../views/scripts/form/smart-playlist-criteria.phtml | 6 +++--- airtime_mvc/public/css/styles.css | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/airtime_mvc/application/views/scripts/form/smart-playlist-criteria.phtml b/airtime_mvc/application/views/scripts/form/smart-playlist-criteria.phtml index 4f42542ce..621b49c27 100644 --- a/airtime_mvc/application/views/scripts/form/smart-playlist-criteria.phtml +++ b/airtime_mvc/application/views/scripts/form/smart-playlist-criteria.phtml @@ -3,8 +3,8 @@ Smart Playlist Options
-
-
+ @@ -12,7 +12,7 @@ $value = $this->element->getElement('sp_type')->getValue(); foreach ($this->element->getElement('sp_type')->getMultiOptions() as $radio) : ?> -