/*Canopy - The next generation of stoner streaming software Copyright (C) 2024-2025 Rainbownapkin and the TTN Community This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see .*/ //NPM Imports const validator = require('validator');//No express here, so regular validator it is! //local import const iaUtil = require('./internetArchiveUtils'); const ytdlpUtil = require('./ytdlpUtils'); module.exports.yankMedia = async function(url, title){ //Get pull type const pullType = await this.getMediaType(url); //Check pull type switch(pullType.type){ case "ia": //return media object list from IA module return await iaUtil.fetchMetadata(pullType.id, title); case "yt": return await ytdlpUtil.fetchYoutubeVideoMetadata(pullType.id, title); default: //return null to signify a bad url return null; } } module.exports.refreshRawLink = async function(mediaObj){ switch(mediaObj.type){ case 'yt': //Re-fetch media metadata metadata = await ytdlpUtil.fetchYoutubeVideoMetadata(mediaObj.id); //Refresh media rawlink from metadata mediaObj.rawLink = metadata[0].rawLink; //return media object return mediaObj; } //Return null to tell the calling function there is no refresh required for this media type return null; } //I'd be lying if this didn't take at least some inspiration/regex patterns from extractQueryParam() in cytube/forest's browser-side 'util.js' //Still this has some improvements like url pre-checks and the fact that it's handled serverside, recuing possibility of bad requests. //Some of the regex expressions for certain services have also been improved, such as youtube, and the fore.st-unique archive.org module.exports.getMediaType = async function(url){ //Check if we have a valid url, encode it on the fly in case it's too humie-friendly if(!validator.isURL(encodeURI(url))){ //If not toss the fucker out return { type: null, id: null } } //If we have link to a resource from archive.org if(match = url.match(/archive\.org\/(?:details|download)\/([a-zA-Z0-9\/._-\s\%]+)/)){ //return internet archive code return { type: "ia", id: match[1] } } //If we have a match to a youtube video if((match = url.match(/youtube\.com\/watch\?v=([a-zA-Z0-9_-]{11})/)) || (match = url.match(/youtu\.be\/([a-zA-Z0-9_-]{11})/))){ //return youtube video id return { type: "yt", id: match[1] } } //If we fell through all of our media types without a match return{ type: null, id: null } }