[CHANGE] Implementing video fetching and deciphering

This commit is contained in:
max
2025-10-20 13:57:55 +02:00
parent 1555ae9f3d
commit 2b5e93ff8a
10 changed files with 230 additions and 8 deletions

View File

@@ -1,5 +1,7 @@
using System.Text.Json.Nodes;
using DotBased.Monads;
using HtmlAgilityPack;
using Manager.YouTube.Models.Parser;
namespace Manager.YouTube.Parsers;
@@ -31,7 +33,57 @@ public static class HtmlParser
return (json, isPremiumUser);
}
public static Result<YouTubeVideoData> GetVideoDataFromHtml(string html)
{
if (string.IsNullOrWhiteSpace(html))
{
return ResultError.Fail("html cannot be empty!");
}
var htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(html);
const string initialYoutubeData = "var ytInitialPlayerResponse = {";
var initialPlayerDataNode = htmlDocument.DocumentNode.SelectSingleNode($"//script[contains(., '{initialYoutubeData}')]");
if (string.IsNullOrWhiteSpace(initialPlayerDataNode.InnerText))
{
return ResultError.Fail("Could not find {initialPlayerData} in html script nodes!");
}
var initialPlayerDataString = ExtractJson(initialPlayerDataNode.InnerText, "var ytInitialPlayerResponse = ");
if (string.IsNullOrWhiteSpace(initialPlayerDataString))
{
return ResultError.Fail("Failed to extract initial player date from JSON.");
}
var parsedPlayerInitialData = JsonNode.Parse(initialPlayerDataString);
const string initialData = "var ytInitialData = {";
var initialDataNode = htmlDocument.DocumentNode.SelectSingleNode($"//script[contains(., '{initialData}')]");
if (string.IsNullOrWhiteSpace(initialDataNode.InnerText))
{
return ResultError.Fail("Could not find {initialData} in html script nodes!");
}
var initialDataJsonString = ExtractJson(initialDataNode.InnerText, "var ytInitialData = ");
if (string.IsNullOrWhiteSpace(initialDataJsonString))
{
return ResultError.Fail("Failed to extract initial player date from JSON.");
}
var parsedInitialData = JsonNode.Parse(initialDataJsonString);
try
{
return new YouTubeVideoData
{
YouTubePlayerData = parsedPlayerInitialData?.AsObject(),
YouTubeInitialData = parsedInitialData?.AsObject()
};
}
catch (Exception e)
{
return ResultError.Error(e, "Could not parse youtube player data.");
}
}
static string? ExtractJson(string input, string marker)
{
var start = input.IndexOf(marker, StringComparison.Ordinal);