diff --git a/CHANGELOG.md b/CHANGELOG.md index e0fca11..5ae1f7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 1.9.3 +- `getUploadsFromPage` now returns an instance of `ChannelUploadsList`. + ## 1.9.2+2 - Fix `videoThumbnail` in `ChannelVideo`. diff --git a/lib/src/channels/channel_client.dart b/lib/src/channels/channel_client.dart index 5f7fc55..4539279 100644 --- a/lib/src/channels/channel_client.dart +++ b/lib/src/channels/channel_client.dart @@ -1,3 +1,5 @@ +import 'package:youtube_explode_dart/src/channels/channel_uploads_list.dart'; + import '../common/common.dart'; import '../extensions/helpers_extension.dart'; import '../playlists/playlists.dart'; @@ -9,7 +11,7 @@ import '../videos/video.dart'; import '../videos/video_id.dart'; import 'channel.dart'; import 'channel_id.dart'; -import 'channel_video.dart'; +import 'channel_uploads_list.dart'; import 'channels.dart'; import 'username.dart'; import 'video_sorting.dart'; @@ -113,20 +115,33 @@ class ChannelClient { /// /// Note that this endpoint provides less info about each video /// (only the Title and VideoId). - Stream getUploadsFromPage(dynamic channelId, - [VideoSorting videoSorting = VideoSorting.newest]) async* { + Future getUploadsFromPage(dynamic channelId, + [VideoSorting videoSorting = VideoSorting.newest]) async { channelId = ChannelId.fromString(channelId); - ChannelUploadPage? page = await ChannelUploadPage.get( + final page = await ChannelUploadPage.get( _httpClient, (channelId as 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); - } + final channel = await get(channelId); + + return ChannelUploadsList( + page.initialData.uploads + .map((e) => Video( + e.videoId, + e.videoTitle, + channel.title, + channelId, + e.videoUploadDate.toDateTime(), + null, + '', + e.videoDuration, + ThumbnailSet(e.videoId.value), + null, + Engagement(e.videoViews, null, null), + false)) + .toList(), + channel.title, + channelId, + page, + _httpClient); } } diff --git a/lib/src/channels/channel_uploads_list.dart b/lib/src/channels/channel_uploads_list.dart new file mode 100644 index 0000000..b7a61bd --- /dev/null +++ b/lib/src/channels/channel_uploads_list.dart @@ -0,0 +1,52 @@ +import 'dart:async'; + +import 'package:collection/collection.dart'; +import 'package:youtube_explode_dart/src/reverse_engineering/responses/channel_upload_page.dart'; + +import '../../youtube_explode_dart.dart'; +import '../extensions/helpers_extension.dart'; + +/// This list contains a channel uploads. +/// This behaves like a [List] but has the [SearchList.nextPage] to get the next batch of videos. +class ChannelUploadsList extends DelegatingList