enable airplay for audioplayer

This commit is contained in:
Georgi Stamatov 2023-04-10 12:06:00 +03:00
parent 6fd2a606d8
commit f3b84cadad
2 changed files with 51 additions and 0 deletions

View file

@ -32,6 +32,7 @@ import { appRouter } from '../appRouter';
let volumeSliderContainer; let volumeSliderContainer;
let playPauseButtons; let playPauseButtons;
let positionSlider; let positionSlider;
let toggleAirPlayButton;
let toggleRepeatButton; let toggleRepeatButton;
let toggleRepeatButtonIcon; let toggleRepeatButtonIcon;
@ -80,6 +81,8 @@ import { appRouter } from '../appRouter';
html += '<input type="range" is="emby-slider" pin step="1" min="0" max="100" value="0" class="slider-medium-thumb nowPlayingBarVolumeSlider"/>'; html += '<input type="range" is="emby-slider" pin step="1" min="0" max="100" value="0" class="slider-medium-thumb nowPlayingBarVolumeSlider"/>';
html += '</div>'; html += '</div>';
html += '<button is="paper-icon-button-light" class="btnAirPlay mediaButton"><span class="material-icons airplay" aria-hidden="true"></span></button>';
html += '<button is="paper-icon-button-light" class="toggleRepeatButton mediaButton"><span class="material-icons repeat" aria-hidden="true"></span></button>'; html += '<button is="paper-icon-button-light" class="toggleRepeatButton mediaButton"><span class="material-icons repeat" aria-hidden="true"></span></button>';
html += '<button is="paper-icon-button-light" class="btnShuffleQueue mediaButton"><span class="material-icons shuffle" aria-hidden="true"></span></button>'; html += '<button is="paper-icon-button-light" class="btnShuffleQueue mediaButton"><span class="material-icons shuffle" aria-hidden="true"></span></button>';
@ -190,6 +193,13 @@ import { appRouter } from '../appRouter';
} }
}); });
toggleAirPlayButton = elem.querySelector('.btnAirPlay');
toggleAirPlayButton.addEventListener('click', function () {
if (currentPlayer) {
playbackManager.toggleAirPlay(currentPlayer);
}
});
elem.querySelector('.btnShuffleQueue').addEventListener('click', function () { elem.querySelector('.btnShuffleQueue').addEventListener('click', function () {
if (currentPlayer) { if (currentPlayer) {
playbackManager.toggleQueueShuffleMode(); playbackManager.toggleQueueShuffleMode();
@ -326,6 +336,12 @@ import { appRouter } from '../appRouter';
toggleRepeatButton.classList.remove('hide'); toggleRepeatButton.classList.remove('hide');
} }
if (supportedCommands.indexOf('AirPlay') === -1) {
toggleAirPlayButton.classList.add('hide');
} else {
toggleAirPlayButton.classList.remove('hide');
}
updateRepeatModeDisplay(playbackManager.getRepeatMode()); updateRepeatModeDisplay(playbackManager.getRepeatMode());
onQueueShuffleModeChange(); onQueueShuffleModeChange();

View file

@ -347,6 +347,10 @@ class HtmlAudioPlayer {
return getDefaultProfile(); return getDefaultProfile();
} }
toggleAirPlay() {
return this.setAirPlayEnabled(!this.isAirPlayEnabled());
}
// Save this for when playback stops, because querying the time at that point might return 0 // Save this for when playback stops, because querying the time at that point might return 0
currentTime(val) { currentTime(val) {
const mediaElement = this._mediaElement; const mediaElement = this._mediaElement;
@ -488,6 +492,33 @@ class HtmlAudioPlayer {
return false; return false;
} }
isAirPlayEnabled() {
if (document.AirPlayEnabled) {
return !!document.AirplayElement;
}
return false;
}
setAirPlayEnabled(isEnabled) {
const mediaElement = this._mediaElement;
if (document.AirPlayEnabled) {
if (mediaElement) {
if (isEnabled) {
mediaElement.requestAirPlay().catch(function(err) {
console.error('Error requesting AirPlay', err);
});
} else {
document.exitAirPLay().catch(function(err) {
console.error('Error exiting AirPlay', err);
});
}
}
} else {
mediaElement.webkitShowPlaybackTargetPicker();
}
}
supports(feature) { supports(feature) {
if (!supportedFeatures) { if (!supportedFeatures) {
supportedFeatures = getSupportedFeatures(); supportedFeatures = getSupportedFeatures();
@ -507,6 +538,10 @@ function getSupportedFeatures() {
list.push('PlaybackRate'); list.push('PlaybackRate');
} }
if (browser.safari || browser.iOS || browser.iPad) {
list.push('AirPlay');
}
return list; return list;
} }