file.dart 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import 'package:photo_manager/photo_manager.dart';
  2. import 'package:path/path.dart';
  3. import 'package:photos/core/configuration.dart';
  4. import 'package:photos/models/file_type.dart';
  5. import 'package:photos/models/location.dart';
  6. class File {
  7. int generatedID;
  8. int uploadedFileID;
  9. int ownerID;
  10. int collectionID;
  11. String localID;
  12. String title;
  13. String deviceFolder;
  14. bool isEncrypted;
  15. int creationTime;
  16. int modificationTime;
  17. int updationTime;
  18. Location location;
  19. FileType fileType;
  20. String encryptedKey;
  21. String keyDecryptionNonce;
  22. String fileDecryptionHeader;
  23. String thumbnailDecryptionHeader;
  24. String metadataDecryptionHeader;
  25. File();
  26. File.fromJson(Map<String, dynamic> json) {
  27. uploadedFileID = json["id"];
  28. ownerID = json["ownerID"];
  29. collectionID = json["collectionID"];
  30. localID = json["deviceFileID"];
  31. deviceFolder = json["deviceFolder"];
  32. title = json["title"];
  33. fileType = getFileType(json["fileType"]);
  34. creationTime = json["creationTime"];
  35. modificationTime = json["modificationTime"];
  36. updationTime = json["updationTime"];
  37. }
  38. static Future<File> fromAsset(
  39. AssetPathEntity pathEntity, AssetEntity asset) async {
  40. File file = File();
  41. file.localID = asset.id;
  42. file.title = asset.title;
  43. file.deviceFolder = pathEntity.name;
  44. file.location = Location(asset.latitude, asset.longitude);
  45. switch (asset.type) {
  46. case AssetType.image:
  47. file.fileType = FileType.image;
  48. break;
  49. case AssetType.video:
  50. file.fileType = FileType.video;
  51. break;
  52. default:
  53. file.fileType = FileType.other;
  54. break;
  55. }
  56. file.isEncrypted = false;
  57. file.creationTime = asset.createDateTime.microsecondsSinceEpoch;
  58. if (file.creationTime == 0) {
  59. try {
  60. final parsedDateTime = DateTime.parse(
  61. basenameWithoutExtension(file.title)
  62. .replaceAll("IMG_", "")
  63. .replaceAll("DCIM_", "")
  64. .replaceAll("_", " "));
  65. file.creationTime = parsedDateTime.microsecondsSinceEpoch;
  66. } catch (e) {
  67. file.creationTime = asset.modifiedDateTime.microsecondsSinceEpoch;
  68. }
  69. }
  70. file.modificationTime = asset.modifiedDateTime.microsecondsSinceEpoch;
  71. return file;
  72. }
  73. Future<AssetEntity> getAsset() {
  74. return AssetEntity.fromId(localID);
  75. }
  76. void applyMetadata(Map<String, dynamic> metadata) {
  77. localID = metadata["localID"];
  78. title = metadata["title"];
  79. deviceFolder = metadata["deviceFolder"];
  80. creationTime = metadata["creationTime"];
  81. modificationTime = metadata["modificationTime"];
  82. final latitude = metadata["latitude"];
  83. final longitude = metadata["longitude"];
  84. location = Location(latitude, longitude);
  85. fileType = getFileType(metadata["fileType"]);
  86. }
  87. Map<String, dynamic> getMetadata() {
  88. final metadata = Map<String, dynamic>();
  89. metadata["localID"] = localID;
  90. metadata["title"] = title;
  91. metadata["deviceFolder"] = deviceFolder;
  92. metadata["creationTime"] = creationTime;
  93. metadata["modificationTime"] = modificationTime;
  94. metadata["latitude"] = location.latitude;
  95. metadata["longitude"] = location.longitude;
  96. metadata["fileType"] = fileType.index;
  97. return metadata;
  98. }
  99. String getDownloadUrl() {
  100. return Configuration.instance.getHttpEndpoint() +
  101. "/files/download/" +
  102. uploadedFileID.toString();
  103. }
  104. // Passing token within the URL due to https://github.com/flutter/flutter/issues/16466
  105. String getStreamUrl() {
  106. return Configuration.instance.getHttpEndpoint() +
  107. "/streams/" +
  108. Configuration.instance.getToken() +
  109. "/" +
  110. uploadedFileID.toString() +
  111. "/index.m3u8";
  112. }
  113. String getThumbnailUrl() {
  114. return Configuration.instance.getHttpEndpoint() +
  115. "/files/preview/" +
  116. uploadedFileID.toString();
  117. }
  118. @override
  119. String toString() {
  120. return '''File(generatedId: $generatedID, uploadedFileId: $uploadedFileID,
  121. ownerID: $ownerID, collectionID: $collectionID,
  122. localId: $localID, title: $title, deviceFolder: $deviceFolder,
  123. location: $location, fileType: $fileType, creationTime: $creationTime,
  124. modificationTime: $modificationTime, updationTime: $updationTime)''';
  125. }
  126. @override
  127. bool operator ==(Object o) {
  128. if (identical(this, o)) return true;
  129. return o is File &&
  130. o.generatedID == generatedID &&
  131. o.uploadedFileID == uploadedFileID &&
  132. o.localID == localID;
  133. }
  134. @override
  135. int get hashCode {
  136. return generatedID.hashCode ^ uploadedFileID.hashCode ^ localID.hashCode;
  137. }
  138. String tag() {
  139. return "local_" +
  140. localID.toString() +
  141. ":remote_" +
  142. uploadedFileID.toString() +
  143. ":generated_" +
  144. generatedID.toString();
  145. }
  146. }