Jingle Jams on XPN2
Flip on JINGLE JAMS whenever you need a little holiday spirit! The annual audio stream curated by Robert Drake is 24/7 tunes with no chatter, no spots ā just wall-to-wall seasonal sounds from his collection! Jingle Jams is streaming NOW through Thursday, January 1, 2026!
To listen, just click the bright red play button below! You can also listen on any HD radio by flipping on WXPN-HD2.
Jingle Jams and The Night Before on XPN are made possible with support from The Energy Co-Op and Rival Brothers Coffee – along with the continued support of XPN Members – thanks!

Once again the time has come for my open call for your holiday cards! As you might know, I use the cards as part of my over-the-top WXPN studio decorations for my 33rd annual edition of The Night Before on XPN with Robert Drake (Iām live on air for 24 hours on December 24 and the Jingle Cam is up to capture all the decor!)
Send your cards to:
Robert Drake
WXPN
3025 Walnut St
Philadelphia PA 19104
(function() { function initStreamPlayers() { const players = document.querySelectorAll('.stream-image-player'); console.log('Found stream players:', players.length); players.forEach((container) => { container.addEventListener('click', function(e) { e.preventDefault(); e.stopPropagation(); const streamId = this.getAttribute('data-stream-id'); console.log('Clicked stream:', streamId); const allStreams = document.querySelectorAll('[data-stream]'); console.log('All streams found:', allStreams.length); let targetStream = null; let differentStream = null; allStreams.forEach((el) => { const elStreamId = el.getAttribute('data-stream'); if (elStreamId === streamId && !targetStream) { targetStream = el; } else if (elStreamId !== streamId && !differentStream) { // Just find any different stream, don't check for specific class differentStream = el; } }); console.log('Target stream:', targetStream); console.log('Different stream:', differentStream); if (targetStream && differentStream) { differentStream.dispatchEvent(new MouseEvent('click', { view: window, bubbles: true, cancelable: true })); setTimeout(() => { targetStream.dispatchEvent(new MouseEvent('click', { view: window, bubbles: true, cancelable: true })); setTimeout(() => { const playButton = document.querySelector('.sg-control-play .btn'); console.log('Looking for play button:', playButton); if (playButton) { const buttonTitle = playButton.getAttribute('title'); console.log('Button title:', buttonTitle); if (buttonTitle === 'Play') { console.log('Clicking play button'); playButton.click(); } else { console.log('Stream is already playing!'); } } else { console.log('Play button not found!'); } }, 1500); }, 500); } else { console.log('Could not find required stream elements'); } }); }); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initStreamPlayers); } else { initStreamPlayers(); } setTimeout(initStreamPlayers, 2000); })();
.stream-image-player { position: relative; width: 150px; height: 150px; cursor: pointer; display: inline-block; margin: 10px; overflow: hidden; border-radius: 8px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); transition: transform 0.2s; } .stream-image-player:hover { transform: scale(1.05); } .stream-image-player img { width: 100%; height: 100%; object-fit: cover; display: block; } .play-overlay { position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.4); display: flex; align-items: center; justify-content: center; transition: background 0.3s; } .stream-image-player:hover .play-overlay { background: rgba(0, 0, 0, 0.6); } .play-icon { width: 60px; height: 60px; fill:red; filter: drop-shadow(0 2px 4px rgba(0,0,0,0.3)); transition: transform 0.2s; pointer-events: none; } .stream-image-player:hover .play-icon { transform: scale(1.1); }