searchForTrack method

  1. @override
Future<List<YoutubeMusicResult>> searchForTrack(
  1. String query, [
  2. int itemCount = 5
])
override

Searches for tracks.

Implementation

@override
Future<List<YoutubeMusicResult>> searchForTrack(String query, [int itemCount = 5]) async {
  var results = await _ytMusicEngine.searchSongs(query);

  var returnList = <YoutubeMusicResult>[];

  // Proactively track the number of results as async is kinda slow ~1s.
  var resultCount = 0;
  var exitLock = Completer<void>.sync();

  for (var result in results) {
    if (resultCount++ > itemCount) {
      break;
    }

    unawaited(
      _ytExplode.videos.streamsClient.getManifest(result.videoId).then((dataManifest) {
        var dlUrl = dataManifest.audioOnly.withHighestBitrate().url.toString();

        var highestResThumbnail =
            result.thumbnails.reduce((a, b) => a.width * a.height > b.width * b.height ? a : b);

        returnList.add(
          YoutubeMusicResult(
            title: result.name,
            artists: [result.artist.name],
            album: result.album?.name ?? '',
            srcUrl: 'https://music.youtube.com/watch?v=${result.videoId}',
            dlUrl: dlUrl,
            sDuration: result.duration!,
            source: Source.youtubeMusic,
            artUrl: highestResThumbnail.url,
          ),
        );

        if (returnList.length >= itemCount) {
          exitLock.complete();
        }
      }),
    );
  }

  return returnList;
}