using System.Text.Json; using DotBased.Monads; using Manager.YouTube.Models.Innertube; namespace Manager.YouTube.Parsers.Json; public static class ChannelJsonParser { public static Result ParseJsonToChannelData(string json) { try { var doc = JsonDocument.Parse(json); var rootDoc = doc.RootElement; var channelMetadata = rootDoc .GetProperty("metadata") .GetProperty("channelMetadataRenderer"); var channelId = channelMetadata.GetProperty("externalId").GetString(); if (channelId == null) { throw new InvalidOperationException("No channel id found."); } var channel = new InnertubeChannel { Id = channelId, ChannelName = channelMetadata.GetProperty("title").ToString(), }; var microformat = rootDoc.GetProperty("microformat").GetProperty("microformatDataRenderer"); channel.AvailableCountries = microformat .GetProperty("availableCountries") .EnumerateArray() .Select(e => e.GetString()) .OfType().ToList(); channel.Description = microformat.GetProperty("description").GetString(); channel.NoIndex = microformat.GetProperty("noindex").GetBoolean(); channel.Unlisted = microformat.GetProperty("unlisted").GetBoolean(); channel.FamilySafe = microformat.GetProperty("familySafe").GetBoolean(); var avatarThumbnails = channelMetadata.GetProperty("avatar") .GetProperty("thumbnails") .EnumerateArray(); channel.AvatarImages = JsonParser.ParseImages(avatarThumbnails); var headerContent = rootDoc .GetProperty("header") .GetProperty("pageHeaderRenderer") .GetProperty("content"); channel.Handle = headerContent .GetProperty("pageHeaderViewModel") .GetProperty("metadata") .GetProperty("contentMetadataViewModel") .GetProperty("metadataRows") .EnumerateArray() .FirstOrDefault() .GetProperty("metadataParts") .EnumerateArray() .FirstOrDefault() .GetProperty("text") .GetProperty("content").GetString(); var bannerImages = headerContent .GetProperty("pageHeaderViewModel") .GetProperty("banner") .GetProperty("imageBannerViewModel") .GetProperty("image") .GetProperty("sources") .EnumerateArray(); channel.BannerImages = JsonParser.ParseImages(bannerImages); return channel; } catch (Exception e) { return ResultError.Error(e); } } }