diff --git a/src/BowongModalFunctions/utils/TimeUtils.py b/src/BowongModalFunctions/utils/TimeUtils.py index d2ec0be..b417f1a 100644 --- a/src/BowongModalFunctions/utils/TimeUtils.py +++ b/src/BowongModalFunctions/utils/TimeUtils.py @@ -105,8 +105,21 @@ def merge_timeline_items(items): return [format_timeline_item(start, end, activity) for start, end, activity in merged_items] -def merge_product_data(data): +def convert_time(time_str): + # 去除秒字段并转换为标准时间 + parts = time_str.split(':') + if len(parts) == 3: + new_time_str = f"00:{parts[0]}:{parts[1]}.{parts[2].split('.')[1]}" + return new_time_str + return time_str + + +def merge_product_data(data, start_time_str, end_time_str): """合并相同产品的数据""" + start_time = parse_time(start_time_str) + end_time = parse_time(end_time_str) + duration = end_time - start_time + product_dict = {} # 按产品名称分组 @@ -118,7 +131,23 @@ def merge_product_data(data): # 合并每个产品的时间线 for product in product_dict: - product_dict[product]["timeline"] = merge_timeline_items(product_dict[product]["timeline"]) + timeline = product_dict[product]["timeline"] + new_timeline = [] + for item in timeline: + start, end = parse_timeline_item(item) + # 比较起始时间与时间差 + if (start - datetime.min) > duration: + # 处理时间字符串 + start_str = format_time(start) + end_str = format_time(end) + new_start_str = convert_time(start_str) + new_end_str = convert_time(end_str) + activity = item.split(' (', 1)[1].rstrip(')') + new_item = f"{new_start_str} - {new_end_str} ({activity})" + new_timeline.append(new_item) + else: + new_timeline.append(item) + product_dict[product]["timeline"] = merge_timeline_items(new_timeline) # 返回合并后的列表 return list(product_dict.values()) \ No newline at end of file diff --git a/src/cluster/video_apps/cache_submit.py b/src/cluster/video_apps/cache_submit.py index 01e2987..6100f88 100644 --- a/src/cluster/video_apps/cache_submit.py +++ b/src/cluster/video_apps/cache_submit.py @@ -3,30 +3,20 @@ import modal from ..video import downloader_image, app, config, batch_update_cloudflare_kv, modal_kv_cache with downloader_image.imports(): - import os, httpx, crcmod, json, time, requests + import os, httpx, crcmod import sentry_sdk - from sentry_sdk.integrations.loguru import LoguruIntegration from tqdm import tqdm - from typing import Tuple, List, Dict + from typing import Tuple from loguru import logger - from datetime import datetime, UTC, timedelta, timezone + from datetime import datetime, UTC, timedelta from modal import current_function_call_id - from ffmpy import FFmpeg, FFprobe - from fastapi import HTTPException - from httpx import Timeout - from starlette import status from tencentcloud.common.credential import Credential from tencentcloud.vod.v20180717.vod_client import VodClient from tencentcloud.vod.v20180717 import models as vod_request_models - from BowongModalFunctions.config import WorkerConfig - from BowongModalFunctions.utils.KVCache import MediaSourceKVCache, LiveProductKVCache from BowongModalFunctions.models.media_model import MediaSource, MediaCacheStatus, MediaProtocol - from BowongModalFunctions.models.web_model import SentryTransactionInfo, MonitorLiveRoomProductRequest, LiveProduct, \ - LiveProductCaches, WebhookNotify - from BowongModalFunctions.models.ffmpeg_worker_model import FFMpegSliceSegment - from BowongModalFunctions.utils.TimeUtils import TimeDelta, merge_product_data + from BowongModalFunctions.models.web_model import SentryTransactionInfo @app.function(cpu=1, timeout=1800,