[web] Refactor modal dialog for playable items

This commit is contained in:
Alain Nussbaumer 2025-02-09 11:13:23 +01:00
parent 714fc4e1b8
commit ea7efdd869
16 changed files with 157 additions and 549 deletions

View File

@ -1,5 +1,5 @@
<template> <template>
<modal-dialog :actions="actions" :show="show" @close="$emit('close')"> <modal-dialog-playable :item="item" :show="show" @close="$emit('close')">
<template #content> <template #content>
<div class="title is-4"> <div class="title is-4">
<a @click="open" v-text="item.name" /> <a @click="open" v-text="item.name" />
@ -77,17 +77,17 @@
<div class="title is-6" v-text="$filters.datetime(item.time_added)" /> <div class="title is-6" v-text="$filters.datetime(item.time_added)" />
</div> </div>
</template> </template>
</modal-dialog> </modal-dialog-playable>
</template> </template>
<script> <script>
import CoverArtwork from '@/components/CoverArtwork.vue' import CoverArtwork from '@/components/CoverArtwork.vue'
import ModalDialog from '@/components/ModalDialog.vue' import ModalDialogPlayable from '@/components/ModalDialogPlayable.vue'
import webapi from '@/webapi' import webapi from '@/webapi'
export default { export default {
name: 'ModalDialogAlbum', name: 'ModalDialogAlbum',
components: { ModalDialog, CoverArtwork }, components: { ModalDialogPlayable, CoverArtwork },
props: { props: {
item: { required: true, type: Object }, item: { required: true, type: Object },
media_kind: { default: '', type: String }, media_kind: { default: '', type: String },
@ -100,25 +100,6 @@ export default {
} }
}, },
computed: { computed: {
actions() {
return [
{
label: this.$t('dialog.album.add'),
handler: this.queue_add,
icon: 'playlist-plus'
},
{
label: this.$t('dialog.album.add-next'),
handler: this.queue_add_next,
icon: 'playlist-play'
},
{
label: this.$t('dialog.album.play'),
handler: this.play,
icon: 'play'
}
]
},
media_kind_resolved() { media_kind_resolved() {
return this.media_kind || this.item.media_kind return this.media_kind || this.item.media_kind
} }
@ -161,18 +142,6 @@ export default {
params: { id: this.item.artist_id } params: { id: this.item.artist_id }
}) })
} }
},
play() {
this.$emit('close')
webapi.player_play_uri(this.item.uri, false)
},
queue_add() {
this.$emit('close')
webapi.queue_add(this.item.uri)
},
queue_add_next() {
this.$emit('close')
webapi.queue_add_next(this.item.uri)
} }
} }
} }

View File

@ -1,5 +1,5 @@
<template> <template>
<modal-dialog :actions="actions" :show="show" @close="$emit('close')"> <modal-dialog-playable :item="item" :show="show" @close="$emit('close')">
<template #content> <template #content>
<div class="title is-4"> <div class="title is-4">
<a @click="open" v-text="item.name" /> <a @click="open" v-text="item.name" />
@ -36,17 +36,16 @@
<div class="title is-6" v-text="item.album_type" /> <div class="title is-6" v-text="item.album_type" />
</div> </div>
</template> </template>
</modal-dialog> </modal-dialog-playable>
</template> </template>
<script> <script>
import CoverArtwork from '@/components/CoverArtwork.vue' import CoverArtwork from '@/components/CoverArtwork.vue'
import ModalDialog from '@/components/ModalDialog.vue' import ModalDialogPlayable from '@/components/ModalDialogPlayable.vue'
import webapi from '@/webapi'
export default { export default {
name: 'ModalDialogAlbumSpotify', name: 'ModalDialogAlbumSpotify',
components: { ModalDialog, CoverArtwork }, components: { ModalDialogPlayable, CoverArtwork },
props: { item: { required: true, type: Object }, show: Boolean }, props: { item: { required: true, type: Object }, show: Boolean },
emits: ['close'], emits: ['close'],
data() { data() {
@ -54,27 +53,6 @@ export default {
artwork_visible: false artwork_visible: false
} }
}, },
computed: {
actions() {
return [
{
label: this.$t('dialog.spotify.album.add'),
handler: this.queue_add,
icon: 'playlist-plus'
},
{
label: this.$t('dialog.spotify.album.add-next'),
handler: this.queue_add_next,
icon: 'playlist-play'
},
{
label: this.$t('dialog.spotify.album.play'),
handler: this.play,
icon: 'play'
}
]
}
},
methods: { methods: {
artwork_error() { artwork_error() {
this.artwork_visible = false this.artwork_visible = false
@ -98,18 +76,6 @@ export default {
name: 'music-spotify-artist', name: 'music-spotify-artist',
params: { id: this.item.artists[0].id } params: { id: this.item.artists[0].id }
}) })
},
play() {
this.$emit('close')
webapi.player_play_uri(this.item.uri, false)
},
queue_add() {
this.$emit('close')
webapi.queue_add(this.item.uri)
},
queue_add_next() {
this.$emit('close')
webapi.queue_add_next(this.item.uri)
} }
} }
} }

View File

