mirror of
https://github.com/lnbits/lnbits-legend.git
synced 2025-02-25 23:21:21 +01:00
412 lines
12 KiB
JavaScript
412 lines
12 KiB
JavaScript
/* globals Quasar, Vue, _, VueQrcode, windowMixin, LNbits, LOCALE */
|
|
|
|
Vue.component(VueQrcode.name, VueQrcode)
|
|
|
|
var mapJukebox = obj => {
|
|
if (obj.sp_device) {
|
|
obj._data = _.clone(obj)
|
|
|
|
obj.sp_id = obj._data.id
|
|
obj.device = obj._data.sp_device.split('-')[0]
|
|
playlists = obj._data.sp_playlists.split(',')
|
|
var i
|
|
playlistsar = []
|
|
for (i = 0; i < playlists.length; i++) {
|
|
playlistsar.push(playlists[i].split('-')[0])
|
|
}
|
|
obj.playlist = playlistsar.join()
|
|
console.log(obj)
|
|
return obj
|
|
} else {
|
|
return
|
|
}
|
|
}
|
|
|
|
new Vue({
|
|
el: '#vue',
|
|
mixins: [windowMixin],
|
|
data() {
|
|
return {
|
|
JukeboxTable: {
|
|
columns: [
|
|
{
|
|
name: 'title',
|
|
align: 'left',
|
|
label: 'Title',
|
|
field: 'title'
|
|
},
|
|
{
|
|
name: 'device',
|
|
align: 'left',
|
|
label: 'Device',
|
|
field: 'device'
|
|
},
|
|
{
|
|
name: 'playlist',
|
|
align: 'left',
|
|
label: 'Playlist',
|
|
field: 'playlist'
|
|
},
|
|
{
|
|
name: 'price',
|
|
align: 'left',
|
|
label: 'Price',
|
|
field: 'price'
|
|
}
|
|
],
|
|
pagination: {
|
|
rowsPerPage: 10
|
|
}
|
|
},
|
|
isPwd: true,
|
|
tokenFetched: true,
|
|
devices: [],
|
|
filter: '',
|
|
jukebox: {},
|
|
playlists: [],
|
|
JukeboxLinks: [],
|
|
step: 1,
|
|
locationcbPath: '',
|
|
locationcb: '',
|
|
jukeboxDialog: {
|
|
show: false,
|
|
data: {}
|
|
},
|
|
spotifyDialog: false,
|
|
qrCodeDialog: {
|
|
show: false,
|
|
data: null
|
|
}
|
|
}
|
|
},
|
|
computed: {},
|
|
methods: {
|
|
openQrCodeDialog: function (linkId) {
|
|
var link = _.findWhere(this.JukeboxLinks, {id: linkId})
|
|
|
|
this.qrCodeDialog.data = _.clone(link)
|
|
|
|
this.qrCodeDialog.data.url =
|
|
window.location.protocol + '//' + window.location.host
|
|
this.qrCodeDialog.show = true
|
|
},
|
|
getJukeboxes() {
|
|
self = this
|
|
|
|
LNbits.api
|
|
.request(
|
|
'GET',
|
|
'/jukebox/api/v1/jukebox',
|
|
self.g.user.wallets[0].adminkey
|
|
)
|
|
.then(function (response) {
|
|
self.JukeboxLinks = response.data.map(function (obj) {
|
|
return mapJukebox(obj)
|
|
})
|
|
console.log(self.JukeboxLinks)
|
|
})
|
|
},
|
|
deleteJukebox(juke_id) {
|
|
self = this
|
|
LNbits.utils
|
|
.confirmDialog('Are you sure you want to delete this Jukebox?')
|
|
.onOk(function () {
|
|
LNbits.api
|
|
.request(
|
|
'DELETE',
|
|
'/jukebox/api/v1/jukebox/' + juke_id,
|
|
self.g.user.wallets[0].adminkey
|
|
)
|
|
.then(function (response) {
|
|
self.JukeboxLinks = _.reject(self.JukeboxLinks, function (obj) {
|
|
return obj.id === juke_id
|
|
})
|
|
})
|
|
|
|
.catch(err => {
|
|
LNbits.utils.notifyApiError(err)
|
|
})
|
|
})
|
|
},
|
|
updateJukebox: function (linkId) {
|
|
self = this
|
|
var link = _.findWhere(self.JukeboxLinks, {id: linkId})
|
|
self.jukeboxDialog.data = _.clone(link._data)
|
|
|
|
self.refreshDevices()
|
|
self.refreshPlaylists()
|
|
|
|
self.step = 4
|
|
self.jukeboxDialog.data.sp_device = []
|
|
self.jukeboxDialog.data.sp_playlists = []
|
|
self.jukeboxDialog.data.sp_id = self.jukeboxDialog.data.id
|
|
self.jukeboxDialog.data.price = String(self.jukeboxDialog.data.price)
|
|
self.jukeboxDialog.show = true
|
|
},
|
|
closeFormDialog() {
|
|
this.jukeboxDialog.data = {}
|
|
this.jukeboxDialog.show = false
|
|
this.step = 1
|
|
},
|
|
submitSpotifyKeys() {
|
|
self = this
|
|
self.jukeboxDialog.data.user = self.g.user.id
|
|
|
|
LNbits.api
|
|
.request(
|
|
'POST',
|
|
'/jukebox/api/v1/jukebox/',
|
|
self.g.user.wallets[0].adminkey,
|
|
self.jukeboxDialog.data
|
|
)
|
|
.then(response => {
|
|
if (response.data) {
|
|
self.jukeboxDialog.data.sp_id = response.data.id
|
|
self.step = 3
|
|
}
|
|
})
|
|
.catch(err => {
|
|
LNbits.utils.notifyApiError(err)
|
|
})
|
|
},
|
|
authAccess() {
|
|
self = this
|
|
self.requestAuthorization()
|
|
self.getSpotifyTokens()
|
|
self.$q.notify({
|
|
spinner: true,
|
|
message: 'Processing',
|
|
timeout: 10000
|
|
})
|
|
},
|
|
getSpotifyTokens() {
|
|
self = this
|
|
var counter = 0
|
|
var timerId = setInterval(function () {
|
|
counter++
|
|
if (!self.jukeboxDialog.data.sp_user) {
|
|
clearInterval(timerId)
|
|
}
|
|
LNbits.api
|
|
.request(
|
|
'GET',
|
|
'/jukebox/api/v1/jukebox/' + self.jukeboxDialog.data.sp_id,
|
|
self.g.user.wallets[0].adminkey
|
|
)
|
|
.then(response => {
|
|
if (response.data.sp_access_token) {
|
|
self.fetchAccessToken(response.data.sp_access_token)
|
|
if (self.jukeboxDialog.data.sp_access_token) {
|
|
self.refreshPlaylists()
|
|
self.refreshDevices()
|
|
setTimeout(function () {
|
|
if (self.devices.length < 1 || self.playlists.length < 1) {
|
|
self.$q.notify({
|
|
spinner: true,
|
|
color: 'red',
|
|
message:
|
|
'Error! Make sure Spotify is open on the device you wish to use, has playlists, and is playing something',
|
|
timeout: 10000
|
|
})
|
|
LNbits.api
|
|
.request(
|
|
'DELETE',
|
|
'/jukebox/api/v1/jukebox/' + response.data.id,
|
|
self.g.user.wallets[0].adminkey
|
|
)
|
|
.then(function (response) {
|
|
self.getJukeboxes()
|
|
})
|
|
.catch(err => {
|
|
LNbits.utils.notifyApiError(err)
|
|
})
|
|
clearInterval(timerId)
|
|
self.closeFormDialog()
|
|
} else {
|
|
self.step = 4
|
|
clearInterval(timerId)
|
|
}
|
|
}, 2000)
|
|
}
|
|
}
|
|
})
|
|
.catch(err => {
|
|
LNbits.utils.notifyApiError(err)
|
|
})
|
|
}, 3000)
|
|
},
|
|
requestAuthorization() {
|
|
self = this
|
|
var url = 'https://accounts.spotify.com/authorize'
|
|
url += '?client_id=' + self.jukeboxDialog.data.sp_user
|
|
url += '&response_type=code'
|
|
url +=
|
|
'&redirect_uri=' +
|
|
encodeURI(self.locationcbPath + self.jukeboxDialog.data.sp_id)
|
|
url += '&show_dialog=true'
|
|
url +=
|
|
'&scope=user-read-private user-read-email user-modify-playback-state user-read-playback-position user-library-read streaming user-read-playback-state user-read-recently-played playlist-read-private'
|
|
|
|
window.open(url)
|
|
},
|
|
openNewDialog() {
|
|
this.jukeboxDialog.show = true
|
|
this.jukeboxDialog.data = {}
|
|
},
|
|
createJukebox() {
|
|
self = this
|
|
self.jukeboxDialog.data.sp_playlists = self.jukeboxDialog.data.sp_playlists.join()
|
|
self.updateDB()
|
|
self.jukeboxDialog.show = false
|
|
self.getJukeboxes()
|
|
},
|
|
updateDB() {
|
|
self = this
|
|
LNbits.api
|
|
.request(
|
|
'PUT',
|
|
'/jukebox/api/v1/jukebox/' + self.jukeboxDialog.data.sp_id,
|
|
self.g.user.wallets[0].adminkey,
|
|
self.jukeboxDialog.data
|
|
)
|
|
.then(function (response) {
|
|
if (
|
|
self.jukeboxDialog.data.sp_playlists &&
|
|
self.jukeboxDialog.data.sp_devices
|
|
) {
|
|
self.getJukeboxes()
|
|
// self.JukeboxLinks.push(mapJukebox(response.data))
|
|
}
|
|
})
|
|
},
|
|
playlistApi(method, url, body) {
|
|
self = this
|
|
let xhr = new XMLHttpRequest()
|
|
xhr.open(method, url, true)
|
|
xhr.setRequestHeader('Content-Type', 'application/json')
|
|
xhr.setRequestHeader(
|
|
'Authorization',
|
|
'Bearer ' + this.jukeboxDialog.data.sp_access_token
|
|
)
|
|
xhr.send(body)
|
|
xhr.onload = function () {
|
|
if (xhr.status == 401) {
|
|
self.refreshAccessToken()
|
|
self.playlistApi(
|
|
'GET',
|
|
'https://api.spotify.com/v1/me/playlists',
|
|
null
|
|
)
|
|
}
|
|
let responseObj = JSON.parse(xhr.response)
|
|
self.jukeboxDialog.data.playlists = null
|
|
self.playlists = []
|
|
self.jukeboxDialog.data.playlists = []
|
|
var i
|
|
for (i = 0; i < responseObj.items.length; i++) {
|
|
self.playlists.push(
|
|
responseObj.items[i].name + '-' + responseObj.items[i].id
|
|
)
|
|
}
|
|
}
|
|
},
|
|
refreshPlaylists() {
|
|
self = this
|
|
self.playlistApi('GET', 'https://api.spotify.com/v1/me/playlists', null)
|
|
},
|
|
deviceApi(method, url, body) {
|
|
self = this
|
|
let xhr = new XMLHttpRequest()
|
|
xhr.open(method, url, true)
|
|
xhr.setRequestHeader('Content-Type', 'application/json')
|
|
xhr.setRequestHeader(
|
|
'Authorization',
|
|
'Bearer ' + this.jukeboxDialog.data.sp_access_token
|
|
)
|
|
xhr.send(body)
|
|
xhr.onload = function () {
|
|
if (xhr.status == 401) {
|
|
self.refreshAccessToken()
|
|
self.deviceApi(
|
|
'GET',
|
|
'https://api.spotify.com/v1/me/player/devices',
|
|
null
|
|
)
|
|
}
|
|
let responseObj = JSON.parse(xhr.response)
|
|
self.jukeboxDialog.data.devices = []
|
|
|
|
self.devices = []
|
|
var i
|
|
for (i = 0; i < responseObj.devices.length; i++) {
|
|
self.devices.push(
|
|
responseObj.devices[i].name + '-' + responseObj.devices[i].id
|
|
)
|
|
}
|
|
}
|
|
},
|
|
refreshDevices() {
|
|
self = this
|
|
self.deviceApi(
|
|
'GET',
|
|
'https://api.spotify.com/v1/me/player/devices',
|
|
null
|
|
)
|
|
},
|
|
fetchAccessToken(code) {
|
|
self = this
|
|
let body = 'grant_type=authorization_code'
|
|
body += '&code=' + code
|
|
body +=
|
|
'&redirect_uri=' +
|
|
encodeURI(self.locationcbPath + self.jukeboxDialog.data.sp_id)
|
|
|
|
self.callAuthorizationApi(body)
|
|
},
|
|
refreshAccessToken() {
|
|
self = this
|
|
let body = 'grant_type=refresh_token'
|
|
body += '&refresh_token=' + self.jukeboxDialog.data.sp_refresh_token
|
|
body += '&client_id=' + self.jukeboxDialog.data.sp_user
|
|
self.callAuthorizationApi(body)
|
|
},
|
|
callAuthorizationApi(body) {
|
|
self = this
|
|
let xhr = new XMLHttpRequest()
|
|
xhr.open('POST', 'https://accounts.spotify.com/api/token', true)
|
|
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
|
|
xhr.setRequestHeader(
|
|
'Authorization',
|
|
'Basic ' +
|
|
btoa(
|
|
self.jukeboxDialog.data.sp_user +
|
|
':' +
|
|
self.jukeboxDialog.data.sp_secret
|
|
)
|
|
)
|
|
xhr.send(body)
|
|
xhr.onload = function () {
|
|
let responseObj = JSON.parse(xhr.response)
|
|
if (responseObj.access_token) {
|
|
self.jukeboxDialog.data.sp_access_token = responseObj.access_token
|
|
self.jukeboxDialog.data.sp_refresh_token = responseObj.refresh_token
|
|
self.updateDB()
|
|
}
|
|
}
|
|
}
|
|
},
|
|
created() {
|
|
var getJukeboxes = this.getJukeboxes
|
|
getJukeboxes()
|
|
this.selectedWallet = this.g.user.wallets[0]
|
|
this.locationcbPath = String(
|
|
[
|
|
window.location.protocol,
|
|
'//',
|
|
window.location.host,
|
|
'/jukebox/api/v1/jukebox/spotify/cb/'
|
|
].join('')
|
|
)
|
|
this.locationcb = this.locationcbPath
|
|
}
|
|
})
|