youtube-likes-downloader
Version:
Download all liked videos from youtube
82 lines • 4.05 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.addVideo = addVideo;
const crypto_1 = require("crypto");
const fs_1 = __importDefault(require("fs"));
const os_1 = __importDefault(require("os"));
const path_1 = __importDefault(require("path"));
const out_url_1 = require("out-url");
const zod_1 = require("zod");
const schema_1 = require("./types/schema");
require("@anmiles/prototypes");
const cli_1 = require("./utils/cli");
const formatJSON_1 = require("./utils/formatJSON");
const formatTitle_1 = require("./utils/formatTitle");
const paths_1 = require("./utils/paths");
async function addVideo(profile) {
const cli = new cli_1.Cli();
const { id, title, channel, duration, resolution, epoch, videoFile, imageFile, descriptionFile, } = await getData(cli);
cli.close();
const ext = path_1.default.extname(videoFile).slice(1);
const outputDir = (0, paths_1.getOutputDir)(profile);
fs_1.default.ensureDir(outputDir, { create: true });
const filename = path_1.default.join(outputDir, `${(0, formatTitle_1.formatTitle)({ id, title, channel }).toFilename()}`);
const json = (0, formatJSON_1.formatJSON)({ id, title, channel, duration, resolution, epoch, ext });
await fs_1.default.promises.writeFile(`${filename}.info.json`, JSON.stringify(json));
await fs_1.default.promises.copyFile(path_1.default.resolve(videoFile), filename + path_1.default.extname(videoFile));
await fs_1.default.promises.copyFile(path_1.default.resolve(imageFile), filename + path_1.default.extname(imageFile));
await fs_1.default.promises.copyFile(path_1.default.resolve(descriptionFile), `${filename}.description`);
await fs_1.default.promises.appendFile((0, paths_1.getDownloadArchive)(profile), `youtube ${id}\n`);
}
async function getData(cli) {
const data = await getJSONData(cli);
if (data) {
return data;
}
return {
id: await cli.getAnswer('Youtube link', schema_1.youtubeIdSchema),
title: await cli.getAnswer('Title', schema_1.stringSchema),
channel: await cli.getAnswer('Channel', schema_1.stringSchema),
duration: await cli.getAnswer('Duration', schema_1.durationSchema),
resolution: await cli.getAnswer('Resolution', schema_1.resolutionSchema),
epoch: await cli.getAnswer('Date', schema_1.epochSchema),
videoFile: await cli.getAnswer('Video file', schema_1.fileSchema),
imageFile: await cli.getAnswer('Image file', schema_1.fileSchema),
descriptionFile: await cli.getAnswer('Description file', schema_1.fileSchema),
};
}
async function getJSONData(cli) {
const inputData = await cli.getAnswer('Input JSON (optional)', schema_1.inputDataSchema.or(zod_1.z.undefined()), JSON.parse);
if (!inputData) {
return undefined;
}
const videoFile = await cli.getAnswer('Video file', schema_1.fileSchema);
cli.say('Opening thumbnail; please download it as an image file');
await (0, out_url_1.open)(inputData.thumbnail.split('?')[0]);
const imageFile = await cli.getAnswer('Image file', schema_1.fileSchema);
const descriptionFile = createTempFilePath('txt');
await fs_1.default.promises.writeFile(descriptionFile, inputData.description);
return transformInputData(inputData, videoFile, imageFile, descriptionFile);
}
function createTempFilePath(ext) {
const tmp = os_1.default.tmpdir();
const filename = (0, crypto_1.randomUUID)();
return path_1.default.join(tmp, `${filename}.${ext}`);
}
function transformInputData(inputData, videoFile, imageFile, descriptionFile) {
return {
id: inputData.id,
title: inputData.title,
channel: inputData.channel,
duration: inputData.duration,
resolution: inputData.resolution,
epoch: inputData.epoch,
videoFile,
imageFile,
descriptionFile,
};
}
//# sourceMappingURL=addVideo.js.map