Paths

Path templates decide where each track is placed in your library folder, based on its tags. This page describes the placeholders and functions you can use in them. Templates are used both when importing and when reorganizing your library.

Placeholders

Placeholders are variables that get replaced with actual metadata values from the track. They are prefixed with a $ symbol.

Available Placeholders

PlaceholderDescriptionData TypeExample Value
$albumartistThe name of the first album artistString“The Beatles”
$albumThe album titleString“Abbey Road”
$yearThe release yearInteger“1969”
$original_yearThe original release year (if different from release year)Integer“1969”
$trackThe track number, zero-padded to 2 digitsString“01”
$titleThe track titleString“Come Together”
$formatAudio format of the fileString“flac”
$genreMusic genreString“Rock”

Functions

Functions perform operations on placeholders or other values. They are prefixed with % and use curly braces for arguments.

Available Functions

artistfolder

Groups tracks into letter-based subfolders by artist name, similar to how music stores organize physical media. The value is first asciified, then prefixed with its uppercase first letter (A–Z) or # for non-alphabetic names.

Syntax: %artistfolder{value}

Parameters:

  • value: Any string value or placeholder (typically $albumartist)

Examples:

%artistfolder{$albumartist}
  • “The Beatles” → T/The Beatles
  • “Björk” → B/Bjork
  • “2Pac” → #/2Pac

A typical path using %artistfolder:

%artistfolder{$albumartist}/%asciify{$album} (%if{$original_year,$original_year,$year})/%asciify{$track $title}

Result: T/The Beatles/Abbey Road (1969)/01 Come Together

asciify

Converts text to ASCII by removing accents, diacritics, and special characters.

Syntax: %asciify{value}

Parameters:

  • value: Any string value or placeholder

Example:

%asciify{$albumartist}

For “Björk” → “Bjork”

if

Conditional rendering that returns one of two values based on a condition.

Syntax: %if{condition,true_value,false_value}

Parameters:

  • condition: Expression to evaluate (returns true if not empty, “0”, or “false”)
  • true_value: Value to return if condition is true
  • false_value: Value to return if condition is false (optional)

Examples:

%if{$original_year,$original_year,$year}

Returns $original_year if it exists, otherwise $year

%if{$albumartist,$albumartist,Various Artists}

Returns $albumartist if it exists, otherwise “Various Artists”

Usage Examples

Basic Path Template

$albumartist/$album ($year)/$track $title

Result: The Beatles/Abbey Road (1969)/01 Come Together

With ASCII Conversion

%asciify{$albumartist}/%asciify{$album} (%if{$original_year,$original_year,$year})/%asciify{$track $title}

Result: The Beatles/Abbey Road (1969)/01 Come Together

Album Type Specific Paths

Default Album

%asciify{$albumartist}/%asciify{$album} (%if{$original_year,$original_year,$year})/%asciify{$track $title}

EP

%asciify{$albumartist}/%asciify{$album} [EP] (%if{$original_year,$original_year,$year})/%asciify{$track $title}

Single

%asciify{$albumartist}/%asciify{$album} [Single] (%if{$original_year,$original_year,$year})/%asciify{$track $title}

Soundtrack

%asciify{$albumartist}/%asciify{$album} [OST] (%if{$original_year,$original_year,$year})/%asciify{$track $title}

Compilation

%asciify{$albumartist}/%asciify{$album} (%if{$original_year,$original_year,$year})/%asciify{$track $title}

Advanced Examples

Conditional Album Artist

%if{$albumartist,%asciify{$albumartist},Various Artists}/%asciify{$album} (%if{$original_year,$original_year,$year})/%asciify{$track $title}

Year with Fallback

%asciify{$albumartist}/%asciify{$album} (%if{$original_year,$original_year,%if{$year,$year,Unknown}})/%asciify{$track $title}

Notes

  • All placeholders are replaced with actual metadata values from the track
  • Functions can be nested within each other
  • Unknown placeholders are left as-is in the output
  • The %asciify function is particularly useful for creating filesystem-safe paths
  • The %if function allows for conditional logic in path templates
  • Track numbers are automatically zero-padded to 2 digits
  • Years are converted to strings automatically

Configuration

These templates can be configured in the config.yaml file under the import.paths section:

import:
  paths:
    default_path: '%asciify{$albumartist}/%asciify{$album} (%if{$original_year,$original_year,$year})/%asciify{$track $title}'
    album:ep: '%asciify{$albumartist}/%asciify{$album} [EP] (%if{$original_year,$original_year,$year})/%asciify{$track $title}'
    album:single: '%asciify{$albumartist}/%asciify{$album} [Single] (%if{$original_year,$original_year,$year})/%asciify{$track $title}'
    album:soundtrack: '%asciify{$albumartist}/%asciify{$album} [OST] (%if{$original_year,$original_year,$year})/%asciify{$track $title}'
    compilations: '%asciify{$albumartist}/%asciify{$album} (%if{$original_year,$original_year,$year})/%asciify{$track $title}'

Reorganize Library

The Reorganize feature applies the current path templates to every track in the library and physically moves files to match. It is useful after changing path templates or after bulk metadata corrections.

How It Works

Start it from Analyze → File Paths. For every track in your library, Soulsolid:

  1. Works out where the track should be, using your current path templates
  2. Skips it if its file is missing from disk
  3. Skips it if it’s already in the right place
  4. Otherwise moves the file to its new location, creating folders as needed, and updates the library
  5. Removes folders left empty after files were moved out

It runs as a background job that you can follow in the Jobs section. When it finishes, it reports how many files were moved, skipped and failed. See Reorganize for more.

FAT32 Safe Mode

FAT32 safe mode makes every folder and file name FAT32-compatible:

  • Everything is lowercased, so names don’t clash when syncing to FAT32 (where Rock/ and rock/ are the same folder)
  • Characters FAT32 doesn’t allow (: * ? " < > | \) are replaced with -
  • Trailing dots and spaces are removed
  • Names longer than 255 bytes are shortened, keeping the file extension
  • When two tracks would end up at the same path, a number (_1, _2, …) is added so both files are kept

This is useful when you sync your library to a FAT32 drive (e.g. an SD card, a USB stick or some NAS setups), while the library itself stays on a normal filesystem.

During Import

Enable it with import.paths.fat32_safe: true in the config, or the FAT32-safe filenames checkbox in Settings. Every imported file then gets a FAT32-safe path.

During Reorganize

Analyze → File Paths has its own FAT32-safe filenames checkbox that applies only to that run, useful for a one-off cleanup when the setting is off.