diff --git a/src/app/channel/media/playlistHandler.js b/src/app/channel/media/playlistHandler.js
index 8b73805..5b56c8b 100644
--- a/src/app/channel/media/playlistHandler.js
+++ b/src/app/channel/media/playlistHandler.js
@@ -32,106 +32,196 @@ module.exports = class{
}
defineListeners(socket){
- //socket.on("queue", (data) => {this.queueURL(socket, data)});
socket.on("getChannelPlaylists", () => {this.getChannelPlaylists(socket)});
socket.on("createChannelPlaylist", (data) => {this.createChannelPlaylist(socket, data)});
socket.on("deleteChannelPlaylist", (data) => {this.deleteChannelPlaylist(socket, data)});
socket.on("addToChannelPlaylist", (data) => {this.addToChannelPlaylist(socket, data)});
socket.on("queueChannelPlaylist", (data) => {this.queueChannelPlaylist(socket, data)});
+ socket.on("renameChannelPlaylist", (data) => {this.renameChannelPlaylist(socket, data)});
}
//--- USER-FACING PLAYLIST FUNCTIONS ---
async getChannelPlaylists(socket, chanDB){
- //if we wherent handed a channel document
- if(chanDB == null){
- //Pull it based on channel name
- chanDB = await channelModel.findOne({name: this.channel.name});
- }
+ try{
+ //if we wherent handed a channel document
+ if(chanDB == null){
+ //Pull it based on channel name
+ chanDB = await channelModel.findOne({name: this.channel.name});
+ }
- //Return playlists
- socket.emit('chanPlaylists', chanDB.getPlaylists());
+ //Return playlists
+ socket.emit('chanPlaylists', chanDB.getPlaylists());
+ }catch(err){
+ return loggerUtils.socketExceptionHandler(socket, err);
+ }
}
async createChannelPlaylist(socket, data, chanDB){
- //if we wherent handed a channel document
- if(chanDB == null){
- //Pull it based on channel name
- chanDB = await channelModel.findOne({name: this.channel.name});
+ try{
+ //if we wherent handed a channel document
+ if(chanDB == null){
+ //Pull it based on channel name
+ chanDB = await channelModel.findOne({name: this.channel.name});
+ }
+
+ //If the title is too long
+ if(!validator.isLength(data.playlist, {max:30})){
+ //Bitch, moan, complain...
+ loggerUtils.socketErrorHandler(socket, "Playlist name too long!", "validation");
+ //and ignore it!
+ return;
+ }
+
+ //Escape/trim the playlist name
+ const name = validator.escape(validator.trim(data.playlist));
+
+ //Add playlist to the channel doc
+ chanDB.media.playlists.push({
+ name,
+ defaultTitles: data.defaultTitles
+ });
+
+ //Save the channel doc
+ await chanDB.save();
+
+ //Return playlists from channel doc
+ socket.emit('chanPlaylists', chanDB.getPlaylists());
+ }catch(err){
+ return loggerUtils.socketExceptionHandler(socket, err);
}
-
- //Add playlist to the channel doc
- chanDB.media.playlists.push({
- name: data.playlist,
- defaultTitles: data.defaultTitles
- });
-
- //Save the channel doc
- await chanDB.save();
-
- //Return playlists from channel doc
- socket.emit('chanPlaylists', chanDB.getPlaylists());
}
async deleteChannelPlaylist(socket, data, chanDB){
- //if we wherent handed a channel document
- if(chanDB == null){
- //Pull it based on channel name
- chanDB = await channelModel.findOne({name: this.channel.name});
+ try{
+ //if we wherent handed a channel document
+ if(chanDB == null){
+ //Pull it based on channel name
+ chanDB = await channelModel.findOne({name: this.channel.name});
+ }
+
+ //Delete playlist name
+ await chanDB.deletePlaylistByName(data.playlist);
+
+ //Return playlists from channel doc
+ socket.emit('chanPlaylists', chanDB.getPlaylists());
+ }catch(err){
+ return loggerUtils.socketExceptionHandler(socket, err);
}
-
- //Delete playlist name
- await chanDB.deletePlaylistByName(data.playlist);
-
- //Return playlists from channel doc
- socket.emit('chanPlaylists', chanDB.getPlaylists());
}
async addToChannelPlaylist(socket, data, chanDB){
- //if we wherent handed a channel document
- if(chanDB == null){
- //Pull it based on channel name
- chanDB = await channelModel.findOne({name: this.channel.name});
+ try{
+ //if we wherent handed a channel document
+ if(chanDB == null){
+ //Pull it based on channel name
+ chanDB = await channelModel.findOne({name: this.channel.name});
+ }
+
+ let url = data.url
+
+ //If we where given a bad URL
+ if(!validator.isURL(url)){
+ //Attempt to fix the situation by encoding it
+ url = encodeURI(url);
+
+ //If it's still bad
+ if(!validator.isURL(url)){
+ //Bitch, moan, complain...
+ loggerUtils.socketErrorHandler(socket, "Bad URL!", "validation");
+ //and ignore it!
+ return;
+ }
+ }
+
+ //Pull media metadata
+ let mediaList = await yanker.yankMedia(url);
+
+ //If we didn't get any media
+ if(mediaList.length == 0 || mediaList == null){
+ //Bitch, moan, complain...
+ loggerUtils.socketErrorHandler(socket, "No media found!", "queue");
+ //and ignore it!
+ return;
+ }
+
+ //Add media object to the given playlist
+ await chanDB.addToPlaylist(data.playlist, mediaList[0]);
+
+ //Return playlists from channel doc
+ socket.emit('chanPlaylists', chanDB.getPlaylists());
+ }catch(err){
+ return loggerUtils.socketExceptionHandler(socket, err);
}
-
- //Pull media metadata
- let mediaList = await yanker.yankMedia(data.url);
-
- //Add media object to the given playlist
- await chanDB.addToPlaylist(data.playlist, mediaList[0]);
-
- //Return playlists from channel doc
- socket.emit('chanPlaylists', chanDB.getPlaylists());
}
async queueChannelPlaylist(socket, data, chanDB){
- //if we wherent handed a channel document
- if(chanDB == null){
- //Pull it based on channel name
- chanDB = await channelModel.findOne({name: this.channel.name});
+ try{
+ //if we wherent handed a channel document
+ if(chanDB == null){
+ //Pull it based on channel name
+ chanDB = await channelModel.findOne({name: this.channel.name});
+ }
+
+ //Pull a valid start time from input, or make one up if we can't
+ let start = this.channel.queue.getStart(data.start);
+
+ //Grab playlist from the DB
+ let playlist = chanDB.getPlaylistByName(data.playlist);
+
+ //Create an empty array to hold our media list
+ const mediaList = [];
+
+ //Iterate through playlist media
+ for(let item of playlist.media){
+ //Rehydrate a full phat media object from the flat DB entry
+ let mediaObj = item.rehydrate();
+
+ //Set media title from default titles
+ mediaObj.title = playlist.defaultTitles[Math.floor(Math.random() * playlist.defaultTitles.length)];
+
+ //Push rehydrated item on to the mediaList
+ mediaList.push(mediaObj);
+ }
+
+ //Convert array of standard media objects to queued media objects, and push to schedule
+ this.channel.queue.scheduleMedia(queuedMedia.fromMediaArray(mediaList, start), socket, chanDB);
+ }catch(err){
+ return loggerUtils.socketExceptionHandler(socket, err);
}
+ }
- //Pull a valid start time from input, or make one up if we can't
- let start = this.channel.queue.getStart(data.start);
+ async renameChannelPlaylist(socket, data, chanDB){
+ try{
+ //if we wherent handed a channel document
+ if(chanDB == null){
+ //Pull it based on channel name
+ chanDB = await channelModel.findOne({name: this.channel.name});
+ }
- //Grab playlist from the DB
- let playlist = chanDB.getPlaylistByName(data.playlist);
+ //If the title is too long
+ if(!validator.isLength(data.name, {max:30})){
+ //Bitch, moan, complain...
+ loggerUtils.socketErrorHandler(socket, "Playlist name too long!", "validation");
+ //and ignore it!
+ return;
+ }
- //Create an empty array to hold our media list
- const mediaList = [];
+ //Escape/trim the playlist name
+ const name = validator.escape(validator.trim(data.name));
- //Iterate through playlist media
- for(let item of playlist.media){
- //Rehydrate a full phat media object from the flat DB entry
- let mediaObj = item.rehydrate();
+ //Find playlist
+ let playlist = chanDB.getPlaylistByName(data.playlist);
- //Set media title from default titles
- mediaObj.title = playlist.defaultTitles[Math.floor(Math.random() * playlist.defaultTitles.length)];
+ //Change playlist name
+ chanDB.media.playlists[playlist.listIndex].name = name;
- //Push rehydrated item on to the mediaList
- mediaList.push(mediaObj);
+ //Save channel document
+ await chanDB.save();
+
+ //Return playlists from channel doc
+ socket.emit('chanPlaylists', chanDB.getPlaylists());
+ }catch(err){
+ return loggerUtils.socketExceptionHandler(socket, err);
}
-
- //Convert array of standard media objects to queued media objects, and push to schedule
- this.channel.queue.scheduleMedia(queuedMedia.fromMediaArray(mediaList, start), socket, chanDB);
}
}
\ No newline at end of file
diff --git a/src/app/channel/media/queue.js b/src/app/channel/media/queue.js
index d6610f7..bc21bcb 100644
--- a/src/app/channel/media/queue.js
+++ b/src/app/channel/media/queue.js
@@ -626,7 +626,7 @@ module.exports = class{
}
//If we fucked with the DB during the main loop
- if(chanDB == null && !volatile){
+ if(chanDB != null && !volatile){
try{
//Save the database
chanDB.save();
diff --git a/src/schemas/channel/channelSchema.js b/src/schemas/channel/channelSchema.js
index 20112bd..90adb7f 100644
--- a/src/schemas/channel/channelSchema.js
+++ b/src/schemas/channel/channelSchema.js
@@ -559,10 +559,7 @@ channelSchema.methods.getPlaylists = function(){
//this.media.playlists.forEach((playlist) => {
for(let playlist of this.media.playlists){
//Push an object with select information from the emote to the emote list
- playlists.push({
- name: playlist.name,
- count: playlist.media.length
- });
+ playlists.push(playlist.dehydrate());
}
//return the emote list
@@ -584,11 +581,13 @@ channelSchema.methods.getPlaylistByName = function(name){
let foundPlaylist = null;
//Crawl through active playlists
- this.playlistCrawl((playlist) => {
+ this.playlistCrawl((playlist, listIndex) => {
//If we found a match based on name
if(playlist.name == name){
//Keep it
foundPlaylist = playlist;
+ //Pass down the list index
+ foundPlaylist.listIndex = listIndex;
}
});
@@ -597,45 +596,25 @@ channelSchema.methods.getPlaylistByName = function(name){
}
channelSchema.methods.deletePlaylistByName = async function(name){
- //Create null value to hold our found playlist
- let foundIndex = null;
-
- //Crawl through active playlists
- this.playlistCrawl((playlist, listIndex) => {
- //If we found a match based on name
- if(playlist.name == name){
- //Yoink it's index
- foundIndex = listIndex;
- }
- });
+ //Find the playlist
+ let playlist = this.getPlaylistByName(name);
//splice out the given playlist
- this.media.playlists.splice(foundIndex, 1);
+ this.media.playlists.splice(playlist.listIndex, 1);
//save the channel document
await this.save();
}
channelSchema.methods.addToPlaylist = async function(name, media){
- //Create variable to hold found index
- let foundIndex = null
-
- //Crawl through active playlists
- this.playlistCrawl((playlist, listIndex) => {
- //If the playlist name matches
- if(playlist.name == name){
- //Push the given media into the found playlist
-
- //Make note of the found index
- foundIndex = listIndex
- }
- });
+ //Find the playlist
+ let playlist = this.getPlaylistByName(name);
//Set media status schema discriminator
media.status = 'saved';
//Add the media to the playlist
- this.media.playlists[foundIndex].media.push(media);
+ this.media.playlists[playlist.listIndex].media.push(media);
//Save the changes made to the chan doc
await this.save();
diff --git a/src/schemas/channel/media/playlistSchema.js b/src/schemas/channel/media/playlistSchema.js
index e5c9750..e4d7d10 100644
--- a/src/schemas/channel/media/playlistSchema.js
+++ b/src/schemas/channel/media/playlistSchema.js
@@ -24,6 +24,7 @@ const playlistSchema = new mongoose.Schema({
name: {
type: mongoose.SchemaTypes.String,
required: true,
+ unique: true
},
media: [playlistMediaSchema],
defaultTitles:[{
@@ -33,8 +34,26 @@ const playlistSchema = new mongoose.Schema({
}]
});
-playlistSchema.methods.test = function(){
- console.log(this.name);
+//methods
+playlistSchema.methods.dehydrate = function(){
+ //Create empty array to hold media
+ const mediaArray = [];
+
+ //Fill media array
+ for(let media of this.media){
+ mediaArray.push({
+ title: media.title,
+ url: media.url,
+ duration: media.duration
+ });
+ }
+
+ //return dehydrated playlist
+ return {
+ name: this.name,
+ media: mediaArray,
+ defaultTitles: this.defaultTitles
+ }
}
module.exports = playlistSchema;
\ No newline at end of file
diff --git a/src/views/partial/panels/queue.ejs b/src/views/partial/panels/queue.ejs
index 5b5b7d3..d069434 100644
--- a/src/views/partial/panels/queue.ejs
+++ b/src/views/partial/panels/queue.ejs
@@ -41,6 +41,22 @@ along with this program. If not, see