file.dart 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import 'dart:io';
  2. import 'dart:typed_data';
  3. import 'package:flutter/foundation.dart';
  4. import 'package:flutter_image_compress/flutter_image_compress.dart';
  5. import 'package:photo_manager/photo_manager.dart';
  6. import 'package:path/path.dart';
  7. import 'package:photos/core/configuration.dart';
  8. import 'package:photos/models/file_type.dart';
  9. import 'package:photos/models/location.dart';
  10. class File {
  11. int generatedId;
  12. int uploadedFileId;
  13. String localId;
  14. String title;
  15. String deviceFolder;
  16. int remoteFolderId;
  17. String remotePath;
  18. String previewURL;
  19. int createTimestamp;
  20. int updateTimestamp;
  21. Location location;
  22. FileType fileType;
  23. File();
  24. File.fromJson(Map<String, dynamic> json) {
  25. uploadedFileId = json["fileID"];
  26. localId = json["deviceFileID"];
  27. deviceFolder = json["deviceFolder"];
  28. title = json["title"];
  29. fileType = getFileType(json["fileType"]);
  30. remotePath = json["path"];
  31. previewURL = json["previewURL"];
  32. createTimestamp = json["createTimestamp"];
  33. updateTimestamp = json["updateTimestamp"];
  34. }
  35. static Future<File> fromAsset(
  36. AssetPathEntity pathEntity, AssetEntity asset) async {
  37. File file = File();
  38. file.localId = asset.id;
  39. file.title = asset.title;
  40. file.deviceFolder = pathEntity.name;
  41. file.location = Location(asset.latitude, asset.longitude);
  42. switch (asset.type) {
  43. case AssetType.image:
  44. file.fileType = FileType.image;
  45. break;
  46. case AssetType.video:
  47. file.fileType = FileType.video;
  48. break;
  49. default:
  50. file.fileType = FileType.other;
  51. break;
  52. }
  53. file.createTimestamp = asset.createDateTime.microsecondsSinceEpoch;
  54. if (file.createTimestamp == 0) {
  55. try {
  56. final parsedDateTime = DateTime.parse(
  57. basenameWithoutExtension(file.title)
  58. .replaceAll("IMG_", "")
  59. .replaceAll("DCIM_", "")
  60. .replaceAll("_", " "));
  61. file.createTimestamp = parsedDateTime.microsecondsSinceEpoch;
  62. } catch (e) {
  63. file.createTimestamp = asset.modifiedDateTime.microsecondsSinceEpoch;
  64. }
  65. }
  66. return file;
  67. }
  68. Future<AssetEntity> getAsset() {
  69. return AssetEntity.fromId(localId);
  70. }
  71. Future<Uint8List> getBytes({int quality = 100}) async {
  72. if (localId == null) {
  73. return HttpClient().getUrl(Uri.parse(getRemoteUrl())).then((request) {
  74. return request.close().then((response) {
  75. return consolidateHttpClientResponseBytes(response);
  76. });
  77. });
  78. } else {
  79. final originalBytes = (await getAsset()).originBytes;
  80. if (extension(title) == ".HEIC" || quality != 100) {
  81. return originalBytes.then((bytes) {
  82. return FlutterImageCompress.compressWithList(bytes, quality: quality)
  83. .then((converted) {
  84. return Uint8List.fromList(converted);
  85. });
  86. });
  87. } else {
  88. return originalBytes;
  89. }
  90. }
  91. }
  92. String getRemoteUrl() {
  93. return Configuration.instance.getHttpEndpoint() +
  94. "/files/file/" +
  95. uploadedFileId.toString();
  96. }
  97. String getThumbnailUrl() {
  98. return Configuration.instance.getHttpEndpoint() + "/" + previewURL;
  99. }
  100. @override
  101. String toString() {
  102. return '''File(generatedId: $generatedId, uploadedFileId: $uploadedFileId,
  103. localId: $localId, title: $title, deviceFolder: $deviceFolder,
  104. location: $location, remotePath: $remotePath, fileType: $fileType,
  105. createTimestamp: $createTimestamp, updateTimestamp: $updateTimestamp)''';
  106. }
  107. @override
  108. bool operator ==(Object o) {
  109. if (identical(this, o)) return true;
  110. return o is File &&
  111. o.generatedId == generatedId &&
  112. o.uploadedFileId == uploadedFileId &&
  113. o.localId == localId;
  114. }
  115. @override
  116. int get hashCode {
  117. return generatedId.hashCode ^ uploadedFileId.hashCode ^ localId.hashCode;
  118. }
  119. String tag() {
  120. return "local_" +
  121. localId.toString() +
  122. ":remote_" +
  123. uploadedFileId.toString() +
  124. ":generated_" +
  125. generatedId.toString();
  126. }
  127. }