youtube_explode/lib/src/search/search_client.dart

94 lines
2.8 KiB
Dart
Raw Normal View History

2020-06-06 11:28:36 +02:00
import '../common/common.dart';
2020-06-30 01:00:37 +02:00
import '../reverse_engineering/responses/playlist_response.dart';
2020-11-01 15:05:19 +01:00
import '../reverse_engineering/responses/search_page.dart';
2020-06-06 11:28:36 +02:00
import '../reverse_engineering/youtube_http_client.dart';
import '../videos/video.dart';
import '../videos/video_id.dart';
2020-09-21 17:34:03 +02:00
import 'base_search_content.dart';
2020-06-14 12:14:21 +02:00
import 'search_query.dart';
2020-06-06 11:28:36 +02:00
/// YouTube search queries.
class SearchClient {
final YoutubeHttpClient _httpClient;
/// Initializes an instance of [SearchClient]
SearchClient(this._httpClient);
/// Enumerates videos returned by the specified search query.
2020-09-21 17:34:03 +02:00
/// (from the YouTube Embedded API)
Stream<Video> getVideos(String searchQuery) async* {
2020-06-06 11:28:36 +02:00
var encounteredVideoIds = <String>{};
for (var page = 0; page < double.maxFinite; page++) {
var response =
await PlaylistResponse.searchResults(_httpClient, searchQuery);
var countDelta = 0;
for (var video in response.videos) {
var videoId = video.id;
if (!encounteredVideoIds.add(videoId)) {
continue;
}
yield Video(
VideoId(videoId),
video.title,
video.author,
2020-06-30 01:02:58 +02:00
video.channelId,
2020-06-06 11:28:36 +02:00
video.uploadDate,
video.description,
video.duration,
ThumbnailSet(videoId),
video.keywords,
Engagement(video.viewCount, video.likes, video.dislikes));
countDelta++;
}
// Videos loop around, so break when we stop seeing new videos
if (countDelta <= 0) {
break;
}
}
}
2020-06-13 22:54:53 +02:00
2020-09-21 17:34:03 +02:00
/// Enumerates videos returned by the specified search query
/// (from the video search page).
/// Contains only instances of [SearchVideo] or [SearchPlaylist]
Stream<BaseSearchContent> getVideosFromPage(String searchQuery) async* {
var page = await SearchPage.get(_httpClient, searchQuery);
yield* Stream.fromIterable(page.initialData.searchContent);
// ignore: literal_only_boolean_expressions
while (true) {
page = await page.nextPage(_httpClient);
if (page == null) {
return;
}
yield* Stream.fromIterable(page.initialData.searchContent);
}
}
2020-06-13 22:54:53 +02:00
/// Queries to YouTube to get the results.
2020-10-17 22:09:52 +02:00
@Deprecated('Use getVideosFromPage instead - '
'Should be used only to get related videos')
2020-06-13 22:54:53 +02:00
Future<SearchQuery> queryFromPage(String searchQuery) =>
SearchQuery.search(_httpClient, searchQuery);
2020-06-06 11:28:36 +02:00
}
2020-09-21 17:34:03 +02:00
/*
channelId = ChannelId.fromString(channelId);
var page = await ChannelUploadPage.get(
_httpClient, channelId.value, videoSorting.code);
yield* Stream.fromIterable(page.initialData.uploads);
// ignore: literal_only_boolean_expressions
while (true) {
page = await page.nextPage(_httpClient);
if (page == null) {
return;
}
yield* Stream.fromIterable(page.initialData.uploads);
}
*/