FEAT: evilspins v3 :: tracks info in player
This commit is contained in:
152
pages/compilations/[id].vue
Normal file
152
pages/compilations/[id].vue
Normal file
@@ -0,0 +1,152 @@
|
||||
<template @keydown.esc="closePlayer()">
|
||||
<div class="bg-black text-white w-full flex items-center flex-col">
|
||||
<button class="text-sm md:text-5xl leading-none button button--close m-3 flex justify-center items-center z-50" @click="closePlayer()">
|
||||
</button>
|
||||
|
||||
<video class="mixPlayer w-full" controls ref="mixPlayer">
|
||||
<source :src="videoSD" type="video/mp4">
|
||||
</video>
|
||||
<nav class="text-esyellow w-full flex">
|
||||
<button v-for="(track, index) in tracks" @click="listenTo(track.start)"
|
||||
class="border-l-wihte-400 border-l-2 flex-grow hover:bg-esyellow hover:text-black"
|
||||
:class="{ 'border-l-0': index === 0 }">
|
||||
<span class="block">
|
||||
{{ index + 1 }}
|
||||
</span>
|
||||
<span class="hidden 2xl:block">
|
||||
{{ track.title }}
|
||||
</span>
|
||||
<span class="hidden lg:block">
|
||||
{{ store.getArtistById(track.artist).name }}
|
||||
</span>
|
||||
</button>
|
||||
</nav>
|
||||
|
||||
<article class="text-white p-8 max-w-5xl" v-if="currentTrack">
|
||||
<div class="flex items-center">
|
||||
<div class="mr-4">
|
||||
<img class="flex-grow-0" :src="'https://f4.bcbits.com/img/' + currentTrack.cover + '_8.jpg'" />
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="text-5xl">
|
||||
{{ currentTrack.title }}
|
||||
</h3>
|
||||
<h2 class="font-bold text-6xl text-esyellow">
|
||||
{{ store.getArtistById(currentTrack.artist).name }}
|
||||
</h2>
|
||||
<h4 class="text-xl text-slate-200">
|
||||
{{ compilation.name }}
|
||||
</h4>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p class="block mt-10">
|
||||
see artist page:<br>
|
||||
<a target="_blank" class="underline text-orange-500 hover:text-orange-400" :href="store.getArtistById(currentTrack.artist).url">
|
||||
{{ store.getArtistById(currentTrack.artist).name }}
|
||||
</a><br>
|
||||
purchase the track:<br>
|
||||
<a target="_blank" class="underline text-orange-500 hover:text-orange-400" :href="currentTrack.url">
|
||||
{{ currentTrack.title }}
|
||||
</a><br>
|
||||
<br>
|
||||
</p>
|
||||
</article>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
const route = useRoute()
|
||||
const store = useDataStore()
|
||||
|
||||
const compilation = ref()
|
||||
const tracks = ref()
|
||||
const mixPlayer = ref()
|
||||
const videoSD = ref()
|
||||
const currentTrack = ref()
|
||||
|
||||
const currentArtist = computed(()=>{
|
||||
currentTrack
|
||||
})
|
||||
|
||||
const { isLoaded } = storeToRefs(store)
|
||||
|
||||
onMounted(() => {
|
||||
loadCompilation()
|
||||
})
|
||||
|
||||
watch(isLoaded, () => {
|
||||
loadCompilation()
|
||||
})
|
||||
|
||||
const watchPlayingTrack = () => {
|
||||
setInterval(() => {
|
||||
if (mixPlayer.value && compilation.value.id) {
|
||||
currentTrack.value = tracks.value.find((track: { start: number; }, index: number) => {
|
||||
const nextTrackStart = tracks.value[index + 1]?.start ?? Infinity
|
||||
return track.start <= mixPlayer.value.currentTime && mixPlayer.value.currentTime < nextTrackStart
|
||||
})
|
||||
}
|
||||
}, 1000)
|
||||
}
|
||||
|
||||
const loadCompilation = () => {
|
||||
if(isLoaded.value) {
|
||||
compilation.value = store.getCompilationById(route.params.id)
|
||||
tracks.value = store.getTracksByCompilationId(route.params.id)
|
||||
videoSD.value = 'https://files.erudi.fr/evilspins/' + compilation.value.id + '-HD.mp4'
|
||||
mixPlayer.value.load()
|
||||
mixPlayer.value.play()
|
||||
mixPlayer.value.focus()
|
||||
watchPlayingTrack()
|
||||
}
|
||||
}
|
||||
|
||||
const listenTo = (start) => {
|
||||
mixPlayer.value.currentTime = start
|
||||
mixPlayer.value.play()
|
||||
}
|
||||
|
||||
const closePlayer = async () => {
|
||||
await navigateTo('/')
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
body {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.logo {
|
||||
filter: drop-shadow(8px 8px 0 rgb(0 0 0 / 0.8));
|
||||
}
|
||||
|
||||
.mixPlayer {
|
||||
background: black;
|
||||
max-height: 70vh;
|
||||
}
|
||||
|
||||
nav > button:first-child {
|
||||
border-left: none;
|
||||
}
|
||||
|
||||
.button--close {
|
||||
position: fixed;
|
||||
right: 2vw;
|
||||
&:after {
|
||||
content: "\00d7";
|
||||
}
|
||||
}
|
||||
.button {
|
||||
text-decoration: none;
|
||||
box-shadow: 0 8px 0 0 black;
|
||||
transition: all .3s;
|
||||
border: 8px black solid;
|
||||
line-height: 100%;
|
||||
border-width: 2px;
|
||||
border-radius: 100px;
|
||||
cursor: pointer;
|
||||
color: black;
|
||||
background-color: #ffffff59;
|
||||
}
|
||||
</style>
|
Reference in New Issue
Block a user