Browse Source

Remove routes and app, add socket demo functionality.

Passing the socket object to a route meant the client couldn't access
its socket.io js. For now, removing the app and route structure solves
this problem, and cuts down on the boilerplate.
Josh Bicking 6 years ago
parent
commit
34ba93d212
7 changed files with 391 additions and 567 deletions
  1. 0 64
      app.js
  2. 0 90
      bin/www
  3. 88 25
      index.js
  4. 297 352
      package-lock.json
  5. 6 9
      package.json
  6. 0 18
      routes/player-demo.js
  7. 0 9
      routes/users.js

+ 0 - 64
app.js

@@ -1,64 +0,0 @@
-// express and http
-var express = require('express');
-var app = express();
-var http = require('http').Server(app);
-
-// view engine setup
-var path = require('path');
-app.set('views', path.join(__dirname, 'views'));
-app.set('view engine', 'hbs');
-
-// logging
-var logger = require('morgan');
-app.use(logger('dev'));
-
-// Sockets
-var io = require('socket.io').listen(http);
-io.on('connection', function(socket){
-  console.log('a user connected');
-});
-
-var routes = require('./routes/index');
-
-// Unused (for now) cookies and favicons
-//var favicon = require('serve-favicon');
-//var cookieParser = require('cookie-parser');
-// uncomment after placing your favicon in /public
-//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
-//app.use(cookieParser());
-app.use(express.static(path.join(__dirname, 'public')));
-
-app.use('/', routes);
-
-// catch 404 and forward to error handler
-app.use(function(req, res, next) {
-  var err = new Error('Not Found');
-  err.status = 404;
-  next(err);
-});
-
-// error handlers
-
-// development error handler
-// will print stacktrace
-if (app.get('env') === 'development') {
-  app.use(function(err, req, res, next) {
-    res.status(err.status || 500);
-    res.render('error', {
-      message: err.message,
-      error: err
-    });
-  });
-}
-
-// production error handler
-// no stacktraces leaked to user
-app.use(function(err, req, res, next) {
-  res.status(err.status || 500);
-  res.render('error', {
-    message: err.message,
-    error: {}
-  });
-});
-
-module.exports = app;

+ 0 - 90
bin/www

@@ -1,90 +0,0 @@
-#!/usr/bin/env node
-
-/**
- * Module dependencies.
- */
-
-var app = require('../app');
-var debug = require('debug')('lan-jukebox:server');
-var http = require('http');
-
-/**
- * Get port from environment and store in Express.
- */
-
-var port = normalizePort(process.env.PORT || '3000');
-app.set('port', port);
-
-/**
- * Create HTTP server.
- */
-
-var server = http.createServer(app);
-
-/**
- * Listen on provided port, on all network interfaces.
- */
-
-server.listen(port);
-server.on('error', onError);
-server.on('listening', onListening);
-
-/**
- * Normalize a port into a number, string, or false.
- */
-
-function normalizePort(val) {
-  var port = parseInt(val, 10);
-
-  if (isNaN(port)) {
-    // named pipe
-    return val;
-  }
-
-  if (port >= 0) {
-    // port number
-    return port;
-  }
-
-  return false;
-}
-
-/**
- * Event listener for HTTP server "error" event.
- */
-
-function onError(error) {
-  if (error.syscall !== 'listen') {
-    throw error;
-  }
-
-  var bind = typeof port === 'string'
-    ? 'Pipe ' + port
-    : 'Port ' + port;
-
-  // handle specific listen errors with friendly messages
-  switch (error.code) {
-    case 'EACCES':
-      console.error(bind + ' requires elevated privileges');
-      process.exit(1);
-      break;
-    case 'EADDRINUSE':
-      console.error(bind + ' is already in use');
-      process.exit(1);
-      break;
-    default:
-      throw error;
-  }
-}
-
-/**
- * Event listener for HTTP server "listening" event.
- */
-
-function onListening() {
-  var addr = server.address();
-  var bind = typeof addr === 'string'
-    ? 'pipe ' + addr
-    : 'port ' + addr.port;
-  debug('Listening on ' + bind);
-}

+ 88 - 25
routes/index.js → index.js

@@ -1,14 +1,37 @@
-var app = require('express')();
+// Express and http
+var express = require('express');
+var app = express();
+var http = require('http').Server(app);
 
-// Body parsing
+// view engine setup
+var path = require('path');
+app.set('views', path.join(__dirname, 'views'));
+app.set('view engine', 'hbs');
+
+// logging
+var logger = require('morgan');
+app.use(logger('dev'));
+
+
+// Body parsing and validating
 var bodyParser = require('body-parser');
 app.use(bodyParser.urlencoded({extended: true}));
 app.use(bodyParser.json());
 
-// Validation
 var expressValidator = require('express-validator');
 app.use(expressValidator());
 
+// Sockets
+var io = require('socket.io').listen(http);
+
+// Unused (for now) cookies and favicons
+//var favicon = require('serve-favicon');
+//var cookieParser = require('cookie-parser');
+// uncomment after placing your favicon in /public
+//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
+//app.use(cookieParser());
+app.use(express.static(path.join(__dirname, 'public')));
+
 // Child process, for spawning youtube-dl
 var child_process = require('child_process');
 
@@ -20,6 +43,7 @@ var playlist = [];
 var playing = 'None';
 var played = [];
 
+// Player module
 var Player = require('player');
 
 // Create a player with the proper error handling.
