From 07651c300897a0666d8d0fbe75bd8a18bc7c6de0 Mon Sep 17 00:00:00 2001 From: Mattia Date: Thu, 1 Oct 2020 18:04:56 +0200 Subject: [PATCH] New version 1.15.2 Fix extraction for same videos. This closes #76 (cherry picked from commit 0186ad3d7a3ee94df0214cafeca323bd9b67d31c) --- CHANGELOG.md | 3 +++ .../responses/embed_page.dart | 1 + .../responses/player_source.dart | 2 +- .../responses/watch_page.dart | 19 ++++++++----------- lib/src/videos/streams/streams_client.dart | 1 + pubspec.yaml | 2 +- test/streams_test.dart | 2 +- test/video_test.dart | 2 +- 8 files changed, 17 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3766a39..9012d7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,9 @@ - Only throw custom exceptions from the library. - `getUploadsFromPage` no longer throws. +## 1.15.2 +- Fix extraction for same videos (#76) + ## 1.5.1 - BREAKING CHANGE: Renamed `getVideosAsync` to `getVideos`. - Implemented `getVideosFromPage` which supersedes `queryFromPage`. diff --git a/lib/src/reverse_engineering/responses/embed_page.dart b/lib/src/reverse_engineering/responses/embed_page.dart index 75855c8..e4e79d7 100644 --- a/lib/src/reverse_engineering/responses/embed_page.dart +++ b/lib/src/reverse_engineering/responses/embed_page.dart @@ -11,6 +11,7 @@ import '../youtube_http_client.dart'; class EmbedPage { static final _playerConfigExp = RegExp(r"'PLAYER_CONFIG':\s*(\{.*\})\}"); + final Document _root; _PlayerConfig _playerConfig; String __playerConfigJson; diff --git a/lib/src/reverse_engineering/responses/player_source.dart b/lib/src/reverse_engineering/responses/player_source.dart index 68ee871..81df2f2 100644 --- a/lib/src/reverse_engineering/responses/player_source.dart +++ b/lib/src/reverse_engineering/responses/player_source.dart @@ -30,7 +30,7 @@ class PlayerSource { var val = RegExp(r'(?<=invalid namespace.*?;[\w\s]+=)\d+') .stringMatch(_root) ?.nullIfWhitespace ?? - RegExp(r'(?<=this\.signatureTimestamp=)\d+"') + RegExp(r'(?<=this\.signatureTimestamp=)\d+') .stringMatch(_root) ?.nullIfWhitespace; if (val == null) { diff --git a/lib/src/reverse_engineering/responses/watch_page.dart b/lib/src/reverse_engineering/responses/watch_page.dart index e04df8a..918981a 100644 --- a/lib/src/reverse_engineering/responses/watch_page.dart +++ b/lib/src/reverse_engineering/responses/watch_page.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:html/dom.dart'; import 'package:html/parser.dart' as parser; @@ -84,18 +86,13 @@ class WatchPage { ?.nullIfWhitespace ?? '0'); + static final _playerConfigExp = RegExp(r'ytplayer\.config\s*=\s*(\{.*\}\});'); + /// - _PlayerConfig get playerConfig { - if (_playerConfig != null) { - return _playerConfig; - } - var text = _root.getElementsByTagName('html').first.text; - if (!text.contains('ytplayer.config = ')) { - return null; - } - return _playerConfig = _PlayerConfig( - PlayerConfigJson.fromRawJson(_extractJson(text, 'ytplayer.config = '))); - } + _PlayerConfig get playerConfig => + _playerConfig ??= _PlayerConfig(json.decode(_playerConfigExp + .firstMatch(_root.getElementsByTagName('html').first.text) + ?.group(1))); String _extractJson(String html, String separator) { return _matchJson( diff --git a/lib/src/videos/streams/streams_client.dart b/lib/src/videos/streams/streams_client.dart index 126d4e1..5f86033 100644 --- a/lib/src/videos/streams/streams_client.dart +++ b/lib/src/videos/streams/streams_client.dart @@ -215,6 +215,7 @@ class StreamsClient { // We can try to extract the manifest from two sources: // get_video_info and the video watch page. // In some cases one works, in some cases another does. + try { var context = await _getStreamContextFromVideoInfo(videoId); return _getManifest(context); diff --git a/pubspec.yaml b/pubspec.yaml index 7b66e9c..64e3610 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: youtube_explode_dart description: A port in dart of the youtube explode library. Supports several API functions without the need of Youtube API Key. -version: 1.5.0 +version: 1.5.2 homepage: https://github.com/Hexer10/youtube_explode_dart environment: diff --git a/test/streams_test.dart b/test/streams_test.dart index f3f4944..0dda6b6 100644 --- a/test/streams_test.dart +++ b/test/streams_test.dart @@ -14,7 +14,7 @@ void main() { var data = { '9bZkp7q19f0', -// 'SkRSXFQerZs', age restricted videos are not supported anymore. + 'SkRSXFQerZs', 'hySoCSoH-g8', '_kmeFXjjGfk', 'MeJVWBSsPAY', diff --git a/test/video_test.dart b/test/video_test.dart index 519ddfe..6646592 100644 --- a/test/video_test.dart +++ b/test/video_test.dart @@ -25,7 +25,7 @@ void main() { expect(video.uploadDate.millisecondsSinceEpoch, inInclusiveRange(rangeMs - 86400000, rangeMs + 86400000)); expect(video.description, contains('246pp')); - expect(video.duration, const Duration(minutes: 1, seconds: 49)); + expect(video.duration, const Duration(minutes: 1, seconds: 48)); expect(video.thumbnails.lowResUrl, isNotEmpty); expect(video.thumbnails.mediumResUrl, isNotEmpty); expect(video.thumbnails.highResUrl, isNotEmpty);