var express = require('express'); var YoutubeMp3Downloader = require("youtube-mp3-downloader"); var fs = require('fs'); var path = require('path'); var urlParse = require("body-parser"); var id3 = require('node-id3'); var router = express.Router(); var YD = new YoutubeMp3Downloader({ "ffmpegPath": path.join(__dirname + "/../bin/ffmpeg"), "outputPath": path.join(__dirname + "/../music"), "youtubeVideoQuality": "highest", "queueParallelism": 1, "progressTimeout": 2000 }); const rootdir = path.join(__dirname, '/../'); /* GET home page. */ router.get('/', (_req, res, _next) => { res.render('index', { title: 'Express' }); }); router.get('/download', (req, res, _next) => { YD.download(req.query.url); YD.on('finished', (err, data) => { if (err) { res.json({ result: err }); } else { res.json({ result: data }); } }); }); router.get('/get/:type/:id', (req, res, _next) => { const type = req.params.type; const id = req.params.id; let db = {}; if (type === 'song') { db = require(rootdir + 'database/songs.json'); } else if (type === 'album') { db = require(rootdir + "database/albums.json"); } else if (type === 'artist') { db = require(rootdir + "database/artists.json"); } if (id === 'all') { res.json({result: db}) } else { const arg = id.split(","); if (arg.length > 1) { let result = []; arg.forEach(element => { result.push(db[Number(element)]); }); res.json({ result: result }); } else { res.json({ result: db[id] }); } } }); router.get('/play/:track', (req, res, _next) => { var key = req.params.track; var music = rootdir + "music/" + key + ".mp3"; var stat = fs.statSync(music); range = req.headers.range; var readStream; if (range !== undefined) { var parts = range.replace(/bytes=/, "").split("-"); var partial_start = parts[0]; var partial_end = parts[1]; if ( (isNaN(partial_start) && partial_start.length > 1) || (isNaN(partial_end) && partial_end.length > 1) ) { return res.sendStatus(500); //ERR_INCOMPLETE_CHUNKED_ENCODING } var start = parseInt(partial_start, 10); var end = partial_end ? parseInt(partial_end, 10) : stat.size - 1; var content_length = end - start + 1; res.status(206).header({ "Content-Type": "audio/mpeg", "Content-Length": content_length, "Content-Range": "bytes " + start + "-" + end + "/" + stat.size }); readStream = fs.createReadStream(music, { start: start, end: end }); } else { res.header({ "Content-Type": "audio/mpeg", "Content-Length": stat.size }); readStream = fs.createReadStream(music); } readStream.pipe(res); }); router.get('/image/:path', (req, res, _next) => { const path = '/music/' + req.params.path res.sendFile(path, { root: rootdir }); }); router.get('/search/:query', (req, res, _next) => { const query = req.params.query; let result = []; fs.readdir(rootdir + 'database/', (err, files) => { files.forEach(file => { const content = require(rootdir + 'database/' + file); content.forEach(element => { if (element.name.match(query)) { element.foundIn = file; result.push(element); } }); }); res.json({result: result}); }); }); router.use(urlParse.urlencoded({extended : true})); router.get('/analyse/*', (req, res, _next) => { let file = req.params[0]; if (fs.existsSync(file)) { var result = id3.read(file); result.image.base64 = result.image.imageBuffer.toString('base64'); } else { var result = 'File not found' } res.json({ result: result }); }); module.exports = router;