Browse Source

aggiustaggi

boyska 2 years ago
parent
commit
e61d0be6f9
2 changed files with 91 additions and 61 deletions
  1. 18 18
      index.html
  2. 73 43
      player.js

+ 18 - 18
index.html

@@ -4,15 +4,15 @@
     <meta name="theme-color" content="#ffffff">
     <title>Test player</title>
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <link rel="stylesheet" type="text/css" href="/player.css">
+    <link rel="stylesheet" type="text/css" href="player.css">
   </head>
   <body>
-    <audio id="radio"></audio>
+    <audio preload id="radio"></audio>
     <div id="player">
       <div id="contents" >
 	<div id="menu">
 	  <input type="radio" name="tab-selector" id="tab-other-radios" checked/>
-	  <label for="tab-other-radios"> Altre Radio</label>
+	  <label for="tab-other-radios"> Radio</label>
 	  <input type="radio" name="tab-selector" id="tab-programmi"/>
 	  <label for="tab-programmi"> Programmi</label>
 	  <input type="radio" name="tab-selector" id="tab-playlist"/>
@@ -23,12 +23,12 @@
 	  </div>
 	  <div id="programmi">
 	    <div class="show-list">
-	      <img id="prev-show" class="arrow arrow-left" alt="Scorri a sinistra" src="/icons/ico-arrow.png" />
+	      <img id="prev-show" class="arrow arrow-left" alt="Scorri a sinistra" src="icons/ico-arrow.png" />
 	      <div id="programmi-lista"></div>
-	      <img id="next-show" class="arrow arrow-right" alt="Scorri a destra" src="/icons/ico-arrow.png" />
+	      <img id="next-show" class="arrow arrow-right" alt="Scorri a destra" src="icons/ico-arrow.png" />
 	    </div>
 	    <div class="show-content">
-	      <img id="prev-show-card" class="arrow arrow-left hidden" alt="Scorri a sinistra" src="/icons/ico-arrow.png"/>
+	      <img id="prev-show-card" class="arrow arrow-left hidden" alt="Scorri a sinistra" src="icons/ico-arrow.png"/>
 	      <div id="programmi-content">
 		<template id="show-card-template">
 		  <div class="show-card">
@@ -36,13 +36,13 @@
 		    <div class="small-tags"></div><br>
 		    <div class="description"></div>
 		    <div class="controls">
-		      <img src="/icons/plus.png" class="add-to-playlist">
-		      <img src="/icons/playIcon.svg" class="play-pause">
+		      <img src="icons/plus.png" class="add-to-playlist">
+		      <img src="icons/playIcon.svg" class="play-pause">
 		    </div>		  
 		  </div>
 		</template>
 	      </div>
-	      <img id="next-show-card" class="arrow arrow-right hidden" alt="Scorri a destra" src="/icons/ico-arrow.png"/> 
+	      <img id="next-show-card" class="arrow arrow-right hidden" alt="Scorri a destra" src="icons/ico-arrow.png"/> 
 	    </div>
 	  </div>
 	  <div id="playlist" class="hidden">
@@ -62,29 +62,29 @@
 	</div>
 	<div class="controlBlock controlCenter">
 	  <span id="prev" class="prev-step control">
-	    <img alt="Indietro di 15 secondi" src="/icons/15_sec_prima.svg">
+	    <img alt="Indietro di 15 secondi" src="icons/15_sec_prima.svg">
 	  </span>
 	  <span id="play" class="play-pause control" label="Premi per iniziare la riproduzione del player">
-	    <img alt="Ascolta la diretta" src="/icons/playIcon.svg">
+	    <img alt="Ascolta la diretta" src="icons/playIcon.svg">
 	  </span>
 	  <span id="next" class="prev-step control">
-	    <img alt="Avanti di 15 secondi" src="/icons/15_sec_dopo.svg">
+	    <img alt="Avanti di 15 secondi" src="icons/15_sec_dopo.svg">
 	  </span>
 	</div>
 	<div class="controlBlock controlRight">
 	  <div>
 	    <span class="is-live live">· LIVE</span>
 	    <span class="back-to-live live hidden">TORNA AL LIVE</span>
-	    <img id="volume-on" src="/icons/volume.svg" />
-	    <img id="volume-off" src="/icons/volume_off.svg" class="hidden"/>	    
+	    <img id="volume-on" src="icons/volume.svg" />
+	    <img id="volume-off" src="icons/volume_off.svg" class="hidden"/>	    
 	    <input id="volume" type="range" min="0" max="1" step="0.01" value="1" />	    
