diff --git a/src/components/htmlvideoplayer/plugin.js b/src/components/htmlvideoplayer/plugin.js index adc76f67b1..b52b86797c 100644 --- a/src/components/htmlvideoplayer/plugin.js +++ b/src/components/htmlvideoplayer/plugin.js @@ -1523,6 +1523,10 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa } } + if (browser.safari || browser.iOS || browser.iPad) { + list.push('AirPlay') + } + list.push('SetBrightness'); list.push("SetAspectRatio") @@ -1631,6 +1635,31 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa return false; }; + HtmlVideoPlayer.prototype.isAirPlayEnabled = function () { + + if (document.AirPlayEnabled) { + return document.AirplayElement ? true : false; + } + + return false; + }; + + HtmlVideoPlayer.prototype.setAirPlayEnabled = function (isEnabled) { + var video = this._mediaElement; + + if (document.AirPlayEnabled) { + if (video) { + if (isEnabled) { + video.requestAirPlay().catch(onAirPlayError); + } else { + document.exitAirPLay().catch(onAirPlayError); + } + } + } else { + video.webkitShowPlaybackTargetPicker(); + } + }; + HtmlVideoPlayer.prototype.setBrightness = function (val) { var elem = this._mediaElement; @@ -1784,6 +1813,10 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa return this.setPictureInPictureEnabled(!this.isPictureInPictureEnabled()); }; + HtmlVideoPlayer.prototype.toggleAirPlay = function () { + return this.setAirPlayEnabled(!this.isAirPlayEnabled()); + }; + HtmlVideoPlayer.prototype.getBufferedRanges = function () { var mediaElement = this._mediaElement; if (mediaElement) { diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 23f0d4572e..da04a2e13e 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -1540,6 +1540,11 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return player.togglePictureInPicture(); }; + self.toggleAirPlay = function (player) { + player = player || self._currentPlayer; + return player.toggleAirPlay(); + }; + self.getSubtitleStreamIndex = function (player) { player = player || self._currentPlayer; @@ -3854,6 +3859,9 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla if (player.supports('PictureInPicture')) { list.push('PictureInPicture'); } + if (player.supports('AirPlay')) { + list.push('AirPlay'); + } if (player.supports('SetBrightness')) { list.push('SetBrightness'); } diff --git a/src/controllers/videoosd.js b/src/controllers/videoosd.js index 3c211cb50e..bd12ba5075 100644 --- a/src/controllers/videoosd.js +++ b/src/controllers/videoosd.js @@ -789,6 +789,12 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med view.querySelector(".btnPip").classList.remove("hide"); } + if (-1 === supportedCommands.indexOf("AirPlay")) { + view.querySelector(".btnAirPlay").classList.add("hide"); + } else { + view.querySelector(".btnAirPlay").classList.remove("hide"); + } + updateFullscreenIcon(); } @@ -1306,6 +1312,9 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med view.querySelector(".btnPip").addEventListener("click", function () { playbackManager.togglePictureInPicture(currentPlayer); }); + view.querySelector(".btnAirPlay").addEventListener("click", function () { + playbackManager.toggleAirPlay(currentPlayer); + }); view.querySelector(".btnVideoOsdSettings").addEventListener("click", onSettingsButtonClick); view.addEventListener("viewhide", function () { headerElement.classList.remove("hide"); diff --git a/src/videoosd.html b/src/videoosd.html index 0c7a910908..e4089468b8 100644 --- a/src/videoosd.html +++ b/src/videoosd.html @@ -72,6 +72,9 @@ +