diff --git a/airtime_mvc/application/controllers/PreferenceController.php b/airtime_mvc/application/controllers/PreferenceController.php index 44c32d8fa..8e66c31a7 100644 --- a/airtime_mvc/application/controllers/PreferenceController.php +++ b/airtime_mvc/application/controllers/PreferenceController.php @@ -45,6 +45,7 @@ class PreferenceController extends Zend_Controller_Action Application_Model_Preference::SetDefaultCrossfadeDuration($values["stationDefaultCrossfadeDuration"]); Application_Model_Preference::SetDefaultFadeIn($values["stationDefaultFadeIn"]); Application_Model_Preference::SetDefaultFadeOut($values["stationDefaultFadeOut"]); + Application_Model_Preference::SetPodcastAlbumOverride($values["podcastAlbumOverride"]); Application_Model_Preference::SetAllow3rdPartyApi($values["thirdPartyApi"]); Application_Model_Preference::SetAllowedCorsUrls($values["allowedCorsUrls"]); Application_Model_Preference::SetDefaultLocale($values["locale"]); diff --git a/airtime_mvc/application/forms/GeneralPreferences.php b/airtime_mvc/application/forms/GeneralPreferences.php index a87b7fa12..d7ac46f37 100644 --- a/airtime_mvc/application/forms/GeneralPreferences.php +++ b/airtime_mvc/application/forms/GeneralPreferences.php @@ -100,6 +100,24 @@ class Application_Form_GeneralPreferences extends Zend_Form_SubForm 'value' => $defaultFadeOut, )); + + $podcast_album_override = new Zend_Form_Element_Radio('podcastAlbumOverride'); + $podcast_album_override->setLabel(_('Podcast Album Override')); + $podcast_album_override->setMultiOptions(array( + _("Disabled"), + _("Enabled"), + )); + $podcast_album_override->setValue(Application_Model_Preference::GetPodcastAlbumOverride()); + $podcast_album_override->setDescription(_('Enabling this means that podcast tracks will always contain the podcast name in their album field.')); + $podcast_album_override->setSeparator(' '); //No
between radio buttons + //$third_party_api->addDecorator(new Zend_Form_Decorator_Label(array('tag' => 'dd', 'class' => 'radio-inline-list'))); + $podcast_album_override->addDecorator('HtmlTag', array('tag' => 'dd', + 'id'=>"podcastAlbumOverride-element", + 'class' => 'radio-inline-list', + )); + $this->addElement($podcast_album_override); + + $third_party_api = new Zend_Form_Element_Radio('thirdPartyApi'); $third_party_api->setLabel(_('Public Airtime API')); $third_party_api->setDescription(_('Required for embeddable schedule widget.')); diff --git a/airtime_mvc/application/models/Preference.php b/airtime_mvc/application/models/Preference.php index 17f6d69be..e6474af4e 100644 --- a/airtime_mvc/application/models/Preference.php +++ b/airtime_mvc/application/models/Preference.php @@ -365,6 +365,17 @@ class Application_Model_Preference return (strlen($val) == 0 ) ? "1" : $val; } + public static function SetPodcastAlbumOverride($bool) + { + self::setValue("podcast_album_override", $bool); + } + + public static function GetPodcastAlbumOverride() + { + $val = self::getValue("podcast_album_override"); + return $val === '1' ? true : false; + } + public static function SetPhone($phone) { self::setValue("phone", $phone); diff --git a/airtime_mvc/application/services/PodcastEpisodeService.php b/airtime_mvc/application/services/PodcastEpisodeService.php index 4f5628464..6a85f3b12 100644 --- a/airtime_mvc/application/services/PodcastEpisodeService.php +++ b/airtime_mvc/application/services/PodcastEpisodeService.php @@ -150,6 +150,7 @@ class Application_Service_PodcastEpisodeService extends Application_Service_Thir 'callback_url' => $stationUrl . 'rest/media', 'api_key' => $CC_CONFIG["apiKey"][0], 'podcast_name' => $title, + 'album_override' => Application_Model_Preference::GetPodcastAlbumOverride(), ); $task = $this->_executeTask(static::$_CELERY_TASKS[self::DOWNLOAD], $data); // Get the created ThirdPartyTaskReference and set the episode ID so diff --git a/airtime_mvc/application/views/scripts/form/preferences_general.phtml b/airtime_mvc/application/views/scripts/form/preferences_general.phtml index dbae3e2da..61dbfeabe 100644 --- a/airtime_mvc/application/views/scripts/form/preferences_general.phtml +++ b/airtime_mvc/application/views/scripts/form/preferences_general.phtml @@ -31,6 +31,8 @@ element->getElement('stationDefaultCrossfadeDuration')->render() ?> + element->getElement('podcastAlbumOverride')->render() ?> + element->getElement('thirdPartyApi')->render() ?> element->getElement('allowedCorsUrls')->render() ?> diff --git a/python_apps/airtime-celery/airtime-celery/tasks.py b/python_apps/airtime-celery/airtime-celery/tasks.py index d838b54b6..10b8ca2d1 100644 --- a/python_apps/airtime-celery/airtime-celery/tasks.py +++ b/python_apps/airtime-celery/airtime-celery/tasks.py @@ -130,7 +130,7 @@ def soundcloud_delete(token, track_id): @celery.task(name='podcast-download', acks_late=True) -def podcast_download(id, url, callback_url, api_key, podcast_name): +def podcast_download(id, url, callback_url, api_key, podcast_name, album_override): """ Download a podcast episode @@ -138,7 +138,8 @@ def podcast_download(id, url, callback_url, api_key, podcast_name): :param url: download url for the episode :param callback_url: callback URL to send the downloaded file to :param api_key: API key for callback authentication - :param podcast_name: NAme of podcast to be added to id3 metadata for smartblock + :param podcast_name: Name of podcast to be added to id3 metadata for smartblock + :param album_override: Passing whether to override the album id3 even if it exists :return: JSON formatted string of a dictionary of download statuses and file identifiers (for successful uploads) @@ -156,11 +157,10 @@ def podcast_download(id, url, callback_url, api_key, podcast_name): # currently hardcoded for mp3s may want to add support for oggs etc m = MP3(audiofile.name, ID3=EasyID3) logger.debug('podcast_download loaded mp3 {0}'.format(audiofile.name)) - try: - m['album'] - except KeyError: - logger.debug('setting new album name to {0} in podcast'.format(podcast_name.encode('ascii', 'ignore'))) - m['album'] = podcast_name + + # replace album title as needed + m = podcast_override_album(m, podcast_name, album_override) + m.save() filetypeinfo = m.pprint() logger.info('filetypeinfo is {0}'.format(filetypeinfo.encode('ascii', 'ignore'))) @@ -176,6 +176,22 @@ def podcast_download(id, url, callback_url, api_key, podcast_name): obj['status'] = 0 return json.dumps(obj) +def podcast_override_album(m, podcast_name, override): + """ + Override m['album'] if empty or forced with override arg + """ + # if the album override option is enabled replace the album id3 tag with the podcast name even if the album tag contains data + if override is True: + logger.debug('overriding album name to {0} in podcast'.format(podcast_name.encode('ascii', 'ignore'))) + m['album'] = podcast_name + else: + # replace the album id3 tag with the podcast name if the album tag is empty + try: + m['album'] + except KeyError: + logger.debug('setting new album name to {0} in podcast'.format(podcast_name.encode('ascii', 'ignore'))) + m['album'] = podcast_name + return m def get_filename(r): """