I am using Vue so this code example may not be of help.
<template>
<div>
<IonModal
class="video-player-modal auto-height"
:is-open="showVideoViewer"
@did-present="createPlayer"
@did-dismiss="$emit('onVideoClose')"
>
<div class="inner-content p-2">
<div
:id="playerId"
:data-plyr-provider="videoType"
:data-plyr-embed-id="playerVideoId"
></div>
</div>
</IonModal>
</div>
</template>
<script lang="ts">
import { computed, defineComponent, onUnmounted } from 'vue'
import { IonModal } from '@ionic/vue'
import Plyr from 'plyr'
import { MediaHelper } from '@/utils/media-helper'
import { LoadingComponent } from '@/utils/loading-component'
export default defineComponent({
components: {
IonModal,
},
name: 'VideoPlayer',
emits: {
onVideoStart: null,
onVideoPause: null,
onVideoEnd: null,
onVideoClose: null,
},
props: {
videoId: {
type: String,
required: true,
},
playerId: {
type: String,
required: false,
default: 'video-player',
},
showVideoViewer: {
type: Boolean,
required: false,
default: false,
},
},
setup(props, { emit }) {
const playerVideoId = computed(() => {
const videoIdParts = props.videoId.split(':')
if (videoIdParts.length !== 2) {
return ''
}
return videoIdParts[1]
})
const videoType = computed(() => MediaHelper.determineVideoType(props.videoId))
let player: Plyr
const createPlayer = async () => {
const loader = await LoadingComponent.create({ definedText: 'Loading' })
loader.present()
player = new Plyr('#' + props.playerId, {
debug: false,
autopause: false,
controls: [
'play',
'progress',
'current-time',
'mute',
'captions',
'settings',
'fullscreen',
],
storage: {
enabled: false,
},
})
player.on('ready', () => {
loader.dismiss()
})
player.on('playing', () => emit('onVideoStart'))
player.on('pause', () => emit('onVideoPause'))
player.on('ended', () => emit('onVideoEnd'))
}
const destroyPlayer = () => {
if (player != null) {
player.destroy()
}
}
onUnmounted(() => {
destroyPlayer()
})
return {
// Computed properties
playerVideoId,
videoType,
// Methods
createPlayer,
}
},
})
</script>