Skip to content

JUST PLAY 0.6.0-beta.1 - THE LIBRARY

Pre-release
Pre-release

Choose a tag to compare

@SACRVM SACRVM released this 14 Aug 14:38

A third app in the installer, and an index that stays out of your way.

JUST TAG — the tag editor — is packaged, installed and on the Start menu for the first time.
Underneath it the suite gained a local library index that the Pre-Cue Finder and JUST TAG both
read: opt-in, off until you switch it on, and never written next to your music.

This is a beta. It is a daily driver on Windows and it says below where it is thin.


Install

Download JustPlaySetup-0.6.0-win-x64.exe and run it. Per-user, no admin prompt, installs under
your profile. One installer puts four tools side by side on one shared runtime:

JUST PLAY the player
JUST STREAM the broadcaster
JUST TAG the tag editor — new
JustPlayCLI headless, agent-friendly

Upgrading from 0.5.0 replaces in place and keeps your settings.


New — JUST TAG, the tag editor

It browses the disk, not a library — the tool you reach for when a download just landed
somewhere no index has ever seen. It edits one file or a whole selection, and every bulk operation
shows what it is about to do before it does it.

  • Your DJ metadata survives, and that is measured. 128 real writes on MP3s carrying
    GEOB:Serato Markers2, an 85,166-byte PRIV:TRAKTOR4 blob, Mixed In Key's fields and a POPM
    rating, diffed frame by frame: 787 / 787 vendor frame payloads byte-identical, 128 / 128 audio
    streams untouched.
    The honest limit: that is MP3 + ID3v2 only — FLAC, AIFF, WAV and MP4 are
    untested. We preserve bytes; we do not decode Serato's cue blobs and will never claim to.
  • Multi-file editing — a tick per field decides what takes part. Fields the selection agrees on
    start ticked; fields where they differ start off and say different values, so nothing is
    flattened by accident.
  • One mask language, both directions%artist% - %title% builds a file name out of the tags,
    or reads tags out of a name. It counts the selection against the pattern as you type ("fits 24 of
    37"), and a name that does not fit is left exactly as it was.
  • Transform — Replace, Title Case, Sentence case, lowercase, UPPERCASE, Tidy spacing. Apply
    cannot be reached without the preview: one line per file per field, before and after.
  • Move / copy / delete, previewedthere is no overwrite, ever. A taken name is a collision,
    and the answer is "leave both alone" or "keep both". Delete goes to the recycle bin and refuses
    where there is none. A cross-volume move is copy - verify (SHA-256) - remove.
  • A search that reads as a sentence — sixteen fields and seven comparisons, including is
    empty
    . "Genre is empty" is the one that finds the damage.
  • Raw tags — every frame in the file exactly as it sits on disk, other tools' included,
    read-only by contract.
  • ID3 write format — the default converts nothing. The converting modes are a deliberate act,
    and a warning above Save counts how many files a conversion would actually re-encode.
  • Listen while you tag — a preview transport that releases the file by itself when a save needs it.

New — a library index, opt-in and local

The shape follows from one constraint: your files stay the truth. Everything JustPlay measures
already lives in the tags, so each computer derives its own local index from them. Two machines on
one NAS stay current with no shared database, and nothing is written next to your music — the
index lives in your user profile.

It is off until you turn it on ("Keep an index of this library"), and scanning is one explicit
button. Never scan and no index file is created at all; browsing behaves exactly as it did in 0.5.
The CLI is the one deliberate exception: running JustPlayCLI analyze is the opt-in, and
--no-db turns it off.

A track on disk is never invisible because of the index: un-indexed files are listed with blank
columns, and a file that has gone missing is flagged rather than dropped.

The Pre-Cue Finder, with the index behind it

  • Include subfolders — search everything below the folder you are standing in. When the index
    cannot be used, the checkbox is disabled with the reason on it.
  • Filter across the playlists below a folder — search a whole crate at once instead of opening
    eight playlists one at a time. A track in five sets is one row, and the detail pane says which.
  • Folders paint from the index and verify behind you. Reading the directory first cost 276 ms on
    a 1,092-file folder on every open, almost always to learn nothing had changed.
  • Fits what's playing narrows to the playing track's key and harmonic neighbours, +/-3 BPM and
    energy upward — by moving the visible filters, so you can widen any of it by hand.

One track table across all three apps

The queue, the Pre-Cue Finder and JUST TAG are now literally the same table, plus the columns
tagging needs: ALBUM, ALBUM ARTIST, YEAR, #, COV, ID3, TYPE, FILE NAME and AN (a three-state
analysis light). Right-click the header to choose them. Column widths are sized from the content
actually in front of you, so genre stops getting as much room as the title.

