mirror of
https://github.com/IrosTheBeggar/mStream.git
synced 2025-10-27 07:31:02 +00:00
Improved everything about playlists
This commit is contained in:
parent
a07f5a955d
commit
ece5efafe5
@ -147,7 +147,7 @@ API Calls
|
||||
* GET: /getallplaylists
|
||||
* RETURNS: JSON array of all playlists
|
||||
* GET: /loadplaylist
|
||||
* PARAM: filename - playlsit filename
|
||||
* PARAM: playlistname - playlist name
|
||||
* RETURN: JSON array of files in playlist
|
||||
* POST: /download
|
||||
* PARAM: fileArray - JSON array of files to download
|
||||
|
||||
@ -14,7 +14,7 @@ $(document).ready(function(){
|
||||
auroraFormats: "flac",
|
||||
smoothPlayBar: true,
|
||||
keyEnabled: true,
|
||||
keyBindings: {
|
||||
keyBindings: {
|
||||
play: {
|
||||
key: 32, // Spacebar
|
||||
fn: function(f) {
|
||||
@ -94,7 +94,7 @@ $(document).ready(function(){
|
||||
|
||||
$('#playlist li').removeClass('current');
|
||||
$(this).parent().addClass('current');
|
||||
|
||||
|
||||
// Add that URL to jPlayer
|
||||
jPlayerSetMedia(songurl, filetype);
|
||||
|
||||
@ -263,7 +263,7 @@ $(document).ready(function(){
|
||||
for (var i = 0; i < fileExplorerArray.length; i++) {
|
||||
directoryString += fileExplorerArray[i] + "/";
|
||||
}
|
||||
|
||||
|
||||
|
||||
// If the scraper option is checked, then tell dirparer to use getID3
|
||||
$.post('dirparser', {dir: directoryString, filetypes: filetypes}, function(response) {
|
||||
@ -326,15 +326,16 @@ $(document).ready(function(){
|
||||
$('#save_playlist').prop("disabled",true);
|
||||
|
||||
var playlistElements = $('ul#playlist li');
|
||||
var playlistArray = jQuery.makeArray(playlistElements);
|
||||
var playlistArray = jQuery.makeArray(playlistElements);
|
||||
|
||||
var title = $('#playlist_name').val();
|
||||
var title = $('#playlist_name').val();
|
||||
|
||||
var stuff = [];
|
||||
var stuff = [];
|
||||
|
||||
// Check for special characters
|
||||
if(/^[a-zA-Z0-9-_ ]*$/.test(title) == false) {
|
||||
// Check for special characters
|
||||
if(/^[a-zA-Z0-9-_ ]*$/.test(title) == false) {
|
||||
console.log('don\'t do that');
|
||||
$('#save_playlist').prop("disabled",false);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -399,7 +400,7 @@ $(document).ready(function(){
|
||||
//parse through the json array and make an array of corresponding divs
|
||||
var playlists = [];
|
||||
$.each(dirty, function() {
|
||||
playlists.push('<div data-filename="'+this.file+'" class="playlistz">'+this.name+'</div>');
|
||||
playlists.push('<div data-playlistname="'+this.name+'" class="playlistz">'+this.name+'</div>');
|
||||
});
|
||||
|
||||
// Ad playlists to the left panel
|
||||
@ -420,14 +421,14 @@ $(document).ready(function(){
|
||||
|
||||
// load up a playlist
|
||||
$("#filelist").on('click', '.playlistz', function() {
|
||||
var filename = $(this).data('filename');
|
||||
var playlistname = $(this).data('playlistname');
|
||||
var name = $(this).html();
|
||||
|
||||
// Make an AJAX call to get the contents of the playlist
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
url: "loadplaylist",
|
||||
data: {filename: filename},
|
||||
data: {playlistname: playlistname},
|
||||
dataType: 'json',
|
||||
})
|
||||
.done(function( msg ) {
|
||||
@ -775,14 +776,14 @@ $("#filelist").on('click', '.playlistz', function() {
|
||||
|
||||
var htmlString = '';
|
||||
|
||||
if(parsedMessage.artists.length > 0){
|
||||
if(parsedMessage.artists.length > 0){
|
||||
htmlString += '<h2 class="search_subtitle"><strong>Artists</strong></h2>';
|
||||
$.each(parsedMessage.artists, function(index, value) {
|
||||
htmlString += '<div data-artist="'+value+'" class="artistz">'+value+' </div>';
|
||||
});
|
||||
}
|
||||
|
||||
if(parsedMessage.albums.length > 0){
|
||||
if(parsedMessage.albums.length > 0){
|
||||
htmlString += '<h2 class="search_subtitle"><strong>Albums</strong></h2>';
|
||||
$.each(parsedMessage.albums, function(index, value) {
|
||||
htmlString += '<div data-album="'+value+'" class="albumz">'+value+' </div>';
|
||||
|
||||
134
mstream.js
134
mstream.js
@ -43,12 +43,12 @@ var arrayOfSongs = [];
|
||||
if(!program.beetspath){
|
||||
db.run("CREATE TABLE IF NOT EXISTS items ( id INTEGER PRIMARY KEY AUTOINCREMENT, title varchar DEFAULT NULL, artist varchar DEFAULT NULL, year int DEFAULT NULL, album varchar DEFAULT NULL, path text, format varchar, track INTEGER, disk INTEGER);", function() {
|
||||
// console.log('TABLES CREATED');
|
||||
});
|
||||
});
|
||||
}
|
||||
// Create a playlist table
|
||||
db.run("CREATE TABLE IF NOT EXISTS mstream_playlists ( id INTEGER PRIMARY KEY AUTOINCREMENT, playlist_name varchar, filepath varchar);", function() {
|
||||
// console.log('TABLES CREATED');
|
||||
});
|
||||
db.run("CREATE TABLE IF NOT EXISTS mstream_playlists ( id INTEGER PRIMARY KEY AUTOINCREMENT, playlist_name varchar, filepath varchar, created datetime default current_timestamp);", function() {
|
||||
console.log('PLAYLIST TABLE CREATED');
|
||||
});
|
||||
|
||||
|
||||
|
||||
@ -81,7 +81,7 @@ function tunnel_uPNP(){
|
||||
|
||||
tunnelLibrary = require('nat-upnp');
|
||||
client = tunnelLibrary.createClient();
|
||||
|
||||
|
||||
client.portMapping({
|
||||
public: port,
|
||||
private: port,
|
||||
@ -91,7 +91,7 @@ function tunnel_uPNP(){
|
||||
if (err) {
|
||||
// every service in the list has failed
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var getIP = require('external-ip')();
|
||||
@ -115,7 +115,7 @@ function tunnel_uPNP(){
|
||||
}
|
||||
}
|
||||
|
||||
function tunnel_NAT_PMP(){
|
||||
function tunnel_NAT_PMP(){
|
||||
try{
|
||||
console.log('Preparing to tunnel via nat-pmp protocol');
|
||||
|
||||
@ -407,96 +407,98 @@ mstream.post('/dirparser', function (req, res) {
|
||||
// Combine list of directories and mp3s
|
||||
var finalArray = { path:path, contents:filesArray.concat(directories)};
|
||||
|
||||
var returnJSON = JSON.stringify(finalArray);
|
||||
|
||||
// Send back some JSON
|
||||
res.send(returnJSON);
|
||||
res.send(JSON.stringify(finalArray));
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
function getFileType(filename){
|
||||
|
||||
return filename.split(".").pop();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// playlist placeholder functions
|
||||
// TODO: Change this to store playlists in DB
|
||||
mstream.post('/saveplaylist', function (req, res){
|
||||
|
||||
var title = req.body.title;
|
||||
var songs = req.body.stuff;
|
||||
|
||||
try {
|
||||
fs.mkdirSync('.mstream-playlists');
|
||||
} catch(e) {
|
||||
if ( e.code != 'EEXIST' ) throw e;
|
||||
}
|
||||
// Check if this playlist already exists
|
||||
db.all("SELECT id FROM mstream_playlists WHERE playlist_name = ?;", title, function(err, rows) {
|
||||
|
||||
var writeString = '';
|
||||
db.serialize(function() {
|
||||
|
||||
for(var i = songs.length - 1; i >= 0; i--) {
|
||||
writeString += songs[i] + os.EOL;
|
||||
}
|
||||
// We need to delete anys existing entries
|
||||
if(rows && rows.length > 0){
|
||||
db.run("DELETE FROM mstream_playlists WHERE playlist_name = ?;", title);
|
||||
}
|
||||
|
||||
fs.writeFile('.mstream-playlists/' + title + '.m3u', writeString, function (err) {
|
||||
if (err) throw err;
|
||||
|
||||
console.log('It\'s saved!');
|
||||
res.send();
|
||||
// Now we add the new entries
|
||||
var sql2 = "insert into mstream_playlists (playlist_name, filepath) values ";
|
||||
var sqlParser = [];
|
||||
|
||||
while(songs.length > 0) {
|
||||
var song = songs.shift();
|
||||
|
||||
sql2 += "(?, ?), ";
|
||||
sqlParser.push(title);
|
||||
sqlParser.push( fe.join(rootDir, song) );
|
||||
}
|
||||
|
||||
sql2 = sql2.slice(0, -2);
|
||||
sql2 += ";";
|
||||
|
||||
db.run(sql2, sqlParser, function(){
|
||||
res.send('DONE');
|
||||
});
|
||||
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
mstream.get('/getallplaylists', function (req, res){
|
||||
var files = fs.readdirSync('.mstream-playlists/');
|
||||
var playlists = [];
|
||||
|
||||
// // loop through files
|
||||
for (var i = 0; i < files.length; i++) {
|
||||
if(files[i].substr(files[i].length - 3) === 'm3u'){
|
||||
playlists.push({file:files[i], name:files[i].slice(0, -4)});
|
||||
db.all("SELECT DISTINCT playlist_name FROM mstream_playlists", function(err, rows){
|
||||
var playlists = [];
|
||||
|
||||
// loop through files
|
||||
for (var i = 0; i < rows.length; i++) {
|
||||
if(rows[i].playlist_name){
|
||||
playlists.push({name: rows[i].playlist_name});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
res.send(JSON.stringify(playlists));
|
||||
res.send(JSON.stringify(playlists));
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
// Find all playlists
|
||||
mstream.get('/loadplaylist', function (req, res){
|
||||
// TODO: Scrub user input
|
||||
var playlist = req.query.filename;
|
||||
var playlist = req.query.playlistname;
|
||||
|
||||
var contents = fs.readFileSync('.mstream-playlists/' + playlist, 'utf8');
|
||||
var contents = contents.split(os.EOL);
|
||||
db.all("SELECT * FROM mstream_playlists WHERE playlist_name = ? ORDER BY id COLLATE NOCASE ASC", playlist, function(err, rows){
|
||||
var returnThis = [];
|
||||
|
||||
var returnThis = [];
|
||||
for (var i = 0; i < rows.length; i++) {
|
||||
|
||||
for (var i = 0; i < contents.length; i++) {
|
||||
if(contents[i].length == 0){
|
||||
continue;
|
||||
// var tempName = rows[i].filepath.split('/').slice(-1)[0];
|
||||
var tempName = fe.basename(rows[i].filepath);
|
||||
var extension = getFileType(rows[i].filepath);
|
||||
var filepath = fe.relative(rootDir, rows[i].filepath);
|
||||
|
||||
returnThis.push({name: tempName, file: filepath, filetype: extension });
|
||||
}
|
||||
|
||||
var tempName = contents[i].split('/').slice(-1)[0];
|
||||
var extension = getFileType(contents[i]);
|
||||
res.send(JSON.stringify(returnThis));
|
||||
});
|
||||
|
||||
var tempObj = {name: tempName, file: contents[i], filetype: extension };
|
||||
|
||||
|
||||
returnThis.push(tempObj);
|
||||
}
|
||||
|
||||
|
||||
res.send(JSON.stringify(returnThis));
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
// Download a zip file of music
|
||||
mstream.post('/download', function (req, res){
|
||||
var archive = archiver('zip');
|
||||
@ -545,7 +547,7 @@ mstream.post('/download', function (req, res){
|
||||
if(program.beetspath){
|
||||
const spawn = require('child_process').spawn;
|
||||
|
||||
var scanThisDir = program.beetspath;
|
||||
var scanThisDir = program.beetspath;
|
||||
|
||||
|
||||
mstream.get('/db/recursive-scan', function(req,res){
|
||||
@ -641,7 +643,7 @@ if(program.beetspath){
|
||||
console.log('TABLES CREATED');
|
||||
// var emptypromise = emptyPromise();
|
||||
// recursiveScanY(startdir, fileTypesArray, emptypromise); // TODO: Can we remove the fileTypesArray?
|
||||
|
||||
|
||||
parse = parseAllFiles();
|
||||
parse.next();
|
||||
|
||||
@ -705,7 +707,7 @@ if(program.beetspath){
|
||||
var file = yetAnotherArrayOfSongs.pop();
|
||||
|
||||
var resultX = yield parseFile(file);
|
||||
|
||||
|
||||
}
|
||||
|
||||
insertEntries();
|
||||
@ -763,7 +765,7 @@ if(program.beetspath){
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
sql2 = sql2.slice(0, -2);
|
||||
sql2 += ";";
|
||||
|
||||
@ -813,7 +815,7 @@ mstream.post('/db/search', function(req, res){
|
||||
|
||||
// TODO: Combine SQL calls into one
|
||||
db.serialize(function() {
|
||||
|
||||
|
||||
var sqlAlbum = "SELECT DISTINCT album FROM items WHERE items.album LIKE ? ORDER BY album COLLATE NOCASE ASC;";
|
||||
db.all(sqlAlbum, searchTerm, function(err, rows) {
|
||||
if(err){
|
||||
@ -836,7 +838,7 @@ mstream.post('/db/search', function(req, res){
|
||||
res.status(500).json({ error: 'DB Error' });
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
for (var i = 0; i < rows.length; i++) {
|
||||
if(rows[i].artist){
|
||||
// rows.splice(i, 1);
|
||||
@ -978,7 +980,7 @@ function setLocalFileLocation(rows){
|
||||
// GET DB Status
|
||||
mstream.get('/db/status', function(req, res){
|
||||
var returnObject = {};
|
||||
|
||||
|
||||
returnObject.locked = scanLock;
|
||||
|
||||
|
||||
@ -987,11 +989,11 @@ mstream.get('/db/status', function(req, res){
|
||||
// Currently we don't support filecount stats when using beets DB
|
||||
if(!program.beetspath){
|
||||
returnObject.totalFileCount = totalFileCount;
|
||||
returnObject.filesLeft = yetAnotherArrayOfSongs.length;
|
||||
returnObject.filesLeft = yetAnotherArrayOfSongs.length;
|
||||
}else{
|
||||
// Dummy data
|
||||
returnObject.totalFileCount = 0;
|
||||
returnObject.filesLeft = 0;
|
||||
returnObject.filesLeft = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "mstream",
|
||||
"version": "1.20.0",
|
||||
"version": "1.21.0",
|
||||
"description": "music streaming server",
|
||||
"main": "mstream.js",
|
||||
"bin": {
|
||||
|
||||
@ -1,11 +1,8 @@
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
// $(document).ready(function(){
|
||||
$(document).ready(function(){
|
||||
|
||||
|
||||
////////////////////////////// Initialization code
|
||||
|
||||
|
||||
|
||||
// Supported file types
|
||||
var filetypes = '["mp3","ogg","wav","m4a","flac"]';
|
||||
|
||||
@ -73,9 +70,6 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
|
||||
// Add that URL to jPlayer
|
||||
jPlayerSetMedia(songurl, filetype);
|
||||
|
||||
// TODO:
|
||||
// $('#jquery_jplayer_1').jPlayer("play");
|
||||
});
|
||||
|
||||
|
||||
@ -95,10 +89,9 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
function jPlayerSetMedia(fileLocation, filetype){
|
||||
document.getElementById("mplayer").setAttribute("src", fileLocation);
|
||||
document.getElementById("mplayer").setAttribute("title", fileLocation.split('/').pop());
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Adds file to the now playing playlist
|
||||
// There is no longer addfile1
|
||||
function addFile2(that){
|
||||
@ -283,15 +276,16 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
$('#save_playlist').prop("disabled",true);
|
||||
|
||||
var playlistElements = $('ul#playlist li');
|
||||
var playlistArray = jQuery.makeArray(playlistElements);
|
||||
var playlistArray = jQuery.makeArray(playlistElements);
|
||||
|
||||
var title = $('#playlist_name').val();
|
||||
var title = $('#playlist_name').val();
|
||||
|
||||
var stuff = [];
|
||||
var stuff = [];
|
||||
|
||||
// Check for special characters
|
||||
if(/^[a-zA-Z0-9-_ ]*$/.test(title) == false) {
|
||||
// Check for special characters
|
||||
if(/^[a-zA-Z0-9-_ ]*$/.test(title) == false) {
|
||||
console.log('don\'t do that');
|
||||
$('#save_playlist').prop("disabled",false);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -356,7 +350,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
//parse through the json array and make an array of corresponding divs
|
||||
var playlists = [];
|
||||
$.each(dirty, function() {
|
||||
playlists.push('<div data-filename="'+this.file+'" class="playlistz">'+this.name+'</div>');
|
||||
playlists.push('<div data-playlistname="'+this.name+'" class="playlistz">'+this.name+'</div>');
|
||||
});
|
||||
|
||||
// Ad playlists to the left panel
|
||||
@ -377,14 +371,14 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
|
||||
// load up a playlist
|
||||
$("#filelist").on('click', '.playlistz', function() {
|
||||
var filename = $(this).data('filename');
|
||||
var playlistname = $(this).data('playlistname');
|
||||
var name = $(this).html();
|
||||
|
||||
// Make an AJAX call to get the contents of the playlist
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
url: "loadplaylist",
|
||||
data: {filename: filename},
|
||||
data: {playlistname: playlistname},
|
||||
dataType: 'json',
|
||||
})
|
||||
.done(function( msg ) {
|
||||
|
||||
@ -24,7 +24,7 @@
|
||||
|
||||
<script src="js/modernizr.js"></script>
|
||||
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
|
||||
|
||||
<link rel="stylesheet" href="css/foundation.css" />
|
||||
<link rel="stylesheet" href="css/master.css">
|
||||
|
||||
@ -329,6 +329,12 @@ Custom property | Description
|
||||
|
||||
// SPacebar pause
|
||||
window.addEventListener("keydown", function(event){
|
||||
var element = event.target.tagName.toLowerCase();
|
||||
|
||||
if(element == 'input' || element == 'textarea'){
|
||||
return;
|
||||
}
|
||||
|
||||
switch (event.keyCode) {
|
||||
case 32: //SpaceBar
|
||||
player.playPause(event);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user