search method

Future<Map<String, List>> search({
  1. required String query,
  2. required List<String> types,
  3. String? market,
  4. int limit = 20,
  5. int offset = 0,
})

Performs a search across Spotify content.

query is the search term, types define content types (e.g. track, artist), optional market, pagination via limit and offset.

Implementation

Future<Map<String, List<dynamic>>> search({
  required String query,
  required List<String> types,
  String? market,
  int limit = 20,
  int offset = 0,
}) async {
  final typeParam = types.join(',');

  final queryParams = {
    'q': query,
    'type': typeParam,
    'limit': limit.toString(),
    'offset': offset.toString(),
    if (market != null) 'market': market,
  };

  final url = Uri.https(_baseApiHost, '/v1/search', queryParams);
  final jsonResponse = await _getJson(url);

  final Map<String, List<dynamic>> results = {};

  for (final type in types) {
    final key = '${type}s';
    if (!jsonResponse.containsKey(key)) continue;

    final items = jsonResponse[key]['items'] as List<dynamic>;

    results[key] = switch (type) {
      'track' => items.map((item) => Track.fromJson(item)).toList(),
      'artist' => items.map((item) => Artist.fromJson(item)).toList(),
      'album' => items.map((item) => Album.fromJson(item)).toList(),
      'playlist' => items.map((item) => Playlist.fromJson(item)).toList(),
      _ => items,
    };
  }

  return results;
}