JJ_MKVMaker/lib/core/thumb_cache.dart

41 lines
1.5 KiB
Dart

import 'dart:convert';
import 'dart:io';
import 'package:crypto/crypto.dart';
import 'package:path/path.dart' as p;
/// 앱이 만든 작은 그림 (썸네일) 캐시 (관리자 지시 10/21, 28 지적): 암호 보관함에 넣은 파일의 썸네일이 캐시에 남지 않게 지운다.
/// 캐시 이름은 "경로|크기|바뀐 때 (ms)" (빠른 보기 큰 것은 끝에 "|640") 의 md5 + .jpg - 파일 탐색기 동영상 썸네일 (jj_thumbs) ·
/// 원격 썸네일 (jj_rthumbs) 이 같은 꼴을 쓴다
const thumbCacheDirs = ['jj_thumbs', 'jj_rthumbs'];
List<String> thumbCacheKeys(String path, int size, DateTime modified) {
final k = '$path|$size|${modified.millisecondsSinceEpoch}';
return [k, '$k|640'];
}
/// 메모리에 둔 썸네일 기억을 잊는 곳들 (화면 쪽이 등록 - 경로를 받아 그 경로의 것만 잊음)
final thumbMemoryForgetters = <void Function(String path)>{};
/// [path] 의 썸네일 캐시 파일을 지우고 메모리 기억도 잊는다. 지운 파일 수
Future<int> removeThumbCaches(String tempDir, String path, int size, DateTime modified) async {
var n = 0;
for (final d in thumbCacheDirs) {
for (final k in thumbCacheKeys(path, size, modified)) {
final f = File(p.join(tempDir, d, '${md5.convert(utf8.encode(k))}.jpg'));
try {
if (await f.exists()) {
await f.delete();
n++;
}
} catch (_) {}
}
}
for (final forget in thumbMemoryForgetters) {
try {
forget(path);
} catch (_) {}
}
return n;
}