Skip to content

Troubleshooting

Pawel Osmolski edited this page Aug 8, 2026 · 4 revisions

DarkOneJSP3 Troubleshooting

1. Before troubleshooting

  1. Restart foobar2000.

  2. Reload the affected JScript Panel or JSplitter instance if script changes are still not visible.

  3. Compare every custom title with Layout and Panel Map.

  4. Confirm that the panel loads the packaged script rather than another copy.

  5. Open View > Console and check for [DarkOneJSP3] errors.

  6. Run the validator from the package/profile root:

    python DarkOneJSP3\tools\validate_release.py .

    To check deliberate compatibility-source mirrors separately:

    python DarkOneJSP3\tools\sync_mirrors.py --check .

2. Layout and startup

[DarkOneJSP3] Child panel not found

A custom title is missing, misspelled, duplicated or placed at the wrong hierarchy level. Compare the complete layout with Layout and Panel Map. Visible tab text is unrelated to the DOJSP3.* identifier.

Album Notes tab is blank

The fourth child of DOJSP3.InfoStack must load samples\Album Notes.txt and use the exact title DOJSP3.AlbumNotes.

Album Notes flashes briefly during startup

The packaged InfoStack controller hides every child before the first valid layout pass. Confirm that JSplitter 03 loads the supplied Info Stack and Tabs loader and controller. This protection also applies when Startup > Transition is set to Off.

Display/Waveform flashes black after an optional reveal

Black reveal and Staged reveal paint the hidden root to DarkOne grey, wait 150 ms for the native DisplayStack surface to settle, then show the children. Confirm that JSplitter 01 and 06 load the supplied controllers.

A brief light-grey native frame appears with Transition Off

Off performs no deliberate startup hold, so a system may expose a native Columns UI/JSplitter backing surface before every child completes its first paint. Use Black reveal when this is noticeable. This is separate from the fixed black DisplayStack flash in optional reveal modes.

Theme stays black for about two seconds

An optional startup transition is waiting for nested controllers to report ready. The default layout-readiness timeout reveals the interface after 2000 ms and logs pending controller names.

Confirm that all six JSplitter hosts use the supplied loaders and correct titles. Use InfoStack tab strip > Startup > Transition > Off while repairing the layout.

Startup menu values change but startup timing does not

The supported Startup menu is on the InfoStack tab strip and displays values owned by DOJSP3.Root. If a Startup submenu appears in a JScript Panel DarkOne Tools menu, that panel is loading stale or mismatched script files. Replace the scripts from one complete package and restart foobar2000.

Startup timing is unwanted or feels wrong

Right-click the InfoStack tab strip and open Startup. Off is the default. For optional modes, adjust the minimum black hold and preview the sequence. Keep the layout-readiness timeout at 2000 ms unless diagnosing a slow or incomplete controller.

Script changes do not appear

Some panel instances retain currently loaded wrapper text. Reload the affected panel or restart foobar2000. Also check that the wrapper imports the expected file under DarkOneJSP3 or the packaged JScript Panel samples folder.

3. Display, controls and InfoStack

Display runtime error: Object doesn't support property or method resetRenderedImages

This indicates a mixture of incompatible or outdated Display files. Install one complete current package, replace both Config_Global_Script.js and the Display modules, then restart foobar2000.

The current direct-sprite Display implementation refreshes through InitColours() and setColours() and no longer exports resetRenderedImages(). The validator compares shared Display calls with the methods actually exported by Object_DisplaySystem.js.

Custom display accent changes Plain Font but not Dot Matrix

Confirm that the display wrapper and its Panel_Display.js and Object_DisplaySystem.js modules come from the same package. Reload the Display panel after manual script edits.

Display colour menu still shows six fixed colours

The current display wrapper exposes Default, Columns UI selected-item and Custom accent modes. If a six-colour palette still appears, reload the centre Display panel and confirm that its wrapper and modules come from the same package. The current menu is:

