index.html 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. <html lang="en">
  2. <head>
  3. <meta charset="utf-8">
  4. <meta name="theme-color" content="#ffffff">
  5. <title>Test player</title>
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <link rel="stylesheet" type="text/css" href="/player.css">
  8. </head>
  9. <body>
  10. <audio id="radio"></audio>
  11. <div id="player">
  12. <div id="contents" hidden>
  13. <div id="altreRadio" class="tags">
  14. </div>
  15. <div id="programmi">
  16. <div class="show-list">
  17. <img id="prev-show" class="arrow arrow-left" alt="Scorri a sinistra" src="/icons/ico-arrow.png" />
  18. <div id="programmi-lista"></div>
  19. <img id="next-show" class="arrow arrow-right" alt="Scorri a destra" src="/icons/ico-arrow.png" />
  20. </div>
  21. <div class="show-content">
  22. <img id="prev-show-card" class="arrow arrow-left" alt="Scorri a sinistra" src="/icons/ico-arrow.png"/>
  23. <div id="programmi-content"></div>
  24. <img id="next-show-card" class="arrow arrow-right" alt="Scorri a destra" src="/icons/ico-arrow.png"/>
  25. </div>
  26. </div>
  27. </div>
  28. <div id="controls" class="controls">
  29. <div class="controlBlock controlLeft">
  30. <div class="info-content">
  31. <span id="radio-name">Radio Spore</span>
  32. <br/>
  33. <span id="program-name">Un programma a caso</span>
  34. </div>
  35. </div>
  36. <div class="controlBlock controlCenter">
  37. <span id="prev" class="prev-step control">
  38. <img alt="Indietro di 15 secondi" src="/icons/15_sec_prima.svg">
  39. </span>
  40. <span id="play" class="play-pause control" label="Premi per iniziare la riproduzione del player">
  41. <img alt="Ascolta la diretta" src="/icons/playIcon.svg">
  42. </span>
  43. <span id="next" class="prev-step control">
  44. <img alt="Avanti di 15 secondi" src="/icons/15_sec_dopo.svg">
  45. </span>
  46. </div>
  47. <div class="controlBlock controlRight">
  48. <div>
  49. <span class="live">· LIVE</span>
  50. <span class="live">TORNA AL LIVE</span>
  51. <img id="volume-button" src="/icons/volume.svg" />
  52. <input id="volume" type="range" min="0" max="1" step="0.01" value="1" />
  53. <img id="contents-button" class="arrow-up" alt="Apri il player" src="/icons/ico-arrow.png" />
  54. </div>
  55. </div>
  56. </div>
  57. </div>
  58. <script>
  59. const leRadio = [
  60. { "name": "Radio Spore", "stream": "https://stream.radiospore.oziosi.org:8003/spore.ogg" },
  61. { "name": "Radio Wombat", "stream": "https://s.streampunk.cc/wombat.ogg"},
  62. { "name": "RadioGramma", "stream": "https://stream.radiospore.oziosi.org:8003/radiogramma.ogg"},
  63. { "name": "RadioForte", "stream": "http://stream.s.streampunk.cc/player/RadioForte.ogg"},
  64. { "name": "RadioEustachio", "stream": "https://stream.radiospore.oziosi.org:8003/radioeustachio.ogg"}]
  65. let playlist = {}
  66. let radio = document.getElementById("radio");
  67. radio.src = leRadio[0]["stream"] + "?" + Math.floor((Math.random() * 10000) + 1) ;
  68. const playButton = document.getElementById("play")
  69. const nextButton = document.getElementById("next")
  70. const prevButton = document.getElementById("prev")
  71. const contents = document.getElementById("contents")
  72. const contentsButton = document.getElementById("contents-button")
  73. const showContentsEl = document.getElementById("programmi-content")
  74. const showListEl = document.getElementById("programmi-lista")
  75. let currentStatus
  76. async function playPauseRadio() {
  77. try {
  78. if(radio.paused) {
  79. await radio.play();
  80. }
  81. else {
  82. await radio.pause();
  83. }
  84. }
  85. catch(err) {
  86. console.log(err);
  87. }
  88. }
  89. function onVolumeChange(e) {
  90. console.log(e.target)
  91. radio.volume = e.target.value;
  92. }
  93. function setupPlayer() {
  94. playButton.addEventListener("click", playPauseRadio, false);
  95. prevButton.addEventListener("click",(e) => {
  96. radio.setCurrentTicurrentTime -= 15;
  97. }, false)
  98. nextButton.addEventListener("click",(e) => {
  99. radio.setCurrentTicurrentTime += 15;
  100. }, false)
  101. volume.addEventListener('change', onVolumeChange);
  102. contentsButton.addEventListener("click", (e) => {
  103. contents.hidden = !contents.hidden;
  104. e.target.classList.toggle("arrow-up");
  105. })
  106. }
  107. function setupRadios() {
  108. for(r of leRadio) {
  109. let el = document.createElement("span")
  110. el.innerHTML = r.name;
  111. document.getElementById("altreRadio").appendChild(el)
  112. }
  113. }
  114. function setupShowButtons() {
  115. let scrollFwd = (el) => {
  116. let scrollAmount = 0;
  117. let timer = setInterval( () => {
  118. el.scrollLeft += 10;
  119. scrollAmount += 10;
  120. if(scrollAmount >= 100){
  121. window.clearInterval(timer);
  122. }
  123. }, 25);
  124. }
  125. let scrollBack = (el) => {
  126. let scrollAmount = 0;
  127. let timer = setInterval( () => {
  128. el.scrollLeft -= 10;
  129. scrollAmount -= 10;
  130. if(scrollAmount <= -100){
  131. window.clearInterval(timer);
  132. }
  133. }, 25);
  134. }
  135. document.getElementById("prev-show").addEventListener("click", (e) => {
  136. scrollBack(showListEl)
  137. })
  138. document.getElementById("next-show").addEventListener("click", (e) => {
  139. scrollFwd(showListEl)
  140. })
  141. document.getElementById("next-show-card").addEventListener("click", (e) => {
  142. scrollFwd(showContentsEl.querySelector("div.content-box:not(.hidden)"))
  143. })
  144. document.getElementById("prev-show-card").addEventListener("click", (e) => {
  145. scrollBack(showContentsEl.querySelector("div.content-box:not(.hidden)"))
  146. })
  147. }
  148. async function setupProgrammi() {
  149. const res = await fetch("https://www.arkiwi.org/path64/cmFkaW9zcG9yZQ/shows");
  150. const shows = Array.from(await new window.DOMParser().parseFromString(await res.text(), "text/xml").getElementsByTagName("show"));
  151. programmi = shows.map(show => Array.from(show.childNodes).reduce((data, node) => {
  152. if(node.localName) {
  153. data[node.localName] = node.textContent // + ( node.localName == 'feed' ? '?limit=6' : '')
  154. }
  155. return data;
  156. }, {}))
  157. for(let p of programmi) {
  158. let el = document.createElement("span")
  159. el.innerHTML = p.name;
  160. el.addEventListener('click', (e) => {
  161. const id = p.name.replaceAll(/[\W_]+/g," ").replaceAll(' ','-');
  162. for(let box of document.getElementById("programmi-content").getElementsByClassName("content-box")) {
  163. if(box.id != id) {
  164. box.classList.add("hidden");
  165. }
  166. }
  167. document.getElementById(id).classList.toggle("hidden");
  168. })
  169. showListEl.appendChild(el)
  170. fetch(p.feed)
  171. .then(res => res.text())
  172. .then(res => new window.DOMParser().parseFromString(res, "text/xml"))
  173. .then(xml => {
  174. let data = Array.from(xml.getElementsByTagName("item")).
  175. map(item => Array.from(item.childNodes)
  176. .reduce((data, node) => {
  177. if(node.localName) {
  178. if(node.prefix){
  179. if(!data[node.prefix]) {
  180. data[node.prefix] = {}
  181. }
  182. data[node.prefix][node.localName] = node.textContent
  183. }
  184. else {
  185. data[node.localName] = node.textContent
  186. // if(localName == "pubDate") {
  187. // data[node.localName] = new Date(data[node.localName])
  188. // }
  189. }}
  190. return data;
  191. }, {}))
  192. let programma = document.createElement("div")
  193. programma.setAttribute("id", p.name.replaceAll(/[\W_]+/g," ").replaceAll(' ', '-'));
  194. programma.classList.add("content-box");
  195. programma.classList.add("hidden");
  196. document.getElementById("programmi-content").append(programma);
  197. for( a in data) {
  198. let puntata = document.createElement("div")
  199. let playPause = document.createElement("img")
  200. playPause.src = '/icons/playIcon.svg'
  201. playPause.classList.add("play-pause")
  202. let keywords = ''
  203. if(data[a]['itunes'] && data[a].itunes.keywords) {
  204. data[a]['itunes']['keywords'].split(',').map((k) => `<span>${k}</span>`).join('')
  205. }
  206. puntata.innerHTML = `<span><b>${data[a].title}</b></span> <div class="small-tags">${keywords}</div> <br/> <br/><div>${data[a].description}</div>`;
  207. puntata.appendChild(playPause)
  208. programma.appendChild(puntata)
  209. }
  210. })
  211. }
  212. }
  213. setupPlayer();
  214. setupRadios();
  215. setupShowButtons();
  216. setupProgrammi();
  217. </script>
  218. </body>
  219. </html>