mastoradio/src/components/Viewer.svelte

150 lines
3.6 KiB
Svelte
Raw Normal View History

2020-01-10 03:02:46 +01:00
<div>
2020-01-18 05:05:37 +01:00
<div class="embed-container" class:hidden={!loaded}>
2020-01-10 15:16:48 +01:00
<div bind:this={element}></div>
2020-01-16 20:10:40 +01:00
<div class="embed-overlay" on:click={() => $paused = !$paused}></div>
2020-01-10 15:16:48 +01:00
</div>
2020-01-18 05:05:37 +01:00
{#if !loaded}
LOADING TRACK
{/if}
2020-01-10 15:16:48 +01:00
{#if duration}
2020-01-13 14:39:00 +01:00
{currentTimeText}
2020-01-16 20:10:40 +01:00
<input
type="range"
min="0"
max={duration}
value={currentTime}
on:input={ (e) => updatePlayerCurrentTime(e.target.value) }
on:mousedown={() => { if (player && !$paused) player.pause() }}
on:mouseup={() => { if (player && !$paused) player.play() }}>
2020-01-13 14:39:00 +01:00
{durationText}
2020-01-10 15:16:48 +01:00
{/if}
2020-01-10 03:02:46 +01:00
</div>
<script>
2020-01-10 15:16:48 +01:00
import { onMount, onDestroy } from 'svelte'
2020-01-10 03:02:46 +01:00
import { get } from 'svelte/store'
import YoutubePlayer from 'yt-player'
2020-01-13 14:39:00 +01:00
import { secondsToElapsedTime } from '/util.js'
2020-01-16 20:10:40 +01:00
import { paused, muted, volume, current, selectNext, loading } from '/store.js'
2020-01-10 03:02:46 +01:00
let element
let player
2020-01-10 15:16:48 +01:00
let currentTime = null
let duration = null
2020-01-18 05:05:37 +01:00
let loaded = false
2020-01-10 15:16:48 +01:00
2020-01-13 14:39:00 +01:00
let currentTimeText = null
let durationText = null
$: currentTimeText = currentTime !== null ? secondsToElapsedTime(currentTime) : null
$: durationText = duration !== null ? secondsToElapsedTime(duration) : null
2020-01-16 20:10:40 +01:00
$: updatePlayerVideoId($current)
$: updatePlayerPaused($paused)
$: updatePlayerMuted($muted)
$: updatePlayerVolume($volume)
2020-01-10 03:02:46 +01:00
2020-01-10 15:16:48 +01:00
const updateViewerDurationCallback = () => {
if (player) {
duration = player.getDuration()
currentTime = player.getCurrentTime()
2020-01-16 20:10:40 +01:00
$loading = false
2020-01-10 15:16:48 +01:00
}
}
2020-01-16 20:10:40 +01:00
const updatePlayerVideoId = ($current) => {
if (player && $current) {
2020-01-10 15:16:48 +01:00
duration = null
currentTime = null
2020-01-16 20:10:40 +01:00
$loading = true
2020-01-18 05:05:37 +01:00
loaded = false
2020-01-10 15:16:48 +01:00
player.off('playing', updateViewerDurationCallback)
2020-01-16 20:10:40 +01:00
player.load($current.data.id, !$paused)
2020-01-10 15:16:48 +01:00
}
2020-01-10 03:02:46 +01:00
}
2020-01-16 20:10:40 +01:00
const updatePlayerPaused = (paused) => {
2020-01-10 15:16:48 +01:00
if (player) paused ? player.pause() : player.play()
2020-01-10 03:02:46 +01:00
}
2020-01-16 20:10:40 +01:00
const updatePlayerMuted = (muted) => {
2020-01-10 03:02:46 +01:00
if (player) muted ? player.mute() : player.unMute()
}
2020-01-16 20:10:40 +01:00
const updatePlayerVolume = (volume) => {
2020-01-10 03:42:02 +01:00
if (player) player.setVolume(volume)
}
2020-01-16 20:10:40 +01:00
const updatePlayerCurrentTime = (seconds) => {
if (player) player.seek(seconds)
}
2020-01-10 15:16:48 +01:00
2020-01-10 03:02:46 +01:00
onMount(() => {
player = new YoutubePlayer(element, {
width: 300,
height: 300,
2020-01-10 15:16:48 +01:00
autoplay: !$paused,
2020-01-10 14:30:17 +01:00
controls: false,
2020-01-10 03:02:46 +01:00
keyboard: false,
fullscreen: false,
modestBranding: true,
related: false
})
2020-01-16 20:10:40 +01:00
updatePlayerPaused($paused)
updatePlayerMuted($muted)
updatePlayerVolume($volume)
2020-01-10 15:16:48 +01:00
player.on('unstarted', () => {
2020-01-18 05:05:37 +01:00
loaded = true
2020-01-10 15:16:48 +01:00
player.once('playing', updateViewerDurationCallback)
})
player.on('timeupdate', (time) => {
currentTime = time
})
2020-01-16 20:10:40 +01:00
player.on('ended', () => {
selectNext()
})
2020-01-10 14:30:17 +01:00
player.on('unplayable', (...args) => {
console.log('unplayable', ...args)
2020-01-16 20:10:40 +01:00
selectNext()
2020-01-10 14:30:17 +01:00
})
2020-01-11 16:57:59 +01:00
player.on('error', (...args) => {
console.log('error', ...args)
2020-01-16 20:10:40 +01:00
selectNext()
2020-01-11 16:57:59 +01:00
})
2020-01-10 03:02:46 +01:00
})
2020-01-10 15:16:48 +01:00
onDestroy(() => {
if (player) {
player.destroy()
}
})
2020-01-10 03:02:46 +01:00
</script>
<style>
2020-01-13 14:39:00 +01:00
.hidden {
display: none;
}
2020-01-16 20:10:40 +01:00
.embed-container {
position: relative;
}
.embed-overlay {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
2020-01-10 03:02:46 +01:00
</style>