diff --git a/src/app/channel/media/archivedMedia.js b/src/app/channel/media/archivedMedia.js deleted file mode 100644 index 9aaa85f..0000000 --- a/src/app/channel/media/archivedMedia.js +++ /dev/null @@ -1,135 +0,0 @@ -/*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 .*/ - -//Local Imports -const media = require('./media'); -const queuedMedia = require('./queuedMedia'); - -/** - * Class extending media which represents a queued piece of media - * @extends media - */ -class archivedMedia extends queuedMedia{ - /** - * Creates a new queued media object - * @param {String} channel - Channel where object was queued - */ - constructor(title, fileName, url, id, type, duration, rawLink, startTime, startTimeStamp = 0, earlyEnd, uuid, channel){ - //Call derived constructor - super(title, fileName, url, id, type, duration, rawLink, startTime, startTimeStamp, earlyEnd, uuid); - - /** - * Channel media was queued - */ - this.channel = channel; - - /** - * Media status type - */ - this.status = 'archived'; - } - - //statics - /** - * Creates a archivedMedia object from a media object - * @param {String} channel - Channel where object was queued - * @returns {archivedMedia} queuedMedia object created from given media object - */ - static fromMedia(media, startTime, startTimeStamp, channel){ - //Create and return queuedMedia object from given media object and arguments - return new this( - media.title, - media.fileName, - media.url, - media.id, - media.type, - media.duration, - media.rawLink, - startTime, - startTimeStamp, - null, - null, - channel); - } - - /** - * Creates a archivedMedia object from a queuedMedia object - * @param {String} channel - Channel where object was queued - * @returns {archivedMedia} queuedMedia object created from given media object - */ - static fromQueuedMedia(media, channel){ - //Create and return queuedMedia object from given media object and arguments - return new this( - media.title, - media.fileName, - media.url, - media.id, - media.type, - media.duration, - media.rawLink, - media.startTime, - media.startTimeStamp, - media.earlyEnd, - null, - channel); - } - - /** - * Converts array of media objects into array of archivedMedia objects - * @param {String} channel - Channel where object was queued - * @returns Array of converted queued media objects - */ - static fromMediaArray(mediaList, start, channel){ - //Queued Media List - const archivedMediaList = []; - //Start Time Offset - let startOffset = 0; - - for(let media of mediaList){ - //Convert mediaObj to queuedMedia and push to the back of the list - archivedMediaList.push(this.fromMedia(media, start + startOffset, 0, channel)); - - //Set start offset to end of the current item - startOffset += (media.duration * 1000) + 5; - } - - return archivedMediaList; - } - - //methods - /** - * Generates a unique clone of a given media object - * @returns unique clone of media object - */ - clone(){ - return new archivedMedia( - this.title, - this.fileName, - this.url, - this.id, - this.type, - this.duration, - this.rawLink, - this.startTime, - this.startTimeStamp, - this.earlyEnd, - null, - this.channel - ); - } -} - -module.exports = archivedMedia; \ No newline at end of file diff --git a/src/app/channel/media/queue.js b/src/app/channel/media/queue.js index 8c6b092..0036019 100644 --- a/src/app/channel/media/queue.js +++ b/src/app/channel/media/queue.js @@ -20,12 +20,10 @@ const validator = require('validator'); //Local imports const config = require('../../../../config.json'); const queuedMedia = require('./queuedMedia'); -const archivedMedia = require('./archivedMedia'); const yanker = require('../../../utils/media/yanker'); const loggerUtils = require('../../../utils/loggerUtils'); const channelModel = require('../../../schemas/channel/channelSchema'); const permissionModel = require('../../../schemas/permissionSchema'); -const archivedMediaModel = require('../../../schemas/channel/media/archivedMediaSchema'); /** * Object represneting a single channel's media queue @@ -769,7 +767,7 @@ class queue{ //Get requested media const media = this.getItemByUUID(uuid); - //If we couldn't find anything in the current channel schedule + //If we got a bad request if(media == null){ try{ //If we wheren't handed a channel @@ -1147,7 +1145,7 @@ class queue{ //If nowPlaying isn't null and isn't what we're about to throw on if(chanDB.media.nowPlaying != null && chanDB.media.nowPlaying.uuid.toString() != mediaObj.uuid){ //Archive whats already in there since we're about to clobber the fuck out of it - this.archiveMedia(chanDB.media.nowPlaying); + chanDB.media.archived.push(chanDB.media.nowPlaying); } //Set the now playing queued media document @@ -1286,7 +1284,7 @@ class queue{ //If archiving is enabled if(!noArchive){ //Add the item to the channel archive - this.archiveMedia(wasPlaying); + chanDB.media.archived.push(wasPlaying); } //broadcast queue using unsaved archive, run this before chanDB.save() for better responsiveness @@ -1385,7 +1383,7 @@ class queue{ let finished = false; //Throw the livestream into the archive - this.archiveMedia(wasPlaying); + chanDB.media.archived.push(wasPlaying); //Save the DB await chanDB.save(); @@ -1470,7 +1468,7 @@ class queue{ } //Throw the livestream into the archive - this.archiveMedia(wasPlaying); + chanDB.media.archived.push(wasPlaying); //Set the current place to schedule items at 5ms after the end of the live stream let curPlace = wasPlaying.getEndTime() + 5; @@ -1812,7 +1810,7 @@ class queue{ chanDB.media.nowPlaying = null; //Archive the bitch - this.archiveMedia(wasPlaying); + chanDB.media.archived.push(wasPlaying); } } @@ -1842,7 +1840,7 @@ class queue{ //If it's been ended }else{ //Archive ended media - this.archiveMedia(record); + chanDB.media.archived.push(record); } } } @@ -1894,17 +1892,6 @@ class queue{ loggerUtils.localExceptionHandler(err); } } - - /** - * Commits a queuedMedia object to the media archives - * @param {queuedMedia} media - Media object to be archived - */ - async archiveMedia(media){ - //Convert queuedMedia object to archivedMedia object - let archived = archivedMedia.fromQueuedMedia(media, this.channel.name); - //Save archivedMedia object to site-wide media archive (gross but performant) - let archivedDoc = await archivedMediaModel.create(archived); - } } module.exports = queue; \ No newline at end of file diff --git a/src/app/channel/media/queueBroadcastManager.js b/src/app/channel/media/queueBroadcastManager.js index 7e07d95..61e0497 100644 --- a/src/app/channel/media/queueBroadcastManager.js +++ b/src/app/channel/media/queueBroadcastManager.js @@ -21,7 +21,7 @@ const loggerUtils = require("../../../utils/loggerUtils"); const channelModel = require("../../../schemas/channel/channelSchema"); /** - * Class containg per-channel server-side queue broadcasting logic + * Class containg global server-side private message relay logic * * Exists to make broadcasting channel queues to groups of authenticated users with the 'read-queue' perm as painless as possible, * reducing DB call/perm checks to just connection time, and not requireing any out-of-library user iteration at broadcast time. diff --git a/src/schemas/channel/media/archivedMediaSchema.js b/src/schemas/channel/media/archivedMediaSchema.js deleted file mode 100644 index 115d45d..0000000 --- a/src/schemas/channel/media/archivedMediaSchema.js +++ /dev/null @@ -1,80 +0,0 @@ -/*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 {mongoose} = require('mongoose'); - -//Local Imports -const mediaSchema = require('./mediaSchema'); -const archivedMedia = require('../../../app/channel/media/archivedMedia'); - -/** - * DB Schema for documents representing a queued media object - */ -const archivedProperties = new mongoose.Schema({ - channel: { - type: mongoose.SchemaTypes.String, - required: true, - }, - startTime: { - type: mongoose.SchemaTypes.Number, - required: true, - }, - startTimeStamp: { - type: mongoose.SchemaTypes.Number, - required: false, - }, - earlyEnd: { - type: mongoose.SchemaTypes.Number, - required: false, - }, - uuid: { - type: mongoose.SchemaTypes.UUID, - required: true, - }, -}, -{ - discriminatorKey: 'status' -}); - -//Methods -/** - * Rehydrate to a full phat archived media object - * @returns {archivedMedia} A full phat archived media object, re-hydrated from the DB - */ -archivedProperties.methods.rehydrate = function(){ - return new archivedMedia( - this.title, - this.fileName, - this.url, - this.id, - this.type, - this.duration, - //We don't save raw links that are stored seperate from the standard URL as they tend to expire. - undefined, - this.startTime, - this.startTimeStamp, - this.earlyEnd, - this.uuid.toString(), - this.channel - ); -} - -//Create 'archivedMediaSchema' as descriminator of mediaSchema -var archivedMediaSchema = mediaSchema.discriminator('archived', archivedProperties); - -//Export mongoose model based on archivedSchema -module.exports = mongoose.model("archivedMedia", archivedMediaSchema); \ No newline at end of file