Technical changes to use yt-dlp instead of youtube-dl as a downloader
This commit is contained in:
@@ -1,9 +1,71 @@
|
||||
#include "Updater.h"
|
||||
|
||||
using namespace JasonPP;
|
||||
|
||||
std::string Updater::UpdateYoutubeDL()
|
||||
{
|
||||
#ifdef _WIN
|
||||
HRESULT res = URLDownloadToFileA(NULL, "https://yt-dl.org/downloads/latest/youtube-dl.exe", "youtube-dl.exe", 0, NULL);
|
||||
// Fetch rest respone for latest yt-dlp release
|
||||
CComPtr<IStream> dlStream;
|
||||
HRESULT res = URLOpenBlockingStreamA(
|
||||
nullptr,
|
||||
"https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest",
|
||||
&dlStream,
|
||||
0,
|
||||
nullptr
|
||||
);
|
||||
if (FAILED(res))
|
||||
{
|
||||
return "Error fetching latest yt-dlp release identifier. Error code: 0x" + (JasonPP::Internal::Helpers::Base10_2_X(res, "0123456789abcdef"));
|
||||
}
|
||||
|
||||
char buffer[4096];
|
||||
std::stringstream restContent;
|
||||
do
|
||||
{
|
||||
DWORD bytesRead = 0;
|
||||
res = dlStream->Read(buffer, sizeof(buffer), &bytesRead);
|
||||
|
||||
if (bytesRead)
|
||||
restContent.write(buffer, bytesRead);
|
||||
} while ((SUCCEEDED(res)) && (res != S_FALSE));
|
||||
|
||||
// Parse response
|
||||
Json json;
|
||||
try
|
||||
{
|
||||
json.Parse(restContent.str());
|
||||
}
|
||||
catch (JsonException& e)
|
||||
{
|
||||
return "Error parsing the json githubs rest api returned, whilst trying to update yt-dlp.";
|
||||
}
|
||||
|
||||
// Look for the asset in the release that's named "yt-dlp.exe"
|
||||
std::string downloadUrlLatestExe = "";
|
||||
try
|
||||
{
|
||||
const JsonArray assetsArr = json.AsJson["assets"].AsArray;
|
||||
|
||||
for (std::size_t i = 0; i < assetsArr.Size(); i++)
|
||||
{
|
||||
if (assetsArr[i].AsJson["name"] == "yt-dlp.exe")
|
||||
downloadUrlLatestExe = assetsArr[i].AsJson["browser_download_url"];
|
||||
}
|
||||
}
|
||||
catch (JsonException& e)
|
||||
{
|
||||
return "Error whilst trying to access the json key assets[n][\"name\"/\"browser_download_url\"] whilst trying to update yt-dlp.";
|
||||
}
|
||||
|
||||
if (downloadUrlLatestExe == "")
|
||||
{
|
||||
return "Error: No suitable asset found in latest release. Looking for name \"yt-dlp.exe\".";
|
||||
}
|
||||
|
||||
|
||||
// Download the latest yt-dlp.exe
|
||||
res = URLDownloadToFileA(NULL, downloadUrlLatestExe.c_str(), "yt-dlp.exe", 0, NULL);
|
||||
|
||||
if (SUCCEEDED(res))
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user