Display accent colour > Default - DarkOne blue
Display accent colour > Columns UI selected-item background
Display accent colour > Custom colour... (#RRGGBB)

Fonts look thinner than DarkOne2021

Use DarkOne Tools > Fonts > Reset all font defaults. The intended small-label font is Arial Black with DirectWrite Black/900 weight.

Information page background does not match the tab strip

Right-click inside Biography, Last.fm, Album Notes, Properties or the recommended scripted Queue Viewer and open Page background colour. Choose Transparent / inherit parent to reveal the InfoStack backing colour, Columns UI global background to follow the active Columns UI background colour, or select an explicit colour for that page. Each JScript Panel page remembers its own value. The native Queue Viewer and Playlists page use their own component or panel appearance settings.

InfoStack labels sit too high or low

Use Tab area and Tab font size from the InfoStack context menu. The controller centres labels within the configured tab area. In automatic mode, the tab area now follows the automatic font base scale; a manually fixed area does not.

InfoStack custom colour does not change the active tab

This is intentional. Tab font colour controls normal inactive labels. The active label remains white and a hovered label remains grey.

InfoStack Custom colour opens a text-entry field

Reload JSplitter 03 from the supplied controller. The implementation uses the two-argument JSplitter form utils.ColourPicker(window_id, default_colour). The standard Windows colour dialog should open directly; text entry is only a fallback when the native picker cannot be invoked.

Bottom-area Custom colour closes the menu, does nothing or logs Overflow

Install one complete current package and reload all three bottom JScript panels. The current implementation opens the native Windows picker through the shared colour helper and converts the stored opaque ARGB value to a signed 32-bit integer only for the native utils.ColourPicker() call. Saved properties, runtime-state files and rendering continue to use the established opaque ARGB representation.

A mixed installation can therefore fail even when fixed colour modes still work. Replace the current control/display wrappers, Config_Global_Script.js, DarkOneJSP3\shared\colour_utils.js and the component-local enhanced-sample mirror from the same package. Restart foobar2000 after replacing them.

If the native call throws, the console reports a contextual message such as:

[DarkOneJSP3] Bottom-area ColourPicker failed: ...

Cancelling the picker or closing it without changing the colour intentionally preserves the previous mode and colour.

Bottom area colour changes only one panel or do not survive restart

Install one complete current package and restart foobar2000. The three JScript panels should update one another immediately, while the Bottom Controls JSplitter follows through the shared runtime state file within approximately 100 ms.

Check that this file exists and changes when a colour is selected:

js_data\darkonejsp3.bottom-area-state.txt

Do not edit it manually. Check the console for [DarkOneJSP3] Unable to write... messages, which include the attempted path and indicate a permission, read-only-directory or security-software problem.

Bottom area looks mixed when Transparent / inherit parent is selected

The supported implementation resolves the whole composite bottom area to #181818. If the left, centre and right surfaces show different colours, the control-panel wrappers, 05_bottom_controls.js, 06_display_waveform.js or shared bottom-area helper files are from different releases. Replace them from one complete package and restart foobar2000.

Bottom area side divider colour does not change

Both lower divider strips are painted by the Bottom Controls JSplitter, not by the JScript panels. Confirm JSplitter 05 loads the supplied Bottom Controls loader and controller, and confirm the shared state file timestamp changes when the menu selection changes.

Display/Waveform Host background does not follow the bottom area

Right-click the narrow host/spacer and select Host background → Automatic — Bottom area background. Fixed Host background choices deliberately ignore later shared bottom-background changes. Automatic is the default for new configurations and appearance resets.

Optional button no longer works after a component update

Use Optional buttons > Re-detect command types. If a registered menu path has changed, select the command again. Embedded Columns UI panels do not always expose a main-menu command that opens them as a floating window.

Command guide reports MB_ICONINFORMATION is undefined

Reload both supplied Control Panel wrappers. JScript Panel 3.8.5 exposes the standard information icon through MB_ICONASTERISK in helpers.txt and does not define MB_ICONINFORMATION. A remaining error indicates mixed or cached script files.

Album Art wheel navigation causes interface lag

Confirm that samples\js\albumart.js comes from the same complete current package as the hosting entry. The enhanced implementation coalesces rapid wheel input for 80 ms and loads only the final artwork type. Re-import Album Art.txt only when you also want the current displayed sample name and metadata.

Blurred artwork is generated only when a blur-using layout first requests it. A brief first-use delay is preferable to decoding and blurring artwork for layouts that never display the blurred backing. If blur never appears, confirm that albumart.js and the hosting entry come from the same complete package.

4. Playlists and queue

JS Playlist scrolls in hard jumps

  • Enable Smooth scrolling in the playlist context menu.
  • Confirm that the wrapper imports the packaged jsplaylist\main.js and jsplaylist\playlist.js files.
  • Choose Restore DarkOneJSP3 defaults.
  • Increase the UI refresh interval only if motion is smooth but CPU use is high.

JS Playlist still snaps to rows

Disable Snap wheel scrolling to playlist rows. Set the free-scroll distance from the same menu. Disable Snap scrollbar dragging to playlist rows separately when continuous thumb dragging is also wanted.

Keyboard navigation, scrollbar arrows/page clicks and drag-autoscroll remain row-aligned by design.

JS Playlist scrollbar dragging feels capped at one cadence

  • Confirm Enable smooth scrolling is active.
  • Confirm both the supplied jsplaylist\main.js and jsplaylist\scrollbar.js are installed together; mixing versions bypasses the dedicated drag frame loop.
  • The scrollbar thumb follows the latest mouse position while the playlist uses time-based interpolation at the selected UI refresh interval.
  • With Snap scrollbar dragging to playlist rows enabled, visual updates remain row-aligned; disable it when continuous pixel movement is preferred.

Enhanced Spectrum Analyser pauses while dragging volume

  • Volume writes are protected by a minimum 16 ms cadence, regardless of the visual knob-refresh setting.
  • Automatic follows the fastest live refresh interval reported by JS Playlist and Smooth Playlist Manager for the knob preview only.
  • The first drag value remains immediate and the exact final value is applied when the mouse button is released.
  • If pausing persists, include the selected visualiser settings and component version in the bug report; lowering the knob preview cadence should not change the protected volume-write frequency.

JS Playlist CPU use is high

Increase the UI refresh interval from 8 ms to 10, 12 or 16 ms. The selected value controls both the smooth-scroll animation cadence and the coalesced repaints that display it. A 16 ms interval is normally sufficient for a 60 Hz display.

Playlist Manager position does not restore as expected

  • Enable Remember manager scroll position.
  • The row-aware state is stored in SMOOTH.PLAYLIST.MANAGER.SCROLL.STATE.V2.
  • If the saved anchor playlist was deleted, the manager falls back to the saved row and clamps it to the current list.
  • A taller panel may make the former top row physically impossible to retain; the position then clamps to the nearest valid scroll limit.

Scripted Queue scan appears delayed

The DarkOneJSP3 Queue Viewer should normally report that it loaded queue entries through the direct JSplitter queue bridge. DOJSP3.Root owns js_data\darkonejsp3.queue-state.json and refreshes it from plman.GetPlaybackQueueContents(), so the project wrapper should not perform a playlist-wide %queue_indexes% scan on first display.

If the bridge file is unavailable, invalid or explicitly reports that direct queue enumeration failed, the viewer automatically falls back to the standalone incremental scanner. That fallback still prioritises likely source playlists, publishes results progressively and stops early for non-empty queues when %queue_total% confirms that all queue positions have been found. An empty queue cannot be proven without a complete fallback scan.

If a DarkOneJSP3 installation unexpectedly logs Scanned ... items across ... playlists, confirm that DOJSP3.Root is using the supplied current root script and load the DarkOneJSP3 wrapper rather than the generic sample entry: DarkOneJSP3\jscript\DarkOneJSP3 - Queue Viewer.txt.

Scripted Queue editing commands are missing or disabled

The recommended DarkOneJSP3 wrapper enables queue mutation only after it has received a writable state from DOJSP3.Root. Right-click a queue entry and check for Remove item from queue, Move up/down, Move to top/bottom and Clear playback queue.

If those commands are absent, confirm that the panel is loading the project wrapper rather than the generic samples\Queue Viewer.txt entry. The generic Enhanced Sample Library entry is intentionally read-only outside DarkOneJSP3.

If the commands are present but a mutation is rejected, the queue probably changed before JSplitter consumed the command. The bridge intentionally rejects stale generations rather than applying an operation to the wrong queue. The viewer refreshes the authoritative state automatically; retry the command after that refresh.

Queue Viewer reports jsp3EnhancedHandleSampleReset is undefined

The DarkOneJSP3 Queue Viewer wrapper must import the component-local samples\shared\sample_defaults.js registry and samples\js\jsp3_enhanced_reset.js bridge before Queue Viewer initialises. Reload the supplied wrapper and restart foobar2000 if cached code remains.

5. Quick Search and waveform

Quick Search shows two borders

Set the native Quick Search Toolbar frame style to None. JSplitter already paints the DarkOne border.

Quick Search background is black

Set the native toolbar normal background to RGB 30, 30, 30. JSplitter cannot replace the edit control's internal native background.

Waveform background does not match the host

Choose the required Host background from the narrow JSplitter spacer menu. Waveform Minibar paints its own child window, so disable its Transparent background, set both custom background swatches to the same explicit RGB value and disable Draw window border. The default host colour is RGB 32, 32, 32.

The waveform host menu cannot be found

Right-click the narrow JSplitter host/spacer around the Waveform Minibar. A right-click inside the native waveform opens the component's own menu instead.

Previous waveform flashes when a new track starts

Increase the host New-track reveal delay. The default is 200 ms; 300-500 ms may work better with slower or uncached waveform generation.

Waveform remains visible after playback stops

Enable Force blank waveform when playback stops in the host menu and set Waveform Minibar to Playing, blank when stopped.

6. Album Notes, AllMusic and MusicBrainz

Album Notes skips an expected source

Open Current source > Show diagnostics. Check whether the provider is disabled, loaded from cache, unresolved, retried or failed. Also check Source priority and Album-note mode. Browse one source intentionally does not fall through.

Album Notes remains on Checking AllMusic...

The packaged provider explicitly reactivates an idle same-album lookup, discards stale search history and advances when no provider work starts. If the message remains, use Current source > Show diagnostics, refresh enabled sources and confirm that Album Notes, allmusic.js and album_notes.js come from the same package.

Album Notes matched the wrong release or edition

Open Provider and matching settings. Set the correct MusicBrainz release-group MBID manually, or forget the saved album identity and resolve it again. Correct artist/album tags before clearing the current source cache.

TheAudioDB repeatedly reports no result

The returned artist and album must pass exact normalised verification. After correcting tags or the manual release-group identity, clear the current source cache. Negative results are otherwise retained for 24 hours.

AllMusic review appears as one paragraph

An older cached review may already contain flattened text. In Album Notes, make AllMusic the active source, choose Clear current source cache, then Refresh enabled sources. A freshly retrieved review can still be a single paragraph when the source itself contains no paragraph breaks.

For the standalone AllMusic sample, use its own Delete cached review and Refresh from AllMusic commands.

AllMusic cannot match an album that exists in a browser

AllMusic may serve a normal browser while rejecting script requests. DarkOneJSP3 can use MusicBrainz release/release-group relationships as a resolver when the AllMusic search is blocked or unparseable.

The resolution order is:

  1. MUSICBRAINZ_RELEASEGROUPID tag.
  2. MUSICBRAINZ_ALBUMID tag.
  3. Exact MusicBrainz release-group search by artist and album.

Check Current source > Show diagnostics. When automated retrieval remains blocked, use Current source > Open source page to read the source in a browser.

AllMusic reports a browser-verification/Cloudflare challenge

A challenge page requires a real browser session. The Chrome-style request identity changes headers only and does not execute a browser challenge. Use Open source page. The standalone AllMusic sample additionally offers its own browser and clipboard-cache fallback commands.

MusicBrainz says no artist ID was found

Open Artist identity and either enable automatic resolution, resolve the current artist now or set the artist MBID manually. Automatic matching deliberately requires an exact normalised name, sort name or alias and does not guess between ambiguous candidates.

MusicBrainz selected the wrong artist

Use Artist identity > Clear cached artist match, then set the correct MBID manually. The map is stored in js_data\musicbrainz.artist-map.json.

MusicBrainz remains on a loading message

Requests use a 15-second watchdog and limited retries for transport errors, HTTP 408/425/429 and transient 5xx responses. Check the console for timeout and retry messages, restore connectivity, then refresh the data.

MusicBrainz returns HTTP 429 or 503

Requests are serialised at a minimum 1.1-second interval and busy responses are retried. Wait briefly, then use Refresh MusicBrainz data. Configure a contact URL/email in the MusicBrainz menu when distributing a customised build.

MusicBrainz data looks stale

Use Refresh MusicBrainz data. Clearing the current Releases or Links cache does not remove the artist-ID map or the Album Notes album-identity map.

Changing request identity did not bypass a provider block

This is expected. DarkOneJSP3 application and Chrome-style profiles only select HTTP headers. They do not supply cookies, JavaScript execution or an interactive browser session.

Upper divider colour does not change

Right-click the InfoStack tab strip and open Side divider colour, or right-click one of the exposed upper divider strips. The two upper strips always share one setting. Columns UI global background follows the active Columns UI background colour. This option does not affect the lower control-panel dividers.

Do not use a divider menu added to the generic Album Art JScript Panel. That cross-component notification path is not reliable. Restart or reload InfoStack and Main Columns if code was copied over while foobar2000 remained open.

7. Finding panel menus and settings

Playlist Manager shows playlist operations instead of settings

Right-clicking a playlist row opens operations for that playlist. Right-click empty panel space or the scrollbar to open Header Bar, Playlist filter, Colours, Background Wallpaper, DarkOneJSP3 smooth scrolling, Playlist row spacing and Configure....

Main JS Playlist Panel Settings cannot be found

Right-click a track or empty playlist area and choose Panel Settings.... The playlist header bar has a separate right-click menu for Groups, Columns and Double Track Line.

Biography, Last.fm or Properties menu cannot be found

Right-click empty content space inside the page. Panel-specific commands appear first, followed by the shared Font size, Page background colour, Selection mode and Configure... controls. Clicking directly on selectable text or a link can invoke that object's action instead.

Page background colour is missing from Queue

The recommended scripted Queue Viewer is a JScript Panel and should expose the shared Page background colour menu. If it does not, confirm that DOJSP3.Queue is loading DarkOneJSP3\jscript\DarkOneJSP3 - Queue Viewer.txt rather than the optional native Queue Viewer component. The native alternative uses its own component-owned appearance controls.

Waveform host settings do not appear

Right-click the narrow JSplitter spacer around the Waveform Minibar child. A right-click inside the waveform opens the native component's menu instead.

8. Factory reset

Factory reset appears to only reload panels

The reset writes explicit per-panel defaults before reloading each participating panel. It covers DarkOneJSP3-managed properties; unrelated upstream sample customisation is intentionally preserved.

Cross-host reset uses js_data\darkonejsp3.reset-command.txt. The Bottom Controls host checks it every 500 ms, rebroadcasts the reset within JSplitter and removes or clears the processed command. Confirm the file can be written and that JSplitter 05 loads the supplied controller. Check the console for reset-command write warnings.

Album Notes settings do not fully reset

The consolidated Album Notes panel resets both its provider role and embedded MusicBrainz role in one reload while preserving downloaded provider cache files. Confirm that samples\Album Notes.txt imports the component-local sample reset helpers.

Playlist refresh or scroll settings do not reset

JS Playlist and Smooth Playlist Manager must import the component-local sample-default registry and neutral reset bridge. Behaviour reset restores their custom refresh and scroll settings; full reset also clears the playlist manager's saved scroll anchors.

9. Performance and smoothness

Playlist remains unusually heavy while idle

The enhanced playlist and Playlist Manager use demand-driven schedulers and should not retain their high-refresh animation timers at idle. Confirm that the current JS Playlist and Smooth Playlist Manager wrappers are loaded and that both use samples\shared\performance_utils.js. Older saved entry scripts are also supported through the guarded compatibility block in helpers.txt. Reload the affected panel after replacing scripts.

Playlist text appears stale after metadata or queue changes

The row-render cache responds to playlist, metadata, queue, playback-time, seek and dynamic stream-information callbacks. Reload the playlist panel if third-party tagging software changed files without notifying foobar2000. For diagnosis, temporarily set JSPLAYLIST.Enable Render Cache to false in Configure..., reload the panel and compare the result.

Collecting paint-time diagnostics

Enable JSPLAYLIST.Enable Performance Profiling or SMOOTH.Enable Performance Profiling in the relevant panel's Configure... window, then reproduce the workload. The foobar2000 console reports average and peak paint time every 120 frames. Disable profiling after testing.

10. Diagnostics to include in a bug report

Include:

  • DarkOneJSP3 package version from build-info.json;
  • foobar2000, Columns UI, JScript Panel 3 and JSplitter versions;
  • the exact panel custom title and loaded wrapper or loader;
  • relevant [DarkOneJSP3] console output;
  • Album Notes Current source > Copy diagnostics output, when applicable;
  • whether the issue also occurs after a restart; and
  • any non-default property or component setting related to the affected area.

Back to Home · Repository

Clone this wiki locally