Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aandrew-me
GitHub Repository: aandrew-me/ytDownloader
Path: blob/main/src/preferences.js
448 views
1
const {ipcRenderer, shell} = require("electron");
2
const {accessSync, constants} = require("original-fs");
3
const {join} = require("path");
4
const {homedir} = require("os");
5
6
const storageTheme = localStorage.getItem("theme");
7
if (storageTheme) {
8
document.documentElement.setAttribute("theme", storageTheme);
9
} else {
10
document.documentElement.setAttribute("theme", "frappe");
11
}
12
13
let rightToLeft = "false";
14
if (localStorage.getItem("rightToLeft")) {
15
rightToLeft = localStorage.getItem("rightToLeft");
16
}
17
if (rightToLeft == "true") {
18
document
19
.querySelectorAll(".prefBox")
20
.forEach((/** @type {HTMLElement} */ item) => {
21
item.style.flexDirection = "row-reverse";
22
});
23
} else {
24
console.log("Change to left to right");
25
document
26
.querySelectorAll(".prefBox")
27
.forEach((/** @type {HTMLElement} */ item) => {
28
item.style.flexDirection = "row";
29
});
30
}
31
32
// Download path
33
let downloadPath = localStorage.getItem("downloadPath");
34
35
if (!downloadPath) {
36
downloadPath = join(homedir(), "Downloads");
37
}
38
getId("path").textContent = downloadPath;
39
40
/**
41
*
42
* @param {string} id
43
* @returns {any}
44
*/
45
function getId(id) {
46
return document.getElementById(id);
47
}
48
49
document.addEventListener("translations-loaded", () => {
50
window.i18n.translatePage();
51
52
document.title = window.i18n.__("preferences");
53
54
if (process.env.FLATPAK_ID) {
55
getId("flatpakTxt").addEventListener("click", () => {
56
shell.openExternal(
57
"https://flathub.org/apps/com.github.tchx84.Flatseal"
58
);
59
});
60
61
getId("flatpakTxt").style.display = "block";
62
}
63
});
64
65
getId("back").addEventListener("click", () => {
66
ipcRenderer.send("close-secondary");
67
});
68
69
// Selecting download directory
70
getId("selectLocation").addEventListener("click", () => {
71
ipcRenderer.send("select-location-secondary", "");
72
});
73
74
ipcRenderer.on("downloadPath", (_event, downloadPath) => {
75
try {
76
accessSync(downloadPath[0], constants.W_OK);
77
78
console.log(downloadPath[0]);
79
localStorage.setItem("downloadPath", downloadPath[0]);
80
getId("path").textContent = downloadPath[0];
81
} catch (error) {
82
showPopup(i18n.__("unableToAccessDir"), true);
83
}
84
});
85
86
// Selecting config directory
87
88
getId("configBtn").addEventListener("click", () => {
89
ipcRenderer.send("select-config", "");
90
});
91
92
ipcRenderer.on("configPath", (event, configPath) => {
93
console.log(configPath);
94
localStorage.setItem("configPath", configPath);
95
getId("configPath").textContent = configPath;
96
});
97
98
const configCheck = getId("configCheck");
99
configCheck.addEventListener("change", (event) => {
100
if (configCheck.checked) {
101
getId("configOpts").style.display = "flex";
102
} else {
103
getId("configOpts").style.display = "none";
104
localStorage.setItem("configPath", "");
105
}
106
});
107
108
const configPath = localStorage.getItem("configPath");
109
if (configPath) {
110
getId("configPath").textContent = configPath;
111
configCheck.checked = true;
112
getId("configOpts").style.display = "flex";
113
}
114
115
// Language settings
116
117
const language = localStorage.getItem("locale");
118
119
if (language) {
120
if (language.startsWith("en")) {
121
getId("select").value = "en";
122
} else {
123
getId("select").value = language;
124
}
125
}
126
127
function changeLanguage() {
128
const language = getId("select").value;
129
localStorage.setItem("locale", language);
130
if (language === "fa" || language === "ar") {
131
rightToLeft = "true";
132
localStorage.setItem("rightToLeft", "true");
133
} else {
134
rightToLeft = "false";
135
localStorage.setItem("rightToLeft", "false");
136
}
137
}
138
139
// Browser preferences
140
let browser = localStorage.getItem("browser");
141
if (browser) {
142
getId("browser").value = browser;
143
}
144
145
getId("browser").addEventListener("change", () => {
146
browser = getId("browser").value;
147
localStorage.setItem("browser", browser);
148
});
149
150
// Handling preferred video quality
151
let preferredVideoQuality = localStorage.getItem("preferredVideoQuality");
152
if (preferredVideoQuality) {
153
getId("preferredVideoQuality").value = preferredVideoQuality;
154
}
155
156
getId("preferredVideoQuality").addEventListener("change", () => {
157
preferredVideoQuality = getId("preferredVideoQuality").value;
158
localStorage.setItem("preferredVideoQuality", preferredVideoQuality);
159
});
160
161
// Handling preferred audio quality
162
let preferredAudioQuality = localStorage.getItem("preferredAudioQuality");
163
if (preferredAudioQuality) {
164
getId("preferredAudioQuality").value = preferredAudioQuality;
165
}
166
167
getId("preferredAudioQuality").addEventListener("change", () => {
168
preferredAudioQuality = getId("preferredAudioQuality").value;
169
localStorage.setItem("preferredAudioQuality", preferredAudioQuality);
170
});
171
172
// Handling preferred video codec
173
let preferredVideoCodec = localStorage.getItem("preferredVideoCodec");
174
if (preferredVideoCodec) {
175
getId("preferredVideoCodec").value = preferredVideoCodec;
176
}
177
178
getId("preferredVideoCodec").addEventListener("change", () => {
179
preferredVideoCodec = getId("preferredVideoCodec").value;
180
localStorage.setItem("preferredVideoCodec", preferredVideoCodec);
181
});
182
183
// Proxy
184
let proxy = localStorage.getItem("proxy");
185
if (proxy) {
186
getId("proxyTxt").value = proxy;
187
}
188
getId("proxyTxt").addEventListener("change", () => {
189
proxy = getId("proxyTxt").value;
190
localStorage.setItem("proxy", proxy);
191
});
192
193
// Custom yt-dlp args
194
const ytDlpArgsInput = getId("customArgsInput");
195
let customYtDlpArgs = localStorage.getItem("customYtDlpArgs");
196
if (customYtDlpArgs) {
197
ytDlpArgsInput.value = customYtDlpArgs;
198
ytDlpArgsInput.style.height = ytDlpArgsInput.scrollHeight + "px";
199
}
200
ytDlpArgsInput.addEventListener("input", () => {
201
customYtDlpArgs = getId("customArgsInput").value;
202
localStorage.setItem("customYtDlpArgs", customYtDlpArgs.trim());
203
ytDlpArgsInput.style.height = "auto";
204
ytDlpArgsInput.style.height = ytDlpArgsInput.scrollHeight + "px";
205
});
206
207
getId("learnMoreLink").addEventListener("click", () => {
208
shell.openExternal(
209
"https://github.com/aandrew-me/ytDownloader/wiki/Custom-yt%E2%80%90dlp-options"
210
);
211
});
212
213
// Reload
214
function reload() {
215
ipcRenderer.send("reload");
216
}
217
getId("restart").addEventListener("click", () => {
218
reload();
219
});
220
221
// Handling filename formats
222
getId("filenameFormat").addEventListener("input", () => {
223
const text = getId("filenameFormat").value;
224
localStorage.setItem("filenameFormat", text);
225
});
226
227
if (localStorage.getItem("filenameFormat")) {
228
getId("filenameFormat").value = localStorage.getItem("filenameFormat");
229
}
230
231
getId("resetFilenameFormat").addEventListener("click", () => {
232
getId("filenameFormat").value = "%(playlist_index)s.%(title)s.%(ext)s";
233
localStorage.setItem(
234
"filenameFormat",
235
"%(playlist_index)s.%(title)s.%(ext)s"
236
);
237
});
238
239
// Handling folder name formats
240
getId("foldernameFormat").addEventListener("input", () => {
241
const text = getId("foldernameFormat").value;
242
localStorage.setItem("foldernameFormat", text);
243
});
244
245
if (localStorage.getItem("foldernameFormat")) {
246
getId("foldernameFormat").value = localStorage.getItem("foldernameFormat");
247
}
248
249
getId("resetFoldernameFormat").addEventListener("click", () => {
250
getId("foldernameFormat").value = "%(playlist_title)s";
251
localStorage.setItem("foldernameFormat", "%(playlist_title)s");
252
});
253
254
// Max active downloads
255
getId("maxDownloads").addEventListener("input", () => {
256
const number = Number(getId("maxDownloads").value);
257
258
if (number < 1) {
259
localStorage.setItem("maxActiveDownloads", "1");
260
} else {
261
localStorage.setItem("maxActiveDownloads", String(number));
262
}
263
});
264
265
if (localStorage.getItem("maxActiveDownloads")) {
266
getId("maxDownloads").value = localStorage.getItem("maxActiveDownloads");
267
}
268
269
// Closing app to system tray
270
const closeToTray = getId("closeToTray");
271
closeToTray.addEventListener("change", (event) => {
272
if (closeToTray.checked) {
273
localStorage.setItem("closeToTray", "true");
274
ipcRenderer.send("useTray", true);
275
} else {
276
localStorage.setItem("closeToTray", "false");
277
ipcRenderer.send("useTray", false);
278
}
279
});
280
const trayEnabled = localStorage.getItem("closeToTray");
281
if (trayEnabled == "true") {
282
closeToTray.checked = true;
283
ipcRenderer.send("useTray", true);
284
}
285
286
// Auto updates
287
const autoUpdateDisabled = getId("autoUpdateDisabled");
288
autoUpdateDisabled.addEventListener("change", (event) => {
289
if (autoUpdateDisabled.checked) {
290
localStorage.setItem("autoUpdate", "false");
291
} else {
292
localStorage.setItem("autoUpdate", "true");
293
}
294
});
295
const autoUpdate = localStorage.getItem("autoUpdate");
296
if (autoUpdate == "false") {
297
autoUpdateDisabled.checked = true;
298
}
299
300
// Show more format options
301
const showMoreFormats = getId("showMoreFormats");
302
showMoreFormats.addEventListener("change", (event) => {
303
if (showMoreFormats.checked) {
304
localStorage.setItem("showMoreFormats", "true");
305
} else {
306
localStorage.setItem("showMoreFormats", "false");
307
}
308
});
309
const showMoreFormatOpts = localStorage.getItem("showMoreFormats");
310
if (showMoreFormatOpts == "true") {
311
showMoreFormats.checked = true;
312
}
313
314
function showPopup(text, isError = false) {
315
let popupContainer = document.getElementById("popupContainer");
316
317
if (!popupContainer) {
318
popupContainer = document.createElement("div");
319
popupContainer.id = "popupContainer";
320
popupContainer.className = "popup-container";
321
document.body.appendChild(popupContainer);
322
}
323
324
const popup = document.createElement("span");
325
popup.textContent = text;
326
popup.classList.add("popup-item");
327
328
popup.style.background = isError ? "#ff6b6b" : "#54abde";
329
330
if (isError) {
331
popup.classList.add("popup-error");
332
}
333
334
popupContainer.appendChild(popup);
335
336
setTimeout(() => {
337
popup.style.opacity = "0";
338
setTimeout(() => {
339
popup.remove();
340
if (popupContainer.childElementCount === 0) {
341
popupContainer.remove();
342
}
343
}, 1000);
344
}, 2200);
345
}
346
347