@ -1,5 +1,5 @@
<template> <template>
<modal-dialog :actions="actions" :show="show" @close="$emit('close')"> <modal-dialog-playable :item="item" :show="show" @close="$emit('close')">
<template #content> <template #content>
<div class="title is-4"> <div class="title is-4">
<a @click="open" v-text="item.name" /> <a @click="open" v-text="item.name" />
@ -30,39 +30,17 @@
<div class="title is-6" v-text="$filters.datetime(item.time_added)" /> <div class="title is-6" v-text="$filters.datetime(item.time_added)" />
</div> </div>
</template> </template>
</modal-dialog> </modal-dialog-playable>
</template> </template>
<script> <script>
import ModalDialog from '@/components/ModalDialog.vue' import ModalDialogPlayable from '@/components/ModalDialogPlayable.vue'
import webapi from '@/webapi'
export default { export default {
name: 'ModalDialogArtist', name: 'ModalDialogArtist',
components: { ModalDialog }, components: { ModalDialogPlayable },
props: { item: { required: true, type: Object }, show: Boolean }, props: { item: { required: true, type: Object }, show: Boolean },
emits: ['close'], emits: ['close'],
computed: {
actions() {
return [
{
label: this.$t('dialog.artist.add'),
handler: this.queue_add,
icon: 'playlist-plus'
},
{
label: this.$t('dialog.artist.add-next'),
handler: this.queue_add_next,
icon: 'playlist-play'
},
{
label: this.$t('dialog.artist.play'),
handler: this.play,
icon: 'play'
}
]
}
},
methods: { methods: {
open() { open() {
this.$emit('close') this.$emit('close')
@ -70,18 +48,6 @@ export default {
name: 'music-artist', name: 'music-artist',
params: { id: this.item.id } params: { id: this.item.id }
}) })
},
play() {
this.$emit('close')
webapi.player_play_uri(this.item.uri, false)
},
queue_add() {
this.$emit('close')
webapi.queue_add(this.item.uri)
},
queue_add_next() {
this.$emit('close')
webapi.queue_add_next(this.item.uri)
} }
} }
} }

View File

@ -1,5 +1,5 @@
<template> <template>
<modal-dialog :actions="actions" :show="show" @close="$emit('close')"> <modal-dialog-playable :item="item" :show="show" @close="$emit('close')">
<template #content> <template #content>
<div class="title is-4"> <div class="title is-4">
<a @click="open" v-text="item.name" /> <a @click="open" v-text="item.name" />
@ -22,39 +22,17 @@
<div class="title is-6" v-text="item.genres.join(', ')" /> <div class="title is-6" v-text="item.genres.join(', ')" />
</div> </div>
</template> </template>
</modal-dialog> </modal-dialog-playable>
</template> </template>
<script> <script>
import ModalDialog from '@/components/ModalDialog.vue' import ModalDialogPlayable from '@/components/ModalDialogPlayable.vue'
import webapi from '@/webapi'
export default { export default {
name: 'ModalDialogArtistSpotify', name: 'ModalDialogArtistSpotify',
components: { ModalDialog }, components: { ModalDialogPlayable },
props: { item: { required: true, type: Object }, show: Boolean }, props: { item: { required: true, type: Object }, show: Boolean },
emits: ['close'], emits: ['close'],
computed: {
actions() {
return [
{
label: this.$t('dialog.spotify.artist.add'),
handler: this.queue_add,
icon: 'playlist-plus'
},
{
label: this.$t('dialog.spotify.artist.add-next'),
handler: this.queue_add_next,
icon: 'playlist-play'
},
{
label: this.$t('dialog.spotify.artist.play'),
handler: this.play,
icon: 'play'
}
]
}
},
methods: { methods: {
open() { open() {
this.$emit('close') this.$emit('close')
@ -62,18 +40,6 @@ export default {
name: 'music-spotify-artist', name: 'music-spotify-artist',
params: { id: this.item.id } params: { id: this.item.id }
}) })
},
play() {
this.$emit('close')
webapi.player_play_uri(this.item.uri, false)
},
queue_add() {
this.$emit('close')
webapi.queue_add(this.item.uri)
},
queue_add_next() {
this.$emit('close')
webapi.queue_add_next(this.item.uri)
} }
} }
} }

View File

@ -1,5 +1,9 @@
<template> <template>
<modal-dialog :actions="actions" :show="show" @close="$emit('close')"> <modal-dialog-playable
:expression="expression"
:show="show"
@close="$emit('close')"
>
<template #content> <template #content>
<div class="title is-4"> <div class="title is-4">
<a @click="open_albums" v-text="item.name" /> <a @click="open_albums" v-text="item.name" />
@ -33,37 +37,20 @@
/> />
</div> </div>
</template> </template>
</modal-dialog> </modal-dialog-playable>
</template> </template>
<script> <script>
import ModalDialog from '@/components/ModalDialog.vue' import ModalDialogPlayable from './ModalDialogPlayable.vue'
import webapi from '@/webapi'
export default { export default {
name: 'ModalDialogComposer', name: 'ModalDialogComposer',
components: { ModalDialog }, components: { ModalDialogPlayable },
props: { item: { required: true, type: Object }, show: Boolean }, props: { item: { required: true, type: Object }, show: Boolean },
emits: ['close'], emits: ['close'],
computed: { computed: {
actions() { expression() {
return [ return `composer is "${this.item.name}" and media_kind is music`
{
label: this.$t('dialog.composer.add'),
handler: this.queue_add,
icon: 'playlist-plus'
},
{
label: this.$t('dialog.composer.add-next'),
handler: this.queue_add_next,
icon: 'playlist-play'
},
{
label: this.$t('dialog.composer.play'),
handler: this.play,
icon: 'play'
}
]
} }
}, },
methods: { methods: {
@ -79,25 +66,6 @@ export default {
name: 'music-composer-tracks', name: 'music-composer-tracks',
params: { name: this.item.name } params: { name: this.item.name }
}) })
},
play() {
this.$emit('close')
webapi.player_play_expression(
`composer is "${this.item.name}" and media_kind is music`,
false
)
},
queue_add() {
this.$emit('close')
webapi.queue_expression_add(
`composer is "${this.item.name}" and media_kind is music`
)
},
queue_add_next() {
this.$emit('close')
webapi.queue_expression_add_next(
`composer is "${this.item.name}" and media_kind is music`
)
} }
} }
} }

