Implemented spotify plugin on server

This commit is contained in:
RemixDev
2021-05-29 12:06:26 +02:00
parent fee34f2b2a
commit 731295a317
25 changed files with 353 additions and 28 deletions

View File

@@ -18,7 +18,10 @@ export const sessionDZ: any = {}
export const getAccessToken = deemix.utils.deezer.getAccessToken
export const getArlFromAccessToken = deemix.utils.deezer.getArlFromAccessToken
const deemixPlugins = {}
export const plugins: any = {
spotify: new deemix.plugins.spotify()
}
plugins.spotify.setup()
export const listener = {
send(key: string, data?: any) {
@@ -31,9 +34,14 @@ export const listener = {
}
}
export function saveSettings(newSettings: any) {
export function getSettings(): any {
return {settings, defaultSettings, spotifySettings: plugins.spotify.getCredentials()}
}
export function saveSettings(newSettings: any, newSpotifySettings: any) {
deemix.settings.save(newSettings, configFolder)
settings = newSettings
plugins.spotify.setCredentials(newSpotifySettings)
}
export let queueOrder: string[] = []
@@ -56,7 +64,7 @@ export async function addToQueue(dz: any, url: string[], bitrate: number) {
for (let i = 0; i < url.length; i++){
link = url[i]
console.log(`Adding ${link} to queue`)
let downloadObj = await deemix.generateDownloadObject(dz, link, bitrate, deemixPlugins, listener)
let downloadObj = await deemix.generateDownloadObject(dz, link, bitrate, plugins, listener)
if (Array.isArray(downloadObj)){
downloadObjs.concat(downloadObj)
} else {
@@ -119,7 +127,8 @@ export async function startQueue(dz: any): Promise<any> {
break
case 'Convertable':
downloadObject = new Convertable(currentItem)
// Convert object here
downloadObject = await plugins[downloadObject.plugin].convert(dz, downloadObject, settings, listener)
fs.writeFileSync(configFolder + `queue${sep}${downloadObject.uuid}.json`, JSON.stringify({...downloadObject.toDict(), status: 'inQueue'}))
break
}
currentJob = new Downloader(dz, downloadObject, settings, listener)

View File

@@ -1,10 +1,10 @@
import { ApiHandler } from '../../../types'
import { settings, defaultSettings } from '../../../main'
import { getSettings } from '../../../main'
const path: ApiHandler['path'] = '/getSettings'
const handler: ApiHandler['handler'] = (_, res) => {
res.send({ settings, defaultSettings })
res.send(getSettings())
}
const apiHandler: ApiHandler = { path, handler }

View File

@@ -1,7 +1,7 @@
// @ts-expect-error
import { Deezer } from 'deezer-js'
import { ApiHandler } from '../../../types'
import { sessionDZ } from '../../../main'
import { sessionDZ, plugins } from '../../../main'
const path: ApiHandler['path'] = '/getTracklist'
@@ -18,6 +18,48 @@ const handler: ApiHandler['handler'] = async (req, res) => {
res.send(artistAPI)
break
}
case 'spotifyplaylist':
case 'spotify_playlist': {
if (!plugins.spotify.enabled){
res.send({
collaborative: false,
description: "",
external_urls: {spotify: null},
followers: {total: 0, href: null},
id: null,
images: [],
name: "Something went wrong",
owner: {
display_name: "Error",
id: null
},
public: true,
tracks : [],
type: 'playlist',
uri: null
})
break
}
let sp = plugins.spotify.sp
let playlist = await 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 = await sp.getPlaylistTracks(list_id, { offset, limit })
playlist.tracks = playlistTracks.body
tracklist = tracklist.concat(playlist.tracks.items)
}
tracklist.forEach((item:any, i:number) => {
tracklist[i] = item.track
tracklist[i].selected = false
});
playlist.tracks = tracklist
res.send(playlist)
break
}
default: {
const releaseAPI = await dz.api[`get_${list_type}`](list_id)
let releaseTracksAPI = await dz.api[`get_${list_type}_tracks`](list_id)

View File

@@ -0,0 +1,34 @@
import { ApiHandler } from '../../../types'
import { plugins } from '../../../main'
const path: ApiHandler['path'] = '/getUserSpotifyPlaylists'
const handler: ApiHandler['handler'] = async (req, res) => {
let data
if (plugins.spotify.enabled){
let sp = plugins.spotify.sp
const username = req.query.spotifyUser
data = []
let playlists = await 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 = await sp.getUserPlaylists(username, { offset, limit })
playlists = newPlaylists.body
playlistList = playlistList.concat(playlists.items)
}
playlistList.forEach((playlist: any) => {
data.push(plugins.spotify._convertPlaylistStructure(playlist))
})
} else {
data = { error: 'spotifyNotEnabled'}
}
res.send(data)
}
const apiHandler: ApiHandler = { path, handler }
export default apiHandler

View File

@@ -10,6 +10,7 @@ import getUserTracks from './getUserTracks'
import getUserAlbums from './getUserAlbums'
import getUserArtists from './getUserArtists'
import getUserPlaylists from './getUserPlaylists'
import getUserSpotifyPlaylists from './getUserSpotifyPlaylists'
import getUserFavorites from './getUserFavorites'
import getQueue from './getQueue'
@@ -26,6 +27,7 @@ export default [
getUserAlbums,
getUserArtists,
getUserPlaylists,
getUserSpotifyPlaylists,
getUserFavorites,
getQueue
]

View File

@@ -5,6 +5,7 @@ import cancelAllDownloads from './cancelAllDownloads'
import removeFinishedDownloads from './removeFinishedDownloads'
import removeFromQueue from './removeFromQueue'
import logout from './logout'
import saveSettings from './saveSettings'
export default [
loginArl,
@@ -13,5 +14,6 @@ export default [
cancelAllDownloads,
removeFinishedDownloads,
removeFromQueue,
logout
logout,
saveSettings
]

View File

@@ -0,0 +1,21 @@
import { ApiHandler } from '../../../types'
import { saveSettings, listener } from '../../../main'
import { Settings, SpotifySettings } from '../../../types'
const path = '/saveSettings'
export interface SaveSettingsData {
settings: Settings
spotifySettings: SpotifySettings
}
const handler: ApiHandler['handler'] = async (req, res) => {
const { settings, spotifySettings }: SaveSettingsData = req.query
saveSettings(settings, spotifySettings)
listener.send('updateSettings', { settings, spotifySettings })
res.send({ result: true })
}
const apiHandler = { path, handler }
export default apiHandler

View File

@@ -12,7 +12,7 @@ export interface SaveSettingsData {
const cb = (data: SaveSettingsData, _: any, __: WsServer) => {
const { settings, spotifySettings } = data
saveSettings(settings)
saveSettings(settings, spotifySettings)
consoleInfo('Settings saved')
listener.send('updateSettings', { settings, spotifySettings })
}