diff --git a/server/dist/app.js b/server/dist/app.js index 16d288d..8032c78 100644 --- a/server/dist/app.js +++ b/server/dist/app.js @@ -2,19 +2,29 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; +var _a, _b; Object.defineProperty(exports, "__esModule", { value: true }); exports.wss = exports.app = void 0; const http_1 = __importDefault(require("http")); const express_1 = __importDefault(require("express")); const ws_1 = require("ws"); +const yargs_1 = __importDefault(require("yargs")); const debug_1 = __importDefault(require("debug")); +const helpers_1 = require("yargs/helpers"); const middlewares_1 = require("./middlewares"); const routes_1 = __importDefault(require("./routes")); const port_1 = require("./helpers/port"); const server_callbacks_1 = require("./helpers/server-callbacks"); const register_1 = require("./routes/api/register"); const websocket_1 = require("./websocket"); -const PORT = port_1.normalizePort(process.env.PORT || '6595'); +const errors_1 = require("./helpers/errors"); +// TODO: Remove type assertion while keeping correct types +const argv = yargs_1.default(helpers_1.hideBin(process.argv)).options({ + port: { type: 'string', default: '6595' }, + host: { type: 'string', default: 'localhost' } +}).argv; +const DEEMIX_PORT = port_1.normalizePort((_a = process.env.PORT) !== null && _a !== void 0 ? _a : argv.port); +const DEEMIX_HOST = (_b = process.env.HOST) !== null && _b !== void 0 ? _b : argv.host; const debug = debug_1.default('deemix-gui:server'); exports.app = express_1.default(); exports.wss = new ws_1.Server({ noServer: true }); @@ -26,17 +36,23 @@ exports.app.use('/', routes_1.default); /* === APIs === */ register_1.registerApis(exports.app); /* === Config === */ -exports.app.set('port', PORT); +exports.app.set('port', DEEMIX_PORT); /* === Server port === */ if (process.env.NODE_ENV !== 'test') { - server.listen(PORT); + server.listen({ port: DEEMIX_PORT, host: DEEMIX_HOST }); } websocket_1.registerWebsocket(exports.wss); /* === Server callbacks === */ +exports.app.on('mount', a => { + console.log(a); +}); +server.on('connect', () => { + errors_1.consoleInfo('Server connected'); +}); server.on('upgrade', (request, socket, head) => { exports.wss.handleUpgrade(request, socket, head, socket => { exports.wss.emit('connection', socket, request); }); }); -server.on('error', server_callbacks_1.getErrorCb(PORT)); +server.on('error', server_callbacks_1.getErrorCb(DEEMIX_PORT)); server.on('listening', server_callbacks_1.getListeningCb(server, debug)); diff --git a/server/dist/helpers/errors.js b/server/dist/helpers/errors.js index bcb94d3..10ff2e8 100644 --- a/server/dist/helpers/errors.js +++ b/server/dist/helpers/errors.js @@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.NotLoggedIn = exports.AlreadyInQueue = exports.QueueError = exports.isBadRequestError = exports.BadRequestError = exports.consoleError = exports.consoleInfo = void 0; const ramda_1 = require("ramda"); const prependDeemix = ramda_1.concat('[deemix-server]: '); -const consoleInfo = (errorText) => console.info(prependDeemix(errorText)); +const consoleInfo = (infoText) => console.info(prependDeemix(infoText)); exports.consoleInfo = consoleInfo; const consoleError = (errorText) => console.error(prependDeemix(errorText)); exports.consoleError = consoleError; diff --git a/server/dist/helpers/server-callbacks.js b/server/dist/helpers/server-callbacks.js index 734dc74..5f59bc6 100644 --- a/server/dist/helpers/server-callbacks.js +++ b/server/dist/helpers/server-callbacks.js @@ -1,6 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getListeningCb = exports.getErrorCb = void 0; +const errors_1 = require("./errors"); /** * Event listener for HTTP server "error" event. * @@ -38,7 +39,8 @@ function getListeningCb(server, debug) { const addr = server.address(); if (addr) { const bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port; - debug('Listening on ' + bind); + debug(`Listening on ${bind}`); + errors_1.consoleInfo(`Listening on ${bind}`); } }; } diff --git a/server/dist/main.js b/server/dist/main.js index 78bc552..84cebcb 100644 --- a/server/dist/main.js +++ b/server/dist/main.js @@ -12,7 +12,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.restoreQueueFromDisk = exports.clearCompletedDownloads = exports.cancelAllDownloads = exports.cancelDownload = exports.startQueue = exports.addToQueue = exports.currentJob = exports.queue = exports.queueOrder = exports.saveSettings = exports.getSettings = exports.listener = exports.plugins = exports.getArlFromAccessToken = exports.getAccessToken = exports.sessionDZ = exports.settings = exports.configFolder = exports.defaultSettings = void 0; +exports.restoreQueueFromDisk = exports.clearCompletedDownloads = exports.cancelAllDownloads = exports.cancelDownload = exports.startQueue = exports.addToQueue = exports.getQueue = exports.saveSettings = exports.getSettings = exports.listener = exports.plugins = exports.getArlFromAccessToken = exports.getAccessToken = exports.sessionDZ = exports.configFolder = exports.defaultSettings = void 0; const fs_1 = __importDefault(require("fs")); const path_1 = require("path"); const uuid_1 = require("uuid"); @@ -25,11 +25,12 @@ const Downloader = deemix_1.default.downloader.Downloader; const { Single, Collection, Convertable } = deemix_1.default.types.downloadObjects; exports.defaultSettings = deemix_1.default.settings.DEFAULTS; exports.configFolder = deemix_1.default.utils.localpaths.getConfigFolder(); -exports.settings = deemix_1.default.settings.load(exports.configFolder); exports.sessionDZ = {}; +let settings = deemix_1.default.settings.load(exports.configFolder); exports.getAccessToken = deemix_1.default.utils.deezer.getAccessToken; exports.getArlFromAccessToken = deemix_1.default.utils.deezer.getArlFromAccessToken; exports.plugins = { + // eslint-disable-next-line new-cap spotify: new deemix_1.default.plugins.spotify() }; exports.plugins.spotify.setup(); @@ -39,7 +40,7 @@ exports.listener = { console.log(key, data); else console.log(key); - if (["downloadInfo", "downloadWarn"].includes(key)) + if (['downloadInfo', 'downloadWarn'].includes(key)) return; app_1.wss.clients.forEach(client => { if (client.readyState === ws_1.default.OPEN) { @@ -49,33 +50,44 @@ exports.listener = { } }; function getSettings() { - return { settings: exports.settings, defaultSettings: exports.defaultSettings, spotifySettings: exports.plugins.spotify.getCredentials() }; + return { settings, defaultSettings: exports.defaultSettings, spotifySettings: exports.plugins.spotify.getCredentials() }; } exports.getSettings = getSettings; function saveSettings(newSettings, newSpotifySettings) { deemix_1.default.settings.save(newSettings, exports.configFolder); - exports.settings = newSettings; + settings = newSettings; exports.plugins.spotify.setCredentials(newSpotifySettings); } exports.saveSettings = saveSettings; -exports.queueOrder = []; -exports.queue = {}; -exports.currentJob = null; +let queueOrder = []; +const queue = {}; +let currentJob = null; restoreQueueFromDisk(); +function getQueue() { + const result = { + queue, + queueOrder + }; + if (currentJob && currentJob !== true) { + result.current = currentJob.downloadObject.getSlimmedDict(); + } + return result; +} +exports.getQueue = getQueue; function addToQueue(dz, url, bitrate) { return __awaiter(this, void 0, void 0, function* () { if (!dz.logged_in) throw new errors_1.NotLoggedIn(); let downloadObjs = []; - let link = ""; + let link = ''; const requestUUID = uuid_1.v4(); if (url.length > 1) { - exports.listener.send("startGeneratingItems", { uuid: requestUUID, total: url.length }); + exports.listener.send('startGeneratingItems', { uuid: requestUUID, total: url.length }); } for (let i = 0; i < url.length; i++) { link = url[i]; console.log(`Adding ${link} to queue`); - let downloadObj = yield deemix_1.default.generateDownloadObject(dz, link, bitrate, exports.plugins, exports.listener); + const downloadObj = yield deemix_1.default.generateDownloadObject(dz, link, bitrate, exports.plugins, exports.listener); if (Array.isArray(downloadObj)) { downloadObjs = downloadObjs.concat(downloadObj); } @@ -84,12 +96,12 @@ function addToQueue(dz, url, bitrate) { } } if (url.length > 1) { - exports.listener.send("finishGeneratingItems", { uuid: requestUUID, total: downloadObjs.length }); + exports.listener.send('finishGeneratingItems', { uuid: requestUUID, total: downloadObjs.length }); } const slimmedObjects = []; downloadObjs.forEach((downloadObj, pos) => { // Check if element is already in queue - if (Object.keys(exports.queue).includes(downloadObj.uuid)) { + if (Object.keys(queue).includes(downloadObj.uuid)) { exports.listener.send('alreadyInQueue', downloadObj.getEssentialDict()); delete downloadObjs[pos]; return; @@ -97,16 +109,16 @@ function addToQueue(dz, url, bitrate) { // Save queue status when adding something to the queue if (!fs_1.default.existsSync(exports.configFolder + 'queue')) fs_1.default.mkdirSync(exports.configFolder + 'queue'); - exports.queueOrder.push(downloadObj.uuid); - fs_1.default.writeFileSync(exports.configFolder + `queue${path_1.sep}order.json`, JSON.stringify(exports.queueOrder)); - exports.queue[downloadObj.uuid] = downloadObj.getEssentialDict(); - exports.queue[downloadObj.uuid].status = 'inQueue'; + queueOrder.push(downloadObj.uuid); + fs_1.default.writeFileSync(exports.configFolder + `queue${path_1.sep}order.json`, JSON.stringify(queueOrder)); + queue[downloadObj.uuid] = downloadObj.getEssentialDict(); + queue[downloadObj.uuid].status = 'inQueue'; const savedObject = downloadObj.toDict(); savedObject.status = 'inQueue'; fs_1.default.writeFileSync(exports.configFolder + `queue${path_1.sep}${downloadObj.uuid}.json`, JSON.stringify(savedObject)); slimmedObjects.push(downloadObj.getSlimmedDict()); }); - const isSingleObject = downloadObjs.length == 1; + const isSingleObject = downloadObjs.length === 1; if (isSingleObject) exports.listener.send('addedToQueue', downloadObjs[0].getSlimmedDict()); else @@ -119,14 +131,14 @@ exports.addToQueue = addToQueue; function startQueue(dz) { return __awaiter(this, void 0, void 0, function* () { do { - if (exports.currentJob !== null || exports.queueOrder.length === 0) { + if (currentJob !== null || queueOrder.length === 0) { // Should not start another download return null; } - exports.currentJob = true; // lock currentJob - const currentUUID = exports.queueOrder.shift() || ''; + currentJob = true; // lock currentJob + const currentUUID = queueOrder.shift() || ''; console.log(currentUUID); - exports.queue[currentUUID].status = 'downloading'; + queue[currentUUID].status = 'downloading'; const currentItem = JSON.parse(fs_1.default.readFileSync(exports.configFolder + `queue${path_1.sep}${currentUUID}.json`).toString()); let downloadObject; switch (currentItem.__type__) { @@ -138,79 +150,80 @@ function startQueue(dz) { break; case 'Convertable': downloadObject = new Convertable(currentItem); - downloadObject = yield exports.plugins[downloadObject.plugin].convert(dz, downloadObject, exports.settings, exports.listener); + downloadObject = yield exports.plugins[downloadObject.plugin].convert(dz, downloadObject, settings, exports.listener); fs_1.default.writeFileSync(exports.configFolder + `queue${path_1.sep}${downloadObject.uuid}.json`, JSON.stringify(Object.assign(Object.assign({}, downloadObject.toDict()), { status: 'inQueue' }))); break; } - exports.currentJob = new Downloader(dz, downloadObject, exports.settings, exports.listener); + currentJob = new Downloader(dz, downloadObject, settings, exports.listener); exports.listener.send('startDownload', currentUUID); - yield exports.currentJob.start(); + yield currentJob.start(); if (!downloadObject.isCanceled) { // Set status - if (downloadObject.failed == downloadObject.size) { - exports.queue[currentUUID].status = 'failed'; + if (downloadObject.failed === downloadObject.size) { + queue[currentUUID].status = 'failed'; } else if (downloadObject.failed > 0) { - exports.queue[currentUUID].status = 'withErrors'; + queue[currentUUID].status = 'withErrors'; } else { - exports.queue[currentUUID].status = 'completed'; + queue[currentUUID].status = 'completed'; } const savedObject = downloadObject.getSlimmedDict(); - savedObject.status = exports.queue[currentUUID].status; + savedObject.status = queue[currentUUID].status; // Save queue status - exports.queue[currentUUID] = savedObject; + queue[currentUUID] = savedObject; fs_1.default.writeFileSync(exports.configFolder + `queue${path_1.sep}${currentUUID}.json`, JSON.stringify(savedObject)); } - console.log(exports.queueOrder); - fs_1.default.writeFileSync(exports.configFolder + `queue${path_1.sep}order.json`, JSON.stringify(exports.queueOrder)); - exports.currentJob = null; - } while (exports.queueOrder.length); + console.log(queueOrder); + fs_1.default.writeFileSync(exports.configFolder + `queue${path_1.sep}order.json`, JSON.stringify(queueOrder)); + currentJob = null; + } while (queueOrder.length); }); } exports.startQueue = startQueue; function cancelDownload(uuid) { - if (Object.keys(exports.queue).includes(uuid)) { - switch (exports.queue[uuid].status) { + if (Object.keys(queue).includes(uuid)) { + switch (queue[uuid].status) { case 'downloading': - exports.currentJob.downloadObject.isCanceled = true; + currentJob.downloadObject.isCanceled = true; exports.listener.send('cancellingCurrentItem', uuid); break; case 'inQueue': - exports.queueOrder.splice(exports.queueOrder.indexOf(uuid), 1); - fs_1.default.writeFileSync(exports.configFolder + `queue${path_1.sep}order.json`, JSON.stringify(exports.queueOrder)); + queueOrder.splice(queueOrder.indexOf(uuid), 1); + fs_1.default.writeFileSync(exports.configFolder + `queue${path_1.sep}order.json`, JSON.stringify(queueOrder)); // break + // eslint-disable-next-line no-fallthrough default: // This gets called even in the 'inQueue' case. Is this the expected behaviour? If no, de-comment the break exports.listener.send('removedFromQueue', uuid); break; } fs_1.default.unlinkSync(exports.configFolder + `queue${path_1.sep}${uuid}.json`); - delete exports.queue[uuid]; + delete queue[uuid]; } } exports.cancelDownload = cancelDownload; function cancelAllDownloads() { - exports.queueOrder = []; + queueOrder = []; let currentItem = null; - Object.values(exports.queue).forEach((downloadObject) => { - if (downloadObject.status == 'downloading') { - exports.currentJob.downloadObject.isCanceled = true; + Object.values(queue).forEach((downloadObject) => { + if (downloadObject.status === 'downloading') { + currentJob.downloadObject.isCanceled = true; exports.listener.send('cancellingCurrentItem', downloadObject.uuid); currentItem = downloadObject.uuid; } fs_1.default.unlinkSync(exports.configFolder + `queue${path_1.sep}${downloadObject.uuid}.json`); - delete exports.queue[downloadObject.uuid]; + delete queue[downloadObject.uuid]; }); - fs_1.default.writeFileSync(exports.configFolder + `queue${path_1.sep}order.json`, JSON.stringify(exports.queueOrder)); + fs_1.default.writeFileSync(exports.configFolder + `queue${path_1.sep}order.json`, JSON.stringify(queueOrder)); exports.listener.send('removedAllDownloads', currentItem); } exports.cancelAllDownloads = cancelAllDownloads; function clearCompletedDownloads() { - Object.values(exports.queue).forEach((downloadObject) => { + Object.values(queue).forEach((downloadObject) => { if (downloadObject.status === 'completed') { fs_1.default.unlinkSync(exports.configFolder + `queue${path_1.sep}${downloadObject.uuid}.json`); - delete exports.queue[downloadObject.uuid]; + delete queue[downloadObject.uuid]; } }); exports.listener.send('removedFinishedDownloads'); @@ -221,8 +234,8 @@ function restoreQueueFromDisk() { fs_1.default.mkdirSync(exports.configFolder + 'queue'); const allItems = fs_1.default.readdirSync(exports.configFolder + 'queue'); allItems.forEach((filename) => { - if (filename == 'order.json') { - exports.queueOrder = JSON.parse(fs_1.default.readFileSync(exports.configFolder + `queue${path_1.sep}order.json`).toString()); + if (filename === 'order.json') { + queueOrder = JSON.parse(fs_1.default.readFileSync(exports.configFolder + `queue${path_1.sep}order.json`).toString()); } else { const currentItem = JSON.parse(fs_1.default.readFileSync(exports.configFolder + `queue${path_1.sep}${filename}`).toString()); @@ -239,11 +252,11 @@ function restoreQueueFromDisk() { downloadObject = new Convertable(currentItem); break; } - exports.queue[downloadObject.uuid] = downloadObject.getEssentialDict(); - exports.queue[downloadObject.uuid].status = 'inQueue'; + queue[downloadObject.uuid] = downloadObject.getEssentialDict(); + queue[downloadObject.uuid].status = 'inQueue'; } else { - exports.queue[currentItem.uuid] = currentItem; + queue[currentItem.uuid] = currentItem; } } }); diff --git a/server/dist/routes/api/get/albumSearch.js b/server/dist/routes/api/get/albumSearch.js index ccec727..918fc3a 100644 --- a/server/dist/routes/api/get/albumSearch.js +++ b/server/dist/routes/api/get/albumSearch.js @@ -13,18 +13,16 @@ Object.defineProperty(exports, "__esModule", { value: true }); const deezer_js_1 = require("deezer-js"); const main_1 = require("../../../main"); const path = '/album-search/'; -const handler = (req, res, next) => __awaiter(void 0, void 0, void 0, function* () { +const handler = (req, res) => __awaiter(void 0, void 0, void 0, function* () { if (!main_1.sessionDZ[req.session.id]) main_1.sessionDZ[req.session.id] = new deezer_js_1.Deezer(); const dz = main_1.sessionDZ[req.session.id]; if (!req.query) { - res.status(400).send(); - return next(); + return res.status(400).send(); } const { term, start, nb, ack } = parseQuery(req.query); if (!term || term.trim() === '') { - res.status(400).send(); - return next(); + return res.status(400).send(); } const albums = yield dz.api.search_album(term, { start, nb }); const output = { @@ -32,9 +30,7 @@ const handler = (req, res, next) => __awaiter(void 0, void 0, void 0, function* total: albums.data.length, ack }; - res.send(output); - res.send(); - next(); + return res.send(output); }); const apiHandler = { path, handler }; exports.default = apiHandler; diff --git a/server/dist/routes/api/get/analyzeLink.js b/server/dist/routes/api/get/analyzeLink.js index 3918c74..db9f8fc 100644 --- a/server/dist/routes/api/get/analyzeLink.js +++ b/server/dist/routes/api/get/analyzeLink.js @@ -1 +1,46 @@ "use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +// @ts-expect-error +const deemix_1 = __importDefault(require("deemix")); +// @ts-expect-error +const deezer_js_1 = require("deezer-js"); +const main_1 = require("../../../main"); +const path = '/analyzeLink'; +const handler = (req, res) => __awaiter(void 0, void 0, void 0, function* () { + try { + if (!req.query || !req.query.term) { + return res.status(400).send({ errorMessage: 'No term specified', errorCode: 'AL01' }); + } + const { term: linkToAnalyze } = req.query; + const [, linkType, linkId] = yield deemix_1.default.parseLink(linkToAnalyze); + const isTrackOrAlbum = ['track', 'album'].includes(linkType); + if (isTrackOrAlbum) { + if (!main_1.sessionDZ[req.session.id]) + main_1.sessionDZ[req.session.id] = new deezer_js_1.Deezer(); + const dz = main_1.sessionDZ[req.session.id]; + const apiMethod = linkType === 'track' ? 'get_track' : 'get_album'; + const resBody = yield dz.api[apiMethod](linkId); + return res.status(200).send(resBody); + } + return res.status(400).send({ errorMessage: 'Not supported', errorCode: 'AL02' }); + } + catch (error) { + return res + .status(500) + .send({ errorMessage: 'The server had a problem. Please try again', errorObject: error, errorCode: 'AL03' }); + } +}); +const apiHandler = { path, handler }; +exports.default = apiHandler; diff --git a/server/dist/routes/api/get/changeAccount.js b/server/dist/routes/api/get/changeAccount.js index 3918c74..b26d529 100644 --- a/server/dist/routes/api/get/changeAccount.js +++ b/server/dist/routes/api/get/changeAccount.js @@ -1 +1,19 @@ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +// @ts-expect-error +const deezer_js_1 = require("deezer-js"); +const main_1 = require("../../../main"); +const path = '/changeAccount'; +const handler = (req, res) => { + if (!req.query || !req.query.child) { + return res.status(400).send({ errorMessage: 'No child specified', errorCode: 'CA01' }); + } + const { child: accountNum } = req.query; + if (!main_1.sessionDZ[req.session.id]) + main_1.sessionDZ[req.session.id] = new deezer_js_1.Deezer(); + const dz = main_1.sessionDZ[req.session.id]; + const accountData = dz.change_account(accountNum); + return res.status(200).send(accountData); +}; +const apiHandler = { path, handler }; +exports.default = apiHandler; diff --git a/server/dist/routes/api/get/getQueue.js b/server/dist/routes/api/get/getQueue.js index d6ace3e..d024f4f 100644 --- a/server/dist/routes/api/get/getQueue.js +++ b/server/dist/routes/api/get/getQueue.js @@ -4,12 +4,7 @@ const main_1 = require("../../../main"); const path = '/getQueue'; // let homeCache: any const handler = (_, res) => { - const result = { - queue: main_1.queue, - order: main_1.queueOrder - }; - if (main_1.currentJob) - result.currentItem = main_1.currentJob.downloadObject.getSlimmedDict(); + const result = main_1.getQueue(); res.send(result); }; const apiHandler = { path, handler }; diff --git a/server/dist/routes/api/get/getTracklist.js b/server/dist/routes/api/get/getTracklist.js index b8bdcf0..2ada6f3 100644 --- a/server/dist/routes/api/get/getTracklist.js +++ b/server/dist/routes/api/get/getTracklist.js @@ -31,14 +31,14 @@ const handler = (req, res) => __awaiter(void 0, void 0, void 0, function* () { if (!main_1.plugins.spotify.enabled) { res.send({ collaborative: false, - description: "", + description: '', external_urls: { spotify: null }, followers: { total: 0, href: null }, id: null, images: [], - name: "Something went wrong", + name: 'Something went wrong', owner: { - display_name: "Error", + display_name: 'Error', id: null }, public: true, @@ -48,15 +48,15 @@ const handler = (req, res) => __awaiter(void 0, void 0, void 0, function* () { }); break; } - let sp = main_1.plugins.spotify.sp; + const sp = main_1.plugins.spotify.sp; let playlist = yield sp.getPlaylist(list_id); playlist = playlist.body; let tracklist = playlist.tracks.items; while (playlist.tracks.next) { - let regExec = /offset=(\d+)&limit=(\d+)/g.exec(playlist.tracks.next); - let offset = regExec[1]; - let limit = regExec[2]; - let playlistTracks = yield sp.getPlaylistTracks(list_id, { offset, limit }); + const regExec = /offset=(\d+)&limit=(\d+)/g.exec(playlist.tracks.next); + const offset = regExec[1]; + const limit = regExec[2]; + const playlistTracks = yield sp.getPlaylistTracks(list_id, { offset, limit }); playlist.tracks = playlistTracks.body; tracklist = tracklist.concat(playlist.tracks.items); } diff --git a/server/dist/routes/api/get/getUserSpotifyPlaylists.js b/server/dist/routes/api/get/getUserSpotifyPlaylists.js index 2812f29..cf78113 100644 --- a/server/dist/routes/api/get/getUserSpotifyPlaylists.js +++ b/server/dist/routes/api/get/getUserSpotifyPlaylists.js @@ -14,16 +14,16 @@ const path = '/getUserSpotifyPlaylists'; const handler = (req, res) => __awaiter(void 0, void 0, void 0, function* () { let data; if (main_1.plugins.spotify.enabled) { - let sp = main_1.plugins.spotify.sp; + const sp = main_1.plugins.spotify.sp; const username = req.query.spotifyUser; data = []; let playlists = yield sp.getUserPlaylists(username); let playlistList = playlists.body.items; while (playlists.next) { - let regExec = /offset=(\d+)&limit=(\d+)/g.exec(playlists.next); - let offset = regExec[1]; - let limit = regExec[2]; - let newPlaylists = yield sp.getUserPlaylists(username, { offset, limit }); + const regExec = /offset=(\d+)&limit=(\d+)/g.exec(playlists.next); + const offset = regExec[1]; + const limit = regExec[2]; + const newPlaylists = yield sp.getUserPlaylists(username, { offset, limit }); playlists = newPlaylists.body; playlistList = playlistList.concat(playlists.items); } diff --git a/server/dist/routes/api/get/index.js b/server/dist/routes/api/get/index.js index 25db80f..003cad6 100644 --- a/server/dist/routes/api/get/index.js +++ b/server/dist/routes/api/get/index.js @@ -3,6 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); +const analyzeLink_1 = __importDefault(require("./analyzeLink")); +const changeAccount_1 = __importDefault(require("./changeAccount")); const getHome_1 = __importDefault(require("./getHome")); const getCharts_1 = __importDefault(require("./getCharts")); const mainSearch_1 = __importDefault(require("./mainSearch")); @@ -20,6 +22,8 @@ const getUserFavorites_1 = __importDefault(require("./getUserFavorites")); const getQueue_1 = __importDefault(require("./getQueue")); exports.default = [ albumSearch_1.default, + changeAccount_1.default, + analyzeLink_1.default, getHome_1.default, getCharts_1.default, getChartTracks_1.default, diff --git a/server/dist/routes/api/post/addToQueue.js b/server/dist/routes/api/post/addToQueue.js index 2d8f7e8..05ac775 100644 --- a/server/dist/routes/api/post/addToQueue.js +++ b/server/dist/routes/api/post/addToQueue.js @@ -20,7 +20,7 @@ const handler = (req, res) => __awaiter(void 0, void 0, void 0, function* () { const url = req.query.url.split(';'); let bitrate = req.query.bitrate; if (bitrate === 'null') - bitrate = main_1.settings.maxBitrate; + bitrate = main_1.getSettings().settings.maxBitrate; let obj; try { obj = yield main_1.addToQueue(dz, url, bitrate); diff --git a/server/dist/routes/api/post/cancelAllDownloads.js b/server/dist/routes/api/post/cancelAllDownloads.js index 6604e53..d988843 100644 --- a/server/dist/routes/api/post/cancelAllDownloads.js +++ b/server/dist/routes/api/post/cancelAllDownloads.js @@ -1,19 +1,10 @@ "use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; Object.defineProperty(exports, "__esModule", { value: true }); const main_1 = require("../../../main"); const path = '/cancelAllDownloads'; -const handler = (req, res) => __awaiter(void 0, void 0, void 0, function* () { +const handler = (_, res) => { main_1.cancelAllDownloads(); res.send({ result: true }); -}); +}; const apiHandler = { path, handler }; exports.default = apiHandler; diff --git a/server/dist/routes/api/post/login-arl.js b/server/dist/routes/api/post/login-arl.js index 8db1483..9364469 100644 --- a/server/dist/routes/api/post/login-arl.js +++ b/server/dist/routes/api/post/login-arl.js @@ -20,17 +20,15 @@ const LoginStatus = { FORCED_SUCCESS: 3 }; const path = '/login-arl'; -const handler = (req, res, next) => __awaiter(void 0, void 0, void 0, function* () { +const handler = (req, res, _) => __awaiter(void 0, void 0, void 0, function* () { if (!main_1.sessionDZ[req.session.id]) main_1.sessionDZ[req.session.id] = new deezer_js_1.Deezer(); const dz = main_1.sessionDZ[req.session.id]; if (!req.query) { - res.status(400).send(); - return next(); + return res.status(400).send(); } if (!req.query.arl) { - res.status(400).send(); - return next(); + return res.status(400).send(); } const loginParams = [req.query.arl]; // TODO Handle the child === 0 case, don't want to rely on the login_via_arl default param (it may change in the @@ -52,11 +50,9 @@ const handler = (req, res, next) => __awaiter(void 0, void 0, void 0, function* const testDz = new deezer_js_1.Deezer(); response = yield testDz.login_via_arl(...loginParams); } - console.log(response); const returnValue = { status: response, arl: req.query.arl, user: dz.current_user }; - res.status(200).send(returnValue); main_1.startQueue(dz); - next(); + return res.status(200).send(returnValue); }); const apiHandler = { path, handler }; exports.default = apiHandler; diff --git a/server/dist/routes/api/post/logout.js b/server/dist/routes/api/post/logout.js index 6bfcb26..64ea061 100644 --- a/server/dist/routes/api/post/logout.js +++ b/server/dist/routes/api/post/logout.js @@ -1,21 +1,12 @@ "use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; Object.defineProperty(exports, "__esModule", { value: true }); // @ts-expect-error const deezer_js_1 = require("deezer-js"); const main_1 = require("../../../main"); const path = '/logout'; -const handler = (req, res) => __awaiter(void 0, void 0, void 0, function* () { +const handler = (req, res) => { main_1.sessionDZ[req.session.id] = new deezer_js_1.Deezer(); res.send({ logged_out: true }); -}); +}; const apiHandler = { path, handler }; exports.default = apiHandler; diff --git a/server/dist/routes/api/post/removeFinishedDownloads.js b/server/dist/routes/api/post/removeFinishedDownloads.js index dea5a50..806a412 100644 --- a/server/dist/routes/api/post/removeFinishedDownloads.js +++ b/server/dist/routes/api/post/removeFinishedDownloads.js @@ -1,19 +1,10 @@ "use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; Object.defineProperty(exports, "__esModule", { value: true }); const main_1 = require("../../../main"); const path = '/removeFinishedDownloads'; -const handler = (req, res) => __awaiter(void 0, void 0, void 0, function* () { +const handler = (_, res) => { main_1.clearCompletedDownloads(); res.send({ result: true }); -}); +}; const apiHandler = { path, handler }; exports.default = apiHandler; diff --git a/server/dist/routes/api/post/removeFromQueue.js b/server/dist/routes/api/post/removeFromQueue.js index 202291d..4a162e4 100644 --- a/server/dist/routes/api/post/removeFromQueue.js +++ b/server/dist/routes/api/post/removeFromQueue.js @@ -1,17 +1,8 @@ "use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; Object.defineProperty(exports, "__esModule", { value: true }); const main_1 = require("../../../main"); const path = '/removeFromQueue'; -const handler = (req, res) => __awaiter(void 0, void 0, void 0, function* () { +const handler = (req, res) => { const { uuid } = req.query; if (uuid) { main_1.cancelDownload(uuid); @@ -20,6 +11,6 @@ const handler = (req, res) => __awaiter(void 0, void 0, void 0, function* () { else { res.send({ result: false }); } -}); +}; const apiHandler = { path, handler }; exports.default = apiHandler; diff --git a/server/dist/routes/api/post/saveSettings.js b/server/dist/routes/api/post/saveSettings.js index 342a23b..1d6f2e7 100644 --- a/server/dist/routes/api/post/saveSettings.js +++ b/server/dist/routes/api/post/saveSettings.js @@ -1,21 +1,12 @@ "use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; Object.defineProperty(exports, "__esModule", { value: true }); const main_1 = require("../../../main"); const path = '/saveSettings'; -const handler = (req, res) => __awaiter(void 0, void 0, void 0, function* () { +const handler = (req, res) => { const { settings, spotifySettings } = req.query; main_1.saveSettings(settings, spotifySettings); main_1.listener.send('updateSettings', { settings, spotifySettings }); res.send({ result: true }); -}); +}; const apiHandler = { path, handler }; exports.default = apiHandler; diff --git a/server/dist/routes/index.js b/server/dist/routes/index.js index 882bcc3..fe8768d 100644 --- a/server/dist/routes/index.js +++ b/server/dist/routes/index.js @@ -31,14 +31,9 @@ router.get('/connect', (req, res) => { currentUser: dz.current_user, deezerNotAvailable: false }; - if (Object.keys(main_1.queue).length > 0) { - result.queue = { - queue: main_1.queue, - queueOrder: main_1.queueOrder - }; - if (main_1.currentJob && main_1.currentJob !== true) { - result.queue.current = main_1.currentJob.downloadObject.getSlimmedDict(); - } + const queue = main_1.getQueue(); + if (Object.keys(queue.queue).length > 0) { + result.queue = queue; } res.send(result); }); diff --git a/server/src/main.ts b/server/src/main.ts index 0caef21..e52c87d 100644 --- a/server/src/main.ts +++ b/server/src/main.ts @@ -12,8 +12,8 @@ const Downloader = deemix.downloader.Downloader const { Single, Collection, Convertable } = deemix.types.downloadObjects export const defaultSettings: Settings = deemix.settings.DEFAULTS export const configFolder: string = deemix.utils.localpaths.getConfigFolder() -export let settings: any = deemix.settings.load(configFolder) export const sessionDZ: any = {} +let settings: any = deemix.settings.load(configFolder) export const getAccessToken = deemix.utils.deezer.getAccessToken export const getArlFromAccessToken = deemix.utils.deezer.getArlFromAccessToken @@ -47,12 +47,23 @@ export function saveSettings(newSettings: any, newSpotifySettings: any) { plugins.spotify.setCredentials(newSpotifySettings) } -export let queueOrder: string[] = [] -export const queue: any = {} -export let currentJob: any = null +let queueOrder: string[] = [] +const queue: any = {} +let currentJob: any = null restoreQueueFromDisk() +export function getQueue() { + const result: any = { + queue, + queueOrder + } + if (currentJob && currentJob !== true) { + result.current = currentJob.downloadObject.getSlimmedDict() + } + return result +} + export async function addToQueue(dz: any, url: string[], bitrate: number) { if (!dz.logged_in) throw new NotLoggedIn() @@ -146,7 +157,7 @@ export async function startQueue(dz: any): Promise { if (!downloadObject.isCanceled) { // Set status - if (downloadObject.failed == downloadObject.size) { + if (downloadObject.failed === downloadObject.size) { queue[currentUUID].status = 'failed' } else if (downloadObject.failed > 0) { queue[currentUUID].status = 'withErrors' diff --git a/server/src/routes/api/get/getQueue.ts b/server/src/routes/api/get/getQueue.ts index 37eda9e..5011b1d 100644 --- a/server/src/routes/api/get/getQueue.ts +++ b/server/src/routes/api/get/getQueue.ts @@ -1,18 +1,13 @@ // import { Deezer } from 'deezer-js' import { ApiHandler } from '../../../types' -import { queueOrder, queue, currentJob } from '../../../main' +import { getQueue } from '../../../main' const path: ApiHandler['path'] = '/getQueue' // let homeCache: any const handler: ApiHandler['handler'] = (_, res) => { - const result: any = { - queue, - order: queueOrder - } - if (currentJob) result.currentItem = currentJob.downloadObject.getSlimmedDict() - + const result: any = getQueue() res.send(result) } diff --git a/server/src/routes/api/post/addToQueue.ts b/server/src/routes/api/post/addToQueue.ts index 1db5f77..372920d 100644 --- a/server/src/routes/api/post/addToQueue.ts +++ b/server/src/routes/api/post/addToQueue.ts @@ -1,7 +1,7 @@ // @ts-expect-error import { Deezer } from 'deezer-js' import { ApiHandler } from '../../../types' -import { sessionDZ, addToQueue, settings, listener } from '../../../main' +import { sessionDZ, addToQueue, getSettings, listener } from '../../../main' const path: ApiHandler['path'] = '/addToQueue' @@ -11,7 +11,7 @@ const handler: ApiHandler['handler'] = async (req, res) => { const url = req.query.url.split(';') let bitrate = req.query.bitrate - if (bitrate === 'null') bitrate = settings.maxBitrate + if (bitrate === 'null') bitrate = getSettings().settings.maxBitrate let obj: any try { diff --git a/server/src/routes/api/post/login-arl.ts b/server/src/routes/api/post/login-arl.ts index 89d6016..adc799e 100644 --- a/server/src/routes/api/post/login-arl.ts +++ b/server/src/routes/api/post/login-arl.ts @@ -19,7 +19,7 @@ const LoginStatus = { const path: ApiHandler['path'] = '/login-arl' -const handler: RequestHandler<{}, {}, {}, RawLoginArlQuery> = async (req, res, next) => { +const handler: RequestHandler<{}, {}, {}, RawLoginArlQuery> = async (req, res, _) => { if (!sessionDZ[req.session.id]) sessionDZ[req.session.id] = new Deezer() const dz = sessionDZ[req.session.id] diff --git a/server/src/routes/index.ts b/server/src/routes/index.ts index a1004f2..9b23636 100644 --- a/server/src/routes/index.ts +++ b/server/src/routes/index.ts @@ -1,7 +1,7 @@ import express from 'express' // @ts-expect-error import { Deezer } from 'deezer-js' -import { sessionDZ, queue, queueOrder, currentJob } from '../main' +import { sessionDZ, getQueue } from '../main' const router = express.Router() @@ -30,14 +30,10 @@ router.get('/connect', (req, res) => { deezerNotAvailable: false } - if (Object.keys(queue).length > 0) { - result.queue = { - queue, - queueOrder - } - if (currentJob && currentJob !== true) { - result.queue.current = currentJob.downloadObject.getSlimmedDict() - } + const queue = getQueue() + + if (Object.keys(queue.queue).length > 0) { + result.queue = queue } res.send(result)