View File

@ -1,6 +1,6 @@
<template> <template>
<modal-dialog <modal-dialog-playable
:actions="actions" :expression="expression"
:show="show" :show="show"
:title="item" :title="item"
@close="$emit('close')" @close="$emit('close')"
@ -8,54 +8,16 @@
</template> </template>
<script> <script>
import ModalDialog from '@/components/ModalDialog.vue' import ModalDialogPlayable from '@/components/ModalDialogPlayable.vue'
import webapi from '@/webapi'
export default { export default {
name: 'ModalDialogDirectory', name: 'ModalDialogDirectory',
components: { ModalDialog }, components: { ModalDialogPlayable },
props: { item: { required: true, type: String }, show: Boolean }, props: { item: { required: true, type: String }, show: Boolean },
emits: ['close'], emits: ['close'],
computed: { computed: {
actions() { expression() {
return [ return `path starts with "${this.item}" order by path asc`
{
label: this.$t('dialog.directory.add'),
handler: this.queue_add,
icon: 'playlist-plus'
},
{
label: this.$t('dialog.directory.add-next'),
handler: this.queue_add_next,
icon: 'playlist-play'
},
{
label: this.$t('dialog.directory.play'),
handler: this.play,
icon: 'play'
}
]
}
},
methods: {
play() {
this.$emit('close')
webapi.player_play_expression(
`path starts with "${this.item}" order by path asc`,
false
)
},
queue_add() {
this.$emit('close')
webapi.queue_expression_add(
`path starts with "${this.item}" order by path asc`
)
},
queue_add_next() {
this.$emit('close')
webapi.queue_expression_add_next(
`path starts with "${this.item}" order by path asc`
)
} }
} }
} }

View File

@ -1,5 +1,9 @@
<template> <template>
<modal-dialog :actions="actions" :show="show" @close="$emit('close')"> <modal-dialog-playable
:expression="expression"
:show="show"
@close="$emit('close')"
>
<template #content> <template #content>
<div class="title is-4"> <div class="title is-4">
<a @click="open" v-text="item.name" /> <a @click="open" v-text="item.name" />
@ -29,16 +33,15 @@
/> />
</div> </div>
</template> </template>
</modal-dialog> </modal-dialog-playable>
</template> </template>
<script> <script>
import ModalDialog from '@/components/ModalDialog.vue' import ModalDialogPlayable from '@/components/ModalDialogPlayable.vue'
import webapi from '@/webapi'
export default { export default {
name: 'ModalDialogGenre', name: 'ModalDialogGenre',
components: { ModalDialog }, components: { ModalDialogPlayable },
props: { props: {
item: { required: true, type: Object }, item: { required: true, type: Object },
media_kind: { required: true, type: String }, media_kind: { required: true, type: String },
@ -46,25 +49,6 @@ export default {
}, },
emits: ['close'], emits: ['close'],
computed: { computed: {
actions() {
return [
{
label: this.$t('dialog.genre.add'),
handler: this.queue_add,
icon: 'playlist-plus'
},
{
label: this.$t('dialog.genre.add-next'),
handler: this.queue_add_next,
icon: 'playlist-play'
},
{
label: this.$t('dialog.genre.play'),
handler: this.play,
icon: 'play'
}
]
},
expression() { expression() {
return `genre is "${this.item.name}" and media_kind is ${this.media_kind}` return `genre is "${this.item.name}" and media_kind is ${this.media_kind}`
} }
@ -77,18 +61,6 @@ export default {
params: { name: this.item.name }, params: { name: this.item.name },
query: { media_kind: this.media_kind } query: { media_kind: this.media_kind }
}) })
},
play() {
this.$emit('close')
webapi.player_play_expression(this.expression, false)
},
queue_add() {
this.$emit('close')
webapi.queue_expression_add(this.expression)
},
queue_add_next() {
this.$emit('close')
webapi.queue_expression_add_next(this.expression)
} }
} }
} }

View File

@ -0,0 +1,75 @@
<template>
<modal-dialog :actions="actions" :show="show" @close="$emit('close')">
<template #content>
<slot name="content" />
</template>
</modal-dialog>
</template>
<script>
import ModalDialog from '@/components/ModalDialog.vue'
import webapi from '@/webapi'
export default {
name: 'ModalDialogPlayable',
components: { ModalDialog },
props: {
expression: { default: '', type: String },
item: {
default() {
return {}
},
type: Object
},
show: Boolean
},
emits: ['close'],
computed: {
actions() {
return [
{
label: this.$t('dialog.playable.add'),
handler: this.queue_add,
icon: 'playlist-plus'
},
{
label: this.$t('dialog.playable.add-next'),
handler: this.queue_add_next,
icon: 'playlist-play'
},
{
label: this.$t('dialog.playable.play'),
handler: this.play,
icon: 'play'
}
]
}
},
methods: {
play() {
this.$emit('close')
if (this.expression) {
webapi.player_play_expression(this.expression, false)
} else {
webapi.player_play_uri(this.item.uri, false)
}
},
queue_add() {
this.$emit('close')
if (this.expression) {
webapi.queue_expression_add(this.expression)
} else {
webapi.queue_add(this.item.uri)
}
},
queue_add_next() {
this.$emit('close')
if (this.expression) {
webapi.queue_expression_add_next(this.expression)
} else {
webapi.queue_add_next(this.item.uri)
}
}
}
}
</script>

