|
|
|
|
@ -2,7 +2,7 @@ const { clipboard, shell, ipcRenderer } = require("electron");
|
|
|
|
|
const { default: YTDlpWrap } = require("yt-dlp-wrap-plus");
|
|
|
|
|
const path = require("path");
|
|
|
|
|
const os = require("os");
|
|
|
|
|
const fs = require('fs');
|
|
|
|
|
const fs = require("fs");
|
|
|
|
|
const { execSync } = require("child_process");
|
|
|
|
|
let url;
|
|
|
|
|
const ytDlp = localStorage.getItem("ytdlp");
|
|
|
|
|
@ -12,36 +12,36 @@ const i18n = new (require("../translations/i18n"))();
|
|
|
|
|
let cookieArg = "";
|
|
|
|
|
let browser = "";
|
|
|
|
|
const formats = {
|
|
|
|
|
144:160,
|
|
|
|
|
240:133,
|
|
|
|
|
360:134,
|
|
|
|
|
480:135,
|
|
|
|
|
720:136,
|
|
|
|
|
1080:137,
|
|
|
|
|
1440:400,
|
|
|
|
|
2160:401,
|
|
|
|
|
4320:571
|
|
|
|
|
}
|
|
|
|
|
144: 160,
|
|
|
|
|
240: 133,
|
|
|
|
|
360: 134,
|
|
|
|
|
480: 135,
|
|
|
|
|
720: 136,
|
|
|
|
|
1080: 137,
|
|
|
|
|
1440: 400,
|
|
|
|
|
2160: 401,
|
|
|
|
|
4320: 571,
|
|
|
|
|
};
|
|
|
|
|
let originalCount = 0;
|
|
|
|
|
let ffmpeg;
|
|
|
|
|
let ffmpegPath;
|
|
|
|
|
if (os.platform() === "win32") {
|
|
|
|
|
ffmpeg = `"${__dirname}\\..\\ffmpeg.exe"`;
|
|
|
|
|
ffmpegPath= `${__dirname}\\..\\ffmpeg.exe`;
|
|
|
|
|
ffmpegPath = `${__dirname}\\..\\ffmpeg.exe`;
|
|
|
|
|
} else {
|
|
|
|
|
ffmpeg = `"${__dirname}/../ffmpeg"`;
|
|
|
|
|
ffmpegPath = `${__dirname}/../ffmpeg`;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!fs.existsSync(ffmpegPath)){
|
|
|
|
|
if (!fs.existsSync(ffmpegPath)) {
|
|
|
|
|
try {
|
|
|
|
|
ffmpeg = execSync("which ffmpeg", {encoding:"utf8"})
|
|
|
|
|
ffmpeg = `"${ffmpeg.trimEnd()}"`
|
|
|
|
|
ffmpeg = execSync("which ffmpeg", { encoding: "utf8" });
|
|
|
|
|
ffmpeg = `"${ffmpeg.trimEnd()}"`;
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log(error)
|
|
|
|
|
console.log(error);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
console.log("ffmpeg:", ffmpeg)
|
|
|
|
|
console.log("ffmpeg:", ffmpeg);
|
|
|
|
|
|
|
|
|
|
let foldernameFormat = "%(playlist_title)s";
|
|
|
|
|
let filenameFormat = "%(playlist_index)s.%(title)s.%(ext)s";
|
|
|
|
|
@ -73,21 +73,21 @@ document.addEventListener("keydown", (event) => {
|
|
|
|
|
// Patterns
|
|
|
|
|
const playlistTxt = "Downloading playlist: ";
|
|
|
|
|
const videoIndex = "Downloading item ";
|
|
|
|
|
const oldVideoIndex = "Downloading video "
|
|
|
|
|
const oldVideoIndex = "Downloading video ";
|
|
|
|
|
|
|
|
|
|
function download(type) {
|
|
|
|
|
// Config file
|
|
|
|
|
let configArg = "";
|
|
|
|
|
let configTxt = "";
|
|
|
|
|
if (localStorage.getItem("configPath")){
|
|
|
|
|
configArg = "--config-location"
|
|
|
|
|
configTxt = `"${localStorage.getItem("configPath")}"`
|
|
|
|
|
if (localStorage.getItem("configPath")) {
|
|
|
|
|
configArg = "--config-location";
|
|
|
|
|
configTxt = `"${localStorage.getItem("configPath")}"`;
|
|
|
|
|
}
|
|
|
|
|
nameFormatting();
|
|
|
|
|
originalCount = 0;
|
|
|
|
|
|
|
|
|
|
// Playlist download range
|
|
|
|
|
managePlaylistRange()
|
|
|
|
|
managePlaylistRange();
|
|
|
|
|
|
|
|
|
|
// Whether to use browser cookies or not
|
|
|
|
|
if (localStorage.getItem("browser")) {
|
|
|
|
|
@ -106,23 +106,20 @@ function download(type) {
|
|
|
|
|
let quality, format, downloadProcess;
|
|
|
|
|
if (type === "video") {
|
|
|
|
|
quality = getId("select").value;
|
|
|
|
|
const formatId = formats[quality]
|
|
|
|
|
const formatId = formats[quality];
|
|
|
|
|
if (quality === "best") {
|
|
|
|
|
format = "-f bv*+ba/best";
|
|
|
|
|
}
|
|
|
|
|
else if (quality === "worst") {
|
|
|
|
|
} else if (quality === "worst") {
|
|
|
|
|
format = "-f wv+wa/worst";
|
|
|
|
|
}
|
|
|
|
|
else if (quality === "useConfig"){
|
|
|
|
|
format = ""
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
} else if (quality === "useConfig") {
|
|
|
|
|
format = "";
|
|
|
|
|
} else {
|
|
|
|
|
format = `-f "${formatId}+m4a/mp4[height=${quality}]+m4a/bv*[height<=${quality}]+ba/best"`;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
format = getId("audioSelect").value;
|
|
|
|
|
}
|
|
|
|
|
console.log("Format:", format)
|
|
|
|
|
console.log("Format:", format);
|
|
|
|
|
|
|
|
|
|
const controller = new AbortController();
|
|
|
|
|
|
|
|
|
|
@ -182,7 +179,8 @@ function download(type) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
(eventData.includes(videoIndex) || eventData.includes(oldVideoIndex)) &&
|
|
|
|
|
(eventData.includes(videoIndex) ||
|
|
|
|
|
eventData.includes(oldVideoIndex)) &&
|
|
|
|
|
!eventData.includes("thumbnail")
|
|
|
|
|
) {
|
|
|
|
|
count += 1;
|
|
|
|
|
@ -209,10 +207,16 @@ function download(type) {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
downloadProcess.on("progress", (progress) => {
|
|
|
|
|
if (getId(`p${count}`)) {
|
|
|
|
|
getId(`p${count}`).textContent = `${i18n.__("Progress")} ${
|
|
|
|
|
progress.percent
|
|
|
|
|
}% | ${i18n.__("Speed")} ${progress.currentSpeed || 0}`;
|
|
|
|
|
if (progress.percent == 100) {
|
|
|
|
|
if (getId(`p${count}`)) {
|
|
|
|
|
getId(`p${count}`).textContent = i18n.__("Processing") + "...";
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if (getId(`p${count}`)) {
|
|
|
|
|
getId(`p${count}`).textContent = `${i18n.__("Progress")} ${
|
|
|
|
|
progress.percent
|
|
|
|
|
}% | ${i18n.__("Speed")} ${progress.currentSpeed || 0}`;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
@ -225,7 +229,7 @@ function download(type) {
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function managePlaylistRange(){
|
|
|
|
|
function managePlaylistRange() {
|
|
|
|
|
if (getId("playlistIndex").value) {
|
|
|
|
|
playlistIndex = Number(getId("playlistIndex").value);
|
|
|
|
|
}
|
|
|
|
|
@ -233,9 +237,9 @@ function managePlaylistRange(){
|
|
|
|
|
playlistEnd = Number(getId("playlistEnd").value);
|
|
|
|
|
}
|
|
|
|
|
console.log(`Range: ${playlistIndex}:${playlistEnd}`);
|
|
|
|
|
if (playlistIndex > 0){
|
|
|
|
|
originalCount = playlistIndex - 1
|
|
|
|
|
console.log(`Starting download from ${originalCount + 1}`)
|
|
|
|
|
if (playlistIndex > 0) {
|
|
|
|
|
originalCount = playlistIndex - 1;
|
|
|
|
|
console.log(`Starting download from ${originalCount + 1}`);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -298,7 +302,7 @@ function downloadThumbnails() {
|
|
|
|
|
let count = 0;
|
|
|
|
|
hideOptions();
|
|
|
|
|
nameFormatting();
|
|
|
|
|
managePlaylistRange()
|
|
|
|
|
managePlaylistRange();
|
|
|
|
|
const downloadProcess = ytdlp.exec(
|
|
|
|
|
[
|
|
|
|
|
"--yes-playlist",
|
|
|
|
|
@ -328,7 +332,8 @@ function downloadThumbnails() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
(eventData.includes(videoIndex) || eventData.includes(oldVideoIndex))&&
|
|
|
|
|
(eventData.includes(videoIndex) ||
|
|
|
|
|
eventData.includes(oldVideoIndex)) &&
|
|
|
|
|
!eventData.includes("thumbnail")
|
|
|
|
|
) {
|
|
|
|
|
count += 1;
|
|
|
|
|
@ -362,7 +367,7 @@ function saveLinks() {
|
|
|
|
|
let count = 0;
|
|
|
|
|
hideOptions();
|
|
|
|
|
nameFormatting();
|
|
|
|
|
managePlaylistRange()
|
|
|
|
|
managePlaylistRange();
|
|
|
|
|
const downloadProcess = ytdlp.exec(
|
|
|
|
|
[
|
|
|
|
|
"--yes-playlist",
|
|
|
|
|
@ -392,7 +397,8 @@ function saveLinks() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
(eventData.includes(videoIndex) || eventData.includes(oldVideoIndex)) &&
|
|
|
|
|
(eventData.includes(videoIndex) ||
|
|
|
|
|
eventData.includes(oldVideoIndex)) &&
|
|
|
|
|
!eventData.includes("thumbnail")
|
|
|
|
|
) {
|
|
|
|
|
count += 1;
|
|
|
|
|
@ -538,4 +544,4 @@ getId("playlistEnd").placeholder = i18n.__("End");
|
|
|
|
|
getId("downloadThumbnails").textContent = i18n.__("Download thumbnails");
|
|
|
|
|
getId("saveLinks").textContent = i18n.__("Save video links to a file");
|
|
|
|
|
getId("useConfigTxt").textContent = i18n.__("Use config file");
|
|
|
|
|
getId("errorBtn").textContent = i18n.__("Error Details")+" ▼"
|
|
|
|
|
getId("errorBtn").textContent = i18n.__("Error Details") + " ▼";
|
|
|
|
|
|