pollTaskStatus static method

Future<VideoTaskStatusResult> pollTaskStatus(
  1. String taskId, {
  2. void onProgress(
    1. VideoTaskStatusResult
    )?,
  3. String? language,
  4. int timeoutSeconds = _pollTimeoutSeconds,
})

轮询查询视频生成状态,直到完成或超时

taskId 任务ID onProgress 进度回调函数 language 语言代码(可选,默认根据系统语言) timeoutSeconds 超时时间(秒),默认5分钟 返回最终的 VideoTaskStatusResult

Implementation

static Future<VideoTaskStatusResult> pollTaskStatus(
  String taskId, {
  void Function(VideoTaskStatusResult)? onProgress,
  String? language,
  int timeoutSeconds = _pollTimeoutSeconds,
}) async {
  final lang = language ?? PlatformDispatcher.instance.locale.languageCode;
  final i18n = ShopPageI18n(lang);
  final startTime = DateTime.now();
  int attempts = 0;

  while (true) {
    attempts++;
    final elapsed = DateTime.now().difference(startTime).inSeconds;
    print('${i18n.get('video_polling_status')} (第 $attempts ${i18n.get('video_attempts')}, ${i18n.get('video_elapsed')} ${elapsed}${i18n.get('video_seconds')}): $taskId');

    final statusResult = await getTaskStatus(taskId, language: lang);

    // 调用进度回调
    if (onProgress != null) {
      onProgress(statusResult);
    }

    // 检查任务状态
    switch (statusResult.status) {
      case VideoTaskStatus.succeeded:
        print('${i18n.get('video_task_completed')}: ${statusResult.message}');
        return statusResult;

      case VideoTaskStatus.failed:
        print('${i18n.get('video_task_failed')}: ${statusResult.error ?? statusResult.message}');
        return statusResult;

      case VideoTaskStatus.pending:
      case VideoTaskStatus.running:
        // 检查是否超时
        if (elapsed >= timeoutSeconds) {
          print('${i18n.get('video_polling_timeout')}:已超过 ${timeoutSeconds}${i18n.get('video_seconds')}');
          return VideoTaskStatusResult(
            success: false,
            taskId: taskId,
            status: VideoTaskStatus.timeout,
            message: i18n.get('video_timeout_message'),
            error: '${i18n.get('video_timeout_error_prefix')}${elapsed}${i18n.get('video_timeout_error_suffix')}',
          );
        }

        // 继续轮询
        print('${i18n.get('video_task_in_progress')}: ${statusResult.message} (进度: ${statusResult.progress ?? 0}%)');
        await Future.delayed(Duration(seconds: _pollIntervalSeconds));
        break;

      case VideoTaskStatus.timeout:
        print(i18n.get('video_polling_timeout'));
        return statusResult;
    }
  }
}