diff --git a/analysis_options.yaml b/analysis_options.yaml index bfe6588..ccf30a1 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -11,3 +11,4 @@ linter: parameter_assignments: false no_runtimetype_tostring: false avoid_escaping_inner_quotes: false + prefer_const_constructors: true diff --git a/lib/src/channels/channel.dart b/lib/src/channels/channel.dart index ef654f6..2d301a9 100644 --- a/lib/src/channels/channel.dart +++ b/lib/src/channels/channel.dart @@ -1,30 +1,28 @@ -import 'package:equatable/equatable.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; import 'channel_id.dart'; +part 'channel.freezed.dart'; + /// YouTube channel metadata. -class Channel with EquatableMixin { - /// Channel ID. - final ChannelId id; +@Freezed() +class Channel with _$Channel { + const Channel._(); + + const factory Channel( + /// Channel ID. + ChannelId id, + + /// Channel title. + String title, + + /// URL of the channel's logo image. + String logoUrl, + + /// The (approximate) channel subscriber's count. + int? subscribersCount, + ) = _Channel; /// Channel URL. String get url => 'https://www.youtube.com/channel/$id'; - - /// Channel title. - final String title; - - /// URL of the channel's logo image. - final String logoUrl; - - /// The (approximate) channel subscriber's count. - final int? subscribersCount; - - /// Initializes an instance of [Channel] - Channel(this.id, this.title, this.logoUrl, this.subscribersCount); - - @override - String toString() => 'Channel ($title)'; - - @override - List get props => [id]; } diff --git a/lib/src/channels/channel.freezed.dart b/lib/src/channels/channel.freezed.dart new file mode 100644 index 0000000..dcdfec1 --- /dev/null +++ b/lib/src/channels/channel.freezed.dart @@ -0,0 +1,237 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// 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'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + +/// @nodoc +class _$ChannelTearOff { + const _$ChannelTearOff(); + + _Channel call( + ChannelId id, String title, String logoUrl, int? subscribersCount) { + return _Channel( + id, + title, + logoUrl, + subscribersCount, + ); + } +} + +/// @nodoc +const $Channel = _$ChannelTearOff(); + +/// @nodoc +mixin _$Channel { + /// Channel ID. + ChannelId get id => throw _privateConstructorUsedError; + + /// Channel title. + String get title => throw _privateConstructorUsedError; + + /// URL of the channel's logo image. + String get logoUrl => throw _privateConstructorUsedError; + + /// The (approximate) channel subscriber's count. + int? get subscribersCount => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $ChannelCopyWith get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ChannelCopyWith<$Res> { + factory $ChannelCopyWith(Channel value, $Res Function(Channel) then) = + _$ChannelCopyWithImpl<$Res>; + $Res call( + {ChannelId id, String title, String logoUrl, int? subscribersCount}); + + $ChannelIdCopyWith<$Res> get id; +} + +/// @nodoc +class _$ChannelCopyWithImpl<$Res> implements $ChannelCopyWith<$Res> { + _$ChannelCopyWithImpl(this._value, this._then); + + final Channel _value; + // ignore: unused_field + final $Res Function(Channel) _then; + + @override + $Res call({ + Object? id = freezed, + Object? title = freezed, + Object? logoUrl = freezed, + Object? subscribersCount = freezed, + }) { + return _then(_value.copyWith( + id: id == freezed + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as ChannelId, + title: title == freezed + ? _value.title + : title // ignore: cast_nullable_to_non_nullable + as String, + logoUrl: logoUrl == freezed + ? _value.logoUrl + : logoUrl // ignore: cast_nullable_to_non_nullable + as String, + subscribersCount: subscribersCount == freezed + ? _value.subscribersCount + : subscribersCount // ignore: cast_nullable_to_non_nullable + as int?, + )); + } + + @override + $ChannelIdCopyWith<$Res> get id { + return $ChannelIdCopyWith<$Res>(_value.id, (value) { + return _then(_value.copyWith(id: value)); + }); + } +} + +/// @nodoc +abstract class _$ChannelCopyWith<$Res> implements $ChannelCopyWith<$Res> { + factory _$ChannelCopyWith(_Channel value, $Res Function(_Channel) then) = + __$ChannelCopyWithImpl<$Res>; + @override + $Res call( + {ChannelId id, String title, String logoUrl, int? subscribersCount}); + + @override + $ChannelIdCopyWith<$Res> get id; +} + +/// @nodoc +class __$ChannelCopyWithImpl<$Res> extends _$ChannelCopyWithImpl<$Res> + implements _$ChannelCopyWith<$Res> { + __$ChannelCopyWithImpl(_Channel _value, $Res Function(_Channel) _then) + : super(_value, (v) => _then(v as _Channel)); + + @override + _Channel get _value => super._value as _Channel; + + @override + $Res call({ + Object? id = freezed, + Object? title = freezed, + Object? logoUrl = freezed, + Object? subscribersCount = freezed, + }) { + return _then(_Channel( + id == freezed + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as ChannelId, + title == freezed + ? _value.title + : title // ignore: cast_nullable_to_non_nullable + as String, + logoUrl == freezed + ? _value.logoUrl + : logoUrl // ignore: cast_nullable_to_non_nullable + as String, + subscribersCount == freezed + ? _value.subscribersCount + : subscribersCount // ignore: cast_nullable_to_non_nullable + as int?, + )); + } +} + +/// @nodoc + +class _$_Channel extends _Channel { + const _$_Channel(this.id, this.title, this.logoUrl, this.subscribersCount) + : super._(); + + @override + + /// Channel ID. + final ChannelId id; + @override + + /// Channel title. + final String title; + @override + + /// URL of the channel's logo image. + final String logoUrl; + @override + + /// The (approximate) channel subscriber's count. + final int? subscribersCount; + + @override + String toString() { + return 'Channel(id: $id, title: $title, logoUrl: $logoUrl, subscribersCount: $subscribersCount)'; + } + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other is _Channel && + (identical(other.id, id) || + const DeepCollectionEquality().equals(other.id, id)) && + (identical(other.title, title) || + const DeepCollectionEquality().equals(other.title, title)) && + (identical(other.logoUrl, logoUrl) || + const DeepCollectionEquality() + .equals(other.logoUrl, logoUrl)) && + (identical(other.subscribersCount, subscribersCount) || + const DeepCollectionEquality() + .equals(other.subscribersCount, subscribersCount))); + } + + @override + int get hashCode => + runtimeType.hashCode ^ + const DeepCollectionEquality().hash(id) ^ + const DeepCollectionEquality().hash(title) ^ + const DeepCollectionEquality().hash(logoUrl) ^ + const DeepCollectionEquality().hash(subscribersCount); + + @JsonKey(ignore: true) + @override + _$ChannelCopyWith<_Channel> get copyWith => + __$ChannelCopyWithImpl<_Channel>(this, _$identity); +} + +abstract class _Channel extends Channel { + const factory _Channel( + ChannelId id, String title, String logoUrl, int? subscribersCount) = + _$_Channel; + const _Channel._() : super._(); + + @override + + /// Channel ID. + ChannelId get id => throw _privateConstructorUsedError; + @override + + /// Channel title. + String get title => throw _privateConstructorUsedError; + @override + + /// URL of the channel's logo image. + String get logoUrl => throw _privateConstructorUsedError; + @override + + /// The (approximate) channel subscriber's count. + int? get subscribersCount => throw _privateConstructorUsedError; + @override + @JsonKey(ignore: true) + _$ChannelCopyWith<_Channel> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/channels/channel_about.dart b/lib/src/channels/channel_about.dart index 127f2ea..fab6e4c 100644 --- a/lib/src/channels/channel_about.dart +++ b/lib/src/channels/channel_about.dart @@ -1,37 +1,34 @@ -import 'package:equatable/equatable.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; import '../common/thumbnail.dart'; import 'channel_link.dart'; +part 'channel_about.freezed.dart'; + /// YouTube channel's about page metadata. -class ChannelAbout with EquatableMixin { - /// Full channel description. - final String description; +@freezed +class ChannelAbout with _$ChannelAbout { + const factory ChannelAbout( + /// Full channel description. + String description, - /// Channel view count. - final int viewCount; + /// Channel view count. + int viewCount, - /// Channel join date. - /// Formatted as: Gen 01, 2000 - final String joinDate; + /// Channel join date. + /// Formatted as: Gen 01, 2000 + String joinDate, - /// Channel title. - final String title; + /// Channel title. + String title, - /// Channel thumbnails. - final List thumbnails; + /// Channel thumbnails. + List thumbnails, - /// Channel country. - final String country; + /// Channel country. + String country, - /// Channel links. - final List channelLinks; - - /// Initialize an instance of [ChannelAbout] - ChannelAbout(this.description, this.viewCount, this.joinDate, this.title, - this.thumbnails, this.country, this.channelLinks); - - @override - List get props => - [description, viewCount, joinDate, title, thumbnails]; + /// Channel links. + List channelLinks, + ) = _ChannelAbout; } diff --git a/lib/src/channels/channel_about.freezed.dart b/lib/src/channels/channel_about.freezed.dart new file mode 100644 index 0000000..df05b24 --- /dev/null +++ b/lib/src/channels/channel_about.freezed.dart @@ -0,0 +1,334 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// 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'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + +/// @nodoc +class _$ChannelAboutTearOff { + const _$ChannelAboutTearOff(); + + _ChannelAbout call( + String description, + int viewCount, + String joinDate, + String title, + List thumbnails, + String country, + List channelLinks) { + return _ChannelAbout( + description, + viewCount, + joinDate, + title, + thumbnails, + country, + channelLinks, + ); + } +} + +/// @nodoc +const $ChannelAbout = _$ChannelAboutTearOff(); + +/// @nodoc +mixin _$ChannelAbout { + /// Full channel description. + String get description => throw _privateConstructorUsedError; + + /// Channel view count. + int get viewCount => throw _privateConstructorUsedError; + + /// Channel join date. + /// Formatted as: Gen 01, 2000 + String get joinDate => throw _privateConstructorUsedError; + + /// Channel title. + String get title => throw _privateConstructorUsedError; + + /// Channel thumbnails. + List get thumbnails => throw _privateConstructorUsedError; + + /// Channel country. + String get country => throw _privateConstructorUsedError; + + /// Channel links. + List get channelLinks => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $ChannelAboutCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ChannelAboutCopyWith<$Res> { + factory $ChannelAboutCopyWith( + ChannelAbout value, $Res Function(ChannelAbout) then) = + _$ChannelAboutCopyWithImpl<$Res>; + $Res call( + {String description, + int viewCount, + String joinDate, + String title, + List thumbnails, + String country, + List channelLinks}); +} + +/// @nodoc +class _$ChannelAboutCopyWithImpl<$Res> implements $ChannelAboutCopyWith<$Res> { + _$ChannelAboutCopyWithImpl(this._value, this._then); + + final ChannelAbout _value; + // ignore: unused_field + final $Res Function(ChannelAbout) _then; + + @override + $Res call({ + Object? description = freezed, + Object? viewCount = freezed, + Object? joinDate = freezed, + Object? title = freezed, + Object? thumbnails = freezed, + Object? country = freezed, + Object? channelLinks = freezed, + }) { + return _then(_value.copyWith( + description: description == freezed + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String, + viewCount: viewCount == freezed + ? _value.viewCount + : viewCount // ignore: cast_nullable_to_non_nullable + as int, + joinDate: joinDate == freezed + ? _value.joinDate + : joinDate // ignore: cast_nullable_to_non_nullable + as String, + title: title == freezed + ? _value.title + : title // ignore: cast_nullable_to_non_nullable + as String, + thumbnails: thumbnails == freezed + ? _value.thumbnails + : thumbnails // ignore: cast_nullable_to_non_nullable + as List, + country: country == freezed + ? _value.country + : country // ignore: cast_nullable_to_non_nullable + as String, + channelLinks: channelLinks == freezed + ? _value.channelLinks + : channelLinks // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc +abstract class _$ChannelAboutCopyWith<$Res> + implements $ChannelAboutCopyWith<$Res> { + factory _$ChannelAboutCopyWith( + _ChannelAbout value, $Res Function(_ChannelAbout) then) = + __$ChannelAboutCopyWithImpl<$Res>; + @override + $Res call( + {String description, + int viewCount, + String joinDate, + String title, + List thumbnails, + String country, + List channelLinks}); +} + +/// @nodoc +class __$ChannelAboutCopyWithImpl<$Res> extends _$ChannelAboutCopyWithImpl<$Res> + implements _$ChannelAboutCopyWith<$Res> { + __$ChannelAboutCopyWithImpl( + _ChannelAbout _value, $Res Function(_ChannelAbout) _then) + : super(_value, (v) => _then(v as _ChannelAbout)); + + @override + _ChannelAbout get _value => super._value as _ChannelAbout; + + @override + $Res call({ + Object? description = freezed, + Object? viewCount = freezed, + Object? joinDate = freezed, + Object? title = freezed, + Object? thumbnails = freezed, + Object? country = freezed, + Object? channelLinks = freezed, + }) { + return _then(_ChannelAbout( + description == freezed + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String, + viewCount == freezed + ? _value.viewCount + : viewCount // ignore: cast_nullable_to_non_nullable + as int, + joinDate == freezed + ? _value.joinDate + : joinDate // ignore: cast_nullable_to_non_nullable + as String, + title == freezed + ? _value.title + : title // ignore: cast_nullable_to_non_nullable + as String, + thumbnails == freezed + ? _value.thumbnails + : thumbnails // ignore: cast_nullable_to_non_nullable + as List, + country == freezed + ? _value.country + : country // ignore: cast_nullable_to_non_nullable + as String, + channelLinks == freezed + ? _value.channelLinks + : channelLinks // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc + +class _$_ChannelAbout implements _ChannelAbout { + const _$_ChannelAbout(this.description, this.viewCount, this.joinDate, + this.title, this.thumbnails, this.country, this.channelLinks); + + @override + + /// Full channel description. + final String description; + @override + + /// Channel view count. + final int viewCount; + @override + + /// Channel join date. + /// Formatted as: Gen 01, 2000 + final String joinDate; + @override + + /// Channel title. + final String title; + @override + + /// Channel thumbnails. + final List thumbnails; + @override + + /// Channel country. + final String country; + @override + + /// Channel links. + final List channelLinks; + + @override + String toString() { + return 'ChannelAbout(description: $description, viewCount: $viewCount, joinDate: $joinDate, title: $title, thumbnails: $thumbnails, country: $country, channelLinks: $channelLinks)'; + } + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other is _ChannelAbout && + (identical(other.description, description) || + const DeepCollectionEquality() + .equals(other.description, description)) && + (identical(other.viewCount, viewCount) || + const DeepCollectionEquality() + .equals(other.viewCount, viewCount)) && + (identical(other.joinDate, joinDate) || + const DeepCollectionEquality() + .equals(other.joinDate, joinDate)) && + (identical(other.title, title) || + const DeepCollectionEquality().equals(other.title, title)) && + (identical(other.thumbnails, thumbnails) || + const DeepCollectionEquality() + .equals(other.thumbnails, thumbnails)) && + (identical(other.country, country) || + const DeepCollectionEquality() + .equals(other.country, country)) && + (identical(other.channelLinks, channelLinks) || + const DeepCollectionEquality() + .equals(other.channelLinks, channelLinks))); + } + + @override + int get hashCode => + runtimeType.hashCode ^ + const DeepCollectionEquality().hash(description) ^ + const DeepCollectionEquality().hash(viewCount) ^ + const DeepCollectionEquality().hash(joinDate) ^ + const DeepCollectionEquality().hash(title) ^ + const DeepCollectionEquality().hash(thumbnails) ^ + const DeepCollectionEquality().hash(country) ^ + const DeepCollectionEquality().hash(channelLinks); + + @JsonKey(ignore: true) + @override + _$ChannelAboutCopyWith<_ChannelAbout> get copyWith => + __$ChannelAboutCopyWithImpl<_ChannelAbout>(this, _$identity); +} + +abstract class _ChannelAbout implements ChannelAbout { + const factory _ChannelAbout( + String description, + int viewCount, + String joinDate, + String title, + List thumbnails, + String country, + List channelLinks) = _$_ChannelAbout; + + @override + + /// Full channel description. + String get description => throw _privateConstructorUsedError; + @override + + /// Channel view count. + int get viewCount => throw _privateConstructorUsedError; + @override + + /// Channel join date. + /// Formatted as: Gen 01, 2000 + String get joinDate => throw _privateConstructorUsedError; + @override + + /// Channel title. + String get title => throw _privateConstructorUsedError; + @override + + /// Channel thumbnails. + List get thumbnails => throw _privateConstructorUsedError; + @override + + /// Channel country. + String get country => throw _privateConstructorUsedError; + @override + + /// Channel links. + List get channelLinks => throw _privateConstructorUsedError; + @override + @JsonKey(ignore: true) + _$ChannelAboutCopyWith<_ChannelAbout> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/channels/channel_client.dart b/lib/src/channels/channel_client.dart index 7fc8e66..e4c32d1 100644 --- a/lib/src/channels/channel_client.dart +++ b/lib/src/channels/channel_client.dart @@ -21,7 +21,7 @@ class ChannelClient { final YoutubeHttpClient _httpClient; /// Initializes an instance of [ChannelClient] - ChannelClient(this._httpClient); + const ChannelClient(this._httpClient); /// Gets the metadata associated with the specified channel. /// [id] must be either a [ChannelId] or a string diff --git a/lib/src/channels/channel_id.dart b/lib/src/channels/channel_id.dart index 933a069..913c72a 100644 --- a/lib/src/channels/channel_id.dart +++ b/lib/src/channels/channel_id.dart @@ -1,18 +1,41 @@ -import 'package:equatable/equatable.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; import '../extensions/helpers_extension.dart'; -/// Encapsulates a valid YouTube channel ID. -class ChannelId with EquatableMixin { - /// ID as a string. - final String value; +part 'channel_id.freezed.dart'; +/// Encapsulates a valid YouTube channel ID. +@freezed +class ChannelId with _$ChannelId { /// Initializes an instance of [ChannelId] - ChannelId(String value) : value = parseChannelId(value) ?? '' { + factory ChannelId(String value) { + final id = parseChannelId(value); + if (id == null) { + throw ArgumentError.value(value, 'value', 'Invalid channel id'); + } + return ChannelId._internal(id); + } + + const factory ChannelId._internal( + + /// ID as a string. + String value) = _ChannelId; + + const ChannelId._(); + + /// Converts [obj] to a [ChannelId] by calling .toString on that object. + /// If it is already a [ChannelId], [obj] is returned + factory ChannelId.fromString(dynamic obj) { + if (obj is ChannelId) { + return obj; + } + return ChannelId(obj.toString()); + } + +/* ChannelId(String value) : value = parseChannelId(value) ?? '' { if (this.value.isEmpty) { throw ArgumentError.value(value); - } - } + }*/ /// Returns true if the given id is a valid channel id. static bool validateChannelId(String id) { @@ -51,18 +74,6 @@ class ChannelId with EquatableMixin { return null; } - /// Converts [obj] to a [ChannelId] by calling .toString on that object. - /// If it is already a [ChannelId], [obj] is returned - factory ChannelId.fromString(dynamic obj) { - if (obj is ChannelId) { - return obj; - } - return ChannelId(obj.toString()); - } - @override String toString() => value; - - @override - List get props => [value]; } diff --git a/lib/src/channels/channel_id.freezed.dart b/lib/src/channels/channel_id.freezed.dart new file mode 100644 index 0000000..344c3d7 --- /dev/null +++ b/lib/src/channels/channel_id.freezed.dart @@ -0,0 +1,138 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// 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'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + +/// @nodoc +class _$ChannelIdTearOff { + const _$ChannelIdTearOff(); + + _ChannelId _internal(String value) { + return _ChannelId( + value, + ); + } +} + +/// @nodoc +const $ChannelId = _$ChannelIdTearOff(); + +/// @nodoc +mixin _$ChannelId { + /// ID as a string. + String get value => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $ChannelIdCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ChannelIdCopyWith<$Res> { + factory $ChannelIdCopyWith(ChannelId value, $Res Function(ChannelId) then) = + _$ChannelIdCopyWithImpl<$Res>; + $Res call({String value}); +} + +/// @nodoc +class _$ChannelIdCopyWithImpl<$Res> implements $ChannelIdCopyWith<$Res> { + _$ChannelIdCopyWithImpl(this._value, this._then); + + final ChannelId _value; + // ignore: unused_field + final $Res Function(ChannelId) _then; + + @override + $Res call({ + Object? value = freezed, + }) { + return _then(_value.copyWith( + value: value == freezed + ? _value.value + : value // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +abstract class _$ChannelIdCopyWith<$Res> implements $ChannelIdCopyWith<$Res> { + factory _$ChannelIdCopyWith( + _ChannelId value, $Res Function(_ChannelId) then) = + __$ChannelIdCopyWithImpl<$Res>; + @override + $Res call({String value}); +} + +/// @nodoc +class __$ChannelIdCopyWithImpl<$Res> extends _$ChannelIdCopyWithImpl<$Res> + implements _$ChannelIdCopyWith<$Res> { + __$ChannelIdCopyWithImpl(_ChannelId _value, $Res Function(_ChannelId) _then) + : super(_value, (v) => _then(v as _ChannelId)); + + @override + _ChannelId get _value => super._value as _ChannelId; + + @override + $Res call({ + Object? value = freezed, + }) { + return _then(_ChannelId( + value == freezed + ? _value.value + : value // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$_ChannelId extends _ChannelId { + const _$_ChannelId(this.value) : super._(); + + @override + + /// ID as a string. + final String value; + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other is _ChannelId && + (identical(other.value, value) || + const DeepCollectionEquality().equals(other.value, value))); + } + + @override + int get hashCode => + runtimeType.hashCode ^ const DeepCollectionEquality().hash(value); + + @JsonKey(ignore: true) + @override + _$ChannelIdCopyWith<_ChannelId> get copyWith => + __$ChannelIdCopyWithImpl<_ChannelId>(this, _$identity); +} + +abstract class _ChannelId extends ChannelId { + const factory _ChannelId(String value) = _$_ChannelId; + const _ChannelId._() : super._(); + + @override + + /// ID as a string. + String get value => throw _privateConstructorUsedError; + @override + @JsonKey(ignore: true) + _$ChannelIdCopyWith<_ChannelId> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/channels/channel_link.dart b/lib/src/channels/channel_link.dart index 85146eb..1dcd809 100644 --- a/lib/src/channels/channel_link.dart +++ b/lib/src/channels/channel_link.dart @@ -1,23 +1,20 @@ -import 'package:equatable/equatable.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'channel_link.freezed.dart'; /// Represents a channel link. -class ChannelLink with EquatableMixin { - /// Link title. - final String title; - - /// Link URL. - /// Already decoded with the YouTube shortener already taken out. - final Uri url; - - /// Link Icon URL. - final Uri icon; - +@freezed +class ChannelLink with _$ChannelLink { /// Initialize an instance of [ChannelLink] - ChannelLink(this.title, this.url, this.icon); + const factory ChannelLink( + /// Link title. + String title, - @override - List get props => [title, url, icon]; + /// Link URL. + /// Already decoded with the YouTube shortener already taken out. + Uri url, - @override - String toString() => 'Link: $title ($url): $icon'; + /// Link Icon URL. + Uri icon, + ) = _ChannelLink; } diff --git a/lib/src/channels/channel_link.freezed.dart b/lib/src/channels/channel_link.freezed.dart new file mode 100644 index 0000000..cd232a2 --- /dev/null +++ b/lib/src/channels/channel_link.freezed.dart @@ -0,0 +1,199 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// 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'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + +/// @nodoc +class _$ChannelLinkTearOff { + const _$ChannelLinkTearOff(); + + _ChannelLink call(String title, Uri url, Uri icon) { + return _ChannelLink( + title, + url, + icon, + ); + } +} + +/// @nodoc +const $ChannelLink = _$ChannelLinkTearOff(); + +/// @nodoc +mixin _$ChannelLink { + /// Link title. + String get title => throw _privateConstructorUsedError; + + /// Link URL. + /// Already decoded with the YouTube shortener already taken out. + Uri get url => throw _privateConstructorUsedError; + + /// Link Icon URL. + Uri get icon => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $ChannelLinkCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ChannelLinkCopyWith<$Res> { + factory $ChannelLinkCopyWith( + ChannelLink value, $Res Function(ChannelLink) then) = + _$ChannelLinkCopyWithImpl<$Res>; + $Res call({String title, Uri url, Uri icon}); +} + +/// @nodoc +class _$ChannelLinkCopyWithImpl<$Res> implements $ChannelLinkCopyWith<$Res> { + _$ChannelLinkCopyWithImpl(this._value, this._then); + + final ChannelLink _value; + // ignore: unused_field + final $Res Function(ChannelLink) _then; + + @override + $Res call({ + Object? title = freezed, + Object? url = freezed, + Object? icon = freezed, + }) { + return _then(_value.copyWith( + title: title == freezed + ? _value.title + : title // ignore: cast_nullable_to_non_nullable + as String, + url: url == freezed + ? _value.url + : url // ignore: cast_nullable_to_non_nullable + as Uri, + icon: icon == freezed + ? _value.icon + : icon // ignore: cast_nullable_to_non_nullable + as Uri, + )); + } +} + +/// @nodoc +abstract class _$ChannelLinkCopyWith<$Res> + implements $ChannelLinkCopyWith<$Res> { + factory _$ChannelLinkCopyWith( + _ChannelLink value, $Res Function(_ChannelLink) then) = + __$ChannelLinkCopyWithImpl<$Res>; + @override + $Res call({String title, Uri url, Uri icon}); +} + +/// @nodoc +class __$ChannelLinkCopyWithImpl<$Res> extends _$ChannelLinkCopyWithImpl<$Res> + implements _$ChannelLinkCopyWith<$Res> { + __$ChannelLinkCopyWithImpl( + _ChannelLink _value, $Res Function(_ChannelLink) _then) + : super(_value, (v) => _then(v as _ChannelLink)); + + @override + _ChannelLink get _value => super._value as _ChannelLink; + + @override + $Res call({ + Object? title = freezed, + Object? url = freezed, + Object? icon = freezed, + }) { + return _then(_ChannelLink( + title == freezed + ? _value.title + : title // ignore: cast_nullable_to_non_nullable + as String, + url == freezed + ? _value.url + : url // ignore: cast_nullable_to_non_nullable + as Uri, + icon == freezed + ? _value.icon + : icon // ignore: cast_nullable_to_non_nullable + as Uri, + )); + } +} + +/// @nodoc + +class _$_ChannelLink implements _ChannelLink { + const _$_ChannelLink(this.title, this.url, this.icon); + + @override + + /// Link title. + final String title; + @override + + /// Link URL. + /// Already decoded with the YouTube shortener already taken out. + final Uri url; + @override + + /// Link Icon URL. + final Uri icon; + + @override + String toString() { + return 'ChannelLink(title: $title, url: $url, icon: $icon)'; + } + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other is _ChannelLink && + (identical(other.title, title) || + const DeepCollectionEquality().equals(other.title, title)) && + (identical(other.url, url) || + const DeepCollectionEquality().equals(other.url, url)) && + (identical(other.icon, icon) || + const DeepCollectionEquality().equals(other.icon, icon))); + } + + @override + int get hashCode => + runtimeType.hashCode ^ + const DeepCollectionEquality().hash(title) ^ + const DeepCollectionEquality().hash(url) ^ + const DeepCollectionEquality().hash(icon); + + @JsonKey(ignore: true) + @override + _$ChannelLinkCopyWith<_ChannelLink> get copyWith => + __$ChannelLinkCopyWithImpl<_ChannelLink>(this, _$identity); +} + +abstract class _ChannelLink implements ChannelLink { + const factory _ChannelLink(String title, Uri url, Uri icon) = _$_ChannelLink; + + @override + + /// Link title. + String get title => throw _privateConstructorUsedError; + @override + + /// Link URL. + /// Already decoded with the YouTube shortener already taken out. + Uri get url => throw _privateConstructorUsedError; + @override + + /// Link Icon URL. + Uri get icon => throw _privateConstructorUsedError; + @override + @JsonKey(ignore: true) + _$ChannelLinkCopyWith<_ChannelLink> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/channels/channel_video.dart b/lib/src/channels/channel_video.dart index fe6f364..1873e0e 100644 --- a/lib/src/channels/channel_video.dart +++ b/lib/src/channels/channel_video.dart @@ -1,35 +1,30 @@ -import 'package:equatable/equatable.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; import '../videos/video_id.dart'; +part 'channel_video.freezed.dart'; + /// Metadata related to a search query result (playlist) -class ChannelVideo with EquatableMixin { - /// Video ID. - final VideoId videoId; +@freezed +class ChannelVideo with _$ChannelVideo { + const factory ChannelVideo( + /// Video ID. + VideoId videoId, - /// Video title. - final String videoTitle; + /// Video title. + String videoTitle, - /// Video duration - final Duration videoDuration; + /// Video duration + Duration videoDuration, - /// Video thumbnail - final String videoThumbnail; + /// Video thumbnail + String videoThumbnail, - /// Video upload date. - /// Formatted like 10 hours ago - final String videoUploadDate; + /// Video upload date. + /// Formatted like 10 hours ago + String videoUploadDate, - /// Video view count. - final int videoViews; - - /// Initialize an instance of [ChannelVideo] - ChannelVideo(this.videoId, this.videoTitle, this.videoDuration, - this.videoThumbnail, this.videoUploadDate, this.videoViews); - - @override - String toString() => '[ChannelVideo] $videoTitle ($videoId)'; - - @override - List get props => [videoId]; + /// Video view count. + int videoViews, + ) = _ChannelVideo; } diff --git a/lib/src/channels/channel_video.freezed.dart b/lib/src/channels/channel_video.freezed.dart new file mode 100644 index 0000000..46d3572 --- /dev/null +++ b/lib/src/channels/channel_video.freezed.dart @@ -0,0 +1,312 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// 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'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + +/// @nodoc +class _$ChannelVideoTearOff { + const _$ChannelVideoTearOff(); + + _ChannelVideo call(VideoId videoId, String videoTitle, Duration videoDuration, + String videoThumbnail, String videoUploadDate, int videoViews) { + return _ChannelVideo( + videoId, + videoTitle, + videoDuration, + videoThumbnail, + videoUploadDate, + videoViews, + ); + } +} + +/// @nodoc +const $ChannelVideo = _$ChannelVideoTearOff(); + +/// @nodoc +mixin _$ChannelVideo { + /// Video ID. + VideoId get videoId => throw _privateConstructorUsedError; + + /// Video title. + String get videoTitle => throw _privateConstructorUsedError; + + /// Video duration + Duration get videoDuration => throw _privateConstructorUsedError; + + /// Video thumbnail + String get videoThumbnail => throw _privateConstructorUsedError; + + /// Video upload date. + /// Formatted like 10 hours ago + String get videoUploadDate => throw _privateConstructorUsedError; + + /// Video view count. + int get videoViews => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $ChannelVideoCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ChannelVideoCopyWith<$Res> { + factory $ChannelVideoCopyWith( + ChannelVideo value, $Res Function(ChannelVideo) then) = + _$ChannelVideoCopyWithImpl<$Res>; + $Res call( + {VideoId videoId, + String videoTitle, + Duration videoDuration, + String videoThumbnail, + String videoUploadDate, + int videoViews}); + + $VideoIdCopyWith<$Res> get videoId; +} + +/// @nodoc +class _$ChannelVideoCopyWithImpl<$Res> implements $ChannelVideoCopyWith<$Res> { + _$ChannelVideoCopyWithImpl(this._value, this._then); + + final ChannelVideo _value; + // ignore: unused_field + final $Res Function(ChannelVideo) _then; + + @override + $Res call({ + Object? videoId = freezed, + Object? videoTitle = freezed, + Object? videoDuration = freezed, + Object? videoThumbnail = freezed, + Object? videoUploadDate = freezed, + Object? videoViews = freezed, + }) { + return _then(_value.copyWith( + videoId: videoId == freezed + ? _value.videoId + : videoId // ignore: cast_nullable_to_non_nullable + as VideoId, + videoTitle: videoTitle == freezed + ? _value.videoTitle + : videoTitle // ignore: cast_nullable_to_non_nullable + as String, + videoDuration: videoDuration == freezed + ? _value.videoDuration + : videoDuration // ignore: cast_nullable_to_non_nullable + as Duration, + videoThumbnail: videoThumbnail == freezed + ? _value.videoThumbnail + : videoThumbnail // ignore: cast_nullable_to_non_nullable + as String, + videoUploadDate: videoUploadDate == freezed + ? _value.videoUploadDate + : videoUploadDate // ignore: cast_nullable_to_non_nullable + as String, + videoViews: videoViews == freezed + ? _value.videoViews + : videoViews // ignore: cast_nullable_to_non_nullable + as int, + )); + } + + @override + $VideoIdCopyWith<$Res> get videoId { + return $VideoIdCopyWith<$Res>(_value.videoId, (value) { + return _then(_value.copyWith(videoId: value)); + }); + } +} + +/// @nodoc +abstract class _$ChannelVideoCopyWith<$Res> + implements $ChannelVideoCopyWith<$Res> { + factory _$ChannelVideoCopyWith( + _ChannelVideo value, $Res Function(_ChannelVideo) then) = + __$ChannelVideoCopyWithImpl<$Res>; + @override + $Res call( + {VideoId videoId, + String videoTitle, + Duration videoDuration, + String videoThumbnail, + String videoUploadDate, + int videoViews}); + + @override + $VideoIdCopyWith<$Res> get videoId; +} + +/// @nodoc +class __$ChannelVideoCopyWithImpl<$Res> extends _$ChannelVideoCopyWithImpl<$Res> + implements _$ChannelVideoCopyWith<$Res> { + __$ChannelVideoCopyWithImpl( + _ChannelVideo _value, $Res Function(_ChannelVideo) _then) + : super(_value, (v) => _then(v as _ChannelVideo)); + + @override + _ChannelVideo get _value => super._value as _ChannelVideo; + + @override + $Res call({ + Object? videoId = freezed, + Object? videoTitle = freezed, + Object? videoDuration = freezed, + Object? videoThumbnail = freezed, + Object? videoUploadDate = freezed, + Object? videoViews = freezed, + }) { + return _then(_ChannelVideo( + videoId == freezed + ? _value.videoId + : videoId // ignore: cast_nullable_to_non_nullable + as VideoId, + videoTitle == freezed + ? _value.videoTitle + : videoTitle // ignore: cast_nullable_to_non_nullable + as String, + videoDuration == freezed + ? _value.videoDuration + : videoDuration // ignore: cast_nullable_to_non_nullable + as Duration, + videoThumbnail == freezed + ? _value.videoThumbnail + : videoThumbnail // ignore: cast_nullable_to_non_nullable + as String, + videoUploadDate == freezed + ? _value.videoUploadDate + : videoUploadDate // ignore: cast_nullable_to_non_nullable + as String, + videoViews == freezed + ? _value.videoViews + : videoViews // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc + +class _$_ChannelVideo implements _ChannelVideo { + const _$_ChannelVideo(this.videoId, this.videoTitle, this.videoDuration, + this.videoThumbnail, this.videoUploadDate, this.videoViews); + + @override + + /// Video ID. + final VideoId videoId; + @override + + /// Video title. + final String videoTitle; + @override + + /// Video duration + final Duration videoDuration; + @override + + /// Video thumbnail + final String videoThumbnail; + @override + + /// Video upload date. + /// Formatted like 10 hours ago + final String videoUploadDate; + @override + + /// Video view count. + final int videoViews; + + @override + String toString() { + return 'ChannelVideo(videoId: $videoId, videoTitle: $videoTitle, videoDuration: $videoDuration, videoThumbnail: $videoThumbnail, videoUploadDate: $videoUploadDate, videoViews: $videoViews)'; + } + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other is _ChannelVideo && + (identical(other.videoId, videoId) || + const DeepCollectionEquality() + .equals(other.videoId, videoId)) && + (identical(other.videoTitle, videoTitle) || + const DeepCollectionEquality() + .equals(other.videoTitle, videoTitle)) && + (identical(other.videoDuration, videoDuration) || + const DeepCollectionEquality() + .equals(other.videoDuration, videoDuration)) && + (identical(other.videoThumbnail, videoThumbnail) || + const DeepCollectionEquality() + .equals(other.videoThumbnail, videoThumbnail)) && + (identical(other.videoUploadDate, videoUploadDate) || + const DeepCollectionEquality() + .equals(other.videoUploadDate, videoUploadDate)) && + (identical(other.videoViews, videoViews) || + const DeepCollectionEquality() + .equals(other.videoViews, videoViews))); + } + + @override + int get hashCode => + runtimeType.hashCode ^ + const DeepCollectionEquality().hash(videoId) ^ + const DeepCollectionEquality().hash(videoTitle) ^ + const DeepCollectionEquality().hash(videoDuration) ^ + const DeepCollectionEquality().hash(videoThumbnail) ^ + const DeepCollectionEquality().hash(videoUploadDate) ^ + const DeepCollectionEquality().hash(videoViews); + + @JsonKey(ignore: true) + @override + _$ChannelVideoCopyWith<_ChannelVideo> get copyWith => + __$ChannelVideoCopyWithImpl<_ChannelVideo>(this, _$identity); +} + +abstract class _ChannelVideo implements ChannelVideo { + const factory _ChannelVideo( + VideoId videoId, + String videoTitle, + Duration videoDuration, + String videoThumbnail, + String videoUploadDate, + int videoViews) = _$_ChannelVideo; + + @override + + /// Video ID. + VideoId get videoId => throw _privateConstructorUsedError; + @override + + /// Video title. + String get videoTitle => throw _privateConstructorUsedError; + @override + + /// Video duration + Duration get videoDuration => throw _privateConstructorUsedError; + @override + + /// Video thumbnail + String get videoThumbnail => throw _privateConstructorUsedError; + @override + + /// Video upload date. + /// Formatted like 10 hours ago + String get videoUploadDate => throw _privateConstructorUsedError; + @override + + /// Video view count. + int get videoViews => throw _privateConstructorUsedError; + @override + @JsonKey(ignore: true) + _$ChannelVideoCopyWith<_ChannelVideo> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/channels/username.dart b/lib/src/channels/username.dart index f27c099..45361aa 100644 --- a/lib/src/channels/username.dart +++ b/lib/src/channels/username.dart @@ -1,18 +1,36 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + import '../extensions/helpers_extension.dart'; -/// Encapsulates a valid YouTube user name. -class Username { - /// User name as string. - final String value; +part 'username.freezed.dart'; +/// Encapsulates a valid YouTube user name. +@freezed +class Username with _$Username { /// Initializes an instance of [Username]. - Username(String urlOrUsername) : value = parseUsername(urlOrUsername) ?? '' { - if (value.isEmpty) { + factory Username(String urlOrUsername) { + final username = parseUsername(urlOrUsername); + if (username == null) { throw ArgumentError.value( urlOrUsername, 'urlOrUsername', 'Invalid username'); } + return Username._(username); } + /// Converts [obj] to a [Username] by calling .toString on that object. + /// If it is already a [Username], [obj] is returned + factory Username.fromString(dynamic obj) { + if (obj is Username) { + return obj; + } + return Username(obj.toString()); + } + + const factory Username._( + /// User name as string. + final String value, + ) = _Username; + /// Returns true if the given username is a valid username. static bool validateUsername(String name) { if (name.isNullOrWhiteSpace) { @@ -44,13 +62,4 @@ class Username { } return null; } - - /// Converts [obj] to a [Username] by calling .toString on that object. - /// If it is already a [Username], [obj] is returned - factory Username.fromString(dynamic obj) { - if (obj is Username) { - return obj; - } - return Username(obj.toString()); - } } diff --git a/lib/src/channels/username.freezed.dart b/lib/src/channels/username.freezed.dart new file mode 100644 index 0000000..80aadfc --- /dev/null +++ b/lib/src/channels/username.freezed.dart @@ -0,0 +1,141 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// 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'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + +/// @nodoc +class _$UsernameTearOff { + const _$UsernameTearOff(); + + _Username _(String value) { + return _Username( + value, + ); + } +} + +/// @nodoc +const $Username = _$UsernameTearOff(); + +/// @nodoc +mixin _$Username { + /// User name as string. + String get value => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $UsernameCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $UsernameCopyWith<$Res> { + factory $UsernameCopyWith(Username value, $Res Function(Username) then) = + _$UsernameCopyWithImpl<$Res>; + $Res call({String value}); +} + +/// @nodoc +class _$UsernameCopyWithImpl<$Res> implements $UsernameCopyWith<$Res> { + _$UsernameCopyWithImpl(this._value, this._then); + + final Username _value; + // ignore: unused_field + final $Res Function(Username) _then; + + @override + $Res call({ + Object? value = freezed, + }) { + return _then(_value.copyWith( + value: value == freezed + ? _value.value + : value // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +abstract class _$UsernameCopyWith<$Res> implements $UsernameCopyWith<$Res> { + factory _$UsernameCopyWith(_Username value, $Res Function(_Username) then) = + __$UsernameCopyWithImpl<$Res>; + @override + $Res call({String value}); +} + +/// @nodoc +class __$UsernameCopyWithImpl<$Res> extends _$UsernameCopyWithImpl<$Res> + implements _$UsernameCopyWith<$Res> { + __$UsernameCopyWithImpl(_Username _value, $Res Function(_Username) _then) + : super(_value, (v) => _then(v as _Username)); + + @override + _Username get _value => super._value as _Username; + + @override + $Res call({ + Object? value = freezed, + }) { + return _then(_Username( + value == freezed + ? _value.value + : value // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$_Username implements _Username { + const _$_Username(this.value); + + @override + + /// User name as string. + final String value; + + @override + String toString() { + return 'Username._(value: $value)'; + } + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other is _Username && + (identical(other.value, value) || + const DeepCollectionEquality().equals(other.value, value))); + } + + @override + int get hashCode => + runtimeType.hashCode ^ const DeepCollectionEquality().hash(value); + + @JsonKey(ignore: true) + @override + _$UsernameCopyWith<_Username> get copyWith => + __$UsernameCopyWithImpl<_Username>(this, _$identity); +} + +abstract class _Username implements Username { + const factory _Username(String value) = _$_Username; + + @override + + /// User name as string. + String get value => throw _privateConstructorUsedError; + @override + @JsonKey(ignore: true) + _$UsernameCopyWith<_Username> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/common/engagement.dart b/lib/src/common/engagement.dart index 6e12f98..6e15a0b 100644 --- a/lib/src/common/engagement.dart +++ b/lib/src/common/engagement.dart @@ -1,18 +1,22 @@ -import 'package:equatable/equatable.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'engagement.freezed.dart'; /// User activity statistics. -class Engagement extends Equatable { - /// View count. - final int viewCount; +@freezed +class Engagement with _$Engagement { + const Engagement._(); - /// Like count. - final int? likeCount; + const factory Engagement( + /// View count. + int viewCount, - /// Dislike count. - final int? dislikeCount; + /// Like count. + int? likeCount, - /// Initializes an instance of [Engagement] - const Engagement(this.viewCount, this.likeCount, this.dislikeCount); + /// Dislike count. + int? dislikeCount, + ) = _Engagement; /// Average user rating in stars (1 star to 5 stars). /// Returns -1 if likeCount or dislikeCount is null. @@ -25,11 +29,4 @@ class Engagement extends Equatable { } return 1 + 4.0 * likeCount! / (likeCount! + dislikeCount!); } - - @override - String toString() => - '$viewCount views, $likeCount likes, $dislikeCount dislikes'; - - @override - List get props => [viewCount, likeCount, dislikeCount]; } diff --git a/lib/src/common/engagement.freezed.dart b/lib/src/common/engagement.freezed.dart new file mode 100644 index 0000000..792ec8b --- /dev/null +++ b/lib/src/common/engagement.freezed.dart @@ -0,0 +1,201 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// 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'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + +/// @nodoc +class _$EngagementTearOff { + const _$EngagementTearOff(); + + _Engagement call(int viewCount, int? likeCount, int? dislikeCount) { + return _Engagement( + viewCount, + likeCount, + dislikeCount, + ); + } +} + +/// @nodoc +const $Engagement = _$EngagementTearOff(); + +/// @nodoc +mixin _$Engagement { + /// View count. + int get viewCount => throw _privateConstructorUsedError; + + /// Like count. + int? get likeCount => throw _privateConstructorUsedError; + + /// Dislike count. + int? get dislikeCount => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $EngagementCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $EngagementCopyWith<$Res> { + factory $EngagementCopyWith( + Engagement value, $Res Function(Engagement) then) = + _$EngagementCopyWithImpl<$Res>; + $Res call({int viewCount, int? likeCount, int? dislikeCount}); +} + +/// @nodoc +class _$EngagementCopyWithImpl<$Res> implements $EngagementCopyWith<$Res> { + _$EngagementCopyWithImpl(this._value, this._then); + + final Engagement _value; + // ignore: unused_field + final $Res Function(Engagement) _then; + + @override + $Res call({ + Object? viewCount = freezed, + Object? likeCount = freezed, + Object? dislikeCount = freezed, + }) { + return _then(_value.copyWith( + viewCount: viewCount == freezed + ? _value.viewCount + : viewCount // ignore: cast_nullable_to_non_nullable + as int, + likeCount: likeCount == freezed + ? _value.likeCount + : likeCount // ignore: cast_nullable_to_non_nullable + as int?, + dislikeCount: dislikeCount == freezed + ? _value.dislikeCount + : dislikeCount // ignore: cast_nullable_to_non_nullable + as int?, + )); + } +} + +/// @nodoc +abstract class _$EngagementCopyWith<$Res> implements $EngagementCopyWith<$Res> { + factory _$EngagementCopyWith( + _Engagement value, $Res Function(_Engagement) then) = + __$EngagementCopyWithImpl<$Res>; + @override + $Res call({int viewCount, int? likeCount, int? dislikeCount}); +} + +/// @nodoc +class __$EngagementCopyWithImpl<$Res> extends _$EngagementCopyWithImpl<$Res> + implements _$EngagementCopyWith<$Res> { + __$EngagementCopyWithImpl( + _Engagement _value, $Res Function(_Engagement) _then) + : super(_value, (v) => _then(v as _Engagement)); + + @override + _Engagement get _value => super._value as _Engagement; + + @override + $Res call({ + Object? viewCount = freezed, + Object? likeCount = freezed, + Object? dislikeCount = freezed, + }) { + return _then(_Engagement( + viewCount == freezed + ? _value.viewCount + : viewCount // ignore: cast_nullable_to_non_nullable + as int, + likeCount == freezed + ? _value.likeCount + : likeCount // ignore: cast_nullable_to_non_nullable + as int?, + dislikeCount == freezed + ? _value.dislikeCount + : dislikeCount // ignore: cast_nullable_to_non_nullable + as int?, + )); + } +} + +/// @nodoc + +class _$_Engagement extends _Engagement { + const _$_Engagement(this.viewCount, this.likeCount, this.dislikeCount) + : super._(); + + @override + + /// View count. + final int viewCount; + @override + + /// Like count. + final int? likeCount; + @override + + /// Dislike count. + final int? dislikeCount; + + @override + String toString() { + return 'Engagement(viewCount: $viewCount, likeCount: $likeCount, dislikeCount: $dislikeCount)'; + } + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other is _Engagement && + (identical(other.viewCount, viewCount) || + const DeepCollectionEquality() + .equals(other.viewCount, viewCount)) && + (identical(other.likeCount, likeCount) || + const DeepCollectionEquality() + .equals(other.likeCount, likeCount)) && + (identical(other.dislikeCount, dislikeCount) || + const DeepCollectionEquality() + .equals(other.dislikeCount, dislikeCount))); + } + + @override + int get hashCode => + runtimeType.hashCode ^ + const DeepCollectionEquality().hash(viewCount) ^ + const DeepCollectionEquality().hash(likeCount) ^ + const DeepCollectionEquality().hash(dislikeCount); + + @JsonKey(ignore: true) + @override + _$EngagementCopyWith<_Engagement> get copyWith => + __$EngagementCopyWithImpl<_Engagement>(this, _$identity); +} + +abstract class _Engagement extends Engagement { + const factory _Engagement(int viewCount, int? likeCount, int? dislikeCount) = + _$_Engagement; + const _Engagement._() : super._(); + + @override + + /// View count. + int get viewCount => throw _privateConstructorUsedError; + @override + + /// Like count. + int? get likeCount => throw _privateConstructorUsedError; + @override + + /// Dislike count. + int? get dislikeCount => throw _privateConstructorUsedError; + @override + @JsonKey(ignore: true) + _$EngagementCopyWith<_Engagement> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/common/thumbnail.dart b/lib/src/common/thumbnail.dart index 7711377..1ba982b 100644 --- a/lib/src/common/thumbnail.dart +++ b/lib/src/common/thumbnail.dart @@ -1,19 +1,18 @@ -import 'package:equatable/equatable.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'thumbnail.freezed.dart'; /// Represent a channel thumbnail -class Thumbnail with EquatableMixin { - /// Image url. - final Uri url; +@freezed +class Thumbnail with _$Thumbnail { + const factory Thumbnail( + /// Image url. + Uri url, - /// Image height. - final int height; + /// Image height. + int height, - /// Image width. - final int width; - - /// Initialize an instance of [Thumbnail]. - Thumbnail(this.url, this.height, this.width); - - @override - List get props => [url, height, width]; + /// Image width. + int width, + ) = _Thumbnail; } diff --git a/lib/src/common/thumbnail.freezed.dart b/lib/src/common/thumbnail.freezed.dart new file mode 100644 index 0000000..5adf20a --- /dev/null +++ b/lib/src/common/thumbnail.freezed.dart @@ -0,0 +1,193 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// 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'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + +/// @nodoc +class _$ThumbnailTearOff { + const _$ThumbnailTearOff(); + + _Thumbnail call(Uri url, int height, int width) { + return _Thumbnail( + url, + height, + width, + ); + } +} + +/// @nodoc +const $Thumbnail = _$ThumbnailTearOff(); + +/// @nodoc +mixin _$Thumbnail { + /// Image url. + Uri get url => throw _privateConstructorUsedError; + + /// Image height. + int get height => throw _privateConstructorUsedError; + + /// Image width. + int get width => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $ThumbnailCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ThumbnailCopyWith<$Res> { + factory $ThumbnailCopyWith(Thumbnail value, $Res Function(Thumbnail) then) = + _$ThumbnailCopyWithImpl<$Res>; + $Res call({Uri url, int height, int width}); +} + +/// @nodoc +class _$ThumbnailCopyWithImpl<$Res> implements $ThumbnailCopyWith<$Res> { + _$ThumbnailCopyWithImpl(this._value, this._then); + + final Thumbnail _value; + // ignore: unused_field + final $Res Function(Thumbnail) _then; + + @override + $Res call({ + Object? url = freezed, + Object? height = freezed, + Object? width = freezed, + }) { + return _then(_value.copyWith( + url: url == freezed + ? _value.url + : url // ignore: cast_nullable_to_non_nullable + as Uri, + height: height == freezed + ? _value.height + : height // ignore: cast_nullable_to_non_nullable + as int, + width: width == freezed + ? _value.width + : width // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc +abstract class _$ThumbnailCopyWith<$Res> implements $ThumbnailCopyWith<$Res> { + factory _$ThumbnailCopyWith( + _Thumbnail value, $Res Function(_Thumbnail) then) = + __$ThumbnailCopyWithImpl<$Res>; + @override + $Res call({Uri url, int height, int width}); +} + +/// @nodoc +class __$ThumbnailCopyWithImpl<$Res> extends _$ThumbnailCopyWithImpl<$Res> + implements _$ThumbnailCopyWith<$Res> { + __$ThumbnailCopyWithImpl(_Thumbnail _value, $Res Function(_Thumbnail) _then) + : super(_value, (v) => _then(v as _Thumbnail)); + + @override + _Thumbnail get _value => super._value as _Thumbnail; + + @override + $Res call({ + Object? url = freezed, + Object? height = freezed, + Object? width = freezed, + }) { + return _then(_Thumbnail( + url == freezed + ? _value.url + : url // ignore: cast_nullable_to_non_nullable + as Uri, + height == freezed + ? _value.height + : height // ignore: cast_nullable_to_non_nullable + as int, + width == freezed + ? _value.width + : width // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc + +class _$_Thumbnail implements _Thumbnail { + const _$_Thumbnail(this.url, this.height, this.width); + + @override + + /// Image url. + final Uri url; + @override + + /// Image height. + final int height; + @override + + /// Image width. + final int width; + + @override + String toString() { + return 'Thumbnail(url: $url, height: $height, width: $width)'; + } + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other is _Thumbnail && + (identical(other.url, url) || + const DeepCollectionEquality().equals(other.url, url)) && + (identical(other.height, height) || + const DeepCollectionEquality().equals(other.height, height)) && + (identical(other.width, width) || + const DeepCollectionEquality().equals(other.width, width))); + } + + @override + int get hashCode => + runtimeType.hashCode ^ + const DeepCollectionEquality().hash(url) ^ + const DeepCollectionEquality().hash(height) ^ + const DeepCollectionEquality().hash(width); + + @JsonKey(ignore: true) + @override + _$ThumbnailCopyWith<_Thumbnail> get copyWith => + __$ThumbnailCopyWithImpl<_Thumbnail>(this, _$identity); +} + +abstract class _Thumbnail implements Thumbnail { + const factory _Thumbnail(Uri url, int height, int width) = _$_Thumbnail; + + @override + + /// Image url. + Uri get url => throw _privateConstructorUsedError; + @override + + /// Image height. + int get height => throw _privateConstructorUsedError; + @override + + /// Image width. + int get width => throw _privateConstructorUsedError; + @override + @JsonKey(ignore: true) + _$ThumbnailCopyWith<_Thumbnail> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/common/thumbnail_set.dart b/lib/src/common/thumbnail_set.dart index fca1f52..98464af 100644 --- a/lib/src/common/thumbnail_set.dart +++ b/lib/src/common/thumbnail_set.dart @@ -1,12 +1,17 @@ -import 'package:equatable/equatable.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'thumbnail_set.freezed.dart'; /// Set of thumbnails for a video. -class ThumbnailSet extends Equatable { - /// Video id. - final String videoId; - +@freezed +class ThumbnailSet with _$ThumbnailSet { /// Initializes an instance of [ThumbnailSet] - const ThumbnailSet(this.videoId); + const factory ThumbnailSet( + + /// Video id. + String videoId) = _ThumbnailSet; + + const ThumbnailSet._(); /// Low resolution thumbnail URL. String get lowResUrl => 'https://img.youtube.com/vi/$videoId/default.jpg'; diff --git a/lib/src/common/thumbnail_set.freezed.dart b/lib/src/common/thumbnail_set.freezed.dart new file mode 100644 index 0000000..2cbbdd5 --- /dev/null +++ b/lib/src/common/thumbnail_set.freezed.dart @@ -0,0 +1,146 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// 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'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + +/// @nodoc +class _$ThumbnailSetTearOff { + const _$ThumbnailSetTearOff(); + + _ThumbnailSet call(String videoId) { + return _ThumbnailSet( + videoId, + ); + } +} + +/// @nodoc +const $ThumbnailSet = _$ThumbnailSetTearOff(); + +/// @nodoc +mixin _$ThumbnailSet { + /// Video id. + String get videoId => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $ThumbnailSetCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ThumbnailSetCopyWith<$Res> { + factory $ThumbnailSetCopyWith( + ThumbnailSet value, $Res Function(ThumbnailSet) then) = + _$ThumbnailSetCopyWithImpl<$Res>; + $Res call({String videoId}); +} + +/// @nodoc +class _$ThumbnailSetCopyWithImpl<$Res> implements $ThumbnailSetCopyWith<$Res> { + _$ThumbnailSetCopyWithImpl(this._value, this._then); + + final ThumbnailSet _value; + // ignore: unused_field + final $Res Function(ThumbnailSet) _then; + + @override + $Res call({ + Object? videoId = freezed, + }) { + return _then(_value.copyWith( + videoId: videoId == freezed + ? _value.videoId + : videoId // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +abstract class _$ThumbnailSetCopyWith<$Res> + implements $ThumbnailSetCopyWith<$Res> { + factory _$ThumbnailSetCopyWith( + _ThumbnailSet value, $Res Function(_ThumbnailSet) then) = + __$ThumbnailSetCopyWithImpl<$Res>; + @override + $Res call({String videoId}); +} + +/// @nodoc +class __$ThumbnailSetCopyWithImpl<$Res> extends _$ThumbnailSetCopyWithImpl<$Res> + implements _$ThumbnailSetCopyWith<$Res> { + __$ThumbnailSetCopyWithImpl( + _ThumbnailSet _value, $Res Function(_ThumbnailSet) _then) + : super(_value, (v) => _then(v as _ThumbnailSet)); + + @override + _ThumbnailSet get _value => super._value as _ThumbnailSet; + + @override + $Res call({ + Object? videoId = freezed, + }) { + return _then(_ThumbnailSet( + videoId == freezed + ? _value.videoId + : videoId // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$_ThumbnailSet extends _ThumbnailSet { + const _$_ThumbnailSet(this.videoId) : super._(); + + @override + + /// Video id. + final String videoId; + + @override + String toString() { + return 'ThumbnailSet(videoId: $videoId)'; + } + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other is _ThumbnailSet && + (identical(other.videoId, videoId) || + const DeepCollectionEquality().equals(other.videoId, videoId))); + } + + @override + int get hashCode => + runtimeType.hashCode ^ const DeepCollectionEquality().hash(videoId); + + @JsonKey(ignore: true) + @override + _$ThumbnailSetCopyWith<_ThumbnailSet> get copyWith => + __$ThumbnailSetCopyWithImpl<_ThumbnailSet>(this, _$identity); +} + +abstract class _ThumbnailSet extends ThumbnailSet { + const factory _ThumbnailSet(String videoId) = _$_ThumbnailSet; + const _ThumbnailSet._() : super._(); + + @override + + /// Video id. + String get videoId => throw _privateConstructorUsedError; + @override + @JsonKey(ignore: true) + _$ThumbnailSetCopyWith<_ThumbnailSet> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/playlists/playlist.dart b/lib/src/playlists/playlist.dart index d6022d9..d2a2dff 100644 --- a/lib/src/playlists/playlist.dart +++ b/lib/src/playlists/playlist.dart @@ -1,40 +1,39 @@ import 'package:equatable/equatable.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; import '../common/common.dart'; import 'playlist_id.dart'; +part 'playlist.freezed.dart'; + /// YouTube playlist metadata. -class Playlist with EquatableMixin { - /// Playlist ID. - final PlaylistId id; +@freezed +class Playlist with _$Playlist { + /// Initializes an instance of [Playlist]. + const factory Playlist( + /// Playlist ID. + PlaylistId id, + + /// Playlist title. + String title, + + /// Playlist author. + /// Can be null if it's a system playlist (e.g. Video Mix, Topics, etc.). + String author, + + /// Playlist description. + String description, + + /// Available thumbnails for this playlist. + /// Can be null if the playlist is empty. + ThumbnailSet thumbnails, + + /// Engagement statistics. + Engagement engagement, + ) = _Playlist; + + const Playlist._(); /// Playlist URL. String get url => 'https://www.youtube.com/playlist?list=$id'; - - /// Playlist title. - final String title; - - /// Playlist author. - /// Can be null if it's a system playlist (e.g. Video Mix, Topics, etc.). - final String author; - - /// Playlist description. - final String description; - - /// Available thumbnails for this playlist. - /// Can be null if the playlist is empty. - final ThumbnailSet thumbnails; - - /// Engagement statistics. - final Engagement engagement; - - /// Initializes an instance of [Playlist]. - Playlist(this.id, this.title, this.author, this.description, this.thumbnails, - this.engagement); - - @override - String toString() => 'Playlist ($title)'; - - @override - List get props => [id]; } diff --git a/lib/src/playlists/playlist.freezed.dart b/lib/src/playlists/playlist.freezed.dart new file mode 100644 index 0000000..6c619f1 --- /dev/null +++ b/lib/src/playlists/playlist.freezed.dart @@ -0,0 +1,330 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// 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'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + +/// @nodoc +class _$PlaylistTearOff { + const _$PlaylistTearOff(); + + _Playlist call(PlaylistId id, String title, String author, String description, + ThumbnailSet thumbnails, Engagement engagement) { + return _Playlist( + id, + title, + author, + description, + thumbnails, + engagement, + ); + } +} + +/// @nodoc +const $Playlist = _$PlaylistTearOff(); + +/// @nodoc +mixin _$Playlist { + /// Playlist ID. + PlaylistId get id => throw _privateConstructorUsedError; + + /// Playlist title. + String get title => throw _privateConstructorUsedError; + + /// Playlist author. + /// Can be null if it's a system playlist (e.g. Video Mix, Topics, etc.). + String get author => throw _privateConstructorUsedError; + + /// Playlist description. + String get description => throw _privateConstructorUsedError; + + /// Available thumbnails for this playlist. + /// Can be null if the playlist is empty. + ThumbnailSet get thumbnails => throw _privateConstructorUsedError; + + /// Engagement statistics. + Engagement get engagement => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $PlaylistCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $PlaylistCopyWith<$Res> { + factory $PlaylistCopyWith(Playlist value, $Res Function(Playlist) then) = + _$PlaylistCopyWithImpl<$Res>; + $Res call( + {PlaylistId id, + String title, + String author, + String description, + ThumbnailSet thumbnails, + Engagement engagement}); + + $PlaylistIdCopyWith<$Res> get id; + $ThumbnailSetCopyWith<$Res> get thumbnails; + $EngagementCopyWith<$Res> get engagement; +} + +/// @nodoc +class _$PlaylistCopyWithImpl<$Res> implements $PlaylistCopyWith<$Res> { + _$PlaylistCopyWithImpl(this._value, this._then); + + final Playlist _value; + // ignore: unused_field + final $Res Function(Playlist) _then; + + @override + $Res call({ + Object? id = freezed, + Object? title = freezed, + Object? author = freezed, + Object? description = freezed, + Object? thumbnails = freezed, + Object? engagement = freezed, + }) { + return _then(_value.copyWith( + id: id == freezed + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as PlaylistId, + title: title == freezed + ? _value.title + : title // ignore: cast_nullable_to_non_nullable + as String, + author: author == freezed + ? _value.author + : author // ignore: cast_nullable_to_non_nullable + as String, + description: description == freezed + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String, + thumbnails: thumbnails == freezed + ? _value.thumbnails + : thumbnails // ignore: cast_nullable_to_non_nullable + as ThumbnailSet, + engagement: engagement == freezed + ? _value.engagement + : engagement // ignore: cast_nullable_to_non_nullable + as Engagement, + )); + } + + @override + $PlaylistIdCopyWith<$Res> get id { + return $PlaylistIdCopyWith<$Res>(_value.id, (value) { + return _then(_value.copyWith(id: value)); + }); + } + + @override + $ThumbnailSetCopyWith<$Res> get thumbnails { + return $ThumbnailSetCopyWith<$Res>(_value.thumbnails, (value) { + return _then(_value.copyWith(thumbnails: value)); + }); + } + + @override + $EngagementCopyWith<$Res> get engagement { + return $EngagementCopyWith<$Res>(_value.engagement, (value) { + return _then(_value.copyWith(engagement: value)); + }); + } +} + +/// @nodoc +abstract class _$PlaylistCopyWith<$Res> implements $PlaylistCopyWith<$Res> { + factory _$PlaylistCopyWith(_Playlist value, $Res Function(_Playlist) then) = + __$PlaylistCopyWithImpl<$Res>; + @override + $Res call( + {PlaylistId id, + String title, + String author, + String description, + ThumbnailSet thumbnails, + Engagement engagement}); + + @override + $PlaylistIdCopyWith<$Res> get id; + @override + $ThumbnailSetCopyWith<$Res> get thumbnails; + @override + $EngagementCopyWith<$Res> get engagement; +} + +/// @nodoc +class __$PlaylistCopyWithImpl<$Res> extends _$PlaylistCopyWithImpl<$Res> + implements _$PlaylistCopyWith<$Res> { + __$PlaylistCopyWithImpl(_Playlist _value, $Res Function(_Playlist) _then) + : super(_value, (v) => _then(v as _Playlist)); + + @override + _Playlist get _value => super._value as _Playlist; + + @override + $Res call({ + Object? id = freezed, + Object? title = freezed, + Object? author = freezed, + Object? description = freezed, + Object? thumbnails = freezed, + Object? engagement = freezed, + }) { + return _then(_Playlist( + id == freezed + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as PlaylistId, + title == freezed + ? _value.title + : title // ignore: cast_nullable_to_non_nullable + as String, + author == freezed + ? _value.author + : author // ignore: cast_nullable_to_non_nullable + as String, + description == freezed + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String, + thumbnails == freezed + ? _value.thumbnails + : thumbnails // ignore: cast_nullable_to_non_nullable + as ThumbnailSet, + engagement == freezed + ? _value.engagement + : engagement // ignore: cast_nullable_to_non_nullable + as Engagement, + )); + } +} + +/// @nodoc + +class _$_Playlist extends _Playlist { + const _$_Playlist(this.id, this.title, this.author, this.description, + this.thumbnails, this.engagement) + : super._(); + + @override + + /// Playlist ID. + final PlaylistId id; + @override + + /// Playlist title. + final String title; + @override + + /// Playlist author. + /// Can be null if it's a system playlist (e.g. Video Mix, Topics, etc.). + final String author; + @override + + /// Playlist description. + final String description; + @override + + /// Available thumbnails for this playlist. + /// Can be null if the playlist is empty. + final ThumbnailSet thumbnails; + @override + + /// Engagement statistics. + final Engagement engagement; + + @override + String toString() { + return 'Playlist(id: $id, title: $title, author: $author, description: $description, thumbnails: $thumbnails, engagement: $engagement)'; + } + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other is _Playlist && + (identical(other.id, id) || + const DeepCollectionEquality().equals(other.id, id)) && + (identical(other.title, title) || + const DeepCollectionEquality().equals(other.title, title)) && + (identical(other.author, author) || + const DeepCollectionEquality().equals(other.author, author)) && + (identical(other.description, description) || + const DeepCollectionEquality() + .equals(other.description, description)) && + (identical(other.thumbnails, thumbnails) || + const DeepCollectionEquality() + .equals(other.thumbnails, thumbnails)) && + (identical(other.engagement, engagement) || + const DeepCollectionEquality() + .equals(other.engagement, engagement))); + } + + @override + int get hashCode => + runtimeType.hashCode ^ + const DeepCollectionEquality().hash(id) ^ + const DeepCollectionEquality().hash(title) ^ + const DeepCollectionEquality().hash(author) ^ + const DeepCollectionEquality().hash(description) ^ + const DeepCollectionEquality().hash(thumbnails) ^ + const DeepCollectionEquality().hash(engagement); + + @JsonKey(ignore: true) + @override + _$PlaylistCopyWith<_Playlist> get copyWith => + __$PlaylistCopyWithImpl<_Playlist>(this, _$identity); +} + +abstract class _Playlist extends Playlist { + const factory _Playlist( + PlaylistId id, + String title, + String author, + String description, + ThumbnailSet thumbnails, + Engagement engagement) = _$_Playlist; + const _Playlist._() : super._(); + + @override + + /// Playlist ID. + PlaylistId get id => throw _privateConstructorUsedError; + @override + + /// Playlist title. + String get title => throw _privateConstructorUsedError; + @override + + /// Playlist author. + /// Can be null if it's a system playlist (e.g. Video Mix, Topics, etc.). + String get author => throw _privateConstructorUsedError; + @override + + /// Playlist description. + String get description => throw _privateConstructorUsedError; + @override + + /// Available thumbnails for this playlist. + /// Can be null if the playlist is empty. + ThumbnailSet get thumbnails => throw _privateConstructorUsedError; + @override + + /// Engagement statistics. + Engagement get engagement => throw _privateConstructorUsedError; + @override + @JsonKey(ignore: true) + _$PlaylistCopyWith<_Playlist> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/playlists/playlist_id.dart b/lib/src/playlists/playlist_id.dart index 00444ea..eeee6fc 100644 --- a/lib/src/playlists/playlist_id.dart +++ b/lib/src/playlists/playlist_id.dart @@ -1,9 +1,12 @@ -import 'package:equatable/equatable.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; import '../extensions/helpers_extension.dart'; +part 'playlist_id.freezed.dart'; + /// Encapsulates a valid YouTube playlist ID. -class PlaylistId with EquatableMixin { +@freezed +class PlaylistId with _$PlaylistId { static final _regMatchExp = RegExp(r'youtube\..+?/playlist.*?list=(.*?)(?:&|/|$)'); static final _compositeMatchExp = @@ -13,14 +16,29 @@ class PlaylistId with EquatableMixin { static final _embedCompositeMatchExp = RegExp(r'youtube\..+?/embed/.*?/.*?list=(.*?)(?:&|/|$)'); - /// The playlist id as string. - final String value; + const PlaylistId._(); + + const factory PlaylistId._internal( + + /// The playlist id as string. + String value) = _PlaylistId; /// Initializes an instance of [PlaylistId] - PlaylistId(String idOrUrl) : value = parsePlaylistId(idOrUrl) ?? '' { - if (value.isEmpty) { + factory PlaylistId(String idOrUrl) { + final id = parsePlaylistId(idOrUrl); + if (id == null) { throw ArgumentError.value(idOrUrl, 'idOrUrl', 'Invalid url'); } + return PlaylistId._internal(id); + } + + /// Converts [obj] to a [PlaylistId] by calling .toString on that object. + /// If it is already a [PlaylistId], [obj] is returned + factory PlaylistId.fromString(dynamic obj) { + if (obj is PlaylistId) { + return obj; + } + return PlaylistId(obj.toString()); } /// Returns true if the given [playlistId] is valid. @@ -97,16 +115,4 @@ class PlaylistId with EquatableMixin { @override String toString() => value; - - /// Converts [obj] to a [PlaylistId] by calling .toString on that object. - /// If it is already a [PlaylistId], [obj] is returned - factory PlaylistId.fromString(dynamic obj) { - if (obj is PlaylistId) { - return obj; - } - return PlaylistId(obj.toString()); - } - - @override - List get props => [value]; } diff --git a/lib/src/playlists/playlist_id.freezed.dart b/lib/src/playlists/playlist_id.freezed.dart new file mode 100644 index 0000000..ff4d93b --- /dev/null +++ b/lib/src/playlists/playlist_id.freezed.dart @@ -0,0 +1,140 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// 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'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + +/// @nodoc +class _$PlaylistIdTearOff { + const _$PlaylistIdTearOff(); + + _PlaylistId _internal(String value) { + return _PlaylistId( + value, + ); + } +} + +/// @nodoc +const $PlaylistId = _$PlaylistIdTearOff(); + +/// @nodoc +mixin _$PlaylistId { + /// The playlist id as string. + String get value => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $PlaylistIdCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $PlaylistIdCopyWith<$Res> { + factory $PlaylistIdCopyWith( + PlaylistId value, $Res Function(PlaylistId) then) = + _$PlaylistIdCopyWithImpl<$Res>; + $Res call({String value}); +} + +/// @nodoc +class _$PlaylistIdCopyWithImpl<$Res> implements $PlaylistIdCopyWith<$Res> { + _$PlaylistIdCopyWithImpl(this._value, this._then); + + final PlaylistId _value; + // ignore: unused_field + final $Res Function(PlaylistId) _then; + + @override + $Res call({ + Object? value = freezed, + }) { + return _then(_value.copyWith( + value: value == freezed + ? _value.value + : value // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +abstract class _$PlaylistIdCopyWith<$Res> implements $PlaylistIdCopyWith<$Res> { + factory _$PlaylistIdCopyWith( + _PlaylistId value, $Res Function(_PlaylistId) then) = + __$PlaylistIdCopyWithImpl<$Res>; + @override + $Res call({String value}); +} + +/// @nodoc +class __$PlaylistIdCopyWithImpl<$Res> extends _$PlaylistIdCopyWithImpl<$Res> + implements _$PlaylistIdCopyWith<$Res> { + __$PlaylistIdCopyWithImpl( + _PlaylistId _value, $Res Function(_PlaylistId) _then) + : super(_value, (v) => _then(v as _PlaylistId)); + + @override + _PlaylistId get _value => super._value as _PlaylistId; + + @override + $Res call({ + Object? value = freezed, + }) { + return _then(_PlaylistId( + value == freezed + ? _value.value + : value // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$_PlaylistId extends _PlaylistId { + const _$_PlaylistId(this.value) : super._(); + + @override + + /// The playlist id as string. + final String value; + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other is _PlaylistId && + (identical(other.value, value) || + const DeepCollectionEquality().equals(other.value, value))); + } + + @override + int get hashCode => + runtimeType.hashCode ^ const DeepCollectionEquality().hash(value); + + @JsonKey(ignore: true) + @override + _$PlaylistIdCopyWith<_PlaylistId> get copyWith => + __$PlaylistIdCopyWithImpl<_PlaylistId>(this, _$identity); +} + +abstract class _PlaylistId extends PlaylistId { + const factory _PlaylistId(String value) = _$_PlaylistId; + const _PlaylistId._() : super._(); + + @override + + /// The playlist id as string. + String get value => throw _privateConstructorUsedError; + @override + @JsonKey(ignore: true) + _$PlaylistIdCopyWith<_PlaylistId> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/search/base_search_content.dart b/lib/src/search/base_search_content.dart index 43c3142..2865ce4 100644 --- a/lib/src/search/base_search_content.dart +++ b/lib/src/search/base_search_content.dart @@ -1,5 +1,2 @@ /// This i can either be a [SearchVideo] or [SearchPlaylist] -abstract class BaseSearchContent { - /// - const BaseSearchContent(); -} +mixin BaseSearchContent {} diff --git a/lib/src/search/related_query.dart b/lib/src/search/related_query.dart index b9b841a..1a3aafb 100644 --- a/lib/src/search/related_query.dart +++ b/lib/src/search/related_query.dart @@ -1,21 +1,18 @@ -import 'package:equatable/equatable.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; import '../videos/video_id.dart'; +part 'related_query.freezed.dart'; + /// -class RelatedQuery with EquatableMixin { - /// Query related to a search query. - final String query; - - /// Video related to a search query. - final VideoId videoId; - +@freezed +class RelatedQuery with _$RelatedQuery { /// Initialize a [RelatedQuery] instance. - RelatedQuery(this.query, this.videoId); + const factory RelatedQuery( - @override - String toString() => 'RelatedQuery($videoId): $query'; + /// Query related to a search query. + String query, - @override - List get props => [query, videoId]; + /// Video related to a search query. + VideoId videoId) = _RelatedQuery; } diff --git a/lib/src/search/related_query.freezed.dart b/lib/src/search/related_query.freezed.dart new file mode 100644 index 0000000..dc7fc02 --- /dev/null +++ b/lib/src/search/related_query.freezed.dart @@ -0,0 +1,183 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// 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 'related_query.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + +/// @nodoc +class _$RelatedQueryTearOff { + const _$RelatedQueryTearOff(); + + _RelatedQuery call(String query, VideoId videoId) { + return _RelatedQuery( + query, + videoId, + ); + } +} + +/// @nodoc +const $RelatedQuery = _$RelatedQueryTearOff(); + +/// @nodoc +mixin _$RelatedQuery { + /// Query related to a search query. + String get query => throw _privateConstructorUsedError; + + /// Video related to a search query. + VideoId get videoId => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $RelatedQueryCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $RelatedQueryCopyWith<$Res> { + factory $RelatedQueryCopyWith( + RelatedQuery value, $Res Function(RelatedQuery) then) = + _$RelatedQueryCopyWithImpl<$Res>; + $Res call({String query, VideoId videoId}); + + $VideoIdCopyWith<$Res> get videoId; +} + +/// @nodoc +class _$RelatedQueryCopyWithImpl<$Res> implements $RelatedQueryCopyWith<$Res> { + _$RelatedQueryCopyWithImpl(this._value, this._then); + + final RelatedQuery _value; + // ignore: unused_field + final $Res Function(RelatedQuery) _then; + + @override + $Res call({ + Object? query = freezed, + Object? videoId = freezed, + }) { + return _then(_value.copyWith( + query: query == freezed + ? _value.query + : query // ignore: cast_nullable_to_non_nullable + as String, + videoId: videoId == freezed + ? _value.videoId + : videoId // ignore: cast_nullable_to_non_nullable + as VideoId, + )); + } + + @override + $VideoIdCopyWith<$Res> get videoId { + return $VideoIdCopyWith<$Res>(_value.videoId, (value) { + return _then(_value.copyWith(videoId: value)); + }); + } +} + +/// @nodoc +abstract class _$RelatedQueryCopyWith<$Res> + implements $RelatedQueryCopyWith<$Res> { + factory _$RelatedQueryCopyWith( + _RelatedQuery value, $Res Function(_RelatedQuery) then) = + __$RelatedQueryCopyWithImpl<$Res>; + @override + $Res call({String query, VideoId videoId}); + + @override + $VideoIdCopyWith<$Res> get videoId; +} + +/// @nodoc +class __$RelatedQueryCopyWithImpl<$Res> extends _$RelatedQueryCopyWithImpl<$Res> + implements _$RelatedQueryCopyWith<$Res> { + __$RelatedQueryCopyWithImpl( + _RelatedQuery _value, $Res Function(_RelatedQuery) _then) + : super(_value, (v) => _then(v as _RelatedQuery)); + + @override + _RelatedQuery get _value => super._value as _RelatedQuery; + + @override + $Res call({ + Object? query = freezed, + Object? videoId = freezed, + }) { + return _then(_RelatedQuery( + query == freezed + ? _value.query + : query // ignore: cast_nullable_to_non_nullable + as String, + videoId == freezed + ? _value.videoId + : videoId // ignore: cast_nullable_to_non_nullable + as VideoId, + )); + } +} + +/// @nodoc + +class _$_RelatedQuery implements _RelatedQuery { + const _$_RelatedQuery(this.query, this.videoId); + + @override + + /// Query related to a search query. + final String query; + @override + + /// Video related to a search query. + final VideoId videoId; + + @override + String toString() { + return 'RelatedQuery(query: $query, videoId: $videoId)'; + } + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other is _RelatedQuery && + (identical(other.query, query) || + const DeepCollectionEquality().equals(other.query, query)) && + (identical(other.videoId, videoId) || + const DeepCollectionEquality().equals(other.videoId, videoId))); + } + + @override + int get hashCode => + runtimeType.hashCode ^ + const DeepCollectionEquality().hash(query) ^ + const DeepCollectionEquality().hash(videoId); + + @JsonKey(ignore: true) + @override + _$RelatedQueryCopyWith<_RelatedQuery> get copyWith => + __$RelatedQueryCopyWithImpl<_RelatedQuery>(this, _$identity); +} + +abstract class _RelatedQuery implements RelatedQuery { + const factory _RelatedQuery(String query, VideoId videoId) = _$_RelatedQuery; + + @override + + /// Query related to a search query. + String get query => throw _privateConstructorUsedError; + @override + + /// Video related to a search query. + VideoId get videoId => throw _privateConstructorUsedError; + @override + @JsonKey(ignore: true) + _$RelatedQueryCopyWith<_RelatedQuery> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/search/search_channel.dart b/lib/src/search/search_channel.dart index e20c074..36bcd2a 100644 --- a/lib/src/search/search_channel.dart +++ b/lib/src/search/search_channel.dart @@ -1,29 +1,28 @@ import 'package:equatable/equatable.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; import '../channels/channel_id.dart'; import 'base_search_content.dart'; +part 'search_channel.freezed.dart'; + /// Metadata related to a search query result (channel) -class SearchChannel extends BaseSearchContent with EquatableMixin { - /// Channel id. - final ChannelId id; - - /// Channel name. - final String name; - - /// Description snippet. - /// Can be empty. - final String description; - - /// Channel uploaded videos. - final int videoCount; - +@freezed +class SearchChannel with _$SearchChannel, BaseSearchContent { /// Initialize a [SearchChannel] instance. - SearchChannel(this.id, this.name, this.description, this.videoCount); + @With(BaseSearchContent) + const factory SearchChannel( - @override - String toString() => '(Channel) $name ($id)'; + /// Channel id. + ChannelId id, - @override - List get props => [id, name, description, videoCount]; + /// Channel name. + String name, + + /// Description snippet. + /// Can be empty. + String description, + + /// Channel uploaded videos. + int videoCount) = _SearchChannel; } diff --git a/lib/src/search/search_channel.freezed.dart b/lib/src/search/search_channel.freezed.dart new file mode 100644 index 0000000..29b6d19 --- /dev/null +++ b/lib/src/search/search_channel.freezed.dart @@ -0,0 +1,244 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// 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'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + +/// @nodoc +class _$SearchChannelTearOff { + const _$SearchChannelTearOff(); + + _SearchChannel call( + ChannelId id, String name, String description, int videoCount) { + return _SearchChannel( + id, + name, + description, + videoCount, + ); + } +} + +/// @nodoc +const $SearchChannel = _$SearchChannelTearOff(); + +/// @nodoc +mixin _$SearchChannel { + /// Channel id. + ChannelId get id => throw _privateConstructorUsedError; + + /// Channel name. + String get name => throw _privateConstructorUsedError; + + /// Description snippet. + /// Can be empty. + String get description => throw _privateConstructorUsedError; + + /// Channel uploaded videos. + int get videoCount => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $SearchChannelCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SearchChannelCopyWith<$Res> { + factory $SearchChannelCopyWith( + SearchChannel value, $Res Function(SearchChannel) then) = + _$SearchChannelCopyWithImpl<$Res>; + $Res call({ChannelId id, String name, String description, int videoCount}); + + $ChannelIdCopyWith<$Res> get id; +} + +/// @nodoc +class _$SearchChannelCopyWithImpl<$Res> + implements $SearchChannelCopyWith<$Res> { + _$SearchChannelCopyWithImpl(this._value, this._then); + + final SearchChannel _value; + // ignore: unused_field + final $Res Function(SearchChannel) _then; + + @override + $Res call({ + Object? id = freezed, + Object? name = freezed, + Object? description = freezed, + Object? videoCount = freezed, + }) { + return _then(_value.copyWith( + id: id == freezed + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as ChannelId, + name: name == freezed + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + description: description == freezed + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String, + videoCount: videoCount == freezed + ? _value.videoCount + : videoCount // ignore: cast_nullable_to_non_nullable + as int, + )); + } + + @override + $ChannelIdCopyWith<$Res> get id { + return $ChannelIdCopyWith<$Res>(_value.id, (value) { + return _then(_value.copyWith(id: value)); + }); + } +} + +/// @nodoc +abstract class _$SearchChannelCopyWith<$Res> + implements $SearchChannelCopyWith<$Res> { + factory _$SearchChannelCopyWith( + _SearchChannel value, $Res Function(_SearchChannel) then) = + __$SearchChannelCopyWithImpl<$Res>; + @override + $Res call({ChannelId id, String name, String description, int videoCount}); + + @override + $ChannelIdCopyWith<$Res> get id; +} + +/// @nodoc +class __$SearchChannelCopyWithImpl<$Res> + extends _$SearchChannelCopyWithImpl<$Res> + implements _$SearchChannelCopyWith<$Res> { + __$SearchChannelCopyWithImpl( + _SearchChannel _value, $Res Function(_SearchChannel) _then) + : super(_value, (v) => _then(v as _SearchChannel)); + + @override + _SearchChannel get _value => super._value as _SearchChannel; + + @override + $Res call({ + Object? id = freezed, + Object? name = freezed, + Object? description = freezed, + Object? videoCount = freezed, + }) { + return _then(_SearchChannel( + id == freezed + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as ChannelId, + name == freezed + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + description == freezed + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String, + videoCount == freezed + ? _value.videoCount + : videoCount // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc + +@With(BaseSearchContent) +class _$_SearchChannel with BaseSearchContent implements _SearchChannel { + const _$_SearchChannel(this.id, this.name, this.description, this.videoCount); + + @override + + /// Channel id. + final ChannelId id; + @override + + /// Channel name. + final String name; + @override + + /// Description snippet. + /// Can be empty. + final String description; + @override + + /// Channel uploaded videos. + final int videoCount; + + @override + String toString() { + return 'SearchChannel(id: $id, name: $name, description: $description, videoCount: $videoCount)'; + } + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other is _SearchChannel && + (identical(other.id, id) || + const DeepCollectionEquality().equals(other.id, id)) && + (identical(other.name, name) || + const DeepCollectionEquality().equals(other.name, name)) && + (identical(other.description, description) || + const DeepCollectionEquality() + .equals(other.description, description)) && + (identical(other.videoCount, videoCount) || + const DeepCollectionEquality() + .equals(other.videoCount, videoCount))); + } + + @override + int get hashCode => + runtimeType.hashCode ^ + const DeepCollectionEquality().hash(id) ^ + const DeepCollectionEquality().hash(name) ^ + const DeepCollectionEquality().hash(description) ^ + const DeepCollectionEquality().hash(videoCount); + + @JsonKey(ignore: true) + @override + _$SearchChannelCopyWith<_SearchChannel> get copyWith => + __$SearchChannelCopyWithImpl<_SearchChannel>(this, _$identity); +} + +abstract class _SearchChannel implements SearchChannel, BaseSearchContent { + const factory _SearchChannel( + ChannelId id, String name, String description, int videoCount) = + _$_SearchChannel; + + @override + + /// Channel id. + ChannelId get id => throw _privateConstructorUsedError; + @override + + /// Channel name. + String get name => throw _privateConstructorUsedError; + @override + + /// Description snippet. + /// Can be empty. + String get description => throw _privateConstructorUsedError; + @override + + /// Channel uploaded videos. + int get videoCount => throw _privateConstructorUsedError; + @override + @JsonKey(ignore: true) + _$SearchChannelCopyWith<_SearchChannel> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/search/search_playlist.dart b/lib/src/search/search_playlist.dart index 0dc38b0..3b5910f 100644 --- a/lib/src/search/search_playlist.dart +++ b/lib/src/search/search_playlist.dart @@ -1,25 +1,23 @@ -import 'package:equatable/equatable.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; import '../playlists/playlist_id.dart'; import 'base_search_content.dart'; +part 'search_playlist.freezed.dart'; + /// Metadata related to a search query result (playlist) -class SearchPlaylist extends BaseSearchContent with EquatableMixin { - /// PlaylistId. - final PlaylistId playlistId; +@freezed +class SearchPlaylist with _$SearchPlaylist, BaseSearchContent { + /// Initialize a [SearchPlaylist] instance. + @With(BaseSearchContent) + const factory SearchPlaylist( - /// Playlist title. - final String playlistTitle; + /// PlaylistId. + PlaylistId playlistId, - /// Playlist video count, cannot be greater than 50. - final int playlistVideoCount; + /// Playlist title. + String playlistTitle, - /// Initialize an instance of [SearchPlaylist] - SearchPlaylist(this.playlistId, this.playlistTitle, this.playlistVideoCount); - - @override - String toString() => '[Playlist] $playlistTitle ($playlistId)'; - - @override - List get props => [playlistId]; + /// Playlist video count, cannot be greater than 50. + int playlistVideoCount) = _SearchChannel; } diff --git a/lib/src/search/search_playlist.freezed.dart b/lib/src/search/search_playlist.freezed.dart new file mode 100644 index 0000000..6411012 --- /dev/null +++ b/lib/src/search/search_playlist.freezed.dart @@ -0,0 +1,220 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// 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'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + +/// @nodoc +class _$SearchPlaylistTearOff { + const _$SearchPlaylistTearOff(); + + _SearchChannel call( + PlaylistId playlistId, String playlistTitle, int playlistVideoCount) { + return _SearchChannel( + playlistId, + playlistTitle, + playlistVideoCount, + ); + } +} + +/// @nodoc +const $SearchPlaylist = _$SearchPlaylistTearOff(); + +/// @nodoc +mixin _$SearchPlaylist { + /// PlaylistId. + PlaylistId get playlistId => throw _privateConstructorUsedError; + + /// Playlist title. + String get playlistTitle => throw _privateConstructorUsedError; + + /// Playlist video count, cannot be greater than 50. + int get playlistVideoCount => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $SearchPlaylistCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SearchPlaylistCopyWith<$Res> { + factory $SearchPlaylistCopyWith( + SearchPlaylist value, $Res Function(SearchPlaylist) then) = + _$SearchPlaylistCopyWithImpl<$Res>; + $Res call( + {PlaylistId playlistId, String playlistTitle, int playlistVideoCount}); + + $PlaylistIdCopyWith<$Res> get playlistId; +} + +/// @nodoc +class _$SearchPlaylistCopyWithImpl<$Res> + implements $SearchPlaylistCopyWith<$Res> { + _$SearchPlaylistCopyWithImpl(this._value, this._then); + + final SearchPlaylist _value; + // ignore: unused_field + final $Res Function(SearchPlaylist) _then; + + @override + $Res call({ + Object? playlistId = freezed, + Object? playlistTitle = freezed, + Object? playlistVideoCount = freezed, + }) { + return _then(_value.copyWith( + playlistId: playlistId == freezed + ? _value.playlistId + : playlistId // ignore: cast_nullable_to_non_nullable + as PlaylistId, + playlistTitle: playlistTitle == freezed + ? _value.playlistTitle + : playlistTitle // ignore: cast_nullable_to_non_nullable + as String, + playlistVideoCount: playlistVideoCount == freezed + ? _value.playlistVideoCount + : playlistVideoCount // ignore: cast_nullable_to_non_nullable + as int, + )); + } + + @override + $PlaylistIdCopyWith<$Res> get playlistId { + return $PlaylistIdCopyWith<$Res>(_value.playlistId, (value) { + return _then(_value.copyWith(playlistId: value)); + }); + } +} + +/// @nodoc +abstract class _$SearchChannelCopyWith<$Res> + implements $SearchPlaylistCopyWith<$Res> { + factory _$SearchChannelCopyWith( + _SearchChannel value, $Res Function(_SearchChannel) then) = + __$SearchChannelCopyWithImpl<$Res>; + @override + $Res call( + {PlaylistId playlistId, String playlistTitle, int playlistVideoCount}); + + @override + $PlaylistIdCopyWith<$Res> get playlistId; +} + +/// @nodoc +class __$SearchChannelCopyWithImpl<$Res> + extends _$SearchPlaylistCopyWithImpl<$Res> + implements _$SearchChannelCopyWith<$Res> { + __$SearchChannelCopyWithImpl( + _SearchChannel _value, $Res Function(_SearchChannel) _then) + : super(_value, (v) => _then(v as _SearchChannel)); + + @override + _SearchChannel get _value => super._value as _SearchChannel; + + @override + $Res call({ + Object? playlistId = freezed, + Object? playlistTitle = freezed, + Object? playlistVideoCount = freezed, + }) { + return _then(_SearchChannel( + playlistId == freezed + ? _value.playlistId + : playlistId // ignore: cast_nullable_to_non_nullable + as PlaylistId, + playlistTitle == freezed + ? _value.playlistTitle + : playlistTitle // ignore: cast_nullable_to_non_nullable + as String, + playlistVideoCount == freezed + ? _value.playlistVideoCount + : playlistVideoCount // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc + +@With(BaseSearchContent) +class _$_SearchChannel with BaseSearchContent implements _SearchChannel { + const _$_SearchChannel( + this.playlistId, this.playlistTitle, this.playlistVideoCount); + + @override + + /// PlaylistId. + final PlaylistId playlistId; + @override + + /// Playlist title. + final String playlistTitle; + @override + + /// Playlist video count, cannot be greater than 50. + final int playlistVideoCount; + + @override + String toString() { + return 'SearchPlaylist(playlistId: $playlistId, playlistTitle: $playlistTitle, playlistVideoCount: $playlistVideoCount)'; + } + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other is _SearchChannel && + (identical(other.playlistId, playlistId) || + const DeepCollectionEquality() + .equals(other.playlistId, playlistId)) && + (identical(other.playlistTitle, playlistTitle) || + const DeepCollectionEquality() + .equals(other.playlistTitle, playlistTitle)) && + (identical(other.playlistVideoCount, playlistVideoCount) || + const DeepCollectionEquality() + .equals(other.playlistVideoCount, playlistVideoCount))); + } + + @override + int get hashCode => + runtimeType.hashCode ^ + const DeepCollectionEquality().hash(playlistId) ^ + const DeepCollectionEquality().hash(playlistTitle) ^ + const DeepCollectionEquality().hash(playlistVideoCount); + + @JsonKey(ignore: true) + @override + _$SearchChannelCopyWith<_SearchChannel> get copyWith => + __$SearchChannelCopyWithImpl<_SearchChannel>(this, _$identity); +} + +abstract class _SearchChannel implements SearchPlaylist, BaseSearchContent { + const factory _SearchChannel( + PlaylistId playlistId, String playlistTitle, int playlistVideoCount) = + _$_SearchChannel; + + @override + + /// PlaylistId. + PlaylistId get playlistId => throw _privateConstructorUsedError; + @override + + /// Playlist title. + String get playlistTitle => throw _privateConstructorUsedError; + @override + + /// Playlist video count, cannot be greater than 50. + int get playlistVideoCount => throw _privateConstructorUsedError; + @override + @JsonKey(ignore: true) + _$SearchChannelCopyWith<_SearchChannel> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/search/search_video.dart b/lib/src/search/search_video.dart index 23707c9..74a8649 100644 --- a/lib/src/search/search_video.dart +++ b/lib/src/search/search_video.dart @@ -1,52 +1,45 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + import '../common/common.dart'; import '../videos/video_id.dart'; import 'base_search_content.dart'; +part 'search_video.freezed.dart'; + /// Metadata related to a search query result (video). -class SearchVideo extends BaseSearchContent { - /// Video ID. - final VideoId id; - - /// Video title. - final String title; - - /// Video author. - final String author; - - /// Video description snippet. (Part of the full description if too long) - final String description; - - /// Video duration as String, HH:MM:SS - final String duration; - - /// Video View Count - final int viewCount; - - /// Video thumbnail - final List thumbnails; - - /// Video upload date - As string: 5 years ago. - final String? uploadDate; - - /// True if this video is a live stream. - final bool isLive; - - /// Channel id - final String channelId; - +@freezed +class SearchVideo with _$SearchVideo, BaseSearchContent { /// Initialize a [SearchVideo] instance. - const SearchVideo( - this.id, - this.title, - this.author, - this.description, - this.duration, - this.viewCount, - this.thumbnails, - this.uploadDate, - this.isLive, // ignore: avoid_positional_boolean_parameters - this.channelId); + @With(BaseSearchContent) + const factory SearchVideo( + /// Video ID. + VideoId id, - @override - String toString() => '(Video) $title ($id)'; + /// Video title. + String title, + + /// Video author. + String author, + + /// Video description snippet. (Part of the full description if too long) + String description, + + /// Video duration as String, HH:MM:SS + String duration, + + /// Video View Count + int viewCount, + + /// Video thumbnail + List thumbnails, + + /// Video upload date - As string: 5 years ago. + String? uploadDate, + + /// True if this video is a live stream. + bool isLive, + + /// Channel id + String channelId, + ) = _SearchVideo; } diff --git a/lib/src/search/search_video.freezed.dart b/lib/src/search/search_video.freezed.dart new file mode 100644 index 0000000..14ff204 --- /dev/null +++ b/lib/src/search/search_video.freezed.dart @@ -0,0 +1,440 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// 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'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + +/// @nodoc +class _$SearchVideoTearOff { + const _$SearchVideoTearOff(); + + _SearchVideo call( + VideoId id, + String title, + String author, + String description, + String duration, + int viewCount, + List thumbnails, + String? uploadDate, + bool isLive, + String channelId) { + return _SearchVideo( + id, + title, + author, + description, + duration, + viewCount, + thumbnails, + uploadDate, + isLive, + channelId, + ); + } +} + +/// @nodoc +const $SearchVideo = _$SearchVideoTearOff(); + +/// @nodoc +mixin _$SearchVideo { + /// Video ID. + VideoId get id => throw _privateConstructorUsedError; + + /// Video title. + String get title => throw _privateConstructorUsedError; + + /// Video author. + String get author => throw _privateConstructorUsedError; + + /// Video description snippet. (Part of the full description if too long) + String get description => throw _privateConstructorUsedError; + + /// Video duration as String, HH:MM:SS + String get duration => throw _privateConstructorUsedError; + + /// Video View Count + int get viewCount => throw _privateConstructorUsedError; + + /// Video thumbnail + List get thumbnails => throw _privateConstructorUsedError; + + /// Video upload date - As string: 5 years ago. + String? get uploadDate => throw _privateConstructorUsedError; + + /// True if this video is a live stream. + bool get isLive => throw _privateConstructorUsedError; + + /// Channel id + String get channelId => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $SearchVideoCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SearchVideoCopyWith<$Res> { + factory $SearchVideoCopyWith( + SearchVideo value, $Res Function(SearchVideo) then) = + _$SearchVideoCopyWithImpl<$Res>; + $Res call( + {VideoId id, + String title, + String author, + String description, + String duration, + int viewCount, + List thumbnails, + String? uploadDate, + bool isLive, + String channelId}); + + $VideoIdCopyWith<$Res> get id; +} + +/// @nodoc +class _$SearchVideoCopyWithImpl<$Res> implements $SearchVideoCopyWith<$Res> { + _$SearchVideoCopyWithImpl(this._value, this._then); + + final SearchVideo _value; + // ignore: unused_field + final $Res Function(SearchVideo) _then; + + @override + $Res call({ + Object? id = freezed, + Object? title = freezed, + Object? author = freezed, + Object? description = freezed, + Object? duration = freezed, + Object? viewCount = freezed, + Object? thumbnails = freezed, + Object? uploadDate = freezed, + Object? isLive = freezed, + Object? channelId = freezed, + }) { + return _then(_value.copyWith( + id: id == freezed + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as VideoId, + title: title == freezed + ? _value.title + : title // ignore: cast_nullable_to_non_nullable + as String, + author: author == freezed + ? _value.author + : author // ignore: cast_nullable_to_non_nullable + as String, + description: description == freezed + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String, + duration: duration == freezed + ? _value.duration + : duration // ignore: cast_nullable_to_non_nullable + as String, + viewCount: viewCount == freezed + ? _value.viewCount + : viewCount // ignore: cast_nullable_to_non_nullable + as int, + thumbnails: thumbnails == freezed + ? _value.thumbnails + : thumbnails // ignore: cast_nullable_to_non_nullable + as List, + uploadDate: uploadDate == freezed + ? _value.uploadDate + : uploadDate // ignore: cast_nullable_to_non_nullable + as String?, + isLive: isLive == freezed + ? _value.isLive + : isLive // ignore: cast_nullable_to_non_nullable + as bool, + channelId: channelId == freezed + ? _value.channelId + : channelId // ignore: cast_nullable_to_non_nullable + as String, + )); + } + + @override + $VideoIdCopyWith<$Res> get id { + return $VideoIdCopyWith<$Res>(_value.id, (value) { + return _then(_value.copyWith(id: value)); + }); + } +} + +/// @nodoc +abstract class _$SearchVideoCopyWith<$Res> + implements $SearchVideoCopyWith<$Res> { + factory _$SearchVideoCopyWith( + _SearchVideo value, $Res Function(_SearchVideo) then) = + __$SearchVideoCopyWithImpl<$Res>; + @override + $Res call( + {VideoId id, + String title, + String author, + String description, + String duration, + int viewCount, + List thumbnails, + String? uploadDate, + bool isLive, + String channelId}); + + @override + $VideoIdCopyWith<$Res> get id; +} + +/// @nodoc +class __$SearchVideoCopyWithImpl<$Res> extends _$SearchVideoCopyWithImpl<$Res> + implements _$SearchVideoCopyWith<$Res> { + __$SearchVideoCopyWithImpl( + _SearchVideo _value, $Res Function(_SearchVideo) _then) + : super(_value, (v) => _then(v as _SearchVideo)); + + @override + _SearchVideo get _value => super._value as _SearchVideo; + + @override + $Res call({ + Object? id = freezed, + Object? title = freezed, + Object? author = freezed, + Object? description = freezed, + Object? duration = freezed, + Object? viewCount = freezed, + Object? thumbnails = freezed, + Object? uploadDate = freezed, + Object? isLive = freezed, + Object? channelId = freezed, + }) { + return _then(_SearchVideo( + id == freezed + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as VideoId, + title == freezed + ? _value.title + : title // ignore: cast_nullable_to_non_nullable + as String, + author == freezed + ? _value.author + : author // ignore: cast_nullable_to_non_nullable + as String, + description == freezed + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String, + duration == freezed + ? _value.duration + : duration // ignore: cast_nullable_to_non_nullable + as String, + viewCount == freezed + ? _value.viewCount + : viewCount // ignore: cast_nullable_to_non_nullable + as int, + thumbnails == freezed + ? _value.thumbnails + : thumbnails // ignore: cast_nullable_to_non_nullable + as List, + uploadDate == freezed + ? _value.uploadDate + : uploadDate // ignore: cast_nullable_to_non_nullable + as String?, + isLive == freezed + ? _value.isLive + : isLive // ignore: cast_nullable_to_non_nullable + as bool, + channelId == freezed + ? _value.channelId + : channelId // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +@With(BaseSearchContent) +class _$_SearchVideo with BaseSearchContent implements _SearchVideo { + const _$_SearchVideo( + this.id, + this.title, + this.author, + this.description, + this.duration, + this.viewCount, + this.thumbnails, + this.uploadDate, + this.isLive, + this.channelId); + + @override + + /// Video ID. + final VideoId id; + @override + + /// Video title. + final String title; + @override + + /// Video author. + final String author; + @override + + /// Video description snippet. (Part of the full description if too long) + final String description; + @override + + /// Video duration as String, HH:MM:SS + final String duration; + @override + + /// Video View Count + final int viewCount; + @override + + /// Video thumbnail + final List thumbnails; + @override + + /// Video upload date - As string: 5 years ago. + final String? uploadDate; + @override + + /// True if this video is a live stream. + final bool isLive; + @override + + /// Channel id + final String channelId; + + @override + String toString() { + return 'SearchVideo(id: $id, title: $title, author: $author, description: $description, duration: $duration, viewCount: $viewCount, thumbnails: $thumbnails, uploadDate: $uploadDate, isLive: $isLive, channelId: $channelId)'; + } + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other is _SearchVideo && + (identical(other.id, id) || + const DeepCollectionEquality().equals(other.id, id)) && + (identical(other.title, title) || + const DeepCollectionEquality().equals(other.title, title)) && + (identical(other.author, author) || + const DeepCollectionEquality().equals(other.author, author)) && + (identical(other.description, description) || + const DeepCollectionEquality() + .equals(other.description, description)) && + (identical(other.duration, duration) || + const DeepCollectionEquality() + .equals(other.duration, duration)) && + (identical(other.viewCount, viewCount) || + const DeepCollectionEquality() + .equals(other.viewCount, viewCount)) && + (identical(other.thumbnails, thumbnails) || + const DeepCollectionEquality() + .equals(other.thumbnails, thumbnails)) && + (identical(other.uploadDate, uploadDate) || + const DeepCollectionEquality() + .equals(other.uploadDate, uploadDate)) && + (identical(other.isLive, isLive) || + const DeepCollectionEquality().equals(other.isLive, isLive)) && + (identical(other.channelId, channelId) || + const DeepCollectionEquality() + .equals(other.channelId, channelId))); + } + + @override + int get hashCode => + runtimeType.hashCode ^ + const DeepCollectionEquality().hash(id) ^ + const DeepCollectionEquality().hash(title) ^ + const DeepCollectionEquality().hash(author) ^ + const DeepCollectionEquality().hash(description) ^ + const DeepCollectionEquality().hash(duration) ^ + const DeepCollectionEquality().hash(viewCount) ^ + const DeepCollectionEquality().hash(thumbnails) ^ + const DeepCollectionEquality().hash(uploadDate) ^ + const DeepCollectionEquality().hash(isLive) ^ + const DeepCollectionEquality().hash(channelId); + + @JsonKey(ignore: true) + @override + _$SearchVideoCopyWith<_SearchVideo> get copyWith => + __$SearchVideoCopyWithImpl<_SearchVideo>(this, _$identity); +} + +abstract class _SearchVideo implements SearchVideo, BaseSearchContent { + const factory _SearchVideo( + VideoId id, + String title, + String author, + String description, + String duration, + int viewCount, + List thumbnails, + String? uploadDate, + bool isLive, + String channelId) = _$_SearchVideo; + + @override + + /// Video ID. + VideoId get id => throw _privateConstructorUsedError; + @override + + /// Video title. + String get title => throw _privateConstructorUsedError; + @override + + /// Video author. + String get author => throw _privateConstructorUsedError; + @override + + /// Video description snippet. (Part of the full description if too long) + String get description => throw _privateConstructorUsedError; + @override + + /// Video duration as String, HH:MM:SS + String get duration => throw _privateConstructorUsedError; + @override + + /// Video View Count + int get viewCount => throw _privateConstructorUsedError; + @override + + /// Video thumbnail + List get thumbnails => throw _privateConstructorUsedError; + @override + + /// Video upload date - As string: 5 years ago. + String? get uploadDate => throw _privateConstructorUsedError; + @override + + /// True if this video is a live stream. + bool get isLive => throw _privateConstructorUsedError; + @override + + /// Channel id + String get channelId => throw _privateConstructorUsedError; + @override + @JsonKey(ignore: true) + _$SearchVideoCopyWith<_SearchVideo> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/videos/closed_captions/closed_caption.g.dart b/lib/src/videos/closed_captions/closed_caption.g.dart index f560c03..4845790 100644 --- a/lib/src/videos/closed_captions/closed_caption.g.dart +++ b/lib/src/videos/closed_captions/closed_caption.g.dart @@ -6,15 +6,14 @@ part of 'closed_caption.dart'; // JsonSerializableGenerator // ************************************************************************** -ClosedCaption _$ClosedCaptionFromJson(Map json) { - return ClosedCaption( - json['text'] as String, - Duration(microseconds: json['offset'] as int), - Duration(microseconds: json['duration'] as int), - (json['parts'] as List) - .map((e) => ClosedCaptionPart.fromJson(e as Map)), - ); -} +ClosedCaption _$ClosedCaptionFromJson(Map json) => + ClosedCaption( + json['text'] as String, + Duration(microseconds: json['offset'] as int), + Duration(microseconds: json['duration'] as int), + (json['parts'] as List) + .map((e) => ClosedCaptionPart.fromJson(e as Map)), + ); Map _$ClosedCaptionToJson(ClosedCaption instance) => { diff --git a/lib/src/videos/closed_captions/closed_caption_format.g.dart b/lib/src/videos/closed_captions/closed_caption_format.g.dart index 00c9e30..7bf0ab4 100644 --- a/lib/src/videos/closed_captions/closed_caption_format.g.dart +++ b/lib/src/videos/closed_captions/closed_caption_format.g.dart @@ -6,11 +6,10 @@ part of 'closed_caption_format.dart'; // JsonSerializableGenerator // ************************************************************************** -ClosedCaptionFormat _$ClosedCaptionFormatFromJson(Map json) { - return ClosedCaptionFormat( - json['formatCode'] as String, - ); -} +ClosedCaptionFormat _$ClosedCaptionFormatFromJson(Map json) => + ClosedCaptionFormat( + json['formatCode'] as String, + ); Map _$ClosedCaptionFormatToJson( ClosedCaptionFormat instance) => diff --git a/lib/src/videos/closed_captions/closed_caption_part.g.dart b/lib/src/videos/closed_captions/closed_caption_part.g.dart index 3318ef9..3137fdf 100644 --- a/lib/src/videos/closed_captions/closed_caption_part.g.dart +++ b/lib/src/videos/closed_captions/closed_caption_part.g.dart @@ -6,12 +6,11 @@ part of 'closed_caption_part.dart'; // JsonSerializableGenerator // ************************************************************************** -ClosedCaptionPart _$ClosedCaptionPartFromJson(Map json) { - return ClosedCaptionPart( - json['text'] as String, - Duration(microseconds: json['offset'] as int), - ); -} +ClosedCaptionPart _$ClosedCaptionPartFromJson(Map json) => + ClosedCaptionPart( + json['text'] as String, + Duration(microseconds: json['offset'] as int), + ); Map _$ClosedCaptionPartToJson(ClosedCaptionPart instance) => { diff --git a/lib/src/videos/closed_captions/closed_caption_track.g.dart b/lib/src/videos/closed_captions/closed_caption_track.g.dart index fd284e7..9a0665f 100644 --- a/lib/src/videos/closed_captions/closed_caption_track.g.dart +++ b/lib/src/videos/closed_captions/closed_caption_track.g.dart @@ -6,12 +6,11 @@ part of 'closed_caption_track.dart'; // JsonSerializableGenerator // ************************************************************************** -ClosedCaptionTrack _$ClosedCaptionTrackFromJson(Map json) { - return ClosedCaptionTrack( - (json['captions'] as List) - .map((e) => ClosedCaption.fromJson(e as Map)), - ); -} +ClosedCaptionTrack _$ClosedCaptionTrackFromJson(Map json) => + ClosedCaptionTrack( + (json['captions'] as List) + .map((e) => ClosedCaption.fromJson(e as Map)), + ); Map _$ClosedCaptionTrackToJson(ClosedCaptionTrack instance) => { diff --git a/lib/src/videos/closed_captions/closed_caption_track_info.g.dart b/lib/src/videos/closed_captions/closed_caption_track_info.g.dart index 39f3938..25a57a9 100644 --- a/lib/src/videos/closed_captions/closed_caption_track_info.g.dart +++ b/lib/src/videos/closed_captions/closed_caption_track_info.g.dart @@ -7,15 +7,14 @@ part of 'closed_caption_track_info.dart'; // ************************************************************************** ClosedCaptionTrackInfo _$ClosedCaptionTrackInfoFromJson( - Map json) { - return ClosedCaptionTrackInfo( - Uri.parse(json['url'] as String), - Language.fromJson(json['language'] as Map), - isAutoGenerated: json['isAutoGenerated'] as bool, - format: - ClosedCaptionFormat.fromJson(json['format'] as Map), - ); -} + Map json) => + ClosedCaptionTrackInfo( + Uri.parse(json['url'] as String), + Language.fromJson(json['language'] as Map), + isAutoGenerated: json['isAutoGenerated'] as bool? ?? false, + format: + ClosedCaptionFormat.fromJson(json['format'] as Map), + ); Map _$ClosedCaptionTrackInfoToJson( ClosedCaptionTrackInfo instance) => diff --git a/lib/src/videos/closed_captions/language.g.dart b/lib/src/videos/closed_captions/language.g.dart index 9258bad..edd19b6 100644 --- a/lib/src/videos/closed_captions/language.g.dart +++ b/lib/src/videos/closed_captions/language.g.dart @@ -6,12 +6,10 @@ part of 'language.dart'; // JsonSerializableGenerator // ************************************************************************** -Language _$LanguageFromJson(Map json) { - return Language( - json['code'] as String, - json['name'] as String, - ); -} +Language _$LanguageFromJson(Map json) => Language( + json['code'] as String, + json['name'] as String, + ); Map _$LanguageToJson(Language instance) => { 'code': instance.code, diff --git a/lib/src/videos/comments/comment.dart b/lib/src/videos/comments/comment.dart index 5ff3e62..27bbefa 100644 --- a/lib/src/videos/comments/comment.dart +++ b/lib/src/videos/comments/comment.dart @@ -1,53 +1,41 @@ -import 'package:equatable/equatable.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; import '../../channels/channel_id.dart'; +part 'comment.freezed.dart'; + /// YouTube comment metadata. -class Comment with EquatableMixin { - /// Comment id. - final String commentId; - - /// Comment author name. - final String author; - - /// Comment author channel id. - final ChannelId channelId; - - /// Comment text. - final String text; - - /// Comment likes count. - final int likeCount; - - /// Published time as string. (For example: "2 years ago") - final String publishedTime; - - /// Comment reply count. - final int replyCount; - - /// Used internally. - /// Shouldn't be used in the code. - final String? continuation; - - /// Used internally. - /// Shouldn't be used in the code. - final String? clicktrackingParams; - +@freezed +class Comment with _$Comment { /// Initializes an instance of [Comment] - Comment( - this.commentId, - this.author, - this.channelId, - this.text, - this.likeCount, - this.publishedTime, - this.replyCount, - this.continuation, - this.clicktrackingParams); + const factory Comment( + /// Comment id. + String commentId, - @override - String toString() => 'Comment($author): $text'; + /// Comment author name. + String author, - @override - List get props => [commentId]; + /// Comment author channel id. + ChannelId channelId, + + /// Comment text. + String text, + + /// Comment likes count. + int likeCount, + + /// Published time as string. (For example: "2 years ago") + String publishedTime, + + /// Comment reply count. + int replyCount, + + /// Used internally. + /// Shouldn't be used in the code. + @internal String? continuation, + + /// Used internally. + /// Shouldn't be used in the code. + @internal String? clicktrackingParams, + ) = _Comment; } diff --git a/lib/src/videos/comments/comment.freezed.dart b/lib/src/videos/comments/comment.freezed.dart new file mode 100644 index 0000000..732a1f5 --- /dev/null +++ b/lib/src/videos/comments/comment.freezed.dart @@ -0,0 +1,417 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// 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'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + +/// @nodoc +class _$CommentTearOff { + const _$CommentTearOff(); + + _Comment call( + String commentId, + String author, + ChannelId channelId, + String text, + int likeCount, + String publishedTime, + int replyCount, + @internal String? continuation, + @internal String? clicktrackingParams) { + return _Comment( + commentId, + author, + channelId, + text, + likeCount, + publishedTime, + replyCount, + continuation, + clicktrackingParams, + ); + } +} + +/// @nodoc +const $Comment = _$CommentTearOff(); + +/// @nodoc +mixin _$Comment { + /// Comment id. + String get commentId => throw _privateConstructorUsedError; + + /// Comment author name. + String get author => throw _privateConstructorUsedError; + + /// Comment author channel id. + ChannelId get channelId => throw _privateConstructorUsedError; + + /// Comment text. + String get text => throw _privateConstructorUsedError; + + /// Comment likes count. + int get likeCount => throw _privateConstructorUsedError; + + /// Published time as string. (For example: "2 years ago") + String get publishedTime => throw _privateConstructorUsedError; + + /// Comment reply count. + int get replyCount => throw _privateConstructorUsedError; + + /// Used internally. + /// Shouldn't be used in the code. + @internal + String? get continuation => throw _privateConstructorUsedError; + + /// Used internally. + /// Shouldn't be used in the code. + @internal + String? get clicktrackingParams => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $CommentCopyWith get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $CommentCopyWith<$Res> { + factory $CommentCopyWith(Comment value, $Res Function(Comment) then) = + _$CommentCopyWithImpl<$Res>; + $Res call( + {String commentId, + String author, + ChannelId channelId, + String text, + int likeCount, + String publishedTime, + int replyCount, + @internal String? continuation, + @internal String? clicktrackingParams}); + + $ChannelIdCopyWith<$Res> get channelId; +} + +/// @nodoc +class _$CommentCopyWithImpl<$Res> implements $CommentCopyWith<$Res> { + _$CommentCopyWithImpl(this._value, this._then); + + final Comment _value; + // ignore: unused_field + final $Res Function(Comment) _then; + + @override + $Res call({ + Object? commentId = freezed, + Object? author = freezed, + Object? channelId = freezed, + Object? text = freezed, + Object? likeCount = freezed, + Object? publishedTime = freezed, + Object? replyCount = freezed, + Object? continuation = freezed, + Object? clicktrackingParams = freezed, + }) { + return _then(_value.copyWith( + commentId: commentId == freezed + ? _value.commentId + : commentId // ignore: cast_nullable_to_non_nullable + as String, + author: author == freezed + ? _value.author + : author // ignore: cast_nullable_to_non_nullable + as String, + channelId: channelId == freezed + ? _value.channelId + : channelId // ignore: cast_nullable_to_non_nullable + as ChannelId, + text: text == freezed + ? _value.text + : text // ignore: cast_nullable_to_non_nullable + as String, + likeCount: likeCount == freezed + ? _value.likeCount + : likeCount // ignore: cast_nullable_to_non_nullable + as int, + publishedTime: publishedTime == freezed + ? _value.publishedTime + : publishedTime // ignore: cast_nullable_to_non_nullable + as String, + replyCount: replyCount == freezed + ? _value.replyCount + : replyCount // ignore: cast_nullable_to_non_nullable + as int, + continuation: continuation == freezed + ? _value.continuation + : continuation // ignore: cast_nullable_to_non_nullable + as String?, + clicktrackingParams: clicktrackingParams == freezed + ? _value.clicktrackingParams + : clicktrackingParams // ignore: cast_nullable_to_non_nullable + as String?, + )); + } + + @override + $ChannelIdCopyWith<$Res> get channelId { + return $ChannelIdCopyWith<$Res>(_value.channelId, (value) { + return _then(_value.copyWith(channelId: value)); + }); + } +} + +/// @nodoc +abstract class _$CommentCopyWith<$Res> implements $CommentCopyWith<$Res> { + factory _$CommentCopyWith(_Comment value, $Res Function(_Comment) then) = + __$CommentCopyWithImpl<$Res>; + @override + $Res call( + {String commentId, + String author, + ChannelId channelId, + String text, + int likeCount, + String publishedTime, + int replyCount, + @internal String? continuation, + @internal String? clicktrackingParams}); + + @override + $ChannelIdCopyWith<$Res> get channelId; +} + +/// @nodoc +class __$CommentCopyWithImpl<$Res> extends _$CommentCopyWithImpl<$Res> + implements _$CommentCopyWith<$Res> { + __$CommentCopyWithImpl(_Comment _value, $Res Function(_Comment) _then) + : super(_value, (v) => _then(v as _Comment)); + + @override + _Comment get _value => super._value as _Comment; + + @override + $Res call({ + Object? commentId = freezed, + Object? author = freezed, + Object? channelId = freezed, + Object? text = freezed, + Object? likeCount = freezed, + Object? publishedTime = freezed, + Object? replyCount = freezed, + Object? continuation = freezed, + Object? clicktrackingParams = freezed, + }) { + return _then(_Comment( + commentId == freezed + ? _value.commentId + : commentId // ignore: cast_nullable_to_non_nullable + as String, + author == freezed + ? _value.author + : author // ignore: cast_nullable_to_non_nullable + as String, + channelId == freezed + ? _value.channelId + : channelId // ignore: cast_nullable_to_non_nullable + as ChannelId, + text == freezed + ? _value.text + : text // ignore: cast_nullable_to_non_nullable + as String, + likeCount == freezed + ? _value.likeCount + : likeCount // ignore: cast_nullable_to_non_nullable + as int, + publishedTime == freezed + ? _value.publishedTime + : publishedTime // ignore: cast_nullable_to_non_nullable + as String, + replyCount == freezed + ? _value.replyCount + : replyCount // ignore: cast_nullable_to_non_nullable + as int, + continuation == freezed + ? _value.continuation + : continuation // ignore: cast_nullable_to_non_nullable + as String?, + clicktrackingParams == freezed + ? _value.clicktrackingParams + : clicktrackingParams // ignore: cast_nullable_to_non_nullable + as String?, + )); + } +} + +/// @nodoc + +class _$_Comment implements _Comment { + const _$_Comment( + this.commentId, + this.author, + this.channelId, + this.text, + this.likeCount, + this.publishedTime, + this.replyCount, + @internal this.continuation, + @internal this.clicktrackingParams); + + @override + + /// Comment id. + final String commentId; + @override + + /// Comment author name. + final String author; + @override + + /// Comment author channel id. + final ChannelId channelId; + @override + + /// Comment text. + final String text; + @override + + /// Comment likes count. + final int likeCount; + @override + + /// Published time as string. (For example: "2 years ago") + final String publishedTime; + @override + + /// Comment reply count. + final int replyCount; + @override + + /// Used internally. + /// Shouldn't be used in the code. + @internal + final String? continuation; + @override + + /// Used internally. + /// Shouldn't be used in the code. + @internal + final String? clicktrackingParams; + + @override + String toString() { + return 'Comment(commentId: $commentId, author: $author, channelId: $channelId, text: $text, likeCount: $likeCount, publishedTime: $publishedTime, replyCount: $replyCount, continuation: $continuation, clicktrackingParams: $clicktrackingParams)'; + } + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other is _Comment && + (identical(other.commentId, commentId) || + const DeepCollectionEquality() + .equals(other.commentId, commentId)) && + (identical(other.author, author) || + const DeepCollectionEquality().equals(other.author, author)) && + (identical(other.channelId, channelId) || + const DeepCollectionEquality() + .equals(other.channelId, channelId)) && + (identical(other.text, text) || + const DeepCollectionEquality().equals(other.text, text)) && + (identical(other.likeCount, likeCount) || + const DeepCollectionEquality() + .equals(other.likeCount, likeCount)) && + (identical(other.publishedTime, publishedTime) || + const DeepCollectionEquality() + .equals(other.publishedTime, publishedTime)) && + (identical(other.replyCount, replyCount) || + const DeepCollectionEquality() + .equals(other.replyCount, replyCount)) && + (identical(other.continuation, continuation) || + const DeepCollectionEquality() + .equals(other.continuation, continuation)) && + (identical(other.clicktrackingParams, clicktrackingParams) || + const DeepCollectionEquality() + .equals(other.clicktrackingParams, clicktrackingParams))); + } + + @override + int get hashCode => + runtimeType.hashCode ^ + const DeepCollectionEquality().hash(commentId) ^ + const DeepCollectionEquality().hash(author) ^ + const DeepCollectionEquality().hash(channelId) ^ + const DeepCollectionEquality().hash(text) ^ + const DeepCollectionEquality().hash(likeCount) ^ + const DeepCollectionEquality().hash(publishedTime) ^ + const DeepCollectionEquality().hash(replyCount) ^ + const DeepCollectionEquality().hash(continuation) ^ + const DeepCollectionEquality().hash(clicktrackingParams); + + @JsonKey(ignore: true) + @override + _$CommentCopyWith<_Comment> get copyWith => + __$CommentCopyWithImpl<_Comment>(this, _$identity); +} + +abstract class _Comment implements Comment { + const factory _Comment( + String commentId, + String author, + ChannelId channelId, + String text, + int likeCount, + String publishedTime, + int replyCount, + @internal String? continuation, + @internal String? clicktrackingParams) = _$_Comment; + + @override + + /// Comment id. + String get commentId => throw _privateConstructorUsedError; + @override + + /// Comment author name. + String get author => throw _privateConstructorUsedError; + @override + + /// Comment author channel id. + ChannelId get channelId => throw _privateConstructorUsedError; + @override + + /// Comment text. + String get text => throw _privateConstructorUsedError; + @override + + /// Comment likes count. + int get likeCount => throw _privateConstructorUsedError; + @override + + /// Published time as string. (For example: "2 years ago") + String get publishedTime => throw _privateConstructorUsedError; + @override + + /// Comment reply count. + int get replyCount => throw _privateConstructorUsedError; + @override + + /// Used internally. + /// Shouldn't be used in the code. + @internal + String? get continuation => throw _privateConstructorUsedError; + @override + + /// Used internally. + /// Shouldn't be used in the code. + @internal + String? get clicktrackingParams => throw _privateConstructorUsedError; + @override + @JsonKey(ignore: true) + _$CommentCopyWith<_Comment> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/videos/streams/bitrate.dart b/lib/src/videos/streams/bitrate.dart index c3dc265..a48bef9 100644 --- a/lib/src/videos/streams/bitrate.dart +++ b/lib/src/videos/streams/bitrate.dart @@ -1,10 +1,10 @@ -import 'package:equatable/equatable.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'bitrate.freezed.dart'; /// Encapsulates bitrate. -class Bitrate extends Comparable with EquatableMixin { - /// Bits per second. - final int bitsPerSecond; - +@freezed +class Bitrate with Comparable, _$Bitrate { /// Kilobits per second. double get kiloBitsPerSecond => bitsPerSecond / 1024; @@ -15,7 +15,13 @@ class Bitrate extends Comparable with EquatableMixin { double get gigaBitsPerSecond => megaBitsPerSecond / 1024; /// Initializes an instance of [Bitrate] - Bitrate(this.bitsPerSecond); + @With.fromString('Comparable') + const factory Bitrate( + + /// Bits per second. + int bitsPerSecond) = _Bitrate; + + const Bitrate._(); @override int compareTo(Bitrate other) => bitsPerSecond.compareTo(other.bitsPerSecond); diff --git a/lib/src/videos/streams/bitrate.freezed.dart b/lib/src/videos/streams/bitrate.freezed.dart new file mode 100644 index 0000000..2ca9267 --- /dev/null +++ b/lib/src/videos/streams/bitrate.freezed.dart @@ -0,0 +1,138 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// 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'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + +/// @nodoc +class _$BitrateTearOff { + const _$BitrateTearOff(); + + _Bitrate call(int bitsPerSecond) { + return _Bitrate( + bitsPerSecond, + ); + } +} + +/// @nodoc +const $Bitrate = _$BitrateTearOff(); + +/// @nodoc +mixin _$Bitrate { + /// Bits per second. + int get bitsPerSecond => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $BitrateCopyWith get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $BitrateCopyWith<$Res> { + factory $BitrateCopyWith(Bitrate value, $Res Function(Bitrate) then) = + _$BitrateCopyWithImpl<$Res>; + $Res call({int bitsPerSecond}); +} + +/// @nodoc +class _$BitrateCopyWithImpl<$Res> implements $BitrateCopyWith<$Res> { + _$BitrateCopyWithImpl(this._value, this._then); + + final Bitrate _value; + // ignore: unused_field + final $Res Function(Bitrate) _then; + + @override + $Res call({ + Object? bitsPerSecond = freezed, + }) { + return _then(_value.copyWith( + bitsPerSecond: bitsPerSecond == freezed + ? _value.bitsPerSecond + : bitsPerSecond // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc +abstract class _$BitrateCopyWith<$Res> implements $BitrateCopyWith<$Res> { + factory _$BitrateCopyWith(_Bitrate value, $Res Function(_Bitrate) then) = + __$BitrateCopyWithImpl<$Res>; + @override + $Res call({int bitsPerSecond}); +} + +/// @nodoc +class __$BitrateCopyWithImpl<$Res> extends _$BitrateCopyWithImpl<$Res> + implements _$BitrateCopyWith<$Res> { + __$BitrateCopyWithImpl(_Bitrate _value, $Res Function(_Bitrate) _then) + : super(_value, (v) => _then(v as _Bitrate)); + + @override + _Bitrate get _value => super._value as _Bitrate; + + @override + $Res call({ + Object? bitsPerSecond = freezed, + }) { + return _then(_Bitrate( + bitsPerSecond == freezed + ? _value.bitsPerSecond + : bitsPerSecond // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc + +@With.fromString('Comparable') +class _$_Bitrate extends _Bitrate with Comparable { + const _$_Bitrate(this.bitsPerSecond) : super._(); + + @override + + /// Bits per second. + final int bitsPerSecond; + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other is _Bitrate && + (identical(other.bitsPerSecond, bitsPerSecond) || + const DeepCollectionEquality() + .equals(other.bitsPerSecond, bitsPerSecond))); + } + + @override + int get hashCode => + runtimeType.hashCode ^ const DeepCollectionEquality().hash(bitsPerSecond); + + @JsonKey(ignore: true) + @override + _$BitrateCopyWith<_Bitrate> get copyWith => + __$BitrateCopyWithImpl<_Bitrate>(this, _$identity); +} + +abstract class _Bitrate extends Bitrate implements Comparable { + const factory _Bitrate(int bitsPerSecond) = _$_Bitrate; + const _Bitrate._() : super._(); + + @override + + /// Bits per second. + int get bitsPerSecond => throw _privateConstructorUsedError; + @override + @JsonKey(ignore: true) + _$BitrateCopyWith<_Bitrate> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/videos/streams/filesize.dart b/lib/src/videos/streams/filesize.dart index eb2887e..c01c4dd 100644 --- a/lib/src/videos/streams/filesize.dart +++ b/lib/src/videos/streams/filesize.dart @@ -1,10 +1,10 @@ -import 'package:equatable/equatable.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'filesize.freezed.dart'; /// Encapsulates file size. -class FileSize extends Comparable with EquatableMixin { - /// Total bytes. - final int totalBytes; - +@freezed +class FileSize with Comparable, _$FileSize { /// Total kilobytes. double get totalKiloBytes => totalBytes / 1024; @@ -15,7 +15,13 @@ class FileSize extends Comparable with EquatableMixin { double get totalGigaBytes => totalMegaBytes / 1024; /// Initializes an instance of [FileSize] - FileSize(this.totalBytes); + @With.fromString('Comparable') + const factory FileSize( + + /// Total bytes. + int totalBytes) = _FileSize; + + const FileSize._(); @override int compareTo(FileSize other) => totalBytes.compareTo(other.totalBytes); @@ -48,7 +54,4 @@ class FileSize extends Comparable with EquatableMixin { @override String toString() => '${_getLargestValue()} ${_getLargestSymbol()}'; - - @override - List get props => [totalBytes]; } diff --git a/lib/src/videos/streams/filesize.freezed.dart b/lib/src/videos/streams/filesize.freezed.dart new file mode 100644 index 0000000..0ef2aab --- /dev/null +++ b/lib/src/videos/streams/filesize.freezed.dart @@ -0,0 +1,139 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// 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'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + +/// @nodoc +class _$FileSizeTearOff { + const _$FileSizeTearOff(); + + _FileSize call(int totalBytes) { + return _FileSize( + totalBytes, + ); + } +} + +/// @nodoc +const $FileSize = _$FileSizeTearOff(); + +/// @nodoc +mixin _$FileSize { + /// Total bytes. + int get totalBytes => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $FileSizeCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $FileSizeCopyWith<$Res> { + factory $FileSizeCopyWith(FileSize value, $Res Function(FileSize) then) = + _$FileSizeCopyWithImpl<$Res>; + $Res call({int totalBytes}); +} + +/// @nodoc +class _$FileSizeCopyWithImpl<$Res> implements $FileSizeCopyWith<$Res> { + _$FileSizeCopyWithImpl(this._value, this._then); + + final FileSize _value; + // ignore: unused_field + final $Res Function(FileSize) _then; + + @override + $Res call({ + Object? totalBytes = freezed, + }) { + return _then(_value.copyWith( + totalBytes: totalBytes == freezed + ? _value.totalBytes + : totalBytes // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc +abstract class _$FileSizeCopyWith<$Res> implements $FileSizeCopyWith<$Res> { + factory _$FileSizeCopyWith(_FileSize value, $Res Function(_FileSize) then) = + __$FileSizeCopyWithImpl<$Res>; + @override + $Res call({int totalBytes}); +} + +/// @nodoc +class __$FileSizeCopyWithImpl<$Res> extends _$FileSizeCopyWithImpl<$Res> + implements _$FileSizeCopyWith<$Res> { + __$FileSizeCopyWithImpl(_FileSize _value, $Res Function(_FileSize) _then) + : super(_value, (v) => _then(v as _FileSize)); + + @override + _FileSize get _value => super._value as _FileSize; + + @override + $Res call({ + Object? totalBytes = freezed, + }) { + return _then(_FileSize( + totalBytes == freezed + ? _value.totalBytes + : totalBytes // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc + +@With.fromString('Comparable') +class _$_FileSize extends _FileSize with Comparable { + const _$_FileSize(this.totalBytes) : super._(); + + @override + + /// Total bytes. + final int totalBytes; + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other is _FileSize && + (identical(other.totalBytes, totalBytes) || + const DeepCollectionEquality() + .equals(other.totalBytes, totalBytes))); + } + + @override + int get hashCode => + runtimeType.hashCode ^ const DeepCollectionEquality().hash(totalBytes); + + @JsonKey(ignore: true) + @override + _$FileSizeCopyWith<_FileSize> get copyWith => + __$FileSizeCopyWithImpl<_FileSize>(this, _$identity); +} + +abstract class _FileSize extends FileSize implements Comparable { + const factory _FileSize(int totalBytes) = _$_FileSize; + const _FileSize._() : super._(); + + @override + + /// Total bytes. + int get totalBytes => throw _privateConstructorUsedError; + @override + @JsonKey(ignore: true) + _$FileSizeCopyWith<_FileSize> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/videos/streams/framerate.dart b/lib/src/videos/streams/framerate.dart index bd0c32a..5ee9777 100644 --- a/lib/src/videos/streams/framerate.dart +++ b/lib/src/videos/streams/framerate.dart @@ -1,12 +1,17 @@ -import 'package:equatable/equatable.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'framerate.freezed.dart'; /// Encapsulates framerate. -class Framerate extends Comparable with EquatableMixin { - /// Framerate as frames per second - final num framesPerSecond; - +@freezed +class Framerate with Comparable, _$Framerate { /// Initialize an instance of [Framerate] - Framerate(this.framesPerSecond); + const factory Framerate( + + /// Framerate as frames per second + num framesPerSecond) = _Framerate; + + const Framerate._(); /// bool operator >(Framerate other) => framesPerSecond > other.framesPerSecond; @@ -17,9 +22,6 @@ class Framerate extends Comparable with EquatableMixin { @override String toString() => '$framesPerSecond FPS'; - @override - List get props => [framesPerSecond]; - @override int compareTo(Framerate other) => framesPerSecond.compareTo(other.framesPerSecond); diff --git a/lib/src/videos/streams/framerate.freezed.dart b/lib/src/videos/streams/framerate.freezed.dart new file mode 100644 index 0000000..50c0b3c --- /dev/null +++ b/lib/src/videos/streams/framerate.freezed.dart @@ -0,0 +1,140 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// 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'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + +/// @nodoc +class _$FramerateTearOff { + const _$FramerateTearOff(); + + _Framerate call(num framesPerSecond) { + return _Framerate( + framesPerSecond, + ); + } +} + +/// @nodoc +const $Framerate = _$FramerateTearOff(); + +/// @nodoc +mixin _$Framerate { + /// Framerate as frames per second + num get framesPerSecond => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $FramerateCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $FramerateCopyWith<$Res> { + factory $FramerateCopyWith(Framerate value, $Res Function(Framerate) then) = + _$FramerateCopyWithImpl<$Res>; + $Res call({num framesPerSecond}); +} + +/// @nodoc +class _$FramerateCopyWithImpl<$Res> implements $FramerateCopyWith<$Res> { + _$FramerateCopyWithImpl(this._value, this._then); + + final Framerate _value; + // ignore: unused_field + final $Res Function(Framerate) _then; + + @override + $Res call({ + Object? framesPerSecond = freezed, + }) { + return _then(_value.copyWith( + framesPerSecond: framesPerSecond == freezed + ? _value.framesPerSecond + : framesPerSecond // ignore: cast_nullable_to_non_nullable + as num, + )); + } +} + +/// @nodoc +abstract class _$FramerateCopyWith<$Res> implements $FramerateCopyWith<$Res> { + factory _$FramerateCopyWith( + _Framerate value, $Res Function(_Framerate) then) = + __$FramerateCopyWithImpl<$Res>; + @override + $Res call({num framesPerSecond}); +} + +/// @nodoc +class __$FramerateCopyWithImpl<$Res> extends _$FramerateCopyWithImpl<$Res> + implements _$FramerateCopyWith<$Res> { + __$FramerateCopyWithImpl(_Framerate _value, $Res Function(_Framerate) _then) + : super(_value, (v) => _then(v as _Framerate)); + + @override + _Framerate get _value => super._value as _Framerate; + + @override + $Res call({ + Object? framesPerSecond = freezed, + }) { + return _then(_Framerate( + framesPerSecond == freezed + ? _value.framesPerSecond + : framesPerSecond // ignore: cast_nullable_to_non_nullable + as num, + )); + } +} + +/// @nodoc + +class _$_Framerate extends _Framerate { + const _$_Framerate(this.framesPerSecond) : super._(); + + @override + + /// Framerate as frames per second + final num framesPerSecond; + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other is _Framerate && + (identical(other.framesPerSecond, framesPerSecond) || + const DeepCollectionEquality() + .equals(other.framesPerSecond, framesPerSecond))); + } + + @override + int get hashCode => + runtimeType.hashCode ^ + const DeepCollectionEquality().hash(framesPerSecond); + + @JsonKey(ignore: true) + @override + _$FramerateCopyWith<_Framerate> get copyWith => + __$FramerateCopyWithImpl<_Framerate>(this, _$identity); +} + +abstract class _Framerate extends Framerate { + const factory _Framerate(num framesPerSecond) = _$_Framerate; + const _Framerate._() : super._(); + + @override + + /// Framerate as frames per second + num get framesPerSecond => throw _privateConstructorUsedError; + @override + @JsonKey(ignore: true) + _$FramerateCopyWith<_Framerate> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/videos/streams/stream_container.dart b/lib/src/videos/streams/stream_container.dart index 8c45ce2..311454e 100644 --- a/lib/src/videos/streams/stream_container.dart +++ b/lib/src/videos/streams/stream_container.dart @@ -1,25 +1,30 @@ -import 'package:equatable/equatable.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'stream_container.freezed.dart'; /// Stream container. -class StreamContainer with EquatableMixin { - /// Container name. - /// Can be used as file extension - final String name; - +@freezed +class StreamContainer with _$StreamContainer { /// Initializes an instance of [StreamContainer] - StreamContainer._(this.name); + const factory StreamContainer._internal( + + /// Container name. + /// Can be used as file extension + String name) = _StreamContainer; + + const StreamContainer._(); /// MPEG-4 Part 14 (.mp4). - static final StreamContainer mp4 = StreamContainer._('mp4'); + static const StreamContainer mp4 = StreamContainer._internal('mp4'); /// Web Media (.webm). - static final StreamContainer webM = StreamContainer._('webm'); + static const StreamContainer webM = StreamContainer._internal('webm'); /// 3rd Generation Partnership Project (.3gpp). - static final StreamContainer tgpp = StreamContainer._('3gpp'); + static const StreamContainer tgpp = StreamContainer._internal('3gpp'); /// Parse a container from name. - static StreamContainer parse(String name) { + factory StreamContainer.parse(String name) { if (name.toLowerCase() == 'mp4') { return StreamContainer.mp4; } @@ -33,9 +38,6 @@ class StreamContainer with EquatableMixin { throw ArgumentError.value(name, 'name', 'Valid values: mp4, webm, 3gpp'); } - @override - List get props => [name]; - @override String toString() => name; } diff --git a/lib/src/videos/streams/stream_container.freezed.dart b/lib/src/videos/streams/stream_container.freezed.dart new file mode 100644 index 0000000..d1e4d68 --- /dev/null +++ b/lib/src/videos/streams/stream_container.freezed.dart @@ -0,0 +1,146 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// 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'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + +/// @nodoc +class _$StreamContainerTearOff { + const _$StreamContainerTearOff(); + + _StreamContainer _internal(String name) { + return _StreamContainer( + name, + ); + } +} + +/// @nodoc +const $StreamContainer = _$StreamContainerTearOff(); + +/// @nodoc +mixin _$StreamContainer { + /// Container name. + /// Can be used as file extension + String get name => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $StreamContainerCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $StreamContainerCopyWith<$Res> { + factory $StreamContainerCopyWith( + StreamContainer value, $Res Function(StreamContainer) then) = + _$StreamContainerCopyWithImpl<$Res>; + $Res call({String name}); +} + +/// @nodoc +class _$StreamContainerCopyWithImpl<$Res> + implements $StreamContainerCopyWith<$Res> { + _$StreamContainerCopyWithImpl(this._value, this._then); + + final StreamContainer _value; + // ignore: unused_field + final $Res Function(StreamContainer) _then; + + @override + $Res call({ + Object? name = freezed, + }) { + return _then(_value.copyWith( + name: name == freezed + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +abstract class _$StreamContainerCopyWith<$Res> + implements $StreamContainerCopyWith<$Res> { + factory _$StreamContainerCopyWith( + _StreamContainer value, $Res Function(_StreamContainer) then) = + __$StreamContainerCopyWithImpl<$Res>; + @override + $Res call({String name}); +} + +/// @nodoc +class __$StreamContainerCopyWithImpl<$Res> + extends _$StreamContainerCopyWithImpl<$Res> + implements _$StreamContainerCopyWith<$Res> { + __$StreamContainerCopyWithImpl( + _StreamContainer _value, $Res Function(_StreamContainer) _then) + : super(_value, (v) => _then(v as _StreamContainer)); + + @override + _StreamContainer get _value => super._value as _StreamContainer; + + @override + $Res call({ + Object? name = freezed, + }) { + return _then(_StreamContainer( + name == freezed + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$_StreamContainer extends _StreamContainer { + const _$_StreamContainer(this.name) : super._(); + + @override + + /// Container name. + /// Can be used as file extension + final String name; + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other is _StreamContainer && + (identical(other.name, name) || + const DeepCollectionEquality().equals(other.name, name))); + } + + @override + int get hashCode => + runtimeType.hashCode ^ const DeepCollectionEquality().hash(name); + + @JsonKey(ignore: true) + @override + _$StreamContainerCopyWith<_StreamContainer> get copyWith => + __$StreamContainerCopyWithImpl<_StreamContainer>(this, _$identity); +} + +abstract class _StreamContainer extends StreamContainer { + const factory _StreamContainer(String name) = _$_StreamContainer; + const _StreamContainer._() : super._(); + + @override + + /// Container name. + /// Can be used as file extension + String get name => throw _privateConstructorUsedError; + @override + @JsonKey(ignore: true) + _$StreamContainerCopyWith<_StreamContainer> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/videos/video.dart b/lib/src/videos/video.dart index e20c29d..934a47c 100644 --- a/lib/src/videos/video.dart +++ b/lib/src/videos/video.dart @@ -1,6 +1,6 @@ import 'dart:collection'; -import 'package:equatable/equatable.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:meta/meta.dart'; import '../channels/channel_id.dart'; @@ -8,77 +8,138 @@ import '../common/common.dart'; import '../reverse_engineering/responses/responses.dart'; import 'video_id.dart'; -/// YouTube video metadata. -class Video with EquatableMixin { - /// Video ID. - final VideoId id; +part 'video.freezed.dart'; +/// YouTube video metadata. +@freezed +class Video with _$Video { /// Video URL. String get url => 'https://www.youtube.com/watch?v=$id'; - /// Video title. - final String title; - - /// Video author. - final String author; - - /// Video author Id. - final ChannelId channelId; - - /// Video upload date. - /// Note: For search queries it is calculated with: - /// DateTime.now() - how much time is was published. - final DateTime? uploadDate; - - /// Video publish date. - final DateTime? publishDate; - - /// Video description. - final String description; - - /// Duration of the video. - final Duration? duration; - - /// Available thumbnails for this video. - final ThumbnailSet thumbnails; - - /// Search keywords used for this video. - final UnmodifiableListView keywords; - - /// Engagement statistics for this video. - final Engagement engagement; - - /// Returns true if this is a live stream. - final bool isLive; - - /// Used internally. - /// Shouldn't be used in the code. - @internal - final WatchPage? watchPage; - /// Returns true if the watch page is available for this video. bool get hasWatchPage => watchPage != null; - /// Initializes an instance of [Video] - Video( - this.id, - this.title, - this.author, - this.channelId, - this.uploadDate, - this.publishDate, - this.description, - this.duration, - this.thumbnails, + factory Video( + + /// Video ID. + VideoId id, + + /// Video title. + String title, + + /// Video author. + String author, + + /// Video author Id. + ChannelId channelId, + + /// Video upload date. + /// Note: For search queries it is calculated with: + /// DateTime.now() - how much time is was published. + DateTime? uploadDate, + + /// Video publish date. + DateTime? publishDate, + + /// Video description. + String description, + + /// Duration of the video. + Duration? duration, + + /// Available thumbnails for this video. + ThumbnailSet thumbnails, + + /// Search keywords used for this video. Iterable? keywords, - this.engagement, - this.isLive, // ignore: avoid_positional_boolean_parameters - [this.watchPage]) - : keywords = UnmodifiableListView(keywords ?? const []); - @override - String toString() => 'Video ($title)'; + /// Engagement statistics for this video. + Engagement engagement, - @override - List get props => [id]; + /// Returns true if this is a live stream. + //ignore: avoid_positional_boolean_parameters + bool isLive, + [ + + /// Used internally. + /// Shouldn't be used in the code. + @internal WatchPage? watchPage]) { + return Video._internal( + + /// Video ID. + id, + + /// Video title. + title, + + /// Video author. + author, + + /// Video author Id. + channelId, + + /// Video upload date. + /// Note: For search queries it is calculated with: + /// DateTime.now() - how much time is was published. + uploadDate, + + /// Video publish date. + publishDate, + description, + duration, + thumbnails, + UnmodifiableListView(keywords ?? const Iterable.empty()), + engagement, + isLive, + watchPage); + } + + /// Initializes an instance of [Video] + const factory Video._internal( + + /// Video ID. + VideoId id, + + /// Video title. + String title, + + /// Video author. + String author, + + /// Video author Id. + ChannelId channelId, + + /// Video upload date. + /// Note: For search queries it is calculated with: + /// DateTime.now() - how much time is was published. + DateTime? uploadDate, + + /// Video publish date. + DateTime? publishDate, + + /// Video description. + String description, + + /// Duration of the video. + Duration? duration, + + /// Available thumbnails for this video. + ThumbnailSet thumbnails, + + /// Search keywords used for this video. + UnmodifiableListView keywords, + + /// Engagement statistics for this video. + Engagement engagement, + + /// Returns true if this is a live stream. + //ignore: avoid_positional_boolean_parameters + bool isLive, + [ + + /// Used internally. + /// Shouldn't be used in the code. + @internal WatchPage? watchPage]) = _Video; + + const Video._(); } diff --git a/lib/src/videos/video.freezed.dart b/lib/src/videos/video.freezed.dart new file mode 100644 index 0000000..4888b5b --- /dev/null +++ b/lib/src/videos/video.freezed.dart @@ -0,0 +1,575 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// 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'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); + +/// @nodoc +class _$VideoTearOff { + const _$VideoTearOff(); + + _Video _internal( + VideoId id, + String title, + String author, + ChannelId channelId, + DateTime? uploadDate, + DateTime? publishDate, + String description, + Duration? duration, + ThumbnailSet thumbnails, + UnmodifiableListView keywords, + Engagement engagement, + bool isLive, + [@internal WatchPage? watchPage]) { + return _Video( + id, + title, + author, + channelId, + uploadDate, + publishDate, + description, + duration, + thumbnails, + keywords, + engagement, + isLive, + watchPage, + ); + } +} + +/// @nodoc +const $Video = _$VideoTearOff(); + +/// @nodoc +mixin _$Video { + /// Video ID. + VideoId get id => throw _privateConstructorUsedError; + + /// Video title. + String get title => throw _privateConstructorUsedError; + + /// Video author. + String get author => throw _privateConstructorUsedError; + + /// Video author Id. + ChannelId get channelId => throw _privateConstructorUsedError; + + /// Video upload date. + /// Note: For search queries it is calculated with: + /// DateTime.now() - how much time is was published. + DateTime? get uploadDate => throw _privateConstructorUsedError; + + /// Video publish date. + DateTime? get publishDate => throw _privateConstructorUsedError; + + /// Video description. + String get description => throw _privateConstructorUsedError; + + /// Duration of the video. + Duration? get duration => throw _privateConstructorUsedError; + + /// Available thumbnails for this video. + ThumbnailSet get thumbnails => throw _privateConstructorUsedError; + + /// Search keywords used for this video. + UnmodifiableListView get keywords => + throw _privateConstructorUsedError; + + /// Engagement statistics for this video. + Engagement get engagement => throw _privateConstructorUsedError; + + /// Returns true if this is a live stream. +//ignore: avoid_positional_boolean_parameters + bool get isLive => throw _privateConstructorUsedError; + + /// Used internally. + /// Shouldn't be used in the code. + @internal + WatchPage? get watchPage => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $VideoCopyWith