diff --git a/assets/css/index.css b/assets/css/index.css index bf6f497..8438750 100644 --- a/assets/css/index.css +++ b/assets/css/index.css @@ -253,7 +253,7 @@ label { display: none; } -input[type="checkbox"] { +.cb { width: 20px; height: 20px; position: relative; diff --git a/flatpak/io.github.aandrew_me.ytdn.metainfo.xml b/flatpak/io.github.aandrew_me.ytdn.metainfo.xml index 86ac664..c1044db 100644 --- a/flatpak/io.github.aandrew_me.ytdn.metainfo.xml +++ b/flatpak/io.github.aandrew_me.ytdn.metainfo.xml @@ -33,7 +33,6 @@ - diff --git a/html/index.html b/html/index.html index 3804aff..02c6d3a 100644 --- a/html/index.html +++ b/html/index.html @@ -49,6 +49,7 @@ @@ -117,7 +118,7 @@

Subtitles

Download subtitles if available - + diff --git a/html/playlist_new.html b/html/playlist_new.html new file mode 100644 index 0000000..fcda07e --- /dev/null +++ b/html/playlist_new.html @@ -0,0 +1,48 @@ + + + + + + + + Playlist download + + + + + + + + + + +
+
+
+ + menu + + + + + + +
+ +
+
+ + + \ No newline at end of file diff --git a/html/preferences.html b/html/preferences.html index de756eb..d29d4c1 100644 --- a/html/preferences.html +++ b/html/preferences.html @@ -41,7 +41,7 @@
Enable transparent dark mode(only Linux, needs restart) + class="cb" id="enableTransparent">

@@ -124,7 +124,7 @@
Use configuration file - +
@@ -160,12 +160,12 @@
Close to system tray - +

Disable auto updates - +
diff --git a/package.json b/package.json index e587631..aafa0ce 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "yt-dlp-wrap-plus": "^2.3.16" }, "name": "ytdownloader", - "version": "3.12.1", + "version": "3.13.0", "main": "main.js", "scripts": { "start": "electron .", @@ -86,8 +86,7 @@ "category": "Utility" }, "snap": { - "grade": "stable", - "base": "core22" + "grade": "stable" }, "win": { "target": "nsis", diff --git a/sample.json b/sample.json new file mode 100644 index 0000000..c944b08 --- /dev/null +++ b/sample.json @@ -0,0 +1,579 @@ +{ + "id": "PLNu0CXJQy5DBk_ca7C7YOZUFC8XzIYuQf", + "title": "\u041f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 Xenus: \u0422\u043e\u0447\u043a\u0430 \u041a\u0438\u043f\u0435\u043d\u0438\u044f (\u0412\u044b\u0441\u043e\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c/No death challenge)", + "availability": "public", + "channel_follower_count": null, + "description": "", + "tags": [], + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/30jpTzJiedQ/hqdefault.jpg?sqp=-oaymwEWCKgBEF5IWvKriqkDCQgBFQAAiEIYAQ==&rs=AOn4CLAmEDg0XPgFJCyUgVIgLZr7kzi6zA", + "height": 94, + "width": 168, + "id": "0", + "resolution": "168x94" + }, + { + "url": "https://i.ytimg.com/vi/30jpTzJiedQ/hqdefault.jpg?sqp=-oaymwEWCMQBEG5IWvKriqkDCQgBFQAAiEIYAQ==&rs=AOn4CLDm30N4dSfmxxOGpH1EU_uLS0PcXA", + "height": 110, + "width": 196, + "id": "1", + "resolution": "196x110" + }, + { + "url": "https://i.ytimg.com/vi/30jpTzJiedQ/hqdefault.jpg?sqp=-oaymwEXCPYBEIoBSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLAQwDns2fzKoLKgnHPdSwMXOdPFHA", + "height": 138, + "width": 246, + "id": "2", + "resolution": "246x138" + }, + { + "url": "https://i.ytimg.com/vi/30jpTzJiedQ/hqdefault.jpg?sqp=-oaymwEXCNACELwBSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCt8qjLqQUpH5QMKmbxbULN2xAubQ", + "height": 188, + "width": 336, + "id": "3", + "resolution": "336x188" + } + ], + "modified_date": "20220718", + "view_count": 411, + "playlist_count": 13, + "uploader": "ProJecT Gamling", + "uploader_id": "UCbr4uFpFqPBzr7rlK-5F5YA", + "uploader_url": "https://www.youtube.com/@projectgamling7962", + "channel": "ProJecT Gamling", + "channel_id": "UCbr4uFpFqPBzr7rlK-5F5YA", + "channel_url": "https://www.youtube.com/@projectgamling7962", + "_type": "playlist", + "entries": [ + { + "_type": "url", + "ie_key": "Youtube", + "id": "30jpTzJiedQ", + "url": "https://www.youtube.com/watch?v=30jpTzJiedQ", + "title": "Xenus: \u0422\u043e\u0447\u043a\u0430 \u041a\u0438\u043f\u0435\u043d\u0438\u044f \u042d\u043f\u0438\u0437\u043e\u0434 1: \u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 (No deaths challenge/\u0412\u044b\u0441\u043e\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c)", + "description": null, + "duration": 8994, + "channel_id": "UCbr4uFpFqPBzr7rlK-5F5YA", + "channel": "ProJecT Gamling", + "channel_url": "https://www.youtube.com/channel/UCbr4uFpFqPBzr7rlK-5F5YA", + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/30jpTzJiedQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVPKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBWrlgSf5eXcA_9H1ySF2aMUEn4zA", + "height": 94, + "width": 168 + }, + { + "url": "https://i.ytimg.com/vi/30jpTzJiedQ/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVPKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBHEKM40MpSXA8CgY-ClT5elYeV_w", + "height": 110, + "width": 196 + }, + { + "url": "https://i.ytimg.com/vi/30jpTzJiedQ/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFTyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAAvRLpvRsckiDHcBrdU3ZSl69XXw", + "height": 138, + "width": 246 + }, + { + "url": "https://i.ytimg.com/vi/30jpTzJiedQ/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFTyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLA9kGc48_qsKbGCgSnAtLoN1u0XJw", + "height": 188, + "width": 336 + } + ], + "timestamp": null, + "release_timestamp": null, + "availability": null, + "view_count": 134, + "live_status": null, + "__x_forwarded_for_ip": null + }, + { + "_type": "url", + "ie_key": "Youtube", + "id": "XIBxYDyq14U", + "url": "https://www.youtube.com/watch?v=XIBxYDyq14U", + "title": "Xenus: \u0422\u043e\u0447\u043a\u0430 \u041a\u0438\u043f\u0435\u043d\u0438\u044f \u042d\u043f\u0438\u0437\u043e\u0434 2: \u0414\u043e\u043d \u041f\u0435\u0434\u0440\u043e (No deaths challenge/\u0412\u044b\u0441\u043e\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c)", + "description": null, + "duration": 7542, + "channel_id": "UCbr4uFpFqPBzr7rlK-5F5YA", + "channel": "ProJecT Gamling", + "channel_url": "https://www.youtube.com/channel/UCbr4uFpFqPBzr7rlK-5F5YA", + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/XIBxYDyq14U/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVPKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCi2_jYC9s-wE5QcaIqQgvptPFfeg", + "height": 94, + "width": 168 + }, + { + "url": "https://i.ytimg.com/vi/XIBxYDyq14U/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVPKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAFpQR6d3OlbjW-AxuPbAGJM3TbUA", + "height": 110, + "width": 196 + }, + { + "url": "https://i.ytimg.com/vi/XIBxYDyq14U/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFTyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCHn6BrPpyJH_R3z8RwjX_VOehMqQ", + "height": 138, + "width": 246 + }, + { + "url": "https://i.ytimg.com/vi/XIBxYDyq14U/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFTyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBzG2fREpEA2XUzJFiVJVmCq2HMJg", + "height": 188, + "width": 336 + } + ], + "timestamp": null, + "release_timestamp": null, + "availability": null, + "view_count": 85, + "live_status": null, + "__x_forwarded_for_ip": null + }, + { + "_type": "url", + "ie_key": "Youtube", + "id": "Y5FjUQFYugI", + "url": "https://www.youtube.com/watch?v=Y5FjUQFYugI", + "title": "Xenus: \u0422\u043e\u0447\u043a\u0430 \u041a\u0438\u043f\u0435\u043d\u0438\u044f \u042d\u043f\u0438\u0437\u043e\u0434 3: \u042d\u0434\u0433\u0430\u0440\u043e (No deaths challenge/\u0412\u044b\u0441\u043e\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c)", + "description": null, + "duration": 7984, + "channel_id": "UCbr4uFpFqPBzr7rlK-5F5YA", + "channel": "ProJecT Gamling", + "channel_url": "https://www.youtube.com/channel/UCbr4uFpFqPBzr7rlK-5F5YA", + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/Y5FjUQFYugI/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVPKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDGKy3hnu9knmngq2hAkUEDnCYEbg", + "height": 94, + "width": 168 + }, + { + "url": "https://i.ytimg.com/vi/Y5FjUQFYugI/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVPKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCSVxrhiAWPlVWe-MocX68R0s0xWA", + "height": 110, + "width": 196 + }, + { + "url": "https://i.ytimg.com/vi/Y5FjUQFYugI/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFTyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBLd0dK7P27n1VSJAPTj5_iTnLkbA", + "height": 138, + "width": 246 + }, + { + "url": "https://i.ytimg.com/vi/Y5FjUQFYugI/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFTyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLD2UAXVVlziN6NFC1f-37SMCx3qUg", + "height": 188, + "width": 336 + } + ], + "timestamp": null, + "release_timestamp": null, + "availability": null, + "view_count": 61, + "live_status": null, + "__x_forwarded_for_ip": null + }, + { + "_type": "url", + "ie_key": "Youtube", + "id": "cZMJbA5RfJo", + "url": "https://www.youtube.com/watch?v=cZMJbA5RfJo", + "title": "Xenus: \u0422\u043e\u0447\u043a\u0430 \u041a\u0438\u043f\u0435\u043d\u0438\u044f \u042d\u043f\u0438\u0437\u043e\u0434 4: \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u044f (No deaths challenge/\u0412\u044b\u0441\u043e\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c)", + "description": null, + "duration": 6414, + "channel_id": "UCbr4uFpFqPBzr7rlK-5F5YA", + "channel": "ProJecT Gamling", + "channel_url": "https://www.youtube.com/channel/UCbr4uFpFqPBzr7rlK-5F5YA", + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/cZMJbA5RfJo/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVPKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLD0jrz0csfO2Y3shzRQv35pXH_FmQ", + "height": 94, + "width": 168 + }, + { + "url": "https://i.ytimg.com/vi/cZMJbA5RfJo/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVPKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBES-6yntKp5IicORZJ163jXfj0Kw", + "height": 110, + "width": 196 + }, + { + "url": "https://i.ytimg.com/vi/cZMJbA5RfJo/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFTyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLA4J7SpW1shmvaIKACP1aIkZappYA", + "height": 138, + "width": 246 + }, + { + "url": "https://i.ytimg.com/vi/cZMJbA5RfJo/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFTyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLApSYw1D443jUXgj0DhIMtKN4LC0g", + "height": 188, + "width": 336 + } + ], + "timestamp": null, + "release_timestamp": null, + "availability": null, + "view_count": 38, + "live_status": null, + "__x_forwarded_for_ip": null + }, + { + "_type": "url", + "ie_key": "Youtube", + "id": "JdKmXxwF2B4", + "url": "https://www.youtube.com/watch?v=JdKmXxwF2B4", + "title": "[Private video]", + "description": null, + "duration": null, + "channel_id": null, + "channel": null, + "channel_url": null, + "thumbnails": [ + { + "url": "https://i.ytimg.com/img/no_thumbnail.jpg", + "height": 90, + "width": 120 + }, + { + "url": "https://i.ytimg.com/img/no_thumbnail.jpg", + "height": 180, + "width": 320 + }, + { + "url": "https://i.ytimg.com/img/no_thumbnail.jpg", + "height": 360, + "width": 480 + } + ], + "timestamp": null, + "release_timestamp": null, + "availability": null, + "view_count": null, + "live_status": null, + "__x_forwarded_for_ip": null + }, + { + "_type": "url", + "ie_key": "Youtube", + "id": "yvEdxPdFhoU", + "url": "https://www.youtube.com/watch?v=yvEdxPdFhoU", + "title": "Xenus:\u0422\u043e\u0447\u043a\u0430 \u041a\u0438\u043f\u0435\u043d\u0438\u044f \u042d\u043f\u0438\u0437\u043e\u0434 5 \u0411\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u043e\u0431\u0435\u0433 \u0438 \u0410\u043b\u044c\u0431\u0435\u0440\u0442\u043e \u0411\u043b\u0430\u043d\u043a\u043e (No deaths challenge/\u0412\u044b\u0441\u043e\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c)", + "description": null, + "duration": 13965, + "channel_id": "UCbr4uFpFqPBzr7rlK-5F5YA", + "channel": "ProJecT Gamling", + "channel_url": "https://www.youtube.com/channel/UCbr4uFpFqPBzr7rlK-5F5YA", + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/yvEdxPdFhoU/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVPKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLB74rWcv2d74KKCCFMWC2Iv0x7oTg", + "height": 94, + "width": 168 + }, + { + "url": "https://i.ytimg.com/vi/yvEdxPdFhoU/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVPKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBp4QwHoVD6lVXleossWACwmRLBAw", + "height": 110, + "width": 196 + }, + { + "url": "https://i.ytimg.com/vi/yvEdxPdFhoU/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFTyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCJyb9hQkRmsKPvHMdHg7Hm_P0MlA", + "height": 138, + "width": 246 + }, + { + "url": "https://i.ytimg.com/vi/yvEdxPdFhoU/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFTyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDue4dHczq6T-ighZHdhxKQ1QX15Q", + "height": 188, + "width": 336 + } + ], + "timestamp": null, + "release_timestamp": null, + "availability": null, + "view_count": 91, + "live_status": null, + "__x_forwarded_for_ip": null + }, + { + "_type": "url", + "ie_key": "Youtube", + "id": "P534wDZhc9M", + "url": "https://www.youtube.com/watch?v=P534wDZhc9M", + "title": "Xenus:\u0422\u043e\u0447\u043a\u0430 \u041a\u0438\u043f\u0435\u043d\u0438\u044f \u042d\u043f\u0438\u0437\u043e\u0434 6: \u0424\u0430\u0440\u043c\u0438\u043c \u0434\u0435\u043d\u044c\u0433\u0438 \u0432\u0441\u0435\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438 (No deaths challenge/\u0412\u044b\u0441\u043e\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c)", + "description": null, + "duration": 8425, + "channel_id": "UCbr4uFpFqPBzr7rlK-5F5YA", + "channel": "ProJecT Gamling", + "channel_url": "https://www.youtube.com/channel/UCbr4uFpFqPBzr7rlK-5F5YA", + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/P534wDZhc9M/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVPKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAkhaq0eA0SxpZDQ7ivvzKBwL9A8w", + "height": 94, + "width": 168 + }, + { + "url": "https://i.ytimg.com/vi/P534wDZhc9M/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVPKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAR4Mo6Qy1k-vvwr73y61W5yKw_fw", + "height": 110, + "width": 196 + }, + { + "url": "https://i.ytimg.com/vi/P534wDZhc9M/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFTyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAgwvqDV6rT3Y7RXT7mvlW1UXul6w", + "height": 138, + "width": 246 + }, + { + "url": "https://i.ytimg.com/vi/P534wDZhc9M/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFTyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDXEoQ0kwSJDrcOTgDLpUP9FEgSIA", + "height": 188, + "width": 336 + } + ], + "timestamp": null, + "release_timestamp": null, + "availability": null, + "view_count": 37, + "live_status": null, + "__x_forwarded_for_ip": null + }, + { + "_type": "url", + "ie_key": "Youtube", + "id": "DR0FKTr1Jio", + "url": "https://www.youtube.com/watch?v=DR0FKTr1Jio", + "title": "Xenus:\u0422\u043e\u0447\u043a\u0430 \u041a\u0438\u043f\u0435\u043d\u0438\u044f \u042d\u043f\u0438\u0437\u043e\u0434 7: \u0424\u0438\u0434\u0435\u043b\u044c \u0438 \u043a\u0432\u0435\u0441\u0442\u044b \u0437\u0430 \u043f\u0430\u0440\u0442\u0438\u0437\u0430\u043d (No deaths challenge/\u0412\u044b\u0441\u043e\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c)", + "description": null, + "duration": 7279, + "channel_id": "UCbr4uFpFqPBzr7rlK-5F5YA", + "channel": "ProJecT Gamling", + "channel_url": "https://www.youtube.com/channel/UCbr4uFpFqPBzr7rlK-5F5YA", + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/DR0FKTr1Jio/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVPKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAV09aPUf9nSDYh4iPY7uyMFJI-ew", + "height": 94, + "width": 168 + }, + { + "url": "https://i.ytimg.com/vi/DR0FKTr1Jio/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVPKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCFVW0FV35l2EvU5iwCJ7a_8UUYLA", + "height": 110, + "width": 196 + }, + { + "url": "https://i.ytimg.com/vi/DR0FKTr1Jio/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFTyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLC_LiauAAXVVHd6mbIKbOz0gMYFrA", + "height": 138, + "width": 246 + }, + { + "url": "https://i.ytimg.com/vi/DR0FKTr1Jio/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFTyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDGpVlX-vXY6u5QS5l8SO_DIMKIXQ", + "height": 188, + "width": 336 + } + ], + "timestamp": null, + "release_timestamp": null, + "availability": null, + "view_count": 31, + "live_status": null, + "__x_forwarded_for_ip": null + }, + { + "_type": "url", + "ie_key": "Youtube", + "id": "GyOWRUys0RA", + "url": "https://www.youtube.com/watch?v=GyOWRUys0RA", + "title": "Xenus:\u0422\u043e\u0447\u043a\u0430 \u041a\u0438\u043f\u0435\u043d\u0438\u044f \u042d\u043f\u0438\u0437\u043e\u0434 8: \u0410\u0446\u0442\u0435\u043a (No deaths challenge/\u0412\u044b\u0441\u043e\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c)", + "description": null, + "duration": 7160, + "channel_id": "UCbr4uFpFqPBzr7rlK-5F5YA", + "channel": "ProJecT Gamling", + "channel_url": "https://www.youtube.com/channel/UCbr4uFpFqPBzr7rlK-5F5YA", + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/GyOWRUys0RA/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVPKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCRsXEXRIY_PihywJJxgFXug1JVWw", + "height": 94, + "width": 168 + }, + { + "url": "https://i.ytimg.com/vi/GyOWRUys0RA/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVPKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBILToN1LcT7_HQVIGXqkyHlOcQww", + "height": 110, + "width": 196 + }, + { + "url": "https://i.ytimg.com/vi/GyOWRUys0RA/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFTyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAcAqnqO-EOFqC686cQDk7BgoW5sA", + "height": 138, + "width": 246 + }, + { + "url": "https://i.ytimg.com/vi/GyOWRUys0RA/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFTyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBlAc8bYpeeTceqegQXM1bLIjWiVw", + "height": 188, + "width": 336 + } + ], + "timestamp": null, + "release_timestamp": null, + "availability": null, + "view_count": 39, + "live_status": null, + "__x_forwarded_for_ip": null + }, + { + "_type": "url", + "ie_key": "Youtube", + "id": "CNUiW9NGQCA", + "url": "https://www.youtube.com/watch?v=CNUiW9NGQCA", + "title": "Xenus:\u0422\u043e\u0447\u043a\u0430 \u041a\u0438\u043f\u0435\u043d\u0438\u044f \u042d\u043f\u0438\u0437\u043e\u0434 9: \u041c\u0438\u0441\u0441\u0438\u0438 \u0437\u0430 \u041f\u0430\u0440\u0442\u0438\u0437\u0430\u043d \u0432 \u0441\u0442\u0440\u0430\u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u0435\u0439 (\u0412\u044b\u0441\u043e\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c)", + "description": null, + "duration": 10756, + "channel_id": "UCbr4uFpFqPBzr7rlK-5F5YA", + "channel": "ProJecT Gamling", + "channel_url": "https://www.youtube.com/channel/UCbr4uFpFqPBzr7rlK-5F5YA", + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/CNUiW9NGQCA/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVPKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC07-N2JcwqQfV3E3cleCN-oehjgQ", + "height": 94, + "width": 168 + }, + { + "url": "https://i.ytimg.com/vi/CNUiW9NGQCA/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVPKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDIMR2o_DRmQOyE-pGXvsstO9lpeg", + "height": 110, + "width": 196 + }, + { + "url": "https://i.ytimg.com/vi/CNUiW9NGQCA/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFTyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCdpBoNAdJBjaJ2ikbAAR2j54GeTA", + "height": 138, + "width": 246 + }, + { + "url": "https://i.ytimg.com/vi/CNUiW9NGQCA/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFTyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDSrvgtnSzdpw1VHBkdZGNp04YPig", + "height": 188, + "width": 336 + } + ], + "timestamp": null, + "release_timestamp": null, + "availability": null, + "view_count": 40, + "live_status": null, + "__x_forwarded_for_ip": null + }, + { + "_type": "url", + "ie_key": "Youtube", + "id": "JkNCGTt8diM", + "url": "https://www.youtube.com/watch?v=JkNCGTt8diM", + "title": "Xenus:\u0422\u043e\u0447\u043a\u0430 \u041a\u0438\u043f\u0435\u043d\u0438\u044f \u042d\u043f\u0438\u0437\u043e\u0434 10: \u041c\u0438\u0433\u0435\u043b\u044c \u0420\u043e\u0434\u0440\u0438\u0433\u0435\u0441 (\u0412\u044b\u0441\u043e\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c)", + "description": null, + "duration": 8818, + "channel_id": "UCbr4uFpFqPBzr7rlK-5F5YA", + "channel": "ProJecT Gamling", + "channel_url": "https://www.youtube.com/channel/UCbr4uFpFqPBzr7rlK-5F5YA", + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/JkNCGTt8diM/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVPKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAOd4scVHcQKL6ttQg0BuwJP5J0_g", + "height": 94, + "width": 168 + }, + { + "url": "https://i.ytimg.com/vi/JkNCGTt8diM/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVPKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCql2OaC3FL-IvfMTx3Fhhoy5oBtQ", + "height": 110, + "width": 196 + }, + { + "url": "https://i.ytimg.com/vi/JkNCGTt8diM/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFTyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBHENzTyGuaSATYDgZTRmVqFCK_DQ", + "height": 138, + "width": 246 + }, + { + "url": "https://i.ytimg.com/vi/JkNCGTt8diM/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFTyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDwU9gciLrbt9sAn2oKx4hhsIR2wQ", + "height": 188, + "width": 336 + } + ], + "timestamp": null, + "release_timestamp": null, + "availability": null, + "view_count": 53, + "live_status": null, + "__x_forwarded_for_ip": null + }, + { + "_type": "url", + "ie_key": "Youtube", + "id": "ra5msV_RVZM", + "url": "https://www.youtube.com/watch?v=ra5msV_RVZM", + "title": "Xenus: \u0422\u043e\u0447\u043a\u0430 \u041a\u0438\u043f\u0435\u043d\u0438\u044f \u042d\u043f\u0438\u0437\u043e\u0434 11: \u0410\u043d\u0442\u043e\u043d\u0438\u043e \u0438 \u0414\u043e\u043d \"\u0414\u0438\u0435\u0433\u043e\" (\u0412\u044b\u0441\u043e\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c)", + "description": null, + "duration": 8760, + "channel_id": "UCbr4uFpFqPBzr7rlK-5F5YA", + "channel": "ProJecT Gamling", + "channel_url": "https://www.youtube.com/channel/UCbr4uFpFqPBzr7rlK-5F5YA", + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/ra5msV_RVZM/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVPKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLB5DwHtTjVAezr-X3-Jfk2DC3gE6g", + "height": 94, + "width": 168 + }, + { + "url": "https://i.ytimg.com/vi/ra5msV_RVZM/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVPKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC0DFJFluruAhWpzSX1QvcSVZxXRg", + "height": 110, + "width": 196 + }, + { + "url": "https://i.ytimg.com/vi/ra5msV_RVZM/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFTyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAvXOOmuGaJvHV5P_7CORwrw1d9sw", + "height": 138, + "width": 246 + }, + { + "url": "https://i.ytimg.com/vi/ra5msV_RVZM/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFTyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAxc8YawtWWIXLwC3jGNX2GgQ9q4w", + "height": 188, + "width": 336 + } + ], + "timestamp": null, + "release_timestamp": null, + "availability": null, + "view_count": 43, + "live_status": null, + "__x_forwarded_for_ip": null + }, + { + "_type": "url", + "ie_key": "Youtube", + "id": "STvJ9UgLpxo", + "url": "https://www.youtube.com/watch?v=STvJ9UgLpxo", + "title": "Xenus: \u0422\u043e\u0447\u043a\u0430 \u041a\u0438\u043f\u0435\u043d\u0438\u044f \u042d\u043f\u0438\u0437\u043e\u0434 12: \u0427\u0435\u0440\u043d\u0430\u044f \u0411\u0430\u0448\u043d\u044f\" (\u0424\u0438\u043d\u0430\u043b, \u0412\u044b\u0441\u043e\u043a\u0430\u044f \u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c)", + "description": null, + "duration": 9779, + "channel_id": "UCbr4uFpFqPBzr7rlK-5F5YA", + "channel": "ProJecT Gamling", + "channel_url": "https://www.youtube.com/channel/UCbr4uFpFqPBzr7rlK-5F5YA", + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/STvJ9UgLpxo/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVPKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLB7CpfFtEvIbh_KN6sQd7BiUIYK7w", + "height": 94, + "width": 168 + }, + { + "url": "https://i.ytimg.com/vi/STvJ9UgLpxo/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVPKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBsyKFqH4Pi3DYffpxvsf92GLgLlg", + "height": 110, + "width": 196 + }, + { + "url": "https://i.ytimg.com/vi/STvJ9UgLpxo/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFTyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLC0esk0uMSEiE6l5kdvDDdn9WG5Kg", + "height": 138, + "width": 246 + }, + { + "url": "https://i.ytimg.com/vi/STvJ9UgLpxo/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFTyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCyRnPncOYDIQWQ-sIWTdHDGoTssQ", + "height": 188, + "width": 336 + } + ], + "timestamp": null, + "release_timestamp": null, + "availability": null, + "view_count": 52, + "live_status": null, + "__x_forwarded_for_ip": null + } + ], + "extractor_key": "YoutubeTab", + "extractor": "youtube:tab", + "webpage_url": "https://www.youtube.com/playlist?list=PLNu0CXJQy5DBk_ca7C7YOZUFC8XzIYuQf", + "original_url": "https://www.youtube.com/playlist?list=PLNu0CXJQy5DBk_ca7C7YOZUFC8XzIYuQf", + "webpage_url_basename": "playlist", + "webpage_url_domain": "youtube.com", + "__files_to_move": {}, + "epoch": 1678375177, + "_version": { + "version": "2023.03.04", + "current_git_head": null, + "release_git_head": "392389b7df7b818f794b231f14dc396d4875fbad", + "repository": "yt-dlp/yt-dlp" + } +} diff --git a/src/playlist.js b/src/playlist.js index 1f8fbb6..2e7cd89 100644 --- a/src/playlist.js +++ b/src/playlist.js @@ -117,7 +117,7 @@ function download(type) { format = "" } else { - format = `-f "${formatId}+m4a/mp4[height<=${quality}]+m4a/bv*[height<=${quality}]+ba/best"`; + format = `-f "${formatId}+m4a/mp4[height=${quality}]+m4a/bv*[height<=${quality}]+ba/best"`; } } else { format = getId("audioSelect").value; diff --git a/src/playlist_new.js b/src/playlist_new.js new file mode 100644 index 0000000..809d8b5 --- /dev/null +++ b/src/playlist_new.js @@ -0,0 +1,149 @@ +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 { execSync } = require("child_process"); +let url; +const ytDlp = localStorage.getItem("ytdlp"); +const ytdlp = new YTDlpWrap(ytDlp); +const downloadDir = localStorage.getItem("downloadPath"); +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, +}; +let originalCount = 0; +let ffmpeg; +let ffmpegPath; +if (os.platform() === "win32") { + ffmpeg = `"${__dirname}\\..\\ffmpeg.exe"`; + ffmpegPath = `${__dirname}\\..\\ffmpeg.exe`; +} else { + ffmpeg = `"${__dirname}/../ffmpeg"`; + ffmpegPath = `${__dirname}/../ffmpeg`; +} + +if (!fs.existsSync(ffmpegPath)) { + try { + ffmpeg = execSync("which ffmpeg", { encoding: "utf8" }); + ffmpeg = `"${ffmpeg.trimEnd()}"`; + } catch (error) { + console.log(error); + } +} +console.log("ffmpeg:", ffmpeg); + +let foldernameFormat = "%(playlist_title)s"; +let filenameFormat = "%(playlist_index)s.%(title)s.%(ext)s"; +let playlistIndex = 1; +let playlistEnd = ""; + +function getId(id) { + return document.getElementById(id); +} + +function pasteLink() { + const clipboardText = clipboard.readText(); + const data = execSync( + `yt-dlp --yes-playlist --no-warnings -J --flat-playlist "${clipboardText}"`, + { + encoding: "utf8", + } + ); + const parsed = JSON.parse(data); + console.log(parsed); + let items = ""; + parsed.entries.forEach((entry) => { + const randId = Math.random().toFixed(10).toString().slice(2); + + if (entry.channel) { + items += ` +
+ No thumbnail + +
+
${entry.title}
+
${formatTime(entry.duration)}
+ +
+
+ `; + } + }); + getId("data").innerHTML = items; +} + +getId("pasteLink").addEventListener("click", (e) => { + try { + pasteLink(); + } catch (error) { + console.log(error); + } +}); + +document.addEventListener("keydown", (event) => { + if (event.ctrlKey && event.key == "v") { + pasteLink(); + } +}); + +function formatTime(seconds) { + let hours = Math.floor(seconds / 3600); + let minutes = Math.floor((seconds - hours * 3600) / 60); + seconds = seconds - hours * 3600 - minutes * 60; + let formattedTime = ""; + + if (hours > 0) { + formattedTime += hours + ":"; + } + if (minutes < 10 && hours > 0) { + formattedTime += "0"; + } + formattedTime += minutes + ":"; + if (seconds < 10) { + formattedTime += "0"; + } + formattedTime += seconds; + return formattedTime; +} +function closeMenu() { + getId("menuIcon").style.transform = "rotate(0deg)"; + menuIsOpen = false; + let count = 0; + let opacity = 1; + const fade = setInterval(() => { + if (count >= 10) { + clearInterval(fade); + } else { + opacity -= 0.1; + getId("menu").style.opacity = opacity; + count++; + } + }, 50); +} + +getId("preferenceWin").addEventListener("click", () => { + closeMenu(); + ipcRenderer.send("load-page", __dirname + "/preferences.html"); +}); + +getId("aboutWin").addEventListener("click", () => { + closeMenu(); + ipcRenderer.send("load-page", __dirname + "/about.html"); +}); +getId("homeWin").addEventListener("click", () => { + closeMenu(); + ipcRenderer.send("load-win", __dirname + "/index.html"); +}); diff --git a/src/renderer.js b/src/renderer.js index c89b467..e765f20 100644 --- a/src/renderer.js +++ b/src/renderer.js @@ -1151,6 +1151,10 @@ getId("playlistWin").addEventListener("click", () => { closeMenu(); ipcRenderer.send("load-win", __dirname + "/playlist.html"); }); +getId("newPlaylistWin").addEventListener("click", () => { + closeMenu(); + ipcRenderer.send("load-win", __dirname + "/playlist_new.html"); +}); ipcRenderer.on("link", (event, text) => { pasteFromTray(text);