2020-06-24 22:54:36 +02:00
|
|
|
import Vue from 'vue'
|
2020-06-19 21:53:32 +02:00
|
|
|
|
2021-05-05 20:59:27 +02:00
|
|
|
import '@/plugins/composition-api'
|
|
|
|
|
2020-11-07 19:00:34 +01:00
|
|
|
import '@/styles/vendor/material-icons.css'
|
|
|
|
import '@/styles/vendor/OpenSans.css'
|
2020-11-02 12:25:08 +01:00
|
|
|
|
2020-11-10 20:14:03 +01:00
|
|
|
import '@/styles/css/tailwind.css'
|
|
|
|
|
2020-11-10 19:48:02 +01:00
|
|
|
import '@/styles/css/normalize.css'
|
|
|
|
import '@/styles/css/base.css'
|
2020-10-10 20:03:19 +02:00
|
|
|
import '@/styles/css/components.css'
|
2020-11-02 12:25:08 +01:00
|
|
|
import '@/styles/css/helpers.css'
|
2022-02-05 14:09:06 +01:00
|
|
|
import '@/styles/css/icons.css'
|
2022-02-09 14:09:39 +01:00
|
|
|
import '@/styles/css/tables.css'
|
2020-11-07 19:00:34 +01:00
|
|
|
import '@/styles/css/typography.css'
|
2020-10-10 20:03:19 +02:00
|
|
|
|
2020-11-10 20:14:03 +01:00
|
|
|
|
2020-09-25 20:43:23 +02:00
|
|
|
import App from '@/App.vue'
|
2020-07-17 00:11:28 +02:00
|
|
|
import i18n from '@/plugins/i18n'
|
2020-08-23 00:39:31 +02:00
|
|
|
import router from '@/router'
|
|
|
|
import store from '@/store'
|
2020-06-19 21:53:32 +02:00
|
|
|
|
2020-07-17 00:11:28 +02:00
|
|
|
import { socket } from '@/utils/socket'
|
2021-05-28 15:09:55 +02:00
|
|
|
import { fetchData, postToServer } from '@/utils/api'
|
2020-07-17 00:11:28 +02:00
|
|
|
import { toast } from '@/utils/toasts'
|
2020-08-25 15:29:11 +02:00
|
|
|
import { isValidURL } from '@/utils/utils'
|
2020-09-26 17:53:25 +02:00
|
|
|
import { sendAddToQueue } from '@/utils/downloads'
|
2021-08-11 15:23:41 +02:00
|
|
|
import { SPOTIFY_STATUS } from '@/constants'
|
2020-08-25 15:29:11 +02:00
|
|
|
|
2021-10-05 12:14:59 +02:00
|
|
|
/* ===== Random utils ===== */
|
|
|
|
|
|
|
|
/* eslint-disable no-extend-native */
|
|
|
|
String.prototype.capitalize = function () {
|
|
|
|
return this.charAt(0).toUpperCase() + this.slice(1)
|
|
|
|
}
|
|
|
|
|
2020-05-15 22:21:31 +02:00
|
|
|
/* ===== App initialization ===== */
|
2021-03-01 21:58:43 +01:00
|
|
|
async function startApp() {
|
2022-02-04 15:39:40 +01:00
|
|
|
document.getElementById('missingBundle').remove()
|
2020-07-17 00:11:28 +02:00
|
|
|
new Vue({
|
2020-08-23 00:39:31 +02:00
|
|
|
store,
|
2020-07-28 21:39:44 +02:00
|
|
|
router,
|
2020-07-17 00:11:28 +02:00
|
|
|
i18n,
|
2020-06-29 20:23:56 +02:00
|
|
|
render: h => h(App)
|
|
|
|
}).$mount('#app')
|
2021-03-01 21:22:32 +01:00
|
|
|
|
2021-03-01 21:58:43 +01:00
|
|
|
const connectResponse = await (await fetch('connect')).json()
|
2021-08-11 15:23:41 +02:00
|
|
|
const spotifyStatus = connectResponse.spotifyEnabled ? SPOTIFY_STATUS.ENABLED : SPOTIFY_STATUS.DISABLED
|
|
|
|
|
|
|
|
if (!connectResponse.deezerAvailable) {
|
|
|
|
document.getElementById('deezer_not_available').classList.remove('hide')
|
|
|
|
}
|
2021-03-01 21:58:43 +01:00
|
|
|
|
2021-05-20 21:22:27 +02:00
|
|
|
store.dispatch('setAppInfo', connectResponse.update).catch(console.error)
|
2021-08-11 15:23:41 +02:00
|
|
|
store.dispatch('setSpotifyStatus', spotifyStatus).catch(console.error)
|
2021-05-20 21:22:27 +02:00
|
|
|
|
2021-05-06 11:51:33 +02:00
|
|
|
let arl = localStorage.getItem('arl')
|
2021-05-28 15:09:55 +02:00
|
|
|
const accessToken = localStorage.getItem('accessToken')
|
2021-03-01 21:58:43 +01:00
|
|
|
|
|
|
|
if (connectResponse.autologin) {
|
2021-03-01 23:09:14 +01:00
|
|
|
console.info('Autologin')
|
2021-03-01 21:58:43 +01:00
|
|
|
const accountNum = localStorage.getItem('accountNum')
|
|
|
|
|
2021-05-28 15:09:55 +02:00
|
|
|
async function login(arl, accountNum) {
|
|
|
|
toast(i18n.t('toasts.loggingIn'), 'loading', false, 'login-toast')
|
2021-03-01 21:58:43 +01:00
|
|
|
arl = arl.trim()
|
|
|
|
let result
|
|
|
|
|
|
|
|
if (accountNum !== 0) {
|
2022-01-12 22:13:52 +01:00
|
|
|
result = await postToServer('loginArl', { arl, force: true, child: accountNum || 0 })
|
2021-03-01 21:58:43 +01:00
|
|
|
} else {
|
2022-01-12 22:13:52 +01:00
|
|
|
result = await postToServer('loginArl', { arl })
|
2021-03-01 21:22:32 +01:00
|
|
|
}
|
2021-03-01 21:58:43 +01:00
|
|
|
|
2021-05-28 15:09:55 +02:00
|
|
|
return result
|
|
|
|
}
|
|
|
|
|
|
|
|
if (arl) {
|
|
|
|
let result = await login(arl, accountNum)
|
|
|
|
if (result.status === 0 && accessToken) {
|
|
|
|
const { arl: newArl } = await postToServer('loginWithCredentials', { accessToken })
|
|
|
|
if (newArl && newArl !== arl) {
|
|
|
|
arl = newArl
|
|
|
|
store.dispatch('setARL', { arl })
|
|
|
|
}
|
|
|
|
result = await login(newArl, accountNum)
|
|
|
|
}
|
2021-03-01 22:32:35 +01:00
|
|
|
loggedIn(result)
|
2021-03-01 21:58:43 +01:00
|
|
|
}
|
2021-05-06 11:51:33 +02:00
|
|
|
} else {
|
|
|
|
loggedIn({ status: 3, user: connectResponse.currentUser, arl })
|
2021-03-01 21:58:43 +01:00
|
|
|
}
|
2022-01-13 01:05:41 +01:00
|
|
|
|
|
|
|
if (connectResponse.checkForUpdates) {
|
|
|
|
toast(i18n.t('toasts.checkingUpdates'), 'loading', false, 'updates-toast')
|
|
|
|
const updates = await fetchData('checkForUpdates')
|
|
|
|
store.dispatch('setUpdateInfo', updates).catch(console.error)
|
|
|
|
if (updates.updateAvailable) {
|
2022-02-09 13:02:55 +01:00
|
|
|
toast(i18n.t('toasts.updateAvailable'), 'browser_updated', true, 'updates-toast')
|
2022-01-13 01:05:41 +01:00
|
|
|
} else {
|
|
|
|
toast(i18n.t('toasts.noUpdateAvailable'), 'done', true, 'updates-toast')
|
|
|
|
}
|
|
|
|
}
|
2020-06-24 22:54:36 +02:00
|
|
|
}
|
|
|
|
|
2020-05-23 00:15:29 +02:00
|
|
|
function initClient() {
|
2020-09-22 22:40:41 +02:00
|
|
|
store.dispatch('setClientMode', true)
|
2020-09-24 18:33:56 +02:00
|
|
|
setClientModeKeyBindings()
|
2020-05-19 18:30:18 +02:00
|
|
|
}
|
2020-05-15 22:21:31 +02:00
|
|
|
|
|
|
|
document.addEventListener('DOMContentLoaded', startApp)
|
2021-05-28 15:09:55 +02:00
|
|
|
if (window.api) {
|
2021-05-28 12:39:00 +02:00
|
|
|
initClient()
|
|
|
|
}
|
2020-05-15 22:21:31 +02:00
|
|
|
|
2020-08-25 15:29:11 +02:00
|
|
|
/* ===== Global shortcuts ===== */
|
|
|
|
|
|
|
|
document.addEventListener('paste', pasteEvent => {
|
2020-09-26 17:53:25 +02:00
|
|
|
if (pasteEvent.target.localName === 'input') return
|
|
|
|
|
|
|
|
let pastedText = pasteEvent.clipboardData.getData('Text')
|
2020-09-17 23:55:57 +02:00
|
|
|
|
2020-09-26 17:53:25 +02:00
|
|
|
if (isValidURL(pastedText)) {
|
|
|
|
if (router.currentRoute.name === 'Link Analyzer') {
|
|
|
|
socket.emit('analyzeLink', pastedText)
|
2020-09-17 22:43:52 +02:00
|
|
|
} else {
|
2021-05-23 18:46:03 +02:00
|
|
|
if (pastedText.includes('\n')) pastedText = pastedText.replace(/\n/g, ';')
|
2020-09-26 17:53:25 +02:00
|
|
|
sendAddToQueue(pastedText)
|
2020-08-25 15:29:11 +02:00
|
|
|
}
|
2020-09-26 17:53:25 +02:00
|
|
|
} else {
|
2021-05-23 18:46:03 +02:00
|
|
|
const searchbar = document.querySelector('#searchbar')
|
2020-09-26 17:53:25 +02:00
|
|
|
searchbar.select()
|
|
|
|
searchbar.setSelectionRange(0, 99999)
|
2020-09-23 15:44:43 +02:00
|
|
|
}
|
|
|
|
})
|
|
|
|
|
2020-09-24 18:33:56 +02:00
|
|
|
/**
|
|
|
|
* Sets up key bindings that already work in the browser (server mode)
|
|
|
|
*/
|
|
|
|
function setClientModeKeyBindings() {
|
|
|
|
document.addEventListener('keyup', keyEvent => {
|
|
|
|
// ALT + left
|
|
|
|
if (keyEvent.altKey && keyEvent.key === 'ArrowLeft') {
|
|
|
|
router.back()
|
|
|
|
}
|
|
|
|
|
|
|
|
// ALT + right
|
|
|
|
if (keyEvent.altKey && keyEvent.key === 'ArrowRight') {
|
|
|
|
router.forward()
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2020-04-19 22:02:06 +02:00
|
|
|
/* ===== Socketio listeners ===== */
|
|
|
|
|
|
|
|
// Debug messages for socketio
|
2021-03-01 21:22:32 +01:00
|
|
|
socket.on('message', function (msg) {
|
2020-04-19 22:02:06 +02:00
|
|
|
console.log(msg)
|
|
|
|
})
|
|
|
|
|
2021-03-01 21:22:32 +01:00
|
|
|
function loggedIn(data) {
|
2020-09-17 22:43:52 +02:00
|
|
|
const { status, user } = data
|
|
|
|
|
|
|
|
switch (status) {
|
2020-04-19 22:02:06 +02:00
|
|
|
case 1:
|
|
|
|
case 3:
|
2020-09-17 22:43:52 +02:00
|
|
|
// Login ok
|
2020-07-21 11:09:47 +02:00
|
|
|
toast(i18n.t('toasts.loggedIn'), 'done', true, 'login-toast')
|
2020-08-22 23:34:16 +02:00
|
|
|
|
2020-09-17 22:43:52 +02:00
|
|
|
store.dispatch('login', data)
|
2020-04-19 22:02:06 +02:00
|
|
|
break
|
|
|
|
case 2:
|
2020-09-17 22:43:52 +02:00
|
|
|
// Already logged in
|
2020-07-21 11:09:47 +02:00
|
|
|
toast(i18n.t('toasts.alreadyLogged'), 'done', true, 'login-toast')
|
2020-08-22 23:34:16 +02:00
|
|
|
|
2020-09-17 22:43:52 +02:00
|
|
|
store.dispatch('setUser', user)
|
2020-04-19 22:02:06 +02:00
|
|
|
break
|
|
|
|
case 0:
|
2020-09-17 22:43:52 +02:00
|
|
|
// Login failed
|
2020-07-21 11:09:47 +02:00
|
|
|
toast(i18n.t('toasts.loginFailed'), 'close', true, 'login-toast')
|
2020-09-17 22:43:52 +02:00
|
|
|
|
|
|
|
store.dispatch('removeARL')
|
2020-04-19 22:02:06 +02:00
|
|
|
break
|
2020-09-20 12:32:53 +02:00
|
|
|
case -1:
|
|
|
|
toast(i18n.t('toasts.deezerNotAvailable'), 'close', true, 'login-toast')
|
2021-05-23 18:46:03 +02:00
|
|
|
|
2020-09-23 18:15:59 +02:00
|
|
|
// TODO
|
|
|
|
// $('#open_login_prompt').show()
|
|
|
|
// document.getElementById('logged_in_info').classList.add('hide')
|
|
|
|
// $('#settings_username').text('Not Logged')
|
|
|
|
// $('#settings_picture').attr('src', `https://e-cdns-images.dzcdn.net/images/user/125x125-000000-80-0-0.jpg`)
|
|
|
|
// document.getElementById('home_not_logged_in').classList.remove('hide')
|
2020-04-19 22:02:06 +02:00
|
|
|
}
|
2021-02-25 22:26:05 +01:00
|
|
|
}
|
|
|
|
|
2021-03-01 21:22:32 +01:00
|
|
|
socket.on('restoringQueue', function () {
|
2020-08-16 01:34:55 +02:00
|
|
|
toast(i18n.t('toasts.restoringQueue'), 'loading', false, 'restoring_queue')
|
|
|
|
})
|
|
|
|
|
2021-03-01 21:22:32 +01:00
|
|
|
socket.on('cancellingCurrentItem', function (uuid) {
|
2020-07-21 11:09:47 +02:00
|
|
|
toast(i18n.t('toasts.cancellingCurrentItem'), 'loading', false, 'cancelling_' + uuid)
|
2020-06-05 10:46:22 +02:00
|
|
|
})
|
|
|
|
|
2021-03-01 21:22:32 +01:00
|
|
|
socket.on('currentItemCancelled', function (uuid) {
|
2020-07-21 11:09:47 +02:00
|
|
|
toast(i18n.t('toasts.currentItemCancelled'), 'done', true, 'cancelling_' + uuid)
|
2020-06-05 10:46:22 +02:00
|
|
|
})
|
|
|
|
|
2021-03-01 21:22:32 +01:00
|
|
|
socket.on('startAddingArtist', function (data) {
|
2020-09-17 22:43:52 +02:00
|
|
|
toast(i18n.t('toasts.startAddingArtist', { artist: data.name }), 'loading', false, 'artist_' + data.id)
|
2020-06-05 10:46:22 +02:00
|
|
|
})
|
|
|
|
|
2021-03-01 21:22:32 +01:00
|
|
|
socket.on('finishAddingArtist', function (data) {
|
2020-09-17 22:43:52 +02:00
|
|
|
toast(i18n.t('toasts.finishAddingArtist', { artist: data.name }), 'done', true, 'artist_' + data.id)
|
2020-06-05 10:46:22 +02:00
|
|
|
})
|
|
|
|
|
2021-03-01 21:22:32 +01:00
|
|
|
socket.on('startConvertingSpotifyPlaylist', function (id) {
|
2020-07-21 11:09:47 +02:00
|
|
|
toast(i18n.t('toasts.startConvertingSpotifyPlaylist'), 'loading', false, 'spotifyplaylist_' + id)
|
2020-06-05 10:46:22 +02:00
|
|
|
})
|
|
|
|
|
2021-03-01 21:22:32 +01:00
|
|
|
socket.on('finishConvertingSpotifyPlaylist', function (id) {
|
2020-07-21 11:09:47 +02:00
|
|
|
toast(i18n.t('toasts.finishConvertingSpotifyPlaylist'), 'done', true, 'spotifyplaylist_' + id)
|
2020-06-05 10:46:22 +02:00
|
|
|
})
|
|
|
|
|
2021-03-01 21:22:32 +01:00
|
|
|
socket.on('errorMessage', function (error) {
|
2020-06-05 10:46:22 +02:00
|
|
|
toast(error, 'error')
|
|
|
|
})
|
|
|
|
|
2021-03-01 21:22:32 +01:00
|
|
|
socket.on('queueError', function (queueItem) {
|
2020-09-17 23:55:57 +02:00
|
|
|
if (queueItem.errid) {
|
2020-11-02 12:25:08 +01:00
|
|
|
toast(queueItem.link + ' - ' + i18n.t(`errors.ids.${queueItem.errid}`), 'error')
|
2020-09-17 23:55:57 +02:00
|
|
|
} else {
|
2020-11-02 12:25:08 +01:00
|
|
|
toast(queueItem.link + ' - ' + queueItem.error, 'error')
|
2020-09-17 23:55:57 +02:00
|
|
|
}
|
2020-07-23 16:43:20 +02:00
|
|
|
})
|
|
|
|
|
2021-03-01 21:22:32 +01:00
|
|
|
socket.on('alreadyInQueue', function (data) {
|
2020-09-17 22:43:52 +02:00
|
|
|
toast(i18n.t('toasts.alreadyInQueue', { item: data.title }), 'playlist_add_check')
|
2020-06-05 10:46:22 +02:00
|
|
|
})
|
2020-07-29 22:24:44 +02:00
|
|
|
|
2021-05-28 15:09:55 +02:00
|
|
|
socket.on('loginNeededToDownload', function () {
|
2020-07-29 22:24:44 +02:00
|
|
|
toast(i18n.t('toasts.loginNeededToDownload'), 'report')
|
|
|
|
})
|
2020-10-14 23:29:24 +02:00
|
|
|
|
2021-03-01 21:22:32 +01:00
|
|
|
socket.on('startGeneratingItems', function (data) {
|
2020-10-14 23:29:24 +02:00
|
|
|
toast(i18n.t('toasts.startGeneratingItems', { n: data.total }), 'loading', false, 'batch_' + data.uuid)
|
|
|
|
})
|
|
|
|
|
2021-03-01 21:22:32 +01:00
|
|
|
socket.on('finishGeneratingItems', function (data) {
|
2020-10-14 23:29:24 +02:00
|
|
|
toast(i18n.t('toasts.finishGeneratingItems', { n: data.total }), 'done', true, 'batch_' + data.uuid)
|
|
|
|
})
|