small fixes
This commit is contained in:
@@ -9,6 +9,34 @@ const rl = readline.createInterface({
|
||||
let activeClient = null;
|
||||
let activePlayer = null;
|
||||
|
||||
function isNotAllowedError(err) {
|
||||
if (!err) return false;
|
||||
const msg = (err.message || String(err)).toUpperCase();
|
||||
return msg.includes('NOT_ALLOWED') || msg.includes('NOT ALLOWED');
|
||||
}
|
||||
|
||||
function stopSessions(client, sessions, cb) {
|
||||
if (!client || !sessions || sessions.length === 0) return cb();
|
||||
|
||||
const remaining = sessions.slice();
|
||||
const stopNext = () => {
|
||||
const session = remaining.shift();
|
||||
if (!session) return cb();
|
||||
|
||||
client.stop(session, (err) => {
|
||||
if (err) {
|
||||
log(`Stop session failed (${session.appId || 'unknown app'}): ${err.message || String(err)}`);
|
||||
} else {
|
||||
log(`Stopped session (${session.appId || 'unknown app'})`);
|
||||
}
|
||||
// Continue regardless; best-effort.
|
||||
stopNext();
|
||||
});
|
||||
};
|
||||
|
||||
stopNext();
|
||||
}
|
||||
|
||||
function log(msg) {
|
||||
console.log(JSON.stringify({ type: 'log', message: msg }));
|
||||
}
|
||||
@@ -71,14 +99,21 @@ function play(ip, url) {
|
||||
if (err) {
|
||||
log('Join failed, attempting launch...');
|
||||
log(`Join error: ${err && err.message ? err.message : String(err)}`);
|
||||
launchPlayer(url);
|
||||
// Join can fail if the session is stale; stop it and retry launch.
|
||||
stopSessions(activeClient, [session], () => launchPlayer(url, /*didStopFirst*/ true));
|
||||
} else {
|
||||
activePlayer = player;
|
||||
loadMedia(url);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
launchPlayer(url);
|
||||
// If another app is running, stop it first to avoid NOT_ALLOWED.
|
||||
if (sessions.length > 0) {
|
||||
log('Non-media session detected, stopping before launch...');
|
||||
stopSessions(activeClient, sessions, () => launchPlayer(url, /*didStopFirst*/ true));
|
||||
} else {
|
||||
launchPlayer(url, /*didStopFirst*/ false);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -91,13 +126,37 @@ function play(ip, url) {
|
||||
});
|
||||
}
|
||||
|
||||
function launchPlayer(url) {
|
||||
function launchPlayer(url, didStopFirst) {
|
||||
if (!activeClient) return;
|
||||
|
||||
activeClient.launch(DefaultMediaReceiver, (err, player) => {
|
||||
if (err) {
|
||||
// If launch fails with NOT_ALLOWED, it sometimes means we MUST join or something else is occupying it
|
||||
const details = `Launch error: ${err && err.message ? err.message : String(err)}${err && err.code ? ` (code: ${err.code})` : ''}`;
|
||||
// If launch fails with NOT_ALLOWED, the device may be busy with another app/session.
|
||||
// Best-effort: stop existing sessions once, then retry launch.
|
||||
if (!didStopFirst && isNotAllowedError(err)) {
|
||||
log('Launch NOT_ALLOWED; attempting to stop existing sessions and retry...');
|
||||
activeClient.getSessions((sessErr, sessions) => {
|
||||
if (sessErr) {
|
||||
error(`${details} | GetSessions error: ${sessErr.message || String(sessErr)}`);
|
||||
return;
|
||||
}
|
||||
stopSessions(activeClient, sessions, () => {
|
||||
activeClient.launch(DefaultMediaReceiver, (retryErr, retryPlayer) => {
|
||||
if (retryErr) {
|
||||
const retryDetails = `Launch retry error: ${retryErr && retryErr.message ? retryErr.message : String(retryErr)}${retryErr && retryErr.code ? ` (code: ${retryErr.code})` : ''}`;
|
||||
error(retryDetails);
|
||||
try { error(`Launch retry error full: ${JSON.stringify(retryErr)}`); } catch (e) { /* ignore */ }
|
||||
return;
|
||||
}
|
||||
activePlayer = retryPlayer;
|
||||
loadMedia(url);
|
||||
});
|
||||
});
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
error(details);
|
||||
try { error(`Launch error full: ${JSON.stringify(err)}`); } catch (e) { /* ignore */ }
|
||||
return;
|
||||
@@ -112,8 +171,12 @@ function loadMedia(url) {
|
||||
|
||||
const media = {
|
||||
contentId: url,
|
||||
contentType: 'audio/mp3',
|
||||
streamType: 'LIVE'
|
||||
contentType: 'audio/mpeg',
|
||||
streamType: 'LIVE',
|
||||
metadata: {
|
||||
metadataType: 0,
|
||||
title: 'Radio 1'
|
||||
}
|
||||
};
|
||||
|
||||
activePlayer.load(media, { autoplay: true }, (err, status) => {
|
||||
|
||||
Reference in New Issue
Block a user