deemix-web-frontend/src/index.js

166 lines
4.7 KiB
JavaScript
Raw Normal View History

2021-10-19 09:22:31 +02:00
const express = require('express');
const deezer = require('deezer-js');
const deemix = require('deemix');
const path = require('path');
const { inspect } = require('util');
const ws = require('ws');
const fs = require('fs');
const port = process.env.PORT || 4500;
require('dotenv').config();
const app = new express();
const expressWs = require('express-ws')(app);
const deezerInstance = new deezer.Deezer();
let deemixDownloader;
let deemixSettings = deemix.settings.DEFAULTS
deemixSettings.downloadLocation = path.join(process.cwd(), 'data/');
deemixSettings.maxBitrate = String(deezer.TrackFormats.FLAC);
deemixSettings.overwriteFile = deemix.settings.OverwriteOption.OVERWRITE;
2021-10-19 18:00:54 +02:00
app.use(express.static('public'));
2021-10-19 09:22:31 +02:00
app.use('/data', express.static('data', {extensions: ['flac', 'mp3']}));
app.get('/api/search', async (req, res) => {
if (!req.query.search) return res.sendStatus(400);
let s = await deezerInstance.api.search_album(req.query.search, {
2021-10-19 17:34:08 +02:00
limit: 15,
2021-10-19 09:22:31 +02:00
});
let format = s.data.map(s => {
return {
id: s.id,
title: s.title,
cover: s.md5_image,
artist: {
id: s.artist.id,
name: s.artist.name
},
};
});
res.send(format);
});
/*
app.get('/api/album', async (req, res) => {
if (!req.query.id) return res.sendStatus(400);
let dlObj = await deemix.generateDownloadObject(deezerInstance, 'https://www.deezer.com/album/' + req.query.id, deezer.TrackFormats.FLAC);
deemixDownloader = new deemix.downloader.Downloader(deezerInstance, dlObj, deemixSettings, listener);
console.log(await deemixDownloader.start());
res.send('a');
});
*/
app.get('/api/album', async (req, res) => {
2021-10-19 18:00:54 +02:00
if (!req.query.id) return req.sendStatus(400);
2021-10-20 07:26:03 +02:00
let album;
try {
album = await deezerInstance.api.get_album(req.query.id);
} catch (err) {
return req.status(404).send('Album not found!');
}
2021-10-19 18:00:54 +02:00
res.send({
id: album.id,
title: album.title,
link: album.link,
tracks: album.tracks.data.map(t => {
return {
id: t.id,
title: t.title,
duration: t.duration,
link: t.link,
artist: t.artist.name,
};
})
});
2021-10-19 09:22:31 +02:00
});
app.ws('/api/album', async (ws, req) => {
2021-10-20 07:26:03 +02:00
if (!req.query.id) return ws.close(1008, 'Supply a track ID in the query!');
2021-10-19 09:22:31 +02:00
const listener = {
send(key, data) {
if (data.downloaded) {
ws.send(JSON.stringify({key: 'download', data: data.downloadPath.replace(process.cwd(), '')}));
2021-10-19 23:18:50 +02:00
console.log('downloaded ' + data.downloadPath + ', deleting in 1hr')
2021-10-19 09:22:31 +02:00
setTimeout(() => {
2021-10-19 23:18:50 +02:00
try {
fs.unlinkSync(data.downloadPath);
} catch(err) {
2021-10-20 07:26:03 +02:00
console.log('tried to delete ' + data.downloadPath + ', but failed? its likely already gone');
2021-10-19 23:18:50 +02:00
}
2021-10-19 09:22:31 +02:00
}, 1000 * 60 * 60 /* 1 hour */);
}
ws.send(JSON.stringify({key, data}));
2021-10-19 23:18:50 +02:00
//console.log(`[${key}] ${inspect(data)}`);
2021-10-19 09:22:31 +02:00
}
};
2021-10-19 21:30:55 +02:00
let album;
try {
album = await deezerInstance.api.get_album(req.query.id);
} catch(err) {
2021-10-20 07:26:03 +02:00
return ws.close(1012, 'Album not found');
2021-10-19 21:30:55 +02:00
}
2021-10-19 09:22:31 +02:00
listener.send('coverArt', album.cover_medium);
let dlObj = await deemix.generateDownloadObject(deezerInstance, 'https://www.deezer.com/album/' + req.query.id, deezer.TrackFormats.FLAC);
deemixDownloader = new deemix.downloader.Downloader(deezerInstance, dlObj, deemixSettings, listener);
await deemixDownloader.start();
2021-10-20 07:26:03 +02:00
ws.close(1000);
2021-10-19 09:22:31 +02:00
});
2021-10-19 21:30:55 +02:00
app.ws('/api/track', async (ws, req) => {
2021-10-20 07:26:03 +02:00
if (!req.query.id) return ws.close(1008, 'Supply a track ID in the query!');
2021-10-19 21:30:55 +02:00
const listener = {
send(key, data) {
if (data.downloaded) {
ws.send(JSON.stringify({key: 'download', data: data.downloadPath.replace(process.cwd(), '')}));
setTimeout(() => {
2021-10-20 07:26:03 +02:00
try {
fs.unlinkSync(data.downloadPath);
} catch(err) {
console.log('tried to delete ' + data.downloadPath + ', but failed? its likely already gone');
}
2021-10-19 21:30:55 +02:00
}, 1000 * 60 * 60 /* 1 hour */);
}
ws.send(JSON.stringify({key, data}));
console.log(`[${key}] ${inspect(data)}`);
}
};
let track;
try {
track = await deezerInstance.api.get_track(req.query.id);
} catch(err) {
2021-10-20 07:26:03 +02:00
return ws.close(1012, 'Track not found');
2021-10-19 21:30:55 +02:00
}
listener.send('coverArt', track.album.cover_medium);
let dlObj = await deemix.generateDownloadObject(deezerInstance, 'https://www.deezer.com/track/' + req.query.id, deezer.TrackFormats.FLAC);
deemixDownloader = new deemix.downloader.Downloader(deezerInstance, dlObj, deemixSettings, listener);
await deemixDownloader.start();
2021-10-20 07:26:03 +02:00
ws.close(1000);
2021-10-19 21:30:55 +02:00
});
2021-10-19 09:22:31 +02:00
deezerInstance.login_via_arl(process.env.DEEZER_ARL).then(() => {
console.log('logged into deezer');
app.listen(port, () => {
console.log('hosting on ' + port);
});
});