diff --git a/yturlgen.js b/yturlgen.js new file mode 100644 index 0000000..d02463c --- /dev/null +++ b/yturlgen.js @@ -0,0 +1,83 @@ +// import required modules (npm install axios) +const fs = require('fs'); +const axios = require('axios'); +const path = require('path'); + +// set variables such as API and where the html file is stored +const API_KEY = 'YOUR_YOUTUBE_DATA_API_KEY'; // Replace with your actual YouTube Data API key +const htmlFilePath = path.join('/var/www/html', 'index.html'); // Set the file path to /var/www/html/index.html (or any other path you want, directory path and file name must be seperate in brackets) + + +// inital math by "SpiritAxolotl" on GitHub (https://github.com/SpiritAxolotl) +const chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTVWXYZ0123456789-_".split(""); +const randomChar = () => { + return chars[Math.floor(Math.random() * chars.length)]; +}; +const xRandomChars = (n) => { + let out = ""; + for (let i = 0; i < n; i++) + out += randomChar(); + return out; +}; + +// Create URL from above math, post it to YouTube API using a GET request and check if the video is public and embeddable. +const checkUrl = async (videoId) => { + const url = `https://www.googleapis.com/youtube/v3/videos?id=${videoId}&key=${API_KEY}&part=status`; + try { + const response = await axios.get(url); + if (response.data.items && response.data.items.length > 0) { + const videoStatus = response.data.items[0].status; + // Check if the video is public and embeddable + if (videoStatus.embeddable && videoStatus.privacyStatus === 'public') { + return true; + } + } + // If the bot is rate limited, produce an error message and wait for a while, otherwise continue + } catch (error) { + console.error('Error checking video ID:', error.message); + } + return false; +}; +// print message in console listing each URL generated and if it is valid or not for debugging purposes. +const generateAndCheckUrl = async () => { + while (true) { + const videoId = xRandomChars(11); + const url = `https://youtu.be/${videoId}`; + const isValid = await checkUrl(videoId); + if (isValid) { + console.log(`Valid URL: ${url}`); + appendToHtmlFile(url); + } else { + console.log(`Invalid URL: ${url}`); + } + } +}; +// print message in console if the URL is appended to the HTML file or if an error occurs for debugging purposes. +const appendToHtmlFile = (url) => { + const linkHtml = `${url}
\n`; + fs.appendFile(htmlFilePath, linkHtml, (err) => { + if (err) { + console.error('Error writing to HTML file:', err); + } else { + console.log('URL appended to HTML file:', url); + } + }); +}; + +// Initialize HTML file with basic structure and a header +fs.writeFile(htmlFilePath, 'Valid YouTube URLs\n

Valid Public YouTube URLs

\n

for any concerns, contact rei@reiyua.lol\n

Valid URLs will be listed below:

\n', (err) => { + if (err) { + console.error('Error initializing HTML file:', err); + } else { + generateAndCheckUrl(); + } +}); + +// Ensure HTML file is properly closed with a and on process exit +process.on('exit', () => { + fs.appendFileSync(htmlFilePath, ''); +}); + +process.on('SIGINT', () => { + process.exit(); +});