-	    <img id="contents-button" class="arrow-up" alt="Apri il player" src="/icons/ico-arrow.png" />
+	    <img id="contents-button" class="arrow-up" alt="Apri il player" src="icons/ico-arrow.png" />
 	  </div>
 	</div>
       </div>
     </div>
-    <script src="/dist/ical/ical.min.js"></script>
-    <script src="/dist/radiomanifest/radiomanifest-oldstyle.bundle.js"></script>
-    <script src="/player.js"></script>
+    <script src="dist/ical/ical.min.js"></script>
+    <script src="dist/radiomanifest/radiomanifest-oldstyle.bundle.js"></script>
+    <script src="player.js"></script>
   </body>
 </html>

+ 73 - 43
player.js

@@ -1,24 +1,67 @@
 let leRadio = [
-  { "name": "Radio Onda Rossa", "website": "http://www.ondarossa.info/"},
+  { "name": "Radio Onda Rossa", "website": "https://www.ondarossa.info/"},
   { "name": "Radio Spore", "website": "https://radiospore.oziosi.org/" },
 ]
 let playlist = []
 let audio = document.querySelector("#radio");
 
+/* Avoids "mixed content" problems, hoping for the best */
+function httpsIze(url) {
+    if(location.protocol === 'https:' && url.startsWith('http:')) {
+        return url.replace('http:', 'https:')
+    }
+    return url
+}
+
+class Player {
+    constructor(audioEl) {
+        this.audioEl = audioEl
+    }
+
+    changeStreamURLs(urls) {
+        this.audioEl.pause()
+        this.audioEl.innerHTML = ''
+        urls.forEach((url) => {
+            let src = document.createElement('source')
+            src.setAttribute('src', url)
+            this.audioEl.appendChild(src)
+        })
+        this.audioEl.load()
+        this.audioEl.play()
+    }
+}
+function downloadPlaylist() {
+    let m3u = "#EXTM3U\n"
+    m3u = playlist.reduce((data, track) => {
+        data += `#EXTINF:${track.itunes.duration},${track.itunes.name} \n`
+        data += `${track.enclosure}\n`
+        return data
+    }, m3u)
+    console.log(m3u)
+    const blob = new Blob([m3u], { 'type': 'audio/x-mpegurl'});
+    const m3uFile = window.URL.createObjectURL(blob);
+    var a = document.createElement("a");
+    a.style = "display: none";
+    document.body.appendChild(a);
+    url = window.URL.createObjectURL(blob);
+    a.href = url;
+    a.download = "playlist.m3u";
+    a.click();
+    window.URL.revokeObjectURL(url);
+}
+
 async function main() {
 
     let radio = null
+    let player = new Player(audio)
 
     async function deployRadio(website) {
+        radio = await radiomanifest.get(httpsIze(website))
         document.querySelector('#radio-name').textContent = 'Loading ...'
-        radio = await radiomanifest.get(website)
-        console.log('eccola', radio)
-        let src = await radio.getStreaming().pickURL()
-        if (src !== audio.src) {
-            audio.pause()
-            audio.src = src
-            audio.play()
-        }
+        document.querySelector('#program-name').textContent = 'Loading ...'
+        let urls = await radio.getStreaming().pickURLs()
+        urls = urls.map(httpsIze)
+        player.changeStreamURLs(urls)
         document.querySelector('#radio-name').textContent = radio.getName()
         const show = radio.getShowAtTime()
         let showName = ''
@@ -26,7 +69,10 @@ async function main() {
             showName = show.getName()
         }
         document.querySelector('#program-name').textContent = showName
+
+        setupProgrammi()
     }
+
     const playButton = document.querySelector("#play")
     const nextButton = document.querySelector("#next")
     const prevButton = document.querySelector("#prev")
@@ -66,11 +112,12 @@ async function main() {
             console.log(el)
             el.addEventListener('change', (e) => {
                 for(let ce of document.querySelectorAll("#menu > input")) {
+                    var selector = "#"+ce.id.split('-').slice(1).join('-')
                     if(ce.checked) {
-                        document.querySelector("#"+ce.id.split('-').slice(1).join('-')).classList.remove("hidden")
+                        document.querySelector(selector).classList.remove("hidden")
                     }
                     else {
-                        document.querySelector("#"+ce.id.split('-').slice(1).join('-')).classList.add("hidden")
+                        document.querySelector(selector).classList.add("hidden")
                     }
                 }
             })
@@ -101,15 +148,15 @@ async function main() {
         }
         prevButton.addEventListener("click",(e) => {
             audio.currentTime -= 15;
-            showBackToLive() 
+            showBackToLive()
         }, false)
         nextButton.addEventListener("click",(e) => {
             audio.currentTime += 15;
-            showBackToLive() 
+            showBackToLive()
         }, false)
 
         audio.addEventListener('pause', (e) => {
-            showBackToLive() 
+            showBackToLive()
         })
         document.querySelector(".back-to-live").addEventListener('click', (e) => {
             document.querySelector(".is-live").classList.remove("hidden")
@@ -118,25 +165,6 @@ async function main() {
             audio.play()
         })
     }
-    function downloadPlaylist() {
-        let m3u = "#EXTM3U\n"
-        m3u = playlist.reduce((data, track) => {
-            data += `#EXTINF:${track.itunes.duration},${track.itunes.name} \n`
-            data += `${track.guid}\n`
-            return data
-        }, m3u)
-        console.log(m3u)
-        const blob = new Blob([m3u], { 'type': 'audio/x-mpegurl'});
-        const m3uFile = window.URL.createObjectURL(blob);
-        var a = document.createElement("a");
-        a.style = "display: none";
-        document.body.appendChild(a);
-        url = window.URL.createObjectURL(blob);
-        a.href = url;
-        a.download = "playlist.m3u";
-        a.click();
-        window.URL.revokeObjectURL(url);
-    }
     function setupRadios() {
         for(let r of leRadio) {
             let el = document.createElement("span")
@@ -190,24 +218,27 @@ async function main() {
         if(radio === null) return;
         
         const programmi = radio.getShows();
+        if(programmi === null || programmi === undefined) return;
         for(let p of programmi) {
             let el = document.createElement("span")
             el.innerHTML = p.getName();
             showListEl.appendChild(el)
             el.addEventListener('click', (e) => {
                 console.log("Hai clickato su", p.getName())
+                document.querySelectorAll("#programmi-content > .content-box").forEach((el) => {
+                    el.remove()
+                })
                 document.querySelectorAll("#programmi > .show-content > .arrow").forEach((el) => {
                     el.classList.remove("hidden")
                 })
-                fetch(p.getFeed())
+                fetch(httpsIze(p.getFeed()))
                     .then(res => res.text())
                     .then(res => new window.DOMParser().parseFromString(res, "text/xml"))
                     .then(xml => {
-                        console.log('yo!', xml)
+                        // XXX: we'd need a proper podcast-parsing library here
                         let data = Array.from(xml.getElementsByTagName("item")).
                             map(item =>  Array.from(item.childNodes)
                                 .reduce((data, node) => {
-                                    console.log('node', node, node.localName, node.prefix)
                                     if(node.localName) {
                                         if(node.prefix){
                                             if(!data[node.prefix]) {
@@ -240,30 +271,29 @@ async function main() {
                                 s['itunes']['keywords'].split(',').map((k) => `<span>${k}</span>`).join('')
                             }
                             puntata.querySelector(".title").textContent = s.title;
-                            puntata.querySelector(".description").textContent = s.description;
-                            //puntata.innerHTML = `<span><b>${data[a].title}</b></span> <div class="small-tags">${keywordso}</div> <br/> <br/><div>${data[a].description}</div>`;
+                            puntata.querySelector(".description").textContent = s.description.substr(0, 150);
                             puntata.querySelector(".play-pause").addEventListener('click', (e) => {
-                                audio.src = s.enclosure;
-                                playPauseRadio();
+                                console.log(httpsIze(s.enclosure))
+                                player.changeStreamURLs([httpsIze(s.enclosure)])
                                 document.querySelector("#radio-name").textContent = p.getName();
                                 document.querySelector("#program-name").textContent = s.title;
                             })
                             puntata.querySelector(".add-to-playlist").addEventListener('click', (e) => {
+                                console.log('playlist?', s, s.enclosure)
                                 playlist.push(s)
                             })
-                            programma.appendChild(puntata)	      
+                            programma.appendChild(puntata)
                         }
                     })	
             })
         }
     }
+    document.querySelector('#programmi').classList.add('hidden')
     setupPlayer();
     setupRadios();
     setupTabs();
     setupShowButtons();
     await deployRadio(leRadio[0].website)
-
-    setupProgrammi();
 }
 
 main()