Add support for bulkEdit time

This commit is contained in:
Neeraj Gupta 2022-11-14 14:03:49 +05:30
parent 39cac17c0c
commit 9f935e11f0
No known key found for this signature in database
GPG key ID: 3C5A1684DC1729E1
2 changed files with 67 additions and 1 deletions

View file

@ -12,7 +12,7 @@ extension ListExtension<E> on List<E> {
// splitMatch, based on the matchFunction, split the input list in two // splitMatch, based on the matchFunction, split the input list in two
// lists. result.matched contains items which matched and result.unmatched // lists. result.matched contains items which matched and result.unmatched
// contains remaining items. // contains remaining items.
ListMatch<E> splitMatch(bool Function(E element) matchFunction) { ListMatch<E> splitMatch(bool Function(E e) matchFunction) {
final listMatch = ListMatch<E>(); final listMatch = ListMatch<E>();
for (final element in this) { for (final element in this) {
if (matchFunction(element)) { if (matchFunction(element)) {

View file

@ -1,14 +1,28 @@
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:path/path.dart';
import 'package:photos/core/configuration.dart';
import 'package:photos/core/network.dart'; import 'package:photos/core/network.dart';
import 'package:photos/db/files_db.dart';
import 'package:photos/extensions/list.dart';
import 'package:photos/models/file.dart';
import 'package:photos/models/magic_metadata.dart';
import 'package:photos/services/file_magic_service.dart';
import 'package:photos/utils/date_time_util.dart';
class FilesService { class FilesService {
late Dio _enteDio; late Dio _enteDio;
late Logger _logger; late Logger _logger;
late FilesDB _filesDB;
late Configuration _config;
FilesService._privateConstructor() { FilesService._privateConstructor() {
_enteDio = Network.instance.enteDio; _enteDio = Network.instance.enteDio;
_logger = Logger("FilesService"); _logger = Logger("FilesService");
_filesDB = FilesDB.instance;
_config = Configuration.instance;
} }
static final FilesService instance = FilesService._privateConstructor(); static final FilesService instance = FilesService._privateConstructor();
Future<int> getFileSize(int uploadedFileID) async { Future<int> getFileSize(int uploadedFileID) async {
@ -25,6 +39,58 @@ class FilesService {
rethrow; rethrow;
} }
} }
Future<void> bulkEditTime(
List<File> files,
EditTimeSource source,
) async {
assert(
source == EditTimeSource.fileName,
"edit source ${source.name} is not supported yet",
);
final ListMatch<File> result = files.splitMatch(
(element) => element.isUploaded,
);
final List<File> uploadedFiles = result.matched;
// editTime For LocalFiles
final List<File> localOnlyFiles = result.unmatched;
for (File localFile in localOnlyFiles) {
final timeResult = parseDateTimeFromFileNameV2(
basenameWithoutExtension(localFile.title ?? ""),
);
if (timeResult != null) {
localFile.creationTime = timeResult.microsecondsSinceEpoch;
}
}
await _filesDB.insertMultiple(localOnlyFiles);
final List<File> remoteFilesToUpdate = [];
final Map<int, Map<String, int>> fileIDToUpdateMetadata = {};
for (File remoteFile in uploadedFiles) {
// discard files not owned by user and also dedupe already processed
// files
if (remoteFile.ownerID != _config.getUserID()! ||
fileIDToUpdateMetadata.containsKey(remoteFile.uploadedFileID)) {
continue;
}
final timeResult = parseDateTimeFromFileNameV2(
basenameWithoutExtension(remoteFile.title ?? ""),
);
if (timeResult != null) {
remoteFilesToUpdate.add(remoteFile);
fileIDToUpdateMetadata[remoteFile.uploadedFileID!] = {
pubMagicKeyEditedTime: timeResult.microsecondsSinceEpoch,
};
}
}
if (remoteFilesToUpdate.isNotEmpty) {
await FileMagicService.instance.updatePublicMagicMetadata(
remoteFilesToUpdate,
null,
metadataUpdateMap: fileIDToUpdateMetadata,
);
}
}
} }
enum EditTimeSource { enum EditTimeSource {