72 KiB
Picard File Naming Script - Technical Guide
Complete technical reference for MusicBrainz Picard File Naming Script v3.0
Note: This guide references Picard_Rename_Script.txt as the working script file. For importing into Picard, use Picard_Rename_Script.ptsp (Picard Script Package format).
Table of Contents
- How Picard Scripting Works
- Script Execution Flow
- Complete Configuration Options
- Character Replacement
- VBR Bitrate Mapping
- Path Generation Examples
- Advanced Features
- Variables Reference
- Customization Guide
1. How Picard Scripting Works
1.1 What is TaggerScript?
TaggerScript is Picard's built-in scripting language for file naming and tag manipulation. It allows you to:
- Build file and folder paths dynamically from metadata
- Perform conditional logic based on tag values
- Transform and clean up metadata
- Set custom variables for use later in the script
1.2 Basic Syntax
Functions are called with $function(arguments)
$upper(hello) -> HELLO
$left(Beatles,4) -> Beat
$if(condition,then,else) -> Conditional logic
Variables are referenced with %variable%
%artist% -> Tag value (e.g., "The Beatles")
%_variable% -> Internal variable (starts with underscore)
Setting Variables uses $set(name,value)
$set(_myvar,Hello) -> Creates variable %_myvar% = "Hello"
Comments use $noop(text)
$noop( This is a comment ) -> Does nothing, for documentation
1.3 Key Concepts
Tags vs Variables:
- Tags come from MusicBrainz or existing file metadata:
%artist%,%album%,%tracknumber% - Variables are created by the script:
%_myvar%,%_isLive%,%_nFilePath%
Execution Order:
- Scripts execute top-to-bottom
- Variables must be defined before they're used
- The final output is whatever the script "returns" (last non-$noop statement)
String Concatenation:
- Just put values next to each other:
%artist% - %title%-> "Beatles - Yesterday" - Use
/for path separators:%artist%/%album%/-> "Beatles/Abbey Road/"
2. Script Execution Flow
2.1 Visual Flow Diagram
┌─────────────────────────────────────────────────────────────┐
│ START: File needs to be renamed │
└────────────────────┬────────────────────────────────────────┘
│
┌────────────────────▼────────────────────────────────────────┐
│ SECTION 1: Load Constants │
│ - MusicBrainz IDs │
│ - Default display names │
└────────────────────┬────────────────────────────────────────┘
│
┌────────────────────▼────────────────────────────────────────┐
│ SECTION 2: Read User Configuration │
│ - All 60+ settings loaded │
│ - Determines how path will be built │
└────────────────────┬────────────────────────────────────────┘
│
┌────────────────────▼────────────────────────────────────────┐
│ SECTION 3: Setup Default Variables │
│ - Fallbacks if plugin not loaded │
│ - Fallbacks if metadata missing │
└────────────────────┬────────────────────────────────────────┘
│
┌────────────────────▼────────────────────────────────────────┐
│ SECTION 4: Initialize Working Variables │
│ - Disc/track numbers │
│ - Calculate padding lengths │
│ - Featured artist detection │
│ - Extract year │
└────────────────────┬────────────────────────────────────────┘
│
┌────────────────────▼────────────────────────────────────────┐
│ SECTION 5: Enhance Album Title │
│ - Add disambiguation, year, label, catalog │
│ - Trim if too long │
└────────────────────┬────────────────────────────────────────┘
│
┌────────────────────▼────────────────────────────────────────┐
│ SECTION 6: Detect Music Types │
│ - Set flags: _isAlbum, _isSingle, _isLive, etc. │
│ - Detects: Album, Single, EP, Live, Soundtrack, etc. │
└────────────────────┬────────────────────────────────────────┘
│
┌────────────────────▼────────────────────────────────────────┐
│ SECTION 7: Clean Up Tags │
│ - Remove placeholder tags with default values │
└────────────────────┬────────────────────────────────────────┘
│
┌────────────────────▼────────────────────────────────────────┐
│ SECTION 8: Setup Filename Variables │
│ - Create sanitized versions for file/folder names │
│ - Remove "The " prefix for sorting │
└────────────────────┬────────────────────────────────────────┘
│
┌────────────────────▼────────────────────────────────────────┐
│ SECTION 9: Apply Character Filtering │
│ - Tag-level replacements (written to file) │
│ - Filename-level replacements (paths only) │
│ - Ensure cross-platform compatibility │
└────────────────────┬────────────────────────────────────────┘
│
┌────────────────────▼────────────────────────────────────────┐
│ SECTION 10: Detect Audio Metrics │
│ - Determine CBR vs VBR │
│ - Map VBR bitrate to quality level (V0-V9) │
│ - Extract sample rate, bit depth, channels │
└────────────────────┬────────────────────────────────────────┘
│
┌────────────────────▼────────────────────────────────────────┐
│ SECTION 11: Build Directory Path │
│ - Apply genre subsort (if enabled) │
│ - Route special cases (Soundtrack, Various, etc.) │
│ - Build artist letter folder │
│ - Build artist name folder │
│ - Add type subfolder (Albums/, Singles/, etc.) │
│ - Build album folder with metadata │
│ - Add disc subfolder (if multi-disc) │
└────────────────────┬────────────────────────────────────────┘
│
┌────────────────────▼────────────────────────────────────────┐
│ SECTION 12: Build Filename │
│ - Track number (or vinyl style A1, B1) │
│ - Track title │
│ - Duration │
│ - Audio quality metrics │
└────────────────────┬────────────────────────────────────────┘
│
┌────────────────────▼────────────────────────────────────────┐
│ OUTPUT: Complete path │
│ /B/Beatles, The/(1969) Abbey Road [CD - MP3]/01. Come Together... │
└─────────────────────────────────────────────────────────────┘
2.2 Step-by-Step Execution
Step 1: Constants Loading
- MusicBrainz special IDs loaded
- Default names set ([Unknown Artist], [Various Artists], etc.)
- Regex constants defined
Step 2: Configuration Loading
- All user settings loaded
- Settings determine which sections execute
- Settings control what metadata is shown
Step 3: Default Variables
- Plugin variables loaded with fallbacks
- If "Additional Artists Variables" plugin not present, uses basic tags
- Album and track titles get default values if missing
Step 4: Working Variables Initialization
- Disc and track numbers extracted
- Padding calculated based on total counts
- Featured artists detected by comparing album vs track artist
- Year extracted from date tags
Step 5: Album Title Enhancement
- Disambiguation comment added if present
- Release year, label, catalog added if enabled
- Title trimmed if longer than max length
Step 6: Music Type Detection
- All release type flags set based on MusicBrainz tags
- Special cases detected (Various Artists, Tribute, Cover, etc.)
- Incomplete status determined
Step 7: Tag Cleanup
- Placeholder tags removed if they still contain defaults
- Prevents "Title", "Artist" from being written to files
Step 8: Filename Variables Setup
- Sanitized versions created for all metadata used in paths
- Sort tags used as fallbacks
- "The " prefix removed for sorting
Step 9: Character Filtering
- Tag-level replacements (written to actual file metadata)
- Filename-level replacements (used in paths only)
- Ensures Windows/Linux/macOS/Samba compatibility
Step 10: Audio Metrics Detection
- Bitrate analyzed to determine CBR vs VBR
- VBR mapped to quality level (V0-V9)
- Sample rate, bit depth, channels extracted
Step 11: Path Generation
- Genre subsort applied first (if enabled)
- Special collections routed (Soundtrack, Various, Audiobooks)
- Artist letter folder created
- Artist name folder created
- Type subfolder added (if enabled)
- Album folder built with all metadata
- Disc subfolder added (if multi-disc)
Step 12: Filename Generation
- Track number formatted (padded or vinyl style)
- Track title added
- Duration added (if enabled)
- Audio quality added (if enabled)
Output:
- Complete path returned to Picard
- Picard moves/renames file to this location
3. Complete Configuration Options
3.1 All Settings Reference Table
| Variable | Type | Default | Values | Description |
|---|---|---|---|---|
| DEVELOPMENT SETTINGS | ||||
_devMode |
Integer | 0 | 0, 1 | Use test values (1) or real metadata (0) |
_quickNoNameFormat |
Integer | 0 | 0, 1 | Skip formatting (1) or full format (0) |
| DISPLAY OPTIONS | ||||
_showDate |
Integer | 1 | 0, 1 | Show year in album folder name |
_showRecordLabel |
Integer | 0 | 0, 1 | Show record label in album folder |
_showReleaseStatus |
Integer | 0 | 0, 1 | Show release status (Official, Promotion, etc.) |
_showCatalogueNumber |
Integer | 0 | 0, 1 | Show catalog number in album folder |
_showIDNum |
Integer | 1 | 0, 1 | Show MusicBrainz ID and catalog |
_showTime |
Integer | 1 | 0, 1 | Show track duration in filename |
_showBandwidth |
Integer | 1 | 0, 1 | Show audio quality metrics in filename |
| PRIMARY ORGANIZATION | ||||
_orderTypeForRoot |
Integer | 2 | 1, 2 | 1=Category, 2=Artist letter folders |
_orderTypeForArtist |
Integer | 1 | 1, 2, 3 | 1=First name, 2=Last name, 3=None |
_separateByTypeInArtistDirectory |
Integer | 1 | 0, 1 | Separate albums/singles/EPs into subfolders |
_separateAlbum |
Integer | 0 | 0, 1 | Put albums in Albums/ subfolder |
_rootLevelTypeSeparation |
Integer | 0 | 0, 1 | Separate by file type at root (/MP3/, /FLAC/) |
_albumLevelTypeSeparation |
Integer | 0 | 0, 1 | Separate by file type in album |
_albumNameAtTypeSeparation |
Integer | 0 | 0, 1 | Show album name before type folder |
| INCOMPLETE ALBUMS | ||||
_extraTrackHandling |
Integer | 1 | 0, 1 | How to handle albums with extra tracks |
_earlierPresortForIncompletes |
Integer | 1 | 0, 1 | Separate incomplete albums early |
| MULTI-DISC | ||||
_useSubDiscDirectory |
Integer | 1 | 0, 1 | Multi-disc albums in disc subfolders |
_mergeDiscWhenNotUsingSubDirectory |
Integer | 0 | 0, 1 | Skip disc folder if only one disc |
_showDiscSubtitle |
Integer | 1 | 0, 1 | Show disc subtitle if present |
_nameForTypeCD |
String | Disc | - | Name for CD disc folders |
_nameForTypeVinyl |
String | Side | - | Name for vinyl disc folders |
_useMusicBrainzStyleForVinylTrack |
Integer | 1 | 0, 1 | Use A1, B1 style for vinyl tracks |
| SPECIAL COLLECTIONS | ||||
_soundTracksDirectory |
String | Soundtrack/ | - | Soundtrack albums folder name |
_variousArtistsDirectory |
String | Various/ | - | Various Artists folder name |
_compilationsGSubDirectory |
String | Compilations/ | - | Global compilations folder name |
_audiobooksDirectory |
String | Audiobook/ | - | Audiobooks folder name |
_podcastSubDirectory |
String | Podcast/ | - | Podcasts folder name |
_incompleteDirectory |
String | Partial | - | Incomplete albums suffix/folder name |
| TYPE SUBFOLDER NAMES | ||||
_albumSubDirectory |
String | Albums/ | - | Albums subfolder name |
_compilationsASubDirectory |
String | Compilation/ | - | Artist compilations subfolder |
_coverSubDirectory |
String | Cover/ | - | Cover albums subfolder |
_tributeSubDirectory |
String | Tribute/ | - | Tribute albums subfolder |
_singlesSubDirectory |
String | Singles/ | - | Singles subfolder |
_liveSubDirectory |
String | Live/ | - | Live albums subfolder |
_epSubDirectory |
String | EP/ | - | EPs subfolder |
_broadcastSubDirectory |
String | Broadcast/ | - | Broadcasts subfolder |
_interviewSubDirectory |
String | Interview/ | - | Interviews subfolder |
_videoSubDirectory |
String | Video/ | - | Videos subfolder |
_otherSubDirectory |
String | Others/ | - | Other releases subfolder |
| GENRE SUBSORT | ||||
_isSubSort |
Integer | 1 | 0, 1 | Enable genre-based pre-sorting |
_subSortGame |
String | Arcade/ | - | Game soundtracks folder |
_subSortDJBits |
String | DJBits/ | - | DJ/remix folder |
_subSortClassical |
String | Classical/ | - | Classical music folder |
_subSortDemento |
String | Dementia/ | - | Comedy/novelty folder |
_subSort12Inch |
String | 12 Inch Mix/ | - | 12" mixes folder |
_subSortDisney |
String | Disney/ | - | Disney music folder |
_subSortPodcast |
String | Podcast/ | - | Podcasts folder |
_subSortInterview |
String | Interview/ | - | Interviews folder |
_subSortBroadcast |
String | Broadcast/ | - | Broadcasts folder |
_subSortReserved |
String | Singles Candidates/ | - | Reserved/special folder |
_subSortPreTag |
String | No MBID/ | - | Untagged folder |
_subSortHoliday |
String | Holiday/ | - | Holiday music folder |
_subSortCountry |
String | Country/ | - | Country music folder |
_subSortBlues |
String | Blues/ | - | Blues music folder |
_subSortJazz |
String | Jazz/ | - | Jazz music folder |
_subSort2Oct |
String | Spooktacular/ | - | October seasonal folder |
_subSort2Nov |
String | Fallback/ | - | November seasonal folder |
_subSort2Dec |
String | Here Comes Santa/ | - | December seasonal folder |
_subSort2Jan |
String | Wintertime/ | - | January seasonal folder |
_subSort2Feb |
String | Will You Be My Valentine?/ | - | February seasonal folder |
_subSort2Mar |
String | Spring is in the Air/ | - | March seasonal folder |
_subSort2Apr |
String | Foolish/ | - | April seasonal folder |
_subSort2May |
String | Maybe/ | - | May seasonal folder |
_subSort2June |
String | SumSumSummertime/ | - | June seasonal folder |
_subSort2July |
String | Fireworks & Stuff/ | - | July seasonal folder |
_subSort2Aug |
String | SumSumSummertime/ | - | August seasonal folder |
_subSort2Sept |
String | SumSumSummertime/ | - | September seasonal folder |
| TRIBUTE/COVER | ||||
_altArtistSort |
Integer | 1 | 0, 1 | File tribute/cover under original artist |
| TRACK SEPARATION | ||||
_showTrackArtistSeparation |
Integer | 0 | 0, 1 | Separate tracks by artist in album |
| LENGTH/PADDING | ||||
_PaddedDiscNumMinLength |
Integer | 1 | 1-9 | Minimum disc number padding |
_PaddedTrackNumMinLength |
Integer | 2 | 1-9 | Minimum track number padding |
_aTitleMaxLength |
Integer | 65 | 1-999 | Maximum album title length |
_tTitleMaxLength |
Integer | 65 | 1-999 | Maximum track title length |
_tFilenameMaxLength |
Integer | 120 | 1-999 | Maximum complete filename length |
3.2 Development Settings
_devMode
Purpose: Test the script with hardcoded values instead of real metadata.
Values:
0- Normal operation (use real file metadata)1- Test mode (use hardcoded values defined in Section 10)
When to use:
- Testing script changes without actual music files
- Debugging audio metrics detection
- Verifying path generation logic
WARNING: Must be set to 0 for actual use! If left at 1, all files will use the same test values.
Test values (when _devMode = 1):
$set(_biitrate,71.426) # Test bitrate
$set(_saample_rate,44100) # Test sample rate
$set(_biits_per_sample,16) # Test bit depth
$set(_chaannels,2) # Test channels
$set(_tiitle,My Great Score) # Test title
_quickNoNameFormat
Purpose: Skip filename formatting for quick sorting from unmatched files.
Values:
0- Full formatting with all metadata (default)1- Minimal formatting (keeps original filename)
When to use:
- Sorting large batches of unmatched files quickly
- When you just want directory organization, not filename changes
Effect:
- Disables
_showTimeand_showBandwidthautomatically - Uses
%_filename%instead of%_titleForFilename% - Still organizes into folders normally
3.3 Display Options
_showDate
Purpose: Show release year in album folder name.
Values:
0- Album name only1- Album name with year (default)
Examples:
_showDate = 0: /Artist/Abbey Road [CD - MP3]/
_showDate = 1: /Artist/(1969) Abbey Road [CD - MP3]/
Notes:
- Uses first available:
originalyear,originaldate,date - Shows first 4 characters (year only, not full date)
- Shows "0000" if no date available
_showRecordLabel
Purpose: Show record label in album folder name.
Values:
0- Don't show label (default)1- Show label
Examples:
_showRecordLabel = 0: /Artist/(1985) Album [CD - MP3]/
_showRecordLabel = 1: /Artist/(1985) Album [Epic Records] [CD - MP3]/
Notes:
- Only shows first label if multiple
- Requires
labeltag to be present
_showReleaseStatus
Purpose: Show release status (Official, Promotion, Bootleg, etc.) in album folder.
Values:
0- Don't show status (default)1- Show status
Examples:
_showReleaseStatus = 0: /Artist/(1985) Album [CD - MP3]/
_showReleaseStatus = 1: /Artist/(1985) Album [Promotion] [CD - MP3]/
Common statuses:
- Official
- Promotion
- Bootleg
- Pseudo-Release
_showCatalogueNumber
Purpose: Show catalog number in album folder name.
Values:
0- Don't show catalog number (default)1- Show catalog number
Examples:
_showCatalogueNumber = 0: /Artist/(1985) Album [CD - MP3]/
_showCatalogueNumber = 1: /Artist/(1985) Album [XPCD-1234] [CD - MP3]/
_showIDNum
Purpose: Show MusicBrainz Album ID and catalog number.
Values:
0- Don't show1- Show (default)
Format: [mbid] {catalog}
Examples:
_showIDNum = 0: /Artist/(1985) Album [CD - MP3]/
_showIDNum = 1: /Artist/(1985) Album [CD - MP3] [a1b2c3d4] {XPCD-1234}/
Use case: Helps identify exact MusicBrainz release if you have multiple versions
_showTime
Purpose: Show track duration in filename.
Values:
0- Don't show duration1- Show duration (default)
Format: [XmYYs]
Examples:
_showTime = 0: 01. Come Together.mp3
_showTime = 1: 01. Come Together [4m20s].mp3
Notes:
- Automatically disabled if
_quickNoNameFormat = 1 - Uses Picard's
%_length%variable - Format: minutes + "m" + seconds + "s"
_showBandwidth
Purpose: Show audio quality metrics in filename.
Values:
0- Don't show metrics1- Show metrics (default)
Format: [bitrate samplerate type channels]
Examples:
_showBandwidth = 0: 01. Track.mp3
_showBandwidth = 1: 01. Track [320 44100KHz CBR 2ch].mp3
_showBandwidth = 1: 02. Track [V0 44100KHz VBR 2ch].mp3
_showBandwidth = 1: 03. Track [96000KHz 24bit 6ch].flac
Metrics shown:
- Bitrate: 320, V0, V2, etc. (see VBR Mapping section)
- Sample Rate: 44100KHz, 48000KHz, 96000KHz, etc. (full Hz value)
- Type: CBR, VBR, or file format for lossless
- Channels: 2ch (stereo), 6ch (5.1 surround), etc.
3.4 Primary Organization Structure
_orderTypeForRoot
Purpose: Choose root directory organization method.
Values:
1- By category/genre (requires Last.fm.ng plugin)2- By artist first letter (default, recommended)
Examples:
Option 1 - Category:
/Rock/
Beatles, The/(1969) Abbey Road [CD - MP3]/...
Pink Floyd/(1973) Dark Side of the Moon [Vinyl - FLAC]/...
/Pop/
Madonna/(1984) Like a Virgin [CD - MP3]/...
Taylor Swift/(2014) 1989 [CD - MP3]/...
Option 2 - Artist Letter:
/B/
Beatles, The/(1969) Abbey Road [CD - MP3]/...
/M/
Madonna/(1984) Like a Virgin [CD - MP3]/...
/P/
Pink Floyd/(1973) Dark Side of the Moon [Vinyl - FLAC]/...
Notes:
- Option 1 requires
albumgroupingtag (from Last.fm.ng plugin) - Option 2 is most common and doesn't require extra plugins
_orderTypeForArtist
Purpose: Choose how artist names are sorted.
Values:
1- First letter of first name (default)2- First letter of last name (uses sort tags)3- No alphabetical separation
Examples:
Option 1 - First Name:
/M/Madonna/...
/W/Weird Al Yankovic/...
/T/The Beatles/...
Option 2 - Last Name:
/M/Madonna/...
/Y/Yankovic, Weird Al/...
/B/Beatles, The/...
Option 3 - No Separation:
/Madonna/...
/Weird Al Yankovic/...
/The Beatles/...
Notes:
- Option 2 relies on MusicBrainz
albumartistsortandartistsorttags - "The", "A", "An" are automatically handled by MusicBrainz sort tags
- Option 3 can create very long lists in root directory
_separateByTypeInArtistDirectory
Purpose: Separate releases by type into subfolders.
Values:
0- All releases directly in artist folder1- Separate into subfolders (default)
Examples:
Option 0 - No Separation:
/Artist/
(1969) Abbey Road [CD - MP3]/...
(1967) All You Need is Love [CD - MP3]/... (single)
(1994) Live at the BBC [CD - MP3]/... (live)
Option 1 - With Separation:
/Artist/
(1969) Abbey Road [CD - MP3]/...
Singles/
(1967) All You Need is Love [CD - MP3]/...
Live/
(1994) Live at the BBC [CD - MP3]/...
Subfolder types created:
- Albums/ (if
_separateAlbum = 1) - Singles/
- EP/
- Live/
- Compilation/
- Cover/
- Tribute/
- Broadcast/
- Interview/
- Video/
- Others/
_separateAlbum
Purpose: Put regular albums in an Albums/ subfolder.
Values:
0- Albums directly in artist folder (default)1- Albums in Albums/ subfolder
Requires: _separateByTypeInArtistDirectory = 1
Examples:
Option 0:
/Artist/
(1969) Abbey Road [CD - MP3]/...
(1965) Rubber Soul [CD - MP3]/...
Singles/
(1967) All You Need is Love [CD - MP3]/...
Option 1:
/Artist/
Albums/
(1969) Abbey Road [CD - MP3]/...
(1965) Rubber Soul [CD - MP3]/...
Singles/
(1967) All You Need is Love [CD - MP3]/...
When to use: Some users prefer all release types in subfolders for consistency.
3.5 Multi-Disc Handling
_useSubDiscDirectory
Purpose: Create separate subdirectories for each disc in multi-disc albums.
Values:
0- All discs in same folder with disc prefix in track number1- Each disc in its own subfolder (default)
Examples:
Option 0 - Same Folder:
/Artist/Album (1985)/
101. Track One.mp3
102. Track Two.mp3
201. Track One.mp3
202. Track Two.mp3
Option 1 - Disc Subfolders:
/Artist/(1985) Album [CD - MP3]/
Disc01/
01. Track One.mp3
02. Track Two.mp3
Disc02/
01. Track One.mp3
02. Track Two.mp3
Notes:
- Option 0 is useful for devices that don't support subfolders
- Option 1 is cleaner and more organized
_showDiscSubtitle
Purpose: Show disc subtitle if present in MusicBrainz data.
Values:
0- Just disc number1- Include subtitle (default)
Examples:
Option 0:
/Album/Disc01/...
/Album/Disc02/...
Option 1:
/Album/Disc01 - Acoustic/...
/Album/Disc02 - Electric/...
Notes:
- Only applies when
_useSubDiscDirectory = 1 - Disc subtitles come from MusicBrainz, not always present
_useMusicBrainzStyleForVinylTrack
Purpose: Use vinyl-style track numbering (A1, A2, B1, B2) for vinyl releases.
Values:
0- Standard numbering (01, 02, 03)1- Vinyl style (A1, B1) (default)
Applies to: Media type = "Vinyl" only
Examples:
Option 0 - Standard:
/Album [Vinyl - MP3]/
Side 1/
01. Track.mp3
02. Track.mp3
Side 2/
01. Track.mp3
02. Track.mp3
Option 1 - Vinyl Style:
/Album [Vinyl - MP3]/
Side 1/
A1. Track.mp3
A2. Track.mp3
Side 2/
B1. Track.mp3
B2. Track.mp3
Requirements:
- Release must have MusicBrainz track numbers (not all do)
- Media tag must be "Vinyl"
3.6 Genre SubSort
How Genre SubSort Works
Genre SubSort creates custom root-level folders based on the genresort tag. This is an advanced feature for organizing large, diverse libraries.
Workflow:
- Set custom
genresorttag on files (not from MusicBrainz) - Script detects keyword in
genresortvalue - Routes to corresponding subsort folder
Example:
- Tag:
genresort = Holiday - Trigger: Script detects "Holiday" in tag
- Folder:
_subSortHoliday = Holiday/ - Result:
/Holiday/Artist/Album/
Available Subsort Categories
| Trigger Keyword | Folder Variable | Default Folder | Use Case |
|---|---|---|---|
Holiday |
_subSortHoliday |
Holiday/ | Christmas, seasonal music |
Classical |
_subSortClassical |
Classical/ | Classical music |
Jazz |
_subSortJazz |
Jazz/ | Jazz music |
Blues |
_subSortBlues |
Blues/ | Blues music |
Country |
_subSortCountry |
Country/ | Country music |
Game |
_subSortGame |
Arcade/ | Video game soundtracks |
Disney |
_subSortDisney |
Disney/ | Disney music |
odcast |
_subSortPodcast |
Podcast/ | Podcasts |
nterview |
_subSortInterview |
Interview/ | Interviews |
roadcast |
_subSortBroadcast |
Broadcast/ | Broadcasts |
12 Inch |
_subSort12Inch |
12 Inch Mix/ | 12" remix singles |
Novelty, Comedy, Demento, FuMP |
_subSortDemento |
Dementia/ | Comedy/novelty music |
DJ Bits |
_subSortDJBits |
DJBits/ | DJ tools, samples |
*-* |
_subSortReserved |
Singles Candidates/ | Special marker |
*** |
_subSortPreTag |
No MBID/ | Untagged files |
Seasonal Subsort (Second Level)
You can also use seasonal keywords for a second level of sorting:
| Trigger Keyword | Folder | Season |
|---|---|---|
Spook |
Spooktacular/ | Halloween/October |
Fall |
Fallback/ | November |
Santa |
Here Comes Santa/ | December |
Winter |
Wintertime/ | January |
Valentine |
Will You Be My Valentine?/ | February |
Spring |
Spring is in the Air/ | March |
Fool |
Foolish/ | April |
Maybe |
Maybe/ | May |
Summer, Firew |
SumSumSummertime/, Fireworks & Stuff/ | June-September |
Example:
genresort = Holiday Santa
-> Routes to: /Holiday/Here Comes Santa/Artist/Album/
Creating Your Own Subsort
- Define folder name:
$set(_subSortMyGenre,MyGenre/)
- Add detection logic in Section 11:
$if($in(%genresort%,MyKeyword),$set(_subSortDirectory,%_subSortMyGenre%))
- Tag your files:
genresort = MyKeyword
- Result:
/MyGenre/Artist/Album/
4. Character Replacement
4.1 Why Character Replacement?
Different operating systems and filesystems have different rules for allowed characters in file and folder names:
- Windows: Disallows
:,?,*,<,>,|,",/,\ - Linux/macOS: More permissive but
/still reserved for path separator - Samba/CIFS: Network shares have additional restrictions
Additionally, some characters can cause issues with:
- Command-line tools
- Backup software
- Cloud storage sync
- Media players
This script ensures cross-platform compatibility by replacing problematic characters.
4.2 Complete Replacement Table
Tag-Level Replacements (Written to File Metadata)
These replacements modify the actual tags written to your music files:
| Original | Replacement | Tags Affected | Reason | Example |
|---|---|---|---|---|
... |
& |
album, title, discsubtitle | Ellipsis standardization | "Best... Song" -> "Best & Song" |
No. X |
X |
album, title, discsubtitle | Remove "No." prefix | "No. 1 Hit" -> "1 Hit" |
12" |
12 Inch |
album, title, discsubtitle, media | Standardize vinyl notation | '12" Vinyl' -> "12 Inch Vinyl" |
"text" |
'text' |
All artist/album/title tags | Samba compatibility | 'The "Best"' -> "The 'Best'" |
Why tag-level? These improve consistency and readability of your metadata, not just filenames.
Filename-Level Replacements (File/Folder Names Only)
These replacements only affect paths, not file metadata:
| Original | Replacement | Scope | Reason | Example |
|---|---|---|---|---|
# |
- |
All filename variables | Hash alternative | "Track #1" -> "Track -1" |
: |
_ |
All filename variables | Windows incompatible | "Title: Sub" -> "Title_ Sub" |
? |
G |
All filename variables | Windows incompatible | "Why?" -> "WhyG" |
| |
è |
Album, title, disc subtitle | Pipe alternative | "A|B" -> "Aèb" |
> |
[removed] | Album, title, disc subtitle | Windows incompatible | "A>B" -> "AB" |
< |
[removed] | Album, title, disc subtitle | Windows incompatible | "A<B" -> "AB" |
* |
1 |
All variables | Windows incompatible | "A*B" -> "A1B" |
& |
& |
All variables | HTML entity | "A & B" -> "A & B" |
Why filename-only? These are purely for filesystem compatibility, no need to modify the actual metadata.
4.3 Scope: Which Variables Are Affected?
Tag-Level Scope (all of these):
albumtitlediscsubtitlemediaalbumartistartistalbumartistsortartistsort
Filename-Level Scope (all of these):
_titleForFilename_albumForFilename_discsubtitleForFilename_artistForFilename_albumartistForFilename_artistsortForFilename_albumartistsortForFilename
4.4 Platform-Specific Issues
Windows Path Restrictions
Windows disallows these characters in paths: < > : " / \ | ? *
How the script handles it:
:->_(colon to underscore)?->G(question mark removed)*->1(asterisk to "1")>-> removed<-> removed|->è"->'(double to single quotes)
4.5 Customizing Character Replacements
Adding a New Replacement
Example: Replace @ with (at)
- For tags (Section 9, tag-level):
$set(title,$replace(%title%,@,(at)))
$set(album,$replace(%album%,@,(at)))
- For filenames (Section 9, filename-level):
$set(_titleForFilename,$replace(%_titleForFilename%,@,(at)))
$set(_albumForFilename,$replace(%_albumForFilename%,@,(at)))
Changing an Existing Replacement
Example: Change : replacement from _ to -
Find this line in Section 9:
$set(_titleForFilename,$replace(%_titleForFilename%,:,_))
Change to:
$set(_titleForFilename,$replace(%_titleForFilename%,:,-))
Repeat for all filename variables.
Using Regex Replacements
For more complex patterns, use $rreplace():
$set(title,$rreplace(%title%,pattern,replacement))
Example: Remove all parentheses and contents:
$set(title,$rreplace(%title%,\(.*?\),))
Example: Convert "feat. Artist" to "[Artist]":
$set(title,$rreplace(%title%, feat\. (.*), [\1]))
5. VBR Bitrate Mapping
5.1 What is VBR?
CBR (Constant Bitrate):
- Fixed bitrate throughout the entire file
- Example: 320 kbps CBR - every second uses exactly 320 kbit
- File size is predictable
- Common presets: 320, 256, 192, 128, 96, 64 kbps
VBR (Variable Bitrate):
- Bitrate varies based on complexity of audio
- Complex parts (loud, detailed) get higher bitrate
- Simple parts (silence, simple tones) get lower bitrate
- Better quality/size ratio than CBR
- Picard reports average bitrate
How to detect: If Picard's average bitrate doesn't match a standard CBR preset (320, 256, 192, etc.), assume VBR.
5.2 Detection Logic
The script determines CBR vs VBR by checking if the bitrate matches standard presets:
Standard CBR presets: 320, 256, 224, 192, 160, 128, 112, 96, 80, 64, 48, 40, 32, 24, 16, 8
If bitrate matches -> CBR
If bitrate doesn't match -> VBR
Example:
- Picard reports
320.0 kbps-> Exactly 320 -> CBR - Picard reports
245.3 kbps-> Not a standard preset -> VBR (likely V0)
5.3 LAME VBR Quality Levels
LAME is the most popular MP3 encoder and defines standard VBR presets (V0-V9).
Complete VBR Mapping Table
| Bitrate Range (kbps) | LAME Preset | Script Label | Quality Description | Typical Use |
|---|---|---|---|---|
| 339+ | Custom/Extreme | 320+ |
Extreme quality VBR | Very high quality VBR |
| 320-339 | V0 alt | 320 |
Extreme | Alternative V0 extreme |
| 260-319 | Custom | V0+ |
High+ | High quality VBR+ |
| 220-260 | V0 | V0 |
Excellent (245 avg) | Most popular high quality |
| 192-220 | V1 | V1 |
Excellent (225 avg) | Slightly smaller than V0 |
| 170-191 | V2 | V2 |
Transparent (190 avg) | Most can't tell from original |
| 150-170 | V3 | V3 |
Good (175 avg) | Good quality, smaller size |
| 140-150 | V4 | V4 |
Good (165 avg) | Acceptable quality |
| 130-140 | V5 | V5 |
Moderate (130 avg) | Moderate quality |
| 120-130 | V6 | V6 |
Moderate (115 avg) | Smaller files |
| 96-120 | V7 | V7 |
Acceptable | Noticeably compressed |
| 70-95 | V8 | V8 |
Low | Low quality |
| 45-69 | V9 | V9 |
Very low | Very low quality |
| <45 | N/A | [actual kbps] |
Poor | Below standard range |
5.4 Filename Examples
CBR:
01. Track [320 44100KHz CBR 2ch].mp3 -> 320 kbps CBR
02. Track [192 44100KHz CBR 2ch].mp3 -> 192 kbps CBR
03. Track [128 44100KHz CBR 2ch].mp3 -> 128 kbps CBR
VBR:
01. Track [V0 44100KHz VBR 2ch].mp3 -> LAME V0 (245 avg)
02. Track [V2 44100KHz VBR 2ch].mp3 -> LAME V2 (190 avg)
03. Track [V5 44100KHz VBR 2ch].mp3 -> LAME V5 (130 avg)
04. Track [320+ 44100KHz VBR 2ch].mp3 -> VBR above 339 kbps
05. Track [71 44100KHz VBR 2ch].mp3 -> VBR outside standard range
Lossless:
01. Track [44100KHz 16bit 2ch].flac
02. Track [96000KHz 24bit 2ch].flac
03. Track [48000KHz 16bit 2ch].m4a
5.5 How the Mapping Code Works
Step 1: Extract integer bitrate
$set(_intBitRate,$rreplace(%_bitrate%,\\.\\d*\$,))
Removes decimal: 245.3 -> 245
Step 2: Check if CBR
$if($eq_any(%_intBitRate%,320,256,224,192,160,128,112,96,80,64,48,40,32,24,16,8),
CBR...,
VBR...
)
Step 3: If VBR, map to quality level
$if($gt(%_vbrRateValue%,339),$set(_fileVBRRate,320+),
$if($gt(%_vbrRateValue%,319),$set(_fileVBRRate,320),
$if($gt(%_vbrRateValue%,260),$set(_fileVBRRate,V0+),
$if($gt(%_vbrRateValue%,220),$set(_fileVBRRate,V0),
...
Uses nested $if() with $gt() (greater than) to find the right range.
5.6 Special Cases
320+ kbps VBR
Some extreme quality VBR encodes can average above 320 kbps (up to ~340 kbps for MP3).
Detection: Bitrate > 339 kbps
Label: 320+
Example:
01. Track [320+ 44100KHz VBR 2ch].mp3
Non-Standard VBR
Files encoded with custom VBR settings outside LAME standard ranges show actual bitrate.
Example: 71 kbps average (between V9 and below standard range)
01. Track [71 44100KHz VBR 2ch].mp3
Lossless Files
FLAC, ALAC, and other lossless formats don't use CBR/VBR labels. Instead, they show file format.
Example:
FLAC 96KHz 24bit 2ch
ALAC 48KHz 16bit 2ch
6. Path Generation Examples
6.1 Example 1: Basic Artist Album (Single-Disc CD)
Configuration:
_orderTypeForRoot = 2
_orderTypeForArtist = 1
_separateByTypeInArtistDirectory = 0
_showDate = 1
_showIDNum = 1
_useSubDiscDirectory = 1
Metadata:
Artist: The Beatles
Album: Abbey Road
Year: 1969
Media: CD
Release Type: album
Total Discs: 1
Total Tracks: 17
Track 1: Come Together (4m20s)
Bitrate: 320 kbps CBR
Sample Rate: 44100 Hz
Channels: 2
MusicBrainz Album ID: 123abc
Catalog Number: XPCD-456
Path Construction (Step-by-Step):
Step 1: Root organization
_orderTypeForRoot = 2 -> Use artist first letter
Artist = "The Beatles"
First letter (after removing "The") = "B"
Result: /B/
Step 2: Artist name
_orderTypeForArtist = 1 -> Use first name sorting
Artist = "The Beatles"
Sort tag = "Beatles, The"
Result: /B/Beatles, The/
Step 3: Album type detection
releasetype = "album" -> _isAlbum = 1
_separateByTypeInArtistDirectory = 0 -> No type subfolder
Step 4: Album name with metadata
Album = "Abbey Road"
Year = 1969, _showDate = 1 -> Add (1969) before album name
Media = "CD", Extension = "MP3" -> Add [CD - MP3]
_showIDNum = 1 -> Add [mbid] {catalog}
Result: /B/Beatles, The/(1969) Abbey Road [CD - MP3] [123abc] {XPCD-456}/
Step 5: Multi-disc check
totaldiscs = 1 -> No disc subfolder needed
Step 6: Track filename
Track 1: "Come Together"
tracknumber = 1, totaltracks = 17 -> Pad to 2 digits: 01
_showTime = 1 -> Add [4m20s]
_showBandwidth = 1 -> Add [320 44100KHz CBR 2ch]
Result: 01. Come Together [4m20s] [320 44100KHz CBR 2ch].mp3
Final Path:
/B/Beatles, The/(1969) Abbey Road [CD - MP3] [123abc] {XPCD-456}/01. Come Together [4m20s] [320 44100KHz CBR 2ch].mp3
6.2 Example 2: Multi-Disc Album with Subtitles
Configuration:
_orderTypeForRoot = 2
_orderTypeForArtist = 1
_separateByTypeInArtistDirectory = 1
_separateAlbum = 0
_useSubDiscDirectory = 1
_showDiscSubtitle = 1
_nameForTypeCD = Disc
Metadata:
Artist: Pink Floyd
Album: The Wall
Year: 1979
Media: CD
Release Type: album
Total Discs: 2
Disc 1 Subtitle: Part 1
Disc 2 Subtitle: Part 2
Disc 1, Track 1: In the Flesh? (3:19)
Disc 2, Track 1: Hey You (4:42)
Path Construction:
Step 1: Root organization
Artist first letter = "P"
Result: /P/
Step 2: Artist name
Artist = "Pink Floyd"
Result: /P/Pink Floyd/
Step 3: Album type subfolder
_isAlbum = 1, _separateByTypeInArtistDirectory = 1
_separateAlbum = 0 -> No Albums/ subfolder for standard albums
Result: /P/Pink Floyd/
Step 4: Album name
Album = "The Wall"
Year = 1979 -> Add (1979) before album name
Media = "CD", Extension = "FLAC" -> Add [CD - FLAC]
Result: /P/Pink Floyd/(1979) The Wall [CD - FLAC]/
Step 5: Disc subfolders
totaldiscs = 2 -> Multi-disc
_useSubDiscDirectory = 1 -> Create disc subfolders
_showDiscSubtitle = 1 -> Include disc subtitles
Disc 1: Disc01 - Part 1/
Disc 2: Disc02 - Part 2/
Step 6: Track filenames
Disc 1, Track 1: "In the Flesh?"
tracknumber = 1 -> 01
Result: 01. In the FleshG [3m19s] [96000KHz 16bit 2ch].flac
(Note: "?" replaced with "G")
Final Paths:
/P/Pink Floyd/(1979) The Wall [CD - FLAC]/Disc01 - Part 1/01. In the FleshG [3m19s] [96000KHz 16bit 2ch].flac
/P/Pink Floyd/(1979) The Wall [CD - FLAC]/Disc02 - Part 2/01. Hey You [4m42s] [96000KHz 16bit 2ch].flac
6.3 Example 3: Vinyl with MusicBrainz Track Numbering
Configuration:
_orderTypeForRoot = 2
_orderTypeForArtist = 2
_separateByTypeInArtistDirectory = 1
_useMusicBrainzStyleForVinylTrack = 1
_nameForTypeVinyl = Side
Metadata:
Artist: David Bowie
Artist Sort: Bowie, David
Album: The Rise and Fall of Ziggy Stardust and the Spiders from Mars
Year: 1972
Media: Vinyl
Release Type: album
Total Discs: 2 (sides)
Side A, Track 1: Five Years (4:43, MB track: A1)
Side A, Track 2: Soul Love (3:35, MB track: A2)
Side B, Track 1: Lady Stardust (3:22, MB track: B1)
Path Construction:
Step 1: Root organization
Artist sort = "Bowie, David"
First letter of last name = "B"
Result: /B/
Step 2: Artist name
_orderTypeForArtist = 2 -> Use last name sorting
Artist sort = "Bowie, David"
Result: /B/Bowie, David/
Step 3: Album type subfolder
_separateByTypeInArtistDirectory = 1, _isAlbum = 1
Result: /B/Bowie, David/
Step 4: Album name
Album = "The Rise and Fall of Ziggy Stardust and the Spiders from Mars"
(Truncated if > 65 chars)
Year = 1972 -> Add (1972)
Media = "Vinyl" -> Add [Vinyl]
Result: /B/Bowie, David/(1972) The Rise and Fall of Ziggy Stardust... [Vinyl - MP3]/
Step 5: Side subfolders
Media = "Vinyl", totaldiscs = 2
_nameForTypeVinyl = "Side"
Side 1: Side 1/
Side 2: Side 2/
Step 6: Track filenames (Vinyl style)
_useMusicBrainzStyleForVinylTrack = 1
Media = "Vinyl" -> Use MB track numbers
Side 1, Track 1: MB track = "A1"
Result: A1. Five Years [4m43s] [V0 44100KHz VBR 2ch].mp3
Final Paths:
/B/Bowie, David/(1972) The Rise and Fall of Ziggy Stardust... [Vinyl - MP3]/Side 1/A1. Five Years [4m43s] [V0 44100KHz VBR 2ch].mp3
/B/Bowie, David/(1972) The Rise and Fall of Ziggy Stardust... [Vinyl - MP3]/Side 1/A2. Soul Love [3m35s] [V0 44100KHz VBR 2ch].mp3
/B/Bowie, David/(1972) The Rise and Fall of Ziggy Stardust... [Vinyl - MP3]/Side 2/B1. Lady Stardust [3m22s] [V0 44100KHz VBR 2ch].mp3
6.4 Example 4: Various Artists Compilation
Configuration:
_variousArtistsDirectory = Various/
_useSubDiscDirectory = 1
Metadata:
Album Artist: Various Artists
Album: Now That's What I Call Music! 80
Year: 2011
Media: CD
Release Type: album + compilation
Total Discs: 2
Disc 1, Track 1: Somebody That I Used to Know - Gotye feat. Kimbra (4:04)
Disc 1, Track 2: We Found Love - Rihanna feat. Calvin Harris (3:35)
Disc 2, Track 1: Party Rock Anthem - LMFAO (4:23)
Path Construction:
Step 1: Detect Various Artists
Album Artist = "Various Artists" -> _isVarious = 1
Step 2: Route to Various Artists directory
_variousArtistsDirectory = "Various/"
Album first letter = "N"
Result: /Various/N/
Step 3: Album name
Album = "Now That's What I Call Music! 80"
Year = 2011 -> Add (2011) before album name
Media = "CD", Extension = "MP3" -> Add [CD - MP3]
Result: /Various/N/(2011) Now That's What I Call Music! 80 [CD - MP3]/
Step 4: Disc subfolders
totaldiscs = 2 -> Multi-disc
Result: Disc01/, Disc02/
Step 5: Track filenames
Track 1, Disc 1:
Title = "Somebody That I Used to Know"
Featured artists detected -> Add [Gotye feat. Kimbra]
Result: 01. Somebody That I Used to Know [Gotye feat. Kimbra] [4m04s].mp3
Final Paths:
/Various/N/(2011) Now That's What I Call Music! 80 [CD - MP3]/Disc01/01. Somebody That I Used to Know [Gotye feat. Kimbra] [4m04s].mp3
/Various/N/(2011) Now That's What I Call Music! 80 [CD - MP3]/Disc01/02. We Found Love [Rihanna feat. Calvin Harris] [3m35s].mp3
/Various/N/(2011) Now That's What I Call Music! 80 [CD - MP3]/Disc02/01. Party Rock Anthem [LMFAO] [4m23s].mp3
6.5 Example 5: Album with Type Separation
Configuration:
_orderTypeForRoot = 2
_orderTypeForArtist = 1
_separateByTypeInArtistDirectory = 1
_separateAlbum = 0
_singlesSubDirectory = Singles/
_liveSubDirectory = Live/
Metadata (3 releases):
Album:
Artist: Nirvana
Album: Nevermind
Year: 1991
Release Type: album
Single:
Artist: Nirvana
Album: Smells Like Teen Spirit
Year: 1991
Release Type: single
Live:
Artist: Nirvana
Album: MTV Unplugged in New York
Year: 1994
Release Type: album + live
Path Construction:
All releases:
Root: /N/Nirvana/
Album (Nevermind):
_isAlbum = 1, _separateAlbum = 0 -> No Albums/ subfolder
Result: /N/Nirvana/(1991) Nevermind [CD - MP3]/
Single (Smells Like Teen Spirit):
_isSingle = 1 -> Use Singles/ subfolder
Result: /N/Nirvana/Singles/(1991) Smells Like Teen Spirit [CD - MP3]/
Live (MTV Unplugged):
_isLive = 1 -> Use Live/ subfolder
Result: /N/Nirvana/Live/(1994) MTV Unplugged in New York [CD - MP3]/
Final Paths:
/N/Nirvana/(1991) Nevermind [CD - MP3]/01. Smells Like Teen Spirit.mp3
/N/Nirvana/Singles/(1991) Smells Like Teen Spirit [CD - MP3]/01. Smells Like Teen Spirit.mp3
/N/Nirvana/Live/(1994) MTV Unplugged in New York [CD - MP3]/01. About a Girl.mp3
6.6 Example 6: Tribute Album with Original Artist Routing
Configuration:
_altArtistSort = 1
_tributeSubDirectory = Tribute/
Metadata:
Album Artist: Various Artists
Album: We Will Rock You - Queen Tribute
Year: 2005
Release Type: album + compilation
Custom Tag: coverTributeSort = Tribute
Custom Tag: albumartistsort = Queen
Track 1: We Will Rock You - Five (2:58)
Path Construction:
Step 1: Detect tribute album
coverTributeSort = "Tribute" -> _isTribute = 1
_altArtistSort = 1 -> Route to original artist
Step 2: Use custom albumartistsort
albumartistsort = "Queen"
First letter = "Q"
Result: /Q/Queen/
Step 3: Tribute subfolder
_isTribute = 1 -> Use Tribute/ subfolder
Result: /Q/Queen/Tribute/
Step 4: Album name
Album = "We Will Rock You - Queen Tribute"
Year = 2005 -> Add (2005) before album name
Result: /Q/Queen/Tribute/(2005) We Will Rock You - Queen Tribute [CD - MP3]/
Step 5: Track filename
Track 1: "We Will Rock You"
Track artist = "Five" (different from album artist)
-> Add [Five]
Result: 01. We Will Rock You [Five] [2m58s].mp3
Final Path:
/Q/Queen/Tribute/(2005) We Will Rock You - Queen Tribute [CD - MP3]/01. We Will Rock You [Five] [2m58s].mp3
Note: This requires manually setting two custom tags: coverTributeSort = Tribute and albumartistsort = Queen.
6.7 Example 7: Genre Pre-Sort (Classical)
Configuration:
_isSubSort = 1
_subSortClassical = Classical/
_orderTypeForRoot = 2
_orderTypeForArtist = 2
Metadata:
Artist: Johann Sebastian Bach
Artist Sort: Bach, Johann Sebastian
Album: Brandenburg Concertos
Year: 1721
Custom Tag: genresort = Classical
Path Construction:
Step 1: Detect genre subsort
genresort = "Classical"
-> Triggers: _subSortDirectory = "Classical/"
Step 2: Genre subsort folder
Result: /Classical/
Step 3: Artist first letter (last name)
Artist Sort = "Bach, Johann Sebastian"
First letter of last name = "B"
Result: /Classical/B/
Step 4: Artist name
_orderTypeForArtist = 2 -> Use sort name
Artist Sort = "Bach, Johann Sebastian"
Result: /Classical/B/Bach, Johann Sebastian/
Step 5: Album name
Album = "Brandenburg Concertos"
Year = 1721 -> Add (1721) before album name
Result: /Classical/B/Bach, Johann Sebastian/(1721) Brandenburg Concertos [CD - FLAC]/
Final Path:
/Classical/B/Bach, Johann Sebastian/(1721) Brandenburg Concertos [CD - FLAC]/01. Concerto No. 1 in F Major.flac
6.8 Example 8: Soundtrack
Configuration:
_soundTracksDirectory = Soundtrack/
Metadata:
Album: Guardians of the Galaxy - Awesome Mix Vol. 1
Year: 2014
Release Type: soundtrack
Track 1: Hooked on a Feeling - Blue Swede (2:53)
Path Construction:
Step 1: Detect soundtrack
releasetype = "soundtrack" -> _isSoundTrack = 1
Step 2: Route to Soundtrack directory
_soundTracksDirectory = "Soundtrack/"
Album first letter = "G"
Result: /Soundtrack/G/
Step 3: Album name
Album = "Guardians of the Galaxy - Awesome Mix Vol. 1"
Year = 2014 -> Add (2014) before album name
Result: /Soundtrack/G/(2014) Guardians of the Galaxy - Awesome Mix Vol. 1 [CD - MP3]/
Step 4: Track filename
Track 1: "Hooked on a Feeling"
Track artist = "Blue Swede" (soundtrack, show artist)
-> Add [Blue Swede]
Result: 01. Hooked on a Feeling [Blue Swede] [2m53s].mp3
Final Path:
/Soundtrack/G/(2014) Guardians of the Galaxy - Awesome Mix Vol. 1 [CD - MP3]/01. Hooked on a Feeling [Blue Swede] [2m53s].mp3
6.9 Example 9: Incomplete Album
Configuration:
_earlierPresortForIncompletes = 1
_incompleteDirectory = Partial
Metadata:
Artist: Radiohead
Album: OK Computer
Year: 1997
Total Tracks: 12
Matched Tracks: 8
Complete: No
Path Construction:
Step 1: Detect incomplete
$is_complete() = false -> _isIncomplete = 1
Step 2: Early presort
_earlierPresortForIncompletes = 1
-> Add "- Partial" prefix
Result: /- Partial/
Step 3: Standard artist organization
Artist first letter = "R"
Result: /- Partial/R/Radiohead/
Step 4: Album name
Album = "OK Computer"
Year = 1997 -> Add (1997) before album name
Result: /- Partial/R/Radiohead/(1997) OK Computer [CD - MP3]/
Final Path:
/- Partial/R/Radiohead/(1997) OK Computer [CD - MP3]/01. Airbag.mp3
/- Partial/R/Radiohead/(1997) OK Computer [CD - MP3]/03. Subterranean Homesick Alien.mp3
...
(tracks 2, 4, 6, 7, 9-12 missing)
Override: Set custom tag SavePerfectAnyway = yes to skip the "- Partial" prefix.
6.10 Example 10: EP with Bitrate Display
Configuration:
_separateByTypeInArtistDirectory = 1
_epSubDirectory = EP/
_showBandwidth = 1
Metadata:
Artist: The xx
Album: Fantasy EP
Year: 2009
Release Type: ep
Track 1: Fantasy (3:41, VBR 245 kbps avg)
Track 2: Teardrops (5:12, VBR 238 kbps avg)
Path Construction:
Step 1: Standard artist organization
Artist first letter = "X"
Result: /X/xx, The/
Step 2: EP subfolder
_isEP = 1 -> Use EP/ subfolder
Result: /X/xx, The/EP/
Step 3: Album name
Album = "Fantasy EP"
Year = 2009 -> Add (2009) before album name
Result: /X/xx, The/EP/(2009) Fantasy EP [CD - MP3]/
Step 4: Track filenames with VBR detection
Track 1: VBR 245 kbps -> Maps to V0
_showBandwidth = 1 -> Add [V0 44100KHz VBR 2ch]
Result: 01. Fantasy [3m41s] [V0 44100KHz VBR 2ch].mp3
Track 2: VBR 238 kbps -> Maps to V0
Result: 02. Teardrops [5m12s] [V0 44100KHz VBR 2ch].mp3
Final Paths:
/X/xx, The/EP/(2009) Fantasy EP [CD - MP3]/01. Fantasy [3m41s] [V0 44100KHz VBR 2ch].mp3
/X/xx, The/EP/(2009) Fantasy EP [CD - MP3]/02. Teardrops [5m12s] [V0 44100KHz VBR 2ch].mp3
7. Advanced Features
7.1 Genre-Based Sorting
(See Section 3.6 - Genre SubSort)
7.2 Tribute and Cover Album Handling
Overview
The tribute/cover feature allows you to file tribute and cover albums under the original artist being tributed or covered, rather than under the performing artist.
Use case: You want "A Tribute to Queen" by Various Artists filed under Queen, not Various Artists.
Requirements
This feature requires manually setting two custom tags:
coverTributeSort- Set to "Tribute" or "Cover"albumartistsort- Set to the original artist name
Why manual? MusicBrainz doesn't have a standard "this is a tribute album" field, so we use custom tags.
How to Set Custom Tags in Picard
- Select the album in Picard
- Right-click -> Tags from file names or Edit Tags
- Add a new tag:
- Tag name:
coverTributeSort - Value:
Tribute(orCover)
- Tag name:
- Add another tag:
- Tag name:
albumartistsort - Value: Original artist name (e.g., "Queen")
- Tag name:
- Save the file
Configuration
_altArtistSort = 1 # Enable tribute/cover routing (default)
Example Workflow
Album: "We Will Rock You - Queen Tribute" by Various Artists
Step 1: Tag the album
coverTributeSort = Tribute
albumartistsort = Queen
Step 2: Script detects
$if($in(%coverTributeSort%,Tribute),$set(_isTribute,1))
Step 3: Routes to original artist
$if($eq_all(%coverTributeSort%,%_altArtistSort%,%_isTribute%,1),
$if2(%_artistSort%,%_albumartistForFilename%,%_artistForFilename%)
)/
Uses albumartistsort = Queen for the folder.
Result:
/Q/Queen/Tribute/(2005) We Will Rock You - Queen Tribute [CD - MP3]/
Cover Albums
Same process, but use coverTributeSort = Cover:
Example: "Devolution" by DEVO (covers)
Tags:
coverTributeSort = Cover
albumartistsort = [Original Artist]
Result:
/D/DEVO/Cover/(2010) Devolution [CD - MP3]/
Limitations
- Must manually tag each tribute/cover album
- MusicBrainz doesn't provide this automatically
- albumartistsort must be spelled exactly as you want the folder named
7.3 DevMode (Development/Testing)
Purpose
DevMode allows you to test the script's audio metrics detection without actual music files.
Use case:
- Testing VBR mapping logic
- Debugging bitrate detection
- Verifying path generation
Configuration
_devMode = 1 # Enable test mode
WARNING: Must be set to 0 for actual use!
Test Values
When _devMode = 1, the script uses these hardcoded values instead of real file metadata:
Bitrate: 71.426 kbps (VBR V8 range)
Sample Rate: 44100 Hz
Bit Depth: 16 bit
Channels: 2
Title: "My Great Score"
What DevMode Does
-
Bitrate Detection:
$if($eq(%_devMode%,1), $set(_biitrate,71.426), # Use test bitrate $set(_intBitRate,$rreplace(%_bitrate%,\\.\\d*\$,)) # Use real bitrate ) -
Audio Metrics:
$if($eq(%_devMode%,1), $set(_bitRateSpeed,%_saample_rate%KHz), # Test sample rate $set(_bitRateSpeed,%_sample_rate%KHz) # Real sample rate ) -
Title:
$if($eq(%_devMode%,1), $set(_titleForFilename,%_tiitle%), # Test title $set(_titleForFilename,%_titleForFilename%) # Real title )
Expected Output (DevMode = 1)
All files will use test values:
01. My Great Score [Xm##s] [V8 44100KHz VBR 2ch].mp3
Bitrate 71.426 maps to V8.
How to Test
- Set
_devMode = 1in configuration - Copy script to Picard
- Tag any file
- Check filename - should show test values
- IMPORTANT: Set
_devMode = 0before actual use!
7.4 Custom Tag Integration
The script supports several custom tags you can set manually for special handling.
SavePerfectAnyway
Purpose: Override incomplete album detection.
Values: yes (any other value = not set)
Use case: You have a complete album but Picard thinks it's incomplete (e.g., you removed tracks intentionally).
How to set:
- Right-click file -> Edit Tags
- Add tag:
SavePerfectAnyway = yes - Save
Effect:
Normal: /- Partial/Artist/Album/
With tag: /Artist/Album/
SaveIncompleteAnyway
Purpose: Force incomplete album to go to incomplete directory.
Values: yes
Use case: Opposite of above - force incomplete routing.
Effect:
$if($in(%SaveIncompleteAnyway%,yes),%_incompleteDirectory%)/
BitRateSplit
Purpose: Add bitrate to album folder name.
Values: Yes
Configuration: (Not in default script, must add manually)
Example modification:
$if($in(%BitRateSplit%,Yes), %_fileVBRRate%%_fileCBRRate% %_bitRateType%)
Result:
/Artist/(1985) Album [320 CBR] [CD - MP3]/
coverTributeSort
(See Section 7.2 - Tribute and Cover Albums)
genresort
(See Section 3.6 - Genre SubSort)
8. Variables Reference
8.1 MusicBrainz Standard Tags
These tags come from MusicBrainz or existing file metadata:
| Tag | Description | Example |
|---|---|---|
%artist% |
Track artist name | "The Beatles" |
%albumartist% |
Album artist name | "The Beatles" |
%album% |
Album title | "Abbey Road" |
%title% |
Track title | "Come Together" |
%date% |
Release date | "1969-09-26" |
%originaldate% |
Original release date | "1969-09-26" |
%originalyear% |
Original release year | "1969" |
%tracknumber% |
Track number | "1" |
%totaltracks% |
Total tracks on disc | "17" |
%discnumber% |
Disc number | "1" |
%totaldiscs% |
Total discs in release | "2" |
%discsubtitle% |
Disc subtitle | "Acoustic" |
%media% |
Media type | "CD", "Vinyl", "Digital Media" |
%label% |
Record label | "Apple Records" |
%catalognumber% |
Catalog number | "XPCD-123" |
%releasetype% |
Release type(s) | "album", "single", "live" |
%releasestatus% |
Release status | "Official", "Promotion" |
%_releasecomment% |
Disambiguation comment | "Blue Album" |
%musicbrainz_albumid% |
MusicBrainz Album ID | "abc123..." |
%musicbrainz_albumartistid% |
MusicBrainz Album Artist ID | "def456..." |
%_musicbrainz_tracknumber% |
MusicBrainz track number | "A1", "B2" (vinyl) |
%genre% |
Genre | "Rock" |
%albumgrouping% |
Album grouping | "Rock", "Pop" (Last.fm) |
%compilation% |
Compilation flag | "1" if compilation |
%_length% |
Track length | "4:20" |
%_bitrate% |
Average bitrate | "320.0", "245.3" |
%_sample_rate% |
Sample rate | "44100" |
%_bits_per_sample% |
Bit depth | "16", "24" |
%_channels% |
Number of channels | "2", "6" |
%_extension% |
File extension | "mp3", "flac" |
%_filename% |
Original filename | "track01" |
8.2 Additional Artists Variables Plugin Tags
These tags require the "Additional Artists Variables" plugin:
Album Variables
| Tag | Description |
|---|---|
%_artists_album_primary_id% |
ID of primary album artist |
%_artists_album_primary_std% |
Primary album artist [standardized] |
%_artists_album_primary_cred% |
Primary album artist [as credited] |
%_artists_album_primary_sort% |
Primary album artist [sort name] |
%_artists_album_additional_id% |
IDs of additional album artists |
%_artists_album_additional_std% |
Additional album artists [standardized] |
%_artists_album_additional_cred% |
Additional album artists [as credited] |
%_artists_album_all_std% |
All album artists [standardized] |
%_artists_album_all_cred% |
All album artists [as credited] |
%_artists_album_all_sort% |
All album artists [sort names] |
%_artists_album_all_sort_primary% |
Primary [sort] + additional [std] |
%_artists_album_all_count% |
Number of album artists |
Track Variables
| Tag | Description |
|---|---|
%_artists_track_primary_id% |
ID of primary track artist |
%_artists_track_primary_std% |
Primary track artist [standardized] |
%_artists_track_primary_cred% |
Primary track artist [as credited] |
%_artists_track_primary_sort% |
Primary track artist [sort name] |
%_artists_track_additional_id% |
IDs of additional track artists |
%_artists_track_additional_std% |
Additional track artists [standardized] |
%_artists_track_additional_cred% |
Additional track artists [as credited] |
%_artists_track_all_std% |
All track artists [standardized] |
%_artists_track_all_cred% |
All track artists [as credited] |
%_artists_track_all_sort% |
All track artists [sort names] |
%_artists_track_all_sort_primary% |
Primary [sort] + additional [std] |
%_artists_track_all_count% |
Number of track artists |
What does [standardized] vs [as credited] mean?
- Standardized: Official artist name from MusicBrainz database
- As credited: How the artist is credited on this specific release
- Sort: Name formatted for sorting (e.g., "Beatles, The")
Example:
Artist credited as: "Weird Al"
Standardized name: "Weird Al Yankovic"
Sort name: "Yankovic, Weird Al"
8.3 Script Internal Variables
Variables created and used by the script (all start with _):
Constants (Section 1)
| Variable | Value | Description |
|---|---|---|
%_cUnknownArtistID% |
125ec42a-... |
MusicBrainz Unknown Artist ID |
%_cVariousArtistID% |
89ad4ac3-... |
MusicBrainz Various Artists ID |
%_cUnknownArtist% |
[Unknown Artist] |
Display name for unknown artist |
%_cVariousArtist% |
[Various Artists] |
Display name for various artists |
%_cUnknownAlbum% |
[Unknown Album] |
Display name for unknown album |
%_cNoTitle% |
[Unknown Title] |
Display name for unknown title |
%_cClassical% |
[Classical] |
Classical music folder name |
%_cSoundtrack% |
[Soundtracks] |
Soundtrack folder name |
%_cSingles% |
[~Singles~] |
Singles folder name |
%_cOther% |
[Other] |
Other releases folder name |
Working Variables (Section 4)
| Variable | Description |
|---|---|
%_nMedia% |
Media type |
%_nTotalDiscs% |
Total discs |
%_nDiscNum% |
Disc number |
%_nTotalTracks% |
Total tracks |
%_nTrackNum% |
Track number |
%_nAlbumArtistID% |
Album artist ID |
%_nInitial% |
Artist initial folder (e.g., "~ B ~/") |
%_nFeat% |
Featured artist string |
%_PaddedDiscNum% |
Padded disc number |
%_PaddedTrackNum% |
Padded track number |
%_nYear% |
Year in [YYYY] format |
%_nTNum% |
Complete track number (disc+track) |
Filename Variables (Section 8)
| Variable | Description |
|---|---|
%_titleForFilename% |
Sanitized track title |
%_albumForFilename% |
Sanitized album title |
%_discsubtitleForFilename% |
Sanitized disc subtitle |
%_albumartistForFilename% |
Sanitized album artist |
%_artistForFilename% |
Sanitized track artist |
%_albumartistsortForFilename% |
Sanitized album artist sort |
%_artistsortForFilename% |
Sanitized track artist sort |
Audio Metrics Variables (Section 10)
| Variable | Description |
|---|---|
%_intBitRate% |
Integer bitrate value |
%_bitRateSpeed% |
Sample rate (e.g., "44100KHz") |
%_bitsPerSample% |
Bit depth |
%_audioChannels% |
Channel count |
%_bitRateType% |
"CBR" or "VBR" |
%_cbrRateValue% |
CBR bitrate value |
%_vbrRateValue% |
VBR bitrate value |
%_fileCBRRate% |
CBR label for filename |
%_fileVBRRate% |
VBR label for filename (V0, V2, etc.) |
Detection Flags (Section 6)
| Variable | Value | Description |
|---|---|---|
%_isAlbum% |
1 if album | Is this an album release? |
%_isSingle% |
1 if single | Is this a single? |
%_isLive% |
1 if live | Is this a live recording? |
%_isEP% |
1 if EP | Is this an EP? |
%_isBroadcast% |
1 if broadcast | Is this a broadcast? |
%_isInterview% |
1 if interview | Is this an interview? |
%_isArtistCompil% |
1 if artist compilation | Artist compilation? |
%_isAudiobook% |
1 if audiobook | Is this an audiobook? |
%_isOther% |
1 if other | Is this "other" type? |
%_isTribute% |
1 if tribute | Is this a tribute album? |
%_isCover% |
1 if cover | Is this a cover album? |
%_isPodcast% |
1 if podcast | Is this a podcast? |
%_isSoundTrack% |
1 if soundtrack | Is this a soundtrack? |
%_isIncomplete% |
1 if incomplete | Is the album incomplete? |
%_isVideo% |
1 if video | Is this a video? |
%_isVarious% |
1 if various | Is album artist "Various Artists"? |
%_isGlobalCompil% |
1 if compilation | Is compilation flag set? |
9. Customization Guide
9.1 Adding New Character Replacements
Scenario: You want to replace @ with (at) in filenames.
Step 1: Decide scope (tags or filenames)
For filenames only, go to Section 9, filename-level replacements.
Step 2: Add replacement
Find the filename replacement block:
$noop( Character Replacements )
$set(_titleForFilename,$replace(%_titleForFilename%,:,_))
$set(_albumForFilename,$replace(%_albumForFilename%,:,_))
...
Step 3: Add your new line
$set(_titleForFilename,$replace(%_titleForFilename%,@,(at)))
$set(_albumForFilename,$replace(%_albumForFilename%,@,(at)))
$set(_artistForFilename,$replace(%_artistForFilename%,@,(at)))
Result:
Track: "Email @ Night"
Filename: "01. Email (at) Night.mp3"
9.2 Creating New Genre Subsort Categories
Scenario: You want to add a "Soundtrack - Games" category for video game soundtracks.
Step 1: Define folder name (Section 2.8)
$set(_subSortGameSoundtrack,Soundtrack - Games/)
Step 2: Add detection logic (Section 11)
Find the genre subsort detection block:
$if($in(%genresort%,Classical),$set(_subSortDirectory,%_subSortClassical%))
$if($in(%genresort%,Jazz),$set(_subSortDirectory,%_subSortJazz%))
...
Add your new line:
$if($in(%genresort%,Game Soundtrack),$set(_subSortDirectory,%_subSortGameSoundtrack%))
Step 3: Tag your files
Add custom tag genresort = Game Soundtrack to your video game soundtracks.
Result:
/Soundtrack - Games/Artist/Album/
9.3 Modifying Path Structure
Example 1: Remove Year from Album Folder
Find:
$if($eq(%_showDate%,1),$if($if2(%originalyear%,%originaldate%,%date%), \($left($if2(%originalyear%,%originaldate%,%date%),4)\) ,))
Change to:
$noop( Year display disabled )
Or simply set:
_showDate = 0
Example 2: Change Artist Letter Folder Format
Current: /B/Artist/
Want: /Artists-B/Artist/
Find (Section 11):
$if($eq(%_orderTypeForRoot%,2),
$upper($firstalphachar($if2(%_albumartistForFilename%,%_artistForFilename%),#1))
)/
Change to:
$if($eq(%_orderTypeForRoot%,2),
Artists-$upper($firstalphachar($if2(%_albumartistForFilename%,%_artistForFilename%),#1))
)/
Result: /Artists-B/Beatles, The/Album/
Example 3: Add Custom Prefix to All Paths
Want: /Music/ prefix before everything
Find (Section 11, start of path generation):
$noop( Step 1: Root Level File Type Separation )
$if($eq(%_rootLevelTypeSeparation%,1),$upper(%_extension%),)
Change to:
$noop( Step 0: Custom prefix )
Music/
$noop( Step 1: Root Level File Type Separation )
$if($eq(%_rootLevelTypeSeparation%,1),$upper(%_extension%),)
Result: /Music/B/Beatles, The/Album/
9.4 Adjusting Filename Format
Example 1: Remove Audio Quality from Filename
Find (Section 12):
$if($eq(%_quickNoNameFormat%,0),$if($eq(%_showBandwidth%,1),[%_fileCBRRate%%_fileVBRRate% %_bitRateSpeed% %_bitRateType% %_audioChannels%]))
Change to:
$noop( Audio quality display disabled )
Or simply set:
_showBandwidth = 0
Example 2: Change Track Number Format
Current: 01. Track
Want: 01 - Track
Find (Section 12):
$if(%tracknumber%,...$num(%tracknumber%,2). ))
Change to:
$if(%tracknumber%,...$num(%tracknumber%,2) - ))
Result: 01 - Come Together [4m20s].mp3
Example 3: Add File Size to Filename
Want: Show file size in MB
Add before filename (Section 12):
[$div(%_filesize%,1048576)MB]
Result: 01. Track [23MB] [320 44100KHz CBR 2ch].mp3
9.5 Adding New Metadata to Filenames
Example: Add Composer to Classical Music
Step 1: Check if tag exists
Picard provides %composer% tag.
Step 2: Add to filename (Section 12)
$noop( Track Title )
$if(%composer%,%composer% - )%_titleForFilename%
Result: 01. Bach - Brandenburg Concerto No. 1.flac
Example: Add BPM to Filename
Step 1: Picard provides %bpm% tag
Step 2: Add to filename
$if(%bpm%, [%bpm%BPM])
Result: 01. Track [120BPM] [320 44100KHz CBR 2ch].mp3
Appendix: Quick Reference
Common Picard Functions
| Function | Description | Example |
|---|---|---|
$set(var,value) |
Set variable | $set(_x,hello) |
$if(cond,then,else) |
Conditional | $if(%artist%,yes,no) |
$if2(a,b,c) |
First non-empty | $if2(%artist%,Unknown) |
$noop(...) |
No operation (comment) | $noop( Comment ) |
$upper(text) |
Uppercase | $upper(hello) -> HELLO |
$lower(text) |
Lowercase | $lower(HELLO) -> hello |
$left(text,n) |
First n chars | $left(Beatles,4) -> Beat |
$right(text,n) |
Last n chars | $right(Beatles,4) -> tles |
$len(text) |
Length | $len(Hello) -> 5 |
$replace(text,old,new) |
Replace string | $replace(A:B,:,_) -> A_B |
$rreplace(text,regex,new) |
Replace regex | $rreplace(A123B,\\d+,X) -> AXB |
$num(n,len) |
Pad number | $num(5,3) -> 005 |
$gt(a,b) |
Greater than | $gt(10,5) -> 1 (true) |
$lt(a,b) |
Less than | $lt(5,10) -> 1 (true) |
$eq(a,b) |
Equals | $eq(hello,hello) -> 1 |
$ne(a,b) |
Not equals | $ne(a,b) -> 1 (true) |
$in(text,search) |
Contains | $in(hello,ll) -> 1 |
$trim(text) |
Remove whitespace | $trim( hi ) -> hi |
$firstalphachar(text,def) |
First letter | $firstalphachar(Beatles,#) -> B |
Configuration Quick Settings
Basic Setup:
_orderTypeForRoot = 2
_orderTypeForArtist = 1
_separateByTypeInArtistDirectory = 1
_showDate = 1
Minimal Filename:
_showTime = 0
_showBandwidth = 0
_showIDNum = 0
Multi-Disc (Merged):
_useSubDiscDirectory = 0
_mergeDiscWhenNotUsingSubDirectory = 1
No Type Separation:
_separateByTypeInArtistDirectory = 0