Listen to Latest podcast:
Vince Coglianese
Vince
Hayley Caronia
The Nightly Scroll
...
Get the Bongino Report delivered straight to your inbox.
`; doc.open(); doc.write(html); doc.close(); } function injectPlayerScript(win, config) { function popupBootstrap(BOOT) { var doc = document; var $ = function(sel){ return doc.querySelector(sel); }; var list = $("#list"), nowTitle = $("#nowTitle"), art = $("#art"), audio = $("#audio"), playBtn = $("#playBtn"), playIcon = $("#playIcon"), pauseIcon = $("#pauseIcon"), prevBtn = $("#prevBtn"), nextBtn = $("#nextBtn"), muteBtn = $("#muteBtn"), volIcon = $("#volIcon"), muteIcon = $("#muteIcon"), seek = $("#seek"), fill = $("#fill"), cur = $("#cur"), dur = $("#dur"), closeBtn = $("#closeBtn"); var episodes = [], current = 0, channelImage = ""; if (closeBtn) closeBtn.addEventListener("click", function(){ window.close(); }); try { audio.preload = 'metadata'; } catch(e){} var feedUrl = (BOOT && BOOT.feed) || ""; var brandImg = (BOOT && BOOT.img) || ""; var brandLink = (BOOT && BOOT.link) || ""; var resumeState = (BOOT && BOOT.resumeState) || { src:"", currentTime:0, title:"" }; if (brandImg) { art.src = brandImg; if (brandLink) { art.style.cursor = "pointer"; art.addEventListener("click", function(){ window.open(brandLink, "_blank", "noopener"); }); } } /* ---------- UI sync helpers ---------- */ function pad(n){ return n<10 ? "0"+n : String(n); } function fmtTime(sec){ sec=Math.max(0,Math.floor(sec||0)); var m=Math.floor(sec/60), s=sec%60; return m+":"+pad(s); } function updatePlayUi(){ var isPlaying = !audio.paused && !audio.ended; playBtn.setAttribute("aria-pressed", isPlaying ? "true" : "false"); playIcon.style.display = isPlaying ? "none" : ""; pauseIcon.style.display = isPlaying ? "" : "none"; } ['play','playing','pause','ended','waiting','stalled','emptied','loadedmetadata','timeupdate'] .forEach(function(ev){ audio.addEventListener(ev, updatePlayUi); }); function updateTimeline(){ var d = audio.duration || 0; var t = audio.currentTime || 0; cur.textContent = fmtTime(t); dur.textContent = isFinite(d) ? fmtTime(d) : "0:00"; var pct = d ? (t / d) * 100 : 0; fill.style.width = pct + "%"; seek.setAttribute("aria-valuenow", String(Math.round(pct))); } audio.addEventListener("timeupdate", updateTimeline); audio.addEventListener("durationchange", updateTimeline); seek.addEventListener("click", function(e){ var rect = seek.getBoundingClientRect(); var pct = Math.min(1, Math.max(0, (e.clientX - rect.left) / rect.width)); if (isFinite(audio.duration)) audio.currentTime = pct * audio.duration; }); /* ---------- Controls ---------- */ playBtn.addEventListener("click", function(){ if (audio.paused || audio.ended) { audio.play && audio.play().catch(function(){}); } else { audio.pause(); } }); prevBtn.addEventListener("click", function(){ setNowPlaying((current - 1 + episodes.length) % episodes.length, true); }); nextBtn.addEventListener("click", function(){ setNowPlaying((current + 1) % episodes.length, true); }); muteBtn.addEventListener("click", function(){ audio.muted = !audio.muted; volIcon.style.display = audio.muted ? "none" : ""; muteIcon.style.display = audio.muted ? "" : "none"; }); /* ---------- Feed parsing ---------- */ function escapeHtml(s){ return String(s).replace(/[&<>\"']/g, function(c){ return ({ "&":"&","<":"<",">":">","\"":""","'":"'" }[c]); }); } function formatDate(d){ return d ? (d.getFullYear()+"-"+pad(d.getMonth()+1)+"-"+pad(d.getDate())) : ""; } function parseFeed(xmlText) { var xml = new DOMParser().parseFromString(xmlText, "application/xml"); var ch = xml.querySelector("channel"); var chImg = (ch && ch.querySelector("itunes\\:image") && ch.querySelector("itunes\\:image").getAttribute("href")) || (xml.querySelector("channel>image>url") && xml.querySelector("channel>image>url").textContent) || ""; var items = Array.prototype.slice.call(xml.querySelectorAll("item")); var eps = items.map(function(it){ var t = (it.querySelector("title") && it.querySelector("title").textContent || "Untitled").trim(); var enclosure = it.querySelector("enclosure"); var media = it.querySelector("media\\:content, content"); var url = (enclosure && enclosure.getAttribute("url")) || (media && media.getAttribute("url")) || ""; var d = it.querySelector("pubDate") ? it.querySelector("pubDate").textContent : ""; var img = it.querySelector("itunes\\:image") ? it.querySelector("itunes\\:image").getAttribute("href") : ""; return { title: t, audioUrl: url, date: d ? new Date(d) : null, image: img || chImg }; }).filter(function(ep){ return !!ep.audioUrl; }); eps.sort(function(a,b){ var ta = a.date && a.date.getTime() || 0; var tb = b.date && b.date.getTime() || 0; return tb - ta; }); return { podcastImage: chImg, episodes: eps }; } function highlightActive(){ Array.prototype.forEach.call(list.children, function(el, i){ if (i === current) el.classList.add("active"); else el.classList.remove("active"); }); } function renderEpisodes() { list.innerHTML = ""; episodes.forEach(function(ep, idx){ var li = doc.createElement("li"); li.className = "item"; li.setAttribute("data-idx", String(idx)); li.innerHTML = '
'+escapeHtml(ep.title)+'
' + '
'+(ep.date ? formatDate(ep.date) : "")+'
'; li.addEventListener("click", function(){ setNowPlaying(idx, true); }); list.appendChild(li); }); highlightActive(); } function renderFallbackItem(title){ list.innerHTML = '
  • '+escapeHtml(title || "Current episode")+'
  • '; } function setNowPlaying(idx, play) { current = idx; var ep = episodes[idx]; if (!ep) return; nowTitle.textContent = ep.title; art.src = (art.src && art.src.trim() !== "") ? art.src : (ep.image || channelImage || ""); if (audio.src !== ep.audioUrl) audio.src = ep.audioUrl; highlightActive(); if (play && audio.play) { audio.play().catch(function(){}); } updatePlayUi(); } function findEpisodeIndexByUrl(eps, url) { if (!url) return -1; var uNoQ = stripQuery(url); for (var i=0; i