index.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. var express = require('express');
  2. var router = express.Router();
  3. var bodyParser = require('body-parser');
  4. var expressValidator = require('express-validator');
  5. router.use(bodyParser.urlencoded({extended: true}));
  6. router.use(bodyParser.json());
  7. router.use(expressValidator());
  8. var child_process = require('child_process');
  9. var Player = require('player');
  10. var player = new Player();
  11. var YOUTUBE_DL_LOC = '/usr/local/bin/youtube-dl'
  12. /* GET home page. */
  13. router.get('/', function(req, res, next) {
  14. var playlist;
  15. if(player.list.length) {
  16. playlist = '<ul>';
  17. for(var i=0; i < player.list.length; i++) {
  18. playlist +=
  19. '<li>' +
  20. player.list[i].replace(/^\.\/downloads\//, '') .replace(/\.mp3$/, '') +
  21. '</li>';
  22. }
  23. playlist += '</ul>';
  24. } else {
  25. playlist = '<p>No songs in playlist.</p>';
  26. }
  27. res.render('index', { playlist: playlist });
  28. });
  29. router.get('/youtube', function(req, res, next) {
  30. res.render('youtube');
  31. });
  32. router.use(expressValidator({
  33. customValidators: {
  34. dlSuccess: function(video) {
  35. // Test if the requested video is available.
  36. var youtube_dl = child_process.spawnSync(YOUTUBE_DL_LOC, ['-s', video]);
  37. if (youtube_dl.stderr.toString()) {
  38. return false;
  39. }
  40. return true;
  41. }
  42. }
  43. }
  44. ));
  45. router.post('/youtube', function(req, res) {
  46. var video = req.body.video;
  47. req.checkBody('video', 'URL is not valid.').dlSuccess();
  48. var errors = req.validationErrors();
  49. if(errors){
  50. res.render('youtube', {
  51. errors:errors
  52. });
  53. } else {
  54. var youtube_dl = child_process.spawn(YOUTUBE_DL_LOC, ['-x', '--audio-format', 'mp3', '-o', 'downloads/%(title)s.%(ext)s', video]);
  55. youtube_dl.on('close', (code) => {
  56. console.log("Done getting " + video);
  57. var error;
  58. youtube_dl.stderr.on('data', (data) => {
  59. error = data;
  60. console.log(`Error getting video: ${data}`);
  61. // TODO give error to user when they return to /
  62. });
  63. if(!error) {
  64. var youtube_dl_get_title = child_process.spawnSync(YOUTUBE_DL_LOC, ['--get-title', video]);
  65. player.add('./downloads/' + youtube_dl_get_title.stdout.toString().replace('\n', '') + ".mp3");
  66. }
  67. res.redirect('/');
  68. });
  69. }
  70. });
  71. router.get('/file', function(req, res, next) {
  72. res.render('file');
  73. });
  74. module.exports = router;