View File

@ -1,5 +1,5 @@
<template> <template>
<modal-dialog :actions="actions" :show="show" @close="$emit('close')"> <modal-dialog-playable :item="item" :show="show" @close="$emit('close')">
<template #content> <template #content>
<div class="title is-4"> <div class="title is-4">
<a @click="open" v-text="item.name" /> <a @click="open" v-text="item.name" />
@ -26,39 +26,17 @@
<div class="title is-6" v-text="item.uri" /> <div class="title is-6" v-text="item.uri" />
</div> </div>
</template> </template>
</modal-dialog> </modal-dialog-playable>
</template> </template>
<script> <script>
import ModalDialog from '@/components/ModalDialog.vue' import ModalDialogPlayable from '@/components/ModalDialogPlayable.vue'
import webapi from '@/webapi'
export default { export default {
name: 'ModalDialogPlaylistSpotify', name: 'ModalDialogPlaylistSpotify',
components: { ModalDialog }, components: { ModalDialogPlayable },
props: { item: { required: true, type: Object }, show: Boolean }, props: { item: { required: true, type: Object }, show: Boolean },
emits: ['close'], emits: ['close'],
computed: {
actions() {
return [
{
label: this.$t('dialog.spotify.playlist.add'),
handler: this.queue_add,
icon: 'playlist-plus'
},
{
label: this.$t('dialog.spotify.playlist.add-next'),
handler: this.queue_add_next,
icon: 'playlist-play'
},
{
label: this.$t('dialog.spotify.playlist.play'),
handler: this.play,
icon: 'play'
}
]
}
},
methods: { methods: {
open() { open() {
this.$emit('close') this.$emit('close')
@ -66,18 +44,6 @@ export default {
name: 'playlist-spotify', name: 'playlist-spotify',
params: { id: this.item.id } params: { id: this.item.id }
}) })
},
play() {
this.$emit('close')
webapi.player_play_uri(this.item.uri, false)
},
queue_add() {
this.$emit('close')
webapi.queue_add(this.item.uri)
},
queue_add_next() {
this.$emit('close')
webapi.queue_add_next(this.item.uri)
} }
} }
} }

View File

@ -1,5 +1,5 @@
<template> <template>
<modal-dialog :actions="actions" :show="show" @close="$emit('close')"> <modal-dialog-playable :item="item" :show="show" @close="$emit('close')">
<template #content> <template #content>
<p class="title is-4" v-text="item.title" /> <p class="title is-4" v-text="item.title" />
<p class="subtitle" v-text="item.artist" /> <p class="subtitle" v-text="item.artist" />
@ -150,18 +150,18 @@
<div class="title is-6" v-text="item.comment" /> <div class="title is-6" v-text="item.comment" />
</div> </div>
</template> </template>
</modal-dialog> </modal-dialog-playable>
</template> </template>
<script> <script>
import ModalDialog from '@/components/ModalDialog.vue' import ModalDialogPlayable from '@/components/ModalDialogPlayable.vue'
import SpotifyWebApi from 'spotify-web-api-js' 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'
export default { export default {
name: 'ModalDialogTrack', name: 'ModalDialogTrack',
components: { ModalDialog }, components: { ModalDialogPlayable },
props: { item: { required: true, type: Object }, show: Boolean }, props: { item: { required: true, type: Object }, show: Boolean },
emits: ['close', 'play-count-changed'], emits: ['close', 'play-count-changed'],
setup() { setup() {
@ -172,27 +172,6 @@ export default {
spotify_track: {} spotify_track: {}
} }
}, },
computed: {
actions() {
return [
{
label: this.$t('dialog.track.add'),
handler: this.queue_add,
icon: 'playlist-plus'
},
{
label: this.$t('dialog.track.add-next'),
handler: this.queue_add_next,
icon: 'playlist-play'
},
{
label: this.$t('dialog.track.play'),
handler: this.play,
icon: 'play'
}
]
}
},
watch: { watch: {
item() { item() {
if ( if (
@ -282,18 +261,6 @@ export default {
params: { name: this.item.genre }, params: { name: this.item.genre },
query: { media_kind: this.item.media_kind } query: { media_kind: this.item.media_kind }
}) })
},
play() {
this.$emit('close')
webapi.player_play_uri(this.item.uri, false)
},
queue_add() {
this.$emit('close')
webapi.queue_add(this.item.uri)
},
queue_add_next() {
this.$emit('close')
webapi.queue_add_next(this.item.uri)
} }
} }
} }

View File

