101 lines
3.4 KiB
JavaScript
101 lines
3.4 KiB
JavaScript
/*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 <https://www.gnu.org/licenses/>.*/
|
|
|
|
//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;
|
|
}
|
|
} |