Fix muxed video extraction #172.

Better dis/likes data extraction.
This commit is contained in:
Mattia 2021-10-05 17:18:36 +02:00
parent e323a24ba3
commit 477640869a
2 changed files with 83 additions and 26 deletions

View File

@ -54,30 +54,34 @@ class WatchPage extends YoutubePage<_InitialData> {
root.querySelector('meta[property="og:url"]') != null; root.querySelector('meta[property="og:url"]') != null;
/// ///
int get videoLikeCount => int.parse(_videoLikeExp int get videoLikeCount =>
.firstMatch(root.outerHtml) initialData.likesCount ??
?.group(1) int.parse(_videoLikeExp
?.stripNonDigits() .firstMatch(root.outerHtml)
.nullIfWhitespace ?? ?.group(1)
root ?.stripNonDigits()
.querySelector('.like-button-renderer-like-button') .nullIfWhitespace ??
?.text root
.stripNonDigits() .querySelector('.like-button-renderer-like-button')
.nullIfWhitespace ?? ?.text
'0'); .stripNonDigits()
.nullIfWhitespace ??
'0');
/// ///
int get videoDislikeCount => int.parse(_videoDislikeExp int get videoDislikeCount =>
.firstMatch(root.outerHtml) initialData.disLikesCount ??
?.group(1) int.parse(_videoDislikeExp
?.stripNonDigits() .firstMatch(root.outerHtml)
.nullIfWhitespace ?? ?.group(1)
root ?.stripNonDigits()
.querySelector('.like-button-renderer-dislike-button') .nullIfWhitespace ??
?.text root
.stripNonDigits() .querySelector('.like-button-renderer-dislike-button')
.nullIfWhitespace ?? ?.text
'0'); .stripNonDigits()
.nullIfWhitespace ??
'0');
String? get commentsContinuation => initialData.commentsContinuation; String? get commentsContinuation => initialData.commentsContinuation;
@ -159,6 +163,60 @@ class WatchPlayerConfig implements PlayerConfigBase {
class _InitialData extends InitialData { class _InitialData extends InitialData {
_InitialData(JsonMap root) : super(root); _InitialData(JsonMap root) : super(root);
late final int? likesCount = _getLikes();
late final int? disLikesCount = _getDislikes();
int? _getLikes() {
if (root['contents'] != null) {
final likes = root
.get('contents')
?.get('twoColumnWatchNextResults')
?.get('results')
?.get('results')
?.getList('contents')
?.firstWhereOrNull((e) => e['videoPrimaryInfoRenderer'] != null)
?.get('videoPrimaryInfoRenderer')
?.get('videoActions')
?.get('menuRenderer')
?.getList('topLevelButtons')
?.firstWhereOrNull((e) => e['toggleButtonRenderer'] != null)
?.get('toggleButtonRenderer')
?.get('defaultText')
?.get('accessibility')
?.get('accessibilityData')
?.getT<String>('label');
return likes.parseInt();
}
return null;
}
int? _getDislikes() {
if (root['contents'] != null) {
final likes = root
.get('contents')
?.get('twoColumnWatchNextResults')
?.get('results')
?.get('results')
?.getList('contents')
?.firstWhereOrNull((e) => e['videoPrimaryInfoRenderer'] != null)
?.get('videoPrimaryInfoRenderer')
?.get('videoActions')
?.get('menuRenderer')
?.getList('topLevelButtons')
?.where((e) => e['toggleButtonRenderer'] != null)
.elementAtSafe(1)
?.get('toggleButtonRenderer')
?.get('defaultText')
?.get('accessibility')
?.get('accessibilityData')
?.getT<String>('label');
return likes.parseInt();
}
return null;
}
JsonMap? getContinuationContext() { JsonMap? getContinuationContext() {
if (root['contents'] != null) { if (root['contents'] != null) {
return root return root
@ -167,8 +225,8 @@ class _InitialData extends InitialData {
?.get('results') ?.get('results')
?.get('results') ?.get('results')
?.getList('contents') ?.getList('contents')
?.firstWhere((e) => e['itemSectionRenderer'] != null) ?.firstWhereOrNull((e) => e['itemSectionRenderer'] != null)
.get('itemSectionRenderer') ?.get('itemSectionRenderer')
?.getList('contents') ?.getList('contents')
?.firstOrNull ?.firstOrNull
?.get('continuationItemRenderer') ?.get('continuationItemRenderer')

View File

@ -96,8 +96,7 @@ class PlayerResponse {
late final List<StreamInfoProvider> muxedStreams = root late final List<StreamInfoProvider> muxedStreams = root
.get('streamingData') .get('streamingData')
?.getList('formats') ?.getList('formats')
?.where((e) => e['url'] != null) ?.map((e) => _StreamInfo(e, StreamSource.muxed))
.map((e) => _StreamInfo(e, StreamSource.muxed))
.cast<StreamInfoProvider>() .cast<StreamInfoProvider>()
.toList() ?? .toList() ??
const <StreamInfoProvider>[]; const <StreamInfoProvider>[];