better error handling
This commit is contained in:
parent
4cd87d9b87
commit
a3e8d2013f
135
src/index.js
135
src/index.js
|
@ -90,7 +90,23 @@ if (!fs.existsSync(toDeleteLocation)) fs.writeFileSync(toDeleteLocation, '[]', {
|
||||||
let toDelete = JSON.parse(fs.readFileSync(toDeleteLocation, {encoding: 'utf8'}));
|
let toDelete = JSON.parse(fs.readFileSync(toDeleteLocation, {encoding: 'utf8'}));
|
||||||
|
|
||||||
function updateQueueFile() {
|
function updateQueueFile() {
|
||||||
fs.writeFileSync(toDeleteLocation, JSON.stringify(toDelete), {encoding: 'utf8'});
|
try {
|
||||||
|
fs.writeFileSync(toDeleteLocation, JSON.stringify(toDelete), {encoding: 'utf8'});
|
||||||
|
} catch(err) {
|
||||||
|
logger.error('failed to write to deletion queue json file! wrong permissions or ran out of space?', err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function deleteQueuedFile(file) {
|
||||||
|
toDelete = toDelete.filter(c => c.file !== file);
|
||||||
|
updateQueueFile();
|
||||||
|
fs.unlink(file, (err) => {
|
||||||
|
if (err) {
|
||||||
|
logger.warn(`failed to delete ${file}!`);
|
||||||
|
logger.warn(err.toString());
|
||||||
|
logger.warn('if this file still exists, you will have to manually delete it');
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function queueDeletion(file) {
|
function queueDeletion(file) {
|
||||||
|
@ -101,14 +117,8 @@ function queueDeletion(file) {
|
||||||
file
|
file
|
||||||
});
|
});
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
toDelete = toDelete.filter(c => c.file !== file);
|
|
||||||
updateQueueFile();
|
|
||||||
logger.info(`deleting queued file ${file}`);
|
logger.info(`deleting queued file ${file}`);
|
||||||
try {
|
deleteQueuedFile(file);
|
||||||
fs.unlinkSync(file);
|
|
||||||
} catch(err) {
|
|
||||||
logger.warn(`failed to delete ${file}! is the file already gone?`);
|
|
||||||
}
|
|
||||||
}, deleteTimer);
|
}, deleteTimer);
|
||||||
updateQueueFile();
|
updateQueueFile();
|
||||||
}
|
}
|
||||||
|
@ -117,25 +127,13 @@ logger.info(`loaded ${toDelete.length} items in deletion queue`);
|
||||||
let updateQueue = false;
|
let updateQueue = false;
|
||||||
for (let del of toDelete) {
|
for (let del of toDelete) {
|
||||||
if (Date.now() - del.date >= 0) {
|
if (Date.now() - del.date >= 0) {
|
||||||
toDelete = toDelete.filter(c => c.file !== del.file);
|
|
||||||
logger.warn(`deleting ${del.file} - was meant to be deleted ${timeago.format(del.date)}`);
|
logger.warn(`deleting ${del.file} - was meant to be deleted ${timeago.format(del.date)}`);
|
||||||
updateQueue = true;
|
deleteQueuedFile(del.file);
|
||||||
try {
|
|
||||||
fs.unlinkSync(del.file);
|
|
||||||
} catch(err) {
|
|
||||||
logger.warn(`failed to delete ${del.file}! is the file already gone?`);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
logger.info(`queueing deletion of ${del.file} ${timeago.format(del.date)}`);
|
logger.info(`queueing deletion of ${del.file} ${timeago.format(del.date)}`);
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
toDelete = toDelete.filter(c => c.file !== del.file);
|
|
||||||
updateQueueFile();
|
|
||||||
logger.info(`deleting queued file ${del.file}`);
|
logger.info(`deleting queued file ${del.file}`);
|
||||||
try {
|
deleteQueuedFile(del.file);
|
||||||
fs.unlinkSync(del.file);
|
|
||||||
} catch(err) {
|
|
||||||
logger.warn(`failed to delete ${del.file}! is the file already gone?`);
|
|
||||||
}
|
|
||||||
}, del.date - Date.now());
|
}, del.date - Date.now());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -160,10 +158,15 @@ app.use('/data', express.static('data', {extensions: ['flac', 'mp3']}));
|
||||||
|
|
||||||
app.get('/api/search', async (req, res) => {
|
app.get('/api/search', async (req, res) => {
|
||||||
if (!req.query.search) return res.sendStatus(400);
|
if (!req.query.search) return res.sendStatus(400);
|
||||||
|
let s;
|
||||||
let s = searchcache[req.query.search] || (await deezerInstance.api.search_album(req.query.search, {
|
try {
|
||||||
limit: config.limits.searchLimit || 15,
|
s = searchcache[req.query.search] || (await deezerInstance.api.search_album(req.query.search, {
|
||||||
}));
|
limit: config.limits.searchLimit || 15,
|
||||||
|
}));
|
||||||
|
} catch(err) {
|
||||||
|
logger.error(err.toString());
|
||||||
|
res.sendStatus(500);
|
||||||
|
}
|
||||||
if (!searchcache[req.query.search]) searchcache[req.query.search] = s;
|
if (!searchcache[req.query.search]) searchcache[req.query.search] = s;
|
||||||
|
|
||||||
let format = s.data.map(s => {
|
let format = s.data.map(s => {
|
||||||
|
@ -207,42 +210,38 @@ app.get('/api/album', async (req, res) => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
app.ws('/api/album', async (ws, req) => {
|
async function deemixDownloadWrapper(dlObj, ws, coverArt, metadata) {
|
||||||
if (!req.query.id) return ws.close(1008, 'Supply a track ID in the query!');
|
|
||||||
|
|
||||||
let trackpaths = [];
|
let trackpaths = [];
|
||||||
|
|
||||||
const listener = {
|
const listener = {
|
||||||
send(key, data) {
|
send(key, data) {
|
||||||
if (data.downloaded) {
|
if (data.downloaded) {
|
||||||
// ws.send(JSON.stringify({key: 'download', data: data.downloadPath.replace(process.cwd(), '')}));
|
|
||||||
trackpaths.push(data.downloadPath);
|
trackpaths.push(data.downloadPath);
|
||||||
queueDeletion(data.downloadPath);
|
queueDeletion(data.downloadPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data.state !== 'tagging' && data.state !== 'getAlbumArt' && data.state !== 'getTags') ws.send(JSON.stringify({key, data}));
|
if (data.state !== 'tagging' && data.state !== 'getAlbumArt' && data.state !== 'getTags' && !dlObj.isCanceled) ws.send(JSON.stringify({key, data}));
|
||||||
//console.log(`[${key}] ${inspect(data)}`);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let album;
|
listener.send('coverArt', coverArt);
|
||||||
|
listener.send('metadata', metadata);
|
||||||
|
|
||||||
|
deemixDownloader = new deemix.downloader.Downloader(deezerInstance, dlObj, deemixSettings, listener);
|
||||||
try {
|
try {
|
||||||
album = albumcache[req.query.id] || (await deezerInstance.api.get_album(req.query.id));
|
await deemixDownloader.start();
|
||||||
if (!albumcache[req.query.id]) albumcache[req.query.id] = album;
|
|
||||||
} catch(err) {
|
} catch(err) {
|
||||||
logger.error(err.toString());
|
logger.warn(err.toString());
|
||||||
return ws.close(1012, 'Album not found');
|
logger.warn('(this may be deemix just being whiny)');
|
||||||
}
|
}
|
||||||
|
|
||||||
listener.send('coverArt', album.cover_medium);
|
if (dlObj.isCanceled) {
|
||||||
listener.send('metadata', {id: album.id, title: album.title, artist: album.artist.name});
|
logger.debug('download gracefully cancelled, cleaning up');
|
||||||
|
trackpaths.forEach((q) => {
|
||||||
let dlObj = await deemix.generateDownloadObject(deezerInstance, 'https://www.deezer.com/album/' + req.query.id, format);
|
logger.info(`removing ${q}`);
|
||||||
deemixDownloader = new deemix.downloader.Downloader(deezerInstance, dlObj, deemixSettings, listener);
|
deleteQueuedFile(q);
|
||||||
|
});
|
||||||
await deemixDownloader.start();
|
} else if (trackpaths.length > 1) {
|
||||||
|
|
||||||
if (trackpaths.length > 1) {
|
|
||||||
await ws.send(JSON.stringify({key: 'zipping'}));
|
await ws.send(JSON.stringify({key: 'zipping'}));
|
||||||
|
|
||||||
const folderName = trackpaths[0].split('/').slice(-2)[0];
|
const folderName = trackpaths[0].split('/').slice(-2)[0];
|
||||||
|
@ -256,9 +255,31 @@ app.ws('/api/album', async (ws, req) => {
|
||||||
await ws.send(JSON.stringify({key: 'download', data: `data/${folderName}.zip`}));
|
await ws.send(JSON.stringify({key: 'download', data: `data/${folderName}.zip`}));
|
||||||
|
|
||||||
queueDeletion('./data/' + folderName + '.zip');
|
queueDeletion('./data/' + folderName + '.zip');
|
||||||
} else {
|
} else if (trackpaths.length === 1) {
|
||||||
await ws.send(JSON.stringify({key: 'download', data: trackpaths[0].replace(process.cwd(), '')}));
|
await ws.send(JSON.stringify({key: 'download', data: trackpaths[0].replace(process.cwd(), '')}));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
app.ws('/api/album', async (ws, req) => {
|
||||||
|
if (!req.query.id) return ws.close(1008, 'Supply a track ID in the query!');
|
||||||
|
|
||||||
|
const dlObj = await deemix.generateDownloadObject(deezerInstance, 'https://www.deezer.com/album/' + req.query.id, format);
|
||||||
|
|
||||||
|
ws.on('close', (code) => {
|
||||||
|
dlObj.isCanceled = true;
|
||||||
|
logger.debug(`client left unexpectedly with code ${code}; cancelling download`);
|
||||||
|
});
|
||||||
|
|
||||||
|
let album;
|
||||||
|
try {
|
||||||
|
album = albumcache[req.query.id] || (await deezerInstance.api.get_album(req.query.id));
|
||||||
|
if (!albumcache[req.query.id]) albumcache[req.query.id] = album;
|
||||||
|
} catch(err) {
|
||||||
|
logger.error(err.toString());
|
||||||
|
return ws.close(1012, 'Album not found');
|
||||||
|
}
|
||||||
|
|
||||||
|
await deemixDownloadWrapper(dlObj, ws, album.cover_medium, {id: album.id, title: album.title, artist: album.artist.name});
|
||||||
|
|
||||||
ws.close(1000);
|
ws.close(1000);
|
||||||
});
|
});
|
||||||
|
@ -266,17 +287,7 @@ app.ws('/api/album', async (ws, req) => {
|
||||||
app.ws('/api/track', async (ws, req) => {
|
app.ws('/api/track', async (ws, req) => {
|
||||||
if (!req.query.id) return ws.close(1008, 'Supply a track ID in the query!');
|
if (!req.query.id) return ws.close(1008, 'Supply a track ID in the query!');
|
||||||
|
|
||||||
const listener = {
|
const dlObj = await deemix.generateDownloadObject(deezerInstance, 'https://www.deezer.com/track/' + req.query.id, format);
|
||||||
send(key, data) {
|
|
||||||
if (data.downloaded) {
|
|
||||||
ws.send(JSON.stringify({key: 'download', data: data.downloadPath.replace(process.cwd(), '')}));
|
|
||||||
queueDeletion(data.downloadPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.state !== 'tagging' && data.state !== 'getAlbumArt' && data.state !== 'getTags') ws.send(JSON.stringify({key, data}));
|
|
||||||
//console.log(`[${key}] ${inspect(data)}`);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let track;
|
let track;
|
||||||
try {
|
try {
|
||||||
|
@ -287,13 +298,7 @@ app.ws('/api/track', async (ws, req) => {
|
||||||
return ws.close(1012, 'Track not found');
|
return ws.close(1012, 'Track not found');
|
||||||
}
|
}
|
||||||
|
|
||||||
listener.send('coverArt', track.album.cover_medium);
|
await deemixDownloadWrapper(dlObj, ws, track.album.cover_medium, {id: track.id, title: track.title, artist: track.artist.name});
|
||||||
listener.send('metadata', {id: track.id, title: track.title, artist: track.artist.name});
|
|
||||||
|
|
||||||
let dlObj = await deemix.generateDownloadObject(deezerInstance, 'https://www.deezer.com/track/' + req.query.id, format);
|
|
||||||
deemixDownloader = new deemix.downloader.Downloader(deezerInstance, dlObj, deemixSettings, listener);
|
|
||||||
|
|
||||||
await deemixDownloader.start();
|
|
||||||
|
|
||||||
ws.close(1000);
|
ws.close(1000);
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue