From 8d15e319d3ce521d9501817cdb71d36a8538a32c Mon Sep 17 00:00:00 2001 From: PartyDonut <42371342+PartyDonut@users.noreply.github.com> Date: Fri, 25 Oct 2024 18:58:44 +0200 Subject: [PATCH] fix: Sync leaving left over temp files (#73) Co-authored-by: PartyDonut --- lib/l10n/app_en.arb | 43 +- lib/models/settings/home_settings_model.dart | 2 +- lib/models/syncing/i_synced_item.dart | 3 + lib/models/syncing/i_synced_item.g.dart | 766 ++++++++++-------- lib/models/syncing/sync_item.dart | 35 +- lib/models/syncing/sync_item.freezed.dart | 24 +- lib/providers/sync_provider.dart | 90 +- lib/screens/syncing/sync_item_details.dart | 12 +- lib/screens/syncing/sync_list_item.dart | 12 +- lib/screens/syncing/sync_widgets.dart | 14 +- ...ordelete.dart => sync_status_overlay.dart} | 33 +- .../syncing/widgets/synced_episode_item.dart | 8 +- linux/CMakeLists.txt | 2 +- macos/Runner/Configs/AppInfo.xcconfig | 2 +- windows/runner/Runner.rc | 4 +- 15 files changed, 644 insertions(+), 406 deletions(-) rename lib/screens/syncing/widgets/{sync_markedfordelete.dart => sync_status_overlay.dart} (50%) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 022abcc..9cb8fa2 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -267,8 +267,8 @@ "@hideEmpty": {}, "home": "Home", "@home": {}, - "homeBannerBanner": "Banner", - "@homeBannerBanner": {}, + "homeBannerSlideshow": "Slideshow", + "@homeBannerSlideshow": {}, "homeBannerCarousel": "Carousel", "@homeBannerCarousel": {}, "identify": "Identify", @@ -947,5 +947,44 @@ "example": "1" } } + }, + "syncStatusEnqueued": "Enqueued", + "syncStatusRunning": "Running", + "syncStatusComplete": "Complete", + "syncStatusNotFound": "Not Found", + "syncStatusFailed": "Failed", + "syncStatusCanceled": "Canceled", + "syncStatusWaitingToRetry": "Waiting to retry", + "syncStatusPaused": "Paused", + "syncStatusSynced": "Synced", + "syncStatusPartially": "Partially", + "syncOverlayDeleting": "Removing synced item", + "syncOverlaySyncing": "Syncing item details", + "syncSelectDownloadsFolder": "Select downloads folder", + "syncNoFolderSetup": "No sync folder setup", + "syncRemoveUnableToDeleteItem": "Unable to remove synced item, somethin went wrong", + "syncAddItemForSyncing": "Added {item} for syncing", + "@syncAddItemForSyncing":{ + "placeholders": { + "item":{ + "type": "String" + } + } + } , + "startedSyncingItem": "Started syncing {item}", + "@startedSyncingItem": { + "placeholders": { + "item":{ + "type": "String" + } + } + }, + "unableToSyncItem": "Unable to sync {item}, something went wrong", + "@unableToSyncItem": { + "placeholders": { + "item":{ + "type": "String" + } + } } } diff --git a/lib/models/settings/home_settings_model.dart b/lib/models/settings/home_settings_model.dart index 1ab5f31..2bbf044 100644 --- a/lib/models/settings/home_settings_model.dart +++ b/lib/models/settings/home_settings_model.dart @@ -28,7 +28,7 @@ enum HomeBanner { String label(BuildContext context) => switch (this) { HomeBanner.hide => context.localized.hide, HomeBanner.carousel => context.localized.homeBannerCarousel, - HomeBanner.banner => context.localized.homeBannerBanner, + HomeBanner.banner => context.localized.homeBannerSlideshow, }; } diff --git a/lib/models/syncing/i_synced_item.dart b/lib/models/syncing/i_synced_item.dart index bda2fd9..a0c2537 100644 --- a/lib/models/syncing/i_synced_item.dart +++ b/lib/models/syncing/i_synced_item.dart @@ -28,6 +28,7 @@ part 'i_synced_item.g.dart'; class ISyncedItem { String? userId; String id; + bool syncing; String? sortName; String? parentId; String? path; @@ -42,6 +43,7 @@ class ISyncedItem { ISyncedItem({ this.userId, required this.id, + required this.syncing, this.sortName, this.parentId, this.path, @@ -59,6 +61,7 @@ class ISyncedItem { return ISyncedItem( id: syncedItem.id, parentId: syncedItem.parentId, + syncing: syncedItem.syncing, userId: syncedItem.userId, path: syncedItem.path?.replaceAll(path ?? "", '').substring(1), fileSize: syncedItem.fileSize, diff --git a/lib/models/syncing/i_synced_item.g.dart b/lib/models/syncing/i_synced_item.g.dart index f69cac8..54d12a5 100644 --- a/lib/models/syncing/i_synced_item.g.dart +++ b/lib/models/syncing/i_synced_item.g.dart @@ -28,6 +28,10 @@ const ISyncedItemSchema = IsarGeneratedSchema( name: 'id', type: IsarType.string, ), + IsarPropertySchema( + name: 'syncing', + type: IsarType.bool, + ), IsarPropertySchema( name: 'sortName', type: IsarType.string, @@ -94,16 +98,9 @@ int serializeISyncedItem(IsarWriter writer, ISyncedItem object) { } } IsarCore.writeString(writer, 2, object.id); + IsarCore.writeBool(writer, 3, object.syncing); { final value = object.sortName; - if (value == null) { - IsarCore.writeNull(writer, 3); - } else { - IsarCore.writeString(writer, 3, value); - } - } - { - final value = object.parentId; if (value == null) { IsarCore.writeNull(writer, 4); } else { @@ -111,24 +108,24 @@ int serializeISyncedItem(IsarWriter writer, ISyncedItem object) { } } { - final value = object.path; + final value = object.parentId; if (value == null) { IsarCore.writeNull(writer, 5); } else { IsarCore.writeString(writer, 5, value); } } - IsarCore.writeLong(writer, 6, object.fileSize ?? -9223372036854775808); { - final value = object.videoFileName; + final value = object.path; if (value == null) { - IsarCore.writeNull(writer, 7); + IsarCore.writeNull(writer, 6); } else { - IsarCore.writeString(writer, 7, value); + IsarCore.writeString(writer, 6, value); } } + IsarCore.writeLong(writer, 7, object.fileSize ?? -9223372036854775808); { - final value = object.trickPlayModel; + final value = object.videoFileName; if (value == null) { IsarCore.writeNull(writer, 8); } else { @@ -136,7 +133,7 @@ int serializeISyncedItem(IsarWriter writer, ISyncedItem object) { } } { - final value = object.introOutroSkipModel; + final value = object.trickPlayModel; if (value == null) { IsarCore.writeNull(writer, 9); } else { @@ -144,7 +141,7 @@ int serializeISyncedItem(IsarWriter writer, ISyncedItem object) { } } { - final value = object.images; + final value = object.introOutroSkipModel; if (value == null) { IsarCore.writeNull(writer, 10); } else { @@ -152,19 +149,15 @@ int serializeISyncedItem(IsarWriter writer, ISyncedItem object) { } } { - final list = object.chapters; - if (list == null) { + final value = object.images; + if (value == null) { IsarCore.writeNull(writer, 11); } else { - final listWriter = IsarCore.beginList(writer, 11, list.length); - for (var i = 0; i < list.length; i++) { - IsarCore.writeString(listWriter, i, list[i]); - } - IsarCore.endList(writer, listWriter); + IsarCore.writeString(writer, 11, value); } } { - final list = object.subtitles; + final list = object.chapters; if (list == null) { IsarCore.writeNull(writer, 12); } else { @@ -176,11 +169,23 @@ int serializeISyncedItem(IsarWriter writer, ISyncedItem object) { } } { - final value = object.userData; - if (value == null) { + final list = object.subtitles; + if (list == null) { IsarCore.writeNull(writer, 13); } else { - IsarCore.writeString(writer, 13, value); + final listWriter = IsarCore.beginList(writer, 13, list.length); + for (var i = 0; i < list.length; i++) { + IsarCore.writeString(listWriter, i, list[i]); + } + IsarCore.endList(writer, listWriter); + } + } + { + final value = object.userData; + if (value == null) { + IsarCore.writeNull(writer, 14); + } else { + IsarCore.writeString(writer, 14, value); } } return Isar.fastHash(object.id); @@ -192,15 +197,17 @@ ISyncedItem deserializeISyncedItem(IsarReader reader) { _userId = IsarCore.readString(reader, 1); final String _id; _id = IsarCore.readString(reader, 2) ?? ''; + final bool _syncing; + _syncing = IsarCore.readBool(reader, 3); final String? _sortName; - _sortName = IsarCore.readString(reader, 3); + _sortName = IsarCore.readString(reader, 4); final String? _parentId; - _parentId = IsarCore.readString(reader, 4); + _parentId = IsarCore.readString(reader, 5); final String? _path; - _path = IsarCore.readString(reader, 5); + _path = IsarCore.readString(reader, 6); final int? _fileSize; { - final value = IsarCore.readLong(reader, 6); + final value = IsarCore.readLong(reader, 7); if (value == -9223372036854775808) { _fileSize = null; } else { @@ -208,16 +215,16 @@ ISyncedItem deserializeISyncedItem(IsarReader reader) { } } final String? _videoFileName; - _videoFileName = IsarCore.readString(reader, 7); + _videoFileName = IsarCore.readString(reader, 8); final String? _trickPlayModel; - _trickPlayModel = IsarCore.readString(reader, 8); + _trickPlayModel = IsarCore.readString(reader, 9); final String? _introOutroSkipModel; - _introOutroSkipModel = IsarCore.readString(reader, 9); + _introOutroSkipModel = IsarCore.readString(reader, 10); final String? _images; - _images = IsarCore.readString(reader, 10); + _images = IsarCore.readString(reader, 11); final List? _chapters; { - final length = IsarCore.readList(reader, 11, IsarCore.readerPtrPtr); + final length = IsarCore.readList(reader, 12, IsarCore.readerPtrPtr); { final reader = IsarCore.readerPtr; if (reader.isNull) { @@ -234,7 +241,7 @@ ISyncedItem deserializeISyncedItem(IsarReader reader) { } final List? _subtitles; { - final length = IsarCore.readList(reader, 12, IsarCore.readerPtrPtr); + final length = IsarCore.readList(reader, 13, IsarCore.readerPtrPtr); { final reader = IsarCore.readerPtr; if (reader.isNull) { @@ -250,10 +257,11 @@ ISyncedItem deserializeISyncedItem(IsarReader reader) { } } final String? _userData; - _userData = IsarCore.readString(reader, 13); + _userData = IsarCore.readString(reader, 14); final object = ISyncedItem( userId: _userId, id: _id, + syncing: _syncing, sortName: _sortName, parentId: _parentId, path: _path, @@ -277,22 +285,22 @@ dynamic deserializeISyncedItemProp(IsarReader reader, int property) { case 2: return IsarCore.readString(reader, 2) ?? ''; case 3: - return IsarCore.readString(reader, 3); + return IsarCore.readBool(reader, 3); case 4: return IsarCore.readString(reader, 4); case 5: return IsarCore.readString(reader, 5); case 6: + return IsarCore.readString(reader, 6); + case 7: { - final value = IsarCore.readLong(reader, 6); + final value = IsarCore.readLong(reader, 7); if (value == -9223372036854775808) { return null; } else { return value; } } - case 7: - return IsarCore.readString(reader, 7); case 8: return IsarCore.readString(reader, 8); case 9: @@ -300,22 +308,7 @@ dynamic deserializeISyncedItemProp(IsarReader reader, int property) { case 10: return IsarCore.readString(reader, 10); case 11: - { - final length = IsarCore.readList(reader, 11, IsarCore.readerPtrPtr); - { - final reader = IsarCore.readerPtr; - if (reader.isNull) { - return null; - } else { - final list = List.filled(length, '', growable: true); - for (var i = 0; i < length; i++) { - list[i] = IsarCore.readString(reader, i) ?? ''; - } - IsarCore.freeReader(reader); - return list; - } - } - } + return IsarCore.readString(reader, 11); case 12: { final length = IsarCore.readList(reader, 12, IsarCore.readerPtrPtr); @@ -334,7 +327,24 @@ dynamic deserializeISyncedItemProp(IsarReader reader, int property) { } } case 13: - return IsarCore.readString(reader, 13); + { + final length = IsarCore.readList(reader, 13, IsarCore.readerPtrPtr); + { + final reader = IsarCore.readerPtr; + if (reader.isNull) { + return null; + } else { + final list = List.filled(length, '', growable: true); + for (var i = 0; i < length; i++) { + list[i] = IsarCore.readString(reader, i) ?? ''; + } + IsarCore.freeReader(reader); + return list; + } + } + } + case 14: + return IsarCore.readString(reader, 14); default: throw ArgumentError('Unknown property: $property'); } @@ -344,6 +354,7 @@ sealed class _ISyncedItemUpdate { bool call({ required String id, String? userId, + bool? syncing, String? sortName, String? parentId, String? path, @@ -365,6 +376,7 @@ class _ISyncedItemUpdateImpl implements _ISyncedItemUpdate { bool call({ required String id, Object? userId = ignore, + Object? syncing = ignore, Object? sortName = ignore, Object? parentId = ignore, Object? path = ignore, @@ -379,15 +391,16 @@ class _ISyncedItemUpdateImpl implements _ISyncedItemUpdate { id ], { if (userId != ignore) 1: userId as String?, - if (sortName != ignore) 3: sortName as String?, - if (parentId != ignore) 4: parentId as String?, - if (path != ignore) 5: path as String?, - if (fileSize != ignore) 6: fileSize as int?, - if (videoFileName != ignore) 7: videoFileName as String?, - if (trickPlayModel != ignore) 8: trickPlayModel as String?, - if (introOutroSkipModel != ignore) 9: introOutroSkipModel as String?, - if (images != ignore) 10: images as String?, - if (userData != ignore) 13: userData as String?, + if (syncing != ignore) 3: syncing as bool?, + if (sortName != ignore) 4: sortName as String?, + if (parentId != ignore) 5: parentId as String?, + if (path != ignore) 6: path as String?, + if (fileSize != ignore) 7: fileSize as int?, + if (videoFileName != ignore) 8: videoFileName as String?, + if (trickPlayModel != ignore) 9: trickPlayModel as String?, + if (introOutroSkipModel != ignore) 10: introOutroSkipModel as String?, + if (images != ignore) 11: images as String?, + if (userData != ignore) 14: userData as String?, }) > 0; } @@ -397,6 +410,7 @@ sealed class _ISyncedItemUpdateAll { int call({ required List id, String? userId, + bool? syncing, String? sortName, String? parentId, String? path, @@ -418,6 +432,7 @@ class _ISyncedItemUpdateAllImpl implements _ISyncedItemUpdateAll { int call({ required List id, Object? userId = ignore, + Object? syncing = ignore, Object? sortName = ignore, Object? parentId = ignore, Object? path = ignore, @@ -430,15 +445,16 @@ class _ISyncedItemUpdateAllImpl implements _ISyncedItemUpdateAll { }) { return collection.updateProperties(id, { if (userId != ignore) 1: userId as String?, - if (sortName != ignore) 3: sortName as String?, - if (parentId != ignore) 4: parentId as String?, - if (path != ignore) 5: path as String?, - if (fileSize != ignore) 6: fileSize as int?, - if (videoFileName != ignore) 7: videoFileName as String?, - if (trickPlayModel != ignore) 8: trickPlayModel as String?, - if (introOutroSkipModel != ignore) 9: introOutroSkipModel as String?, - if (images != ignore) 10: images as String?, - if (userData != ignore) 13: userData as String?, + if (syncing != ignore) 3: syncing as bool?, + if (sortName != ignore) 4: sortName as String?, + if (parentId != ignore) 5: parentId as String?, + if (path != ignore) 6: path as String?, + if (fileSize != ignore) 7: fileSize as int?, + if (videoFileName != ignore) 8: videoFileName as String?, + if (trickPlayModel != ignore) 9: trickPlayModel as String?, + if (introOutroSkipModel != ignore) 10: introOutroSkipModel as String?, + if (images != ignore) 11: images as String?, + if (userData != ignore) 14: userData as String?, }); } } @@ -452,6 +468,7 @@ extension ISyncedItemUpdate on IsarCollection { sealed class _ISyncedItemQueryUpdate { int call({ String? userId, + bool? syncing, String? sortName, String? parentId, String? path, @@ -473,6 +490,7 @@ class _ISyncedItemQueryUpdateImpl implements _ISyncedItemQueryUpdate { @override int call({ Object? userId = ignore, + Object? syncing = ignore, Object? sortName = ignore, Object? parentId = ignore, Object? path = ignore, @@ -485,15 +503,16 @@ class _ISyncedItemQueryUpdateImpl implements _ISyncedItemQueryUpdate { }) { return query.updateProperties(limit: limit, { if (userId != ignore) 1: userId as String?, - if (sortName != ignore) 3: sortName as String?, - if (parentId != ignore) 4: parentId as String?, - if (path != ignore) 5: path as String?, - if (fileSize != ignore) 6: fileSize as int?, - if (videoFileName != ignore) 7: videoFileName as String?, - if (trickPlayModel != ignore) 8: trickPlayModel as String?, - if (introOutroSkipModel != ignore) 9: introOutroSkipModel as String?, - if (images != ignore) 10: images as String?, - if (userData != ignore) 13: userData as String?, + if (syncing != ignore) 3: syncing as bool?, + if (sortName != ignore) 4: sortName as String?, + if (parentId != ignore) 5: parentId as String?, + if (path != ignore) 6: path as String?, + if (fileSize != ignore) 7: fileSize as int?, + if (videoFileName != ignore) 8: videoFileName as String?, + if (trickPlayModel != ignore) 9: trickPlayModel as String?, + if (introOutroSkipModel != ignore) 10: introOutroSkipModel as String?, + if (images != ignore) 11: images as String?, + if (userData != ignore) 14: userData as String?, }); } } @@ -514,6 +533,7 @@ class _ISyncedItemQueryBuilderUpdateImpl implements _ISyncedItemQueryUpdate { @override int call({ Object? userId = ignore, + Object? syncing = ignore, Object? sortName = ignore, Object? parentId = ignore, Object? path = ignore, @@ -528,15 +548,16 @@ class _ISyncedItemQueryBuilderUpdateImpl implements _ISyncedItemQueryUpdate { try { return q.updateProperties(limit: limit, { if (userId != ignore) 1: userId as String?, - if (sortName != ignore) 3: sortName as String?, - if (parentId != ignore) 4: parentId as String?, - if (path != ignore) 5: path as String?, - if (fileSize != ignore) 6: fileSize as int?, - if (videoFileName != ignore) 7: videoFileName as String?, - if (trickPlayModel != ignore) 8: trickPlayModel as String?, - if (introOutroSkipModel != ignore) 9: introOutroSkipModel as String?, - if (images != ignore) 10: images as String?, - if (userData != ignore) 13: userData as String?, + if (syncing != ignore) 3: syncing as bool?, + if (sortName != ignore) 4: sortName as String?, + if (parentId != ignore) 5: parentId as String?, + if (path != ignore) 6: path as String?, + if (fileSize != ignore) 7: fileSize as int?, + if (videoFileName != ignore) 8: videoFileName as String?, + if (trickPlayModel != ignore) 9: trickPlayModel as String?, + if (introOutroSkipModel != ignore) 10: introOutroSkipModel as String?, + if (images != ignore) 11: images as String?, + if (userData != ignore) 14: userData as String?, }); } finally { q.close(); @@ -920,17 +941,30 @@ extension ISyncedItemQueryFilter }); } + QueryBuilder syncingEqualTo( + bool value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + EqualCondition( + property: 3, + value: value, + ), + ); + }); + } + QueryBuilder sortNameIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const IsNullCondition(property: 3)); + return query.addFilterCondition(const IsNullCondition(property: 4)); }); } QueryBuilder sortNameIsNotNull() { return QueryBuilder.apply(not(), (query) { - return query.addFilterCondition(const IsNullCondition(property: 3)); + return query.addFilterCondition(const IsNullCondition(property: 4)); }); } @@ -941,7 +975,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( EqualCondition( - property: 3, + property: 4, value: value, caseSensitive: caseSensitive, ), @@ -957,7 +991,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( GreaterCondition( - property: 3, + property: 4, value: value, caseSensitive: caseSensitive, ), @@ -973,7 +1007,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( GreaterOrEqualCondition( - property: 3, + property: 4, value: value, caseSensitive: caseSensitive, ), @@ -989,7 +1023,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( LessCondition( - property: 3, + property: 4, value: value, caseSensitive: caseSensitive, ), @@ -1005,7 +1039,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( LessOrEqualCondition( - property: 3, + property: 4, value: value, caseSensitive: caseSensitive, ), @@ -1021,7 +1055,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( BetweenCondition( - property: 3, + property: 4, lower: lower, upper: upper, caseSensitive: caseSensitive, @@ -1038,7 +1072,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( StartsWithCondition( - property: 3, + property: 4, value: value, caseSensitive: caseSensitive, ), @@ -1054,7 +1088,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( EndsWithCondition( - property: 3, + property: 4, value: value, caseSensitive: caseSensitive, ), @@ -1067,7 +1101,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( ContainsCondition( - property: 3, + property: 4, value: value, caseSensitive: caseSensitive, ), @@ -1081,7 +1115,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( MatchesCondition( - property: 3, + property: 4, wildcard: pattern, caseSensitive: caseSensitive, ), @@ -1094,7 +1128,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( const EqualCondition( - property: 3, + property: 4, value: '', ), ); @@ -1106,7 +1140,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( const GreaterCondition( - property: 3, + property: 4, value: '', ), ); @@ -1116,14 +1150,14 @@ extension ISyncedItemQueryFilter QueryBuilder parentIdIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const IsNullCondition(property: 4)); + return query.addFilterCondition(const IsNullCondition(property: 5)); }); } QueryBuilder parentIdIsNotNull() { return QueryBuilder.apply(not(), (query) { - return query.addFilterCondition(const IsNullCondition(property: 4)); + return query.addFilterCondition(const IsNullCondition(property: 5)); }); } @@ -1134,7 +1168,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( EqualCondition( - property: 4, + property: 5, value: value, caseSensitive: caseSensitive, ), @@ -1150,7 +1184,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( GreaterCondition( - property: 4, + property: 5, value: value, caseSensitive: caseSensitive, ), @@ -1166,7 +1200,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( GreaterOrEqualCondition( - property: 4, + property: 5, value: value, caseSensitive: caseSensitive, ), @@ -1182,7 +1216,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( LessCondition( - property: 4, + property: 5, value: value, caseSensitive: caseSensitive, ), @@ -1198,7 +1232,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( LessOrEqualCondition( - property: 4, + property: 5, value: value, caseSensitive: caseSensitive, ), @@ -1214,7 +1248,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( BetweenCondition( - property: 4, + property: 5, lower: lower, upper: upper, caseSensitive: caseSensitive, @@ -1231,7 +1265,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( StartsWithCondition( - property: 4, + property: 5, value: value, caseSensitive: caseSensitive, ), @@ -1247,7 +1281,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( EndsWithCondition( - property: 4, + property: 5, value: value, caseSensitive: caseSensitive, ), @@ -1260,7 +1294,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( ContainsCondition( - property: 4, + property: 5, value: value, caseSensitive: caseSensitive, ), @@ -1274,7 +1308,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( MatchesCondition( - property: 4, + property: 5, wildcard: pattern, caseSensitive: caseSensitive, ), @@ -1287,7 +1321,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( const EqualCondition( - property: 4, + property: 5, value: '', ), ); @@ -1299,7 +1333,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( const GreaterCondition( - property: 4, + property: 5, value: '', ), ); @@ -1308,14 +1342,14 @@ extension ISyncedItemQueryFilter QueryBuilder pathIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const IsNullCondition(property: 5)); + return query.addFilterCondition(const IsNullCondition(property: 6)); }); } QueryBuilder pathIsNotNull() { return QueryBuilder.apply(not(), (query) { - return query.addFilterCondition(const IsNullCondition(property: 5)); + return query.addFilterCondition(const IsNullCondition(property: 6)); }); } @@ -1326,7 +1360,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( EqualCondition( - property: 5, + property: 6, value: value, caseSensitive: caseSensitive, ), @@ -1341,7 +1375,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( GreaterCondition( - property: 5, + property: 6, value: value, caseSensitive: caseSensitive, ), @@ -1357,7 +1391,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( GreaterOrEqualCondition( - property: 5, + property: 6, value: value, caseSensitive: caseSensitive, ), @@ -1372,7 +1406,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( LessCondition( - property: 5, + property: 6, value: value, caseSensitive: caseSensitive, ), @@ -1388,7 +1422,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( LessOrEqualCondition( - property: 5, + property: 6, value: value, caseSensitive: caseSensitive, ), @@ -1404,7 +1438,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( BetweenCondition( - property: 5, + property: 6, lower: lower, upper: upper, caseSensitive: caseSensitive, @@ -1420,7 +1454,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( StartsWithCondition( - property: 5, + property: 6, value: value, caseSensitive: caseSensitive, ), @@ -1435,7 +1469,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( EndsWithCondition( - property: 5, + property: 6, value: value, caseSensitive: caseSensitive, ), @@ -1449,7 +1483,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( ContainsCondition( - property: 5, + property: 6, value: value, caseSensitive: caseSensitive, ), @@ -1463,7 +1497,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( MatchesCondition( - property: 5, + property: 6, wildcard: pattern, caseSensitive: caseSensitive, ), @@ -1475,7 +1509,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( const EqualCondition( - property: 5, + property: 6, value: '', ), ); @@ -1487,7 +1521,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( const GreaterCondition( - property: 5, + property: 6, value: '', ), ); @@ -1497,14 +1531,14 @@ extension ISyncedItemQueryFilter QueryBuilder fileSizeIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const IsNullCondition(property: 6)); + return query.addFilterCondition(const IsNullCondition(property: 7)); }); } QueryBuilder fileSizeIsNotNull() { return QueryBuilder.apply(not(), (query) { - return query.addFilterCondition(const IsNullCondition(property: 6)); + return query.addFilterCondition(const IsNullCondition(property: 7)); }); } @@ -1514,7 +1548,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( EqualCondition( - property: 6, + property: 7, value: value, ), ); @@ -1528,7 +1562,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( GreaterCondition( - property: 6, + property: 7, value: value, ), ); @@ -1542,7 +1576,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( GreaterOrEqualCondition( - property: 6, + property: 7, value: value, ), ); @@ -1556,7 +1590,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( LessCondition( - property: 6, + property: 7, value: value, ), ); @@ -1570,7 +1604,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( LessOrEqualCondition( - property: 6, + property: 7, value: value, ), ); @@ -1584,7 +1618,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( BetweenCondition( - property: 6, + property: 7, lower: lower, upper: upper, ), @@ -1595,14 +1629,14 @@ extension ISyncedItemQueryFilter QueryBuilder videoFileNameIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const IsNullCondition(property: 7)); + return query.addFilterCondition(const IsNullCondition(property: 8)); }); } QueryBuilder videoFileNameIsNotNull() { return QueryBuilder.apply(not(), (query) { - return query.addFilterCondition(const IsNullCondition(property: 7)); + return query.addFilterCondition(const IsNullCondition(property: 8)); }); } @@ -1614,7 +1648,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( EqualCondition( - property: 7, + property: 8, value: value, caseSensitive: caseSensitive, ), @@ -1630,7 +1664,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( GreaterCondition( - property: 7, + property: 8, value: value, caseSensitive: caseSensitive, ), @@ -1646,7 +1680,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( GreaterOrEqualCondition( - property: 7, + property: 8, value: value, caseSensitive: caseSensitive, ), @@ -1662,7 +1696,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( LessCondition( - property: 7, + property: 8, value: value, caseSensitive: caseSensitive, ), @@ -1678,7 +1712,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( LessOrEqualCondition( - property: 7, + property: 8, value: value, caseSensitive: caseSensitive, ), @@ -1695,7 +1729,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( BetweenCondition( - property: 7, + property: 8, lower: lower, upper: upper, caseSensitive: caseSensitive, @@ -1712,7 +1746,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( StartsWithCondition( - property: 7, + property: 8, value: value, caseSensitive: caseSensitive, ), @@ -1728,7 +1762,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( EndsWithCondition( - property: 7, + property: 8, value: value, caseSensitive: caseSensitive, ), @@ -1741,7 +1775,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( ContainsCondition( - property: 7, + property: 8, value: value, caseSensitive: caseSensitive, ), @@ -1754,7 +1788,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( MatchesCondition( - property: 7, + property: 8, wildcard: pattern, caseSensitive: caseSensitive, ), @@ -1767,7 +1801,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( const EqualCondition( - property: 7, + property: 8, value: '', ), ); @@ -1779,7 +1813,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( const GreaterCondition( - property: 7, + property: 8, value: '', ), ); @@ -1789,14 +1823,14 @@ extension ISyncedItemQueryFilter QueryBuilder trickPlayModelIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const IsNullCondition(property: 8)); + return query.addFilterCondition(const IsNullCondition(property: 9)); }); } QueryBuilder trickPlayModelIsNotNull() { return QueryBuilder.apply(not(), (query) { - return query.addFilterCondition(const IsNullCondition(property: 8)); + return query.addFilterCondition(const IsNullCondition(property: 9)); }); } @@ -1808,7 +1842,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( EqualCondition( - property: 8, + property: 9, value: value, caseSensitive: caseSensitive, ), @@ -1824,7 +1858,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( GreaterCondition( - property: 8, + property: 9, value: value, caseSensitive: caseSensitive, ), @@ -1840,7 +1874,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( GreaterOrEqualCondition( - property: 8, + property: 9, value: value, caseSensitive: caseSensitive, ), @@ -1856,7 +1890,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( LessCondition( - property: 8, + property: 9, value: value, caseSensitive: caseSensitive, ), @@ -1872,7 +1906,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( LessOrEqualCondition( - property: 8, + property: 9, value: value, caseSensitive: caseSensitive, ), @@ -1889,7 +1923,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( BetweenCondition( - property: 8, + property: 9, lower: lower, upper: upper, caseSensitive: caseSensitive, @@ -1906,7 +1940,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( StartsWithCondition( - property: 8, + property: 9, value: value, caseSensitive: caseSensitive, ), @@ -1922,7 +1956,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( EndsWithCondition( - property: 8, + property: 9, value: value, caseSensitive: caseSensitive, ), @@ -1935,7 +1969,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( ContainsCondition( - property: 8, + property: 9, value: value, caseSensitive: caseSensitive, ), @@ -1948,7 +1982,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( MatchesCondition( - property: 8, + property: 9, wildcard: pattern, caseSensitive: caseSensitive, ), @@ -1961,7 +1995,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( const EqualCondition( - property: 8, + property: 9, value: '', ), ); @@ -1973,7 +2007,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( const GreaterCondition( - property: 8, + property: 9, value: '', ), ); @@ -1983,14 +2017,14 @@ extension ISyncedItemQueryFilter QueryBuilder introOutroSkipModelIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const IsNullCondition(property: 9)); + return query.addFilterCondition(const IsNullCondition(property: 10)); }); } QueryBuilder introOutroSkipModelIsNotNull() { return QueryBuilder.apply(not(), (query) { - return query.addFilterCondition(const IsNullCondition(property: 9)); + return query.addFilterCondition(const IsNullCondition(property: 10)); }); } @@ -2002,7 +2036,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( EqualCondition( - property: 9, + property: 10, value: value, caseSensitive: caseSensitive, ), @@ -2018,7 +2052,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( GreaterCondition( - property: 9, + property: 10, value: value, caseSensitive: caseSensitive, ), @@ -2034,7 +2068,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( GreaterOrEqualCondition( - property: 9, + property: 10, value: value, caseSensitive: caseSensitive, ), @@ -2050,7 +2084,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( LessCondition( - property: 9, + property: 10, value: value, caseSensitive: caseSensitive, ), @@ -2066,7 +2100,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( LessOrEqualCondition( - property: 9, + property: 10, value: value, caseSensitive: caseSensitive, ), @@ -2083,7 +2117,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( BetweenCondition( - property: 9, + property: 10, lower: lower, upper: upper, caseSensitive: caseSensitive, @@ -2100,7 +2134,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( StartsWithCondition( - property: 9, + property: 10, value: value, caseSensitive: caseSensitive, ), @@ -2116,7 +2150,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( EndsWithCondition( - property: 9, + property: 10, value: value, caseSensitive: caseSensitive, ), @@ -2129,7 +2163,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( ContainsCondition( - property: 9, + property: 10, value: value, caseSensitive: caseSensitive, ), @@ -2142,7 +2176,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( MatchesCondition( - property: 9, + property: 10, wildcard: pattern, caseSensitive: caseSensitive, ), @@ -2155,7 +2189,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( const EqualCondition( - property: 9, + property: 10, value: '', ), ); @@ -2167,7 +2201,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( const GreaterCondition( - property: 9, + property: 10, value: '', ), ); @@ -2176,14 +2210,14 @@ extension ISyncedItemQueryFilter QueryBuilder imagesIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const IsNullCondition(property: 10)); + return query.addFilterCondition(const IsNullCondition(property: 11)); }); } QueryBuilder imagesIsNotNull() { return QueryBuilder.apply(not(), (query) { - return query.addFilterCondition(const IsNullCondition(property: 10)); + return query.addFilterCondition(const IsNullCondition(property: 11)); }); } @@ -2194,7 +2228,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( EqualCondition( - property: 10, + property: 11, value: value, caseSensitive: caseSensitive, ), @@ -2210,7 +2244,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( GreaterCondition( - property: 10, + property: 11, value: value, caseSensitive: caseSensitive, ), @@ -2226,7 +2260,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( GreaterOrEqualCondition( - property: 10, + property: 11, value: value, caseSensitive: caseSensitive, ), @@ -2241,7 +2275,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( LessCondition( - property: 10, + property: 11, value: value, caseSensitive: caseSensitive, ), @@ -2257,7 +2291,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( LessOrEqualCondition( - property: 10, + property: 11, value: value, caseSensitive: caseSensitive, ), @@ -2273,7 +2307,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( BetweenCondition( - property: 10, + property: 11, lower: lower, upper: upper, caseSensitive: caseSensitive, @@ -2290,7 +2324,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( StartsWithCondition( - property: 10, + property: 11, value: value, caseSensitive: caseSensitive, ), @@ -2305,7 +2339,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( EndsWithCondition( - property: 10, + property: 11, value: value, caseSensitive: caseSensitive, ), @@ -2319,7 +2353,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( ContainsCondition( - property: 10, + property: 11, value: value, caseSensitive: caseSensitive, ), @@ -2333,7 +2367,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( MatchesCondition( - property: 10, + property: 11, wildcard: pattern, caseSensitive: caseSensitive, ), @@ -2346,7 +2380,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( const EqualCondition( - property: 10, + property: 11, value: '', ), ); @@ -2358,7 +2392,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( const GreaterCondition( - property: 10, + property: 11, value: '', ), ); @@ -2368,14 +2402,14 @@ extension ISyncedItemQueryFilter QueryBuilder chaptersIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const IsNullCondition(property: 11)); + return query.addFilterCondition(const IsNullCondition(property: 12)); }); } QueryBuilder chaptersIsNotNull() { return QueryBuilder.apply(not(), (query) { - return query.addFilterCondition(const IsNullCondition(property: 11)); + return query.addFilterCondition(const IsNullCondition(property: 12)); }); } @@ -2387,7 +2421,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( EqualCondition( - property: 11, + property: 12, value: value, caseSensitive: caseSensitive, ), @@ -2403,7 +2437,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( GreaterCondition( - property: 11, + property: 12, value: value, caseSensitive: caseSensitive, ), @@ -2419,7 +2453,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( GreaterOrEqualCondition( - property: 11, + property: 12, value: value, caseSensitive: caseSensitive, ), @@ -2435,7 +2469,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( LessCondition( - property: 11, + property: 12, value: value, caseSensitive: caseSensitive, ), @@ -2451,7 +2485,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( LessOrEqualCondition( - property: 11, + property: 12, value: value, caseSensitive: caseSensitive, ), @@ -2468,7 +2502,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( BetweenCondition( - property: 11, + property: 12, lower: lower, upper: upper, caseSensitive: caseSensitive, @@ -2485,7 +2519,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( StartsWithCondition( - property: 11, + property: 12, value: value, caseSensitive: caseSensitive, ), @@ -2501,7 +2535,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( EndsWithCondition( - property: 11, + property: 12, value: value, caseSensitive: caseSensitive, ), @@ -2514,7 +2548,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( ContainsCondition( - property: 11, + property: 12, value: value, caseSensitive: caseSensitive, ), @@ -2527,7 +2561,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( MatchesCondition( - property: 11, + property: 12, wildcard: pattern, caseSensitive: caseSensitive, ), @@ -2540,7 +2574,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( const EqualCondition( - property: 11, + property: 12, value: '', ), ); @@ -2552,7 +2586,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( const GreaterCondition( - property: 11, + property: 12, value: '', ), ); @@ -2570,7 +2604,7 @@ extension ISyncedItemQueryFilter chaptersIsNotEmpty() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition( - const GreaterOrEqualCondition(property: 11, value: null), + const GreaterOrEqualCondition(property: 12, value: null), ); }); } @@ -2578,14 +2612,14 @@ extension ISyncedItemQueryFilter QueryBuilder subtitlesIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const IsNullCondition(property: 12)); + return query.addFilterCondition(const IsNullCondition(property: 13)); }); } QueryBuilder subtitlesIsNotNull() { return QueryBuilder.apply(not(), (query) { - return query.addFilterCondition(const IsNullCondition(property: 12)); + return query.addFilterCondition(const IsNullCondition(property: 13)); }); } @@ -2597,7 +2631,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( EqualCondition( - property: 12, + property: 13, value: value, caseSensitive: caseSensitive, ), @@ -2613,7 +2647,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( GreaterCondition( - property: 12, + property: 13, value: value, caseSensitive: caseSensitive, ), @@ -2629,7 +2663,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( GreaterOrEqualCondition( - property: 12, + property: 13, value: value, caseSensitive: caseSensitive, ), @@ -2645,7 +2679,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( LessCondition( - property: 12, + property: 13, value: value, caseSensitive: caseSensitive, ), @@ -2661,7 +2695,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( LessOrEqualCondition( - property: 12, + property: 13, value: value, caseSensitive: caseSensitive, ), @@ -2678,7 +2712,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( BetweenCondition( - property: 12, + property: 13, lower: lower, upper: upper, caseSensitive: caseSensitive, @@ -2695,7 +2729,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( StartsWithCondition( - property: 12, + property: 13, value: value, caseSensitive: caseSensitive, ), @@ -2711,7 +2745,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( EndsWithCondition( - property: 12, + property: 13, value: value, caseSensitive: caseSensitive, ), @@ -2724,7 +2758,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( ContainsCondition( - property: 12, + property: 13, value: value, caseSensitive: caseSensitive, ), @@ -2737,7 +2771,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( MatchesCondition( - property: 12, + property: 13, wildcard: pattern, caseSensitive: caseSensitive, ), @@ -2750,7 +2784,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( const EqualCondition( - property: 12, + property: 13, value: '', ), ); @@ -2762,7 +2796,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( const GreaterCondition( - property: 12, + property: 13, value: '', ), ); @@ -2780,7 +2814,7 @@ extension ISyncedItemQueryFilter subtitlesIsNotEmpty() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition( - const GreaterOrEqualCondition(property: 12, value: null), + const GreaterOrEqualCondition(property: 13, value: null), ); }); } @@ -2788,14 +2822,14 @@ extension ISyncedItemQueryFilter QueryBuilder userDataIsNull() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const IsNullCondition(property: 13)); + return query.addFilterCondition(const IsNullCondition(property: 14)); }); } QueryBuilder userDataIsNotNull() { return QueryBuilder.apply(not(), (query) { - return query.addFilterCondition(const IsNullCondition(property: 13)); + return query.addFilterCondition(const IsNullCondition(property: 14)); }); } @@ -2806,7 +2840,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( EqualCondition( - property: 13, + property: 14, value: value, caseSensitive: caseSensitive, ), @@ -2822,7 +2856,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( GreaterCondition( - property: 13, + property: 14, value: value, caseSensitive: caseSensitive, ), @@ -2838,7 +2872,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( GreaterOrEqualCondition( - property: 13, + property: 14, value: value, caseSensitive: caseSensitive, ), @@ -2854,7 +2888,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( LessCondition( - property: 13, + property: 14, value: value, caseSensitive: caseSensitive, ), @@ -2870,7 +2904,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( LessOrEqualCondition( - property: 13, + property: 14, value: value, caseSensitive: caseSensitive, ), @@ -2886,7 +2920,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( BetweenCondition( - property: 13, + property: 14, lower: lower, upper: upper, caseSensitive: caseSensitive, @@ -2903,7 +2937,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( StartsWithCondition( - property: 13, + property: 14, value: value, caseSensitive: caseSensitive, ), @@ -2919,7 +2953,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( EndsWithCondition( - property: 13, + property: 14, value: value, caseSensitive: caseSensitive, ), @@ -2932,7 +2966,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( ContainsCondition( - property: 13, + property: 14, value: value, caseSensitive: caseSensitive, ), @@ -2946,7 +2980,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( MatchesCondition( - property: 13, + property: 14, wildcard: pattern, caseSensitive: caseSensitive, ), @@ -2959,7 +2993,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( const EqualCondition( - property: 13, + property: 14, value: '', ), ); @@ -2971,7 +3005,7 @@ extension ISyncedItemQueryFilter return QueryBuilder.apply(this, (query) { return query.addFilterCondition( const GreaterCondition( - property: 13, + property: 14, value: '', ), ); @@ -3026,11 +3060,23 @@ extension ISyncedItemQuerySortBy }); } + QueryBuilder sortBySyncing() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(3); + }); + } + + QueryBuilder sortBySyncingDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(3, sort: Sort.desc); + }); + } + QueryBuilder sortBySortName( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addSortBy( - 3, + 4, caseSensitive: caseSensitive, ); }); @@ -3040,7 +3086,7 @@ extension ISyncedItemQuerySortBy {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addSortBy( - 3, + 4, sort: Sort.desc, caseSensitive: caseSensitive, ); @@ -3051,7 +3097,7 @@ extension ISyncedItemQuerySortBy {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addSortBy( - 4, + 5, caseSensitive: caseSensitive, ); }); @@ -3061,7 +3107,7 @@ extension ISyncedItemQuerySortBy {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addSortBy( - 4, + 5, sort: Sort.desc, caseSensitive: caseSensitive, ); @@ -3072,7 +3118,7 @@ extension ISyncedItemQuerySortBy {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addSortBy( - 5, + 6, caseSensitive: caseSensitive, ); }); @@ -3082,7 +3128,7 @@ extension ISyncedItemQuerySortBy {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addSortBy( - 5, + 6, sort: Sort.desc, caseSensitive: caseSensitive, ); @@ -3091,13 +3137,13 @@ extension ISyncedItemQuerySortBy QueryBuilder sortByFileSize() { return QueryBuilder.apply(this, (query) { - return query.addSortBy(6); + return query.addSortBy(7); }); } QueryBuilder sortByFileSizeDesc() { return QueryBuilder.apply(this, (query) { - return query.addSortBy(6, sort: Sort.desc); + return query.addSortBy(7, sort: Sort.desc); }); } @@ -3105,7 +3151,7 @@ extension ISyncedItemQuerySortBy {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addSortBy( - 7, + 8, caseSensitive: caseSensitive, ); }); @@ -3115,7 +3161,7 @@ extension ISyncedItemQuerySortBy {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addSortBy( - 7, + 8, sort: Sort.desc, caseSensitive: caseSensitive, ); @@ -3126,7 +3172,7 @@ extension ISyncedItemQuerySortBy {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addSortBy( - 8, + 9, caseSensitive: caseSensitive, ); }); @@ -3136,7 +3182,7 @@ extension ISyncedItemQuerySortBy {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addSortBy( - 8, + 9, sort: Sort.desc, caseSensitive: caseSensitive, ); @@ -3147,7 +3193,7 @@ extension ISyncedItemQuerySortBy sortByIntroOutroSkipModel({bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addSortBy( - 9, + 10, caseSensitive: caseSensitive, ); }); @@ -3157,7 +3203,7 @@ extension ISyncedItemQuerySortBy sortByIntroOutroSkipModelDesc({bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addSortBy( - 9, + 10, sort: Sort.desc, caseSensitive: caseSensitive, ); @@ -3168,7 +3214,7 @@ extension ISyncedItemQuerySortBy {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addSortBy( - 10, + 11, caseSensitive: caseSensitive, ); }); @@ -3178,7 +3224,7 @@ extension ISyncedItemQuerySortBy {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addSortBy( - 10, + 11, sort: Sort.desc, caseSensitive: caseSensitive, ); @@ -3189,7 +3235,7 @@ extension ISyncedItemQuerySortBy {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addSortBy( - 13, + 14, caseSensitive: caseSensitive, ); }); @@ -3199,7 +3245,7 @@ extension ISyncedItemQuerySortBy {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addSortBy( - 13, + 14, sort: Sort.desc, caseSensitive: caseSensitive, ); @@ -3237,127 +3283,139 @@ extension ISyncedItemQuerySortThenBy }); } + QueryBuilder thenBySyncing() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(3); + }); + } + + QueryBuilder thenBySyncingDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(3, sort: Sort.desc); + }); + } + QueryBuilder thenBySortName( {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(3, caseSensitive: caseSensitive); - }); - } - - QueryBuilder thenBySortNameDesc( - {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(3, sort: Sort.desc, caseSensitive: caseSensitive); - }); - } - - QueryBuilder thenByParentId( - {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addSortBy(4, caseSensitive: caseSensitive); }); } - QueryBuilder thenByParentIdDesc( + QueryBuilder thenBySortNameDesc( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addSortBy(4, sort: Sort.desc, caseSensitive: caseSensitive); }); } - QueryBuilder thenByPath( + QueryBuilder thenByParentId( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addSortBy(5, caseSensitive: caseSensitive); }); } - QueryBuilder thenByPathDesc( + QueryBuilder thenByParentIdDesc( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addSortBy(5, sort: Sort.desc, caseSensitive: caseSensitive); }); } + QueryBuilder thenByPath( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(6, caseSensitive: caseSensitive); + }); + } + + QueryBuilder thenByPathDesc( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(6, sort: Sort.desc, caseSensitive: caseSensitive); + }); + } + QueryBuilder thenByFileSize() { return QueryBuilder.apply(this, (query) { - return query.addSortBy(6); + return query.addSortBy(7); }); } QueryBuilder thenByFileSizeDesc() { return QueryBuilder.apply(this, (query) { - return query.addSortBy(6, sort: Sort.desc); + return query.addSortBy(7, sort: Sort.desc); }); } QueryBuilder thenByVideoFileName( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addSortBy(7, caseSensitive: caseSensitive); + return query.addSortBy(8, caseSensitive: caseSensitive); }); } QueryBuilder thenByVideoFileNameDesc( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addSortBy(7, sort: Sort.desc, caseSensitive: caseSensitive); + return query.addSortBy(8, sort: Sort.desc, caseSensitive: caseSensitive); }); } QueryBuilder thenByTrickPlayModel( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addSortBy(8, caseSensitive: caseSensitive); + return query.addSortBy(9, caseSensitive: caseSensitive); }); } QueryBuilder thenByTrickPlayModelDesc( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addSortBy(8, sort: Sort.desc, caseSensitive: caseSensitive); + return query.addSortBy(9, sort: Sort.desc, caseSensitive: caseSensitive); }); } QueryBuilder thenByIntroOutroSkipModel({bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addSortBy(9, caseSensitive: caseSensitive); + return query.addSortBy(10, caseSensitive: caseSensitive); }); } QueryBuilder thenByIntroOutroSkipModelDesc({bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addSortBy(9, sort: Sort.desc, caseSensitive: caseSensitive); + return query.addSortBy(10, sort: Sort.desc, caseSensitive: caseSensitive); }); } QueryBuilder thenByImages( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addSortBy(10, caseSensitive: caseSensitive); + return query.addSortBy(11, caseSensitive: caseSensitive); }); } QueryBuilder thenByImagesDesc( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addSortBy(10, sort: Sort.desc, caseSensitive: caseSensitive); + return query.addSortBy(11, sort: Sort.desc, caseSensitive: caseSensitive); }); } QueryBuilder thenByUserData( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addSortBy(13, caseSensitive: caseSensitive); + return query.addSortBy(14, caseSensitive: caseSensitive); }); } QueryBuilder thenByUserDataDesc( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addSortBy(13, sort: Sort.desc, caseSensitive: caseSensitive); + return query.addSortBy(14, sort: Sort.desc, caseSensitive: caseSensitive); }); } } @@ -3371,77 +3429,83 @@ extension ISyncedItemQueryWhereDistinct }); } - QueryBuilder distinctBySortName( - {bool caseSensitive = true}) { + QueryBuilder distinctBySyncing() { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(3, caseSensitive: caseSensitive); + return query.addDistinctBy(3); }); } - QueryBuilder distinctByParentId( + QueryBuilder distinctBySortName( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(4, caseSensitive: caseSensitive); }); } - QueryBuilder distinctByPath( + QueryBuilder distinctByParentId( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(5, caseSensitive: caseSensitive); }); } + QueryBuilder distinctByPath( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(6, caseSensitive: caseSensitive); + }); + } + QueryBuilder distinctByFileSize() { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(6); + return query.addDistinctBy(7); }); } QueryBuilder distinctByVideoFileName({bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(7, caseSensitive: caseSensitive); + return query.addDistinctBy(8, caseSensitive: caseSensitive); }); } QueryBuilder distinctByTrickPlayModel({bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(8, caseSensitive: caseSensitive); + return query.addDistinctBy(9, caseSensitive: caseSensitive); }); } QueryBuilder distinctByIntroOutroSkipModel({bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(9, caseSensitive: caseSensitive); + return query.addDistinctBy(10, caseSensitive: caseSensitive); }); } QueryBuilder distinctByImages( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(10, caseSensitive: caseSensitive); + return query.addDistinctBy(11, caseSensitive: caseSensitive); }); } QueryBuilder distinctByChapters() { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(11); + return query.addDistinctBy(12); }); } QueryBuilder distinctBySubtitles() { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(12); + return query.addDistinctBy(13); }); } QueryBuilder distinctByUserData( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(13, caseSensitive: caseSensitive); + return query.addDistinctBy(14, caseSensitive: caseSensitive); }); } } @@ -3460,70 +3524,76 @@ extension ISyncedItemQueryProperty1 }); } - QueryBuilder sortNameProperty() { + QueryBuilder syncingProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(3); }); } - QueryBuilder parentIdProperty() { + QueryBuilder sortNameProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(4); }); } - QueryBuilder pathProperty() { + QueryBuilder parentIdProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(5); }); } - QueryBuilder fileSizeProperty() { + QueryBuilder pathProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(6); }); } - QueryBuilder videoFileNameProperty() { + QueryBuilder fileSizeProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(7); }); } - QueryBuilder trickPlayModelProperty() { + QueryBuilder videoFileNameProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(8); }); } + QueryBuilder trickPlayModelProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(9); + }); + } + QueryBuilder introOutroSkipModelProperty() { return QueryBuilder.apply(this, (query) { - return query.addProperty(9); + return query.addProperty(10); }); } QueryBuilder imagesProperty() { return QueryBuilder.apply(this, (query) { - return query.addProperty(10); + return query.addProperty(11); }); } QueryBuilder?, QAfterProperty> chaptersProperty() { return QueryBuilder.apply(this, (query) { - return query.addProperty(11); + return query.addProperty(12); }); } QueryBuilder?, QAfterProperty> subtitlesProperty() { return QueryBuilder.apply(this, (query) { - return query.addProperty(12); + return query.addProperty(13); }); } QueryBuilder userDataProperty() { return QueryBuilder.apply(this, (query) { - return query.addProperty(13); + return query.addProperty(14); }); } } @@ -3542,76 +3612,82 @@ extension ISyncedItemQueryProperty2 }); } - QueryBuilder sortNameProperty() { + QueryBuilder syncingProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(3); }); } - QueryBuilder parentIdProperty() { + QueryBuilder sortNameProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(4); }); } - QueryBuilder pathProperty() { + QueryBuilder parentIdProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(5); }); } - QueryBuilder fileSizeProperty() { + QueryBuilder pathProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(6); }); } - QueryBuilder - videoFileNameProperty() { + QueryBuilder fileSizeProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(7); }); } QueryBuilder - trickPlayModelProperty() { + videoFileNameProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(8); }); } QueryBuilder - introOutroSkipModelProperty() { + trickPlayModelProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(9); }); } - QueryBuilder imagesProperty() { + QueryBuilder + introOutroSkipModelProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(10); }); } - QueryBuilder?), QAfterProperty> - chaptersProperty() { + QueryBuilder imagesProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(11); }); } QueryBuilder?), QAfterProperty> - subtitlesProperty() { + chaptersProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(12); }); } - QueryBuilder userDataProperty() { + QueryBuilder?), QAfterProperty> + subtitlesProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(13); }); } + + QueryBuilder userDataProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(14); + }); + } } extension ISyncedItemQueryProperty3 @@ -3628,74 +3704,80 @@ extension ISyncedItemQueryProperty3 }); } - QueryBuilder sortNameProperty() { + QueryBuilder syncingProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(3); }); } - QueryBuilder parentIdProperty() { + QueryBuilder sortNameProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(4); }); } - QueryBuilder pathProperty() { + QueryBuilder parentIdProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(5); }); } - QueryBuilder fileSizeProperty() { + QueryBuilder pathProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(6); }); } - QueryBuilder - videoFileNameProperty() { + QueryBuilder fileSizeProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(7); }); } QueryBuilder - trickPlayModelProperty() { + videoFileNameProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(8); }); } QueryBuilder - introOutroSkipModelProperty() { + trickPlayModelProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(9); }); } - QueryBuilder imagesProperty() { + QueryBuilder + introOutroSkipModelProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(10); }); } - QueryBuilder?), QOperations> - chaptersProperty() { + QueryBuilder imagesProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(11); }); } QueryBuilder?), QOperations> - subtitlesProperty() { + chaptersProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(12); }); } - QueryBuilder userDataProperty() { + QueryBuilder?), QOperations> + subtitlesProperty() { return QueryBuilder.apply(this, (query) { return query.addProperty(13); }); } + + QueryBuilder userDataProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(14); + }); + } } diff --git a/lib/models/syncing/sync_item.dart b/lib/models/syncing/sync_item.dart index a3e1106..ea258e1 100644 --- a/lib/models/syncing/sync_item.dart +++ b/lib/models/syncing/sync_item.dart @@ -20,6 +20,7 @@ import 'package:fladder/models/items/trick_play_model.dart'; import 'package:fladder/models/syncing/i_synced_item.dart'; import 'package:fladder/providers/sync/sync_provider_helpers.dart'; import 'package:fladder/providers/sync_provider.dart'; +import 'package:fladder/util/localization_helper.dart'; part 'sync_item.freezed.dart'; @@ -29,6 +30,7 @@ class SyncedItem with _$SyncedItem { factory SyncedItem({ required String id, + @Default(false) bool syncing, String? parentId, required String userId, String? path, @@ -72,7 +74,7 @@ class SyncedItem with _$SyncedItem { _ => SyncStatus.partially, }; - String? get taskId => null; + String? get taskId => task?.taskId; bool get childHasTask => false; @@ -126,6 +128,7 @@ class SyncedItem with _$SyncedItem { parentId: isarSyncedItem.parentId, userId: isarSyncedItem.userId ?? "", sortName: isarSyncedItem.sortName, + syncing: isarSyncedItem.syncing, path: joinAll([savePath, isarSyncedItem.path ?? ""]), fileSize: isarSyncedItem.fileSize, videoFileName: isarSyncedItem.videoFileName, @@ -155,21 +158,25 @@ class SyncedItem with _$SyncedItem { enum SyncStatus { complete( - "Synced", Color.fromARGB(255, 141, 214, 58), IconsaxOutline.tick_circle, ), partially( - "Partially", Color.fromARGB(255, 221, 135, 23), IconsaxOutline.more_circle, ), ; - const SyncStatus(this.label, this.color, this.icon); + const SyncStatus(this.color, this.icon); final Color color; - final String label; + String label(BuildContext context) { + return switch (this) { + SyncStatus.partially => context.localized.syncStatusPartially, + SyncStatus.complete => context.localized.syncStatusSynced, + }; + } + final IconData icon; } @@ -183,14 +190,14 @@ extension StatusExtension on TaskStatus { TaskStatus.paused => Colors.orangeAccent, }; - String get name => switch (this) { - TaskStatus.enqueued => 'Enqueued', - TaskStatus.running => 'Running', - TaskStatus.complete => 'Complete', - TaskStatus.notFound => 'Not Found', - TaskStatus.failed => 'Failed', - TaskStatus.canceled => 'Canceled', - TaskStatus.waitingToRetry => 'Waiting To Retry', - TaskStatus.paused => 'Paused', + String name(BuildContext context) => switch (this) { + TaskStatus.enqueued => context.localized.syncStatusEnqueued, + TaskStatus.running => context.localized.syncStatusRunning, + TaskStatus.complete => context.localized.syncStatusComplete, + TaskStatus.notFound => context.localized.syncStatusNotFound, + TaskStatus.failed => context.localized.syncStatusFailed, + TaskStatus.canceled => context.localized.syncStatusCanceled, + TaskStatus.waitingToRetry => context.localized.syncStatusWaitingToRetry, + TaskStatus.paused => context.localized.syncStatusPaused, }; } diff --git a/lib/models/syncing/sync_item.freezed.dart b/lib/models/syncing/sync_item.freezed.dart index d6e7593..40e2e92 100644 --- a/lib/models/syncing/sync_item.freezed.dart +++ b/lib/models/syncing/sync_item.freezed.dart @@ -17,6 +17,7 @@ final _privateConstructorUsedError = UnsupportedError( /// @nodoc mixin _$SyncedItem { String get id => throw _privateConstructorUsedError; + bool get syncing => throw _privateConstructorUsedError; String? get parentId => throw _privateConstructorUsedError; String get userId => throw _privateConstructorUsedError; String? get path => throw _privateConstructorUsedError; @@ -48,6 +49,7 @@ abstract class $SyncedItemCopyWith<$Res> { @useResult $Res call( {String id, + bool syncing, String? parentId, String userId, String? path, @@ -82,6 +84,7 @@ class _$SyncedItemCopyWithImpl<$Res, $Val extends SyncedItem> @override $Res call({ Object? id = null, + Object? syncing = null, Object? parentId = freezed, Object? userId = null, Object? path = freezed, @@ -101,6 +104,10 @@ class _$SyncedItemCopyWithImpl<$Res, $Val extends SyncedItem> ? _value.id : id // ignore: cast_nullable_to_non_nullable as String, + syncing: null == syncing + ? _value.syncing + : syncing // ignore: cast_nullable_to_non_nullable + as bool, parentId: freezed == parentId ? _value.parentId : parentId // ignore: cast_nullable_to_non_nullable @@ -195,6 +202,7 @@ abstract class _$$SyncItemImplCopyWith<$Res> @useResult $Res call( {String id, + bool syncing, String? parentId, String userId, String? path, @@ -229,6 +237,7 @@ class __$$SyncItemImplCopyWithImpl<$Res> @override $Res call({ Object? id = null, + Object? syncing = null, Object? parentId = freezed, Object? userId = null, Object? path = freezed, @@ -248,6 +257,10 @@ class __$$SyncItemImplCopyWithImpl<$Res> ? _value.id : id // ignore: cast_nullable_to_non_nullable as String, + syncing: null == syncing + ? _value.syncing + : syncing // ignore: cast_nullable_to_non_nullable + as bool, parentId: freezed == parentId ? _value.parentId : parentId // ignore: cast_nullable_to_non_nullable @@ -309,6 +322,7 @@ class __$$SyncItemImplCopyWithImpl<$Res> class _$SyncItemImpl extends _SyncItem { _$SyncItemImpl( {required this.id, + this.syncing = false, this.parentId, required this.userId, this.path, @@ -329,6 +343,9 @@ class _$SyncItemImpl extends _SyncItem { @override final String id; @override + @JsonKey() + final bool syncing; + @override final String? parentId; @override final String userId; @@ -373,7 +390,7 @@ class _$SyncItemImpl extends _SyncItem { @override String toString() { - return 'SyncedItem(id: $id, parentId: $parentId, userId: $userId, path: $path, markedForDelete: $markedForDelete, sortName: $sortName, fileSize: $fileSize, videoFileName: $videoFileName, introOutSkipModel: $introOutSkipModel, fTrickPlayModel: $fTrickPlayModel, fImages: $fImages, fChapters: $fChapters, subtitles: $subtitles, userData: $userData)'; + return 'SyncedItem(id: $id, syncing: $syncing, parentId: $parentId, userId: $userId, path: $path, markedForDelete: $markedForDelete, sortName: $sortName, fileSize: $fileSize, videoFileName: $videoFileName, introOutSkipModel: $introOutSkipModel, fTrickPlayModel: $fTrickPlayModel, fImages: $fImages, fChapters: $fChapters, subtitles: $subtitles, userData: $userData)'; } @override @@ -382,6 +399,7 @@ class _$SyncItemImpl extends _SyncItem { (other.runtimeType == runtimeType && other is _$SyncItemImpl && (identical(other.id, id) || other.id == id) && + (identical(other.syncing, syncing) || other.syncing == syncing) && (identical(other.parentId, parentId) || other.parentId == parentId) && (identical(other.userId, userId) || other.userId == userId) && @@ -411,6 +429,7 @@ class _$SyncItemImpl extends _SyncItem { int get hashCode => Object.hash( runtimeType, id, + syncing, parentId, userId, path, @@ -437,6 +456,7 @@ class _$SyncItemImpl extends _SyncItem { abstract class _SyncItem extends SyncedItem { factory _SyncItem( {required final String id, + final bool syncing, final String? parentId, required final String userId, final String? path, @@ -455,6 +475,8 @@ abstract class _SyncItem extends SyncedItem { @override String get id; @override + bool get syncing; + @override String? get parentId; @override String get userId; diff --git a/lib/providers/sync_provider.dart b/lib/providers/sync_provider.dart index 6e56cc7..dbe85b0 100644 --- a/lib/providers/sync_provider.dart +++ b/lib/providers/sync_provider.dart @@ -13,6 +13,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:http/http.dart' as http; import 'package:isar/isar.dart'; import 'package:path/path.dart' as path; +import 'package:path_provider/path_provider.dart'; import 'package:fladder/jellyfin/jellyfin_open_api.swagger.dart'; import 'package:fladder/models/item_base_model.dart'; @@ -35,6 +36,7 @@ import 'package:fladder/providers/settings/client_settings_provider.dart'; import 'package:fladder/providers/sync/background_download_provider.dart'; import 'package:fladder/providers/user_provider.dart'; import 'package:fladder/screens/shared/fladder_snackbar.dart'; +import 'package:fladder/util/localization_helper.dart'; final syncProvider = StateNotifierProvider((ref) => throw UnimplementedError()); @@ -46,6 +48,7 @@ class SyncNotifier extends StateNotifier { } void _init() { + cleanupTemporaryFiles(); ref.listen( userProvider, (previous, next) { @@ -84,6 +87,35 @@ class SyncNotifier extends StateNotifier { }); } + Future cleanupTemporaryFiles() async { + // List of directories to check + final directories = [ + //Desktop directory + await getTemporaryDirectory(), + //Mobile directory + await getApplicationSupportDirectory(), + ]; + + for (final dir in directories) { + final List files = dir.listSync(); + + for (var file in files) { + if (file is File) { + final fileName = file.path.split(Platform.pathSeparator).last; + final fileSize = await file.length(); + if (fileName.startsWith('com.bbflight.background_downloader') && fileSize != 0) { + try { + await file.delete(); + log('Deleted temporary file: $fileName from ${dir.path}'); + } catch (e) { + log('Failed to delete file $fileName: $e'); + } + } + } + } + } + } + final Ref ref; final Isar? isar; final Directory mobileDirectory; @@ -190,19 +222,20 @@ class SyncNotifier extends StateNotifier { return syncedItem.createItemModel(ref); } - Future addSyncItem(BuildContext? context, ItemBaseModel item) async { - if (context == null) return null; + Future addSyncItem(BuildContext? context, ItemBaseModel item) async { + if (context == null) return; if (saveDirectory == null) { - String? selectedDirectory = await FilePicker.platform.getDirectoryPath(dialogTitle: 'Select downloads folder'); + String? selectedDirectory = + await FilePicker.platform.getDirectoryPath(dialogTitle: context.localized.syncSelectDownloadsFolder); if (selectedDirectory?.isEmpty == true) { - fladderSnackbar(context, title: "No sync folder setup"); - return null; + fladderSnackbar(context, title: context.localized.syncNoFolderSetup); + return; } ref.read(clientSettingsProvider.notifier).setSyncPath(selectedDirectory); } - fladderSnackbar(context, title: "Added ${item.detailedName(context)} for syncing"); + fladderSnackbar(context, title: context.localized.syncAddItemForSyncing(item.detailedName(context) ?? "Unknown")); final newSync = switch (item) { EpisodeModel episode => await syncSeries(item.parentBaseModel, episode: episode), SeriesModel series => await syncSeries(series), @@ -211,12 +244,12 @@ class SyncNotifier extends StateNotifier { }; fladderSnackbar(context, title: newSync != null - ? "Started syncing ${item.detailedName(context)}" - : "Unable to sync ${item.detailedName(context)}, type not supported?"); - return newSync; + ? context.localized.startedSyncingItem(item.detailedName(context) ?? "Unknown") + : context.localized.unableToSyncItem(item.detailedName(context) ?? "Unknown")); + return; } - Future removeSync(SyncedItem? item) async { + Future removeSync(BuildContext context, SyncedItem? item) async { try { if (item == null) return false; @@ -259,6 +292,8 @@ class SyncNotifier extends StateNotifier { } catch (e) { log('Error deleting synced item'); log(e.toString()); + state = state.copyWith(items: state.items.map((e) => e.copyWith(markedForDelete: false)).toList()); + fladderSnackbar(context, title: context.localized.syncRemoveUnableToDeleteItem); return false; } } @@ -366,14 +401,23 @@ class SyncNotifier extends StateNotifier { isar?.write((isar) => syncedItems?.put(ISyncedItem.fromSynced(syncedItem, syncPath ?? ""))); } - Future deleteFullSyncFiles(SyncedItem syncedItem) async { + Future deleteFullSyncFiles(SyncedItem syncedItem, DownloadTask? task) async { await syncedItem.deleteDatFiles(ref); + ref.read(downloadTasksProvider(syncedItem.id).notifier).update((state) => DownloadStream.empty()); + + final taskId = task?.taskId; + if (taskId != null) { + ref.read(backgroundDownloaderProvider).cancelTaskWithId(taskId); + } + cleanupTemporaryFiles(); refresh(); return syncedItem; } Future syncVideoFile(SyncedItem syncItem, bool skipDownload) async { + cleanupTemporaryFiles(); + final playbackResponse = await api.itemsItemIdPlaybackInfoPost( itemId: syncItem.id, body: const PlaybackInfoDto( @@ -480,27 +524,37 @@ extension SyncNotifierHelpers on SyncNotifier { final Directory? parentDirectory = parent?.directory; - SyncedItem syncItem = SyncedItem(id: item.id, userId: ref.read(userProvider)?.id ?? ""); final directory = Directory(path.joinAll([(parentDirectory ?? saveDirectory)?.path ?? "", item.id])); await directory.create(recursive: true); File dataFile = File(path.joinAll([directory.path, 'data.json'])); await dataFile.writeAsString(jsonEncode(response.toJson())); - final imageData = await saveImageData(item.images, directory); - final origChapters = Chapter.chaptersFromInfo(item.id, response.chapters ?? [], ref); - return syncItem.copyWith( + SyncedItem syncItem = SyncedItem( + syncing: true, id: item.id, parentId: parent?.id, sortName: response.sortName, + fImages: imageData, + userId: ref.read(userProvider)?.id ?? "", path: directory.path, + userData: item.userData, + ); + + //Save item if parent so the user is aware. + if (parent == null) { + isar?.write((isar) => syncedItems?.put(ISyncedItem.fromSynced(syncItem, syncPath))); + } + + final origChapters = Chapter.chaptersFromInfo(item.id, response.chapters ?? [], ref); + + return syncItem.copyWith( fChapters: await saveChapterImages(origChapters, directory) ?? [], fileSize: response.mediaSources?.firstOrNull?.size ?? 0, - fImages: imageData, + syncing: false, videoFileName: response.path?.split('/').lastOrNull ?? "", - userData: item.userData, ); } @@ -528,7 +582,7 @@ extension SyncNotifierHelpers on SyncNotifier { await syncVideoFile(syncItem, skipDownload); - await isar?.writeAsync((isar) => syncedItems?.put(ISyncedItem.fromSynced(syncItem, syncPath))); + isar?.write((isar) => syncedItems?.put(ISyncedItem.fromSynced(syncItem, syncPath))); return syncItem; } diff --git a/lib/screens/syncing/sync_item_details.dart b/lib/screens/syncing/sync_item_details.dart index 2e0efe4..d7df958 100644 --- a/lib/screens/syncing/sync_item_details.dart +++ b/lib/screens/syncing/sync_item_details.dart @@ -15,8 +15,8 @@ import 'package:fladder/screens/shared/default_alert_dialog.dart'; import 'package:fladder/screens/shared/media/poster_widget.dart'; import 'package:fladder/screens/syncing/sync_child_item.dart'; import 'package:fladder/screens/syncing/sync_widgets.dart'; -import 'package:fladder/screens/syncing/widgets/sync_markedfordelete.dart'; import 'package:fladder/screens/syncing/widgets/sync_progress_builder.dart'; +import 'package:fladder/screens/syncing/widgets/sync_status_overlay.dart'; import 'package:fladder/util/adaptive_layout.dart'; import 'package:fladder/util/list_padding.dart'; import 'package:fladder/util/localization_helper.dart'; @@ -55,7 +55,7 @@ class _SyncItemDetailsState extends ConsumerState { final syncChildren = ref.read(syncProvider.notifier).getChildren(syncedItem); final downloadTask = ref.read(downloadTasksProvider(syncedItem.id)); - return SyncMarkedForDelete( + return SyncStatusOverlay( syncedItem: syncedItem, child: ActionContent( title: Row( @@ -135,7 +135,9 @@ class _SyncItemDetailsState extends ConsumerState { icon: const Icon(IconsaxBold.play), ), IconButton( - onPressed: () => ref.read(syncProvider.notifier).deleteFullSyncFiles(syncedItem), + onPressed: () => ref + .read(syncProvider.notifier) + .deleteFullSyncFiles(syncedItem, combinedStream?.task), icon: const Icon(IconsaxBold.stop), ), ], @@ -177,7 +179,7 @@ class _SyncItemDetailsState extends ConsumerState { context.localized.syncRemoveDataTitle, context.localized.syncRemoveDataDesc, (context) { - ref.read(syncProvider.notifier).deleteFullSyncFiles(syncedItem); + ref.read(syncProvider.notifier).deleteFullSyncFiles(syncedItem, downloadTask.task); Navigator.of(context).pop(); }, context.localized.delete, @@ -217,7 +219,7 @@ class _SyncItemDetailsState extends ConsumerState { context.localized.syncDeleteItemTitle, context.localized.syncDeleteItemDesc(baseItem?.detailedName(context) ?? ""), (context) async { - await ref.read(syncProvider.notifier).removeSync(syncedItem); + await ref.read(syncProvider.notifier).removeSync(context, syncedItem); Navigator.pop(context); Navigator.pop(context); }, diff --git a/lib/screens/syncing/sync_list_item.dart b/lib/screens/syncing/sync_list_item.dart index c7a97ce..1784706 100644 --- a/lib/screens/syncing/sync_list_item.dart +++ b/lib/screens/syncing/sync_list_item.dart @@ -1,18 +1,20 @@ +import 'package:flutter/material.dart'; + import 'package:ficonsax/ficonsax.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + import 'package:fladder/models/syncing/sync_item.dart'; import 'package:fladder/providers/sync/sync_provider_helpers.dart'; import 'package:fladder/providers/sync_provider.dart'; import 'package:fladder/screens/shared/default_alert_dialog.dart'; import 'package:fladder/screens/syncing/sync_item_details.dart'; import 'package:fladder/screens/syncing/sync_widgets.dart'; -import 'package:fladder/screens/syncing/widgets/sync_markedfordelete.dart'; import 'package:fladder/screens/syncing/widgets/sync_progress_builder.dart'; +import 'package:fladder/screens/syncing/widgets/sync_status_overlay.dart'; import 'package:fladder/util/fladder_image.dart'; import 'package:fladder/util/list_padding.dart'; import 'package:fladder/util/localization_helper.dart'; import 'package:fladder/util/size_formatting.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; class SyncListItem extends ConsumerStatefulWidget { final SyncedItem syncedItem; @@ -29,7 +31,7 @@ class SyncListItemState extends ConsumerState { final baseItem = ref.read(syncProvider.notifier).getItem(syncedItem); return Padding( padding: const EdgeInsets.symmetric(vertical: 8), - child: SyncMarkedForDelete( + child: SyncStatusOverlay( syncedItem: syncedItem, child: Card( elevation: 1, @@ -53,7 +55,7 @@ class SyncListItemState extends ConsumerState { context.localized.deleteItem(baseItem?.detailedName(context) ?? ""), context.localized.syncDeletePopupPermanent, (context) async { - ref.read(syncProvider.notifier).removeSync(syncedItem); + ref.read(syncProvider.notifier).removeSync(context, syncedItem); Navigator.of(context).pop(); return true; }, diff --git a/lib/screens/syncing/sync_widgets.dart b/lib/screens/syncing/sync_widgets.dart index 84acdeb..2a461fb 100644 --- a/lib/screens/syncing/sync_widgets.dart +++ b/lib/screens/syncing/sync_widgets.dart @@ -1,5 +1,9 @@ +import 'package:flutter/material.dart'; + import 'package:background_downloader/background_downloader.dart'; import 'package:ficonsax/ficonsax.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + import 'package:fladder/models/items/episode_model.dart'; import 'package:fladder/models/items/season_model.dart'; import 'package:fladder/models/items/series_model.dart'; @@ -10,8 +14,6 @@ import 'package:fladder/providers/sync/sync_provider_helpers.dart'; import 'package:fladder/providers/sync_provider.dart'; import 'package:fladder/util/list_padding.dart'; import 'package:fladder/util/localization_helper.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; class SyncLabel extends ConsumerWidget { final String? label; @@ -28,7 +30,7 @@ class SyncLabel extends ConsumerWidget { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 2), child: Text( - label ?? status.label, + label ?? status.label(context), style: Theme.of(context).textTheme.bodyMedium?.copyWith( fontWeight: FontWeight.bold, color: status.color, @@ -55,7 +57,7 @@ class SyncProgressBar extends ConsumerWidget { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(downloadStatus.name), + Text(downloadStatus.name(context)), Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.min, @@ -82,7 +84,7 @@ class SyncProgressBar extends ConsumerWidget { icon: const Icon(IconsaxBold.play), ), IconButton( - onPressed: () => ref.read(syncProvider.notifier).deleteFullSyncFiles(item), + onPressed: () => ref.read(syncProvider.notifier).deleteFullSyncFiles(item, downloadTask), icon: const Icon(IconsaxBold.stop), ) ], @@ -129,7 +131,7 @@ class SyncSubtitle extends ConsumerWidget { ); }, ), - _ => Text(syncStatus.label), + _ => Text(syncStatus.label(context)), }, ), ), diff --git a/lib/screens/syncing/widgets/sync_markedfordelete.dart b/lib/screens/syncing/widgets/sync_status_overlay.dart similarity index 50% rename from lib/screens/syncing/widgets/sync_markedfordelete.dart rename to lib/screens/syncing/widgets/sync_status_overlay.dart index 27c5aca..04d80cf 100644 --- a/lib/screens/syncing/widgets/sync_markedfordelete.dart +++ b/lib/screens/syncing/widgets/sync_status_overlay.dart @@ -5,12 +5,12 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:fladder/models/syncing/sync_item.dart'; import 'package:fladder/util/list_padding.dart'; +import 'package:fladder/util/localization_helper.dart'; -///This is a wrapper widget for marking a synced item as deleted (while it is being deleted) -class SyncMarkedForDelete extends ConsumerWidget { +class SyncStatusOverlay extends ConsumerWidget { final SyncedItem syncedItem; final Widget child; - const SyncMarkedForDelete({required this.syncedItem, required this.child, super.key}); + const SyncStatusOverlay({required this.syncedItem, required this.child, super.key}); @override Widget build(BuildContext context, WidgetRef ref) { @@ -32,12 +32,35 @@ class SyncMarkedForDelete extends ConsumerWidget { strokeCap: StrokeCap.round, valueColor: AlwaysStoppedAnimation(Theme.of(context).colorScheme.error), ), - const Text("Deleting"), + Text(context.localized.syncOverlayDeleting), const Icon(IconsaxOutline.trash) ].addPadding(const EdgeInsets.symmetric(horizontal: 16)), ), ), - ) + ), + if (syncedItem.syncing) + Positioned.fill( + child: IgnorePointer( + child: Card( + elevation: 0, + semanticContainer: false, + color: Colors.black.withOpacity(0.6), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + CircularProgressIndicator.adaptive( + strokeCap: StrokeCap.round, + valueColor: AlwaysStoppedAnimation(Theme.of(context).colorScheme.error), + ), + Text(context.localized.syncOverlaySyncing), + const Icon(IconsaxOutline.cloud_notif) + ].addPadding(const EdgeInsets.symmetric(horizontal: 16)), + ), + ), + ), + ), ], ); } diff --git a/lib/screens/syncing/widgets/synced_episode_item.dart b/lib/screens/syncing/widgets/synced_episode_item.dart index 203f683..b65e598 100644 --- a/lib/screens/syncing/widgets/synced_episode_item.dart +++ b/lib/screens/syncing/widgets/synced_episode_item.dart @@ -1,4 +1,8 @@ +import 'package:flutter/material.dart'; + import 'package:ficonsax/ficonsax.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + import 'package:fladder/models/items/episode_model.dart'; import 'package:fladder/models/syncing/sync_item.dart'; import 'package:fladder/providers/sync/sync_provider_helpers.dart'; @@ -10,8 +14,6 @@ import 'package:fladder/util/list_padding.dart'; import 'package:fladder/util/localization_helper.dart'; import 'package:fladder/util/size_formatting.dart'; import 'package:fladder/widgets/shared/icon_button_await.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; class SyncedEpisodeItem extends ConsumerStatefulWidget { const SyncedEpisodeItem({ @@ -106,7 +108,7 @@ class _SyncedEpisodeItemState extends ConsumerState { context.localized.syncRemoveDataTitle, context.localized.syncRemoveDataDesc, (context) async { - await ref.read(syncProvider.notifier).deleteFullSyncFiles(syncedItem); + await ref.read(syncProvider.notifier).deleteFullSyncFiles(syncedItem, downloadTask.task); Navigator.pop(context); }, context.localized.delete, diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt index 126b98b..ec83de0 100644 --- a/linux/CMakeLists.txt +++ b/linux/CMakeLists.txt @@ -7,7 +7,7 @@ project(runner LANGUAGES CXX) set(BINARY_NAME "Fladder") # The unique GTK application identifier for this application. See: # https://wiki.gnome.org/HowDoI/ChooseApplicationID -set(APPLICATION_ID "com.example.fladder") +set(APPLICATION_ID "nl.jknaapen.fladder") # Explicitly opt in to modern CMake behaviors to avoid warnings with recent # versions of CMake. diff --git a/macos/Runner/Configs/AppInfo.xcconfig b/macos/Runner/Configs/AppInfo.xcconfig index 01d3047..f5f4e07 100644 --- a/macos/Runner/Configs/AppInfo.xcconfig +++ b/macos/Runner/Configs/AppInfo.xcconfig @@ -11,4 +11,4 @@ PRODUCT_NAME = Fladder PRODUCT_BUNDLE_IDENTIFIER = nl.jknaapen.fladder // The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2023 com.example. All rights reserved. +PRODUCT_COPYRIGHT = Copyright © 2023 Donutware. All rights reserved. diff --git a/windows/runner/Runner.rc b/windows/runner/Runner.rc index 1bc5757..ba1c9dc 100644 --- a/windows/runner/Runner.rc +++ b/windows/runner/Runner.rc @@ -89,11 +89,11 @@ BEGIN BEGIN BLOCK "040904e4" BEGIN - VALUE "CompanyName", "com.example" "\0" + VALUE "CompanyName", "DonutWare" "\0" VALUE "FileDescription", "fladder" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" VALUE "InternalName", "nl.jknaapen.fladder" "\0" - VALUE "LegalCopyright", "Copyright (C) 2023 com.example. All rights reserved." "\0" + VALUE "LegalCopyright", "Copyright (C) 2023 DonutWare. All rights reserved." "\0" VALUE "OriginalFilename", "fladder.exe" "\0" VALUE "ProductName", "fladder" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0"