import os import random import config from enum import Enum from datetime import datetime from datetime import timezone from soundrecording_utils.ddex.v38.generate import generate_ddex as generate_ddex_v38 from soundrecording_utils.ddex.v43.generate import generate_ddex as generate_ddex_v43 from soundrecording_utils.metadata.types import OrchardSoundRecording from soundrecording_utils.constants.ddex.constants import RuleService from s3_sound_recordings import get_osr class DeliveryType(Enum): """Represents the type of delivery.""" METADATA_UPDATE = "METADATA_UPDATE" FULL_DELIVERY = "FULL_DELIVERY" TAKEDOWN_DELIVERY = "TAKEDOWN_DELIVERY" def _generate_batch_id() -> str: date_str = datetime.now().strftime("%Y%m%d%H%M%S") random_str = str(random.randint(0, 9999)).rjust(4, "0") return date_str + random_str def _parse_args(): osr_id = os.environ["OSR_ID"] # a sound recording ID osr_version = ( os.environ["OSR_VERSION"] if "OSR_VERSION" in os.environ else None ) # (optionally) a sound recording version ID ddex_version = os.environ["DDEX_VERSION"] # the DDEX version to use (3.8 or 4.3) store = os.environ["STORE"] # a store to build DDEX for (TikTok or YouTube) delivery_type = os.environ[ "DELIVERY_TYPE" ] # type of delivery - full_delivery, takedown, metadata_update return osr_id, osr_version, ddex_version, store, delivery_type def _generate_ddex_xml(args): (osr_id, osr_version, ddex_version, store, delivery_type) = args print(f"Generating DDEX XML with the following parameters:\nOSR_ID: {osr_id}\nOSR_VERSION: {osr_version}\nDDEX_VERSION: {ddex_version}\nSTORE: {store}\nDELIVERY_TYPE: {delivery_type}") if store.lower() not in ["tiktok", "youtube"]: raise ValueError(f"Unsupported store: {store}. Supported stores are: TikTok, YouTube.") osr: OrchardSoundRecording = get_osr(osr_id, osr_version) batch_id = _generate_batch_id() execution_metadata = { "timestamp": datetime.now(timezone.utc), "message_thread_id": 1, "message_id": batch_id, } # select asset by metadata if upload required upload_asset = None if delivery_type == DeliveryType.FULL_DELIVERY.value and osr.assets: upload_asset = osr.assets[0] is_takedown = delivery_type == DeliveryType.TAKEDOWN_DELIVERY.value rule_service = RuleService.TIKTOK if store.lower() == "tiktok" else RuleService.YOUTUBE if ddex_version == "3.8": ddex = generate_ddex_v38( osr, upload_asset, execution_metadata, config.SERVICE_NAME, rule_service, is_takedown, ) elif ddex_version == "4.3": ddex = generate_ddex_v43( osr, upload_asset, execution_metadata, config.SERVICE_NAME, rule_service, is_takedown, ) else: raise ValueError(f"Unsupported DDEX version: {ddex_version}") return ddex def main(): args = _parse_args() (osr_id, osr_version, ddex_version, store, delivery_type) = args ddex = _generate_ddex_xml(args) if ddex: print("DDEX XML generated successfully.") else: print("Failed to generate DDEX XML.") # Save ddex to a local file filename = f'./output/{config.BUILD_NUMBER}_{delivery_type}_ddex_output.xml' with open(filename, 'w') as f: f.write(ddex) return ddex if __name__ == "__main__": main()