findStudios method

  1. @override
Future<List<Studio>> findStudios({
  1. int? page,
  2. int? perPage,
  3. String? filter,
  4. String? sort,
  5. bool? descending,
  6. bool favoritesOnly = false,
})
override

Implementation

@override
Future<List<Studio>> findStudios({
  int? page,
  int? perPage,
  String? filter,
  String? sort,
  bool? descending,
  bool favoritesOnly = false,
}) async {
  QueryResult<Query$FindStudios> result;
  String? effectiveSort = sort == 'scene_count' ? 'scenes_count' : sort;

  result = await _runFindStudios(
    page: page,
    perPage: perPage,
    filter: filter,
    sort: effectiveSort,
    descending: descending,
    favoritesOnly: favoritesOnly,
  );

  // Some servers may still use scene_count; retry if scenes_count is rejected.
  if (result.hasException &&
      effectiveSort == 'scenes_count' &&
      _isInvalidSort(result.exception!, 'scenes_count')) {
    effectiveSort = 'scene_count';
    result = await _runFindStudios(
      page: page,
      perPage: perPage,
      filter: filter,
      sort: effectiveSort,
      descending: descending,
      favoritesOnly: favoritesOnly,
    );
  }

  final shouldLocalSortBySceneCount =
      (sort == 'scene_count' || sort == 'scenes_count') &&
      result.hasException &&
      (_isInvalidSort(result.exception!, 'scenes_count') ||
          _isInvalidSort(result.exception!, 'scene_count'));

  if (shouldLocalSortBySceneCount) {
    result = await _runFindStudios(
      page: page,
      perPage: perPage,
      filter: filter,
      sort: null,
      descending: descending,
      favoritesOnly: favoritesOnly,
    );
  }

  if (result.hasException) throw result.exception!;

  final studios = result.parsedData!.findStudios.studios
      .map(
        (s) => Studio(
          id: s.id,
          name: s.name,
          url: s.url,
          imagePath: s.image_path,
          details: s.details,
          rating100: s.rating100,
          sceneCount: s.scene_count,
          imageCount: s.image_count,
          galleryCount: s.gallery_count,
          performerCount: s.performer_count,
          favorite: s.favorite,
        ),
      )
      .toList();

  if (shouldLocalSortBySceneCount) {
    studios.sort(
      (a, b) => (descending == true)
          ? b.sceneCount.compareTo(a.sceneCount)
          : a.sceneCount.compareTo(b.sceneCount),
    );
  }

  return studios;
}