@ernestoyoofi/yt.loader-to
Version:
An unofficial, promise-based API wrapper for `loader.to` to fetch YouTube video information and generate download links. Written in TypeScript, it's fully typed and easy to use in any Node.js project.
99 lines (98 loc) • 5.41 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = DownloadMedia;
const get_info_1 = __importDefault(require("../errors/get-info"));
const get_yt_id_1 = __importDefault(require("../yt/get-yt-id"));
const request_1 = require("../request");
const get_format_1 = __importDefault(require("../yt/get-format"));
const get_ajax_url_1 = __importDefault(require("../yt/get-ajax-url"));
const default_1 = __importDefault(require("../default"));
const download_media_1 = __importDefault(require("../errors/download-media"));
function GetProcessingDownload(hosting, idWorker, axios_config, isDebug) {
return __awaiter(this, void 0, void 0, function* () {
if (!idWorker) {
throw new download_media_1.default("Id Worker Not Found!", "ID_WORKER_NOT_FOUNDED");
}
const urlProgress = String((0, get_ajax_url_1.default)("download", String(hosting || "")) + "?id=" + idWorker);
if (isDebug) {
console.log("[Debugging GetProcessingDownload]: Get Ajax Progress:", urlProgress);
}
const requestProgress = yield (0, request_1.RequestURL)(urlProgress, axios_config);
if (isDebug) {
console.log("[Debugging GetProcessingDownload]: Progress API:", requestProgress.data);
}
const dataResult = requestProgress.data;
if ((dataResult === null || dataResult === void 0 ? void 0 : dataResult.success) != 1) {
yield new Promise((a) => setTimeout(a, 1500)); // Sleep on 1.5seconds
return yield GetProcessingDownload(hosting, idWorker, axios_config, isDebug);
}
return {
url: dataResult.download_url
};
});
}
function DownloadMedia(_a) {
return __awaiter(this, arguments, void 0, function* ({ link = "", debugging, format = "720", options = {} }) {
var _b, _c;
const validate = (0, get_yt_id_1.default)(String(link || ""));
const formatOpt = (0, get_format_1.default)(format);
const isDebug = !!(typeof debugging === "boolean" && !!debugging) ? true : false;
if (isDebug) {
console.log("[Debugging DownloadMedia]: Checking Validation Youtube:", validate);
}
if (!validate.isValid) {
throw new get_info_1.default("Link YouTube is not valid!", "INVALID_URL");
}
if (!formatOpt.format) {
throw new get_info_1.default("Format is not accepted!", "INVALID_FORMAT");
}
const loadHosting = new URL(String(options.hosting || default_1.default.hosting || "")).origin;
const urlBuild = new URLSearchParams({
url: `https://www.youtube.com/watch?v=${validate.id}`,
add_info: "1",
format: formatOpt.format
}).toString();
const urlInfo = !(options === null || options === void 0 ? void 0 : options.ajax) ? `${(0, get_ajax_url_1.default)("info", loadHosting)}?${urlBuild}`
: `${options === null || options === void 0 ? void 0 : options.ajax("info", loadHosting)}?${urlBuild}`;
if (isDebug) {
console.log("[Debugging DownloadMedia]: Ajax URL Info:", urlInfo);
}
// Get Id And Basic Information
const getInfo = yield (0, request_1.RequestURL)(urlInfo, (options.axios_config || {}));
const dataWorker = (getInfo.data || {});
const idWorker = String(dataWorker.id || "");
const cardInfo = dataWorker.additional_info ? {
image: dataWorker.additional_info.thumbnail,
title: dataWorker.additional_info.title,
description: dataWorker.additional_info.description,
views: dataWorker.additional_info.views,
id: dataWorker.additional_info.id,
link: dataWorker.additional_info.link,
creator: {
picture: dataWorker.additional_info.channel.thumbnail,
name: dataWorker.additional_info.channel.name,
username: dataWorker.additional_info.channel.handle,
id: dataWorker.additional_info.channel.id,
link: ((_b = dataWorker.additional_info.channel) === null || _b === void 0 ? void 0 : _b.link) || ((_c = dataWorker.additional_info.channel) === null || _c === void 0 ? void 0 : _c.url),
}
} : null;
const getDownloadProgress = yield GetProcessingDownload(loadHosting, idWorker, (options.axios_config || {}), isDebug);
const getURL = String(getDownloadProgress.url || "");
return {
card: cardInfo,
url: getURL
};
});
}