getRandomScene method

Future<Scene?> getRandomScene({
  1. bool useCurrentFilter = false,
  2. String? performerId,
  3. String? studioId,
  4. String? tagId,
  5. String? excludeSceneId,
})

Implementation

Future<Scene?> getRandomScene({
  bool useCurrentFilter = false,
  String? performerId,
  String? studioId,
  String? tagId,
  String? excludeSceneId,
}) async {
  final repository = ref.read(sceneRepositoryProvider);
  final query = useCurrentFilter ? ref.read(sceneSearchQueryProvider) : '';
  final filter = useCurrentFilter ? ref.read(sceneFilterStateProvider) : null;
  final organizedOnly = useCurrentFilter
      ? ref.read(sceneOrganizedOnlyProvider)
      : false;

  // Ask backend for random ordering; if needed, retry to avoid returning same id.
  final attempts = excludeSceneId == null ? 1 : 3;
  for (var i = 0; i < attempts; i++) {
    final randomPage = await repository.findScenes(
      page: 1,
      perPage: 1,
      filter: query.isEmpty ? null : query,
      sort: 'random',
      descending: true,
      organized: organizedOnly ? true : null,
      performerId: performerId,
      studioId: studioId,
      tagId: tagId,
      sceneFilter: filter,
    );
    if (randomPage.isEmpty) continue;
    final candidate = randomPage.first;
    if (excludeSceneId == null || candidate.id != excludeSceneId) {
      return candidate;
    }
  }

  final loadedScenes = state.asData?.value;
  if (loadedScenes != null && loadedScenes.isNotEmpty) {
    final candidates = excludeSceneId == null
        ? loadedScenes
        : loadedScenes.where((scene) => scene.id != excludeSceneId).toList();
    if (candidates.isEmpty) return null;
    final random = Random();
    return candidates[random.nextInt(candidates.length)];
  }

  return null;
}