JUST STREAM — how many people are listening

A LISTENERS readout with the session peak beside it, read off the server's public status page
over an ordinary HTTP GET. No admin password is stored anywhere; a dead server costs the poll and
never the broadcast.

Smaller, but you'll notice them

  • Every icon is a vector we ship, not a font character — so icons follow the theme, and the same
    symbol stops rendering yellow in one window and white in another.
  • The wheel glides. Only the wheel is intercepted; scrollbar drags, keyboard and touch are
    untouched. The scrollbar also stops fading while you drag its thumb.
  • A round progress indicator for long jobs, with the phase and counter inside the disc at fixed
    sizes, so nothing shifts as the text changes.
  • Maximize does what it says — and the caption button finally shows restore.
  • CLI: analyze takes --playlist <m3u> as well as a folder, so a scattered list can be
    re-analysed without redoing thousands of healthy files.

Fixes

Crashes

  • Copying text could take the whole app down. The Win32 clipboard raises a COMException
    from inside the copy call when the OS will not hand it over, and an exception escaping an
    async void handler terminates the process. Three of four call sites were unguarded — the worst
    being the copy button on the dialog that was already reporting a crash. One guarded clipboard now.
  • The Pre-Cue Finder window failed to open on some builds — a converted arrow character closed
    a XAML comment early. A test now walks every .axaml for the same defect; it found exactly this
    one and nothing else.
  • Sending a file to the recycle bin could access-violate on x64. SHFILEOPSTRUCT was declared
    with Pack = 1, which looks obviously right because the Windows header packs it, and is wrong.

Windows

  • Maximize finally does what it says. The transparent shadow margin and the rounded corners go
    away, including the close X. It never worked because Margin / CornerRadius / BoxShadow sat
    inline on the card — LocalValue priority, which beats a class-selector style.
  • A maximized window no longer offers "maximize". The caption button had no restore state; it
    now shows the correct mark in all four frameless windows.
  • Windows open on the screen the app is on, suite-wide.

Files, renaming and organise

  • A drive root as the organise destination wrote to the wrong place. E:\ produced a
    drive-relative path, so files landed in the process's working directory on that drive.
  • A rename that only changed capitalisation silently did nothing.
  • A failed rename counted as a failed save, and counted the same file twice; a deferred write
    renamed the file anyway while the engine still held the handle.
  • A name that came out as a reserved device name (NUL, AUX, CON) was left as one.
  • The tolerant filename parse dropped the separator for a whitespace-only mask, so SomeTrack
    parsed as artist S.
  • The organise plan was not rebuilt after a run. The macOS trash path escaped quotes but not
    backslashes. A batch rename raised its completion event from a worker thread into bound state.

Library and playlists

  • A track listed in a playlist that no longer exists is reported by name, never silently
    dropped. That needed a root fix in the playlist reader, which had been filtering vanished files
    out before any caller could name them — in all six call sites.
  • A moved track stays findable. Departed paths are marked missing rather than deleted.

JUST TAG

  • Refresh emptied the list. It re-opened the parent folder instead of re-reading what was on
    screen, and a parent usually holds no audio.
  • The ID3 version warning the settings panel promised was gone. It was built, then deleted when
    JUST TAG moved onto the Finder shell, and had been reaching nobody since.
  • The analysis preview's timer was stopped from analysis worker threads.
  • File sizes printed a comma decimal separator on a German machine.

Packaging

  • JustTag.exe was built by the solution and packaged by nothing. It was in no publish script
    and in no installer, so this beta would have shipped without the app it is being cut for.

What isn't finished in this beta

Named here rather than left for you to find:

  • Nothing watches your library folder yet. The observer is built and tested as a library and is
    wired into no app. The index catches up when you press Scan.
  • A scan indexes; it does not analyse. The batch runner exists and has no screen. Analysing is
    still per-selection or JustPlayCLI analyze.
  • The tag-write policy has no settings screen. What 0.6 writes by default is byte-for-byte what
    0.5 wrote, pinned by SHA-256 goldens.
  • "In how many sets is this track?" is not built. The index has no playlist-membership table.
  • The analysis light can be wrong on lossless files analysed by v0.4.0 or earlier. Those builds
    handed the sample-based analyzers interleaved stereo as "mono" on FLAC / WAV / AIFF. Key and BPM
    were not affected. The staleness check cannot find those files for you — re-analyse them by hand.
  • macOS / Linux are not validated. The code is cross-platform; nobody has run a build on real
    hardware. Windows is the only tested target.

Found something?

Open an issue with what you did, what you expected and what happened. If a write went wrong, say the
file type and which tool wrote the tags before — that is usually the whole answer.

Full detail: README · just.sacrvm.dev