mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-13 07:55:18 +00:00
fix(playback): play not fetching full playlist if playlist is too long
This commit is contained in:
parent
43ddf90c48
commit
7b21eca37b
@ -13,6 +13,7 @@ import 'package:spotube/provider/audio_player/audio_player.dart';
|
|||||||
import 'package:spotube/provider/connect/connect.dart';
|
import 'package:spotube/provider/connect/connect.dart';
|
||||||
import 'package:spotube/provider/history/history.dart';
|
import 'package:spotube/provider/history/history.dart';
|
||||||
import 'package:spotube/services/audio_player/audio_player.dart';
|
import 'package:spotube/services/audio_player/audio_player.dart';
|
||||||
|
import 'package:spotube/services/logger/logger.dart';
|
||||||
|
|
||||||
typedef UseActionCallbacks = ({
|
typedef UseActionCallbacks = ({
|
||||||
bool isActive,
|
bool isActive,
|
||||||
@ -82,6 +83,9 @@ UseActionCallbacks useActionCallbacks(WidgetRef ref) {
|
|||||||
allTracks.sublist(initialTracks.length),
|
allTracks.sublist(initialTracks.length),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
} catch (e, stack) {
|
||||||
|
AppLogger.reportError(e, stack);
|
||||||
|
rethrow;
|
||||||
} finally {
|
} finally {
|
||||||
isLoading.value = false;
|
isLoading.value = false;
|
||||||
}
|
}
|
||||||
@ -134,6 +138,9 @@ UseActionCallbacks useActionCallbacks(WidgetRef ref) {
|
|||||||
allTracks.sublist(initialTracks.length),
|
allTracks.sublist(initialTracks.length),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
} catch (e, stack) {
|
||||||
|
AppLogger.reportError(e, stack);
|
||||||
|
rethrow;
|
||||||
} finally {
|
} finally {
|
||||||
if (context.mounted) {
|
if (context.mounted) {
|
||||||
isLoading.value = false;
|
isLoading.value = false;
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
import 'dart:math';
|
||||||
|
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:spotube/models/metadata/metadata.dart';
|
import 'package:spotube/models/metadata/metadata.dart';
|
||||||
import 'package:spotube/provider/metadata_plugin/utils/common.dart';
|
import 'package:spotube/provider/metadata_plugin/utils/common.dart';
|
||||||
|
import 'package:spotube/services/logger/logger.dart';
|
||||||
|
|
||||||
abstract class FamilyPaginatedAsyncNotifier<K, A>
|
abstract class FamilyPaginatedAsyncNotifier<K, A>
|
||||||
extends FamilyAsyncNotifier<SpotubePaginationResponseObject<K>, A>
|
extends FamilyAsyncNotifier<SpotubePaginationResponseObject<K>, A>
|
||||||
@ -27,7 +29,8 @@ abstract class FamilyPaginatedAsyncNotifier<K, A>
|
|||||||
final items = newState.items.isEmpty ? <K>[] : newState.items.cast<K>();
|
final items = newState.items.isEmpty ? <K>[] : newState.items.cast<K>();
|
||||||
|
|
||||||
state = AsyncData(newState.copyWith(items: <K>[...oldItems, ...items]));
|
state = AsyncData(newState.copyWith(items: <K>[...oldItems, ...items]));
|
||||||
} catch (e) {
|
} catch (e, stack) {
|
||||||
|
AppLogger.reportError(e, stack);
|
||||||
state = AsyncData(oldState!);
|
state = AsyncData(oldState!);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -38,17 +41,32 @@ abstract class FamilyPaginatedAsyncNotifier<K, A>
|
|||||||
|
|
||||||
bool hasMore = true;
|
bool hasMore = true;
|
||||||
while (hasMore) {
|
while (hasMore) {
|
||||||
await update((state) async {
|
final newState = await fetch(
|
||||||
final newState = await fetch(
|
state.value!.nextOffset!,
|
||||||
state.nextOffset!,
|
max(state.value!.limit, 100),
|
||||||
state.limit,
|
)
|
||||||
);
|
.catchError(
|
||||||
|
(e) => fetch(state.value!.nextOffset!, max(state.value!.limit, 50)),
|
||||||
|
)
|
||||||
|
.catchError(
|
||||||
|
(e) => fetch(state.value!.nextOffset!, state.value!.limit),
|
||||||
|
)
|
||||||
|
.catchError(
|
||||||
|
(e) async {
|
||||||
|
await Future.delayed(const Duration(milliseconds: 500));
|
||||||
|
return fetch(state.value!.nextOffset!, state.value!.limit);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
hasMore = newState.hasMore;
|
hasMore = newState.hasMore;
|
||||||
final oldItems = state.items.isEmpty ? <K>[] : state.items.cast<K>();
|
|
||||||
final items = newState.items.isEmpty ? <K>[] : newState.items.cast<K>();
|
final oldItems =
|
||||||
return newState.copyWith(items: <K>[...oldItems, ...items]);
|
state.value!.items.isEmpty ? <K>[] : state.value!.items.cast<K>();
|
||||||
});
|
final items = newState.items.isEmpty ? <K>[] : newState.items.cast<K>();
|
||||||
|
|
||||||
|
state = AsyncData(
|
||||||
|
newState.copyWith(items: [...oldItems, ...items]),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return state.value!.items.cast<K>();
|
return state.value!.items.cast<K>();
|
||||||
@ -78,7 +96,8 @@ abstract class AutoDisposeFamilyPaginatedAsyncNotifier<K, A>
|
|||||||
...newState.items.cast<K>(),
|
...newState.items.cast<K>(),
|
||||||
]),
|
]),
|
||||||
);
|
);
|
||||||
} catch (e) {
|
} catch (e, stack) {
|
||||||
|
AppLogger.reportError(e, stack);
|
||||||
state = AsyncData(oldState!);
|
state = AsyncData(oldState!);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -89,18 +108,32 @@ abstract class AutoDisposeFamilyPaginatedAsyncNotifier<K, A>
|
|||||||
|
|
||||||
bool hasMore = true;
|
bool hasMore = true;
|
||||||
while (hasMore) {
|
while (hasMore) {
|
||||||
await update((state) async {
|
final newState = await fetch(
|
||||||
final newState = await fetch(
|
state.value!.nextOffset!,
|
||||||
state.nextOffset!,
|
max(state.value!.limit, 100),
|
||||||
state.limit,
|
)
|
||||||
);
|
.catchError(
|
||||||
|
(e) => fetch(state.value!.nextOffset!, max(state.value!.limit, 50)),
|
||||||
|
)
|
||||||
|
.catchError(
|
||||||
|
(e) => fetch(state.value!.nextOffset!, state.value!.limit),
|
||||||
|
)
|
||||||
|
.catchError(
|
||||||
|
(e) async {
|
||||||
|
await Future.delayed(const Duration(milliseconds: 500));
|
||||||
|
return fetch(state.value!.nextOffset!, state.value!.limit);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
hasMore = newState.hasMore;
|
hasMore = newState.hasMore;
|
||||||
return newState.copyWith(items: [
|
|
||||||
...state.items.cast<K>(),
|
final oldItems =
|
||||||
...newState.items.cast<K>(),
|
state.value!.items.isEmpty ? <K>[] : state.value!.items.cast<K>();
|
||||||
]);
|
final items = newState.items.isEmpty ? <K>[] : newState.items.cast<K>();
|
||||||
});
|
|
||||||
|
state = AsyncData(
|
||||||
|
newState.copyWith(items: [...oldItems, ...items]),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return state.value!.items.cast<K>();
|
return state.value!.items.cast<K>();
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
import 'dart:math';
|
||||||
|
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:spotube/models/metadata/metadata.dart';
|
import 'package:spotube/models/metadata/metadata.dart';
|
||||||
// ignore: implementation_imports
|
// ignore: implementation_imports
|
||||||
import 'package:riverpod/src/async_notifier.dart';
|
import 'package:riverpod/src/async_notifier.dart';
|
||||||
import 'package:spotube/provider/metadata_plugin/utils/common.dart';
|
import 'package:spotube/provider/metadata_plugin/utils/common.dart';
|
||||||
|
import 'package:spotube/services/logger/logger.dart';
|
||||||
|
|
||||||
mixin PaginatedAsyncNotifierMixin<K>
|
mixin PaginatedAsyncNotifierMixin<K>
|
||||||
// ignore: invalid_use_of_internal_member
|
// ignore: invalid_use_of_internal_member
|
||||||
@ -28,7 +30,8 @@ mixin PaginatedAsyncNotifierMixin<K>
|
|||||||
final items = newState.items.isEmpty ? <K>[] : newState.items.cast<K>();
|
final items = newState.items.isEmpty ? <K>[] : newState.items.cast<K>();
|
||||||
|
|
||||||
state = AsyncData(newState.copyWith(items: <K>[...oldItems, ...items]));
|
state = AsyncData(newState.copyWith(items: <K>[...oldItems, ...items]));
|
||||||
} catch (e) {
|
} catch (e, stack) {
|
||||||
|
AppLogger.reportError(e, stack);
|
||||||
state = AsyncData(oldState!);
|
state = AsyncData(oldState!);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -39,17 +42,32 @@ mixin PaginatedAsyncNotifierMixin<K>
|
|||||||
|
|
||||||
bool hasMore = true;
|
bool hasMore = true;
|
||||||
while (hasMore) {
|
while (hasMore) {
|
||||||
await update((state) async {
|
final newState = await fetch(
|
||||||
final newState = await fetch(
|
state.value!.nextOffset!,
|
||||||
state.nextOffset!,
|
max(state.value!.limit, 100),
|
||||||
state.limit,
|
)
|
||||||
);
|
.catchError(
|
||||||
|
(e) => fetch(state.value!.nextOffset!, max(state.value!.limit, 50)),
|
||||||
|
)
|
||||||
|
.catchError(
|
||||||
|
(e) => fetch(state.value!.nextOffset!, state.value!.limit),
|
||||||
|
)
|
||||||
|
.catchError(
|
||||||
|
(e) async {
|
||||||
|
await Future.delayed(const Duration(milliseconds: 500));
|
||||||
|
return fetch(state.value!.nextOffset!, state.value!.limit);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
hasMore = newState.hasMore;
|
hasMore = newState.hasMore;
|
||||||
final oldItems = state.items.isEmpty ? <K>[] : state.items.cast<K>();
|
|
||||||
final items = newState.items.isEmpty ? <K>[] : newState.items.cast<K>();
|
final oldItems =
|
||||||
return newState.copyWith(items: <K>[...oldItems, ...items]);
|
state.value!.items.isEmpty ? <K>[] : state.value!.items.cast<K>();
|
||||||
});
|
final items = newState.items.isEmpty ? <K>[] : newState.items.cast<K>();
|
||||||
|
|
||||||
|
state = AsyncData(
|
||||||
|
newState.copyWith(items: [...oldItems, ...items]),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return state.value!.items.cast<K>();
|
return state.value!.items.cast<K>();
|
||||||
|
Loading…
Reference in New Issue
Block a user