[web] Change the way the api is called

This commit is contained in:
Alain Nussbaumer 2025-04-26 08:18:32 +02:00
parent 830b40cc40
commit 40c658cb8b
31 changed files with 320 additions and 531 deletions

View File

@ -31,25 +31,6 @@ import ListTracks from '@/components/ListTracks.vue'
import ModalDialogAlbum from '@/components/ModalDialogAlbum.vue' import ModalDialogAlbum from '@/components/ModalDialogAlbum.vue'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load(to) {
return Promise.all([
webapi.library_album(to.params.id),
webapi.library_album_tracks(to.params.id)
])
},
set(vm, response) {
vm.album = response[0].data
vm.tracks = new GroupedList(response[1].data, {
criteria: [{ field: 'disc_number', type: Number }],
index: { field: 'disc_number', type: Number }
})
if (vm.tracks.indices.length < 2) {
vm.tracks.group()
}
}
}
export default { export default {
name: 'PageAlbum', name: 'PageAlbum',
components: { components: {
@ -60,8 +41,20 @@ export default {
ModalDialogAlbum ModalDialogAlbum
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load(to).then((response) => { Promise.all([
next((vm) => dataObject.set(vm, response)) webapi.library_album(to.params.id),
webapi.library_album_tracks(to.params.id)
]).then(([album, tracks]) => {
next((vm) => {
vm.album = album.data
vm.tracks = new GroupedList(tracks.data, {
criteria: [{ field: 'disc_number', type: Number }],
index: { field: 'disc_number', type: Number }
})
if (vm.tracks.indices.length < 2) {
vm.tracks.group()
}
})
}) })
}, },
data() { data() {

View File

@ -32,21 +32,6 @@ import SpotifyWebApi from 'spotify-web-api-js'
import { useServicesStore } from '@/stores/services' import { useServicesStore } from '@/stores/services'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load(to) {
return webapi.spotify().then(({ data }) => {
const spotifyApi = new SpotifyWebApi()
spotifyApi.setAccessToken(data.webapi_token)
return spotifyApi.getAlbum(to.params.id, {
market: useServicesStore().spotify.webapi_country
})
})
},
set(vm, response) {
vm.album = response
}
}
export default { export default {
name: 'PageAlbumSpotify', name: 'PageAlbumSpotify',
components: { components: {
@ -57,8 +42,18 @@ export default {
ModalDialogAlbumSpotify ModalDialogAlbumSpotify
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load(to).then((response) => { const spotifyApi = new SpotifyWebApi()
next((vm) => dataObject.set(vm, response)) webapi.spotify().then(({ data }) => {
spotifyApi.setAccessToken(data.webapi_token)
spotifyApi
.getAlbum(to.params.id, {
market: useServicesStore().spotify.webapi_country
})
.then((album) => {
next((vm) => {
vm.album = album
})
})
}) })
}, },
setup() { setup() {

View File

@ -56,15 +56,6 @@ import { useServicesStore } from '@/stores/services'
import { useUIStore } from '@/stores/ui' import { useUIStore } from '@/stores/ui'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load(to) {
return webapi.library_albums('music')
},
set(vm, response) {
vm.albumList = new GroupedList(response.data)
}
}
export default { export default {
name: 'PageAlbums', name: 'PageAlbums',
components: { components: {
@ -78,8 +69,10 @@ export default {
TabsMusic TabsMusic
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load(to).then((response) => { webapi.library_albums('music').then((albums) => {
next((vm) => dataObject.set(vm, response)) next((vm) => {
vm.albumList = new GroupedList(albums.data)
})
}) })
}, },
setup() { setup() {

View File

@ -59,19 +59,6 @@ import { useServicesStore } from '@/stores/services'
import { useUIStore } from '@/stores/ui' import { useUIStore } from '@/stores/ui'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load(to) {
return Promise.all([
webapi.library_artist(to.params.id),
webapi.library_artist_albums(to.params.id)
])
},
set(vm, response) {
vm.artist = response[0].data
vm.albumList = new GroupedList(response[1].data)
}
}
export default { export default {
name: 'PageArtist', name: 'PageArtist',
components: { components: {
@ -85,8 +72,14 @@ export default {
ModalDialogArtist ModalDialogArtist
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load(to).then((response) => { Promise.all([
next((vm) => dataObject.set(vm, response)) webapi.library_artist(to.params.id),
webapi.library_artist_albums(to.params.id)
]).then(([artist, albums]) => {
next((vm) => {
vm.artist = artist.data
vm.albumList = new GroupedList(albums.data)
})
}) })
}, },
setup() { setup() {

View File

@ -34,31 +34,6 @@ import webapi from '@/webapi'
const PAGE_SIZE = 50 const PAGE_SIZE = 50
const dataObject = {
load(to) {
return webapi.spotify().then(({ data }) => {
const spotifyApi = new SpotifyWebApi()
spotifyApi.setAccessToken(data.webapi_token)
return Promise.all([
spotifyApi.getArtist(to.params.id),
spotifyApi.getArtistAlbums(to.params.id, {
include_groups: 'album,single',
limit: PAGE_SIZE,
market: useServicesStore().spotify.webapi_country,
offset: 0
})
])
})
},
set(vm, response) {
vm.artist = response.shift()
vm.albums = []
vm.total = 0
vm.offset = 0
vm.appendAlbums(response.shift())
}
}
export default { export default {
name: 'PageArtistSpotify', name: 'PageArtistSpotify',
components: { components: {
@ -69,8 +44,25 @@ export default {
ModalDialogArtistSpotify ModalDialogArtistSpotify
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load(to).then((response) => { webapi.spotify().then(({ data }) => {
next((vm) => dataObject.set(vm, response)) const spotifyApi = new SpotifyWebApi()
spotifyApi.setAccessToken(data.webapi_token)
Promise.all([
spotifyApi.getArtist(to.params.id),
spotifyApi.getArtistAlbums(to.params.id, {
include_groups: 'album,single',
limit: PAGE_SIZE,
market: useServicesStore().spotify.webapi_country,
offset: 0
})
]).then(([artist, albums]) => {
next((vm) => {
vm.artist = artist
vm.albums = albums.items
vm.total = albums.total
vm.offset = albums.limit
})
})
}) })
}, },
setup() { setup() {

View File

@ -61,19 +61,6 @@ import { useServicesStore } from '@/stores/services'
import { useUIStore } from '@/stores/ui' import { useUIStore } from '@/stores/ui'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load(to) {
return Promise.all([
webapi.library_artist(to.params.id),
webapi.library_artist_tracks(to.params.id)
])
},
set(vm, response) {
vm.artist = response[0].data
vm.trackList = new GroupedList(response[1].data.tracks)
}
}
export default { export default {
name: 'PageArtistTracks', name: 'PageArtistTracks',
components: { components: {
@ -88,8 +75,14 @@ export default {
ModalDialogArtist ModalDialogArtist
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load(to).then((response) => { Promise.all([
next((vm) => dataObject.set(vm, response)) webapi.library_artist(to.params.id),
webapi.library_artist_tracks(to.params.id)
]).then(([artist, tracks]) => {
next((vm) => {
vm.artist = artist.data
vm.trackList = new GroupedList(tracks.data.tracks)
})
}) })
}, },
setup() { setup() {

View File

@ -56,15 +56,6 @@ import { useServicesStore } from '@/stores/services'
import { useUIStore } from '@/stores/ui' import { useUIStore } from '@/stores/ui'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load(to) {
return webapi.library_artists('music')
},
set(vm, response) {
vm.artistList = new GroupedList(response.data)
}
}
export default { export default {
name: 'PageArtists', name: 'PageArtists',
components: { components: {
@ -78,8 +69,10 @@ export default {
TabsMusic TabsMusic
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load(to).then((response) => { webapi.library_artists('music').then((artists) => {
next((vm) => dataObject.set(vm, response)) next((vm) => {
vm.artistList = new GroupedList(artists.data)
})
}) })
}, },
setup() { setup() {

View File

@ -32,19 +32,6 @@ import ListTracks from '@/components/ListTracks.vue'
import ModalDialogAlbum from '@/components/ModalDialogAlbum.vue' import ModalDialogAlbum from '@/components/ModalDialogAlbum.vue'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load(to) {
return Promise.all([
webapi.library_album(to.params.id),
webapi.library_album_tracks(to.params.id)
])
},
set(vm, response) {
vm.album = response[0].data
vm.tracks = new GroupedList(response[1].data)
}
}
export default { export default {
name: 'PageAudiobooksAlbum', name: 'PageAudiobooksAlbum',
components: { components: {
@ -55,8 +42,14 @@ export default {
ModalDialogAlbum ModalDialogAlbum
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load(to).then((response) => { Promise.all([
next((vm) => dataObject.set(vm, response)) webapi.library_album(to.params.id),
webapi.library_album_tracks(to.params.id)
]).then(([album, tracks]) => {
next((vm) => {
vm.album = album.data
vm.tracks = new GroupedList(tracks.data)
})
}) })
}, },
data() { data() {

View File

@ -22,17 +22,6 @@ import ListIndexButtons from '@/components/ListIndexButtons.vue'
import TabsAudiobooks from '@/components/TabsAudiobooks.vue' import TabsAudiobooks from '@/components/TabsAudiobooks.vue'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load(to) {
return webapi.library_albums('audiobook')
},
set(vm, response) {
vm.albums = new GroupedList(response.data, {
index: { field: 'name_sort', type: String }
})
}
}
export default { export default {
name: 'PageAudiobooksAlbums', name: 'PageAudiobooksAlbums',
components: { components: {
@ -43,8 +32,12 @@ export default {
TabsAudiobooks TabsAudiobooks
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load(to).then((response) => { webapi.library_albums('audiobook').then((albums) => {
next((vm) => dataObject.set(vm, response)) next((vm) => {
vm.albums = new GroupedList(albums.data, {
index: { field: 'name_sort', type: String }
})
})
}) })
}, },
data() { data() {

View File

@ -31,19 +31,6 @@ import ListAlbums from '@/components/ListAlbums.vue'
import ModalDialogArtist from '@/components/ModalDialogArtist.vue' import ModalDialogArtist from '@/components/ModalDialogArtist.vue'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load(to) {
return Promise.all([
webapi.library_artist(to.params.id),
webapi.library_artist_albums(to.params.id)
])
},
set(vm, response) {
vm.artist = response[0].data
vm.albums = new GroupedList(response[1].data)
}
}
export default { export default {
name: 'PageAudiobooksArtist', name: 'PageAudiobooksArtist',
components: { components: {
@ -54,8 +41,14 @@ export default {
ModalDialogArtist ModalDialogArtist
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load(to).then((response) => { Promise.all([
next((vm) => dataObject.set(vm, response)) webapi.library_artist(to.params.id),
webapi.library_artist_albums(to.params.id)
]).then(([artist, albums]) => {
next((vm) => {
vm.artist = artist.data
vm.albums = new GroupedList(albums.data)
})
}) })
}, },
data() { data() {

View File

@ -22,17 +22,6 @@ import ListIndexButtons from '@/components/ListIndexButtons.vue'
import TabsAudiobooks from '@/components/TabsAudiobooks.vue' import TabsAudiobooks from '@/components/TabsAudiobooks.vue'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load(to) {
return webapi.library_artists('audiobook')
},
set(vm, response) {
vm.artists = new GroupedList(response.data, {
index: { field: 'name_sort', type: String }
})
}
}
export default { export default {
name: 'PageAudiobooksArtists', name: 'PageAudiobooksArtists',
components: { components: {
@ -43,8 +32,12 @@ export default {
TabsAudiobooks TabsAudiobooks
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load(to).then((response) => { webapi.library_artists('audiobook').then((artists) => {
next((vm) => dataObject.set(vm, response)) next((vm) => {
vm.artists = new GroupedList(artists.data, {
index: { field: 'name_sort', type: String }
})
})
}) })
}, },
data() { data() {

View File

@ -22,17 +22,6 @@ import ListIndexButtons from '@/components/ListIndexButtons.vue'
import TabsAudiobooks from '@/components/TabsAudiobooks.vue' import TabsAudiobooks from '@/components/TabsAudiobooks.vue'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load(to) {
return webapi.library_genres('audiobook')
},
set(vm, response) {
vm.genres = new GroupedList(response.data.genres, {
index: { field: 'name_sort', type: String }
})
}
}
export default { export default {
name: 'PageAudiobooksGenres', name: 'PageAudiobooksGenres',
components: { components: {
@ -43,8 +32,12 @@ export default {
TabsAudiobooks TabsAudiobooks
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load(to).then((response) => { webapi.library_genres('audiobook').then((response) => {
next((vm) => dataObject.set(vm, response)) next((vm) => {
vm.genres = new GroupedList(response.data.genres, {
index: { field: 'name_sort', type: String }
})
})
}) })
}, },
data() { data() {

View File

@ -31,19 +31,6 @@ import ListAlbums from '@/components/ListAlbums.vue'
import ModalDialogComposer from '@/components/ModalDialogComposer.vue' import ModalDialogComposer from '@/components/ModalDialogComposer.vue'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load(to) {
return Promise.all([
webapi.library_composer(to.params.name),
webapi.library_composer_albums(to.params.name)
])
},
set(vm, response) {
vm.composer = response[0].data
vm.albums = new GroupedList(response[1].data.albums)
}
}
export default { export default {
name: 'PageComposerAlbums', name: 'PageComposerAlbums',
components: { components: {
@ -54,8 +41,14 @@ export default {
ModalDialogComposer ModalDialogComposer
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load(to).then((response) => { Promise.all([
next((vm) => dataObject.set(vm, response)) webapi.library_composer(to.params.name),
webapi.library_composer_albums(to.params.name)
]).then(([composer, albums]) => {
next((vm) => {
vm.composer = composer.data
vm.albums = new GroupedList(albums.data.albums)
})
}) })
}, },
data() { data() {

View File

@ -46,19 +46,6 @@ import ModalDialogComposer from '@/components/ModalDialogComposer.vue'
import { useUIStore } from '@/stores/ui' import { useUIStore } from '@/stores/ui'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load(to) {
return Promise.all([
webapi.library_composer(to.params.name),
webapi.library_composer_tracks(to.params.name)
])
},
set(vm, response) {
vm.composer = response[0].data
vm.trackList = new GroupedList(response[1].data.tracks)
}
}
export default { export default {
name: 'PageComposerTracks', name: 'PageComposerTracks',
components: { components: {
@ -72,8 +59,14 @@ export default {
ModalDialogComposer ModalDialogComposer
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load(to).then((response) => { Promise.all([
next((vm) => dataObject.set(vm, response)) webapi.library_composer(to.params.name),
webapi.library_composer_tracks(to.params.name)
]).then(([composer, tracks]) => {
next((vm) => {
vm.composer = composer.data
vm.trackList = new GroupedList(tracks.data.tracks)
})
}) })
}, },
setup() { setup() {

View File

@ -22,17 +22,6 @@ import ListIndexButtons from '@/components/ListIndexButtons.vue'
import TabsMusic from '@/components/TabsMusic.vue' import TabsMusic from '@/components/TabsMusic.vue'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load() {
return webapi.library_composers('music')
},
set(vm, response) {
vm.composers = new GroupedList(response.data, {
index: { field: 'name_sort', type: String }
})
}
}
export default { export default {
name: 'PageComposers', name: 'PageComposers',
components: { components: {
@ -43,8 +32,12 @@ export default {
TabsMusic TabsMusic
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load().then((response) => { webapi.library_composers('music').then((composers) => {
next((vm) => dataObject.set(vm, response)) next((vm) => {
vm.composers = new GroupedList(composers.data, {
index: { field: 'name_sort', type: String }
})
})
}) })
}, },
data() { data() {

View File

@ -36,34 +36,6 @@ import ModalDialogPlayable from '@/components/ModalDialogPlayable.vue'
import { useConfigurationStore } from '@/stores/configuration' import { useConfigurationStore } from '@/stores/configuration'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load(to) {
if (to.query.directory) {
return webapi.library_files(to.query.directory)
}
return Promise.resolve()
},
set(vm, response) {
if (response) {
vm.directories = response.data.directories.map((directory) =>
vm.transform(directory.path)
)
} else if (useConfigurationStore().directories) {
vm.directories = useConfigurationStore().directories.map((path) =>
vm.transform(path)
)
} else {
webapi.config().then((config) => {
vm.directories = config.data.directories.map((path) =>
vm.transform(path)
)
})
}
vm.playlists = new GroupedList(response?.data.playlists)
vm.tracks = new GroupedList(response?.data.tracks)
}
}
export default { export default {
name: 'PageFiles', name: 'PageFiles',
components: { components: {
@ -76,15 +48,12 @@ export default {
ModalDialogPlayable ModalDialogPlayable
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load(to).then((response) => { next(async (vm) => {
next((vm) => dataObject.set(vm, response)) await vm.fetchData(to)
}) })
}, },
beforeRouteUpdate(to, from, next) { beforeRouteUpdate(to, from, next) {
dataObject.load(to).then((response) => { this.fetchData(to).then(() => next())
dataObject.set(this, response)
next()
})
}, },
setup() { setup() {
return { return {
@ -122,6 +91,25 @@ export default {
} }
}, },
methods: { methods: {
async fetchData(to) {
if (to.query.directory) {
const response = await webapi.library_files(to.query.directory)
if (response) {
this.directories = response.data.directories.map((directory) =>
this.transform(directory.path)
)
this.playlists = new GroupedList(response.data.playlists)
this.tracks = new GroupedList(response.data.tracks)
}
} else {
const config = await webapi.config()
this.directories = config.data.directories.map((path) =>
this.transform(path)
)
this.playlists = new GroupedList()
this.tracks = new GroupedList()
}
},
openDetails() { openDetails() {
this.showDetailsModal = true this.showDetailsModal = true
}, },

View File

@ -36,21 +36,6 @@ import ListIndexButtons from '@/components/ListIndexButtons.vue'
import ModalDialogGenre from '@/components/ModalDialogGenre.vue' import ModalDialogGenre from '@/components/ModalDialogGenre.vue'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load(to) {
return Promise.all([
webapi.library_genre(to.params.name, to.query.mediaKind),
webapi.library_genre_albums(to.params.name, to.query.mediaKind)
])
},
set(vm, response) {
vm.genre = response[0].data.genres.items.shift()
vm.albums = new GroupedList(response[1].data.albums, {
index: { field: 'name_sort', type: String }
})
}
}
export default { export default {
name: 'PageGenreAlbums', name: 'PageGenreAlbums',
components: { components: {
@ -62,8 +47,16 @@ export default {
ModalDialogGenre ModalDialogGenre
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load(to).then((response) => { Promise.all([
next((vm) => dataObject.set(vm, response)) webapi.library_genre(to.params.name, to.query.mediaKind),
webapi.library_genre_albums(to.params.name, to.query.mediaKind)
]).then(([genre, albums]) => {
next((vm) => {
vm.genre = genre.data.genres.items.shift()
vm.albums = new GroupedList(albums.data.albums, {
index: { field: 'name_sort', type: String }
})
})
}) })
}, },
data() { data() {

View File

@ -47,19 +47,6 @@ import ModalDialogGenre from '@/components/ModalDialogGenre.vue'
import { useUIStore } from '@/stores/ui' import { useUIStore } from '@/stores/ui'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load(to) {
return Promise.all([
webapi.library_genre(to.params.name, to.query.mediaKind),
webapi.library_genre_tracks(to.params.name, to.query.mediaKind)
])
},
set(vm, response) {
vm.genre = response[0].data.genres.items.shift()
vm.trackList = new GroupedList(response[1].data.tracks)
}
}
export default { export default {
name: 'PageGenreTracks', name: 'PageGenreTracks',
components: { components: {
@ -73,8 +60,14 @@ export default {
ModalDialogGenre ModalDialogGenre
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load(to).then((response) => { Promise.all([
next((vm) => dataObject.set(vm, response)) webapi.library_genre(to.params.name, to.query.mediaKind),
webapi.library_genre_tracks(to.params.name, to.query.mediaKind)
]).then(([genre, tracks]) => {
next((vm) => {
vm.genre = genre.data.genres.items.shift()
vm.trackList = new GroupedList(tracks.data.tracks)
})
}) })
}, },
setup() { setup() {
@ -138,7 +131,7 @@ export default {
this.$router.push({ this.$router.push({
name: 'genre-albums', name: 'genre-albums',
params: { name: this.genre.name }, params: { name: this.genre.name },
query: { mediaKind: this.media_kind } query: { mediaKind: this.mediaKind }
}) })
}, },
play() { play() {

View File

@ -22,17 +22,6 @@ import ListIndexButtons from '@/components/ListIndexButtons.vue'
import TabsMusic from '@/components/TabsMusic.vue' import TabsMusic from '@/components/TabsMusic.vue'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load() {
return webapi.library_genres('music')
},
set(vm, response) {
vm.genres = new GroupedList(response.data.genres, {
index: { field: 'name_sort', type: String }
})
}
}
export default { export default {
name: 'PageGenres', name: 'PageGenres',
components: { components: {
@ -43,8 +32,12 @@ export default {
TabsMusic TabsMusic
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load().then((response) => { webapi.library_genres('music').then((genres) => {
next((vm) => dataObject.set(vm, response)) next((vm) => {
vm.genres = new GroupedList(genres.data.genres, {
index: { field: 'name_sort', type: String }
})
})
}) })
}, },
data() { data() {

View File

@ -47,9 +47,17 @@ import ListTracks from '@/components/ListTracks.vue'
import TabsMusic from '@/components/TabsMusic.vue' import TabsMusic from '@/components/TabsMusic.vue'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = { export default {
load() { name: 'PageMusic',
return Promise.all([ components: {
ContentWithHeading,
HeadingTitle,
ListAlbums,
ListTracks,
TabsMusic
},
beforeRouteEnter(to, from, next) {
Promise.all([
webapi.search({ webapi.search({
expression: expression:
'time_added after 8 weeks ago and media_kind is music having track_count > 3 order by time_added desc', 'time_added after 8 weeks ago and media_kind is music having track_count > 3 order by time_added desc',
@ -62,26 +70,11 @@ const dataObject = {
limit: 3, limit: 3,
type: 'track' type: 'track'
}) })
]) ]).then(([albums, tracks]) => {
}, next((vm) => {
set(vm, response) { vm.albums = new GroupedList(albums.data.albums)
vm.albums = new GroupedList(response[0].data.albums) vm.tracks = new GroupedList(tracks.data.tracks)
vm.tracks = new GroupedList(response[1].data.tracks) })
}
}
export default {
name: 'PageMusic',
components: {
ContentWithHeading,
HeadingTitle,
ListAlbums,
ListTracks,
TabsMusic
},
beforeRouteEnter(to, from, next) {
dataObject.load().then((response) => {
next((vm) => dataObject.set(vm, response))
}) })
}, },
data() { data() {

View File

@ -21,31 +21,26 @@ import TabsMusic from '@/components/TabsMusic.vue'
import { useSettingsStore } from '@/stores/settings' import { useSettingsStore } from '@/stores/settings'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load() {
const limit = useSettingsStore().recently_added_limit
return webapi.search({
expression:
'media_kind is music having track_count > 3 order by time_added desc',
limit,
type: 'album'
})
},
set(vm, response) {
vm.albums = new GroupedList(response.data.albums, {
criteria: [{ field: 'time_added', order: -1, type: Date }],
index: { field: 'time_added', type: Date }
})
}
}
export default { export default {
name: 'PageMusicRecentlyAdded', name: 'PageMusicRecentlyAdded',
components: { ContentWithHeading, HeadingTitle, ListAlbums, TabsMusic }, components: { ContentWithHeading, HeadingTitle, ListAlbums, TabsMusic },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load().then((response) => { const limit = useSettingsStore().recently_added_limit
next((vm) => dataObject.set(vm, response)) webapi
}) .search({
expression:
'media_kind is music having track_count > 3 order by time_added desc',
limit,
type: 'album'
})
.then((response) => {
next((vm) => {
vm.albums = new GroupedList(response.data.albums, {
criteria: [{ field: 'time_added', order: -1, type: Date }],
index: { field: 'time_added', type: Date }
})
})
})
}, },
setup() { setup() {
return { return {

View File

@ -20,31 +20,26 @@ import ListTracks from '@/components/ListTracks.vue'
import TabsMusic from '@/components/TabsMusic.vue' import TabsMusic from '@/components/TabsMusic.vue'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load() {
return webapi.search({
expression:
'time_played after 8 weeks ago and media_kind is music order by time_played desc',
limit: 50,
type: 'track'
})
},
set(vm, response) {
vm.tracks = new GroupedList(response.data.tracks)
}
}
export default { export default {
name: 'PageMusicRecentlyPlayed', name: 'PageMusicRecentlyPlayed',
components: { ContentWithHeading, HeadingTitle, ListTracks, TabsMusic }, components: { ContentWithHeading, HeadingTitle, ListTracks, TabsMusic },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load().then((response) => { webapi
next((vm) => dataObject.set(vm, response)) .search({
}) expression:
'time_played after 8 weeks ago and media_kind is music order by time_played desc',
limit: 50,
type: 'track'
})
.then((response) => {
next((vm) => {
vm.tracks = new GroupedList(response.data.tracks)
})
})
}, },
data() { data() {
return { return {
tracks: {} tracks: new GroupedList()
} }
} }
} }

View File

@ -47,29 +47,6 @@ import SpotifyWebApi from 'spotify-web-api-js'
import TabsMusic from '@/components/TabsMusic.vue' import TabsMusic from '@/components/TabsMusic.vue'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load() {
return webapi.spotify().then(({ data }) => {
const spotifyApi = new SpotifyWebApi()
spotifyApi.setAccessToken(data.webapi_token)
return Promise.all([
spotifyApi.getNewReleases({
country: data.webapi_country,
limit: 3
}),
spotifyApi.getFeaturedPlaylists({
country: data.webapi_country,
limit: 3
})
])
})
},
set(vm, response) {
vm.albums = response[0].albums.items
vm.playlists = response[1].playlists.items
}
}
export default { export default {
name: 'PageMusicSpotify', name: 'PageMusicSpotify',
components: { components: {
@ -80,8 +57,24 @@ export default {
TabsMusic TabsMusic
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load().then((response) => { webapi.spotify().then(({ data }) => {
next((vm) => dataObject.set(vm, response)) const spotifyApi = new SpotifyWebApi()
spotifyApi.setAccessToken(data.webapi_token)
Promise.all([
spotifyApi.getNewReleases({
country: data.webapi_country,
limit: 3
}),
spotifyApi.getFeaturedPlaylists({
country: data.webapi_country,
limit: 3
})
]).then((response) => {
next((vm) => {
vm.albums = response[0].albums.items
vm.playlists = response[1].playlists.items
})
})
}) })
}, },
data() { data() {

View File

@ -18,22 +18,6 @@ import SpotifyWebApi from 'spotify-web-api-js'
import TabsMusic from '@/components/TabsMusic.vue' import TabsMusic from '@/components/TabsMusic.vue'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load(to) {
return webapi.spotify().then(({ data }) => {
const spotifyApi = new SpotifyWebApi()
spotifyApi.setAccessToken(data.webapi_token)
return spotifyApi.getFeaturedPlaylists({
country: data.webapi_country,
limit: 50
})
})
},
set(vm, response) {
vm.playlists = response.playlists.items
}
}
export default { export default {
name: 'PageMusicSpotifyFeaturedPlaylists', name: 'PageMusicSpotifyFeaturedPlaylists',
components: { components: {
@ -43,8 +27,19 @@ export default {
TabsMusic TabsMusic
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load(to).then((response) => { webapi.spotify().then(({ data }) => {
next((vm) => dataObject.set(vm, response)) const spotifyApi = new SpotifyWebApi()
spotifyApi.setAccessToken(data.webapi_token)
spotifyApi
.getFeaturedPlaylists({
country: data.webapi_country,
limit: 50
})
.then((response) => {
next((vm) => {
vm.playlists = response.playlists.items
})
})
}) })
}, },
data() { data() {

View File

@ -18,22 +18,6 @@ import SpotifyWebApi from 'spotify-web-api-js'
import TabsMusic from '@/components/TabsMusic.vue' import TabsMusic from '@/components/TabsMusic.vue'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load() {
return webapi.spotify().then(({ data }) => {
const spotifyApi = new SpotifyWebApi()
spotifyApi.setAccessToken(data.webapi_token)
return spotifyApi.getNewReleases({
country: data.webapi_country,
limit: 50
})
})
},
set(vm, response) {
vm.albums = response.albums.items
}
}
export default { export default {
name: 'PageMusicSpotifyNewReleases', name: 'PageMusicSpotifyNewReleases',
components: { components: {
@ -43,8 +27,19 @@ export default {
TabsMusic TabsMusic
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load().then((response) => { webapi.spotify().then(({ data }) => {
next((vm) => dataObject.set(vm, response)) const spotifyApi = new SpotifyWebApi()
spotifyApi.setAccessToken(data.webapi_token)
spotifyApi
.getNewReleases({
country: data.webapi_country,
limit: 50
})
.then((response) => {
next((vm) => {
vm.albums = response.albums.items
})
})
}) })
}, },
data() { data() {

View File

@ -17,32 +17,16 @@ import ListPlaylists from '@/components/ListPlaylists.vue'
import { useConfigurationStore } from '@/stores/configuration' import { useConfigurationStore } from '@/stores/configuration'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load(to) {
return Promise.all([
webapi.library_playlist(to.params.id),
webapi.library_playlist_folder(to.params.id)
])
},
set(vm, response) {
vm.playlist = response[0].data
vm.playlistList = new GroupedList(response[1].data)
}
}
export default { export default {
name: 'PagePlaylistFolder', name: 'PagePlaylistFolder',
components: { ContentWithHeading, HeadingTitle, ListPlaylists }, components: { ContentWithHeading, HeadingTitle, ListPlaylists },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load(to).then((response) => { next(async (vm) => {
next((vm) => dataObject.set(vm, response)) await vm.fetchData(to.params.id)
}) })
}, },
beforeRouteUpdate(to, from, next) { beforeRouteUpdate(to, from, next) {
dataObject.load(to).then((response) => { this.fetchData(to.params.id).then(() => next())
dataObject.set(this, response)
next()
})
}, },
setup() { setup() {
return { return {
@ -75,6 +59,16 @@ export default {
] ]
}) })
} }
},
methods: {
async fetchData(id) {
const [playlist, playlistFolder] = await Promise.all([
webapi.library_playlist(id),
webapi.library_playlist_folder(id)
])
this.playlist = playlist.data
this.playlistList = new GroupedList(playlistFolder.data)
}
} }
} }
</script> </script>

View File

@ -37,19 +37,6 @@ import ListTracks from '@/components/ListTracks.vue'
import ModalDialogPlaylist from '@/components/ModalDialogPlaylist.vue' import ModalDialogPlaylist from '@/components/ModalDialogPlaylist.vue'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load(to) {
return Promise.all([
webapi.library_playlist(to.params.id),
webapi.library_playlist_tracks(to.params.id)
])
},
set(vm, response) {
vm.playlist = response[0].data
vm.tracks = new GroupedList(response[1].data)
}
}
export default { export default {
name: 'PagePlaylistTracks', name: 'PagePlaylistTracks',
components: { components: {
@ -60,8 +47,14 @@ export default {
ModalDialogPlaylist ModalDialogPlaylist
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load(to).then((response) => { Promise.all([
next((vm) => dataObject.set(vm, response)) webapi.library_playlist(to.params.id),
webapi.library_playlist_tracks(to.params.id)
]).then(([playlist, tracks]) => {
next((vm) => {
vm.playlist = playlist.data
vm.tracks = new GroupedList(tracks.data)
})
}) })
}, },
data() { data() {

View File

@ -44,28 +44,6 @@ import webapi from '@/webapi'
const PAGE_SIZE = 50 const PAGE_SIZE = 50
const dataObject = {
load(to) {
const spotifyApi = new SpotifyWebApi()
spotifyApi.setAccessToken(useServicesStore().spotify.webapi_token)
return Promise.all([
spotifyApi.getPlaylist(to.params.id),
spotifyApi.getPlaylistTracks(to.params.id, {
limit: PAGE_SIZE,
market: useServicesStore().$state.spotify.webapi_country,
offset: 0
})
])
},
set(vm, response) {
vm.playlist = response.shift()
vm.tracks = []
vm.total = 0
vm.offset = 0
vm.appendTracks(response.shift())
}
}
export default { export default {
name: 'PagePlaylistTracksSpotify', name: 'PagePlaylistTracksSpotify',
components: { components: {
@ -76,8 +54,24 @@ export default {
ModalDialogPlaylistSpotify ModalDialogPlaylistSpotify
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load(to).then((response) => { const spotifyApi = new SpotifyWebApi()
next((vm) => dataObject.set(vm, response)) spotifyApi.setAccessToken(useServicesStore().spotify.webapi_token)
Promise.all([
spotifyApi.getPlaylist(to.params.id),
spotifyApi.getPlaylistTracks(to.params.id, {
limit: PAGE_SIZE,
market: useServicesStore().$state.spotify.webapi_country,
offset: 0
})
]).then((response) => {
const [playlist, tracks] = response
next((vm) => {
vm.playlist = playlist
vm.tracks = []
vm.total = 0
vm.offset = 0
vm.appendTracks(tracks)
})
}) })
}, },
setup() { setup() {

View File

@ -57,19 +57,6 @@ import ModalDialog from '@/components/ModalDialog.vue'
import ModalDialogAlbum from '@/components/ModalDialogAlbum.vue' import ModalDialogAlbum from '@/components/ModalDialogAlbum.vue'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load(to) {
return Promise.all([
webapi.library_album(to.params.id),
webapi.library_podcast_episodes(to.params.id)
])
},
set(vm, response) {
vm.album = response[0].data
vm.tracks = new GroupedList(response[1].data.tracks)
}
}
export default { export default {
name: 'PagePodcast', name: 'PagePodcast',
components: { components: {
@ -81,8 +68,14 @@ export default {
ModalDialogAlbum ModalDialogAlbum
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load(to).then((response) => { Promise.all([
next((vm) => dataObject.set(vm, response)) webapi.library_album(to.params.id),
webapi.library_podcast_episodes(to.params.id)
]).then(([album, episodes]) => {
next((vm) => {
vm.album = album.data
vm.tracks = new GroupedList(episodes.data.tracks)
})
}) })
}, },
data() { data() {

View File

@ -68,19 +68,6 @@ import { useLibraryStore } from '@/stores/library'
import { useUIStore } from '@/stores/ui' import { useUIStore } from '@/stores/ui'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load(to) {
return Promise.all([
webapi.library_albums('podcast'),
webapi.library_podcasts_new_episodes()
])
},
set(vm, response) {
vm.albums = new GroupedList(response[0].data)
vm.tracks = new GroupedList(response[1].data.tracks)
}
}
export default { export default {
name: 'PagePodcasts', name: 'PagePodcasts',
components: { components: {
@ -92,8 +79,14 @@ export default {
ModalDialogAddRss ModalDialogAddRss
}, },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load(to).then((response) => { Promise.all([
next((vm) => dataObject.set(vm, response)) webapi.library_albums('podcast'),
webapi.library_podcasts_new_episodes()
]).then(([albums, episodes]) => {
next((vm) => {
vm.albums = new GroupedList(albums.data)
vm.tracks = new GroupedList(episodes.data.tracks)
})
}) })
}, },
setup() { setup() {

View File

@ -16,21 +16,14 @@ import HeadingTitle from '@/components/HeadingTitle.vue'
import ListTracks from '@/components/ListTracks.vue' import ListTracks from '@/components/ListTracks.vue'
import webapi from '@/webapi' import webapi from '@/webapi'
const dataObject = {
load(to) {
return webapi.library_radio_streams()
},
set(vm, response) {
vm.tracks = new GroupedList(response.data.tracks)
}
}
export default { export default {
name: 'PageRadioStreams', name: 'PageRadioStreams',
components: { ContentWithHeading, HeadingTitle, ListTracks }, components: { ContentWithHeading, HeadingTitle, ListTracks },
beforeRouteEnter(to, from, next) { beforeRouteEnter(to, from, next) {
dataObject.load(to).then((response) => { webapi.library_radio_streams().then((radios) => {
next((vm) => dataObject.set(vm, response)) next((vm) => {
vm.tracks = new GroupedList(radios.data.tracks)
})
}) })
}, },
data() { data() {