Symfonium custom string template (v12+)

Symfonium Custom String Templates

This page documents Symfonium’s custom string template syntax and the field lists available in each context.

It is organized into:

  • Common template syntax: placeholders, conditional blocks, conditions/operators, text formatting, escaping rules and global localized string.* labels
  • Context-specific specifics:
    • Now Playing: additional features (\t, \o, next. fields) plus the full Now Playing field list.
    • Album subtitle: album-level fields available on album pages.
    • Artist subtitle: artist-level fields available on artist pages.

Common template syntax (works everywhere)

Basic placeholders

Syntax: %fieldname%

  • Replaces %fieldname% with the field value.
  • If the field is empty/missing, nothing is shown.

Examples:

Template Example result
%title% by %artist% Seven Nation Army by The White Stripes
%album% (%year%) Thriller (1982)
%composer% ● %artist% Ludwig van Beethoven ● Berliner Philharmoniker
%artist%%lb%%composer% Berliner Philharmoniker
Ludwig van Beethoven

%lb% is a line break.


Conditional blocks

Use blocks to show punctuation/labels only when something exists or when a condition matches.

Syntax: { ... }

  • A { ... } block is displayed only if its first placeholder “matches”:
    • either a non-empty field, or
    • a true condition placeholder (%|condition%).
  • You can include multiple placeholders and literal text inside the same { ... } block, but only the first placeholder controls whether the block is shown.
  • Put required spaces inside the block (example: { by %artist%}).

Conditional block based on a field

Examples:

Template Example result If field is empty
%title%{ by %artist%} Seven Nation Army by The White Stripes Seven Nation Army
%album%{ (%year%)} Thriller (1982) Thriller
{%composer% ● }%artist% Beethoven ● Berliner Philharmoniker Berliner Philharmoniker

Conditional block based on a condition (no field printed)

Use %|condition% as the first placeholder to gate a block without printing a value.

Example:

{%|format.samplerate>"48"% Hi-Res: %format.codec%}

Shows Hi-Res: FLAC only if format.samplerate > 48.

Line breaks inside { ... }

Use \n (backslash + n) inside conditional blocks:

%album%{\n(%year%)}

Outside of { ... }, prefer %lb% for line breaks.


Conditions inside placeholders

Syntax: %field|condition%

Prints the field only if the condition is true.

What you can compare:

  • Another field name (example: artist, composer, year, etc.)
  • A literal string/number in quotes: "2012", "Rock", "256"

Notes on literals:

  • track means the track field
  • "track" means the literal text track
  • Quotes can appear inside values; ensure the literal starts and ends with "

Examples:

%year|year>"2012"%
%composer|composer!=artist%
%composer|genre=="Classical"%

Operators

Operator Meaning Example Notes
== equals genre=="Classical" / artist==composer
!= not equals artist!="Metallica"
+= contains genre+="Rock" works with literal or another field
-= does not contain mood-="depressing"
> greater than year>"1999" use quotes for literal numbers
< less than duration<"500" duration is in seconds
==empty is empty year==empty empty is reserved
!=empty not empty composer!=empty empty is reserved
[] in range bpm[]"0".."100" inclusive bounds

Multiple conditions, mixed && / ||, and parentheses

  • Use && for AND
  • Use || for OR
  • You can mix && and || in the same condition.
  • Use parentheses (...) to control evaluation priority.

Example:

%format|format.bitdepth!=empty && (format.samplerate>"48" || format.bitdepth>"24")%

This prints %format% only when bit depth exists and either:

  • sample rate is greater than 48, or
  • bit depth is greater than 24.

Inline text formatting markup

**Bold**
__Underline__
~~Strike~~
//Italics//
^^CAPS^^

Localized labels (string.*)

