"""Module for asset final logic tier.""" import os from asset_transcoder.connectors import mysql from asset_transcoder.connectors import sentry from asset_transcoder.constants import asset_types as asset_types_const from asset_transcoder.logic import asset_status from asset_transcoder.models import asset_final as asset_final_model from asset_transcoder.models import asset_upload as asset_upload_model from asset_transcoder.utils import api_utils from asset_transcoder.utils import exceptions from asset_transcoder.utils import s3 def _add_content_disposition_to_asset_finals(final_assets, asset_upload, timestamp): app = api_utils.get_app_by_object_type(asset_upload.object_type) bucket = os.environ.get('OUTPUT_ASSETS_{0}_BUCKET_NAME'.format(app)) for final_asset in final_assets: key = final_asset['key'] _, ext = os.path.splitext(key) metadata = { 'ContentDisposition': 'attachment; filename="{}-{}{}"'.format( asset_upload.original_filename, timestamp, ext) } try: s3.update_file_metadata(key, bucket, metadata) except exceptions.OwsError as err: sentry_message = 'Failed to set ContentDisposition on {}'.format(key) sentry.send_to_sentry( message=err.message, status=err.status, errors={}, sentry_message=sentry_message) def create_status_and_final_assets(filename, status, errors, timestamp, final_assets): """Save information about asset status and final assets. Args: filename (str): Unique source asset filename. status (str): Asset processing status. errors (dict): Asset status full message info. timestamp (str): Asset status event timestamp. final_assets (list): Final assets info. Returns: dict: Saved status info. """ with mysql.transcoder_db_session() as session: clean_filename, ext = os.path.splitext(filename) asset_upload = asset_upload_model.get_asset_upload(clean_filename) create_status_result = asset_status.create_status_with_upload( asset_upload=asset_upload, status=status, errors=errors, timestamp=timestamp, session=session ) asset_upload_id = asset_upload.asset_upload_id for final_asset in final_assets: asset_type = final_asset.get('asset_type', None) if 'container' in final_asset: container = final_asset.get('container') if container in asset_types_const.AUDIO_CONTAINER_MAPPING: asset_type = asset_types_const.AUDIO_CONTAINER_MAPPING[container] asset_final_model.create_asset_final( asset_upload_id=asset_upload_id, asset_type=asset_type, asset_subtype=final_asset.get('asset_subtype', asset_types_const.SUBTYPE_NONE), filename=final_asset['key'], duration=final_asset.get('duration', 0), session=session ) _add_content_disposition_to_asset_finals(final_assets, asset_upload, create_status_result['created_date']) return create_status_result