player.js 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. let leRadio = [
  2. { "name": "Radio Spore", "stream": "https://stream.radiospore.oziosi.org:8003/spore.ogg" },
  3. { "name": "Radio Wombat", "stream": "https://s.streampunk.cc/wombat.ogg"},
  4. { "name": "RadioGramma", "stream": "https://stream.radiospore.oziosi.org:8003/radiogramma.ogg"},
  5. { "name": "RadioForte", "stream": "http://stream.s.streampunk.cc/player/RadioForte.ogg"},
  6. { "name": "RadioEustachio", "stream": "https://stream.radiospore.oziosi.org:8003/radioeustachio.ogg"}]
  7. let playlist = []
  8. let radio = document.querySelector("#radio");
  9. leRadio = leRadio.map((r) => {
  10. r.stream += "?" + Math.floor((Math.random() * 10000) + 1)
  11. return r
  12. });
  13. radio.src = leRadio[0].stream
  14. const playButton = document.querySelector("#play")
  15. const nextButton = document.querySelector("#next")
  16. const prevButton = document.querySelector("#prev")
  17. const contents = document.querySelector("#contents")
  18. const contentsButton = document.querySelector("#contents-button")
  19. const volumeOn = document.querySelector("#volume-on")
  20. const volumeOff = document.querySelector("#volume-off")
  21. const showContentsEl = document.querySelector("#programmi-content")
  22. const showListEl = document.querySelector("#programmi-lista")
  23. let currentStatus
  24. async function playPauseRadio() {
  25. try {
  26. if(radio.paused) {
  27. await radio.play();
  28. }
  29. else {
  30. await radio.pause();
  31. }
  32. }
  33. catch(err) {
  34. console.log(err);
  35. }
  36. }
  37. function onVolumeChange(e) {
  38. if(e.target.value == 0) {
  39. volumeOn.classList.add("hidden");
  40. volumeOff.classList.remove("hidden")
  41. }
  42. else {
  43. volumeOff.classList.add("hidden");
  44. volumeOn.classList.remove("hidden")
  45. }
  46. radio.volume = e.target.value;
  47. }
  48. function setupTabs() {
  49. for(let el of document.querySelectorAll("#menu > input")){
  50. console.log(el)
  51. el.addEventListener('change', (e) => {
  52. for(let ce of document.querySelectorAll("#menu > input")) {
  53. if(ce.checked) {
  54. document.querySelector("#"+ce.id.split('-').slice(1).join('-')).classList.remove("hidden")
  55. }
  56. else {
  57. document.querySelector("#"+ce.id.split('-').slice(1).join('-')).classList.add("hidden")
  58. }
  59. }
  60. })
  61. }
  62. }
  63. function setupPlayer() {
  64. playButton.addEventListener("click", playPauseRadio, false);
  65. volumeOff.addEventListener("click", (e) => {
  66. volume.disabled = false;
  67. e.target.classList.add("hidden");
  68. volumeOn.classList.remove("hidden");
  69. radio.volume = volume.value;
  70. });
  71. volumeOn.addEventListener("click", (e) => {
  72. volume.disabled = true;
  73. e.target.classList.add("hidden");
  74. volumeOff.classList.remove("hidden");
  75. radio.volume = 0;
  76. });
  77. volume.addEventListener('change', onVolumeChange);
  78. contentsButton.addEventListener("click", (e) => {
  79. contents.hidden = !contents.hidden;
  80. e.target.classList.toggle("arrow-up");
  81. })
  82. let showBackToLive = () => {
  83. document.querySelector(".is-live").classList.add("hidden");
  84. document.querySelector(".back-to-live").classList.remove("hidden");
  85. }
  86. prevButton.addEventListener("click",(e) => {
  87. radio.currentTime -= 15;
  88. showBackToLive()
  89. }, false)
  90. nextButton.addEventListener("click",(e) => {
  91. radio.currentTime += 15;
  92. showBackToLive()
  93. }, false)
  94. radio.addEventListener('pause', (e) => {
  95. showBackToLive()
  96. })
  97. document.querySelector(".back-to-live").addEventListener('click', (e) => {
  98. document.querySelector(".is-live").classList.remove("hidden")
  99. e.target.classList.add("hidden")
  100. radio.currentTime = radio.duration
  101. radio.play()
  102. })
  103. }
  104. function downloadPlaylist() {
  105. let m3u = "#EXTM3U\n"
  106. m3u = playlist.reduce((data, track) => {
  107. data += `#EXTINF:${track.itunes.duration},${track.itunes.name} \n`
  108. data += `${track.guid}\n`
  109. return data
  110. }, m3u)
  111. console.log(m3u)
  112. const blob = new Blob([m3u], { 'type': 'audio/x-mpegurl'});
  113. const m3uFile = window.URL.createObjectURL(blob);
  114. var a = document.createElement("a");
  115. a.style = "display: none";
  116. document.body.appendChild(a);
  117. url = window.URL.createObjectURL(blob);
  118. a.href = url;
  119. a.download = "playlist.m3u";
  120. a.click();
  121. window.URL.revokeObjectURL(url);
  122. }
  123. function setupRadios() {
  124. for(let r of leRadio) {
  125. let el = document.createElement("span")
  126. el.innerHTML = r.name;
  127. el.addEventListener('click', (e) => {
  128. radio.src = r.stream;
  129. document.querySelector("#radio-name").textContent = r.name
  130. radio.play()
  131. })
  132. document.querySelector("#other-radios").appendChild(el)
  133. }
  134. }
  135. function setupShowButtons() {
  136. let scrollFwd = (el) => {
  137. let scrollAmount = 0;
  138. let timer = setInterval( () => {
  139. el.scrollLeft += 10;
  140. scrollAmount += 10;
  141. if(scrollAmount >= 100){
  142. window.clearInterval(timer);
  143. }
  144. }, 25);
  145. }
  146. let scrollBack = (el) => {
  147. let scrollAmount = 0;
  148. let timer = setInterval( () => {
  149. el.scrollLeft -= 10;
  150. scrollAmount -= 10;
  151. if(scrollAmount <= -100){
  152. window.clearInterval(timer);
  153. }
  154. }, 25);
  155. }
  156. document.getElementById("prev-show").addEventListener("click", (e) => {
  157. scrollBack(showListEl)
  158. })
  159. document.getElementById("next-show").addEventListener("click", (e) => {
  160. scrollFwd(showListEl)
  161. })
  162. document.getElementById("next-show-card").addEventListener("click", (e) => {
  163. scrollFwd(showContentsEl.querySelector("div.content-box:not(.hidden)"))
  164. })
  165. document.getElementById("prev-show-card").addEventListener("click", (e) => {
  166. scrollBack(showContentsEl.querySelector("div.content-box:not(.hidden)"))
  167. })
  168. }
  169. async function setupProgrammi() {
  170. const res = await fetch("https://www.arkiwi.org/path64/cmFkaW9zcG9yZQ/shows");
  171. const shows = Array.from(await new window.DOMParser().parseFromString(await res.text(), "text/xml").getElementsByTagName("show"));
  172. programmi = shows.map(show => Array.from(show.childNodes).reduce((data, node) => {
  173. if(node.localName) {
  174. data[node.localName] = node.textContent // + ( node.localName == 'feed' ? '?limit=6' : '')
  175. }
  176. return data;
  177. }, {}))
  178. for(let p of programmi) {
  179. let el = document.createElement("span")
  180. el.innerHTML = p.name;
  181. el.addEventListener('click', (e) => {
  182. const id = p.name.replaceAll(/[\W_]+/g," ").replaceAll(' ','-');
  183. for(let box of document.querySelectorAll("#programmi-content > .content-box")) {
  184. if(box.id != id) {
  185. box.classList.add("hidden");
  186. }
  187. }
  188. document.getElementById(id).classList.toggle("hidden");
  189. document.querySelectorAll("#programmi > .show-content > .arrow").forEach((el) => {
  190. el.classList.remove("hidden")
  191. })
  192. })
  193. showListEl.appendChild(el)
  194. fetch(p.feed)
  195. .then(res => res.text())
  196. .then(res => new window.DOMParser().parseFromString(res, "text/xml"))
  197. .then(xml => {
  198. let data = Array.from(xml.getElementsByTagName("item")).
  199. map(item => Array.from(item.childNodes)
  200. .reduce((data, node) => {
  201. if(node.localName) {
  202. if(node.prefix){
  203. if(!data[node.prefix]) {
  204. data[node.prefix] = {}
  205. }
  206. data[node.prefix][node.localName] = node.textContent
  207. }
  208. else {
  209. data[node.localName] = node.textContent
  210. // if(localName == "pubDate") {
  211. // data[node.localName] = new Date(data[node.localName])
  212. // }
  213. }}
  214. return data;
  215. }, {}))
  216. let programma = document.createElement("div")
  217. programma.setAttribute("id", p.name.replaceAll(/[\W_]+/g," ").replaceAll(' ', '-'));
  218. programma.classList.add("content-box");
  219. programma.classList.add("hidden");
  220. document.getElementById("programmi-content").append(programma);
  221. for(let s of data) {
  222. let template = document.querySelector("#show-card-template");
  223. let puntata = template.content.cloneNode(true);
  224. let keywords = ''
  225. if(s['itunes'] && s.itunes.keywords) {
  226. s['itunes']['keywords'].split(',').map((k) => `<span>${k}</span>`).join('')
  227. }
  228. puntata.querySelector(".title").textContent = s.title;
  229. puntata.querySelector(".description").textContent = s.description;
  230. //puntata.innerHTML = `<span><b>${data[a].title}</b></span> <div class="small-tags">${keywordso}</div> <br/> <br/><div>${data[a].description}</div>`;
  231. puntata.querySelector(".play-pause").addEventListener('click', (e) => {
  232. radio.src = s.guid;
  233. playPauseRadio();
  234. document.querySelector("#radio-name").textContent = p.name;
  235. document.querySelector("#program-name").textContent = s.title;
  236. })
  237. puntata.querySelector(".add-to-playlist").addEventListener('click', (e) => {
  238. playlist.push(s)
  239. })
  240. programma.appendChild(puntata)
  241. }
  242. })
  243. }
  244. }
  245. setupPlayer();
  246. setupRadios();
  247. setupTabs();
  248. setupShowButtons();
  249. setupProgrammi();