cacheMetaDataByClassId method

Future<void> cacheMetaDataByClassId(
  1. String classId,
  2. String token,
  3. CacheMetadataListener listener, {
  4. bool force = false,
  5. PlayBackEnvEnum env = PlayBackEnvEnum.production,
})

拉取回放元数据并以 classId.json 保存到本地

Implementation

Future<void> cacheMetaDataByClassId(String classId, String token, CacheMetadataListener listener, {
  bool force = false,
  PlayBackEnvEnum env = PlayBackEnvEnum.production,
}) async {
  cacheMetadataListeners[classId] = listener;
  cacheMetadataListeners[classId]?.onCacheStarted(classId);
  // 判断是否正在缓存中,如果缓存中,则返回
  final status = await getCachedMetaDataStatus(classId);
  if (status == CacheStatusEnum.caching && !force) {
    cacheMetadataListeners[classId]?.onError(classId, 1000, '正在缓存中,请勿重复缓存');
    return;
  }
  if (status == CacheStatusEnum.cachedSuccess && !force) {
    cacheMetadataListeners[classId]?.onCacheSuccess(classId);
    return;
  }
  final baseUrl = env == PlayBackEnvEnum.production ? TCICConst.playBackApiBaseUrl : TCICConst.playBackApiBaseUrlTest;
  // JWT 中含 + / = 等字符,必须编码后放入 query,否则会被解析错误导致服务端收到错误 token 返回 401
  final url = '$baseUrl$classId?token=${Uri.encodeComponent(token)}';

  try {
    final response = await _dio.get(url);
    final data = response.data;
    if (data['error_code'] != 0) {
      cacheMetadataListeners[classId]?.onCacheFailed(classId, data['error_code'], data['error_message']);
      return;
    }

    final cacheDir = await _ensureCacheDir();
    final file = File(p.join(cacheDir.path, '${_safeId(classId)}.json'));
    await file.writeAsString(jsonEncode({
      'document_pages': List<Map<String, dynamic>>.from(data['data']['document_pages']),
      'im_messages': List<Map<String, dynamic>>.from(data['data']['im_messages']),
      'video_url': data['data']['video_url'] ?? '',
      'whiteboard_url': data['data']['whiteboard_url'] ?? '',
      'class_name': data['data']['class_name'] ?? '',
    }));
    _downloadingClassIds.add(classId);
    downloadMetaData(classId, token);
  } on DioException catch (e) {
    // 401 等 HTTP 错误在此捕获,通过 listener 通知 Native 展示具体原因,避免异常抛到 MethodChannel
    final code = e.response?.statusCode ?? -1;
    final String message = _dioErrorMessage(e);
    cacheMetadataListeners[classId]?.onError(classId, code, message);
  } catch (e) {
    cacheMetadataListeners[classId]?.onError(classId, -1, e.toString());
  }
}