From 8c3d174c9112fb32bf06a1327c5712e1eb2bcdc1 Mon Sep 17 00:00:00 2001 From: itssidhere Date: Tue, 11 Jan 2022 17:34:05 +0530 Subject: [PATCH 1/4] default change to embedded, embedded body client changed --- .../reverse_engineering/clients/embedded_player_client.dart | 5 ++--- lib/src/videos/streams/streams_client.dart | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/src/reverse_engineering/clients/embedded_player_client.dart b/lib/src/reverse_engineering/clients/embedded_player_client.dart index b32b74f..760e6f5 100644 --- a/lib/src/reverse_engineering/clients/embedded_player_client.dart +++ b/lib/src/reverse_engineering/clients/embedded_player_client.dart @@ -53,9 +53,8 @@ class EmbeddedPlayerClient { 'context': const { 'client': { 'hl': 'en', - 'clientName': 'WEB', - 'clientVersion': '2.20210721.00.00', - "clientScreen": "EMBED" + 'clientName': 'ANDROID', + 'clientVersion': '16.46.37' } }, 'videoId': videoId diff --git a/lib/src/videos/streams/streams_client.dart b/lib/src/videos/streams/streams_client.dart index d1a35d0..ef24f9e 100644 --- a/lib/src/videos/streams/streams_client.dart +++ b/lib/src/videos/streams/streams_client.dart @@ -198,13 +198,13 @@ class StreamsClient { videoId = VideoId.fromString(videoId); try { - final context = await _getStreamContextFromWatchPage(videoId); + final context = await _getStreamContextFromEmbeddedClient(videoId); return _getManifest(context); } on YoutubeExplodeException { //TODO: ignore } + final context = await _getStreamContextFromWatchPage(videoId); - final context = await _getStreamContextFromEmbeddedClient(videoId); return _getManifest(context); } From 6dad4d6776f8008f2b1d4f08e050d3cda4f04aa4 Mon Sep 17 00:00:00 2001 From: Mattia Date: Tue, 11 Jan 2022 13:54:30 +0100 Subject: [PATCH 2/4] Minor bug fix. If a channel in a search query doesn't provide a video count it will default to -1. Fix #184 --- lib/src/reverse_engineering/pages/search_page.dart | 11 ++++++----- lib/src/search/base_search_content.dart | 2 +- pubspec.yaml | 8 ++++++-- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/lib/src/reverse_engineering/pages/search_page.dart b/lib/src/reverse_engineering/pages/search_page.dart index 9c8cf9e..c94bc78 100644 --- a/lib/src/reverse_engineering/pages/search_page.dart +++ b/lib/src/reverse_engineering/pages/search_page.dart @@ -210,17 +210,18 @@ class _InitialData extends InitialData { } if (content['channelRenderer'] != null) { var renderer = content.get('channelRenderer')!; + return SearchChannel( ChannelId(renderer.getT('channelId')!), renderer.get('title')!.getT('simpleText')!, renderer.get('descriptionSnippet')?.getList('runs')?.parseRuns() ?? '', renderer - .get('videoCountText')! - .getList('runs')! - .first - .getT('text')! - .parseInt()!); + .get('videoCountText') + ?.getList('runs') + ?.first + .getT('text') + ?.parseInt() ?? -1); } // Here ignore 'horizontalCardListRenderer' & 'shelfRenderer' return null; diff --git a/lib/src/search/base_search_content.dart b/lib/src/search/base_search_content.dart index 2865ce4..1c69290 100644 --- a/lib/src/search/base_search_content.dart +++ b/lib/src/search/base_search_content.dart @@ -1,2 +1,2 @@ -/// This i can either be a [SearchVideo] or [SearchPlaylist] +/// This can either be a [SearchVideo] or [SearchPlaylist] mixin BaseSearchContent {} diff --git a/pubspec.yaml b/pubspec.yaml index d647f9c..e72c10f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,8 +1,8 @@ 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.10.9 +version: 1.10.9+1 -homepage: ^0.13.4 +homepage: https://github.com/Hexer10/youtube_explode_dart environment: sdk: '>=2.14.0 <3.0.0' @@ -25,3 +25,7 @@ dev_dependencies: json_serializable: ^6.1.1 lint: ^1.8.1 test: ^1.19.5 + +false_secrets: + - "lib/src/reverse_engineering/youtube_http_client.dart" + - "lib/src/reverse_engineering/clients/embedded_player_client.dart" From e114785ffd301d6ddce34962c8a4702a605885bb Mon Sep 17 00:00:00 2001 From: Mattia Date: Tue, 1 Feb 2022 00:55:55 +0100 Subject: [PATCH 3/4] Fix #168 + Fix for youtube.com/c/X channels. --- CHANGELOG.md | 5 ++ lib/src/channels/channel.dart | 3 ++ lib/src/channels/channel.freezed.dart | 51 +++++++++++++++---- lib/src/channels/channel_about.freezed.dart | 1 + lib/src/channels/channel_client.dart | 10 ++-- lib/src/channels/channel_id.freezed.dart | 1 + lib/src/channels/channel_link.freezed.dart | 1 + lib/src/channels/channel_video.freezed.dart | 1 + lib/src/channels/username.freezed.dart | 1 + lib/src/common/engagement.freezed.dart | 1 + lib/src/common/thumbnail.freezed.dart | 1 + lib/src/common/thumbnail_set.freezed.dart | 1 + .../exceptions/fatal_failure_exception.dart | 8 ++- lib/src/playlists/playlist.freezed.dart | 1 + lib/src/playlists/playlist_id.freezed.dart | 1 + .../pages/channel_page.dart | 29 +++++++++-- .../pages/channel_upload_page.dart | 2 +- .../pages/search_page.dart | 11 ++-- .../player/player_source.dart | 6 +-- lib/src/search/search_channel.freezed.dart | 1 + lib/src/search/search_playlist.freezed.dart | 1 + lib/src/search/search_video.freezed.dart | 1 + .../closed_caption_track_info.freezed.dart | 1 + .../closed_captions/language.freezed.dart | 1 + lib/src/videos/comments/comment.freezed.dart | 1 + .../streams/audio_only_stream_info.dart | 1 - lib/src/videos/streams/bitrate.freezed.dart | 1 + lib/src/videos/streams/filesize.freezed.dart | 1 + lib/src/videos/streams/framerate.freezed.dart | 1 + lib/src/videos/streams/muxed_stream_info.dart | 2 +- .../streams/stream_container.freezed.dart | 1 + lib/src/videos/streams/stream_info.dart | 1 - .../streams/video_only_stream_info.dart | 2 - lib/src/videos/video.freezed.dart | 1 + lib/src/videos/video_id.freezed.dart | 1 + 35 files changed, 120 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7379af3..23f1626 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 1.10.10 +- Fix issue #136: Add `bannerUrl` getter for `Channel`. +- Fix `ChannelClient.getByUsername` for `youtube.com/c/XXXX` channels. + + ## 1.10.9 - Fix issue #180: YouTube throttling videos. - Thanks to @itssidhere. diff --git a/lib/src/channels/channel.dart b/lib/src/channels/channel.dart index 610757c..a47edfc 100644 --- a/lib/src/channels/channel.dart +++ b/lib/src/channels/channel.dart @@ -18,6 +18,9 @@ class Channel with _$Channel { /// URL of the channel's logo image. String logoUrl, + /// URL of the channel's banner image. + String bannerUrl, + /// The (approximate) channel subscriber's count. int? subscribersCount, ) = _Channel; diff --git a/lib/src/channels/channel.freezed.dart b/lib/src/channels/channel.freezed.dart index 4263f34..230d4f9 100644 --- a/lib/src/channels/channel.freezed.dart +++ b/lib/src/channels/channel.freezed.dart @@ -1,5 +1,6 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target part of 'channel.dart'; @@ -17,12 +18,13 @@ final _privateConstructorUsedError = UnsupportedError( class _$ChannelTearOff { const _$ChannelTearOff(); - _Channel call( - ChannelId id, String title, String logoUrl, int? subscribersCount) { + _Channel call(ChannelId id, String title, String logoUrl, String bannerUrl, + int? subscribersCount) { return _Channel( id, title, logoUrl, + bannerUrl, subscribersCount, ); } @@ -42,6 +44,9 @@ mixin _$Channel { /// URL of the channel's logo image. String get logoUrl => throw _privateConstructorUsedError; + /// URL of the channel's banner image. + String get bannerUrl => throw _privateConstructorUsedError; + /// The (approximate) channel subscriber's count. int? get subscribersCount => throw _privateConstructorUsedError; @@ -54,7 +59,11 @@ abstract class $ChannelCopyWith<$Res> { factory $ChannelCopyWith(Channel value, $Res Function(Channel) then) = _$ChannelCopyWithImpl<$Res>; $Res call( - {ChannelId id, String title, String logoUrl, int? subscribersCount}); + {ChannelId id, + String title, + String logoUrl, + String bannerUrl, + int? subscribersCount}); $ChannelIdCopyWith<$Res> get id; } @@ -72,6 +81,7 @@ class _$ChannelCopyWithImpl<$Res> implements $ChannelCopyWith<$Res> { Object? id = freezed, Object? title = freezed, Object? logoUrl = freezed, + Object? bannerUrl = freezed, Object? subscribersCount = freezed, }) { return _then(_value.copyWith( @@ -87,6 +97,10 @@ class _$ChannelCopyWithImpl<$Res> implements $ChannelCopyWith<$Res> { ? _value.logoUrl : logoUrl // ignore: cast_nullable_to_non_nullable as String, + bannerUrl: bannerUrl == freezed + ? _value.bannerUrl + : bannerUrl // ignore: cast_nullable_to_non_nullable + as String, subscribersCount: subscribersCount == freezed ? _value.subscribersCount : subscribersCount // ignore: cast_nullable_to_non_nullable @@ -108,7 +122,11 @@ abstract class _$ChannelCopyWith<$Res> implements $ChannelCopyWith<$Res> { __$ChannelCopyWithImpl<$Res>; @override $Res call( - {ChannelId id, String title, String logoUrl, int? subscribersCount}); + {ChannelId id, + String title, + String logoUrl, + String bannerUrl, + int? subscribersCount}); @override $ChannelIdCopyWith<$Res> get id; @@ -128,6 +146,7 @@ class __$ChannelCopyWithImpl<$Res> extends _$ChannelCopyWithImpl<$Res> Object? id = freezed, Object? title = freezed, Object? logoUrl = freezed, + Object? bannerUrl = freezed, Object? subscribersCount = freezed, }) { return _then(_Channel( @@ -143,6 +162,10 @@ class __$ChannelCopyWithImpl<$Res> extends _$ChannelCopyWithImpl<$Res> ? _value.logoUrl : logoUrl // ignore: cast_nullable_to_non_nullable as String, + bannerUrl == freezed + ? _value.bannerUrl + : bannerUrl // ignore: cast_nullable_to_non_nullable + as String, subscribersCount == freezed ? _value.subscribersCount : subscribersCount // ignore: cast_nullable_to_non_nullable @@ -154,7 +177,8 @@ class __$ChannelCopyWithImpl<$Res> extends _$ChannelCopyWithImpl<$Res> /// @nodoc class _$_Channel extends _Channel { - const _$_Channel(this.id, this.title, this.logoUrl, this.subscribersCount) + const _$_Channel( + this.id, this.title, this.logoUrl, this.bannerUrl, this.subscribersCount) : super._(); @override @@ -171,12 +195,16 @@ class _$_Channel extends _Channel { final String logoUrl; @override + /// URL of the channel's banner image. + final String bannerUrl; + @override + /// The (approximate) channel subscriber's count. final int? subscribersCount; @override String toString() { - return 'Channel(id: $id, title: $title, logoUrl: $logoUrl, subscribersCount: $subscribersCount)'; + return 'Channel(id: $id, title: $title, logoUrl: $logoUrl, bannerUrl: $bannerUrl, subscribersCount: $subscribersCount)'; } @override @@ -187,6 +215,7 @@ class _$_Channel extends _Channel { const DeepCollectionEquality().equals(other.id, id) && const DeepCollectionEquality().equals(other.title, title) && const DeepCollectionEquality().equals(other.logoUrl, logoUrl) && + const DeepCollectionEquality().equals(other.bannerUrl, bannerUrl) && const DeepCollectionEquality() .equals(other.subscribersCount, subscribersCount)); } @@ -197,6 +226,7 @@ class _$_Channel extends _Channel { const DeepCollectionEquality().hash(id), const DeepCollectionEquality().hash(title), const DeepCollectionEquality().hash(logoUrl), + const DeepCollectionEquality().hash(bannerUrl), const DeepCollectionEquality().hash(subscribersCount)); @JsonKey(ignore: true) @@ -206,9 +236,8 @@ class _$_Channel extends _Channel { } abstract class _Channel extends Channel { - const factory _Channel( - ChannelId id, String title, String logoUrl, int? subscribersCount) = - _$_Channel; + const factory _Channel(ChannelId id, String title, String logoUrl, + String bannerUrl, int? subscribersCount) = _$_Channel; const _Channel._() : super._(); @override @@ -225,6 +254,10 @@ abstract class _Channel extends Channel { String get logoUrl; @override + /// URL of the channel's banner image. + String get bannerUrl; + @override + /// The (approximate) channel subscriber's count. int? get subscribersCount; @override diff --git a/lib/src/channels/channel_about.freezed.dart b/lib/src/channels/channel_about.freezed.dart index 78638b7..cf5e7e2 100644 --- a/lib/src/channels/channel_about.freezed.dart +++ b/lib/src/channels/channel_about.freezed.dart @@ -1,5 +1,6 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target part of 'channel_about.dart'; diff --git a/lib/src/channels/channel_client.dart b/lib/src/channels/channel_client.dart index f9ae415..2063fe4 100644 --- a/lib/src/channels/channel_client.dart +++ b/lib/src/channels/channel_client.dart @@ -30,7 +30,7 @@ class ChannelClient { var channelPage = await ChannelPage.get(_httpClient, id.value); return Channel(id, channelPage.channelTitle, channelPage.channelLogoUrl, - channelPage.subscribersCount); + channelPage.channelBannerUrl, channelPage.subscribersCount); } /// Gets the metadata associated with the channel of the specified user. @@ -41,8 +41,12 @@ class ChannelClient { var channelPage = await ChannelPage.getByUsername(_httpClient, username.value); - return Channel(ChannelId(channelPage.channelId), channelPage.channelTitle, - channelPage.channelLogoUrl, channelPage.subscribersCount); + return Channel( + ChannelId(channelPage.channelId), + channelPage.channelTitle, + channelPage.channelLogoUrl, + channelPage.channelBannerUrl, + channelPage.subscribersCount); } /// Gets the info found on a YouTube Channel About page. diff --git a/lib/src/channels/channel_id.freezed.dart b/lib/src/channels/channel_id.freezed.dart index 4b7b0c8..6d5fde4 100644 --- a/lib/src/channels/channel_id.freezed.dart +++ b/lib/src/channels/channel_id.freezed.dart @@ -1,5 +1,6 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target part of 'channel_id.dart'; diff --git a/lib/src/channels/channel_link.freezed.dart b/lib/src/channels/channel_link.freezed.dart index 1ca60ee..ad9ba36 100644 --- a/lib/src/channels/channel_link.freezed.dart +++ b/lib/src/channels/channel_link.freezed.dart @@ -1,5 +1,6 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target part of 'channel_link.dart'; diff --git a/lib/src/channels/channel_video.freezed.dart b/lib/src/channels/channel_video.freezed.dart index 06b98bb..0013724 100644 --- a/lib/src/channels/channel_video.freezed.dart +++ b/lib/src/channels/channel_video.freezed.dart @@ -1,5 +1,6 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target part of 'channel_video.dart'; diff --git a/lib/src/channels/username.freezed.dart b/lib/src/channels/username.freezed.dart index 894ec81..5688d94 100644 --- a/lib/src/channels/username.freezed.dart +++ b/lib/src/channels/username.freezed.dart @@ -1,5 +1,6 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target part of 'username.dart'; diff --git a/lib/src/common/engagement.freezed.dart b/lib/src/common/engagement.freezed.dart index 2de0932..a170f4c 100644 --- a/lib/src/common/engagement.freezed.dart +++ b/lib/src/common/engagement.freezed.dart @@ -1,5 +1,6 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target part of 'engagement.dart'; diff --git a/lib/src/common/thumbnail.freezed.dart b/lib/src/common/thumbnail.freezed.dart index 4170126..10b2af3 100644 --- a/lib/src/common/thumbnail.freezed.dart +++ b/lib/src/common/thumbnail.freezed.dart @@ -1,5 +1,6 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target part of 'thumbnail.dart'; diff --git a/lib/src/common/thumbnail_set.freezed.dart b/lib/src/common/thumbnail_set.freezed.dart index 0f75cc8..ae4b3f8 100644 --- a/lib/src/common/thumbnail_set.freezed.dart +++ b/lib/src/common/thumbnail_set.freezed.dart @@ -1,5 +1,6 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target part of 'thumbnail_set.dart'; diff --git a/lib/src/exceptions/fatal_failure_exception.dart b/lib/src/exceptions/fatal_failure_exception.dart index e23cae0..95a4948 100644 --- a/lib/src/exceptions/fatal_failure_exception.dart +++ b/lib/src/exceptions/fatal_failure_exception.dart @@ -4,11 +4,15 @@ import 'youtube_explode_exception.dart'; /// Exception thrown when a fatal failure occurs. class FatalFailureException extends YoutubeExplodeException { + final int statusCode; + /// Initializes an instance of [FatalFailureException] - FatalFailureException(String message) : super(message); + FatalFailureException(String message, this.statusCode) : super(message); /// Initializes an instance of [FatalFailureException] with a [Response] - FatalFailureException.httpRequest(BaseResponse response) : super(''' + FatalFailureException.httpRequest(BaseResponse response) + : statusCode = response.statusCode, + super(''' Failed to perform an HTTP request to YouTube due to a fatal failure. In most cases, this error indicates that YouTube most likely changed something, which broke the library. If this issue persists, please report it on the project's GitHub page. diff --git a/lib/src/playlists/playlist.freezed.dart b/lib/src/playlists/playlist.freezed.dart index 18c5c2a..03d193c 100644 --- a/lib/src/playlists/playlist.freezed.dart +++ b/lib/src/playlists/playlist.freezed.dart @@ -1,5 +1,6 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target part of 'playlist.dart'; diff --git a/lib/src/playlists/playlist_id.freezed.dart b/lib/src/playlists/playlist_id.freezed.dart index 4ad351d..49d421c 100644 --- a/lib/src/playlists/playlist_id.freezed.dart +++ b/lib/src/playlists/playlist_id.freezed.dart @@ -1,5 +1,6 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target part of 'playlist_id.dart'; diff --git a/lib/src/reverse_engineering/pages/channel_page.dart b/lib/src/reverse_engineering/pages/channel_page.dart index 6e08943..c892717 100644 --- a/lib/src/reverse_engineering/pages/channel_page.dart +++ b/lib/src/reverse_engineering/pages/channel_page.dart @@ -1,4 +1,5 @@ import 'package:html/parser.dart' as parser; +import 'package:http/http.dart'; import '../../exceptions/exceptions.dart'; import '../../extensions/helpers_extension.dart'; @@ -30,6 +31,8 @@ class ChannelPage extends YoutubePage<_InitialData> { root!.querySelector('meta[property="og:image"]')?.attributes['content'] ?? ''; + String get channelBannerUrl => initialData.bannerUrl ?? ''; + int? get subscribersCount => initialData.subscribersCount; /// @@ -57,13 +60,21 @@ class ChannelPage extends YoutubePage<_InitialData> { var url = 'https://www.youtube.com/user/$username?hl=en'; return retry(httpClient, () async { - var raw = await httpClient.getString(url); - var result = ChannelPage.parse(raw); + try { + var raw = await httpClient.getString(url); + var result = ChannelPage.parse(raw); - if (!result.isOk) { - throw TransientFailureException('Channel page is broken'); + if (!result.isOk) { + throw TransientFailureException('Channel page is broken'); + } + return result; + } on FatalFailureException catch (e) { + if (e.statusCode != 404) { + rethrow; + } + url = 'https://www.youtube.com/c/$username?hl=en'; } - return result; + throw FatalFailureException('', 0); }); } } @@ -110,4 +121,12 @@ class _InitialData extends InitialData { return (count * multiplier).toInt(); } + + String? get bannerUrl => root + .get('header') + ?.get('c4TabbedHeaderRenderer') + ?.get('banner') + ?.getList('thumbnails') + ?.first + .getT('url'); } diff --git a/lib/src/reverse_engineering/pages/channel_upload_page.dart b/lib/src/reverse_engineering/pages/channel_upload_page.dart index 664b57c..a67b274 100644 --- a/lib/src/reverse_engineering/pages/channel_upload_page.dart +++ b/lib/src/reverse_engineering/pages/channel_upload_page.dart @@ -99,7 +99,7 @@ class _InitialData extends InitialData { ?.cast(); } if (context == null) { - throw FatalFailureException('Failed to get initial data context.'); + throw FatalFailureException('Failed to get initial data context.', 0); } return context; } diff --git a/lib/src/reverse_engineering/pages/search_page.dart b/lib/src/reverse_engineering/pages/search_page.dart index c94bc78..b9316f2 100644 --- a/lib/src/reverse_engineering/pages/search_page.dart +++ b/lib/src/reverse_engineering/pages/search_page.dart @@ -217,11 +217,12 @@ class _InitialData extends InitialData { renderer.get('descriptionSnippet')?.getList('runs')?.parseRuns() ?? '', renderer - .get('videoCountText') - ?.getList('runs') - ?.first - .getT('text') - ?.parseInt() ?? -1); + .get('videoCountText') + ?.getList('runs') + ?.first + .getT('text') + ?.parseInt() ?? + -1); } // Here ignore 'horizontalCardListRenderer' & 'shelfRenderer' return null; diff --git a/lib/src/reverse_engineering/player/player_source.dart b/lib/src/reverse_engineering/player/player_source.dart index 9f0bf1d..7fb2b16 100644 --- a/lib/src/reverse_engineering/player/player_source.dart +++ b/lib/src/reverse_engineering/player/player_source.dart @@ -31,7 +31,7 @@ class PlayerSource { .stringMatch(root) ?.nullIfWhitespace; if (val == null) { - throw FatalFailureException('Could not find sts in player source.'); + throw FatalFailureException('Could not find sts in player source.', 0); } return val; } @@ -40,13 +40,13 @@ class PlayerSource { Iterable getCipherOperations() sync* { if (deciphererFuncBody == null) { throw FatalFailureException( - 'Could not find signature decipherer function body.'); + 'Could not find signature decipherer function body.', 0); } var definitionBody = _getDeciphererDefinitionBody(deciphererFuncBody!); if (definitionBody == null) { throw FatalFailureException( - 'Could not find signature decipherer definition body.'); + 'Could not find signature decipherer definition body.', 0); } for (final statement in deciphererFuncBody!.split(';')) { diff --git a/lib/src/search/search_channel.freezed.dart b/lib/src/search/search_channel.freezed.dart index 1a1fbc5..c406462 100644 --- a/lib/src/search/search_channel.freezed.dart +++ b/lib/src/search/search_channel.freezed.dart @@ -1,5 +1,6 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target part of 'search_channel.dart'; diff --git a/lib/src/search/search_playlist.freezed.dart b/lib/src/search/search_playlist.freezed.dart index 34a70b3..50faadf 100644 --- a/lib/src/search/search_playlist.freezed.dart +++ b/lib/src/search/search_playlist.freezed.dart @@ -1,5 +1,6 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target part of 'search_playlist.dart'; diff --git a/lib/src/search/search_video.freezed.dart b/lib/src/search/search_video.freezed.dart index cd41764..37bafdc 100644 --- a/lib/src/search/search_video.freezed.dart +++ b/lib/src/search/search_video.freezed.dart @@ -1,5 +1,6 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target part of 'search_video.dart'; diff --git a/lib/src/videos/closed_captions/closed_caption_track_info.freezed.dart b/lib/src/videos/closed_captions/closed_caption_track_info.freezed.dart index 25b1929..371f96f 100644 --- a/lib/src/videos/closed_captions/closed_caption_track_info.freezed.dart +++ b/lib/src/videos/closed_captions/closed_caption_track_info.freezed.dart @@ -1,5 +1,6 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target part of 'closed_caption_track_info.dart'; diff --git a/lib/src/videos/closed_captions/language.freezed.dart b/lib/src/videos/closed_captions/language.freezed.dart index 613614a..87ac353 100644 --- a/lib/src/videos/closed_captions/language.freezed.dart +++ b/lib/src/videos/closed_captions/language.freezed.dart @@ -1,5 +1,6 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target part of 'language.dart'; diff --git a/lib/src/videos/comments/comment.freezed.dart b/lib/src/videos/comments/comment.freezed.dart index 5d61ed0..050ce1c 100644 --- a/lib/src/videos/comments/comment.freezed.dart +++ b/lib/src/videos/comments/comment.freezed.dart @@ -1,5 +1,6 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target part of 'comment.dart'; diff --git a/lib/src/videos/streams/audio_only_stream_info.dart b/lib/src/videos/streams/audio_only_stream_info.dart index 7a5af7a..02181f8 100644 --- a/lib/src/videos/streams/audio_only_stream_info.dart +++ b/lib/src/videos/streams/audio_only_stream_info.dart @@ -56,5 +56,4 @@ class AudioOnlyStreamInfo with StreamInfo, AudioStreamInfo { _$AudioOnlyStreamInfoFromJson(json); Map toJson() => _$AudioOnlyStreamInfoToJson(this); - } diff --git a/lib/src/videos/streams/bitrate.freezed.dart b/lib/src/videos/streams/bitrate.freezed.dart index 040e90d..b98b8cf 100644 --- a/lib/src/videos/streams/bitrate.freezed.dart +++ b/lib/src/videos/streams/bitrate.freezed.dart @@ -1,5 +1,6 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target part of 'bitrate.dart'; diff --git a/lib/src/videos/streams/filesize.freezed.dart b/lib/src/videos/streams/filesize.freezed.dart index 83abe8d..1af1517 100644 --- a/lib/src/videos/streams/filesize.freezed.dart +++ b/lib/src/videos/streams/filesize.freezed.dart @@ -1,5 +1,6 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target part of 'filesize.dart'; diff --git a/lib/src/videos/streams/framerate.freezed.dart b/lib/src/videos/streams/framerate.freezed.dart index 125a16f..5e544b4 100644 --- a/lib/src/videos/streams/framerate.freezed.dart +++ b/lib/src/videos/streams/framerate.freezed.dart @@ -1,5 +1,6 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target part of 'framerate.dart'; diff --git a/lib/src/videos/streams/muxed_stream_info.dart b/lib/src/videos/streams/muxed_stream_info.dart index 1635eb5..63f6b3c 100644 --- a/lib/src/videos/streams/muxed_stream_info.dart +++ b/lib/src/videos/streams/muxed_stream_info.dart @@ -91,4 +91,4 @@ class MuxedStreamInfo with StreamInfo, AudioStreamInfo, VideoStreamInfo { _$MuxedStreamInfoFromJson(json); Map toJson() => _$MuxedStreamInfoToJson(this); -} \ No newline at end of file +} diff --git a/lib/src/videos/streams/stream_container.freezed.dart b/lib/src/videos/streams/stream_container.freezed.dart index 23c6546..01a958f 100644 --- a/lib/src/videos/streams/stream_container.freezed.dart +++ b/lib/src/videos/streams/stream_container.freezed.dart @@ -1,5 +1,6 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target part of 'stream_container.dart'; diff --git a/lib/src/videos/streams/stream_info.dart b/lib/src/videos/streams/stream_info.dart index db43368..522adb1 100644 --- a/lib/src/videos/streams/stream_info.dart +++ b/lib/src/videos/streams/stream_info.dart @@ -101,4 +101,3 @@ class _Column { String mediaTypeTojson(MediaType value) => value.toString(); MediaType mediaTypeFromJson(String value) => MediaType.parse(value); - diff --git a/lib/src/videos/streams/video_only_stream_info.dart b/lib/src/videos/streams/video_only_stream_info.dart index 03b725a..d909f26 100644 --- a/lib/src/videos/streams/video_only_stream_info.dart +++ b/lib/src/videos/streams/video_only_stream_info.dart @@ -78,6 +78,4 @@ class VideoOnlyStreamInfo with StreamInfo, VideoStreamInfo { _$VideoOnlyStreamInfoFromJson(json); Map toJson() => _$VideoOnlyStreamInfoToJson(this); - - } diff --git a/lib/src/videos/video.freezed.dart b/lib/src/videos/video.freezed.dart index 6a70e3f..0c65bf8 100644 --- a/lib/src/videos/video.freezed.dart +++ b/lib/src/videos/video.freezed.dart @@ -1,5 +1,6 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target part of 'video.dart'; diff --git a/lib/src/videos/video_id.freezed.dart b/lib/src/videos/video_id.freezed.dart index d7a53a5..6ec785c 100644 --- a/lib/src/videos/video_id.freezed.dart +++ b/lib/src/videos/video_id.freezed.dart @@ -1,5 +1,6 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target part of 'video_id.dart'; From fce17affdd26be5bdaea98d4441d7bb9c9d2a72c Mon Sep 17 00:00:00 2001 From: Mattia Date: Tue, 1 Feb 2022 00:56:33 +0100 Subject: [PATCH 4/4] Remove tools --- pubspec.yaml | 1 - tool/analysis_options.yaml | 2 -- tool/grind.dart | 21 --------------------- 3 files changed, 24 deletions(-) delete mode 100644 tool/analysis_options.yaml delete mode 100644 tool/grind.dart diff --git a/pubspec.yaml b/pubspec.yaml index e72c10f..d125732 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -21,7 +21,6 @@ dev_dependencies: build_runner: ^2.1.5 console: ^4.1.0 freezed: ^1.1.0 - grinder: ^0.9.0 json_serializable: ^6.1.1 lint: ^1.8.1 test: ^1.19.5 diff --git a/tool/analysis_options.yaml b/tool/analysis_options.yaml deleted file mode 100644 index 22604fe..0000000 --- a/tool/analysis_options.yaml +++ /dev/null @@ -1,2 +0,0 @@ -# Analysis options to run test for ginder -include: package:pedantic/analysis_options.yaml diff --git a/tool/grind.dart b/tool/grind.dart deleted file mode 100644 index e5062de..0000000 --- a/tool/grind.dart +++ /dev/null @@ -1,21 +0,0 @@ -import 'package:grinder/grinder.dart'; - -final pub = sdkBin('pub'); -void main(List args) => grind(args); - -@Task('Run tests') -void test() => TestRunner().testAsync(); - -@Task('Dart analysis') -void analysis() {} - -@DefaultTask() -@Depends(test) -void build() { - Pub.build(); - Pub.upgrade(); - Pub.version(); -} - -@Task() -void clean() => defaultClean();