"""Logic module for work with asset final states and files.""" import os from typing import Any from assets.constants import api, asset_types, field_const from assets.exceptions import NoAssetsFound from assets.models import asset_final, asset_upload, asset_upload_type, s3_file def get_asset_info(filename: str, state: str) -> dict[str, Any]: """Return asset info by filename and state. Args: filename (str): Asset filename. state (str): Type of filename - raw or final. Returns dict: Asset info. """ if state == field_const.ASSET_STATE_RAW: clean_filename, ext = os.path.splitext(filename) data = asset_upload.get_asset_upload( clean_filename, api_version=api.API_VERSION_V2 ) else: asset_final_response = asset_final.get_asset_final(filename) data = asset_upload.get_asset_upload_by_id( asset_final_response["asset_upload_id"] ) return { field_const.FILENAME: data[field_const.FILENAME], field_const.PRODUCT_ID: data[field_const.PRODUCT_ID], field_const.UPC: data[field_const.UPC], field_const.TRACK_UNIQUE_ID: data[field_const.TRACK_UNIQUE_ID], field_const.ASSET_UPLOAD_TYPE: asset_upload_type.resolve_asset_upload_type( asset_upload_type_id=data[field_const.ASSET_UPLOAD_TYPE_ID] ), } def get_asset_info_by_id(asset_final_id: int) -> dict[str, Any]: """Return asset info by asset_final_id. Args: asset_final_id (int): Asset Final ID. Returns dict: Asset info. """ asset_final_data = asset_final.get_asset_final_by_id(asset_final_id) asset_upload_data = asset_upload.get_asset_upload_by_id( asset_final_data[field_const.ASSET_UPLOAD_ID] ) return { field_const.FILENAME: asset_upload_data[field_const.FILENAME], field_const.PRODUCT_ID: asset_upload_data[field_const.PRODUCT_ID], field_const.UPC: asset_upload_data[field_const.UPC], field_const.TRACK_UNIQUE_ID: asset_upload_data[field_const.TRACK_UNIQUE_ID], field_const.DURATION: asset_final_data[field_const.DURATION], } def get_asset_download_url_by_id( asset_final_id: int, expires_in: int ) -> dict[str, Any]: """Return presigned url for download asset by asset_final_id. Args: asset_final_id (int): Asset Final ID. expires_in (int): Time in seconds Returns dict: Presigned url. """ asset = asset_final.get_asset_final_by_id(asset_final_id) s3_check = s3_file.check_s3_file_exists(asset["bucket"], asset["filename"]) if not s3_check: raise NoAssetsFound(f"{asset['filename']} not found in S3") s3_response = s3_file.create_presigned_url( asset["bucket"], asset["filename"], expires_in ) return {"url": s3_response} def get_v2_assets_info_by_asset_type( product_id: int, asset_type: str, track_id: int | None = None ) -> dict[str, Any]: """Return asset info by asset_type. Args: product_id (int): product id. asset_type (str): type of asset track_id (str) Optional: unique track id Returns dict: Asset info. """ asset_uploads_response = asset_upload.get_latest_asset_upload( track_id=track_id, product_id=product_id, limit=0, get_updated_timestamp=True ) asset_upload_ids = [au_record["id"] for au_record in asset_uploads_response] asset_final_response = asset_final.get_asset_final_by_asset_upload_ids( asset_upload_ids, asset_type=asset_type ) filtered_assets = [] for asset_uploads in asset_uploads_response: for assets in asset_final_response[asset_uploads["id"]]: filtered_asset = { "filename": assets["filename"], "bucket": assets["bucket"], "updated_timestamp": asset_uploads["updated_timestamp"].strftime( "%Y-%m-%d %H:%M:%S" ), } if asset_type != asset_types.TYPE_FILE_TIF: filtered_asset["track_unique_id"] = asset_uploads["track_unique_id"] filtered_assets.append(filtered_asset) return {"product_id": product_id, "assets": filtered_assets}