Untitled
unknown
javascript
2 years ago
7.5 kB
5
Indexable
const fetch = require('node-fetch'); //let urlElement = document.getElementById("url"); let videoList = []; let currentIndex = videoList.length; let reg = /\||\\|\/|:|\\?|"|<|>/; verifyUrl = (url) => { const regexPlaylist = /(?:\?list=([\w]+))/; let urlData = { id: "", type: "" } let retrievedRegexFromPlaylist = regexPlaylist.exec(url) let playlistID = retrievedRegexFromPlaylist ? retrievedRegexFromPlaylist[1] : null; if (playlistID) { urlData.id = playlistID urlData.type = "playlist" return urlData } else { const regexVideo = /(?:(?:\.be\/|\/embed\/|\/v\/|\?v=)([\w\-]+))/; let retrievedRegexFromVideoUrl = regexVideo.exec(url); let videoID = retrievedRegexFromVideoUrl ? retrievedRegexFromVideoUrl[1] : null; if (videoID) { urlData.id = videoID; urlData.type = "video"; return urlData; } else { urlData.type = null return urlData } } } LogMinorEvent = (message) => { let minorEventsElement = document.getElementById("logMinorEvents"); minorEventsElement.textContent = `${message}`; } // dom manipulation AddLinkToList = () => { url = urlElement.value; let urlInfo = verifyUrl(url); // console.log(`URL: ${id}`) if (!urlInfo.type) { return LogMinorEvent("No ID found on this URL.") } if (urlInfo.type === "playlist") { // fetch playlist all tokens etc populate videolist, update html } else if (urlInfo.type === "video" && !videoList.includes(urlInfo.id)) { LogMinorEvent(`Video with ID ${urlInfo.id} added successfuly to the list.`); videoList.push(urlInfo.id); // Creation of both uls on order/description const orderList = document.getElementById(`orderList`); const descriptionList = document.getElementById(`descriptionList`); // add lis as needed AddItemsToList(orderList, descriptionList, videoList) } else { LogMinorEvent("Video already on playlist, please insert another URL.") } } AddPropertiesToItems = (orderItem, descriptionItem, itemClass, videoList) => { const identificationList = ["order", "description"]; const itemsList = [orderItem, descriptionItem]; itemsList.forEach((element, i) => { let itemId = `${identificationList[i]}Item${videoList.length}`; let descriptionContent = videoList[videoList.length-1]; let orderContent = videoList.length; element.setAttribute("id", itemId); element.textContent = identificationList[i] == "order" ? orderContent : descriptionContent; element.classList.add(itemClass) }); } AddItemsToList= (orderList, descriptionList, videoList) => { let itemsClass = videoList.length%2===0 ? "brighter" : "darker"; let orderItem = document.createElement("li"); let descriptionItem = document.createElement("li"); AddPropertiesToItems(orderItem, descriptionItem, itemsClass, videoList); orderList.appendChild(orderItem); descriptionList.appendChild(descriptionItem); console.log(`videoList: ${videoList}`) } // fetch api for apikey FetchApiKey= () => { return fetch('http://localhost:3000/key') .then(response => { return response.json(); }) .then(data => { //console.log(data) return data }) .catch(error => console.error(error)); } isThereAnyApiKey = async () => { let key = await FetchApiKey(); if (!key) { return null } else { return key } } let testUrl = 'https://www.youtube.com/watch?v=T3bdk8ch78I'; let testUrl2 = 'https://www.youtube.com/playlist?list=PLFKZse17Cp_SjBRGJ9eIwYy9520VoCjMB' let testUrl3 = 'https://www.youtube.com/playlist?list=PLDIoUOhQQPlXr63I_vwF9GD8sAKh77dWU' // build url stuff/query PopulateList = () => { let urlInfo = verifyUrl(testUrl3) BuildListObject(urlInfo); } BuildListObject = async (urlObject) => { let apiKey = await isThereAnyApiKey(); if (apiKey) { //do stuff with youtube api let baseURL = await BuildBaseUrl(urlObject, apiKey); let queryObject = await QueryDataFromApi(baseURL) let nextPageToken = queryObject.nextPageToken; if (queryObject.nextPageToken) { console.log(`\nPagetoken ${queryObject.nextPageToken} found. Playlist has more than 50 videos, iterating through all nextPageTokens to grab all available videos.`) //console.log(queryObject) while (nextPageToken) { console.log(`\nEntering with token ${nextPageToken}`) const nextQueryObject = await QueryDataFromApi(queryObject, nextPageToken); queryObject = { ...queryObject, items: [...queryObject.items, ...nextQueryObject.items], nextPageToken: [...queryObject.nextPageToken, ...nextQueryObject.nextPageToken] } nextPageToken = nextQueryObject.nextPageToken; console.log(`Leaving with token ${nextPageToken}`) } } else { console.log('\nNo pagetoken found.') } } else { // straight node js child process with web socket/express api to handle downloads and feedback do update dom } } BuildBaseUrl = async (urlInfo, apiKey) => { if (urlInfo.type === "playlist") { let baseURL = `https://www.googleapis.com/youtube/v3/playlistItems?part=snippet,status&fields=items(status(privacyStatus),snippet(title,resourceId)),nextPageToken&playlistId=${urlInfo.id}&maxResults=50&key=${apiKey}` console.log(`built http request for playlist as ${baseURL}`) return baseURL } else if (urlInfo.type === "video") { let baseURL = `https://www.googleapis.com/youtube/v3/videos?part=snippet,status&field=snippet(title,thumbnails)&maxResults=50&id=${urlInfo.id}&key=${apiKey}` console.log(`built http request for video as \n${baseURL}`) return baseURL } } QueryDataFromApi = async (baseURL, pageToken) => { url = await BuildQueryUrl(baseURL, pageToken) return fetch(`${url}`) .then(console.log(`\nFetching ID: ${url}`)) .then(response => response.json()) .then(data => { const items = data.items .filter(item => item.status.privacyStatus === 'public') .map((item, i) => ({ id: (item.id) ? item.id : item.snippet.resourceId.videoId, title: item.snippet.title.replace(reg, "") })) return { items: items, nextPageToken: (data.nextPageToken) ? data.nextPageToken : null } }) } BuildQueryUrl = (baseURL, pageToken) => { const urlStructure = { base: baseURL, token: `&pageToken=${pageToken}` } console.log(`\nBaseURL ${urlStructure.base}`); if (pageToken) { console.log(`\nBuilt query URL as ${urlStructure.base+urlStructure.token} or ${urlStructure.base}${urlStructure.token}`) return urlStructure.base+urlStructure.token; } return urlStructure.base; } PopulateList();
Editor is loading...