Files
psysonic/src/locales/nl/help.ts
T
Psychotoxical 1a82376f8c feat(music-network): unified scrobble & enrichment framework (replaces hard-wired Last.fm) (#1066)
* feat(music-network): core domain types and wire contracts

Foundation for the Music Network framework: provider-agnostic domain
types, capability model, typed errors, and account shapes under
src/music-network/core, plus the ScrobbleWire / EnrichmentWire /
PresetManifest / AuthStrategy contracts. No runtime wiring yet.

* feat(music-network): generic audioscrobbler/listenbrainz/maloja transports

Generalize the Rust remote layer for the Music Network framework. Add
provider-agnostic transports parameterized by base_url:

- audioscrobbler_request: Audioscrobbler v2 with caller-supplied endpoint
  (Last.fm, Libre.fm, Rocksky, custom GNU FM, Maloja compat share it)
- listenbrainz_request: Token-header JSON (direct + Maloja LB compat)
- maloja_request: native /apis/mlj_1 JSON

lastfm_request stays as a thin transition delegate against the fixed
host; it is removed once the framework owns all call sites. Wiremock
tests cover audioscrobbler_request with a custom base_url and API-error
mapping.

* feat(music-network): audioscrobbler wire with last.fm + libre.fm presets

Add the Audioscrobbler v2 wire, the behavioural successor to the legacy
src/api/lastfm.ts, implementing the full EnrichmentWire surface (scrobble,
now playing, love/unlove, loved sync, similar artists, track/artist stats,
top lists, recent tracks, user profile, urls).

- client.ts: transport wrapper over audioscrobbler_request, classifying
  failures into MusicNetworkError without touching any store
- sign.ts: TS mirror of the api_sig base-string ordering rule (unit-tested)
- auth/tokenPoll.ts: browser token-poll connect flow as a reusable strategy
- presets/lastfm.ts, presets/librefm.ts: bundled, enrichment-capable,
  token-poll presets (both endpoints verified live)

Extends WireContext with profileBase and ConnectContext with authBase so
URL builders and connect flows need no preset lookup.

* feat(music-network): listenbrainz + maloja-native wires, paste-auth presets

Add the scrobble-destination wires and presets:

- ListenBrainz wire (scrobble + now playing via playing_now), backing both
  the direct api.listenbrainz.org preset and the Maloja /apis/listenbrainz
  compat preset (one wire, two presets, differing only by base URL)
- Maloja native wire (/apis/mlj_1/newscrobble, scrobble only — Maloja has
  no now-playing endpoint)
- Shared api_key_only paste-auth strategy (token/key/session-key paste);
  the Audioscrobbler wire now dispatches token-poll vs paste by preset
- Presets: listenbrainz, maloja_listenbrainz, maloja_native, rocksky
  (scrobble-only, session-key paste, bundled keys — verified live), and
  custom_gnufm (token-poll, user-supplied url/key/secret)
- Contracts: ConnectContext.authStrategy, PresetManifest.selfHostedApiSuffix

maloja_compat (the {url}/apis/audioscrobbler mode) is intentionally omitted:
its protocol cannot be verified and is almost certainly the legacy handshake,
not the 2.0 web API; Maloja is covered by the native and ListenBrainz modes.

* feat(music-network): registry, orchestrator, enrichment router + runtime facade

Wire the framework together behind a single facade:

- registry: wireRegistry (WireId -> wire), presetRegistry (the 7 built-in
  presets), registerBuiltinWires (one-time side-effect registration)
- CapabilityProbe: wire probe overlaid by manifest staticCapabilities as the
  final authority (lets two presets on one wire diverge, e.g. Rocksky's
  nowPlaying:false over the Audioscrobbler wire's optimistic yes)
- ScrobbleOrchestrator: best-effort fan-out; flips the per-account
  session-error flag on AUTH_SESSION_INVALID and clears it on next success
- EnrichmentRouter: resolves the single primary to its EnrichmentWire; the
  type guard rejects non-enrichment wires (Maloja/ListenBrainz)
- MusicNetworkRuntime: the only app entry point — accounts, roles, fan-out,
  enrichment, urls, probe. Reads/writes state through the MusicNetworkStore
  port (Phase 5 backs it with the auth store) and a RuntimeHost for side effects
- getMusicNetworkRuntime singleton + index.ts public barrel

Tests cover fan-out, master toggle, capability gating, session-error
flip/clear, primary eligibility, and enrichment routing.

* feat(music-network): auth-store state + lossless legacy migration + runtime bridge

Add the persisted Music Network state to the auth store and wire the runtime,
all additively — nothing existing breaks yet.

- authStoreTypes: musicNetworkAccounts / enrichmentPrimaryId /
  scrobblingMasterEnabled + actions; legacy lastfm* fields kept until Phase 6
- authMusicNetworkActions + defaults/wiring (synchronous localStorage)
- accountPersistence: migrateLegacyLastfm (lossless — preserves session key,
  username and scrobbling preference; fills bundled Last.fm key from the preset;
  sets the migrated account as enrichment primary) + sanitizeAccounts
- authStoreRehydrate: one-shot migration guarded by a sentinel so a later
  disconnect cannot resurrect the account from still-present legacy fields
- musicNetworkBridge: backs the MusicNetworkStore port with the auth store and
  the RuntimeHost with the Tauri shell; initialized in pre-React bootstrap

nowPlayingEnabled stays a global toggle (not a lastfm* field); the Phase 6
playback call-site will gate dispatchNowPlaying on it, preserving behaviour.

* feat(music-network): route playback, enrichment and love through the runtime

Migrate every Last.fm call-site onto the Music Network runtime, preserving
behaviour:

- playback (audioEventHandlers, playTrackAction): scrobble@50% and now-playing
  via dispatchScrobble/dispatchNowPlaying; loved-fetch via isTrackLoved. Now-
  playing follows scrobbling (as Last.fm did), Navidrome now-playing keeps the
  nowPlayingEnabled gate
- enrichment: useArtistSimilarArtists, useNowPlayingFetchers, Statistics, and
  the ArtistDetail similar-artists gate now use the runtime, gated on an
  enrichment primary
- love: PlayerBar, PlayerTrackInfo, all context menus, useNowPlayingStarLove and
  the startup loved-sync route through setTrackLoved / toggleNetworkLove
- player store: lastfmLoved/lastfmLovedCache -> networkLoved/networkLovedCache;
  lastfmActions -> networkLoveActions; loved cache storage renamed with a
  lossless legacy-key fallback
- getMusicNetworkRuntimeOrNull() for best-effort callers so they no-op (not
  throw) before the runtime is initialized

src/api/lastfm.ts and the Integrations UI still use the legacy path; they are
migrated and removed in the next phase.

* feat(music-network): manifest-driven Integrations UI + scrobble batch format

Replace the Last.fm Integrations card with a manifest-driven Music Network
section, and fix Audioscrobbler scrobbling to the batch/array shape.

- settings/musicNetwork/: MusicNetworkSection (master toggle, destination
  cards, enrichment-primary picker, Maloja proxy warning, add-a-service list)
  driven entirely off the preset registry; icon map from PresetManifest.icon
- IntegrationsTab delegates to MusicNetworkSection (Discord/Bandsintown/
  Navidrome now-playing unchanged)
- i18n: musicNetwork.* across all 9 locales, incl. a per-field help hint for
  Rocksky's CLI session-key flow (rocksky login)
- scrobble now uses the documented array form (artist[0]/track[0]/…); the bare
  single form is only tolerated by Last.fm, Rocksky requires the indexed form
- auth-error detection keys off the response message (not the ambiguous numeric
  code) so a Rocksky server-500 no longer flips the account to a reconnect state
- PresetManifest.PresetField gains an optional helpKey

Rocksky's server rejects some non-ASCII track metadata with a 500 — a Rocksky
backend bug; the client call is correct (verified).

* fix(music-network): clearer Integrations layout + scrobble batch fix

Address UI feedback on the Music Network section:
- per-account scrobble toggle moves inside its account block (was a loose
  row between cards — unclear which account it belonged to)
- master toggle and the primary-service picker are now boxed blocks at the top,
  not bare rows
- primary-service copy reworked: 'Primary service' + a line spelling out that
  liked tracks/similar artists/stats come from it while scrobbling still goes
  to all enabled services
- distinct zones separated by dividers (master/primary · connected · add)

Also folds in the verified scrobble fixes: documented array form
(artist[0]/track[0]/…) so Rocksky accepts scrobbles, and auth-error detection
by message rather than the ambiguous numeric code (a Rocksky server-500 no
longer flips the account to a reconnect state). Rocksky session-key field gains
a CLI help hint (rocksky login), all 9 locales.

* feat(music-network): indicator + remove legacy lastfm path

Phase 7b/7c — finish the cutover and delete the old Last.fm path.

- LastfmIndicator -> MusicNetworkIndicator (shows the enrichment primary's
  status, click -> Integrations)
- delete src/api/lastfm.ts; remove Rust lastfm_request (remote.rs + lib.rs)
- remove legacy authStore lastfm* fields, actions and types; delete
  authLastfmActions.ts; rehydrate migration reads the legacy blob via a cast
- migrate the remaining NowPlaying call-sites (NowPlaying.tsx + the now-playing
  fetchers/prewarm/star-love hooks) off lastfmSessionKey/lastfmUsername onto the
  enrichment primary (gate + cache key)
- type imports LastfmTrackInfo/LastfmArtistStats -> music-network TrackStats/
  ArtistStats; drop 8 stale api/lastfm test mocks and the obsolete Last.fm auth
  tests; update settingsTabs + src/CLAUDE.md

No lastfm imports remain outside src/music-network/; lastfm_request removed
(acceptance §12). tsc clean, 1947 frontend tests + remote rust tests green.

* test(music-network): cover scrobble shape + error classification, drop dead i18n keys

Remove the 14 unused legacy scrobble/connection i18n keys across all 9
locales (settings.lfm*/scrobble*, connection.lastfm*); the live love,
profile-link and now-playing keys stay.

Add regression tests for the parity-critical transport logic: the indexed
batch/array scrobble body, the auth-vs-network error classification
(numeric codes collide across providers), and the manifest-overrides-probe
capability merge.

* feat(music-network): provider-agnostic UI + Maloja Audioscrobbler & Koito presets

- de-hardcode the single provider name across every enrichment surface
  (love labels, now-playing badge, stats title); derive it from the
  enrichment primary and interpolate via {{provider}} i18n params
- surface a toast when a paste-auth connect probe fails — a static
  'supported' capability flag no longer masks a runtime probe error
- add the Maloja Audioscrobbler (GNU FM) preset (the third Maloja wire
  mode) and a Koito preset (ListenBrainz-compatible), both data-only
- generalise PRIVACY.md and the scrobbling help entry to the framework
- rename residual lfm* identifiers to network*; strip legacy flat
  lastfm* fields from the persisted blob; neutral transport error prefix
- tests: error classification, scrobble body, capability probe, registry

* fix(music-network): validate paste-auth keys on connect + UI polish

- AudioscrobblerWire.probe now validates an api_key_only session with a
  signed call and reports scrobble:'error' only on a genuine auth failure
  (a scrobble-only service that rejects user.getInfo is not a bad key), so
  an invalid Maloja Audioscrobbler / Rocksky key surfaces a connect toast
  instead of failing silently; WireContext carries the preset authStrategy
- drop the unreachable Statistics empty-state branch and its dead
  lfmNotConnected i18n key; use the useEnrichmentPrimaryLabel hook there
- drive the love-button glyph from the enrichment primary's manifest icon;
  neutral Music Network section icon; remove a dead LastfmIcon import
- tests: paste-auth vs token-poll probe behaviour

* chore(music-network): rename showLastfmSimilar → showNetworkSimilar, refresh stale comments

Post-parity polish: the similar-artists toggle now sources from the generic
enrichment runtime, so rename the lingering lastfm-flavoured identifier; drop
stale 'Mirrors today's LastfmX' doc comments referencing the removed legacy
types, and generalise the scrobble-point comment.

* docs(changelog): Music Network entry (PR #1066)

Co-Authored-By: cucadmuh <49571317+cucadmuh@users.noreply.github.com>

* fix(music-network): bound request timeout on the provider transports

audioscrobbler_request / listenbrainz_request / maloja_request built a
reqwest client with no timeout, so a hung provider left scrobble / probe /
loved-sync promises unresolved. Add a shared provider_http_client() with a
15s timeout, matching the sibling fetch_* commands. Addresses review C3.

* refactor(music-network): dedupe wire transport + no-enrichment helpers

The three provider clients repeated the same invoke -> classify-error ->
MusicNetworkError boilerplate, and the three probe() bodies repeated the
"mark every enrichment capability no" loop. Extract
wires/shared/invokeTransport() (each wire keeps its own arg shape + auth
rule) and markNoEnrichment() in core/capabilities.ts. Addresses review C4.

* refactor(music-network): drop write-only malojaWireMode dead state

malojaWireMode was written on connect but never read — the wire is resolved
by wireId and the Maloja base URL by the preset's selfHostedApiSuffix.
Remove the field, the MalojaWireMode type, the malojaWireModeFor helper,
the AccountPatch entry, the PresetField union member, and the export.
Addresses review C1.

* refactor(music-network): one useEnrichmentPrimary hook, drop lastfm fallback

The enrichment-primary lookup (accounts.find by enrichmentPrimaryId) was
duplicated across two hooks and inlined in the indicator and both
context-menu builders, two of them with a hardcoded 'lastfm' icon fallback.
Add one music-network/ui/useEnrichmentPrimary() returning
{account,label,icon}|null; useEnrichmentPrimaryLabel/Icon delegate to it and
the indicator + context menus consume it directly. Icon fallback is the
neutral 'custom' glyph, never a provider (provider-agnostic, §7.3).
Addresses review C2.

---------

Co-authored-by: cucadmuh <49571317+cucadmuh@users.noreply.github.com>
2026-06-11 22:56:30 +02:00

106 lines
19 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
export const help = {
title: 'Help',
searchPlaceholder: 'Help doorzoeken…',
noResults: 'Geen overeenkomende onderwerpen. Probeer een andere zoekterm.',
s1: 'Aan de slag',
q1: 'Welke servers zijn compatibel?',
a1: 'Psysonic is in de eerste plaats voor Navidrome gebouwd en volledig Subsonic-compatibel — Gonic, Airsonic, LMS en andere Subsonic-API-servers werken ook. Sommige geavanceerde functies (beoordelingen, smart playlists, Magic-String-delen, gebruikersbeheer) vereisen Navidrome.',
q2: 'Hoe voeg ik een server toe?',
a2: 'Instellingen → Servers → Server toevoegen. Voer de URL in (bijv. http://192.168.1.100:4533), gebruikersnaam en wachtwoord. Psysonic test de verbinding voor het opslaan — bij een fout wordt niets opgeslagen. U kunt zoveel servers toevoegen als u wilt en in de header tussen ze schakelen; er is altijd maar één actief.',
q3: 'Snelle UI-rondleiding?',
a3: 'Zijbalk (links) voor navigatie, Mainstage / pagina\'s in het midden, speelbalk onderaan, wachtrijpaneel rechts (te openen via het pictogram rechtsboven naast de Now-Playing-indicator). De zoekbalk bovenaan doorzoekt de hele bibliotheek; "Now Playing" toont wat andere gebruikers op dezelfde Navidrome-server momenteel luisteren.',
s2: 'Afspelen & Wachtrij',
q4: 'Hoe gebruik ik de wachtrij?',
a4: 'Open het wachtrijpaneel via de header rechtsboven. Sleep rijen om te herordenen, sleep ze naar buiten om te verwijderen, of gebruik de werkbalk om te shuffelen, de wachtrij als afspeellijst op te slaan of naar een nummer te springen. Sleep rijen uit het paneel om ze elders als overdracht te plaatsen.',
q5: 'Gapless versus Crossfade — wat is het verschil?',
a5: 'Gapless buffert het volgende nummer vooraf zodat er nul stilte tussen de nummers zit (ideaal voor live-albums en DJ-mixen). Crossfade vervaagt het huidige nummer terwijl het volgende invaagt over 110 s (ideaal voor gemixte mixen). Ze zijn wederzijds uitsluitend — een inschakelen schakelt de andere uit. Configureer in Instellingen → Audio.',
q6: 'Wat is de Infinite Queue?',
a6: 'Wanneer de wachtrij leegloopt en Herhalen uit staat, voegt Psysonic stilletjes vergelijkbare/willekeurige nummers uit uw bibliotheek toe zodat het afspelen nooit stopt. Auto-toegevoegde nummers verschijnen onder een "— Automatisch toegevoegd —" scheidingslijn. Schakelen via het oneindigheidspictogram in de wachtrij-header; in Instellingen → Wachtrij beperken tot een genre.',
q7: 'Meervoudige selectie en Shift-klik bereik?',
a7: 'Activeer "Selecteren" op Albums / Nieuwe releases / Random Albums / Afspeellijsten. Klik een item om het te toggelen, houd dan Shift en klik een ander item — alles ertussen in de zichtbare volgorde wordt geselecteerd. Shift-klikken breiden uit vanuit het laatst aangeklikte ankerpunt. De werkbalk biedt bulkacties (wachtrij, downloaden, verwijderen, etc.).',
q8: 'Sneltoetsen en globale hotkeys?',
a8: 'Standaard in-app-toetsen: Spatie = Afspelen / Pauzeren, Esc = sluit volledig scherm / modals, F1 = sneltoetsenoverzicht. Instellingen → Invoer laat u elke in-app-actie opnieuw toewijzen (ook akkoorden zoals Ctrl+Shift+P) en systeembrede globale snelkoppelingen instellen die ook werken wanneer Psysonic op de achtergrond draait. Mediatoetsen (Afspelen/Pauzeren, Volgende, Vorige) werken op alle platforms.',
s3: 'Audiotools',
q9: 'Replay Gain modi?',
a9: 'Instellingen → Audio → Replay Gain. Track-modus normaliseert elk nummer naar een doelniveau. Album-modus behoudt de luidheidscurve binnen een album. Auto-modus kiest Track of Album op basis van of de wachtrij van een enkel album komt. Nummers zonder Replay Gain-tags vallen terug op een configureerbare voorversterker.',
q10: 'Wat is Smart Loudness Normalization (LUFS)?',
a10: 'Een modern alternatief voor Replay Gain in Instellingen → Audio. Psysonic analyseert elk nummer naar LUFS / EBU R128 en slaat het resultaat op, zodat het volume consistent is over uw hele bibliotheek — ook nummers zonder Replay Gain-tags. Cold-cache-analyse loopt op de achtergrond en gebruikt 3540% CPU gedurende ~1 minuut, daarna 0. Stel uw doel-luidheid (standaard 10 LUFS) één keer in.',
q11: 'EQ en AutoEQ?',
a11: 'Een 10-bands parametrische EQ in Instellingen → Audio → Equalizer met handmatige banden en presets. AutoEQ ernaast haalt een gemeten correctieprofiel voor uw hoofdtelefoonmodel op uit de AutoEQ-database en past het automatisch toe op de banden — kies uw hoofdtelefoon, de EQ klikt op de juiste curve.',
q12: 'Hoe wissel ik het audio-uitvoerapparaat?',
a12: 'Instellingen → Audio → Uitvoerapparaat. Psysonic toont alle beschikbare uitgangen en wisselt onmiddellijk wanneer u kiest. De vernieuwen-knop scant naar apparaten die na het opstarten zijn aangesloten. Linux ALSA-namen zoals "sysdefault" worden voor leesbaarheid automatisch opgeschoond.',
q13: 'Wat is de Hot Cache?',
a13: 'Hot Cache laadt het huidige nummer plus de volgende vooraf in RAM en op schijf zodat het afspelen zonder buffervertraging start — vooral nuttig op trage / externe servers. Eviction treedt in werking wanneer de groottelimiet wordt bereikt. Configureer grootte en de debounce-vertraging (zodat snelle skips niet over-fetchen) in Instellingen → Audio.',
s4: 'Bibliotheek & Ontdekking',
q14: 'Hoe werken beoordelingen en Skip-to-1★?',
a14: 'Psysonic ondersteunt 15 sterren-beoordelingen via OpenSubsonic (Navidrome ≥ 0.53). Beoordeel nummers in tracklijsten, in het rechtsklikmenu, of in de speelbalk onder de artiestnaam; albums op de albumpagina; artiesten op de artiestpagina. Skip-to-1★ (Instellingen → Bibliotheek → Beoordelingen) wijst automatisch 1 ster toe na een configureerbaar aantal opeenvolgende skips. Hetzelfde paneel laat u een minimum-beoordeling instellen voor gegenereerde mixen.',
q15: 'Hoe blader ik — Mappen, Genres, Tracks?',
a15: 'De mappenbrowser (zijbalk) loopt door de muziekmap van uw server in een Miller-kolomlay-out — klik op een map om in te duiken, klik op een nummer of het play-pictogram van een map om af te spelen / toe te voegen. Genres gebruikt een tag-cloud-weergave geschaald op aantal nummers; klik op een genre om het te openen. Tracks is een platte bibliotheekhub met kolomgesorteerde virtuele lijst en live zoeken.',
q16: 'Zoeken en geavanceerd zoeken?',
a16: 'De headerzoekbalk voert een snelle live zoekopdracht uit terwijl u typt over artiesten, albums en nummers. Open Geavanceerd zoeken (zijbalk) voor een rijkere weergave: filter op jaar, genre, beoordeling, formaat, kanalen, samplerate, BPM, stemming en combineer criteria. Rechtsklik op elk resultaat opent hetzelfde contextmenu als elders.',
q17: 'Wat zijn de Mixes (Random / Genre / Super Genre / Lucky)?',
a17: 'Random Mix bouwt een afspeellijst van willekeurige nummers uit uw bibliotheek; het Trefwoordfilter sluit audioboeken, comedy etc. uit op basis van genre / titel / album-substrings. Super Genre Mix groepeert uw bibliotheek in brede stijlen (Rock, Metal, Electronic, Jazz, Klassiek …) en bouwt een gefocuste mix uit één. Lucky Mix gebruikt uw luistergeschiedenis, beoordelingen en AudioMuse-AI vergelijkbare nummers om met één klik een directe afspeellijst samen te stellen.',
q18: 'Statistiekenpagina?',
a18: 'Statistieken (zijbalk) toont topartiesten, topalbums, topnummers, genre-uitsplitsing, luistertijd over tijd en per-bibliotheek-bereik wanneer u meer dan één muziekmap hebt geconfigureerd. Verschillende weergaven zijn exporteerbaar als deelbare kaartafbeelding.',
q19: 'Hoe download ik een album als ZIP?',
a19: 'Albumpagina → "Downloaden (ZIP)". De server comprimeert het album eerst — voor grote of verliesloze albums (FLAC / WAV) verschijnt de voortgangsbalk pas zodra het zippen is voltooid en de overdracht begint. Dit is normaal.',
s5: 'Songteksten',
q20: 'Waar komen de songteksten vandaan?',
a20: 'Drie bronnen, configureerbaar in Instellingen → Songteksten: uw Navidrome-server (ingebedde / OpenSubsonic-songteksten), LRCLIB (community-bijgedragen gesynchroniseerde songteksten) en NetEase Cloud Music (grote Aziatische + internationale catalogus). Elke bron kan worden in-/uitgeschakeld en op volgorde gesleept.',
q21: 'Hoe bekijk ik songteksten tijdens het afspelen?',
a21: 'Klik op het microfoonpictogram in de speelbalk om het Songteksten-tabblad in het wachtrijpaneel te openen. Gesynchroniseerde songteksten scrollen automatisch en ondersteunen klik-om-te-spoelen; pure tekst scrolt als een statisch blok. Schakel de volledig-scherm-speler in via de speelbalk-cover voor een meeslepende songteksten-weergave met mesh-blob-achtergrond.',
s6: 'Delen & Sociaal',
q22: 'Wat zijn Magic Strings?',
a22: 'Magic Strings zijn korte kopieer-plak-tokens die dingen tussen Psysonic-gebruikers delen zonder enige derde server. Server-Invite-strings laten een vriend met één plak op uw Navidrome onboarden; Album / Artiest / Wachtrij Magic Strings openen hetzelfde album / artiest / wachtrij bij de ontvanger. Genereer ze via het deel-menu, plak ze in de zoekbalk om te consumeren.',
q23: 'Wat is Orbit?',
a23: 'Orbit is gesynchroniseerd samen-luisteren: een host speelt een nummer, elke gast hoort het synchroon, en gasten kunnen nummers voorstellen die de host kan accepteren in de wachtrij. Start een sessie via de Orbit-knop in de header, deel de uitnodigingslink, en anderen kunnen vanuit elke Psysonic-installatie meedoen. De host beheert het afspelen (skippen, spoelen, wachtrij) — gasten krijgen een real-time weergave en een suggestiebox. Sessies zijn kortstondig en eindigen wanneer de host ze sluit.',
q24: 'Wat is de Now Playing-dropdown?',
a24: 'Het uitzendpictogram rechtsboven toont wat andere gebruikers op uw Navidrome-server momenteel luisteren, ververst elke 10 seconden. Uw eigen vermelding verdwijnt op het moment dat u pauzeert. Per-server, dus gebruikers op een andere actieve server worden niet getoond.',
s7: 'Personalisatie',
q25: 'Thema\'s en de Theme Scheduler?',
a25: 'Instellingen → Weergave → Thema kiest uit 60+ thema\'s in 8 groepen (Psysonic, Mediaplayer, Besturingssystemen, Spellen, Films, Series, Sociale media, Open Source Classics — Catppuccin / Nord / Gruvbox / Nightfox / Dracula). Auto-Switch Theme laat u een dag-thema + nacht-thema instellen met starttijden zodat Psysonic automatisch wisselt.',
q26: 'Kan ik de Zijbalk, Home en Artiestpagina aanpassen?',
a26: 'Ja — Instellingen → Personalisatie. De zijbalk-customizer laat u nav-items in de gewenste volgorde slepen en items die u niet gebruikt verbergen. De Home-customizer schakelt elke Mainstage-rail (Hero, Recent, Ontdekken, Recent afgespeeld, Met ster …) in/uit. De Artiestpagina-customizer herschikt de secties (Topnummers, Albums, Singles, Compilaties, Vergelijkbare artiesten, etc.) en laat u die u nooit bekijkt verbergen.',
q27: 'Wat is de Mini Player?',
a27: 'Een klein zwevend venster met cover, transportbedieningen en een compacte wachtrij. Open het via het mini-player-pictogram in de speelbalk of met zijn toetsenbordsneltoets. Het venster onthoudt zijn positie en grootte tussen sessies. Op Windows wordt de mini-webview bij het opstarten vooraf aangemaakt zodat openen direct is; Linux / macOS schakelen optioneel in via Instellingen → Weergave → Mini player vooraf laden.',
q28: 'Wat is de Floating Player Bar?',
a28: 'Een optionele speelbalk-stijl (Instellingen → Weergave) die loskomt van de onderste rand met een themed achtergrond, accentrand, afgeronde albumhoes en een gecentreerde volumesectie. Handig op hoge monitoren of compacte thema\'s.',
q29: 'Track preview op hover?',
a29: 'Hover over een tracknummer-rij, klik op de kleine voorbeeldknop op de cover, of activeer het voorbeeld vanuit het rechtsklikmenu — Psysonic streamt de eerste ~15 s door dezelfde Rust-audio-engine zodat luidheidsnormalisatie van toepassing is. Handig om door een album te bladeren dat u nog niet gehoord hebt.',
q30: 'Sleep timer?',
a30: 'Klik op het maan-pictogram in de speelbalk om de sleep timer te openen. Kies een duur (of "einde van het huidige nummer") en Psysonic vervaagt en pauzeert aan het einde. De knop toont een ronde ring en een ingebouwde aftelling terwijl de timer loopt.',
q31: 'UI-schaal, lettertype, seekbar-stijl?',
a31: 'Instellingen → Weergave — Interface-schaal (80125% zonder de systeemlettergrootte te beïnvloeden), Lettertype (10 UI-fonts waaronder IBM Plex Mono, Fira Code, Geist, Golos Text…), Seekbar-stijl (Waveform geanalyseerd / pseudowave deterministisch / Lijn & Punt / Balk / Dikke balk / Gesegmenteerd / Neonlicht / Pulsgolf / Deeltjespoor / Vloeibare vulling / Retro Tape).',
s8: 'Power User',
q32: 'CLI player-bediening?',
a32: 'De Psysonic-binary doet ook dienst als afstandsbediening. Voorbeelden: psysonic --player play / pause / next / prev, --player volume 75, --player seek 15, --player shuffle, --player repeat off|all|one, --player rating 1-5. Wissel servers, audio-apparaten, bibliotheken; trigger Instant Mix; zoek artiesten / albums / nummers. Volledige lijst met psysonic --player --help. Shell-aanvulling voor bash en zsh via psysonic completions.',
q33: 'Smart Playlists (Navidrome)?',
a33: 'Smart Playlists zijn server-side dynamische afspeellijsten gedefinieerd door regels (genre = Rock EN jaar > 2020, etc.). De Afspeellijsten-pagina in Psysonic laat u ze maken, bewerken en verwijderen met een visuele regeleditor — Psysonic gebruikt daarvoor de Navidrome native API. Ze gedragen zich als normale afspeellijsten in de rest van de app en updaten automatisch wanneer uw bibliotheek verandert.',
q34: 'Instellingen back-uppen en herstellen?',
a34: 'Instellingen → Opslag → Back-up & Herstel exporteert serverprofielen, thema\'s, sneltoetsen en andere instellingen naar een enkel JSON-bestand. Importeer het op een andere machine of na een herinstallatie om alles in één keer te herstellen. Server-wachtwoorden zijn inbegrepen — bewaar het bestand privé.',
q35: 'Waar zie ik alle open-source-licenties?',
a35: 'Instellingen → Systeem → Open Source Licenties. De volledige afhankelijkheidslijst (cargo crates en npm-pakketten) wordt met gebundelde licentieteksten meegeleverd. Klik op een item voor de volledige tekst; het hoogtepuntblok bovenaan benadrukt de gebruikersbekende bibliotheken (Tauri, React, rodio, symphonia, etc.).',
s9: 'Offline & Sync',
q36: 'Offline modus — albums en afspeellijsten cachen?',
a36: 'Open een album of afspeellijst en klik op het downloadpictogram in de header — Psysonic cacht elk nummer lokaal zodat het van schijf afspeelt zonder netwerkoproep. De Offline Bibliotheek-pagina (zijbalk) toont alles wat is gecached, toont voortgang van lopende downloads, en laat u items verwijderen met het prullenbak-pictogram (dat verschijnt zodra een download is voltooid).',
q37: 'Offline opslaglimiet?',
a37: 'Instellingen → Bibliotheek → Offline laat u een maximale cachegrootte instellen. Wanneer de limiet wordt bereikt, toont de albumpagina-downloadknop een waarschuwingsbanner. Maak ruimte vrij door albums of afspeellijsten te verwijderen vanuit de Offline Bibliotheek-pagina.',
q38: 'Device Sync — muziek naar USB / SD?',
a38: 'Device Sync (zijbalk) kopieert albums, afspeellijsten of hele artiesten naar een externe schijf voor offline luisteren op andere apparaten. Kies een doelmap, kies bronnen uit de browsertabbladen, klik "Naar apparaat overzetten". Psysonic schrijft een manifest (psysonic-sync.json) zodat het weet welke bestanden er al zijn, ook als u Device Sync op een ander OS opent met een ander bestandsnaamsjabloon. Sjablonen ondersteunen {artist} / {album} / {title} / {track_number} / {disc_number} / {year}-tokens met / als mapscheidingsteken.',
s10: 'Integraties & Probleemoplossing',
q39: 'Scrobbling — Last.fm, ListenBrainz, Maloja…?',
a39: 'Instellingen → Integraties → Music Network. Verbind een of meer scrobble-services (Last.fm, Libre.fm, Rocksky, ListenBrainz, Maloja of een GNU FM-compatibele server) — geen Navidrome-configuratie nodig. Elke verbonden service met scrobbling aan ontvangt het afspelen; de hoofdschakelaar "Scrobbelen inschakelen" zet de hele fan-out aan of uit. Een scrobble wordt verzonden nadat je 50% van een nummer hebt beluisterd; now-playing pings gaan bij het begin uit, op services die dit ondersteunen. Eén service is je primaire service — je gelikete nummers, vergelijkbare artiesten en luisterstatistieken komen daarvandaan. Tip: als je Navidrome-server al naar een service scrobbelt (bijv. Maloja), verbind diezelfde service hier dan niet, anders krijg je dubbele scrobbles.',
q40: 'Discord Rich Presence?',
a40: 'Instellingen → Integraties → Discord toont uw huidige nummer op uw Discord-profiel. Kies tussen het app-pictogram, de hoezen van uw server (via getAlbumInfo2 — vereist een publiek bereikbare server) of Apple Music-hoezen. Pas de weergavestrings (details, status, tooltip) aan met token-templates.',
q41: 'Bandsintown tour data?',
a41: 'Opt-in onder Instellingen → Integraties → Now-Playing Info. Het Now Playing-tabblad op de Now Playing-pagina toont dan komende tour data voor de spelende artiest via de Bandsintown widget API. Standaard uit — er worden geen verzoeken gedaan totdat u inschakelt.',
q42: 'Internet Radio — live-streams afspelen?',
a42: 'Internet Radio (zijbalk) speelt elke live-stream die op uw Navidrome-server is opgeslagen (voeg stations toe via de Navidrome admin UI). Het afspelen loopt door de browser HTML5-audio-engine — de meeste EQ / Replay Gain / Loudness-instellingen zijn niet van toepassing op radio, maar ICY-metadata (huidige songnaam) wordt wel weergegeven. Ondersteunt MP3, AAC, OGG Vorbis en de meeste HLS-streams; codec-ondersteuning hangt af van het platform.',
q43: 'De verbindingstest mislukt — wat nu?',
a43: 'Controleer de URL inclusief poort dubbel (bijv. http://192.168.1.100:4533). Op een lokaal netwerk werkt http:// vaak waar https:// niet werkt (geen certificaat). Zorg ervoor dat geen firewall de poort blokkeert en dat de gebruikersnaam en wachtwoord correct zijn. Als uw server achter een reverse proxy zit, probeer dan eerst de directe URL om de oorzaak te isoleren.',
q44: 'Hoezen en artiestafbeeldingen laden traag.',
a44: 'Afbeeldingen worden bij de eerste weergave van uw server gehaald en vervolgens 30 dagen lokaal gecached. Als de opslag van uw server traag is, kan het eerste bezoek aan een pagina even duren; volgende bezoeken zijn onmiddellijk. De Hot Cache helpt ook voor nummers, maar de afbeeldingscache is onafhankelijk.',
q45: 'Linux-problemen — zwart scherm of geen geluid?',
a45: 'Een zwart scherm op Linux wijst meestal op een grafisch of WebView-weergaveprobleem. Probeer een X11-sessie of stel vóór starten GDK_BACKEND=x11 en EGL_PLATFORM=x11 in bij Wayland. Audio: PipeWire of PulseAudio. Verdwijnt geluid na slaapstand: sluit Psysonic volledig af en start opnieuw.',
};