file_sync_util.dart 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import 'dart:math';
  2. import 'package:computer/computer.dart';
  3. import 'package:logging/logging.dart';
  4. import 'package:photo_manager/photo_manager.dart';
  5. import 'package:photos/models/file.dart';
  6. final _logger = Logger("FileSyncUtil");
  7. Future<List<File>> getDeviceFiles(
  8. int fromTime, int toTime, Computer computer) async {
  9. final pathEntities = await _getGalleryList(fromTime, toTime);
  10. List<File> files = [];
  11. AssetPathEntity recents;
  12. for (AssetPathEntity pathEntity in pathEntities) {
  13. if (pathEntity.name == "Recent" || pathEntity.name == "Recents") {
  14. recents = pathEntity;
  15. } else {
  16. files = await _computeFiles(pathEntity, fromTime, files, computer);
  17. }
  18. }
  19. if (recents != null) {
  20. files = await _computeFiles(recents, fromTime, files, computer);
  21. }
  22. files.sort(
  23. (first, second) => first.creationTime.compareTo(second.creationTime));
  24. return files;
  25. }
  26. Future<Set<String>> getAllLocalIDs() async {
  27. final filterOptionGroup = FilterOptionGroup();
  28. final assetPaths = await PhotoManager.getAssetPathList(
  29. hasAll: true,
  30. type: RequestType.common,
  31. filterOption: filterOptionGroup,
  32. );
  33. final ids = new Set<String>();
  34. for (final assetPath in assetPaths) {
  35. for (final asset in await assetPath.assetList) {
  36. ids.add(asset.id);
  37. }
  38. }
  39. return ids;
  40. }
  41. Future<List<AssetPathEntity>> _getGalleryList(
  42. final int fromTime, final int toTime) async {
  43. final filterOptionGroup = FilterOptionGroup();
  44. filterOptionGroup.setOption(AssetType.image, FilterOption(needTitle: true));
  45. filterOptionGroup.setOption(AssetType.video, FilterOption(needTitle: true));
  46. filterOptionGroup.createTimeCond = DateTimeCond(
  47. min: DateTime.fromMicrosecondsSinceEpoch(fromTime),
  48. max: DateTime.fromMicrosecondsSinceEpoch(toTime),
  49. );
  50. filterOptionGroup.updateTimeCond = DateTimeCond(
  51. min: DateTime.fromMicrosecondsSinceEpoch(fromTime),
  52. max: DateTime.fromMicrosecondsSinceEpoch(toTime),
  53. );
  54. final galleryList = await PhotoManager.getAssetPathList(
  55. hasAll: true,
  56. type: RequestType.common,
  57. filterOption: filterOptionGroup,
  58. );
  59. galleryList.sort((s1, s2) {
  60. return s2.assetCount.compareTo(s1.assetCount);
  61. });
  62. return galleryList;
  63. }
  64. Future<List<File>> _computeFiles(AssetPathEntity pathEntity, int fromTime,
  65. List<File> files, Computer computer) async {
  66. final args = Map<String, dynamic>();
  67. args["pathEntity"] = pathEntity;
  68. args["assetList"] = await pathEntity.assetList;
  69. args["fromTime"] = fromTime;
  70. args["files"] = files;
  71. return await computer.compute(_getFiles, param: args);
  72. }
  73. Future<List<File>> _getFiles(Map<String, dynamic> args) async {
  74. final pathEntity = args["pathEntity"];
  75. final assetList = args["assetList"];
  76. final fromTime = args["fromTime"];
  77. final files = args["files"];
  78. for (AssetEntity entity in assetList) {
  79. if (max(entity.createDateTime.microsecondsSinceEpoch,
  80. entity.modifiedDateTime.microsecondsSinceEpoch) >
  81. fromTime) {
  82. try {
  83. final file = await File.fromAsset(pathEntity.name, entity);
  84. if (!files.contains(file)) {
  85. files.add(file);
  86. }
  87. } catch (e) {
  88. _logger.severe(e);
  89. }
  90. }
  91. }
  92. return files;
  93. }