"""Track metadata logic.""" from typing import Any from video.connectors import mysql from video.constants import error as error_constants from video.exceptions import InvalidRequest, TrackNotFound from video.models.ows import track as ows_track from video.models.sql import queries from video.models.sql.classes import track, track_video def create_track_metadata( product_id: int, video_data: dict[str, Any] ) -> dict[str, Any]: """Save track metadata passed via client.""" track_id = ows_track.get_track_id(product_id) track_data = { "track_id": track_id, "duration_minutes": video_data["duration_minutes"], "duration_seconds": video_data["duration_seconds"], "closed_caption_exists": video_data["closed_caption_exists"], "closed_caption_reason_id": video_data["closed_caption_reason_id"], } track_video_data = { "track_id": track_id, "fps": video_data["fps"], "resolution": video_data["resolution"], "aspect_ratio": video_data["aspect_ratio"], "color": video_data["color"], "channel": video_data["channel"], } with mysql.ar_db_session() as session: track.upsert(track_data, session=session) track_video.upsert(track_video_data, session=session) create_track_metadata_message = {**video_data, "track_id": track_id} return create_track_metadata_message def get_tracks_metadata( product_id: int, track_ids: list[int] | None ) -> list[dict[str, Any]]: """Get track metadata.""" tuids = ows_track.get_track_ids(product_id) result = None if not tuids: raise TrackNotFound( error_constants.ERROR_MESSAGE_NO_TRACKS_IN_PRODUCT, error_code=error_constants.ERROR_CODE_NO_TRACKS, ) if track_ids is None: result = queries.get_video_tracks_metadata(tuids) else: unknown_track_ids = [ track_id for track_id in track_ids if track_id not in tuids ] if unknown_track_ids: unknown_track_ids_str = ", ".join(map(str, unknown_track_ids)) error_message = ( error_constants.ERROR_MESSAGE_MISMATCH_TUID_PRODUCT_ID.format( tuids=unknown_track_ids_str, product_id=product_id ) ) raise InvalidRequest(error_message) result = queries.get_video_tracks_metadata(track_ids) if not result: raise TrackNotFound( error_constants.ERROR_MESSAGE_NO_VIDEO_TRACK_FOUND, error_code=error_constants.ERROR_CODE_NO_TRACK_VIDEO, ) return result