Преглед на файлове

change thumbhash to List<byte> from String

Luke McCarthy преди 2 години
родител
ревизия
8f8b083a56
променени са 4 файла, в които са добавени 91 реда и са изтрити 100 реда
  1. 7 1
      mobile/lib/routing/router.gr.dart
  2. 6 3
      mobile/lib/shared/models/asset.dart
  3. 77 95
      mobile/lib/shared/models/asset.g.dart
  4. 1 1
      mobile/lib/shared/ui/immich_image.dart

+ 7 - 1
mobile/lib/routing/router.gr.dart

@@ -84,6 +84,7 @@ class _$AppRouter extends RootStackRouter {
           onVideoEnded: args.onVideoEnded,
           onPlaying: args.onPlaying,
           onPaused: args.onPaused,
+          placeholder: args.placeholder,
         ),
       );
     },
@@ -673,6 +674,7 @@ class VideoViewerRoute extends PageRouteInfo<VideoViewerRouteArgs> {
     required dynamic onVideoEnded,
     dynamic onPlaying,
     dynamic onPaused,
+    Widget? placeholder,
   }) : super(
           VideoViewerRoute.name,
           path: '/video-viewer-page',
@@ -683,6 +685,7 @@ class VideoViewerRoute extends PageRouteInfo<VideoViewerRouteArgs> {
             onVideoEnded: onVideoEnded,
             onPlaying: onPlaying,
             onPaused: onPaused,
+            placeholder: placeholder,
           ),
         );
 
@@ -697,6 +700,7 @@ class VideoViewerRouteArgs {
     required this.onVideoEnded,
     this.onPlaying,
     this.onPaused,
+    this.placeholder,
   });
 
   final Key? key;
@@ -711,9 +715,11 @@ class VideoViewerRouteArgs {
 
   final dynamic onPaused;
 
+  final Widget? placeholder;
+
   @override
   String toString() {
-    return 'VideoViewerRouteArgs{key: $key, asset: $asset, isMotionVideo: $isMotionVideo, onVideoEnded: $onVideoEnded, onPlaying: $onPlaying, onPaused: $onPaused}';
+    return 'VideoViewerRouteArgs{key: $key, asset: $asset, isMotionVideo: $isMotionVideo, onVideoEnded: $onVideoEnded, onPlaying: $onPlaying, onPaused: $onPaused, placeholder: $placeholder}';
   }
 }
 

+ 6 - 3
mobile/lib/shared/models/asset.dart

@@ -1,4 +1,6 @@
 import 'dart:convert';
+import 'dart:ffi';
+import 'dart:typed_data';
 
 import 'package:immich_mobile/shared/models/exif_info.dart';
 import 'package:immich_mobile/shared/models/store.dart';
