getCachedMetaDataStatus method

Future<CacheStatusEnum> getCachedMetaDataStatus(
  1. String classId
)

根据本地缓存文件判定当前缓存状态。 若 success.json 存在,会进一步校验其中引用的白板视频、老师视频、课件图片是否均在本地存在, 任一文件缺失则删除 success.json 并返回未缓存。

Implementation

Future<CacheStatusEnum> getCachedMetaDataStatus(String classId) async {
  final cacheDir = await _ensureCacheDir();
  final safeId = _safeId(classId);
  final successPath = p.join(cacheDir.path, '$safeId-success.json');
  final successFile = File(successPath);

  if (await successFile.exists()) {
    final valid = await _validateSuccessJsonFiles(successFile);
    if (!valid) {
      try {
        await successFile.delete();
      } catch (_) {}
      return CacheStatusEnum.notCached;
    }
    return CacheStatusEnum.cachedSuccess;
  }
  if (await File(p.join(cacheDir.path, '$safeId-failed.json')).exists()) {
    return CacheStatusEnum.cachedFailed;
  }
  final metaPath = p.join(cacheDir.path, '$safeId.json');
  if (await File(metaPath).exists()) {
    // 仅当内存中标记为「正在下载」才视为 caching,否则为上次进程被杀导致的残留,清理并视为未缓存
    if (_downloadingClassIds.contains(classId)) {
      return CacheStatusEnum.caching;
    }
    try {
      await File(metaPath).delete();
      final classCacheDir = Directory(p.join(cacheDir.path, safeId));
      if (await classCacheDir.exists()) {
        await classCacheDir.delete(recursive: true);
      }
    } catch (_) {}
    return CacheStatusEnum.notCached;
  }
  return CacheStatusEnum.notCached;
}