Started work on playlist management UI
This commit is contained in:
parent
65b5ae9371
commit
1723e8ebd0
9 changed files with 586 additions and 104 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue