From cd48ccf8e090d097c806731f95fd268f42b18b82 Mon Sep 17 00:00:00 2001 From: nmemmert <67961292+nmemmert@users.noreply.github.com> Date: Tue, 20 Oct 2026 14:11:37 -0400 Subject: [PATCH] Report why each Plex connection failed Co-Authored-By: Claude Sonnet 5.5 --- server.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/server.js b/server.js index 72c50f5..5392229 100644 --- a/server.js +++ b/server.js @@ -198,15 +198,18 @@ async function plexApi(req, res) { if (!r) return json(res, 404, { error: 'Server not found' }); // Prefer direct remote connections, then relay, then local; first one that answers wins. const order = c => (c.local ? 2 : c.relay ? 1 : 0); + const tried = []; for (const c of [...r.connections].sort((a, b) => order(a) - order(b))) { + const label = (c.local ? 'local ' : c.relay ? 'relay ' : 'remote ') + new URL(c.uri).hostname.replace(/\.[0-9a-f]{20,}\.plex\.direct$/, ''); try { - const t = await fetch(c.uri + '/identity', { headers: { ...PLEX_HEADERS, 'X-Plex-Token': r.accessToken }, signal: AbortSignal.timeout(4000) }); - if (!t.ok) continue; + const t = await fetch(c.uri + '/identity', { headers: { ...PLEX_HEADERS, 'X-Plex-Token': r.accessToken }, signal: AbortSignal.timeout(6000) }); + if (!t.ok) { tried.push(`${label}: HTTP ${t.status}`); continue; } setCookies(req, res, { plex_srv: signed(c.uri), plex_stk: r.accessToken, plex_name: r.name }); return json(res, 200, { ok: true, name: r.name }); - } catch {} + } catch (e) { tried.push(`${label}: ${e.cause?.code || e.name || e.message}`); } } - return json(res, 502, { error: 'Could not reach this server. Check that Remote Access is enabled in Plex.' }); + console.error('Plex connect failed for', r.name, tried); + return json(res, 502, { error: 'Could not reach this server. Tried: ' + tried.slice(0, 4).join('; ') }); } if (u.pathname === '/api/plex/logout' && req.method === 'POST') { setCookies(req, res, { plex_token: '', plex_srv: '', plex_stk: '', plex_name: '' });