@@ -44,7 +68,7 @@ function playerHandleError(playlist, played) {
 
     // TODO Workaround for a bug in player: wait a couple seconds so the
     // songs don't overlap.
-    
+
     // Move the recently playing song to played.
     played.push(playing);
 
@@ -70,7 +94,7 @@ function playerAddSong(song) {
 	player = playerCreator(song);
 	player.play();
 	playing = song;
-    } else { 
+    } else {
 	// Otherwise add it to the queue
 	playlist.push(song);
     }
@@ -139,36 +163,36 @@ app.use(expressValidator({
 
 app.post('/youtube', function(req, res) {
     var video = req.body.video;
-    
+
     req.checkBody('video', 'URL is not valid.').dlSuccess();
-    
+
     var errors = req.validationErrors();
-    
+
     if(errors){
 	res.render('youtube', {
 	    errors:errors
 	});
     } else {
-        var youtube_dl = child_process.spawn(YOUTUBE_DL_LOC, ['-x', '--audio-format', 'mp3', '-o', 'downloads/%(title)s.%(ext)s', video]);
-        youtube_dl.on('close', (code) => {
-            console.log("Done getting " + video);
-            var error;
-            youtube_dl.stderr.on('data', (data) => {
-                error = data;
-                console.log(`Error getting video: ${data}`);
-                // TODO give error to user when they return to /
-            });
-
-            if(!error) {
-                var youtube_dl_get_title = child_process.spawnSync(YOUTUBE_DL_LOC, ['--get-title', video]);
+	var youtube_dl = child_process.spawn(YOUTUBE_DL_LOC, ['-x', '--audio-format', 'mp3', '-o', 'downloads/%(title)s.%(ext)s', video]);
+	youtube_dl.on('close', (code) => {
+	    console.log("Done getting " + video);
+	    var error;
+	    youtube_dl.stderr.on('data', (data) => {
+		error = data;
+		console.log(`Error getting video: ${data}`);
+		// TODO give error to user when they return to /
+	    });
+
+	    if(!error) {
+		var youtube_dl_get_title = child_process.spawnSync(YOUTUBE_DL_LOC, ['--get-title', video]);
 		console.log(youtube_dl_get_title.stdout.toString());
-                playerAddSong('./downloads/' + youtube_dl_get_title.stdout.toString()
+		playerAddSong('./downloads/' + youtube_dl_get_title.stdout.toString()
 			      .replace('\n', '')
 			      .replace(new RegExp('"', 'g'), '\'')
 			      + ".mp3");
-            }
-            res.redirect('/');
-        });
+	    }
+	    res.redirect('/');
+	});
     }
 });
 
@@ -177,4 +201,43 @@ app.get('/file', function(req, res, next) {
 });
 
 
-module.exports = app;
+// error handlers
+
+// catch 404 and forward to error handler
+app.use(function(req, res, next) {
+  var err = new Error('Not Found');
+  err.status = 404;
+  next(err);
+});
+
+// error handlers
+
+// development error handler
+// will print stacktrace
+if (app.get('env') === 'development') {
+  app.use(function(err, req, res, next) {
+    res.status(err.status || 500);
+    res.render('error', {
+      message: err.message,
+      error: err
+    });
+  });
+}
+
+// production error handler
+// no stacktraces leaked to user
+app.use(function(err, req, res, next) {
+  res.status(err.status || 500);
+  res.render('error', {
+    message: err.message,
+    error: {}
+  });
+});
+
+io.on('connection', function(socket){
+  console.log('a user connected');
+});
+
+http.listen(3000, function(){
+      console.log('listening on *:3000');
+});

File diff suppressed because it is too large
+ 297 - 352
package-lock.json


+ 6 - 9
package.json

@@ -1,20 +1,17 @@
 {
   "name": "lan-jukebox",
   "version": "0.0.0",
-  "private": true,
   "scripts": {
-    "start": "node ./bin/www"
+    "start": "node ./index.js"
   },
   "dependencies": {
-    "body-parser": "~1.15.1",
-    "cookie-parser": "~1.4.3",
-    "debug": "^2.6.8",
-    "express": "~4.13.4",
+    "body-parser": "^1.17.2",
+    "express": "^4.15.3",
     "express-validator": "^3.2.1",
-    "hbs": "~4.0.0",
-    "morgan": "~1.7.0",
+    "hbs": "^4.0.1",
+    "morgan": "^1.8.2",
     "player": "^0.6.1",
-    "serve-favicon": "~2.3.0",
+    "serve-favicon": "^2.4.3",
     "socket.io": "^2.0.3"
   }
 }

+ 0 - 18
routes/player-demo.js

@@ -1,18 +0,0 @@
-var Player = require('player');
-var player = new Player();
-
-playerAddSong('./downloads/\'IS THAT A MAN RIDING A SHRIMP\'.mp3');
-
-// event: on error (No next song was found)
-player.on('error', function(err){
-  // Reset the object, resetting the playlist.
-  player = new Player();
-});
-
-// Add a song and start the playlist, if it's empty
-function playerAddSong(song) {
-    player.add(song);
-  if (player.list.length == 1) {
-    player.play();
-  }
-}

+ 0 - 9
routes/users.js

@@ -1,9 +0,0 @@
-var express = require('express');
-var router = express.Router();
-
-/* GET users listing. */
-router.get('/', function(req, res, next) {
-  res.send('respond with a resource');
-});
-
-module.exports = router;

Some files were not shown because too many files changed in this diff