@@ -31,7 +33,8 @@ class Asset {
             remote.exifInfo != null ? ExifInfo.fromDto(remote.exifInfo!) : null,
         isFavorite = remote.isFavorite,
         isArchived = remote.isArchived,
-        thumbhash = remote.thumbhash;
+        thumbhash =
+            remote.thumbhash != null ? base64.decode(remote.thumbhash!) : null;
 
   Asset.local(AssetEntity local, List<int> hash)
       : localId = local.id,
@@ -110,7 +113,7 @@ class Asset {
   )
   String checksum;
 
-  String? thumbhash;
+  List<byte>? thumbhash;
 
   @Index(unique: false, replace: false, type: IndexType.hash)
   String? remoteId;
@@ -301,7 +304,7 @@ class Asset {
   Asset _copyWith({
     Id? id,
     String? checksum,
-    String? thumbhash,
+    List<byte>? thumbhash,
     String? remoteId,
     String? localId,
     int? ownerId,

+ 77 - 95
mobile/lib/shared/models/asset.g.dart

@@ -80,7 +80,7 @@ const AssetSchema = CollectionSchema(
     r'thumbhash': PropertySchema(
       id: 12,
       name: r'thumbhash',
-      type: IsarType.string,
+      type: IsarType.byteList,
     ),
     r'type': PropertySchema(
       id: 13,
@@ -187,7 +187,7 @@ int _assetEstimateSize(
   {
     final value = object.thumbhash;
     if (value != null) {
-      bytesCount += 3 + value.length * 3;
+      bytesCount += 3 + value.length;
     }
   }
   return bytesCount;
@@ -211,7 +211,7 @@ void _assetSerialize(
   writer.writeString(offsets[9], object.localId);
   writer.writeLong(offsets[10], object.ownerId);
   writer.writeString(offsets[11], object.remoteId);
-  writer.writeString(offsets[12], object.thumbhash);
+  writer.writeByteList(offsets[12], object.thumbhash);
   writer.writeByte(offsets[13], object.type.index);
   writer.writeDateTime(offsets[14], object.updatedAt);
   writer.writeInt(offsets[15], object.width);
@@ -237,7 +237,7 @@ Asset _assetDeserialize(
     localId: reader.readStringOrNull(offsets[9]),
     ownerId: reader.readLong(offsets[10]),
     remoteId: reader.readStringOrNull(offsets[11]),
-    thumbhash: reader.readStringOrNull(offsets[12]),
+    thumbhash: reader.readByteList(offsets[12]),
     type: _AssettypeValueEnumMap[reader.readByteOrNull(offsets[13])] ??
         AssetType.other,
     updatedAt: reader.readDateTime(offsets[14]),
@@ -278,7 +278,7 @@ P _assetDeserializeProp<P>(
     case 11:
       return (reader.readStringOrNull(offset)) as P;
     case 12:
-      return (reader.readStringOrNull(offset)) as P;
+      return (reader.readByteList(offset)) as P;
     case 13:
       return (_AssettypeValueEnumMap[reader.readByteOrNull(offset)] ??
           AssetType.other) as P;
@@ -1817,55 +1817,47 @@ extension AssetQueryFilter on QueryBuilder<Asset, Asset, QFilterCondition> {
     });
   }
 
-  QueryBuilder<Asset, Asset, QAfterFilterCondition> thumbhashEqualTo(
-    String? value, {
-    bool caseSensitive = true,
-  }) {
+  QueryBuilder<Asset, Asset, QAfterFilterCondition> thumbhashElementEqualTo(
+      int value) {
     return QueryBuilder.apply(this, (query) {
       return query.addFilterCondition(FilterCondition.equalTo(
         property: r'thumbhash',
         value: value,
-        caseSensitive: caseSensitive,
       ));
     });
   }
 
-  QueryBuilder<Asset, Asset, QAfterFilterCondition> thumbhashGreaterThan(
-    String? value, {
+  QueryBuilder<Asset, Asset, QAfterFilterCondition> thumbhashElementGreaterThan(
+    int value, {
     bool include = false,
-    bool caseSensitive = true,
   }) {
     return QueryBuilder.apply(this, (query) {
       return query.addFilterCondition(FilterCondition.greaterThan(
         include: include,
         property: r'thumbhash',
         value: value,
-        caseSensitive: caseSensitive,
       ));
     });
   }
 
-  QueryBuilder<Asset, Asset, QAfterFilterCondition> thumbhashLessThan(
-    String? value, {
+  QueryBuilder<Asset, Asset, QAfterFilterCondition> thumbhashElementLessThan(
+    int value, {
     bool include = false,
-    bool caseSensitive = true,
   }) {
     return QueryBuilder.apply(this, (query) {
       return query.addFilterCondition(FilterCondition.lessThan(
         include: include,
         property: r'thumbhash',
         value: value,
-        caseSensitive: caseSensitive,
       ));
     });
   }
 
-  QueryBuilder<Asset, Asset, QAfterFilterCondition> thumbhashBetween(
-    String? lower,
-    String? upper, {
+  QueryBuilder<Asset, Asset, QAfterFilterCondition> thumbhashElementBetween(
+    int lower,
+    int upper, {
     bool includeLower = true,
     bool includeUpper = true,
-    bool caseSensitive = true,
   }) {
     return QueryBuilder.apply(this, (query) {
       return query.addFilterCondition(FilterCondition.between(
@@ -1874,76 +1866,91 @@ extension AssetQueryFilter on QueryBuilder<Asset, Asset, QFilterCondition> {
         includeLower: includeLower,
         upper: upper,
         includeUpper: includeUpper,
-        caseSensitive: caseSensitive,
       ));
     });
   }
 
-  QueryBuilder<Asset, Asset, QAfterFilterCondition> thumbhashStartsWith(
-    String value, {
-    bool caseSensitive = true,
-  }) {
+  QueryBuilder<Asset, Asset, QAfterFilterCondition> thumbhashLengthEqualTo(
+      int length) {
     return QueryBuilder.apply(this, (query) {
-      return query.addFilterCondition(FilterCondition.startsWith(
-        property: r'thumbhash',
-        value: value,
-        caseSensitive: caseSensitive,
-      ));
+      return query.listLength(
+        r'thumbhash',
+        length,
+        true,
+        length,
+        true,
+      );
     });
   }
 
-  QueryBuilder<Asset, Asset, QAfterFilterCondition> thumbhashEndsWith(
-    String value, {
-    bool caseSensitive = true,
-  }) {
+  QueryBuilder<Asset, Asset, QAfterFilterCondition> thumbhashIsEmpty() {
     return QueryBuilder.apply(this, (query) {
-      return query.addFilterCondition(FilterCondition.endsWith(
-        property: r'thumbhash',
-        value: value,
-        caseSensitive: caseSensitive,
-      ));
+      return query.listLength(
+        r'thumbhash',
+        0,
+        true,
+        0,
+        true,
+      );
     });
   }
 
-  QueryBuilder<Asset, Asset, QAfterFilterCondition> thumbhashContains(
-      String value,
-      {bool caseSensitive = true}) {
+  QueryBuilder<Asset, Asset, QAfterFilterCondition> thumbhashIsNotEmpty() {
     return QueryBuilder.apply(this, (query) {
-      return query.addFilterCondition(FilterCondition.contains(
-        property: r'thumbhash',
-        value: value,
-        caseSensitive: caseSensitive,
-      ));
+      return query.listLength(
+        r'thumbhash',
+        0,
+        false,
+        999999,
+        true,
+      );
     });
   }
 
-  QueryBuilder<Asset, Asset, QAfterFilterCondition> thumbhashMatches(
-      String pattern,
-      {bool caseSensitive = true}) {
+  QueryBuilder<Asset, Asset, QAfterFilterCondition> thumbhashLengthLessThan(
+    int length, {
+    bool include = false,
+  }) {
     return QueryBuilder.apply(this, (query) {
-      return query.addFilterCondition(FilterCondition.matches(
-        property: r'thumbhash',
-        wildcard: pattern,
-        caseSensitive: caseSensitive,
-      ));
+      return query.listLength(
+        r'thumbhash',
+        0,
+        true,
+        length,
+        include,
+      );
     });
   }
 
-  QueryBuilder<Asset, Asset, QAfterFilterCondition> thumbhashIsEmpty() {
+  QueryBuilder<Asset, Asset, QAfterFilterCondition> thumbhashLengthGreaterThan(
+    int length, {
+    bool include = false,
+  }) {
     return QueryBuilder.apply(this, (query) {
-      return query.addFilterCondition(FilterCondition.equalTo(
-        property: r'thumbhash',
-        value: '',
-      ));
+      return query.listLength(
+        r'thumbhash',
+        length,
+        include,
+        999999,
+        true,
+      );
     });
   }
 
-  QueryBuilder<Asset, Asset, QAfterFilterCondition> thumbhashIsNotEmpty() {
+  QueryBuilder<Asset, Asset, QAfterFilterCondition> thumbhashLengthBetween(
+    int lower,
+    int upper, {
+    bool includeLower = true,
+    bool includeUpper = true,
+  }) {
     return QueryBuilder.apply(this, (query) {
-      return query.addFilterCondition(FilterCondition.greaterThan(
-        property: r'thumbhash',
-        value: '',
-      ));
+      return query.listLength(
+        r'thumbhash',
+        lower,
+        includeLower,
+        upper,
+        includeUpper,
+      );
     });
   }
 
@@ -2271,18 +2278,6 @@ extension AssetQuerySortBy on QueryBuilder<Asset, Asset, QSortBy> {
     });
   }
 
-  QueryBuilder<Asset, Asset, QAfterSortBy> sortByThumbhash() {
-    return QueryBuilder.apply(this, (query) {
-      return query.addSortBy(r'thumbhash', Sort.asc);
-    });
-  }
-
-  QueryBuilder<Asset, Asset, QAfterSortBy> sortByThumbhashDesc() {
-    return QueryBuilder.apply(this, (query) {
-      return query.addSortBy(r'thumbhash', Sort.desc);
-    });
-  }
-
   QueryBuilder<Asset, Asset, QAfterSortBy> sortByType() {
     return QueryBuilder.apply(this, (query) {
       return query.addSortBy(r'type', Sort.asc);
@@ -2477,18 +2472,6 @@ extension AssetQuerySortThenBy on QueryBuilder<Asset, Asset, QSortThenBy> {
     });
   }
 
-  QueryBuilder<Asset, Asset, QAfterSortBy> thenByThumbhash() {
-    return QueryBuilder.apply(this, (query) {
-      return query.addSortBy(r'thumbhash', Sort.asc);
-    });
-  }
-
-  QueryBuilder<Asset, Asset, QAfterSortBy> thenByThumbhashDesc() {
-    return QueryBuilder.apply(this, (query) {
-      return query.addSortBy(r'thumbhash', Sort.desc);
-    });
-  }
-
   QueryBuilder<Asset, Asset, QAfterSortBy> thenByType() {
     return QueryBuilder.apply(this, (query) {
       return query.addSortBy(r'type', Sort.asc);
@@ -2605,10 +2588,9 @@ extension AssetQueryWhereDistinct on QueryBuilder<Asset, Asset, QDistinct> {
     });
   }
 
-  QueryBuilder<Asset, Asset, QDistinct> distinctByThumbhash(
-      {bool caseSensitive = true}) {
+  QueryBuilder<Asset, Asset, QDistinct> distinctByThumbhash() {
     return QueryBuilder.apply(this, (query) {
-      return query.addDistinctBy(r'thumbhash', caseSensitive: caseSensitive);
+      return query.addDistinctBy(r'thumbhash');
     });
   }
 
@@ -2710,7 +2692,7 @@ extension AssetQueryProperty on QueryBuilder<Asset, Asset, QQueryProperty> {
     });
   }
 
-  QueryBuilder<Asset, String?, QQueryOperations> thumbhashProperty() {
+  QueryBuilder<Asset, List<int>?, QQueryOperations> thumbhashProperty() {
     return QueryBuilder.apply(this, (query) {
       return query.addPropertyName(r'thumbhash');
     });

+ 1 - 1
mobile/lib/shared/ui/immich_image.dart

@@ -104,7 +104,7 @@ class ImmichImage extends StatelessWidget {
           return FittedBox(
             fit: BoxFit.fill,
             child: Image(
-              image: ThumbHash.fromBase64(asset.thumbhash!).toImage(),
+              image: ThumbHash.fromIntList(asset.thumbhash!).toImage(),
             ),
           );
         } else if (useGrayBoxPlaceholder) {