[CHANGE] Implementing video fetching and deciphering
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user