These placeholders return translated strings in the user’s locale:

  • string.hires
  • string.lossless
  • string.lossy
  • string.hires.lossless
  • string.low.quality
  • string.high.quality
  • string.high.efficiency
  • string.time.unit.day.short
  • string.time.unit.hour.short
  • string.time.unit.minute.short
  • string.time.unit.second.short
  • string.time.unit.day.one
  • string.time.unit.day.other
  • string.time.unit.hour.one
  • string.time.unit.hour.other
  • string.time.unit.minute.one
  • string.time.unit.minute.other
  • string.time.unit.second.one
  • string.time.unit.second.other
  • string.track.one
  • string.track.other
  • string.album.one
  • string.album.other

Now Playing (Compact & Expanded)

Now Playing templates can access:

  • track metadata
  • playback state
  • queue state
  • audio format
  • EQ / renderer info
  • and more

Now Playing-only features

Split into multiple segments with \t

Use \t to split one template into multiple segments.

Example:

%player.position%\t%format%\t%player.duration%

With horizontal alignment space between, this typically renders:

  • left: position
  • center: format
  • right: duration

Selective protection overlay with \o

Use \o to apply a protection overlay only to that part, even if the full string isn’t protected.

“Next item” prefix (queue context)

Add next. before any item-data field to refer to the next queue item:

%next.title%

Supported fields (Now Playing)

Track / album metadata

  • title
  • cleantitle (title without added track number or explicit symbol)
  • artist
  • album
  • album.version
  • album.type (also known as Release Type)
  • albumartist
  • composer
  • year
  • releasedate
  • originaldate
  • releasedate.year
  • originaldate.year
  • track
  • disc
  • disctitle
  • duration
  • duration.seconds (Total seconds)
  • duration.d (Add .nz to hide if zero)
  • duration.h (Add .nz to hide if zero)
  • duration.m (Add .nz to hide if zero)
  • duration.s (Add .nz to hide if zero)
  • duration.dd (0 padded, add .nz to hide if zero)
  • duration.hh (0 padded, add .nz to hide if zero)
  • duration.mm (0 padded, add .nz to hide if zero)
  • duration.ss (0 padded, add .nz to hide if zero)
  • genre
  • style
  • mood
  • occasion
  • grouping
  • language
  • comment
  • work
  • movement.name
  • movement.number
  • movement.number.roman
  • mediatype
  • providername
  • explicit
  • favorite
  • userrating
  • rating
  • userrating.5 (normalized to 5 stars)
  • rating.5 (normalized to 5 stars)
  • track.tags
  • album.tags
  • original.artist
  • original.album
  • filepath
  • filename

Playback / player

  • player.position
  • player.duration
  • player.remaining
  • player.position.seconds
  • player.duration.seconds
  • player.remaining.seconds
  • player.paused
  • player.repeat.mode
  • player.shuffle.mode
  • duration (track duration, classic field)
  • duration.seconds (if available in your context; player. is usually preferred for playback)*
  • sleep.timer
  • sleep.timer.seconds
  • sleep.timer.eos

Queue / smart features

  • queue.position
  • queue.size
  • queue.name
  • smartqueue
  • smartflow
  • radio.mode (1 if from Smart Queue, 2+ if from Smart Flow)

Format / audio info

  • format
  • format.bitrate
  • format.samplerate
  • format.bitdepth
  • format.codec
  • format.bitandsample
  • format.channels

EQ / output / renderer

  • eq.profile
  • eq.config
  • output.current
  • renderer.current
  • renderer.type

Utility

  • lb (line break)
  • bool1bool5

Now Playing examples

- clean two-line title block

%title%%lb%{by %artist%}

- album + year only if year exists

%album%{ (%year%)}

- “Composer ● Artist” only when composer exists

{%composer% ● }%artist%

- three-part line using \t (position / format / duration)

%player.position%\t%format%\t%player.duration%

- show “Hi-Res” only for high sample rate

{%|format.samplerate>"48"% Hi-Res: %format.codec%}

- show active output device (Android vs other renderer)

{🎧 %output.current|renderer.type=="Android"%}{🔊 %renderer.current|renderer.type!="Android"%}

