Cassettea-api-node/routes/index.js

136 lines
3.2 KiB
JavaScript
Raw Normal View History

var express = require('express');
var YoutubeMp3Downloader = require("youtube-mp3-downloader");
var fs = require('fs');
var path = require('path');
var router = express.Router();
var YD = new YoutubeMp3Downloader({
"ffmpegPath": __dirname + "/../bin/ffmpeg",
"outputPath": __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});
});
});
module.exports = router;