diff options
Diffstat (limited to 'main.js')
-rw-r--r-- | main.js | 128 |
1 files changed, 128 insertions, 0 deletions
@@ -0,0 +1,128 @@ +const api_key = "AIzaSyAAmnkuQN5XgLYaVQyiLh_Sj08zxLRXOTI" + +function makeUrl(base, data) { + if (data.length == 0) { + return data; + } else { + return base + "?" + data + .filter(x => x[1]) + .map(x => `${x[0]}=${x[1]}`) + .join("&"); + } +} + +const init = { + method: "GET", + referrer: "https://magnostherobot.xyz" +}; + +async function getInfos(ids) { + let data = [ + [ "part", "contentDetails,snippet" ], + [ "key", api_key ], + [ "id", ids.join(",") ] + ]; + + let url = makeUrl("https://www.googleapis.com/youtube/v3/videos", data); + return fetch(url, init).then(res => res.json()).then(res => res.items); +} + +async function getResultPage(q, cat, page, n) { + let data = [ + [ "part", "snippet" ], + [ "key", api_key ], + [ "eventType", "completed" ], + [ "maxResults", n ], + [ "order", "relevance" ], + [ "type", "video" ], + [ "q", q ], + [ "pageToken", page ], + [ "videoCategoryId", cat ] + ]; + + let nextPageToken = null; + + let url = makeUrl("https://www.googleapis.com/youtube/v3/search", data); + let res = await fetch(url, init).then(res => res.json()) + + let result = {}; + + if (res.items.length == 0) { + result.items = []; + } else { + result.items = await getInfos(res.items.map(x => x.id.videoId)); + } + + result.nextPageToken = res.nextPageToken; + + return result; +} + +function timeFrom(arr) { + let n = arr.length; + let result = 0; + for (let i = 1; i <= n; ++i) { + let m = n - i; + result += arr[m] * Math.pow(60, i - 1); + } + return result; +} + +function iso8601(str) { + return str.match(/\d+/g); +} + +async function getMoreResults(q, cat, t, dt, n) { + const maxQueryResults = 50; + let nextPage = null; + + let oldTbody = document.getElementById("results"); + let tbody = document.createElement("tbody"); + tbody.setAttribute("id", "results"); + oldTbody.parentNode.replaceChild(tbody, oldTbody); + + let results = []; + while (results.length < n) { + let moreResults = await getResultPage(q, cat, nextPage, maxQueryResults); + nextPage = moreResults.nextPageToken; + let filteredResults = moreResults.items.filter(x => { + let duration = iso8601(x.contentDetails.duration); + x.duration = duration; + duration = timeFrom(duration); + let mint = t - dt; + let maxt = t + dt; + return duration > mint && duration < maxt; + }); + + filteredResults.forEach(x => { + let row = tbody.insertRow(); + + let thumbCell = row.insertCell(); + let a = document.createElement("a"); + a.setAttribute("href", `https://youtu.be/${x.id}`); + let img = document.createElement("img"); + img.setAttribute("src", x.snippet.thumbnails.default.url); + a.appendChild(img); + thumbCell.appendChild(a); + + let nameCell = row.insertCell(); + nameCell.appendChild(document.createTextNode(x.snippet.title)); + nameCell.appendChild(document.createElement("br")); + nameCell.appendChild(document.createTextNode(x.duration.join(":"))); + }); + + results = results.concat(filteredResults); + console.log(results.length); + } + + console.log(results); + return results; +} + +function startSearch() { + let time = timeFrom([search.hrs.value, search.mins.value, + search.secs.value]); + let dtime = timeFrom([search.dhrs.value, search.dmins.value, + search.dsecs.value]); + getMoreResults(search.q.value, search.category.value, time, dtime, 30); +} |