From 778df97d3cb13c39e4ee1d14ecc2a07c6068741c Mon Sep 17 00:00:00 2001 From: drigato Date: Tue, 31 Mar 2015 16:51:14 -0400 Subject: [PATCH] SAAS-662: Make player auto-connect if there is a problem with the stream Kind of working in HTML5 mode --- .../EmbeddableplayerController.php | 8 +- .../scripts/embeddableplayer/embed-code.phtml | 101 +++++++----------- .../public/js/airtime/embeddableplayer/mrp.js | 1 + 3 files changed, 44 insertions(+), 66 deletions(-) diff --git a/airtime_mvc/application/controllers/EmbeddableplayerController.php b/airtime_mvc/application/controllers/EmbeddableplayerController.php index 2d70c08a2..6a00df36b 100644 --- a/airtime_mvc/application/controllers/EmbeddableplayerController.php +++ b/airtime_mvc/application/controllers/EmbeddableplayerController.php @@ -39,11 +39,11 @@ class EmbeddablePlayerController extends Zend_Controller_Action $this->view->station_name = Application_Model_Preference::GetStationName(); $stream = $request->getParam('stream'); $streamData = Application_Model_StreamSetting::getEnabledStreamData(); + $availableMobileStreams = array(); + $availableDesktopStreams = array(); if ($stream == "auto") { $this->view->playerMode = "auto"; - $availableMobileStreams = array(); - $availableDesktopStreams = array(); foreach ($streamData as $s) { if ($s["mobile"]) { array_push($availableMobileStreams, $s); @@ -51,14 +51,14 @@ class EmbeddablePlayerController extends Zend_Controller_Action array_push($availableDesktopStreams, $s); } } - $this->view->availableMobileStreams = json_encode($availableMobileStreams); - $this->view->availableDesktopStreams = json_encode($availableDesktopStreams); } else { $this->view->playerMode = "manual"; $selectedStreamData = $streamData[$stream]; $this->view->streamURL = $selectedStreamData["url"]; $this->view->codec = $selectedStreamData["codec"]; } + $this->view->availableMobileStreams = json_encode($availableMobileStreams); + $this->view->availableDesktopStreams = json_encode($availableDesktopStreams); //$this->view->displayMetadata = $request->getParam('display_metadata'); } } \ No newline at end of file diff --git a/airtime_mvc/application/views/scripts/embeddableplayer/embed-code.phtml b/airtime_mvc/application/views/scripts/embeddableplayer/embed-code.phtml index 940850be9..5c1a57b74 100644 --- a/airtime_mvc/application/views/scripts/embeddableplayer/embed-code.phtml +++ b/airtime_mvc/application/views/scripts/embeddableplayer/embed-code.phtml @@ -9,45 +9,35 @@ var MusesPlayer = function() { this.mobileDetect = this.mobileDetect(); - this.availableMobileStreamQueue = availableMobileStreams?>; - this.availableDesktopStreamQueue = availableDesktopStreams?>; this.playerMode = "playerMode ?>"; + this.flashDetect = FlashDetect.versionAtLeast(10, 1) ? true : false; + this.settings = { + 'volume': 100, + 'jsevents': true, + 'autoplay': false, + 'buffering': 5, + 'title': 'test', + 'bgcolor': '#FFFFFF', + 'skin': 'mcclean', + 'width': 180, + 'height': 60 + }; if (this.playerMode == "manual") { - MRP.insert({ - 'url': "streamURL ?>", - 'codec': "codec ?>", - 'volume': 100, - 'jsevents': true, - 'autoplay': false, - 'buffering': 5, - 'title': 'test', - 'bgcolor': '#FFFFFF', - 'skin': 'mcclean', - 'width': 180, - 'height': 60 - }); + this.settings.url = "streamURL ?>"; + this.settings.codec = "codec ?>"; + MRP.insert(this.settings); } else if (this.playerMode == "auto") { + this.availableMobileStreamQueue = availableMobileStreams?>; + this.availableDesktopStreamQueue = availableDesktopStreams?>; var stream = this.getNextAvailableStream(); - MRP.insert({ - 'url': stream["url"], - 'codec': stream["codec"], - 'volume': 100, - 'jsevents': true, - 'autoplay': false, - 'buffering': 5, - 'title': 'test', - 'bgcolor': '#FFFFFF', - 'skin': 'mcclean', - 'width': 180, - 'height': 60 - }); + this.settings.url = stream["url"]; + this.settings.codec = stream["codec"]; + MRP.insert(this.settings); } $("p.station_name").html("station_name?>"); - this.flashDetect = FlashDetect.versionAtLeast(10, 1) ? true : false; - getMetadata(); }; @@ -95,7 +85,7 @@ } MusesPlayer.prototype.play = function() { - this.flashDetect ? MRP.play() : musesHTMLPlayClick(); + this.flashDetect ? MRP.play() : musesHTMLPlayClick();; togglePlayStopButton(); }; @@ -108,43 +98,39 @@ //this.flashDetect ? MRP.setVolume(value) : null; }; - MusesPlayer.prototype.setURL = function() { - //TODO + MusesPlayer.prototype.setURL = function(url) { + MRP.setUrl(url); }; - function musesCallback(event,value){ + // detects errors in FLASH mode + function musesCallback(event,value) { switch (event) { - case "loadComplete": - // no source URL is set - if (value === "0") { - console.log("loadComplete failed"); - } case "ioError": // connection limit reached or problem connecting to stream if (value === "0") { console.log("ioError"); + var stream = musesPlayer.getNextAvailableStream(); + musesPlayer.setURL(stream["url"]); + musesPlayer.play(); } } } - /** - * This is a hack to trigger the play button in HTML5 mode - */ function musesHTMLPlayClick() { - //child nodes - var cn = document.getElementById("MusesRadioPlayer-HTML5-player-1").childNodes; - var playDiv = cn[4]; - playDiv.onclick(); + MRP.html.audio.src = MRP.html.src; + + MRP.html.audio.play(); + + // detects errors in HTML5 mode + MRP.html.audio.addEventListener('error', function failed(e) { + var stream = musesPlayer.getNextAvailableStream(); + MRP.html.audio.src = stream["url"]; + MRP.html.audio.play(); + }, true); } - /** - * This is a hack to trigger the stop button in HTML5 mode - */ function musesHTMLStopClick() { - //child nodes - var cn = document.getElementById("MusesRadioPlayer-HTML5-player-1").childNodes; - var stopDiv = cn[5]; - stopDiv.onclick(); + MRP.html.audio.pause(); } function togglePlayStopButton() { @@ -247,14 +233,5 @@ - - \ No newline at end of file diff --git a/airtime_mvc/public/js/airtime/embeddableplayer/mrp.js b/airtime_mvc/public/js/airtime/embeddableplayer/mrp.js index 4377dddd5..ca7140dc1 100644 --- a/airtime_mvc/public/js/airtime/embeddableplayer/mrp.js +++ b/airtime_mvc/public/js/airtime/embeddableplayer/mrp.js @@ -2298,6 +2298,7 @@ this.ui = new d.UI(this, a); a.autoplay && (a = window.navigator.userAgent.toLowerCase(), -1 == a.indexOf("iphone") && -1 == a.indexOf("ipad") && -1 == a.indexOf("ipod") && this.playAudio()) + n.MRP.html = this; }; d.Muses.__name__ = !0; d.Muses.initTimer = function(a) {