big update with fixes and playlist/queuing capabilities #20

Merged
rudism merged 11 commits from typescript-queue into main 2023-04-09 19:30:52 -05:00
3 changed files with 43 additions and 5 deletions
Showing only changes of commit eba267cb7f - Show all commits

View File

@ -63,6 +63,7 @@ var Player = /** @class */ (function () {
this.playButton.addEventListener('click', function () { return _this.playPause(); }); this.playButton.addEventListener('click', function () { return _this.playPause(); });
this.rewButton.addEventListener('click', function () { return _this.rewind(); }); this.rewButton.addEventListener('click', function () { return _this.rewind(); });
this.ffwButton.addEventListener('click', function () { return _this.fastForward(); }); this.ffwButton.addEventListener('click', function () { return _this.fastForward(); });
this.skipButton.addEventListener('click', function () { return _this.nextEpisode(); });
this.volumeSlider.addEventListener('change', function () { return _this.setVolume(); }); this.volumeSlider.addEventListener('change', function () { return _this.setVolume(); });
// wire up mediaSession events // wire up mediaSession events
if ('mediaSession' in navigator) { if ('mediaSession' in navigator) {
@ -77,6 +78,9 @@ var Player = /** @class */ (function () {
navigator.mediaSession.setActionHandler('seekbackward', function () { navigator.mediaSession.setActionHandler('seekbackward', function () {
return _this.rewind(); return _this.rewind();
}); });
navigator.mediaSession.setActionHandler('nexttrack', function () {
return _this.nextEpisode();
});
// don't support previous track yet, queue removes them once finished // don't support previous track yet, queue removes them once finished
// wire this up to rewind instead // wire this up to rewind instead
navigator.mediaSession.setActionHandler('previoustrack', function () { navigator.mediaSession.setActionHandler('previoustrack', function () {
@ -134,7 +138,7 @@ var Player = /** @class */ (function () {
_this.setPlayButtonUI(); _this.setPlayButtonUI();
_this.stopTicker(); _this.stopTicker();
}, },
onend: function () { return _this.stopPlaybackAndResetUi(); }, onend: function () { return _this.nextEpisode(); },
onloaderror: function () { return _this.setErrorUI('Playback error'); }, onloaderror: function () { return _this.setErrorUI('Playback error'); },
}); });
return [2 /*return*/]; return [2 /*return*/];
@ -175,6 +179,17 @@ var Player = /** @class */ (function () {
this.updateTimeUI(); this.updateTimeUI();
} }
}; };
Player.prototype.nextEpisode = function () {
var next = this.playlist.nextEpisode();
if (next)
this.playEpisode(next);
else {
this.stopPlaybackAndResetUi();
// manually trigger playlist changed
// so that currently playing media gets wiped
this.playlist.triggerPlaylistChanged();
}
};
Player.prototype.setPlayButtonUI = function () { Player.prototype.setPlayButtonUI = function () {
this.playButtonPath.setAttribute('d', 'M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM6.79 5.093A.5.5 0 0 0 6 5.5v5a.5.5 0 0 0 .79.407l3.5-2.5a.5.5 0 0 0 0-.814l-3.5-2.5z'); this.playButtonPath.setAttribute('d', 'M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM6.79 5.093A.5.5 0 0 0 6 5.5v5a.5.5 0 0 0 .79.407l3.5-2.5a.5.5 0 0 0 0-.814l-3.5-2.5z');
}; };
@ -209,13 +224,14 @@ var Player = /** @class */ (function () {
this.playButton.disabled = true; this.playButton.disabled = true;
this.rewButton.disabled = true; this.rewButton.disabled = true;
this.ffwButton.disabled = true; this.ffwButton.disabled = true;
this.skipButton.disabled = true;
} }
else { else {
this.playButton.disabled = false; this.playButton.disabled = false;
this.rewButton.disabled = false; this.rewButton.disabled = false;
this.ffwButton.disabled = false; this.ffwButton.disabled = false;
this.skipButton.disabled = !this.playlist.hasNextEpisode();
} }
this.skipButton.disabled = !this.playlist.hasNextEpisode();
}; };
Player.prototype.sendMediaSessionMetadata = function () { Player.prototype.sendMediaSessionMetadata = function () {
if ('mediaSession' in navigator) { if ('mediaSession' in navigator) {
@ -360,6 +376,9 @@ var Playlist = /** @class */ (function () {
Playlist.prototype.isQueued = function (episode) { Playlist.prototype.isQueued = function (episode) {
return this.episodeHash.has(episode.id); return this.episodeHash.has(episode.id);
}; };
Playlist.prototype.triggerPlaylistChanged = function () {
this.playlistChanged();
};
Playlist.prototype.playlistChanged = function () { Playlist.prototype.playlistChanged = function () {
for (var _i = 0, _a = this.changedHandlers; _i < _a.length; _i++) { for (var _i = 0, _a = this.changedHandlers; _i < _a.length; _i++) {
var handler = _a[_i]; var handler = _a[_i];

View File

@ -71,6 +71,7 @@ class Player {
this.playButton.addEventListener('click', () => this.playPause()); this.playButton.addEventListener('click', () => this.playPause());
this.rewButton.addEventListener('click', () => this.rewind()); this.rewButton.addEventListener('click', () => this.rewind());
this.ffwButton.addEventListener('click', () => this.fastForward()); this.ffwButton.addEventListener('click', () => this.fastForward());
this.skipButton.addEventListener('click', () => this.nextEpisode());
this.volumeSlider.addEventListener('change', () => this.setVolume()); this.volumeSlider.addEventListener('change', () => this.setVolume());
// wire up mediaSession events // wire up mediaSession events
@ -86,6 +87,9 @@ class Player {
navigator.mediaSession.setActionHandler('seekbackward', () => navigator.mediaSession.setActionHandler('seekbackward', () =>
this.rewind() this.rewind()
); );
navigator.mediaSession.setActionHandler('nexttrack', () =>
this.nextEpisode()
);
// don't support previous track yet, queue removes them once finished // don't support previous track yet, queue removes them once finished
// wire this up to rewind instead // wire this up to rewind instead
navigator.mediaSession.setActionHandler('previoustrack', () => navigator.mediaSession.setActionHandler('previoustrack', () =>
@ -137,7 +141,7 @@ class Player {
this.setPlayButtonUI(); this.setPlayButtonUI();
this.stopTicker(); this.stopTicker();
}, },
onend: () => this.stopPlaybackAndResetUi(), onend: () => this.nextEpisode(),
onloaderror: () => this.setErrorUI('Playback error'), onloaderror: () => this.setErrorUI('Playback error'),
}); });
}) })
@ -176,6 +180,17 @@ class Player {
} }
} }
private nextEpisode(): void {
const next = this.playlist.nextEpisode();
if (next) this.playEpisode(next);
else {
this.stopPlaybackAndResetUi();
// manually trigger playlist changed
// so that currently playing media gets wiped
this.playlist.triggerPlaylistChanged();
}
}
private setPlayButtonUI(): void { private setPlayButtonUI(): void {
this.playButtonPath.setAttribute( this.playButtonPath.setAttribute(
'd', 'd',
@ -218,13 +233,13 @@ class Player {
this.playButton.disabled = true; this.playButton.disabled = true;
this.rewButton.disabled = true; this.rewButton.disabled = true;
this.ffwButton.disabled = true; this.ffwButton.disabled = true;
this.skipButton.disabled = true;
} else { } else {
this.playButton.disabled = false; this.playButton.disabled = false;
this.rewButton.disabled = false; this.rewButton.disabled = false;
this.ffwButton.disabled = false; this.ffwButton.disabled = false;
this.skipButton.disabled = !this.playlist.hasNextEpisode();
} }
this.skipButton.disabled = !this.playlist.hasNextEpisode();
} }
private sendMediaSessionMetadata(): void { private sendMediaSessionMetadata(): void {

View File

@ -91,6 +91,10 @@ class Playlist {
return this.episodeHash.has(episode.id); return this.episodeHash.has(episode.id);
} }
public triggerPlaylistChanged(): void {
this.playlistChanged();
}
private playlistChanged(): void { private playlistChanged(): void {
for (const handler of this.changedHandlers) { for (const handler of this.changedHandlers) {
handler(); handler();