1.1.15 - importer fixes, queue virtual scroller

This commit is contained in:
exttex
2021-01-26 20:13:01 +01:00
parent b0ebe66d54
commit babaa68d91
36 changed files with 854 additions and 325 deletions

View File

@ -10,19 +10,37 @@ class Importer extends EventEmitter {
this.tracks = [];
}
//Conver spotify URL to URI
async getSpotifyURI(inputUrl) {
let url = new URL(inputUrl);
return 'spotify' + url.pathname.replace(new RegExp('/', 'g'), ':');
//Resolve spotify URLs to URI
async resolveSpotifyURL(url) {
let parsed = new URL(url);
//link.tospotify
if (parsed.host == 'link.tospotify.com') {
let res = await axios.get(url);
let re = new RegExp(/window\.top\.location = validate\("(.+)"\)/);
url = res.data.match(re)[1];
}
parsed = new URL(url);
//open.spotify
if (parsed.host == 'open.spotify.com' && parsed.pathname.split('/').length >= 2) {
return 'spotify' + parsed.pathname.replace(new RegExp('/', 'g'), ':');
}
}
//Find album on deezer
async importSpotifyAlbum(uri) {
let spotifyData = await Spotify.getEmbedData(uri);
let upc = spotifyData.external_ids.upc;
let deezerData = await this.deezer.callPublicApi('album', 'upc:' + upc);
if (deezerData && deezerData.id)
return deezerData;
}
//Import spotify playlist
async importSpotifyPlaylist(url) {
async importSpotifyPlaylist(uri) {
//Clean
this.tracks = [];
try {
//Fetch
let uri = await this.getSpotifyURI(url);
let spotifyData = await Spotify.getEmbedData(uri);
if (!spotifyData.tracks.items) throw Error("No items!");

View File

@ -11,6 +11,7 @@ const {Track, Album, Artist, Playlist, DeezerProfile, SearchResults, DeezerLibra
const {DownloadManager} = require('./downloads');
const {Integrations} = require('./integrations');
const {Importer} = require('./importer');
const { url } = require('inspector');
let settings;
let deezer;
@ -478,53 +479,94 @@ app.post('/import', async (req, res) => {
//Create importer
let importer = new Importer(deezer);
//Error
importer.on('error', t => {
//Resolve URI
let uri = await importer.resolveSpotifyURL(req.body.url);
if (!uri) {
sockets.forEach(s => s.emit('importerError'));
})
//New track imported
importer.on('imported', t => {
sockets.forEach(s => s.emit('importerTrack', t));
});
//Finished
importer.on('done', async (i) => {
//Create playlist
let playlistRaw = await deezer.callApi('playlist.create', {
description: i.description,
title: i.title,
status: 1,
songs: i.tracks.map(t => [parseInt(t.id, 10)])
});
//Download
if (type == 'download') {
//Fetch playlist
let data = await deezer.callApi('deezer.pagePlaylist', {
playlist_id: playlistRaw.results.toString(),
lang: settings.contentLanguage,
nb: 10000,
start: 0,
tags: true
});
let playlist = new Playlist(data.results.DATA, data.results.SONGS);
//Enqueue
await downloadManager.addBatch({
tracks: playlist.tracks,
quality: settings.downloadsQuality,
playlistName: i.title
});
//Delete
await deezer.callApi('playlist.delete', {playlist_id: parseInt(playlist.id.toString(),10)});
downloadManager.start();
return res.status(200).end();
}
//Import album
if (uri.split(':')[1] == 'album') {
try {
let albumRaw = await importer.importSpotifyAlbum(uri);
//Get album from Deezer
let data = await deezer.callApi('deezer.pageAlbum', {alb_id: albumRaw.id.toString(), lang: settings.contentLanguage});
let album = new Album(data.results.DATA, data.results.SONGS);
//Download
if (type == 'download') {
//Enqueue
await downloadManager.addBatch({
tracks: album.tracks,
quality: settings.downloadsQuality,
});
downloadManager.start();
//Send empty response
sockets.forEach(s => s.emit('importerAlbum', null));
} else {
//Send to UI
sockets.forEach(s => s.emit('importerAlbum', album));
}
} catch (e) {
logger.error(`Import album error: ${e}`);
sockets.forEach(s => s.emit('importerError'));
}
return res.status(200).end();
}
//Send to UI
sockets.forEach(s => {
s.emit('importerDone');
//Import playlist
if (uri.split(':')[1] == 'playlist') {
//Error
importer.on('error', () => {
sockets.forEach(s => s.emit('importerError'));
})
//New track imported
importer.on('imported', t => {
sockets.forEach(s => s.emit('importerTrack', t));
});
})
//Finished
importer.on('done', async (i) => {
//Create playlist
let playlistRaw = await deezer.callApi('playlist.create', {
description: i.description,
title: i.title,
status: 1,
songs: i.tracks.map(t => [parseInt(t.id, 10)])
});
//Download
if (type == 'download') {
//Fetch playlist
let data = await deezer.callApi('deezer.pagePlaylist', {
playlist_id: playlistRaw.results.toString(),
lang: settings.contentLanguage,
nb: 10000,
start: 0,
tags: true
});
let playlist = new Playlist(data.results.DATA, data.results.SONGS);
//Enqueue
await downloadManager.addBatch({
tracks: playlist.tracks,
quality: settings.downloadsQuality,
playlistName: i.title
});
//Delete
await deezer.callApi('playlist.delete', {playlist_id: parseInt(playlist.id.toString(),10)});
downloadManager.start();
}
importer.importSpotifyPlaylist(req.body.url);
//Send to UI
sockets.forEach(s => {
s.emit('importerDone');
});
})
importer.importSpotifyPlaylist(uri);
return res.status(200).end();
}
//Not imported
sockets.forEach(s => s.emit('importerError'));
res.status(200).end();
});