youtube_explode/lib/src/videos/video_client.dart

69 lines
2.4 KiB
Dart
Raw Normal View History

2020-06-30 01:00:37 +02:00
import '../channels/channel_id.dart';
2020-06-03 23:02:21 +02:00
import '../common/common.dart';
2021-07-02 00:48:10 +02:00
import '../extensions/helpers_extension.dart';
2021-07-21 02:06:02 +02:00
import '../reverse_engineering/pages/watch_page.dart';
2020-06-03 23:02:21 +02:00
import '../reverse_engineering/youtube_http_client.dart';
import 'videos.dart';
/// Queries related to YouTube videos.
class VideoClient {
final YoutubeHttpClient _httpClient;
/// Queries related to media streams of YouTube videos.
final StreamsClient streamsClient;
2021-10-04 13:00:22 +02:00
/// Queries related to media streams of YouTube videos.
/// Alias of [streamsClient].
StreamsClient get streams => streamsClient;
2020-06-03 23:02:21 +02:00
/// Queries related to closed captions of YouTube videos.
final ClosedCaptionClient closedCaptions;
2021-10-04 13:00:22 +02:00
/// Queries related to a YouTube video comments.
final CommentsClient commentsClient;
2021-10-04 13:00:22 +02:00
/// Queries related to a YouTube video comments.
/// Alias of [commentsClient].
CommentsClient get comments => commentsClient;
2020-06-03 23:02:21 +02:00
/// Initializes an instance of [VideoClient].
VideoClient(this._httpClient)
: streamsClient = StreamsClient(_httpClient),
closedCaptions = ClosedCaptionClient(_httpClient),
commentsClient = CommentsClient(_httpClient);
2020-06-03 23:02:21 +02:00
/// Gets the metadata associated with the specified video.
Future<Video> _getVideoFromWatchPage(VideoId videoId) async {
2020-06-05 20:08:04 +02:00
var watchPage = await WatchPage.get(_httpClient, videoId.value);
final playerResponse = watchPage.playerResponse!;
2020-06-03 23:02:21 +02:00
return Video(
2020-06-05 20:08:04 +02:00
videoId,
2020-06-03 23:02:21 +02:00
playerResponse.videoTitle,
playerResponse.videoAuthor,
2020-06-30 01:00:37 +02:00
ChannelId(playerResponse.videoChannelId),
2021-07-02 00:48:10 +02:00
playerResponse.videoUploadDate ??
watchPage.root
.querySelector('meta[itemprop=uploadDate]')
?.attributes['content']
?.tryParseDateTime(),
playerResponse.videoPublishDate ??
watchPage.root
.querySelector('meta[itemprop=datePublished]')
?.attributes['content']
?.tryParseDateTime(),
2020-06-03 23:02:21 +02:00
playerResponse.videoDescription,
playerResponse.videoDuration,
2020-06-05 20:08:04 +02:00
ThumbnailSet(videoId.value),
2020-06-03 23:02:21 +02:00
playerResponse.videoKeywords,
2021-03-11 14:20:10 +01:00
Engagement(playerResponse.videoViewCount, watchPage.videoLikeCount,
watchPage.videoDislikeCount),
2021-02-27 18:58:42 +01:00
playerResponse.isLive,
watchPage);
2020-06-03 23:02:21 +02:00
}
/// Get a [Video] instance from a [videoId]
2021-02-27 18:58:42 +01:00
Future<Video> get(dynamic videoId) async =>
_getVideoFromWatchPage(VideoId.fromString(videoId));
2020-06-03 23:02:21 +02:00
}