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;
///
int get videoLikeCount => int.parse(_videoLikeExp
.firstMatch(root.outerHtml)
?.group(1)
?.stripNonDigits()
.nullIfWhitespace ??
root
.querySelector('.like-button-renderer-like-button')
?.text
.stripNonDigits()
.nullIfWhitespace ??
'0');
int get videoLikeCount =>
initialData.likesCount ??
int.parse(_videoLikeExp
.firstMatch(root.outerHtml)
?.group(1)
?.stripNonDigits()
.nullIfWhitespace ??
root
.querySelector('.like-button-renderer-like-button')
?.text
.stripNonDigits()
.nullIfWhitespace ??
'0');
///
int get videoDislikeCount => int.parse(_videoDislikeExp
.firstMatch(root.outerHtml)
?.group(1)
?.stripNonDigits()
.nullIfWhitespace ??
root
.querySelector('.like-button-renderer-dislike-button')
?.text
.stripNonDigits()
.nullIfWhitespace ??
'0');
int get videoDislikeCount =>
initialData.disLikesCount ??
int.parse(_videoDislikeExp
.firstMatch(root.outerHtml)
?.group(1)
?.stripNonDigits()
.nullIfWhitespace ??
root
.querySelector('.like-button-renderer-dislike-button')
?.text
.stripNonDigits()
.nullIfWhitespace ??
'0');
String? get commentsContinuation => initialData.commentsContinuation;
@ -159,6 +163,60 @@ class WatchPlayerConfig implements PlayerConfigBase {
class _InitialData extends InitialData {
_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() {
if (root['contents'] != null) {
return root
@ -167,8 +225,8 @@ class _InitialData extends InitialData {
?.get('results')
?.get('results')
?.getList('contents')
?.firstWhere((e) => e['itemSectionRenderer'] != null)
.get('itemSectionRenderer')
?.firstWhereOrNull((e) => e['itemSectionRenderer'] != null)
?.get('itemSectionRenderer')
?.getList('contents')
?.firstOrNull
?.get('continuationItemRenderer')

View File

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