import 'package:collection/collection.dart'; import 'package:html/parser.dart' as parser; import '../../../youtube_explode_dart.dart'; import '../../extensions/helpers_extension.dart'; import '../../retry.dart'; import '../models/initial_data.dart'; import '../models/youtube_page.dart'; /// class ChannelAboutPage extends YoutubePage<_InitialData> { /// String? get description => initialData.description; /// int? get viewCount => initialData.viewCount; /// String? get joinDate => initialData.joinDate; /// String get title => initialData.title; /// List get avatar => initialData.avatar; /// String? get country => initialData.country; /// List get channelLinks => initialData.channelLinks; /// ChannelAboutPage.parse(String raw) : super(parser.parse(raw), (root) => _InitialData(root)); /// static Future get(YoutubeHttpClient httpClient, String id) { var url = 'http://127.0.0.1:8080/www.youtube.com:443/channel/$id/about?hl=en'; return retry(httpClient, () async { var raw = await httpClient.getString(url); var result = ChannelAboutPage.parse(raw); return result; }); } /// static Future getByUsername( YoutubeHttpClient httpClient, String username) { var url = 'http://127.0.0.1:8080/www.youtube.com:443/user/$username/about?hl=en'; return retry(httpClient, () async { var raw = await httpClient.getString(url); var result = ChannelAboutPage.parse(raw); return result; }); } } final _urlExp = RegExp(r'q=([^=]*)$'); class _InitialData extends InitialData { late final JsonMap content = _getContentContext(); _InitialData(JsonMap root) : super(root); JsonMap _getContentContext() { return root .get('contents')! .get('twoColumnBrowseResultsRenderer')! .getList('tabs')! .firstWhere((e) => e['tabRenderer']?['content'] != null) .get('tabRenderer')! .get('content')! .get('sectionListRenderer')! .getList('contents')! .firstOrNull! .get('itemSectionRenderer')! .getList('contents')! .firstOrNull! .get('channelAboutFullMetadataRenderer')!; } late final String? description = content.get('description')?.getT('simpleText'); late final List channelLinks = content .getList('primaryLinks') ?.map((e) => ChannelLink( e.get('title')?.getT('simpleText') ?? '', extractUrl(e .get('navigationEndpoint') ?.get('commandMetadata') ?.get('webCommandMetadata') ?.getT('url') ?? e .get('navigationEndpoint') ?.get('urlEndpoint') ?.getT('url') ?? ''), Uri.parse(e .get('icon') ?.getList('thumbnails') ?.firstOrNull ?.getT('url') ?? ''))) .toList() ?? []; late final int? viewCount = content.get('viewCountText')?.getT('simpleText')?.parseInt(); late final String? joinDate = content.get('joinedDateText')?.getList('runs')?[1].getT('text'); late final String title = content.get('title')!.getT('simpleText')!; late final List avatar = content.get('avatar')!.getList('thumbnails')!; late final String? country = content.get('country')?.getT('simpleText'); Uri extractUrl(String text) => Uri.parse(Uri.decodeFull(_urlExp.firstMatch(text)?.group(1) ?? '')); }