"""Logic Tier for Feed.""" from podcast.constants import common from podcast.constants import error from podcast.constants.episode_replication_status import REPLICATION_TYPE_BULK from podcast.logic import episode as episode_logic from podcast.logic import megaphone from podcast.logic import podcast as podcast_logic from podcast.logic import user as user_logic from podcast.logic import user_v2 as user_v2_logic from podcast.models import ows_asset_transcoder as oat from podcast.models import podcast as podcast_model from podcast.models import podcast_season as podcast_season_model from podcast.utils import exc def create_feed(data): """Create feed function. Returns: dict: containing a dict with the created feed. """ show_family_id = data['show_family_id'] user_logic.current_user_has_read_only_access_then_raise() user_v2_logic.current_user_owns_show_family_or_raise(show_family_id) podcast = podcast_model.get_podcast_by_id(data['podcast_id']) if not podcast: raise exc.OwsError.not_found(error.ERROR_PODCAST_NOT_FOUND) artwork_filename = data.pop('artwork_filename') episode_ids = data.get('episode_ids') original_podcast_id = podcast['id'] original_podcast_seasons = podcast.get('seasons') feed_type = data['feed_type'] feed_data = { 'title': data['title'], 'description': data['description'], 'feed_type': feed_type, 'show_family_id': show_family_id, 'network_id': podcast['network_id'], 'host': podcast['host'], 'owner': podcast['owner'], 'copyright': podcast['copyright'], 'email': podcast['email'], 'explicit': podcast['explicit'], 'show_type': podcast['show_type'], 'language': podcast['language'], 'categories': podcast['categories'], 'link': podcast.get('link') } if feed_type in [common.APPLE_SUBSCRIPTION, common.YOUTUBE]: feed_data['channel_id'] = data['channel_id'] elif feed_type in [common.PUBLIC_RSS, common.PRIVATE_RSS]: feed_data['slug'] = data['slug'] created_podcast = podcast_model.create_podcast(feed_data) podcast_id = created_podcast['id'] new_podcast_seasons = None is_serial_show = podcast['show_type'] == common.SHOW_TYPE_SERIAL if original_podcast_seasons and is_serial_show: seasons_data = [ {'name': season['name'], 'number': season['number']} for season in original_podcast_seasons ] new_podcast_seasons = podcast_season_model.create_seasons(podcast_id, seasons_data, False) if artwork_filename: oat.commit(artwork_filename, podcast_id) if feed_type in [common.PUBLIC_RSS, common.PRIVATE_RSS]: podcast_art = podcast_logic.validate_artwork_asset(podcast_id) if artwork_filename else {} megaphone_response = megaphone.create_or_update_podcast(None, created_podcast, podcast_art) new_feed = podcast_model.update_podcast(podcast_id, {'megaphone_id': megaphone_response['id']}) else: new_feed = created_podcast if episode_ids: is_copy_apple_episode_id = feed_type == common.APPLE_SUBSCRIPTION and podcast['feed_type'] == common.PUBLIC_RSS is_copy_ad_locations = data.get('is_copy_ad_locations') and feed_type == common.PUBLIC_RSS and \ podcast['feed_type'] == common.PUBLIC_RSS episode_logic.replicate_episodes_and_create_assets( original_podcast_id, podcast_id, episode_ids, new_podcast_seasons, REPLICATION_TYPE_BULK, is_copy_apple_episode_id, is_copy_ad_locations ) return new_feed def get_feeds_by_show_family_id(show_family_id): """Get feeds(podcasts) by show family id. Args: show_family_id (int): The show family unique identifier Returns: list: containing dicts with podcast metadata. """ user_v2_logic.current_user_owns_show_family_or_raise(show_family_id) return podcast_model.get_feeds_by_show_family_id(show_family_id) def get_earliest_feeds_by_show_family_ids(show_family_ids): """Get earliest feeds/podcasts by show family ids. Args: show_family_ids (list of int): List of ids for show family unique identifier Returns: list: containing dicts with podcast metadata. """ user_v2_logic.current_user_owns_show_family_ids_or_raise(show_family_ids) feeds = podcast_model.get_earliest_feeds_by_show_family_ids(show_family_ids) podcast_logic.attach_num_episodes(feeds['items']) return feeds