Added video.js player with VR support for trailers.

This commit is contained in:
DebaucheryLibrarian
2021-02-04 03:06:19 +01:00
parent 91ba916884
commit 98cae9270a
9 changed files with 2082 additions and 19 deletions

View File

@@ -8,29 +8,26 @@
v-if="release.trailer || release.teaser"
class="trailer-container"
>
<video
<Player
v-if="release.trailer"
:src="`/media/${release.trailer.path}`"
:video="release.trailer"
:poster="poster"
:alt="release.title"
:class="{ sfw: sfw && paused }"
class="item trailer"
controls
@playing="playing = true; paused = false;"
class="item"
@play="playing = true; paused = false;"
@pause="playing = false; paused = true;"
>Sorry, the tailer cannot be played in your browser</video>
/>
<video
<Player
v-else-if="release.teaser && /^video\//.test(release.teaser.mime)"
:src="`/media/${release.teaser.path}`"
:video="release.teaser"
:poster="poster"
:alt="release.title"
:class="{ sfw: sfw && paused }"
class="item trailer"
controls
@playing="playing = true; paused = false;"
class="item"
@play="playing = true; paused = false;"
@pause="playing = false; paused = true;"
>Sorry, the tailer cannot be played in your browser</video>
/>
<img
v-else-if="release.teaser && /^image\//.test(release.teaser.mime)"
@@ -110,6 +107,8 @@
</template>
<script>
import Player from '../video/player.vue';
function sfw() {
return this.$store.state.ui.sfw;
}
@@ -151,6 +150,9 @@ function photos() {
}
export default {
components: {
Player,
},
props: {
release: {
type: Object,
@@ -167,6 +169,7 @@ export default {
},
data() {
return {
player: null,
playing: false,
paused: false,
};

View File

@@ -0,0 +1,122 @@
<template>
<video
ref="player"
:poster="poster"
class="player video-js vjs-big-play-centered"
@playing="$emit('play')"
@pause="$emit('pause')"
>
<source
:src="`/media/${video.path}`"
type="video/mp4"
>
</video>
</template>
<script>
import videoJs from 'video.js';
import 'videojs-vr/dist/videojs-vr.min';
function mounted() {
this.player = videoJs(this.$refs.player, {
controls: true,
inactivityTimeout: 1000,
controlBar: {
pictureInPictureToggle: false,
volumePanel: {
inline: false,
},
},
}, () => {
if (this.video.isVr) {
this.player.vr({ projection: '180' });
}
});
}
export default {
props: {
video: {
type: Object,
default: null,
},
poster: {
type: String,
default: null,
},
},
mounted,
};
</script>
<style lang="scss">
.player.video-js {
.vjs-poster {
background-size: cover;
}
.vjs-control-bar {
background-color: var(--darken);
}
.vjs-slider {
background-color: var(--darken-weak);
}
.vjs-play-progress {
background-color: var(--primary);
.vjs-time-tooltip {
color: var(--darken-strong);
}
}
.vjs-load-progress {
background-color: var(--lighten-weak);
div {
background-color: var(--darken-weak);
}
}
.vjs-mouse-display .vjs-time-tooltip {
background-color: var(--darken-strong);
}
.vjs-remaining-time {
line-height: 2rem;
font-size: .75rem;
font-weight: bold;
}
.vjs-big-play-button {
background-color: var(--darken);
width: 4rem;
height: 4rem;
margin: -2rem 0 0 -2rem;
border: none;
border-radius: 50%;
.vjs-icon-placeholder {
font-size: 2.5rem;
line-height: 4rem;
}
&:hover {
background-color: var(--primary);
}
}
.vjs-control:focus::before,
.vjs-control:hover::before,
.vjs-control:focus {
text-shadow: 0 0 .5rem var(--lighten-strong);
}
&:hover {
.vjs-big-play-button {
background-color: var(--primary);
}
}
}
</style>

1663
assets/css/_video.scss Normal file

File diff suppressed because one or more lines are too long

View File

@@ -2,6 +2,7 @@
@import 'forms';
@import 'inputs';
@import 'states';
@import 'video';
@import 'tooltip';
html,

View File

@@ -160,6 +160,7 @@ const releaseTrailerFragment = `
path
thumbnail
mime
isVr
}
}
`;