@ -1,5 +1,5 @@
<template> <template>
<modal-dialog :actions="actions" :show="show" @close="$emit('close')"> <modal-dialog-playable :item="item" :show="show" @close="$emit('close')">
<template #content> <template #content>
<p class="title is-4" v-text="item.name" /> <p class="title is-4" v-text="item.name" />
<p class="subtitle" v-text="item.artists[0].name" /> <p class="subtitle" v-text="item.artists[0].name" />
@ -59,39 +59,17 @@
<div class="title is-6" v-text="item.uri" /> <div class="title is-6" v-text="item.uri" />
</div> </div>
</template> </template>
</modal-dialog> </modal-dialog-playable>
</template> </template>
<script> <script>
import ModalDialog from '@/components/ModalDialog.vue' import ModalDialogPlayable from '@/components/ModalDialogPlayable.vue'
import webapi from '@/webapi'
export default { export default {
name: 'ModalDialogTrackSpotify', name: 'ModalDialogTrackSpotify',
components: { ModalDialog }, components: { ModalDialogPlayable },
props: { item: { required: true, type: Object }, show: Boolean }, props: { item: { required: true, type: Object }, show: Boolean },
emits: ['close'], emits: ['close'],
computed: {
actions() {
return [
{
label: this.$t('dialog.spotify.track.add'),
handler: this.queue_add,
icon: 'playlist-plus'
},
{
label: this.$t('dialog.spotify.track.add-next'),
handler: this.queue_add_next,
icon: 'playlist-play'
},
{
label: this.$t('dialog.spotify.track.play'),
handler: this.play,
icon: 'play'
}
]
}
},
methods: { methods: {
open_album() { open_album() {
this.$emit('close') this.$emit('close')
@ -106,18 +84,6 @@ export default {
name: 'music-spotify-artist', name: 'music-spotify-artist',
params: { id: this.item.artists[0].id } params: { id: this.item.artists[0].id }
}) })
},
play() {
this.$emit('close')
webapi.player_play_uri(this.item.uri, false)
},
queue_add() {
this.$emit('close')
webapi.queue_add(this.item.uri)
},
queue_add_next() {
this.$emit('close')
webapi.queue_add_next(this.item.uri)
} }
} }
} }

View File

