Restarting playing after abrupt stream end

This commit is contained in:
László Károlyi 2022-07-17 13:08:30 +02:00
parent b8680ef976
commit 38477fc96b
Signed by: karolyi
GPG Key ID: 2DCAF25E55735BFE
3 changed files with 33 additions and 12 deletions

View File

@ -47,7 +47,8 @@
playlistButtonBorderColor: '#eee',
playlistActiveBorderColor: '#eee',
errormsgBackgroundColor: '#ff0022dd',
errormsgTextColor: '#dedede'
errormsgTextColor: '#dedede',
restartOnStreamEndMs: 3000
});
radioPlayer.start();
});

View File

@ -26,14 +26,15 @@ interface PlayerLocalStorage {
}
interface Config {
rootElement: HTMLDivElement,
rootElement: HTMLDivElement
streams: Array<StationItem>
bgColor: string,
playlistHoverColor: string,
playlistButtonBorderColor: string,
bgColor: string
playlistHoverColor: string
playlistButtonBorderColor: string
playlistActiveBorderColor: string
errormsgBackgroundColor: string,
errormsgBackgroundColor: string
errormsgTextColor: string
restartOnStreamEndMs: number
}
const autoplayErrorMsg =
@ -56,6 +57,8 @@ class RadioPlayer {
// private playerIcyOptions!: IcecastMetadataPlayerIcyOptions
private playerIcyOptions!: IcecastMetadataPlayerIcyOptionsWithCallbacks
private marquee!: Marquee
private timeoutStreamEndRestart: ReturnType<typeof setTimeout> | undefined
private startedStreamId: number = 1
constructor(config: Config) {
this.config = config
@ -66,8 +69,6 @@ class RadioPlayer {
}
private onClickStreamChoice(streamId: number) {
if (this.playerState.playing && this.playerState.streamId === streamId)
return
this.play(streamId)
}
@ -82,7 +83,7 @@ class RadioPlayer {
this.play(this.playerState.streamId)
}
onError(text: string, exc: Error) {
private onError(text: string, exc: Error) {
if (exc.name === 'NotAllowedError') {
this.playButton.setAttribute('title', autoplayErrorMsg)
this.playButton.classList.add('has-error')
@ -92,6 +93,16 @@ class RadioPlayer {
}
}
private onStreamEnd() {
// console.debug('onStreamEnd', this.playerState)
if (
this.playerState.playing && this.config.restartOnStreamEndMs &&
!this.timeoutStreamEndRestart)
this.timeoutStreamEndRestart = setTimeout(
this.play.bind(this, this.playerState.streamId),
this.config.restartOnStreamEndMs)
}
public start() {
// When loading the script tag with "defer", and initializing with onload
// DOMContentLoaded might have already been fired at loading
@ -123,11 +134,14 @@ class RadioPlayer {
}
play(streamId: number) {
if (this.timeoutStreamEndRestart) {
clearTimeout(this.timeoutStreamEndRestart)
this.timeoutStreamEndRestart = undefined
}
const url: string =
this.config.streams[streamId - 1]?.listenUrl
if (!url) return
this.playerState = { playing: true, streamId }
this.storeState()
this.startedStreamId = streamId
if (this.icyPlayer) {
this.icyPlayer.stop().then((x) => {
this.icyPlayer = new IcecastMetadataPlayer(url, this.playerIcyOptions)
@ -197,6 +211,9 @@ class RadioPlayer {
this.playButton.innerHTML = '<i class="fa-solid fa-pause"></i>'
this.isLoading = false;
this.errorWrapper.classList.remove('shown');
this.playerState = { playing: true, streamId: this.startedStreamId }
this.storeState()
// console.debug('onPlay', this.playerState)
},
onRetry: this.markButtonLoading.bind(this),
onStop: () => {
@ -205,7 +222,10 @@ class RadioPlayer {
const streamTitle =
this.config.streams[this.playerState.streamId - 1].streamName
this.marquee.changeTo(streamTitle)
this.playerState.playing = false
// console.debug('onStop', this.playerState)
},
onStreamEnd: this.onStreamEnd.bind(this),
onError: this.onError.bind(this),
}
root.classList.remove('hidden')

View File

@ -15,6 +15,7 @@
#karolyimusic-webplayer
&.hidden
display: none
overflow: hidden
user-select: none
background-color: var(--icyplayer-bgcolor)
width: 100%
@ -99,7 +100,6 @@
align-self: center
cursor: pointer
display: flex
border-radius: .2em
border: .15em dotted transparent
transition: background-color 200ms linear
&.active