file.dart 4.9 KB

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