74 lines
2.8 KiB
JavaScript
74 lines
2.8 KiB
JavaScript
/* Receiver for "Radio Player" using CAF Receiver SDK */
|
|
(function () {
|
|
const STREAM_URL = 'https://live.radio1.si/Radio1MB';
|
|
|
|
function $(id) { return document.getElementById(id); }
|
|
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
const context = cast.framework.CastReceiverContext.getInstance();
|
|
const playerManager = context.getPlayerManager();
|
|
const statusEl = $('status');
|
|
const stationEl = $('station');
|
|
|
|
// Intercept LOAD to enforce correct metadata for LIVE audio
|
|
playerManager.setMessageInterceptor(
|
|
cast.framework.messages.MessageType.LOAD,
|
|
(request) => {
|
|
if (!request || !request.media) return request;
|
|
|
|
request.media.contentId = request.media.contentId || STREAM_URL;
|
|
request.media.contentType = 'audio/mpeg';
|
|
request.media.streamType = cast.framework.messages.StreamType.LIVE;
|
|
|
|
request.media.metadata = request.media.metadata || {};
|
|
request.media.metadata.title = request.media.metadata.title || 'Radio 1';
|
|
request.media.metadata.images = request.media.metadata.images || [{ url: 'assets/logo.svg' }];
|
|
|
|
return request;
|
|
}
|
|
);
|
|
|
|
// Update UI on player state changes
|
|
playerManager.addEventListener(
|
|
cast.framework.events.EventType.PLAYER_STATE_CHANGED,
|
|
() => {
|
|
const state = playerManager.getPlayerState();
|
|
switch (state) {
|
|
case cast.framework.messages.PlayerState.PLAYING:
|
|
statusEl.textContent = 'Playing';
|
|
break;
|
|
case cast.framework.messages.PlayerState.PAUSED:
|
|
statusEl.textContent = 'Paused';
|
|
break;
|
|
case cast.framework.messages.PlayerState.IDLE:
|
|
statusEl.textContent = 'Stopped';
|
|
break;
|
|
default:
|
|
statusEl.textContent = state;
|
|
}
|
|
}
|
|
);
|
|
|
|
// When a new media is loaded, reflect metadata (station name, artwork)
|
|
playerManager.addEventListener(cast.framework.events.EventType.LOAD, (event) => {
|
|
const media = event && event.data && event.data.media;
|
|
if (media && media.metadata) {
|
|
if (media.metadata.title) stationEl.textContent = media.metadata.title;
|
|
if (media.metadata.images && media.metadata.images[0] && media.metadata.images[0].url) {
|
|
const img = document.querySelector('#artwork img');
|
|
img.src = media.metadata.images[0].url;
|
|
}
|
|
}
|
|
});
|
|
|
|
// Optional: reflect volume in title attribute
|
|
playerManager.addEventListener(cast.framework.events.EventType.VOLUME_CHANGED, (evt) => {
|
|
const level = evt && evt.data && typeof evt.data.level === 'number' ? evt.data.level : null;
|
|
if (level !== null) statusEl.title = `Volume: ${Math.round(level * 100)}%`;
|
|
});
|
|
|
|
// Start the cast receiver context
|
|
context.start({ statusText: 'Radio Player Ready' });
|
|
});
|
|
})();
|