diff --git a/Manager.YouTube/Models/YouTubeVideo.cs b/Manager.YouTube/Models/YouTubeVideo.cs index 17e263a..0d43844 100644 --- a/Manager.YouTube/Models/YouTubeVideo.cs +++ b/Manager.YouTube/Models/YouTubeVideo.cs @@ -1,34 +1,61 @@ +using System.Text.Json.Serialization; using Manager.YouTube.Models.Innertube; namespace Manager.YouTube.Models; public class YouTubeVideo { + [JsonPropertyName("videoId")] public required string VideoId { get; set; } + [JsonPropertyName("title")] public string Title { get; set; } = ""; + [JsonPropertyName("description")] public string Description { get; set; } = ""; + [JsonPropertyName("hashTags")] public string[] HashTags { get; set; } = []; + [JsonPropertyName("viewCount")] public long ViewCount { get; set; } + [JsonPropertyName("likeCount")] public long LikeCount { get; set; } + [JsonPropertyName("channelId")] public string ChannelId { get; set; } = ""; + [JsonPropertyName("author")] public string Author { get; set; } = ""; + [JsonPropertyName("playabilityStatus")] public string PlayabilityStatus { get; set; } = ""; + [JsonPropertyName("lengthSeconds")] public long LengthSeconds { get; set; } + [JsonPropertyName("isOwnerViewing")] + public bool IsOwnerViewing { get; set; } + [JsonPropertyName("allowRating")] public bool AllowRating { get; set; } + [JsonPropertyName("isCrawlable")] public bool IsCrawlable { get; set; } + [JsonPropertyName("isPrivate")] public bool IsPrivate { get; set; } + [JsonPropertyName("isUnpluggedCorpus")] public bool IsUnpluggedCorpus { get; set; } + [JsonPropertyName("isLive")] public bool IsLive { get; set; } - public bool IsFamiliySave { get; set; } + [JsonPropertyName("isFamilySafe")] + public bool IsFamilySave { get; set; } + [JsonPropertyName("availableCountries")] public string[] AvailableCountries { get; set; } = []; + [JsonPropertyName("isUnlisted")] public bool IsUnlisted { get; set; } + [JsonPropertyName("hasYpcMetadata")] public bool HasYpcMetadata { get; set; } + [JsonPropertyName("publishDate")] public DateTime PublishDate { get; set; } + [JsonPropertyName("uploadDate")] public DateTime UploadDate { get; set; } + [JsonPropertyName("isShortsEligible")] public bool IsShortsEligible { get; set; } + [JsonPropertyName("category")] public string Category { get; set; } = ""; public StreamingData StreamingData { get; set; } = new(); + [JsonPropertyName("thumbnail")] public List Thumbnails { get; set; } = []; public PlayerConfig? PlayerConfig { get; set; } diff --git a/Manager.YouTube/Parsers/Json/VideoJsonParser.cs b/Manager.YouTube/Parsers/Json/VideoJsonParser.cs new file mode 100644 index 0000000..c17465d --- /dev/null +++ b/Manager.YouTube/Parsers/Json/VideoJsonParser.cs @@ -0,0 +1,51 @@ +using System.Text.Json; +using System.Text.Json.Nodes; +using DotBased.Monads; +using Manager.YouTube.Models; +using Manager.YouTube.Models.Parser; + +namespace Manager.YouTube.Parsers.Json; + +public static class VideoJsonParser +{ + public static Result ParseVideoData(YouTubeVideoData videoData) + { + if (videoData.YouTubeInitialData == null || videoData.YouTubeInitialData.Count == 0) + { + return ResultError.Fail("No initial video data found!"); + } + + var videoDetails = videoData.YouTubeInitialData["videoDetails"]; + var microformat = videoData.YouTubeInitialData["microformat"]?["playerMicroformatRenderer"]; + if (videoDetails == null) + { + return ResultError.Fail("No video details found!"); + } + + if (microformat == null) + { + return ResultError.Fail("No microformat found!"); + } + + FlattenThumbnailArray(videoDetails); + FlattenThumbnailArray(microformat); + + + + + + var video = videoDetails.Deserialize(); + + + return ResultError.Fail("Not implemented."); + } + + private static void FlattenThumbnailArray(JsonNode node) + { + var thumbnailsArray = node["thumbnail"]?["thumbnails"]; + if (thumbnailsArray != null) + { + node["thumbnail"]?.ReplaceWith(thumbnailsArray); + } + } +} \ No newline at end of file