diff --git a/airtime_mvc/application/common/TaskManager.php b/airtime_mvc/application/common/TaskManager.php index 0425f340c..4acbd9387 100644 --- a/airtime_mvc/application/common/TaskManager.php +++ b/airtime_mvc/application/common/TaskManager.php @@ -310,7 +310,7 @@ class StationPodcastTask implements AirtimeTask { class TaskFactory { /** - * PHP doesn't have ENUMs so declare them as interface constants + * PHP doesn't have ENUMs so declare them as constants * Task types - values don't really matter as long as they're unique */ diff --git a/airtime_mvc/application/controllers/LibraryController.php b/airtime_mvc/application/controllers/LibraryController.php index 452451547..06139e93f 100644 --- a/airtime_mvc/application/controllers/LibraryController.php +++ b/airtime_mvc/application/controllers/LibraryController.php @@ -222,7 +222,6 @@ class LibraryController extends Zend_Controller_Action $message = null; $noPermissionMsg = _("You don't have permission to delete selected items."); - Logging::info($mediaItems); foreach ($mediaItems as $media) { if ($media["type"] === "audioclip") { diff --git a/airtime_mvc/application/services/PodcastEpisodeService.php b/airtime_mvc/application/services/PodcastEpisodeService.php index d54850193..896691a3c 100644 --- a/airtime_mvc/application/services/PodcastEpisodeService.php +++ b/airtime_mvc/application/services/PodcastEpisodeService.php @@ -288,6 +288,12 @@ class Application_Service_PodcastEpisodeService extends Application_Service_Thir $episodesArray = array(); foreach ($rss->get_items() as $item) { + // If the enclosure is empty, this isn't a podcast episode + $enclosure = $item->get_enclosure(); + $url = $enclosure instanceof SimplePie_Enclosure ? $enclosure->get_link() : $enclosure["link"]; + if (empty($url)) { + continue; + } $itemId = $item->get_id(); $ingested = in_array($itemId, $episodeIds) ? (empty($episodeFiles[$itemId]) ? -1 : 1) : 0; $file = $ingested > 0 && !empty($episodeFiles[$itemId]) ? diff --git a/airtime_mvc/application/services/PodcastService.php b/airtime_mvc/application/services/PodcastService.php index 9689ff758..509eadb35 100644 --- a/airtime_mvc/application/services/PodcastService.php +++ b/airtime_mvc/application/services/PodcastService.php @@ -86,8 +86,17 @@ class Application_Service_PodcastService $podcastArray["link"] = htmlspecialchars($rss->get_link()); $podcastArray["language"] = htmlspecialchars($rss->get_language()); $podcastArray["copyright"] = htmlspecialchars($rss->get_copyright()); - $podcastArray["creator"] = htmlspecialchars($rss->get_author()->get_name()); - $podcastArray["category"] = htmlspecialchars($rss->get_categories()); + + $name = empty($rss->get_author()) ? "" : $rss->get_author()->get_name(); + $podcastArray["creator"] = htmlspecialchars($name); + + $categories = array(); + if (is_array($rss->get_categories())) { + foreach ($rss->get_categories() as $category) { + array_push($categories, $category->get_scheme() . ":" . $category->get_term()); + } + } + $podcastArray["category"] = htmlspecialchars(implode($categories)); //TODO: put in constants $itunesChannel = "http://www.itunes.com/dtds/podcast-1.0.dtd"; @@ -97,9 +106,11 @@ class Application_Service_PodcastService $itunesCategory = $rss->get_channel_tags($itunesChannel, 'category'); $categoryArray = array(); - foreach ($itunesCategory as $c => $data) { - foreach ($data["attribs"] as $attrib) { - array_push($categoryArray, $attrib["text"]); + if (is_array($itunesCategory)) { + foreach ($itunesCategory as $c => $data) { + foreach ($data["attribs"] as $attrib) { + array_push($categoryArray, $attrib["text"]); + } } } $podcastArray["itunes_category"] = implode(",", $categoryArray); @@ -128,6 +139,7 @@ class Application_Service_PodcastService $importedPodcast = new ImportedPodcast(); $importedPodcast->fromArray($podcastArray, BasePeer::TYPE_FIELDNAME); $importedPodcast->setPodcast($podcast); + $importedPodcast->setDbAutoIngest(true); $importedPodcast->save(); return $podcast->toArray(BasePeer::TYPE_FIELDNAME); diff --git a/airtime_mvc/application/views/scripts/podcast/podcast.phtml b/airtime_mvc/application/views/scripts/podcast/podcast.phtml index 0277ec0c7..13745479b 100644 --- a/airtime_mvc/application/views/scripts/podcast/podcast.phtml +++ b/airtime_mvc/application/views/scripts/podcast/podcast.phtml @@ -18,7 +18,7 @@ -
+
diff --git a/airtime_mvc/application/views/scripts/podcast/station_podcast.phtml b/airtime_mvc/application/views/scripts/podcast/station_podcast.phtml index fb183d38b..e9c24c6f0 100644 --- a/airtime_mvc/application/views/scripts/podcast/station_podcast.phtml +++ b/airtime_mvc/application/views/scripts/podcast/station_podcast.phtml @@ -54,22 +54,22 @@
- + - + - + - + - + - +
diff --git a/airtime_mvc/public/js/airtime/library/library.js b/airtime_mvc/public/js/airtime/library/library.js index 94e560ed9..3c7cf7151 100644 --- a/airtime_mvc/public/js/airtime/library/library.js +++ b/airtime_mvc/public/js/airtime/library/library.js @@ -1274,7 +1274,7 @@ var AIRTIME = (function(AIRTIME) { var dialog = $("#podcast_episode_dialog").html(episode.description); dialog.html(dialog.text()); dialog.dialog({ - title: $.i18n._(episode.title), + title: episode.title, width: "auto", height: "auto", modal: true, diff --git a/airtime_mvc/public/js/airtime/library/podcast.js b/airtime_mvc/public/js/airtime/library/podcast.js index 61dd16868..cecdb7e91 100644 --- a/airtime_mvc/public/js/airtime/library/podcast.js +++ b/airtime_mvc/public/js/airtime/library/podcast.js @@ -12,12 +12,12 @@ var AIRTIME = (function (AIRTIME) { /** * PodcastController constructor. * - * @param {Object} $scope angular scope service object - * @param {Object} $http angular http service object - * @param {Object} podcast podcast metadata object - * @param {int} podcast.id podcast unique identifier - * @param {string} podcast.title podcast metadata title - * @param {Tab} tab Tab object the controller is being bootstrapped in + * @param {angular.scope} $scope angular scope service object + * @param {angular.http} $http angular http service object + * @param {Object} podcast podcast metadata object + * @param {int} podcast.id podcast unique identifier + * @param {string} podcast.title podcast metadata title + * @param {Tab} tab Tab object the controller is being bootstrapped in * * @constructor */ @@ -80,6 +80,9 @@ var AIRTIME = (function (AIRTIME) { * @private */ PodcastController.prototype._initTable = function() { + /* + * Remove the episode table for imported podcasts since its functionality is replicated in the left-hand pane + * var self = this, $scope = self.$scope; // We want to fetch the data statically for imported podcasts because we would need to implement sorting @@ -91,12 +94,12 @@ var AIRTIME = (function (AIRTIME) { // If we load sequentially there's a delay before the table appears aaData : {}, aoColumns : [ - /* GUID */ { "sTitle" : "" , "mDataProp" : "guid" , "sClass" : "podcast_episodes_guid" , "bVisible" : false }, - /* Title */ { "sTitle" : $.i18n._("Title") , "mDataProp" : "title" , "sClass" : "podcast_episodes_title" , "sWidth" : "170px" }, - /* Author */ { "sTitle" : $.i18n._("Author") , "mDataProp" : "author" , "sClass" : "podcast_episodes_author" , "sWidth" : "170px" }, - /* Description */ { "sTitle" : $.i18n._("Description") , "mDataProp" : "description" , "sClass" : "podcast_episodes_description" , "sWidth" : "300px" }, - /* Link */ { "sTitle" : $.i18n._("Link") , "mDataProp" : "link" , "sClass" : "podcast_episodes_link" , "sWidth" : "170px" }, - /* Publication Date */ { "sTitle" : $.i18n._("Publication Date") , "mDataProp" : "pub_date" , "sClass" : "podcast_episodes_pub_date" , "sWidth" : "170px" } + { "sTitle" : "" , "mDataProp" : "guid" , "sClass" : "podcast_episodes_guid" , "bVisible" : false }, + { "sTitle" : $.i18n._("Title") , "mDataProp" : "title" , "sClass" : "podcast_episodes_title" , "sWidth" : "170px" }, + { "sTitle" : $.i18n._("Author") , "mDataProp" : "author" , "sClass" : "podcast_episodes_author" , "sWidth" : "170px" }, + { "sTitle" : $.i18n._("Description") , "mDataProp" : "description" , "sClass" : "podcast_episodes_description" , "sWidth" : "300px" }, + { "sTitle" : $.i18n._("Link") , "mDataProp" : "link" , "sClass" : "podcast_episodes_link" , "sWidth" : "170px" }, + { "sTitle" : $.i18n._("Publication Date") , "mDataProp" : "pub_date" , "sClass" : "podcast_episodes_pub_date" , "sWidth" : "170px" } ] }, buttons = { @@ -127,6 +130,7 @@ var AIRTIME = (function (AIRTIME) { } ); self.reloadEpisodeTable(); + */ }; /** @@ -151,10 +155,12 @@ var AIRTIME = (function (AIRTIME) { /** * StationPodcastController constructor. * - * @param {{}} $scope angular scope service object - * @param {{}} $http angular http service object - * @param {{}} podcast podcast metadata object - * @param {Tab} tab Tab object the controller is being bootstrapped in + * @param {angular.scope} $scope angular scope service object + * @param {angular.http} $http angular http service object + * @param {Object} podcast podcast metadata object + * @param {int} podcast.id podcast unique identifier + * @param {string} podcast.title podcast metadata title + * @param {Tab} tab Tab object the controller is being bootstrapped in * * @constructor */ @@ -496,6 +502,10 @@ var AIRTIME = (function (AIRTIME) { mod.addPodcast = function () { $.post(endpoint, $("#podcast_url_dialog").find("form").serialize(), function(json) { _initAppFromResponse(json); + // Open the episode view for the newly created podcast in the left-hand pane + AIRTIME.library.podcastEpisodeTableWidget.reload(JSON.parse(json.podcast).id); + AIRTIME.library.podcastTableWidget.clearSelection(); + AIRTIME.library.setCurrentTable(AIRTIME.library.DataTableTypeEnum.PODCAST_EPISODES); $("#podcast_url_dialog").dialog("close"); }); }; @@ -613,7 +623,7 @@ var AIRTIME = (function (AIRTIME) { var selected = self.getSelectedRows().length, container, width = self._$wrapperDOMNode.closest(".dataTables_wrapper").outerWidth(), message; - message = sprintf($.i18n._("Adding %s Item%s"), selected, selected > 1 ? "s" : ""); + message = sprintf($.i18n._(selected > 1 ? "Adding %s Items" : "Adding %s Item"), selected); container = $('
').attr('id', 'draggingContainer').append('') .find("tr").append('').find("td") .attr("colspan", 100).width(width).css("max-width", "none")