Fix #168 + Fix for youtube.com/c/X channels.
This commit is contained in:
parent
6dad4d6776
commit
e114785ffd
|
@ -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
|
## 1.10.9
|
||||||
- Fix issue #180: YouTube throttling videos. - Thanks to @itssidhere.
|
- Fix issue #180: YouTube throttling videos. - Thanks to @itssidhere.
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,9 @@ class Channel with _$Channel {
|
||||||
/// URL of the channel's logo image.
|
/// URL of the channel's logo image.
|
||||||
String logoUrl,
|
String logoUrl,
|
||||||
|
|
||||||
|
/// URL of the channel's banner image.
|
||||||
|
String bannerUrl,
|
||||||
|
|
||||||
/// The (approximate) channel subscriber's count.
|
/// The (approximate) channel subscriber's count.
|
||||||
int? subscribersCount,
|
int? subscribersCount,
|
||||||
) = _Channel;
|
) = _Channel;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// 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
|
// 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';
|
part of 'channel.dart';
|
||||||
|
@ -17,12 +18,13 @@ final _privateConstructorUsedError = UnsupportedError(
|
||||||
class _$ChannelTearOff {
|
class _$ChannelTearOff {
|
||||||
const _$ChannelTearOff();
|
const _$ChannelTearOff();
|
||||||
|
|
||||||
_Channel call(
|
_Channel call(ChannelId id, String title, String logoUrl, String bannerUrl,
|
||||||
ChannelId id, String title, String logoUrl, int? subscribersCount) {
|
int? subscribersCount) {
|
||||||
return _Channel(
|
return _Channel(
|
||||||
id,
|
id,
|
||||||
title,
|
title,
|
||||||
logoUrl,
|
logoUrl,
|
||||||
|
bannerUrl,
|
||||||
subscribersCount,
|
subscribersCount,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -42,6 +44,9 @@ mixin _$Channel {
|
||||||
/// URL of the channel's logo image.
|
/// URL of the channel's logo image.
|
||||||
String get logoUrl => throw _privateConstructorUsedError;
|
String get logoUrl => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
/// URL of the channel's banner image.
|
||||||
|
String get bannerUrl => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
/// The (approximate) channel subscriber's count.
|
/// The (approximate) channel subscriber's count.
|
||||||
int? get subscribersCount => throw _privateConstructorUsedError;
|
int? get subscribersCount => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
@ -54,7 +59,11 @@ abstract class $ChannelCopyWith<$Res> {
|
||||||
factory $ChannelCopyWith(Channel value, $Res Function(Channel) then) =
|
factory $ChannelCopyWith(Channel value, $Res Function(Channel) then) =
|
||||||
_$ChannelCopyWithImpl<$Res>;
|
_$ChannelCopyWithImpl<$Res>;
|
||||||
$Res call(
|
$Res call(
|
||||||
{ChannelId id, String title, String logoUrl, int? subscribersCount});
|
{ChannelId id,
|
||||||
|
String title,
|
||||||
|
String logoUrl,
|
||||||
|
String bannerUrl,
|
||||||
|
int? subscribersCount});
|
||||||
|
|
||||||
$ChannelIdCopyWith<$Res> get id;
|
$ChannelIdCopyWith<$Res> get id;
|
||||||
}
|
}
|
||||||
|
@ -72,6 +81,7 @@ class _$ChannelCopyWithImpl<$Res> implements $ChannelCopyWith<$Res> {
|
||||||
Object? id = freezed,
|
Object? id = freezed,
|
||||||
Object? title = freezed,
|
Object? title = freezed,
|
||||||
Object? logoUrl = freezed,
|
Object? logoUrl = freezed,
|
||||||
|
Object? bannerUrl = freezed,
|
||||||
Object? subscribersCount = freezed,
|
Object? subscribersCount = freezed,
|
||||||
}) {
|
}) {
|
||||||
return _then(_value.copyWith(
|
return _then(_value.copyWith(
|
||||||
|
@ -87,6 +97,10 @@ class _$ChannelCopyWithImpl<$Res> implements $ChannelCopyWith<$Res> {
|
||||||
? _value.logoUrl
|
? _value.logoUrl
|
||||||
: logoUrl // ignore: cast_nullable_to_non_nullable
|
: logoUrl // ignore: cast_nullable_to_non_nullable
|
||||||
as String,
|
as String,
|
||||||
|
bannerUrl: bannerUrl == freezed
|
||||||
|
? _value.bannerUrl
|
||||||
|
: bannerUrl // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,
|
||||||
subscribersCount: subscribersCount == freezed
|
subscribersCount: subscribersCount == freezed
|
||||||
? _value.subscribersCount
|
? _value.subscribersCount
|
||||||
: subscribersCount // ignore: cast_nullable_to_non_nullable
|
: subscribersCount // ignore: cast_nullable_to_non_nullable
|
||||||
|
@ -108,7 +122,11 @@ abstract class _$ChannelCopyWith<$Res> implements $ChannelCopyWith<$Res> {
|
||||||
__$ChannelCopyWithImpl<$Res>;
|
__$ChannelCopyWithImpl<$Res>;
|
||||||
@override
|
@override
|
||||||
$Res call(
|
$Res call(
|
||||||
{ChannelId id, String title, String logoUrl, int? subscribersCount});
|
{ChannelId id,
|
||||||
|
String title,
|
||||||
|
String logoUrl,
|
||||||
|
String bannerUrl,
|
||||||
|
int? subscribersCount});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
$ChannelIdCopyWith<$Res> get id;
|
$ChannelIdCopyWith<$Res> get id;
|
||||||
|
@ -128,6 +146,7 @@ class __$ChannelCopyWithImpl<$Res> extends _$ChannelCopyWithImpl<$Res>
|
||||||
Object? id = freezed,
|
Object? id = freezed,
|
||||||
Object? title = freezed,
|
Object? title = freezed,
|
||||||
Object? logoUrl = freezed,
|
Object? logoUrl = freezed,
|
||||||
|
Object? bannerUrl = freezed,
|
||||||
Object? subscribersCount = freezed,
|
Object? subscribersCount = freezed,
|
||||||
}) {
|
}) {
|
||||||
return _then(_Channel(
|
return _then(_Channel(
|
||||||
|
@ -143,6 +162,10 @@ class __$ChannelCopyWithImpl<$Res> extends _$ChannelCopyWithImpl<$Res>
|
||||||
? _value.logoUrl
|
? _value.logoUrl
|
||||||
: logoUrl // ignore: cast_nullable_to_non_nullable
|
: logoUrl // ignore: cast_nullable_to_non_nullable
|
||||||
as String,
|
as String,
|
||||||
|
bannerUrl == freezed
|
||||||
|
? _value.bannerUrl
|
||||||
|
: bannerUrl // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,
|
||||||
subscribersCount == freezed
|
subscribersCount == freezed
|
||||||
? _value.subscribersCount
|
? _value.subscribersCount
|
||||||
: subscribersCount // ignore: cast_nullable_to_non_nullable
|
: subscribersCount // ignore: cast_nullable_to_non_nullable
|
||||||
|
@ -154,7 +177,8 @@ class __$ChannelCopyWithImpl<$Res> extends _$ChannelCopyWithImpl<$Res>
|
||||||
/// @nodoc
|
/// @nodoc
|
||||||
|
|
||||||
class _$_Channel extends _Channel {
|
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._();
|
: super._();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -171,12 +195,16 @@ class _$_Channel extends _Channel {
|
||||||
final String logoUrl;
|
final String logoUrl;
|
||||||
@override
|
@override
|
||||||
|
|
||||||
|
/// URL of the channel's banner image.
|
||||||
|
final String bannerUrl;
|
||||||
|
@override
|
||||||
|
|
||||||
/// The (approximate) channel subscriber's count.
|
/// The (approximate) channel subscriber's count.
|
||||||
final int? subscribersCount;
|
final int? subscribersCount;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
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
|
@override
|
||||||
|
@ -187,6 +215,7 @@ class _$_Channel extends _Channel {
|
||||||
const DeepCollectionEquality().equals(other.id, id) &&
|
const DeepCollectionEquality().equals(other.id, id) &&
|
||||||
const DeepCollectionEquality().equals(other.title, title) &&
|
const DeepCollectionEquality().equals(other.title, title) &&
|
||||||
const DeepCollectionEquality().equals(other.logoUrl, logoUrl) &&
|
const DeepCollectionEquality().equals(other.logoUrl, logoUrl) &&
|
||||||
|
const DeepCollectionEquality().equals(other.bannerUrl, bannerUrl) &&
|
||||||
const DeepCollectionEquality()
|
const DeepCollectionEquality()
|
||||||
.equals(other.subscribersCount, subscribersCount));
|
.equals(other.subscribersCount, subscribersCount));
|
||||||
}
|
}
|
||||||
|
@ -197,6 +226,7 @@ class _$_Channel extends _Channel {
|
||||||
const DeepCollectionEquality().hash(id),
|
const DeepCollectionEquality().hash(id),
|
||||||
const DeepCollectionEquality().hash(title),
|
const DeepCollectionEquality().hash(title),
|
||||||
const DeepCollectionEquality().hash(logoUrl),
|
const DeepCollectionEquality().hash(logoUrl),
|
||||||
|
const DeepCollectionEquality().hash(bannerUrl),
|
||||||
const DeepCollectionEquality().hash(subscribersCount));
|
const DeepCollectionEquality().hash(subscribersCount));
|
||||||
|
|
||||||
@JsonKey(ignore: true)
|
@JsonKey(ignore: true)
|
||||||
|
@ -206,9 +236,8 @@ class _$_Channel extends _Channel {
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class _Channel extends Channel {
|
abstract class _Channel extends Channel {
|
||||||
const factory _Channel(
|
const factory _Channel(ChannelId id, String title, String logoUrl,
|
||||||
ChannelId id, String title, String logoUrl, int? subscribersCount) =
|
String bannerUrl, int? subscribersCount) = _$_Channel;
|
||||||
_$_Channel;
|
|
||||||
const _Channel._() : super._();
|
const _Channel._() : super._();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -225,6 +254,10 @@ abstract class _Channel extends Channel {
|
||||||
String get logoUrl;
|
String get logoUrl;
|
||||||
@override
|
@override
|
||||||
|
|
||||||
|
/// URL of the channel's banner image.
|
||||||
|
String get bannerUrl;
|
||||||
|
@override
|
||||||
|
|
||||||
/// The (approximate) channel subscriber's count.
|
/// The (approximate) channel subscriber's count.
|
||||||
int? get subscribersCount;
|
int? get subscribersCount;
|
||||||
@override
|
@override
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// 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
|
// 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';
|
part of 'channel_about.dart';
|
||||||
|
|
|
@ -30,7 +30,7 @@ class ChannelClient {
|
||||||
var channelPage = await ChannelPage.get(_httpClient, id.value);
|
var channelPage = await ChannelPage.get(_httpClient, id.value);
|
||||||
|
|
||||||
return Channel(id, channelPage.channelTitle, channelPage.channelLogoUrl,
|
return Channel(id, channelPage.channelTitle, channelPage.channelLogoUrl,
|
||||||
channelPage.subscribersCount);
|
channelPage.channelBannerUrl, channelPage.subscribersCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Gets the metadata associated with the channel of the specified user.
|
/// Gets the metadata associated with the channel of the specified user.
|
||||||
|
@ -41,8 +41,12 @@ class ChannelClient {
|
||||||
|
|
||||||
var channelPage =
|
var channelPage =
|
||||||
await ChannelPage.getByUsername(_httpClient, username.value);
|
await ChannelPage.getByUsername(_httpClient, username.value);
|
||||||
return Channel(ChannelId(channelPage.channelId), channelPage.channelTitle,
|
return Channel(
|
||||||
channelPage.channelLogoUrl, channelPage.subscribersCount);
|
ChannelId(channelPage.channelId),
|
||||||
|
channelPage.channelTitle,
|
||||||
|
channelPage.channelLogoUrl,
|
||||||
|
channelPage.channelBannerUrl,
|
||||||
|
channelPage.subscribersCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Gets the info found on a YouTube Channel About page.
|
/// Gets the info found on a YouTube Channel About page.
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// 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
|
// 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';
|
part of 'channel_id.dart';
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// 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
|
// 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';
|
part of 'channel_link.dart';
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// 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
|
// 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';
|
part of 'channel_video.dart';
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// 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
|
// 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';
|
part of 'username.dart';
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// 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
|
// 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';
|
part of 'engagement.dart';
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// 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
|
// 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';
|
part of 'thumbnail.dart';
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// 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
|
// 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';
|
part of 'thumbnail_set.dart';
|
||||||
|
|
|
@ -4,11 +4,15 @@ import 'youtube_explode_exception.dart';
|
||||||
|
|
||||||
/// Exception thrown when a fatal failure occurs.
|
/// Exception thrown when a fatal failure occurs.
|
||||||
class FatalFailureException extends YoutubeExplodeException {
|
class FatalFailureException extends YoutubeExplodeException {
|
||||||
|
final int statusCode;
|
||||||
|
|
||||||
/// Initializes an instance of [FatalFailureException]
|
/// 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]
|
/// 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.
|
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.
|
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.
|
If this issue persists, please report it on the project's GitHub page.
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// 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
|
// 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';
|
part of 'playlist.dart';
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// 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
|
// 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';
|
part of 'playlist_id.dart';
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import 'package:html/parser.dart' as parser;
|
import 'package:html/parser.dart' as parser;
|
||||||
|
import 'package:http/http.dart';
|
||||||
|
|
||||||
import '../../exceptions/exceptions.dart';
|
import '../../exceptions/exceptions.dart';
|
||||||
import '../../extensions/helpers_extension.dart';
|
import '../../extensions/helpers_extension.dart';
|
||||||
|
@ -30,6 +31,8 @@ class ChannelPage extends YoutubePage<_InitialData> {
|
||||||
root!.querySelector('meta[property="og:image"]')?.attributes['content'] ??
|
root!.querySelector('meta[property="og:image"]')?.attributes['content'] ??
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
String get channelBannerUrl => initialData.bannerUrl ?? '';
|
||||||
|
|
||||||
int? get subscribersCount => initialData.subscribersCount;
|
int? get subscribersCount => initialData.subscribersCount;
|
||||||
|
|
||||||
///
|
///
|
||||||
|
@ -57,13 +60,21 @@ class ChannelPage extends YoutubePage<_InitialData> {
|
||||||
var url = 'https://www.youtube.com/user/$username?hl=en';
|
var url = 'https://www.youtube.com/user/$username?hl=en';
|
||||||
|
|
||||||
return retry(httpClient, () async {
|
return retry(httpClient, () async {
|
||||||
var raw = await httpClient.getString(url);
|
try {
|
||||||
var result = ChannelPage.parse(raw);
|
var raw = await httpClient.getString(url);
|
||||||
|
var result = ChannelPage.parse(raw);
|
||||||
|
|
||||||
if (!result.isOk) {
|
if (!result.isOk) {
|
||||||
throw TransientFailureException('Channel page is broken');
|
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();
|
return (count * multiplier).toInt();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String? get bannerUrl => root
|
||||||
|
.get('header')
|
||||||
|
?.get('c4TabbedHeaderRenderer')
|
||||||
|
?.get('banner')
|
||||||
|
?.getList('thumbnails')
|
||||||
|
?.first
|
||||||
|
.getT<String>('url');
|
||||||
}
|
}
|
||||||
|
|
|
@ -99,7 +99,7 @@ class _InitialData extends InitialData {
|
||||||
?.cast<JsonMap>();
|
?.cast<JsonMap>();
|
||||||
}
|
}
|
||||||
if (context == null) {
|
if (context == null) {
|
||||||
throw FatalFailureException('Failed to get initial data context.');
|
throw FatalFailureException('Failed to get initial data context.', 0);
|
||||||
}
|
}
|
||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
|
|
|
@ -217,11 +217,12 @@ class _InitialData extends InitialData {
|
||||||
renderer.get('descriptionSnippet')?.getList('runs')?.parseRuns() ??
|
renderer.get('descriptionSnippet')?.getList('runs')?.parseRuns() ??
|
||||||
'',
|
'',
|
||||||
renderer
|
renderer
|
||||||
.get('videoCountText')
|
.get('videoCountText')
|
||||||
?.getList('runs')
|
?.getList('runs')
|
||||||
?.first
|
?.first
|
||||||
.getT<String>('text')
|
.getT<String>('text')
|
||||||
?.parseInt() ?? -1);
|
?.parseInt() ??
|
||||||
|
-1);
|
||||||
}
|
}
|
||||||
// Here ignore 'horizontalCardListRenderer' & 'shelfRenderer'
|
// Here ignore 'horizontalCardListRenderer' & 'shelfRenderer'
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -31,7 +31,7 @@ class PlayerSource {
|
||||||
.stringMatch(root)
|
.stringMatch(root)
|
||||||
?.nullIfWhitespace;
|
?.nullIfWhitespace;
|
||||||
if (val == null) {
|
if (val == null) {
|
||||||
throw FatalFailureException('Could not find sts in player source.');
|
throw FatalFailureException('Could not find sts in player source.', 0);
|
||||||
}
|
}
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
@ -40,13 +40,13 @@ class PlayerSource {
|
||||||
Iterable<CipherOperation> getCipherOperations() sync* {
|
Iterable<CipherOperation> getCipherOperations() sync* {
|
||||||
if (deciphererFuncBody == null) {
|
if (deciphererFuncBody == null) {
|
||||||
throw FatalFailureException(
|
throw FatalFailureException(
|
||||||
'Could not find signature decipherer function body.');
|
'Could not find signature decipherer function body.', 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
var definitionBody = _getDeciphererDefinitionBody(deciphererFuncBody!);
|
var definitionBody = _getDeciphererDefinitionBody(deciphererFuncBody!);
|
||||||
if (definitionBody == null) {
|
if (definitionBody == null) {
|
||||||
throw FatalFailureException(
|
throw FatalFailureException(
|
||||||
'Could not find signature decipherer definition body.');
|
'Could not find signature decipherer definition body.', 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (final statement in deciphererFuncBody!.split(';')) {
|
for (final statement in deciphererFuncBody!.split(';')) {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// 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
|
// 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';
|
part of 'search_channel.dart';
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// 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
|
// 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';
|
part of 'search_playlist.dart';
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// 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
|
// 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';
|
part of 'search_video.dart';
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// 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
|
// 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';
|
part of 'closed_caption_track_info.dart';
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// 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
|
// 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';
|
part of 'language.dart';
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// 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
|
// 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';
|
part of 'comment.dart';
|
||||||
|
|
|
@ -56,5 +56,4 @@ class AudioOnlyStreamInfo with StreamInfo, AudioStreamInfo {
|
||||||
_$AudioOnlyStreamInfoFromJson(json);
|
_$AudioOnlyStreamInfoFromJson(json);
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => _$AudioOnlyStreamInfoToJson(this);
|
Map<String, dynamic> toJson() => _$AudioOnlyStreamInfoToJson(this);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// 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
|
// 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';
|
part of 'bitrate.dart';
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// 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
|
// 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';
|
part of 'filesize.dart';
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// 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
|
// 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';
|
part of 'framerate.dart';
|
||||||
|
|
|
@ -91,4 +91,4 @@ class MuxedStreamInfo with StreamInfo, AudioStreamInfo, VideoStreamInfo {
|
||||||
_$MuxedStreamInfoFromJson(json);
|
_$MuxedStreamInfoFromJson(json);
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => _$MuxedStreamInfoToJson(this);
|
Map<String, dynamic> toJson() => _$MuxedStreamInfoToJson(this);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// 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
|
// 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';
|
part of 'stream_container.dart';
|
||||||
|
|
|
@ -101,4 +101,3 @@ class _Column {
|
||||||
|
|
||||||
String mediaTypeTojson(MediaType value) => value.toString();
|
String mediaTypeTojson(MediaType value) => value.toString();
|
||||||
MediaType mediaTypeFromJson(String value) => MediaType.parse(value);
|
MediaType mediaTypeFromJson(String value) => MediaType.parse(value);
|
||||||
|
|
||||||
|
|
|
@ -78,6 +78,4 @@ class VideoOnlyStreamInfo with StreamInfo, VideoStreamInfo {
|
||||||
_$VideoOnlyStreamInfoFromJson(json);
|
_$VideoOnlyStreamInfoFromJson(json);
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => _$VideoOnlyStreamInfoToJson(this);
|
Map<String, dynamic> toJson() => _$VideoOnlyStreamInfoToJson(this);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// 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
|
// 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';
|
part of 'video.dart';
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// 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
|
// 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';
|
part of 'video_id.dart';
|
||||||
|
|
Loading…
Reference in New Issue