feat: Sync offline/online playback when able (#431)

Co-authored-by: PartyDonut <PartyDonut@users.noreply.github.com>
This commit is contained in:
PartyDonut 2025-08-03 13:35:56 +02:00 committed by GitHub
parent 15ac3566e2
commit 092836328f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
42 changed files with 1002 additions and 497 deletions

View file

@ -110,7 +110,7 @@ extension ItemBaseModelExtensions on ItemBaseModel {
syncAble &&
(canDownload ?? false);
final downloadUrl = ref.read(userProvider.notifier).createDownloadUrl(this);
final syncedItemFuture = ref.read(syncProvider.notifier).getSyncedItem(this);
final syncedItemFuture = ref.read(syncProvider.notifier).getSyncedItem(id);
return [
if (!exclude.contains(ItemActions.play))
if (playAble)
@ -185,9 +185,12 @@ extension ItemBaseModelExtensions on ItemBaseModel {
ItemActionButton(
icon: const Icon(IconsaxPlusLinear.eye),
action: () async {
final userData = await ref.read(userProvider.notifier).markAsPlayed(true, id);
onUserDataChanged?.call(userData?.bodyOrThrow);
context.refreshData();
try {
final userData = await ref.read(userProvider.notifier).markAsPlayed(true, id);
onUserDataChanged?.call(userData?.bodyOrThrow);
} finally {
context.refreshData();
}
},
label: Text(context.localized.markAsWatched),
),
@ -196,18 +199,24 @@ extension ItemBaseModelExtensions on ItemBaseModel {
icon: const Icon(IconsaxPlusLinear.eye_slash),
label: Text(context.localized.markAsUnwatched),
action: () async {
final userData = await ref.read(userProvider.notifier).markAsPlayed(false, id);
onUserDataChanged?.call(userData?.bodyOrThrow);
context.refreshData();
try {
final userData = await ref.read(userProvider.notifier).markAsPlayed(false, id);
onUserDataChanged?.call(userData?.bodyOrThrow);
} finally {
context.refreshData();
}
},
),
if (!exclude.contains(ItemActions.setFavorite))
ItemActionButton(
icon: Icon(userData.isFavourite ? IconsaxPlusLinear.heart_remove : IconsaxPlusLinear.heart_add),
action: () async {
final newData = await ref.read(userProvider.notifier).setAsFavorite(!userData.isFavourite, id);
onUserDataChanged?.call(newData?.bodyOrThrow);
context.refreshData();
try {
final newData = await ref.read(userProvider.notifier).setAsFavorite(!userData.isFavourite, id);
onUserDataChanged?.call(newData?.bodyOrThrow);
} finally {
context.refreshData();
}
},
label: Text(userData.isFavourite ? context.localized.removeAsFavorite : context.localized.addAsFavorite),
),

View file

@ -101,9 +101,11 @@ Future<void> _playVideo(
if (AdaptiveLayout.of(context).isDesktop) {
fullScreenHelper.closeFullScreen(ref);
}
if (context.mounted) {
context.refreshData();
await context.refreshData();
}
onPlayerExit?.call();
}
}
@ -138,7 +140,7 @@ extension BookBaseModelExtension on BookModel? {
);
parentContext?.refreshData();
if (context.mounted) {
context.refreshData();
await context.refreshData();
}
}
}
@ -176,7 +178,7 @@ extension PhotoAlbumExtension on PhotoAlbumModel? {
),
);
if (context.mounted) {
context.refreshData();
await context.refreshData();
}
return;
}