/*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 loggerUtils = require('../../../utils/loggerUtils'); const iaUtil = require('../../../utils/media/internetArchiveUtils'); const media = require('./media'); module.exports = class{ constructor(server){ this.server = server; } defineListeners(socket){ socket.on("yank", (data) => {this.testYank(socket, data)}); socket.on("play", (data) => {this.testPlay(socket, data)}); } async testYank(socket, data){ try{ console.log(await this.yankMedia(data.url)); }catch(err){ return loggerUtils.socketExceptionHandler(socket, err); } } async testPlay(socket, data){ try{ //Pull media list const mediaList = await this.yankMedia(data.url); //Get active channel from server/socket const chan = this.server.activeChannels.get(socket.chan); //Queue the first media object given chan.queue.queueMedia(mediaList[0]); }catch(err){ return loggerUtils.socketExceptionHandler(socket, err); } } async yankMedia(url){ const pullType = await this.getMediaType(url); if(pullType == 'ia'){ //Create empty list to hold media objects const mediaList = []; //Pull metadata from IA const mediaInfo = await iaUtil.fetchMetadata(url); //for every compatible and relevant file returned from IA for(let file of mediaInfo.files){ //Split file path by directories const path = file.name.split('/'); //pull filename from path const name = path[path.length - 1]; //Construct link from pulled info const link = `https://archive.org/download/${mediaInfo.metadata.identifier}/${file.name}`; //Create new media object from file info mediaList.push(new media(name, name, link, 'ia', Number(file.length))); } //return media object list return mediaList; }else{ //return null to signify a bad url return null; } } async getMediaType(url){ //Check if we have a valid url if(!validator.isURL(url)){ //If not toss the fucker out return null; } //If we have link to a resource from archive.org if(url.match(/^https\:\/\/archive.org\//g)){ //return internet archive code return "ia"; } return null; } }