(function () { 'use strict'; // заглушить другие наши аудио-плагины (музофонд, яндекс-радио), чтобы не перекрывались function killOther(p) { if (!p) return; try { if (p.close) p.close(); else if (p.stop) p.stop(); } catch (e) {} } function stopOtherAudio() { killOther(window.muzofond_player); killOther(window.yradio_player); } function item(data) { var item = Lampa.Template.get('radio_item', { name: data.title }); var img = item.find('img')[0]; img.onerror = function () { img.src = './img/img_broken.svg'; }; img.src = data.icon_gray; this.render = function () { return item; }; this.destroy = function () { img.onerror = function () {}; img.onload = function () {}; img.src = ''; item.remove(); }; } function component() { var network = new Lampa.Reguest(); var scroll = new Lampa.Scroll({ mask: true, over: true, step: 250 }); var player = window.radio_player; var items = []; var html = $('
'); var body = $(''); var active; var last; this.create = function () { var _this = this; this.activity.loader(true); var prox = Lampa.Platform.is('webos') || Lampa.Platform.is('tizen') || Lampa.Storage.field('proxy_other') === false ? '' : ''; network["native"](prox + 'https://lampaplugins.github.io/store/stations.json', this.build.bind(this), function () { var empty = new Lampa.Empty(); html.append(empty.render()); _this.start = empty.start; _this.activity.loader(false); _this.activity.toggle(); }); return this.render(); }; this.build = function (data) { scroll.minus(); var stations = data.result.stations.sort(function (a, b) { return a.sort - b.sort; }); this.append(stations); scroll.append(body); html.append(scroll.render()); this.activity.loader(false); this.activity.toggle(); }; this.append = function (element) { element.forEach(function (el) { var item$1 = new item(el); item$1.render().on('hover:focus', function () { last = item$1.render()[0]; active = items.indexOf(item$1); scroll.update(items[active].render(), true); }).on('hover:enter', function () { player.play(el); }); body.append(item$1.render()); items.push(item$1); }); }; this.back = function () { Lampa.Activity.backward(); }; this.background = function () { Lampa.Background.immediately('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAZCAYAAABD2GxlAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAHASURBVHgBlZaLrsMgDENXxAf3/9XHFdXNZLm2YZHQymPk4CS0277v9+ffrut62nEcn/M8nzb69cxj6le1+75f/RqrZ9fatm3F9wwMR7yhawilNke4Gis/7j9srQbdaVFBnkcQ1WrfgmIIBcTrvgqqsKiTzvpOQbUnAykVW4VVqZXyyDllYFSKx9QaVrO7nGJIB63g+FAq/xhcHWBYdwCsmAtvFZUKE0MlVZWCT4idOlyhTp3K35R/6Nzlq0uBnsKWlEzgSh1VGJxv6rmpXMO7EK+XWUPnDFRWqitQFeY2UyZVryuWlI8ulLgGf19FooAUwC9gCWLcwzWPb7Wa60qdlZxjx6ooUuUqVQsK+y1VoAJyBeJAVsLJeYmg/RIXdG2kPhwYPBUQQyYF0XC8lwP3MTCrYAXB88556peCbUUZV7WccwkUQfCZC4PXdA5hKhSVhythZqjZM0J39w5m8BRadKAcrsIpNZsLIYdOqcZ9hExhZ1MH+QL+ciFzXzmYhZr/M6yUUwp2dp5U4naZDwAF5JRSefdScJZ3SkU0nl8xpaAy+7ml1EqvMXSs1HRrZ9bc3eZUSXmGa/mdyjbmqyX7A9RaYQa9IRJ0AAAAAElFTkSuQmCC'); }; this.start = function () { if (Lampa.Activity.active().activity !== this.activity) return; this.background(); Lampa.Controller.add('content', { toggle: function toggle() { Lampa.Controller.collectionSet(scroll.render()); Lampa.Controller.collectionFocus(last || false, scroll.render()); }, left: function left() { if (Navigator.canmove('left')) Navigator.move('left');else Lampa.Controller.toggle('menu'); }, right: function right() { Navigator.move('right'); }, up: function up() { if (Navigator.canmove('up')) Navigator.move('up');else Lampa.Controller.toggle('head'); }, down: function down() { if (Navigator.canmove('down')) Navigator.move('down'); }, back: this.back }); Lampa.Controller.toggle('content'); }; this.pause = function () {}; this.stop = function () {}; this.render = function () { return html; }; this.destroy = function () { network.clear(); Lampa.Arrays.destroy(items); scroll.destroy(); html.remove(); items = null; network = null; }; } function player() { var html = Lampa.Template.get('radio_player', {}); var audio = new Audio(); var url = ''; var played = false; var hls; audio.addEventListener("play", function (event) { played = true; html.toggleClass('loading', false); }); function prepare() { if (audio.canPlayType('audio/vnd.apple.mpegurl') || url.indexOf('.aacp') > 0) load();else if (Hls.isSupported() && url.indexOf('.aacp') > 0) { try { hls = new Hls(); hls.attachMedia(audio); hls.loadSource(url); hls.on(Hls.Events.ERROR, function (event, data) { if (data.details === Hls.ErrorDetails.MANIFEST_PARSING_ERROR) { if (data.reason === "no EXTM3U delimiter") { Lampa.Noty.show('Ошибка в загрузке потока'); } } }); hls.on(Hls.Events.MANIFEST_LOADED, function () { start(); }); } catch (e) { Lampa.Noty.show('Ошибка в загрузке потока'); } } else load(); } function load() { audio.src = url; audio.load(); start(); } function start() { var playPromise; try { playPromise = audio.play(); } catch (e) {} if (playPromise !== undefined) { playPromise.then(function () { console.log('Radio', 'start plaining'); })["catch"](function (e) { console.log('Radio', 'play promise error:', e.message); }); } } function play() { html.toggleClass('loading', true); html.toggleClass('stop', false); prepare(); } function stop() { played = false; html.toggleClass('stop', true); html.toggleClass('loading', false); if (hls) { hls.destroy(); hls = false; } // не audio.src='' — пустая строка резолвится в URL страницы → error-цикл try { audio.pause(); } catch (e) {} audio.removeAttribute('src'); try { audio.load(); } catch (e) {} } html.on('hover:enter', function () { if (played) stop();else if (url) play(); }); this.create = function () { $('.head__actions .open--search').before(html); }; // публичный стоп (для взаимоисключения и старта видео) — стоп + спрятать this.stop = function () { stop(); html.toggleClass('hide', true); }; this.play = function (data) { stopOtherAudio(); // не перекрываемся с музофондом и яндекс-радио stop(); url = data.stream_320 ? data.stream_320 : data.stream_128 ? data.stream_128 : data.stream_hls.replace('playlist.m3u8', '96/playlist.m3u8'); html.find('.radio-player__name').text(data.title); html.toggleClass('hide', false); play(); }; } function startPlugin() { window.radiovera = true; Lampa.Component.add('radiovera', component); Lampa.Template.add('radio_item', "