mirror of
https://github.com/owntone/owntone-server.git
synced 2025-03-31 01:33:44 -04:00
commit
17ba3c6e03
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -731,6 +731,8 @@ logout(void)
|
|||||||
memset(&ctx->status, 0, sizeof(ctx->status));
|
memset(&ctx->status, 0, sizeof(ctx->status));
|
||||||
|
|
||||||
pthread_mutex_unlock(&spotify_ctx_lock);
|
pthread_mutex_unlock(&spotify_ctx_lock);
|
||||||
|
|
||||||
|
listener_notify(LISTENER_SPOTIFY);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
24402
web-src/package-lock.json
generated
24402
web-src/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "owntone-web",
|
"name": "owntone-web",
|
||||||
"version": "1.1.0",
|
"version": "1.1.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "OwnTone web interface",
|
"description": "OwnTone web interface",
|
||||||
"author": "chme <christian.meffert@googlemail.com>",
|
"author": "chme <christian.meffert@googlemail.com>",
|
||||||
@ -11,7 +11,7 @@
|
|||||||
"dev": "vue-cli-service serve"
|
"dev": "vue-cli-service serve"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^0.21.1",
|
"axios": "^0.24.0",
|
||||||
"bulma": "^0.9.3",
|
"bulma": "^0.9.3",
|
||||||
"bulma-switch": "^2.0.0",
|
"bulma-switch": "^2.0.0",
|
||||||
"core-js": "^3.15.2",
|
"core-js": "^3.15.2",
|
||||||
@ -20,7 +20,7 @@
|
|||||||
"moment-duration-format": "^2.3.2",
|
"moment-duration-format": "^2.3.2",
|
||||||
"npm": "^7.19.1",
|
"npm": "^7.19.1",
|
||||||
"reconnectingwebsocket": "^1.0.0",
|
"reconnectingwebsocket": "^1.0.0",
|
||||||
"spotify-web-api-js": "^1.5.1",
|
"spotify-web-api-js": "^1.5.2",
|
||||||
"string-to-color": "^2.2.2",
|
"string-to-color": "^2.2.2",
|
||||||
"v-click-outside": "^3.1.2",
|
"v-click-outside": "^3.1.2",
|
||||||
"vue": "^2.6.14",
|
"vue": "^2.6.14",
|
||||||
@ -28,17 +28,17 @@
|
|||||||
"vue-observe-visibility": "^1.0.0",
|
"vue-observe-visibility": "^1.0.0",
|
||||||
"vue-progressbar": "^0.7.5",
|
"vue-progressbar": "^0.7.5",
|
||||||
"vue-range-slider": "^0.6.0",
|
"vue-range-slider": "^0.6.0",
|
||||||
"vue-router": "^3.5.2",
|
"vue-router": "^3.5.3",
|
||||||
"vue-scrollto": "^2.20.0",
|
"vue-scrollto": "^2.20.0",
|
||||||
"vue-tiny-lazyload-img": "^0.1.0",
|
"vue-tiny-lazyload-img": "^0.1.0",
|
||||||
"vuedraggable": "^2.24.3",
|
"vuedraggable": "^2.24.3",
|
||||||
"vuex": "^3.6.2"
|
"vuex": "^3.6.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@vue/cli-plugin-babel": "^4.5.13",
|
"@vue/cli-plugin-babel": "^4.5.15",
|
||||||
"@vue/cli-plugin-eslint": "^4.5.13",
|
"@vue/cli-plugin-eslint": "^5.0.0-rc.1",
|
||||||
"@vue/cli-service": "^4.5.13",
|
"@vue/cli-service": "^4.5.15",
|
||||||
"@vue/eslint-config-standard": "^6.0.0",
|
"@vue/eslint-config-standard": "^6.1.0",
|
||||||
"babel-eslint": "^10.1.0",
|
"babel-eslint": "^10.1.0",
|
||||||
"eslint": "^7.30.0",
|
"eslint": "^7.30.0",
|
||||||
"eslint-plugin-import": "^2.23.4",
|
"eslint-plugin-import": "^2.23.4",
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<section class="fd-notifications">
|
<section class="fd-notifications" v-if="notifications.length > 0">
|
||||||
<div class="columns is-centered">
|
<div class="columns is-centered">
|
||||||
<div class="column is-half">
|
<div class="column is-half">
|
||||||
<div class="notification has-shadow " v-for="notification in notifications" :key="notification.id" :class="['notification', notification.type ? `is-${notification.type}` : '']">
|
<div class="notification has-shadow " v-for="notification in notifications" :key="notification.id" :class="['notification', notification.type ? `is-${notification.type}` : '']">
|
||||||
|
@ -1,8 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="media">
|
<div class="media">
|
||||||
<div class="media-content fd-has-action is-clipped" v-on:click="play">
|
<div class="media-content fd-has-action is-clipped" v-on:click="play">
|
||||||
<h1 class="title is-6">{{ track.name }}</h1>
|
<h1 class="title is-6" :class="{ 'has-text-grey-light': !track.is_playable }">{{ track.name }}</h1>
|
||||||
<h2 class="subtitle is-7 has-text-grey"><b>{{ track.artists[0].name }}</b></h2>
|
<h2 class="subtitle is-7" :class="{ 'has-text-grey': track.is_playable, 'has-text-grey-light': !track.is_playable }"><b>{{ track.artists[0].name }}</b></h2>
|
||||||
|
<h2 class="subtitle is-7" v-if="!track.is_playable">
|
||||||
|
(Track is not playable, restriction reason: {{ track.restrictions.reason }})
|
||||||
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="media-right">
|
<div class="media-right">
|
||||||
<slot name="actions"></slot>
|
<slot name="actions"></slot>
|
||||||
|
@ -67,6 +67,11 @@
|
|||||||
Access to the Spotify Web API enables scanning of your Spotify library. Required scopes are
|
Access to the Spotify Web API enables scanning of your Spotify library. Required scopes are
|
||||||
<code>{{ spotify_required_scope | join }}</code>.
|
<code>{{ spotify_required_scope | join }}</code>.
|
||||||
</p>
|
</p>
|
||||||
|
<div v-if="spotify.webapi_token_valid" class="field fd-has-margin-top ">
|
||||||
|
<div class="control">
|
||||||
|
<a class="button is-danger" @click="logout_spotify">Logout</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -141,7 +146,7 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
spotify_required_scope () {
|
spotify_required_scope () {
|
||||||
if (this.spotify.webapi_token_valid && this.spotify.webapi_granted_scope && this.spotify.webapi_required_scope) {
|
if (this.spotify.webapi_required_scope) {
|
||||||
return this.spotify.webapi_required_scope.split(' ')
|
return this.spotify.webapi_required_scope.split(' ')
|
||||||
}
|
}
|
||||||
return []
|
return []
|
||||||
@ -176,6 +181,10 @@ export default {
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
|
logout_spotify () {
|
||||||
|
webapi.spotify_logout()
|
||||||
|
},
|
||||||
|
|
||||||
login_lastfm () {
|
login_lastfm () {
|
||||||
webapi.lastfm_login(this.lastfm_login).then(response => {
|
webapi.lastfm_login(this.lastfm_login).then(response => {
|
||||||
this.lastfm_login.user = ''
|
this.lastfm_login.user = ''
|
||||||
|
@ -54,7 +54,7 @@ const albumData = {
|
|||||||
load: function (to) {
|
load: function (to) {
|
||||||
const spotifyApi = new SpotifyWebApi()
|
const spotifyApi = new SpotifyWebApi()
|
||||||
spotifyApi.setAccessToken(store.state.spotify.webapi_token)
|
spotifyApi.setAccessToken(store.state.spotify.webapi_token)
|
||||||
return spotifyApi.getAlbum(to.params.album_id)
|
return spotifyApi.getAlbum(to.params.album_id, { market: store.state.spotify.webapi_country })
|
||||||
},
|
},
|
||||||
|
|
||||||
set: function (vm, response) {
|
set: function (vm, response) {
|
||||||
|
@ -60,7 +60,7 @@ const artistData = {
|
|||||||
spotifyApi.setAccessToken(store.state.spotify.webapi_token)
|
spotifyApi.setAccessToken(store.state.spotify.webapi_token)
|
||||||
return Promise.all([
|
return Promise.all([
|
||||||
spotifyApi.getArtist(to.params.artist_id),
|
spotifyApi.getArtist(to.params.artist_id),
|
||||||
spotifyApi.getArtistAlbums(to.params.artist_id, { limit: 50, offset: 0, include_groups: 'album,single' })
|
spotifyApi.getArtistAlbums(to.params.artist_id, { limit: 50, offset: 0, include_groups: 'album,single', market: store.state.spotify.webapi_country })
|
||||||
])
|
])
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -356,6 +356,10 @@ export default {
|
|||||||
return axios.post('./api/spotify-login', credentials)
|
return axios.post('./api/spotify-login', credentials)
|
||||||
},
|
},
|
||||||
|
|
||||||
|
spotify_logout () {
|
||||||
|
return axios.get('./api/spotify-logout')
|
||||||
|
},
|
||||||
|
|
||||||
lastfm () {
|
lastfm () {
|
||||||
return axios.get('./api/lastfm')
|
return axios.get('./api/lastfm')
|
||||||
},
|
},
|
||||||
|
Loading…
x
Reference in New Issue
Block a user