"""Logic Tier for Categories.""" from podcast.connectors import mysql from podcast.constants.asset_types import MAX_AUDIO_SIGNED_URL_DURATION from podcast.constants.common import PRIVATE_RSS from podcast.constants.common import PUBLIC_RSS from podcast.constants.error import ERROR_MESSAGE_INVALID_FEED_TYPE from podcast.constants.feature_flag import FEATURE_PODCAST_IA_RESTRUCTURE from podcast.logic import megaphone from podcast.logic import user as user_logic from podcast.logic import user_v2 as user_v2_logic from podcast.models import episode as episode_model from podcast.models import insertion_point as point_model from podcast.models import ows_asset_transcoder as oat from podcast.models import podcast as podcast_model from podcast.utils import feature_flag_utils from podcast.utils.exc import OwsError def create_insertion_points(podcast_id, episode_id, data): """Create insertion points. Args: podcast_id: The unique identifier of Podcast episode_id: The unique identifier of Episode data: json-payload with insertion points Returns: response.Response: list of created insertion points. """ user_logic.current_user_has_read_only_access_then_raise() podcast = podcast_model.get_podcast_by_id(podcast_id) if feature_flag_utils.get_feature_flag(FEATURE_PODCAST_IA_RESTRUCTURE): user_v2_logic.current_user_owns_show_family_or_raise(podcast['show_family_id']) else: user_logic.current_user_owns_podcast_or_raise(podcast) if podcast['feed_type'] not in (PUBLIC_RSS, PRIVATE_RSS): raise OwsError.bad_request(ERROR_MESSAGE_INVALID_FEED_TYPE) # checks if episode exists episode_model.get_episode_by_id(episode_id) with mysql.pod_db_session() as session: insertion_response = point_model.create_insertion_points(episode_id, data, session) update_episode = update_ad_inventory_to_match_insertions(podcast_id, episode_id, data, session) if update_episode['is_reviewed']: assets = oat.get_episode_assets(episode_id, MAX_AUDIO_SIGNED_URL_DURATION) megaphone.create_or_update_episode(podcast['megaphone_id'], update_episode, assets, podcast['network_id']) return insertion_response def update_ad_inventory_to_match_insertions(podcast_id, episode_id, insertion_points, session): """Update ad inventory to match insertions.""" pre = [x for x in insertion_points if x['point_type'] == 'pre'] post = [x for x in insertion_points if x['point_type'] == 'post'] mids = [x for x in insertion_points if x['point_type'] == 'mid'] pre_count = pre[0]['count'] if len(pre) > 0 else 0 post_count = post[0]['count'] if len(post) > 0 else 0 mid_counts = [mid['count'] for mid in mids] return episode_model.update_episode(episode_id, { 'planned_pre_roll_count': pre_count, 'planned_mid_roll_count': sum(mid_counts), 'planned_post_roll_count': post_count }, session)