From 9e044cf82d76658626b152eecb185136cf1ae76a Mon Sep 17 00:00:00 2001
From: Siddheya Kulkarni <115717746+Asymtode712@users.noreply.github.com>
Date: Sun, 2 Jun 2024 23:07:14 +0530
Subject: [PATCH 01/10] added yt-video-downloader
---
.../client/index.html | 29 +
.../YouTube-Video-Downloader/client/index.js | 68 ++
.../client/styles.css | 85 ++
.../server/package-lock.json | 750 ++++++++++++++++++
.../server/package.json | 7 +
.../YouTube-Video-Downloader/server/server.js | 51 ++
6 files changed, 990 insertions(+)
create mode 100644 Node-JS-Projects/Basic/YouTube-Video-Downloader/client/index.html
create mode 100644 Node-JS-Projects/Basic/YouTube-Video-Downloader/client/index.js
create mode 100644 Node-JS-Projects/Basic/YouTube-Video-Downloader/client/styles.css
create mode 100644 Node-JS-Projects/Basic/YouTube-Video-Downloader/server/package-lock.json
create mode 100644 Node-JS-Projects/Basic/YouTube-Video-Downloader/server/package.json
create mode 100644 Node-JS-Projects/Basic/YouTube-Video-Downloader/server/server.js
diff --git a/Node-JS-Projects/Basic/YouTube-Video-Downloader/client/index.html b/Node-JS-Projects/Basic/YouTube-Video-Downloader/client/index.html
new file mode 100644
index 00000000..64a9a109
--- /dev/null
+++ b/Node-JS-Projects/Basic/YouTube-Video-Downloader/client/index.html
@@ -0,0 +1,29 @@
+
+
+
+
+ YouTube Video Downloader
+
+
+
+
+
YouTube Video Downloader
+
+
+
+
+
+
+
+
+
+
diff --git a/Node-JS-Projects/Basic/YouTube-Video-Downloader/client/index.js b/Node-JS-Projects/Basic/YouTube-Video-Downloader/client/index.js
new file mode 100644
index 00000000..356851d0
--- /dev/null
+++ b/Node-JS-Projects/Basic/YouTube-Video-Downloader/client/index.js
@@ -0,0 +1,68 @@
+document.querySelector('#downloadBtn').addEventListener('click', handleVideoDownload);
+
+async function handleVideoDownload() {
+ const videoLink = document.querySelector('#videoUrl').value;
+ const videoQuality = document.querySelector('#quality').value;
+
+ if (!validateYouTubeUrl(videoLink)) {
+ alert('Please enter a valid YouTube video URL.');
+ return;
+ }
+
+ const vidId = getVideoIdFromUrl(videoLink);
+
+ try {
+ displayMessage('Downloading...');
+
+ console.log(`Requesting video from: http://localhost:3000/download?videoId=${vidId}&quality=${videoQuality}`);
+ const response = await fetch(`http://localhost:3000/download?videoId=${vidId}&quality=${videoQuality}`);
+
+ if (!response.ok) {
+ const errorText = await response.text();
+ throw new Error(`Network response was not ok: ${response.statusText}. Error message: ${errorText}`);
+ }
+
+ const videoBlob = await response.blob();
+ const downloadUrl = URL.createObjectURL(videoBlob);
+
+ const anchorElement = document.createElement('a');
+ anchorElement.style.display = 'none';
+ anchorElement.href = downloadUrl;
+ anchorElement.download = 'video.mp4';
+ document.body.appendChild(anchorElement);
+ anchorElement.click();
+ URL.revokeObjectURL(downloadUrl);
+
+ displayMessage('Download completed.');
+ } catch (error) {
+ console.error('Error downloading the video:', error);
+ displayMessage('Error downloading the video.');
+ }
+}
+
+function validateYouTubeUrl(url) {
+ const regex = /^(http(s)?:\/\/)?((w){3}.)?youtu(be|.be)?(\.com)?\/.+/i;
+ return regex.test(url);
+}
+
+function getVideoIdFromUrl(url) {
+ let vidId = '';
+ const urlSearchParams = new URLSearchParams(new URL(url).search);
+ if (url.includes('youtube.com') && urlSearchParams.has('v')) {
+ vidId = urlSearchParams.get('v');
+ } else if (url.includes('youtu.be')) {
+ vidId = new URL(url).pathname.slice(1);
+ }
+
+ const idRegex = /^[a-zA-Z0-9-_]{11}$/;
+ if (!idRegex.test(vidId)) {
+ throw new Error(`Invalid video ID: ${vidId}`);
+ }
+
+ return vidId;
+}
+
+function displayMessage(msg) {
+ const msgDiv = document.querySelector('#message');
+ msgDiv.innerText = msg;
+}
diff --git a/Node-JS-Projects/Basic/YouTube-Video-Downloader/client/styles.css b/Node-JS-Projects/Basic/YouTube-Video-Downloader/client/styles.css
new file mode 100644
index 00000000..12499102
--- /dev/null
+++ b/Node-JS-Projects/Basic/YouTube-Video-Downloader/client/styles.css
@@ -0,0 +1,85 @@
+body {
+ font-family: Arial, sans-serif;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ background-image: linear-gradient( to right, #FEB692 10%, #EA5455 100%);
+}
+
+.container {
+ margin-top: 200px;
+ width: 450px;
+ height: 300px;
+ padding: 20px;
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.8);
+ background-color: #fff;
+ border-radius: 8px;
+ text-align: center;
+}
+
+h1 {
+ font-size: 1.8em;
+ margin-bottom: 20px;
+ color: #ff0000;
+}
+
+input[type="text"] {
+ width: 250px;
+ padding: 10px;
+ margin-bottom: 20px;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ transition: border-color 0.3s ease;
+}
+
+input[type="text"]:focus {
+ border-color: #ff0000;
+ outline: none;
+}
+
+select {
+ width: 150px;
+ padding: 10px;
+ margin-bottom: 20px;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ background-color: #fff;
+ color: #000;
+}
+
+button {
+ padding: 10px 20px;
+ background-color: #ff0000;
+ color: #fff;
+ border: none;
+ border-radius: 4px;
+ cursor: pointer;
+ transition: background-color 0.3s ease;
+}
+
+button:hover {
+ background-color: #cc0000;
+}
+
+#downloadLinks {
+ margin-top: 20px;
+ text-align: left;
+}
+
+#downloadLinks a {
+ display: block;
+ margin-bottom: 10px;
+ color: #ff0000;
+ text-decoration: none;
+ transition: color 0.3s ease;
+}
+
+#downloadLinks a:hover {
+ color: #cc0000;
+}
+
+#message {
+ margin-top: 20px;
+ color: #555;
+ font-size: 1.2em;
+}
diff --git a/Node-JS-Projects/Basic/YouTube-Video-Downloader/server/package-lock.json b/Node-JS-Projects/Basic/YouTube-Video-Downloader/server/package-lock.json
new file mode 100644
index 00000000..5cb5a7b7
--- /dev/null
+++ b/Node-JS-Projects/Basic/YouTube-Video-Downloader/server/package-lock.json
@@ -0,0 +1,750 @@
+{
+ "name": "YouTube Video Downloader",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "dependencies": {
+ "cors": "^2.8.5",
+ "express": "^4.19.2",
+ "ytdl-core": "^4.11.5"
+ }
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
+ },
+ "node_modules/body-parser": {
+ "version": "1.20.2",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
+ "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.5",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.11.0",
+ "raw-body": "2.5.2",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
+ "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
+ },
+ "node_modules/cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "dependencies": {
+ "object-assign": "^4",
+ "vary": "^1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
+ },
+ "node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
+ "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+ "dependencies": {
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/express": {
+ "version": "4.19.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
+ "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.20.2",
+ "content-disposition": "0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "0.6.0",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.2.0",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.7",
+ "qs": "6.11.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "0.18.0",
+ "serve-static": "1.15.0",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
+ "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "2.0.1",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "dependencies": {
+ "get-intrinsic": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
+ "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/m3u8stream": {
+ "version": "0.8.6",
+ "resolved": "https://registry.npmjs.org/m3u8stream/-/m3u8stream-0.8.6.tgz",
+ "integrity": "sha512-LZj8kIVf9KCphiHmH7sbFQTVe4tOemb202fWwvJwR9W5ENW/1hxJN6ksAWGhQgSBSa3jyWhnjKU1Fw1GaOdbyA==",
+ "dependencies": {
+ "miniget": "^4.2.2",
+ "sax": "^1.2.4"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/miniget": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/miniget/-/miniget-4.2.3.tgz",
+ "integrity": "sha512-SjbDPDICJ1zT+ZvQwK0hUcRY4wxlhhNpHL9nJOB2MEAXRGagTljsO8MEDzQMTFf0Q8g4QNi8P9lEm/g7e+qgzA==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
+ "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "dependencies": {
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "node_modules/sax": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz",
+ "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA=="
+ },
+ "node_modules/send": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
+ "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "node_modules/serve-static": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
+ "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+ "dependencies": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.18.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
+ },
+ "node_modules/side-channel": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
+ "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4",
+ "object-inspect": "^1.13.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/ytdl-core": {
+ "version": "4.11.5",
+ "resolved": "https://registry.npmjs.org/ytdl-core/-/ytdl-core-4.11.5.tgz",
+ "integrity": "sha512-27LwsW4n4nyNviRCO1hmr8Wr5J1wLLMawHCQvH8Fk0hiRqrxuIu028WzbJetiYH28K8XDbeinYW4/wcHQD1EXA==",
+ "dependencies": {
+ "m3u8stream": "^0.8.6",
+ "miniget": "^4.2.2",
+ "sax": "^1.1.3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ }
+ }
+}
diff --git a/Node-JS-Projects/Basic/YouTube-Video-Downloader/server/package.json b/Node-JS-Projects/Basic/YouTube-Video-Downloader/server/package.json
new file mode 100644
index 00000000..c98258b8
--- /dev/null
+++ b/Node-JS-Projects/Basic/YouTube-Video-Downloader/server/package.json
@@ -0,0 +1,7 @@
+{
+ "dependencies": {
+ "cors": "^2.8.5",
+ "express": "^4.19.2",
+ "ytdl-core": "^4.11.5"
+ }
+}
diff --git a/Node-JS-Projects/Basic/YouTube-Video-Downloader/server/server.js b/Node-JS-Projects/Basic/YouTube-Video-Downloader/server/server.js
new file mode 100644
index 00000000..df224d2c
--- /dev/null
+++ b/Node-JS-Projects/Basic/YouTube-Video-Downloader/server/server.js
@@ -0,0 +1,51 @@
+const express = require('express');
+const ytdl = require('ytdl-core');
+const cors = require('cors');
+const app = express();
+const port = 3000;
+
+app.use(cors());
+
+app.get('/', (req, res) => {
+ res.send('Hello World!');
+});
+
+app.get('/download', async (req, res) => {
+ try {
+ const videoId = req.query.videoId;
+ const quality = req.query.quality || '1080p'; // Default quality set to 1080p
+
+ // Validate videoId format
+ if (!isValidVideoIdFormat(videoId)) {
+ return res.status(400).send('Invalid video ID format');
+ }
+
+ const url = `https://www.youtube.com/watch?v=${videoId}`;
+ const info = await ytdl.getInfo(url);
+
+ // Check if the requested quality is available
+ const availableQualities = ['144p', '240p', '360p', '480p', '720p', '1080p', '1440p'];
+ if (!availableQualities.includes(quality)) {
+ return res.status(400).send(`Requested quality (${quality}) is not available. Available qualities: ${availableQualities.join(', ')}`);
+ }
+
+ // Find the format with the desired quality
+ const format = info.formats.find(format => format.qualityLabel === quality);
+
+ res.header('Content-Disposition', 'attachment; filename="video.mp4"');
+ ytdl(url, { format }).pipe(res);
+ } catch (error) {
+ console.error('Error downloading the video:', error);
+ res.status(500).send('Error downloading the video');
+ }
+});
+
+
+
+app.listen(port, () => {
+ console.log(`Server is running on http://localhost:${port}`);
+});
+
+function isValidVideoIdFormat(videoId) {
+ return /^[a-zA-Z0-9-_]{11}$/.test(videoId);
+}
From d39dc83a840d5c00371aa59781e408b8662c67ad Mon Sep 17 00:00:00 2001
From: Siddheya Kulkarni <115717746+Asymtode712@users.noreply.github.com>
Date: Sun, 2 Jun 2024 23:12:06 +0530
Subject: [PATCH 02/10] added screenshot.webp
---
.../YouTube-Video-Downloader/screenshot.webp | Bin 0 -> 319640 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 Node-JS-Projects/Basic/YouTube-Video-Downloader/screenshot.webp
diff --git a/Node-JS-Projects/Basic/YouTube-Video-Downloader/screenshot.webp b/Node-JS-Projects/Basic/YouTube-Video-Downloader/screenshot.webp
new file mode 100644
index 0000000000000000000000000000000000000000..8932efa5d43a2783ad1e88eddc4d8a64575c2053
GIT binary patch
literal 319640
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%0D{v}b4K(OF^fr3d6(m?z(D
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
Oc}tYL7G(y0bw!t)1&pdYEw!k9BO
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
z%0A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