@ -27,13 +27,10 @@
} }
}, },
"album": { "album": {
"add-next": "Als nächstes hinzufügen",
"add": "Hinzufügen",
"added-on": "Hinzugefügt am", "added-on": "Hinzugefügt am",
"artist": "Album Künstler", "artist": "Album Künstler",
"duration": "Dauer", "duration": "Dauer",
"mark-as-played": "Markiere als gespielt", "mark-as-played": "Markiere als gespielt",
"play": "Spielen",
"release-date": "Erscheinungsdatum", "release-date": "Erscheinungsdatum",
"remove-podcast": "Entferne podcast", "remove-podcast": "Entferne podcast",
"tracks": "Track Nummer", "tracks": "Track Nummer",
@ -41,35 +38,26 @@
"year": "Jahr" "year": "Jahr"
}, },
"artist": { "artist": {
"add-next": "Als nächstes hinzufügen",
"add": "Hinzufügen",
"added-on": "Hinzugefügt am", "added-on": "Hinzugefügt am",
"albums": "Alben", "albums": "Alben",
"play": "Spielen",
"tracks": "Tracks", "tracks": "Tracks",
"type": "Art" "type": "Art"
}, },
"composer": { "composer": {
"add-next": "Als nächstes hinzufügen",
"add": "Hinzufügen",
"albums": "Alben", "albums": "Alben",
"duration": "Dauer", "duration": "Dauer",
"play": "Spielen",
"tracks": "Tracks" "tracks": "Tracks"
}, },
"directory": { "genre": {
"albums": "Alben",
"duration": "Dauer",
"tracks": "Tracks"
},
"playable": {
"add-next": "Als nächstes hinzufügen", "add-next": "Als nächstes hinzufügen",
"add": "Hinzufügen", "add": "Hinzufügen",
"play": "Spielen" "play": "Spielen"
}, },
"genre": {
"add-next": "Als nächstes hinzufügen",
"add": "Hinzufügen",
"albums": "Alben",
"duration": "Dauer",
"play": "Spielen",
"tracks": "Tracks"
},
"playlist": { "playlist": {
"add-next": "Als nächstes hinzufügen", "add-next": "Als nächstes hinzufügen",
"add": "Hinzufügen", "add": "Hinzufügen",
@ -112,43 +100,29 @@
}, },
"spotify": { "spotify": {
"album": { "album": {
"add-next": "Als nächstes hinzufügen",
"add": "Hinzufügen",
"album-artist": "Album-Künstler", "album-artist": "Album-Künstler",
"play": "Spielen",
"release-date": "Erscheinungsdatum", "release-date": "Erscheinungsdatum",
"type": "Art" "type": "Art"
}, },
"artist": { "artist": {
"add-next": "Als nächstes hinzufügen",
"add": "Hinzufügen",
"genres": "Genres", "genres": "Genres",
"play": "Spielen",
"popularity": "Popularität / Followers" "popularity": "Popularität / Followers"
}, },
"playlist": { "playlist": {
"add-next": "Als nächstes hinzufügen",
"add": "Hinzufügen",
"owner": "Besitzer", "owner": "Besitzer",
"path": "Pfad", "path": "Pfad",
"play": "Spielen",
"tracks": "Tracks" "tracks": "Tracks"
}, },
"track": { "track": {
"add-next": "Als nächstes hinzufügen",
"add": "Hinzufügen",
"album-artist": "Album-Künstler", "album-artist": "Album-Künstler",
"album": "Album", "album": "Album",
"duration": "Dauer", "duration": "Dauer",
"path": "Pfad", "path": "Pfad",
"play": "Spielen",
"position": "Disc / Track", "position": "Disc / Track",
"release-date": "Erscheinungsdatum" "release-date": "Erscheinungsdatum"
} }
}, },
"track": { "track": {
"add-next": "Als nächstes hinzufügen",
"add": "Hinzufügen",
"added-on": "Hinzugefügt am", "added-on": "Hinzugefügt am",
"album-artist": "Album-Künstler", "album-artist": "Album-Künstler",
"album": "Album", "album": "Album",
@ -161,7 +135,6 @@
"mark-as-new": "Markiere als neu", "mark-as-new": "Markiere als neu",
"mark-as-played": "Markiere als gespielt", "mark-as-played": "Markiere als gespielt",
"path": "Pfad", "path": "Pfad",
"play": "Spielen",
"position": "Disc / Track", "position": "Disc / Track",
"quality": "Qualität", "quality": "Qualität",
"rating-value": "{rating} / 10", "rating-value": "{rating} / 10",

View File

@ -27,13 +27,10 @@
} }
}, },
"album": { "album": {
"add-next": "Add Next",
"add": "Add",
"added-on": "Added on", "added-on": "Added on",
"artist": "Album artist", "artist": "Album artist",
"duration": "Duration", "duration": "Duration",
"mark-as-played": "Mark as played", "mark-as-played": "Mark as played",
"play": "Play",
"release-date": "Release date", "release-date": "Release date",
"remove-podcast": "Remove podcast", "remove-podcast": "Remove podcast",
"tracks": "Tracks", "tracks": "Tracks",
@ -41,35 +38,26 @@
"year": "Year" "year": "Year"
}, },
"artist": { "artist": {
"add-next": "Add Next",
"add": "Add",
"added-on": "Added On", "added-on": "Added On",
"albums": "Albums", "albums": "Albums",
"play": "Play",
"tracks": "Tracks", "tracks": "Tracks",
"type": "Type" "type": "Type"
}, },
"composer": { "composer": {
"add-next": "Add Next",
"add": "Add",
"albums": "Albums", "albums": "Albums",
"duration": "Duration", "duration": "Duration",
"play": "Play",
"tracks": "Tracks" "tracks": "Tracks"
}, },
"directory": { "genre": {
"albums": "Albums",
"duration": "Duration",
"tracks": "Tracks"
},
"playable": {
"add-next": "Add Next", "add-next": "Add Next",
"add": "Add", "add": "Add",
"play": "Play" "play": "Play"
}, },
"genre": {
"add-next": "Add Next",
"add": "Add",
"albums": "Albums",
"duration": "Duration",
"play": "Play",
"tracks": "Tracks"
},
"playlist": { "playlist": {
"add-next": "Add Next", "add-next": "Add Next",
"add": "Add", "add": "Add",
@ -112,43 +100,29 @@
}, },
"spotify": { "spotify": {
"album": { "album": {
"add-next": "Add Next",
"add": "Add",
"album-artist": "Album Artist", "album-artist": "Album Artist",
"play": "Play",
"release-date": "Release Date", "release-date": "Release Date",
"type": "Type" "type": "Type"
}, },
"artist": { "artist": {
"add-next": "Add Next",
"add": "Add",
"genres": "Genres", "genres": "Genres",
"play": "Play",
"popularity": "Popularity / Followers" "popularity": "Popularity / Followers"
}, },
"playlist": { "playlist": {
"add-next": "Add Next",
"add": "Add",
"owner": "Owner", "owner": "Owner",
"path": "Path", "path": "Path",
"play": "Play",
"tracks": "Tracks" "tracks": "Tracks"
}, },
"track": { "track": {
"add-next": "Add Next",
"add": "Add",
"album-artist": "Album Artist", "album-artist": "Album Artist",
"album": "Album", "album": "Album",
"duration": "Duration", "duration": "Duration",
"path": "Path", "path": "Path",
"play": "Play",
"position": "Disc / Track", "position": "Disc / Track",
"release-date": "Release Date" "release-date": "Release Date"
} }
}, },
"track": { "track": {
"add-next": "Add Next",
"add": "Add",
"added-on": "Added On", "added-on": "Added On",
"album-artist": "Album Artist", "album-artist": "Album Artist",
"album": "Album", "album": "Album",
@ -161,7 +135,6 @@
"mark-as-new": "Mark as new", "mark-as-new": "Mark as new",
"mark-as-played": "Mark as played", "mark-as-played": "Mark as played",
"path": "Path", "path": "Path",
"play": "Play",
"position": "Disc / Track", "position": "Disc / Track",
"quality": "Quality", "quality": "Quality",
"rating-value": "{rating} / 10", "rating-value": "{rating} / 10",

View File

@ -27,13 +27,10 @@
} }
}, },
"album": { "album": {
"add-next": "Ajouter ensuite",
"add": "Ajouter",
"added-on": "Ajouté le", "added-on": "Ajouté le",
"artist": "Artiste de lalbum", "artist": "Artiste de lalbum",
"duration": "Durée", "duration": "Durée",
"mark-as-played": "Marquer comme lu", "mark-as-played": "Marquer comme lu",
"play": "Lire",
"release-date": "Date de sortie", "release-date": "Date de sortie",
"remove-podcast": "Supprimer le podcast", "remove-podcast": "Supprimer le podcast",
"tracks": "Pistes", "tracks": "Pistes",
@ -41,35 +38,26 @@
"year": "Année" "year": "Année"
}, },
"artist": { "artist": {
"add-next": "Ajouter ensuite",
"add": "Ajouter",
"added-on": "Ajouté le", "added-on": "Ajouté le",
"albums": "Albums", "albums": "Albums",
"play": "Lire",
"tracks": "Pistes", "tracks": "Pistes",
"type": "Type" "type": "Type"
}, },
"composer": { "composer": {
"add-next": "Ajouter ensuite",
"add": "Ajouter",
"albums": "Albums", "albums": "Albums",
"duration": "Durée", "duration": "Durée",
"play": "Lire",
"tracks": "Pistes" "tracks": "Pistes"
}, },
"directory": { "genre": {
"albums": "Albums",
"duration": "Durée",
"tracks": "Pistes"
},
"playable": {
"add-next": "Ajouter ensuite", "add-next": "Ajouter ensuite",
"add": "Ajouter", "add": "Ajouter",
"play": "Lire" "play": "Lire"
}, },
"genre": {
"add-next": "Ajouter ensuite",
"add": "Ajouter",
"albums": "Albums",
"duration": "Durée",
"play": "Lire",
"tracks": "Pistes"
},
"playlist": { "playlist": {
"add-next": "Ajouter ensuite", "add-next": "Ajouter ensuite",
"add": "Ajouter", "add": "Ajouter",
@ -112,43 +100,29 @@
}, },
"spotify": { "spotify": {
"album": { "album": {
"add-next": "Ajouter ensuite",
"add": "Ajouter",
"album-artist": "Artiste de lalbum", "album-artist": "Artiste de lalbum",
"play": "Lire",
"release-date": "Date de sortie", "release-date": "Date de sortie",
"type": "Type" "type": "Type"
}, },
"artist": { "artist": {
"add-next": "Ajouter ensuite",
"add": "Ajouter",
"genres": "Genres", "genres": "Genres",
"play": "Lire",
"popularity": "Popularité / Abonnements" "popularity": "Popularité / Abonnements"
}, },
"playlist": { "playlist": {
"add-next": "Ajouter ensuite",
"add": "Ajouter",
"owner": "Propriétaire", "owner": "Propriétaire",
"path": "Emplacement", "path": "Emplacement",
"play": "Lire",
"tracks": "Pistes" "tracks": "Pistes"
}, },
"track": { "track": {
"add-next": "Ajouter ensuite",
"add": "Ajouter",
"album-artist": "Artiste de lalbum", "album-artist": "Artiste de lalbum",
"album": "Album", "album": "Album",
"duration": "Durée", "duration": "Durée",
"path": "Emplacement", "path": "Emplacement",
"play": "Lire",
"position": "Disque / Piste", "position": "Disque / Piste",
"release-date": "Date de sortie" "release-date": "Date de sortie"
} }
}, },
"track": { "track": {
"add-next": "Ajouter ensuite",
"add": "Ajouter",
"added-on": "Ajouté le", "added-on": "Ajouté le",
"album-artist": "Artiste de lalbum", "album-artist": "Artiste de lalbum",
"album": "Album", "album": "Album",
@ -161,7 +135,6 @@
"mark-as-new": "Marquer comme nouveau", "mark-as-new": "Marquer comme nouveau",
"mark-as-played": "Marquer comme lu", "mark-as-played": "Marquer comme lu",
"path": "Emplacement", "path": "Emplacement",
"play": "Lire",
"position": "Disque / Piste", "position": "Disque / Piste",
"quality": "Qualité", "quality": "Qualité",
"rating-value": "{rating} / 10", "rating-value": "{rating} / 10",

View File

@ -27,13 +27,10 @@
} }
}, },
"album": { "album": {
"add-next": "插播",
"add": "添加",
"added-on": "添加时间", "added-on": "添加时间",
"artist": "专辑艺人", "artist": "专辑艺人",
"duration": "时长", "duration": "时长",
"mark-as-played": "标记为已播", "mark-as-played": "标记为已播",
"play": "播放",
"release-date": "发行日期", "release-date": "发行日期",
"remove-podcast": "移除播客", "remove-podcast": "移除播客",
"tracks": "只曲目", "tracks": "只曲目",
@ -41,35 +38,26 @@
"year": "年份" "year": "年份"
}, },
"artist": { "artist": {
"add-next": "插播",
"add": "添加",
"added-on": "添加时间", "added-on": "添加时间",
"albums": "张专辑", "albums": "张专辑",
"play": "播放",
"tracks": "只曲目", "tracks": "只曲目",
"type": "类型" "type": "类型"
}, },
"composer": { "composer": {
"add-next": "插播",
"add": "添加",
"albums": "张专辑", "albums": "张专辑",
"duration": "时长", "duration": "时长",
"play": "播放",
"tracks": "只曲目" "tracks": "只曲目"
}, },
"directory": { "genre": {
"albums": "张专辑",
"duration": "时长",
"tracks": "只曲目"
},
"playable": {
"add-next": "插播", "add-next": "插播",
"add": "添加", "add": "添加",
"play": "播放" "play": "播放"
}, },
"genre": {
"add-next": "插播",
"add": "添加",
"albums": "张专辑",
"duration": "时长",
"play": "播放",
"tracks": "只曲目"
},
"playlist": { "playlist": {
"add-next": "插播", "add-next": "插播",
"add": "添加", "add": "添加",
@ -112,43 +100,29 @@
}, },
"spotify": { "spotify": {
"album": { "album": {
"add-next": "插播",
"add": "添加",
"album-artist": "专辑艺人", "album-artist": "专辑艺人",
"play": "播放",
"release-date": "发行日期", "release-date": "发行日期",
"type": "类型" "type": "类型"
}, },
"artist": { "artist": {
"add-next": "插播",
"add": "添加",
"genres": "流派", "genres": "流派",
"play": "播放",
"popularity": "流行度 / 粉丝数" "popularity": "流行度 / 粉丝数"
}, },
"playlist": { "playlist": {
"add-next": "插播",
"add": "添加",
"owner": "所有者", "owner": "所有者",
"path": "路径", "path": "路径",
"play": "播放",
"tracks": "曲目" "tracks": "曲目"
}, },
"track": { "track": {
"add-next": "插播",
"add": "添加",
"album-artist": "专辑艺人", "album-artist": "专辑艺人",
"album": "专辑", "album": "专辑",
"duration": "时长", "duration": "时长",
"path": "路径", "path": "路径",
"play": "播放",
"position": "盘符 / 曲目", "position": "盘符 / 曲目",
"release-date": "发行日期" "release-date": "发行日期"
} }
}, },
"track": { "track": {
"add-next": "插播",
"add": "添加",
"added-on": "添加时间", "added-on": "添加时间",
"album-artist": "专辑艺人", "album-artist": "专辑艺人",
"album": "专辑", "album": "专辑",
@ -161,7 +135,6 @@
"mark-as-new": "标记为最新", "mark-as-new": "标记为最新",
"mark-as-played": "标记为已播放", "mark-as-played": "标记为已播放",
"path": "路径", "path": "路径",
"play": "播放",
"position": "盘符 / 曲目", "position": "盘符 / 曲目",
"quality": "质量", "quality": "质量",
"rating-value": "{rating} / 10", "rating-value": "{rating} / 10",

View File

@ -27,13 +27,10 @@
} }
}, },
"album": { "album": {
"add-next": "插播",
"add": "新增",
"added-on": "新增時間", "added-on": "新增時間",
"artist": "專輯藝人", "artist": "專輯藝人",
"duration": "時長", "duration": "時長",
"mark-as-played": "標記為已播", "mark-as-played": "標記為已播",
"play": "播放",
"release-date": "發行日期", "release-date": "發行日期",
"remove-podcast": "移除Podcast", "remove-podcast": "移除Podcast",
"tracks": "首曲目", "tracks": "首曲目",
@ -41,35 +38,26 @@
"year": "年份" "year": "年份"
}, },
"artist": { "artist": {
"add-next": "插播",
"add": "新增",
"added-on": "新增時間", "added-on": "新增時間",
"albums": "張專輯", "albums": "張專輯",
"play": "播放",
"tracks": "首曲目", "tracks": "首曲目",
"type": "類型" "type": "類型"
}, },
"composer": { "composer": {
"add-next": "插播",
"add": "新增",
"albums": "張專輯", "albums": "張專輯",
"duration": "時長", "duration": "時長",
"play": "播放",
"tracks": "首曲目" "tracks": "首曲目"
}, },
"directory": { "genre": {
"albums": "張專輯",
"duration": "時長",
"tracks": "首曲目"
},
"playable": {
"add-next": "插播", "add-next": "插播",
"add": "新增", "add": "新增",
"play": "播放" "play": "播放"
}, },
"genre": {
"add-next": "插播",
"add": "新增",
"albums": "張專輯",
"duration": "時長",
"play": "播放",
"tracks": "首曲目"
},
"playlist": { "playlist": {
"add-next": "插播", "add-next": "插播",
"add": "新增", "add": "新增",
@ -112,43 +100,29 @@
}, },
"spotify": { "spotify": {
"album": { "album": {
"add-next": "插播",
"add": "新增",
"album-artist": "專輯藝人", "album-artist": "專輯藝人",
"play": "播放",
"release-date": "發行日期", "release-date": "發行日期",
"type": "類型" "type": "類型"
}, },
"artist": { "artist": {
"add-next": "插播",
"add": "新增",
"genres": "音樂類型", "genres": "音樂類型",
"play": "播放",
"popularity": "流行度 / 粉絲數" "popularity": "流行度 / 粉絲數"
}, },
"playlist": { "playlist": {
"add-next": "插播",
"add": "新增",
"owner": "所有者", "owner": "所有者",
"path": "路徑", "path": "路徑",
"play": "播放",
"tracks": "曲目" "tracks": "曲目"
}, },
"track": { "track": {
"add-next": "插播",
"add": "新增",
"album-artist": "專輯藝人", "album-artist": "專輯藝人",
"album": "專輯", "album": "專輯",
"duration": "時長", "duration": "時長",
"path": "路徑", "path": "路徑",
"play": "播放",
"position": "盤符 / 曲目", "position": "盤符 / 曲目",
"release-date": "發行日期" "release-date": "發行日期"
} }
}, },
"track": { "track": {
"add-next": "插播",
"add": "新增",
"added-on": "新增時間", "added-on": "新增時間",
"album-artist": "專輯藝人", "album-artist": "專輯藝人",
"album": "專輯", "album": "專輯",
@ -161,7 +135,6 @@
"mark-as-new": "標記為最新", "mark-as-new": "標記為最新",
"mark-as-played": "標記為已播放", "mark-as-played": "標記為已播放",
"path": "路徑", "path": "路徑",
"play": "播放",
"position": "盤符 / 曲目", "position": "盤符 / 曲目",
"quality": "品質", "quality": "品質",
"rating-value": "{rating} / 10", "rating-value": "{rating} / 10",