2023-11-14 21:47:36 +01:00
|
|
|
<template>
|
|
|
|
<div class="media-youtube-playlists">
|
|
|
|
<div class="playlists-index" v-if="!selectedPlaylist">
|
|
|
|
<Loading v-if="loading" />
|
|
|
|
<NoItems :with-shadow="false" v-else-if="!playlists?.length">
|
|
|
|
No playlists found.
|
|
|
|
</NoItems>
|
|
|
|
|
|
|
|
<div class="body grid" v-else>
|
|
|
|
<div class="playlist item"
|
|
|
|
v-for="(playlist, id) in playlistsById"
|
|
|
|
:key="id"
|
2023-11-14 22:32:25 +01:00
|
|
|
@click="$emit('select', playlist)">
|
2023-11-14 21:47:36 +01:00
|
|
|
<MediaImage :item="playlist" :has-play="false" />
|
|
|
|
<div class="title">{{ playlist.name }}</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="playlist-body" v-else>
|
|
|
|
<Playlist :id="selectedPlaylist" @play="$emit('play', $event)" />
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
|
|
import MediaImage from "@/components/panels/Media/MediaImage";
|
|
|
|
import NoItems from "@/components/elements/NoItems";
|
|
|
|
import Loading from "@/components/Loading";
|
|
|
|
import Playlist from "./Playlist";
|
|
|
|
import Utils from "@/Utils";
|
|
|
|
|
|
|
|
export default {
|
2023-11-14 22:32:25 +01:00
|
|
|
emits: ['play', 'select'],
|
2023-11-14 21:47:36 +01:00
|
|
|
mixins: [Utils],
|
|
|
|
components: {
|
|
|
|
Loading,
|
|
|
|
MediaImage,
|
|
|
|
NoItems,
|
|
|
|
Playlist,
|
|
|
|
},
|
|
|
|
|
2023-11-14 22:32:25 +01:00
|
|
|
props: {
|
|
|
|
selectedPlaylist: {
|
|
|
|
type: String,
|
|
|
|
default: null,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
2023-11-14 21:47:36 +01:00
|
|
|
data() {
|
|
|
|
return {
|
|
|
|
playlists: [],
|
|
|
|
loading: false,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
computed: {
|
|
|
|
playlistsById() {
|
|
|
|
return this.playlists.reduce((acc, playlist) => {
|
|
|
|
acc[playlist.id] = playlist
|
|
|
|
return acc
|
|
|
|
}, {})
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
methods: {
|
|
|
|
async loadPlaylists() {
|
|
|
|
this.loading = true
|
|
|
|
try {
|
|
|
|
this.playlists = (await this.request('youtube.get_playlists'))
|
|
|
|
} finally {
|
|
|
|
this.loading = false
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
mounted() {
|
|
|
|
this.loadPlaylists()
|
|
|
|
},
|
|
|
|
}
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
|
.media-youtube-playlists {
|
|
|
|
height: 100%;
|
|
|
|
overflow: auto;
|
|
|
|
|
2023-11-14 22:32:25 +01:00
|
|
|
:deep(.playlist.item) {
|
2023-11-14 21:47:36 +01:00
|
|
|
cursor: pointer;
|
|
|
|
|
2023-11-14 22:32:25 +01:00
|
|
|
.title {
|
|
|
|
font-size: 1.1em;
|
|
|
|
margin-top: 0.5em;
|
|
|
|
}
|
|
|
|
|
2023-11-14 21:47:36 +01:00
|
|
|
&:hover {
|
|
|
|
text-decoration: underline;
|
2023-11-14 22:32:25 +01:00
|
|
|
|
|
|
|
img {
|
|
|
|
filter: contrast(70%);
|
|
|
|
}
|
2023-11-14 21:47:36 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
</style>
|