', '', '

WPFW 89.3 FM

', 'Donate', ' ' ].join(''); w.document.open(); w.document.write(doc); w.document.close(); w.focus(); } if(popBtn){ /* On a phone there is no such thing as a small floating window -- the same action opens a second tab, and audio in a background tab keeps playing while the visitor browses in the tab in front of it. Same result, so the button stays; only the wording changes. */ if(window.matchMedia && window.matchMedia('(pointer:coarse)').matches){ popBtn.setAttribute('aria-label','Open the player in a new tab'); popBtn.setAttribute('title','Listen in a new tab'); } popBtn.addEventListener('click', popOut); } /* ---------- lock screen / headphone controls ---------- Tells the phone what is playing, so the show name appears on the lock screen and the play button on headphones works. */ function mediaMeta(show, host, track){ if(!('mediaSession' in navigator)) return; try{ navigator.mediaSession.metadata = new MediaMetadata({ title: show || 'WPFW 89.3 FM', artist: host || 'Jazz and Justice Radio', album: track || 'WPFW 89.3 FM' }); navigator.mediaSession.setActionHandler('play', function(){ if(!wantPlay){ wantPlay = true; attempt(0); } }); navigator.mediaSession.setActionHandler('pause', function(){ stop(); }); }catch(e){} } /* the archive page asks the live stream to stand down before it plays */ window.addEventListener('wpfw:pause-live', function(){ if(root.classList.contains('is-playing') || root.classList.contains('is-loading')){ stop(); remember(false); } }); /* ---------- helpers ---------- */ function norm(s){ return (s||"").toLowerCase().replace(/[^a-z0-9]/g,''); } var decoder = document.createElement('textarea'); function decode(s){ if(!s) return ""; decoder.innerHTML = String(s); return (decoder.value || "").trim(); } function plain(s){ var d = decode(s); if(d.indexOf('<') === -1) return d; var t = document.createElement('div'); t.innerHTML = d; return (t.textContent || "").trim(); } function esc(s){ return String(s).replace(/[&<>"]/g,function(c){ return {'&':'&','<':'<','>':'>','"':'"'}[c]; }); } function photoUrl(rec){ var p = decode(rec.sh_photo); if(!p) p = decode(rec.sh_med_photo); if(!p || /^(na|none|null)$/i.test(p)) return ""; if(/^https?:\/\//i.test(p)) return p; return pixBase.replace(/\/+$/,'') + '/' + p.replace(/^\/+/,''); } /* the feed is an array of one-key objects -- find blocks by key */ function pick(data, key){ if(!Array.isArray(data)) return null; for(var i = 0; i < data.length; i++){ if(data[i] && typeof data[i] === 'object' && data[i][key]) return data[i][key]; } return null; } function render(data){ var glob = pick(data,'global'); if(glob){ if(glob.gl_pixurl) pixBase = decode(glob.gl_pixurl); var lu = decode(glob.listenurl); if(lu && streamList.indexOf(lu) === -1) streamList.unshift(lu); } var cur = pick(data,'current'); if(!cur) return; var name = plain(cur.sh_name), dj = plain(cur.sh_djname), song = plain(cur.pl_song), art = plain(cur.pl_artist); log('show:', name, '| host:', dj, '| song:', song); mediaMeta(name, dj ? 'with ' + dj : '', song ? song + (art ? ' / ' + art : '') : ''); elShow.textContent = name || "WPFW 89.3 FM"; var pic = photoUrl(cur); if(pic){ var probe = new Image(); probe.onload = function(){ elPic.style.backgroundImage = "url('" + pic + "')"; elPic.classList.add('has-img'); }; probe.onerror = function(){ elPic.style.backgroundImage = ""; elPic.classList.remove('has-img'); }; probe.src = pic; } else { elPic.style.backgroundImage = ""; elPic.classList.remove('has-img'); } var hostTxt = (dj && norm(name).indexOf(norm(dj)) === -1) ? "with " + dj : ""; elHost.textContent = hostTxt; elHost.hidden = !hostTxt; var songHTML = ""; if(song) songHTML = "" + esc(song) + "" + (art ? "  /  " + esc(art) : ""); else if(cur.cur_start && cur.cur_end) songHTML = esc(decode(cur.cur_start) + " - " + decode(cur.cur_end)); elSong.innerHTML = songHTML; elSep.hidden = !(hostTxt && songHTML); if(cur.pledge && /^https?:\/\//.test(cur.pledge)) elGive.href = decode(cur.pledge); } function tick(){ fetch(CONFIG.FEED, {cache:'no-store'}) .then(function(r){ if(!r.ok) throw new Error(r.status); return r.json(); }) .then(render) .catch(function(e){ log('feed unavailable:', e); }); } tick(); var timer = setInterval(tick, CONFIG.REFRESH_MS); document.addEventListener('visibilitychange', function(){ if(document.hidden){ clearInterval(timer); } else { tick(); timer = setInterval(tick, CONFIG.REFRESH_MS); } }); } /* end init */ })();
0
Skip to Content
WPFW 89.3FM
Who We Are
Programmers
Local Station Board
Jobs
News
Jazz and Justice Festival
50th Anniversary
Station Events
Social Justice Calendar
On-Demand Archive
Programs
Schedule Grid
Today's Playlists
Become a Member
Ways to Give
Volunteer
The Vault
Contact
Donate
WPFW 89.3FM
Who We Are
Programmers
Local Station Board
Jobs
News
Jazz and Justice Festival
50th Anniversary
Station Events
Social Justice Calendar
On-Demand Archive
Programs
Schedule Grid
Today's Playlists
Become a Member
Ways to Give
Volunteer
The Vault
Contact
Donate
Folder: About
Back
Who We Are
Programmers
Local Station Board
Jobs
News
Folder: Events
Back
Jazz and Justice Festival
50th Anniversary
Station Events
Social Justice Calendar
Folder: On Air
Back
On-Demand Archive
Programs
Schedule Grid
Today's Playlists
Folder: Support Us
Back
Become a Member
Ways to Give
Volunteer
The Vault
Contact
Donate
WPFW 89.3

Jazz and Justice Radio. Community radio from the heart of Washington, DC, on the air since 1977.

▶ Listen live

Listen

  • Schedule grid
  • Archived shows
  • Today's playlists
  • News
  • Events

Support

  • Donate
  • Become a member
  • Ways to give
  • Volunteer
  • 50th anniversary

Connect

  • info@wpfw.org
  • 202-588-0999
  • Contact
  • Who we are
  • Local Station Board

© 2026 WPFW 89.3 FM, Washington, DC. WPFW-FM is licensed to the Pacifica Foundation, a 501(c)(3) nonprofit.
Online public file  ·  DMCA infringement claims  ·  Privacy policy  ·  About the station

Pacifica Foundation
Advertisement
Advertisement