feat(settings): unified server-URL resolver + field; adopt in Jellyseerr

Type a loose address (media.example.com, https://…, host:port) and the app finds the working, canonical URL.

- utils/serverUrl: generic candidate generator (https-first, port/path preserved, no Jellyfin-specific ports), parallel-probe resolver, numeric semver compare, and a Jellyseerr probe (/api/v1/status, min 2.0.0).

- useServerUrlResolver: idle -> resolving -> ok | error state machine with cancellation.

- ServerUrlField: shared input that auto-resolves on blur, inline status chip (tap to re-test) + resolved URL, persists the canonical URL.

- Jellyseerr settings adopt the field and log in with the resolved URL. Probe contract makes Streamystats/Jellyfin/Merlin a drop-in follow-up.
This commit is contained in:
Gauvain
2026-06-04 20:13:10 +02:00
parent 0d796d01b8
commit 0f29457ff8
10 changed files with 566 additions and 36 deletions

14
utils/serverUrl/index.ts Normal file
View File

@@ -0,0 +1,14 @@
export {
getServerUrlCandidates,
type ParsedServerInput,
parseServerInput,
} from "./candidates";
export { jellyseerrProbe } from "./probes/jellyseerr";
export {
type ResolveFailureReason,
type ResolveOptions,
type ResolveResult,
resolveServerUrl,
} from "./resolve";
export { isVersionBelow } from "./semver";
export type { ServerProbe, ServerProbeOutcome } from "./types";