- toggleable Apple-style quality indicator (uses bool1)

ⓘ {%format|bool1=="true"%}{Dolby Atmos %|format.channels>"2" && bool1=="false"%}{%string.high.efficiency|format.bitrate>"10" && format.bitrate<"256" && format.bitdepth==empty && bool1=="false"%}{%string.high.quality|format.bitrate>"255" && format.bitrate<"321" && format.bitdepth==empty && bool1=="false"%}{%string.lossless|format.bitdepth[]"16".."24" && format.samplerate<"49" && bool1=="false"%}{%string.hires.lossless|format.bitdepth[]"16".."32" && format.samplerate>"48" && bool1=="false"%}

If you bind a “toggle bool1” action to the custom string, it alternates between:

  • showing %format% (when bool1 is true)
  • showing the Apple-style indicator (when bool1 is false)

Album subtitle (Album page)

Album pages typically expose album-level metadata (not queue/player state). You can use the same common template syntax.

Supported fields (Album subtitle)

  • title
  • title.raw
  • version
  • tags
  • type
  • status
  • composer
  • artist
  • year
  • duration
  • duration.seconds (Total seconds)
  • duration.d (Add .nz to hide if zero)
  • duration.h (Add .nz to hide if zero)
  • duration.m (Add .nz to hide if zero)
  • duration.s (Add .nz to hide if zero)
  • duration.dd (0 padded, add .nz to hide if zero)
  • duration.hh (0 padded, add .nz to hide if zero)
  • duration.mm (0 padded, add .nz to hide if zero)
  • duration.ss (0 padded, add .nz to hide if zero)
  • genre
  • style
  • mood
  • language
  • providername
  • offlinestatus
  • occasion
  • mediatype
  • grouping
  • explicit
  • releasedate
  • originaldate
  • releasedate.year
  • originaldate.year
  • lastplayed
  • lastSkipped
  • userrating
  • rating
  • userrating.5
  • rating.5
  • favorite
  • song.count
  • playcount
  • skipcount
  • description
  • format
  • format.bitrate
  • format.channels
  • format.samplerate
  • format.bitdepth
  • format.codec
  • format.bitandsample
  • format.bitrate.raw
  • format.samplerate.raw

Album subtitle examples

- album title + version only if version exists

%title%{ — %version%}

- year + genre line, skipping missing parts

%year%{ • %genre%}

- rating shown only if user rated it

{★ %userrating.5%/5%|userrating!=empty%}

- “Downloaded” indicator (offline status-dependent)

{⬇ Offline%|offlinestatus!=empty%}

(Exact offlinestatus values depend on Symfonium’s internal strings; the template pattern is what matters.)


Artist subtitle (Artist page)

Artist pages typically expose artist-level metadata and library stats (counts). You can use the same common template syntax.

Supported fields (Artist subtitle)

  • title
  • title.raw
  • version
  • tags
  • type
  • gender
  • duration
  • duration.seconds (Total seconds)
  • duration.d (Add .nz to hide if zero)
  • duration.h (Add .nz to hide if zero)
  • duration.m (Add .nz to hide if zero)
  • duration.s (Add .nz to hide if zero)
  • duration.dd (0 padded, add .nz to hide if zero)
  • duration.hh (0 padded, add .nz to hide if zero)
  • duration.mm (0 padded, add .nz to hide if zero)
  • duration.ss (0 padded, add .nz to hide if zero)
  • genre
  • style
  • mood
  • song.count
  • album.count
  • instrument
  • providername
  • offlinestatus
  • lastplayed
  • userrating
  • userrating.5
  • favorite
  • playcount
  • description

Artist subtitle examples

- show counts with nice labels

%song.count% songs{ • %album.count% albums}

- genre/style line (only if present)

%genre%{ • %style%}

- show “Favorite” badge only when favorited

{♥ Favorite%|favorite!=empty%}

- instrument (only if present), on new line

%title%{\n%instrument%}

12 Likes