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 = 'https://www.youtube.com/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 = 'https://www.youtube.com/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 = int.parse(content .get('viewCountText')! .getT('simpleText')! .stripNonDigits()); 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) ?? '')); }