JJ_MKVMaker/lib/core/files/same_file.dart

28 lines
1.9 KiB
Dart

/// 약속 (modular_sync F2): 받는 쪽에 이미 있는 파일을 원본과 "같은 파일" 로 치는지 (다시 보내지 않음) 와 받는 쪽이 더 새것인지.
/// 앱이 직접 맞추는 길 (로컬 · 원격) 과 실행 전 미리 보기가 모두 이 하나를 부른다 - 예전에는 미리 보기와 실제 원격 맞추기의 판단이 달라
/// 원격 받는 쪽이 더 새 파일이 미리 보기에는 "바뀜" 으로 보이고 실제로는 건너뛰었다.
/// - 입력: 원본 · 받는 쪽의 크기와 바뀐 때. 출력: 같은지 · 받는 쪽이 더 새것인지. 오류 없음 (순수).
/// - 바뀐 때는 [window] (2초) 안이면 같은 때로 본다 (FAT · 원격의 초 단위 시각).
/// - [uploadTime]: 받는 쪽 시각이 "올린 때" 인 곳 (원격이 낀 앱 맞추기, 이동 아님) - 크기가 같고 받는 쪽이 더 새것이어도 같다.
/// 이동 (원본을 지움) 은 거의 같은 때일 때만 같다고 본다 (내용이 다른데 원본을 지우지 않게, 214).
library;
class SameFile {
const SameFile({this.uploadTime = false});
/// 앱이 직접 맞출 때의 판단: 원격이 끼고 이동이 아니면 [uploadTime]
factory SameFile.forAppSync({required bool remote, required bool move}) => SameFile(uploadTime: remote && !move);
static const window = Duration(seconds: 2);
final bool uploadTime;
bool same({required int size, required DateTime modified, required int targetSize, required DateTime targetModified}) {
if (size != targetSize) return false;
if (targetModified.difference(modified).abs() <= window) return true;
return uploadTime && !targetModified.isBefore(modified.subtract(window));
}
/// 받는 쪽이 [window] 넘게 더 새것인지 (-u 건너뛰기 · 미리 보기 "더 새 것" 표시)
static bool targetNewer(DateTime targetModified, DateTime modified) => targetModified.isAfter(modified.add(window));
}