import re from datetime import datetime from typing import Dict, Tuple # 你 COS 的公共前缀可以做成默认参数,便于不同环境覆盖 DEFAULT_COS_PREFIX = "https://data-miningc01-1318950322.cos.ap-shanghai-adc.myqcloud.com/" def extract_datetime_from_filename( bag_filename: str, cos_prefix: str = DEFAULT_COS_PREFIX, ) -> Tuple[str, Dict[str, str]]: """ 从 .bag 文件名中提取采集时间,并生成对应的多视角视频 URL。 期望文件名包含片段:_{YYYYMMDD}-{HHMMSS}_ 或以 .bag 结尾,例如: PL162802_event_all_time_event_20250416-193015_0.bag PL123456_event_all_time_event_20250828-221018.bag xx_20250524-180926_.bag xx_20250524-180926_3.bag 返回: (datetime_full_str, video_urls) - datetime_full_str: 'YYYY-MM-DD HH:MM:SS' - video_urls: COS 上该 bag 的多视角视频 URL 字典 异常: ValueError: 当文件名不匹配预期格式时抛出 """ # 提取日期时间 match = re.search(r"_(\d{8})-(\d{6})(?:_|\.|$)", bag_filename) if not match: raise ValueError(f"文件名格式错误,无法提取时间信息:{bag_filename}") date_part, time_part = match.groups() year, month, day = date_part[:4], date_part[4:6], date_part[6:8] hour, minute, second = time_part[:2], time_part[2:4], time_part[4:6] datetime_full = f"{year}-{month}-{day} {hour}:{minute}:{second}" print(f'datetime_full:{datetime_full}') # 生成视频路径(与现有逻辑一致) # 去掉 .bag 后缀,再补上 " - {View}.mp4" base = bag_filename[:-4] if bag_filename.endswith(".bag") else bag_filename view_map = { "wide": "Wide", "left": "Left", "right": "Right", "rear_left": "Rear Left", "rear_right": "Rear Right", "rear": "Rear", } video_urls = {} for key, label in view_map.items(): video_final_path = f"{base}- {label}.mp4" # 目录层级:momenta/videos/YYYY/MM/DD/{文件名 - {View}.mp4} video_key = f"momenta/videos/{year}/{month}/{day}/{video_final_path}" video_urls[key] = f"{cos_prefix}{video_key}" print(f'v{video_urls}') return datetime_full, video_urls