"""Module that copies product assets.""" from typing import Any from assets.constants import asset_upload_types from assets.exceptions import AssetUploadError from assets.models import ( asset_final as asset_final_model, asset_status as asset_status_model, asset_upload, ows_product, ) def copy_v2_assets( from_product_id: int, to_product_id: int, to_upc: int, full_user_id: str, from_tuid: int, to_tuid: int, asset_upload_type: str, ignore_if_not_exist: bool = False, ) -> None: """Copy v2 assets (ie. ones stored in ows-assets db). Args: from_product_id (int): Source product id. to_product_id (int): Destination product id. full_user_id (str): User id. to_upc (int): Destination upc from_tuid (int): Source track unique id (0 for product level assets). to_tuid (int): Destination track unique id (0 for product level assets). asset_upload_type (str): Type of the assets to be copied. ignore_if_not_exist (bool): Return null if ignore_if_not_exist flag is True. """ asset_records_to_copy = asset_upload.get_asset_records_to_copy( from_product_id, from_tuid, asset_upload_type, ignore_if_not_exist, ) if asset_records_to_copy is None: return # Update and create asset upload record asset_upload_to_create = _update_asset_upload_record_to_copy( asset_records_to_copy["asset_upload"], full_user_id, to_product_id, to_tuid, to_upc, ) asset_upload_record_created = asset_upload.create_asset_upload_record_for_copy( asset_upload_to_create ) if not asset_upload_record_created: raise AssetUploadError("Failed to create asset_upload record") # Update and create asset_status records. for asset_status in asset_records_to_copy["asset_status"]: asset_status_model.create_asset_status( asset_upload_id=asset_upload_record_created["id"], status=asset_status["status"], status_time=asset_status["status_time"], description=asset_status["description"], message=asset_status["message"], ) # Update and create asset final records asset_finals_to_create = _update_asset_final_records_to_copy( asset_records_to_copy["asset_finals"], asset_upload_record_created, ) for asset_final in asset_finals_to_create: asset_final_model.create_asset_final( asset_upload_id=asset_final["asset_upload_id"], asset_type=asset_final["asset_type"], asset_subtype=asset_final["asset_subtype"], bucket=asset_final["bucket"], filename=asset_final["filename"], duration=asset_final["duration"], channels=asset_final.get("channels"), codec=asset_final.get("codec"), sample_rate=asset_final.get("sample_rate"), bit_rate=asset_final.get("bit_rate"), bit_depth=asset_final.get("bit_depth"), ) def copy_artwork_assets( from_product_id: int, to_product_id: int, full_user_id: str ) -> None: """Copy product artwork assets. Args: from_product_id (int): Source product id. to_product_id (int): Destination product id. full_user_id (str): User id. """ ows_product_response = ows_product.get_upcs_by_product_ids( [from_product_id, to_product_id] ) upcs_products = { upcs_products_list["product_id"]: upcs_products_list["upc"] for upcs_products_list in ows_product_response["items"] } to_upc = upcs_products[to_product_id] asset_records_to_copy = asset_upload.get_asset_records_to_copy( from_product_id, 0, asset_upload_types.STATIC_ARTWORK ) if asset_records_to_copy is None: raise AssetUploadError("Failed to get asset records to copy") # Update and create asset upload record asset_upload_to_create = _update_asset_upload_record_to_copy( asset_records_to_copy["asset_upload"], full_user_id, to_product_id, 0, to_upc, ) asset_upload_record_created = asset_upload.create_asset_upload_record_for_copy( asset_upload_to_create ) if not asset_upload_record_created: raise AssetUploadError("Failed to create asset_upload record") # Update and create asset_status records. for asset_status in asset_records_to_copy["asset_status"]: asset_status_model.create_asset_status( asset_upload_id=asset_upload_record_created["id"], status=asset_status["status"], status_time=asset_status["status_time"], description=asset_status["description"], message=asset_status["message"], ) # Update and create asset final records asset_finals_to_create = _update_asset_final_records_to_copy( asset_records_to_copy["asset_finals"], asset_upload_record_created, ) for asset_final in asset_finals_to_create: asset_final_model.create_asset_final( asset_upload_id=asset_final["asset_upload_id"], asset_type=asset_final["asset_type"], asset_subtype=asset_final["asset_subtype"], bucket=asset_final["bucket"], filename=asset_final["filename"], duration=asset_final["duration"], channels=asset_final.get("channels"), codec=asset_final.get("codec"), sample_rate=asset_final.get("sample_rate"), bit_rate=asset_final.get("bit_rate"), bit_depth=asset_final.get("bit_depth"), ) def _update_asset_upload_record_to_copy( asset_upload_record: dict[str, Any], user_id: str, product_id: int, track_unique_id: int, upc: int, ) -> dict[str, Any]: """Update asset upload record for new product. Args: asset_upload_record (dict): Asset upload record to update. user_id (str): User id to update. product_id (int): Product id to update. track_unique_id (int): Track unique id to update. upc (int): Upc to update. Returns: (dict): Updated asset upload record. """ asset_upload_record["user_id"] = user_id asset_upload_record["token"] = None asset_upload_record["product_id"] = product_id asset_upload_record["track_unique_id"] = track_unique_id asset_upload_record["upc"] = str(upc) asset_upload_record["api_version"] = 2 return asset_upload_record def _update_asset_final_records_to_copy( asset_final_records: list[dict[str, Any]], asset_upload_record: dict[str, Any], ) -> list[dict[str, Any]]: """Update asset final records based on new asset upload record. Args: asset_final_records [dict]: Asset final records to update. asset_upload_record (dict): Asset upload record. Returns: [dict]: Updated asset final records. """ for asset_final in asset_final_records: asset_final["asset_upload_id"] = asset_upload_record["id"] return asset_final_records