mirror of
https://gitea.baerentsen.space/FrederikBaerentsen/PicardScripts.git
synced 2026-03-31 15:07:49 +01:00
2407 lines
72 KiB
Markdown
2407 lines
72 KiB
Markdown
# 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
|
|
|
|
1. [How Picard Scripting Works](#1-how-picard-scripting-works)
|
|
2. [Script Execution Flow](#2-script-execution-flow)
|
|
3. [Complete Configuration Options](#3-complete-configuration-options)
|
|
4. [Character Replacement](#4-character-replacement)
|
|
5. [VBR Bitrate Mapping](#5-vbr-bitrate-mapping)
|
|
6. [Path Generation Examples](#6-path-generation-examples)
|
|
7. [Advanced Features](#7-advanced-features)
|
|
8. [Variables Reference](#8-variables-reference)
|
|
9. [Customization Guide](#9-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 `_showTime` and `_showBandwidth` automatically
|
|
- 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 only
|
|
- `1` - 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 `label` tag 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 show
|
|
- `1` - 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 duration
|
|
- `1` - 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 metrics
|
|
- `1` - 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 `albumgrouping` tag (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 `albumartistsort` and `artistsort` tags
|
|
- "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 folder
|
|
- `1` - 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 number
|
|
- `1` - 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 number
|
|
- `1` - 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:**
|
|
1. Set custom `genresort` tag on files (not from MusicBrainz)
|
|
2. Script detects keyword in `genresort` value
|
|
3. 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
|
|
|
|
1. **Define folder name:**
|
|
```
|
|
$set(_subSortMyGenre,MyGenre/)
|
|
```
|
|
|
|
2. **Add detection logic in Section 11:**
|
|
```
|
|
$if($in(%genresort%,MyKeyword),$set(_subSortDirectory,%_subSortMyGenre%))
|
|
```
|
|
|
|
3. **Tag your files:**
|
|
```
|
|
genresort = MyKeyword
|
|
```
|
|
|
|
4. **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):**
|
|
- `album`
|
|
- `title`
|
|
- `discsubtitle`
|
|
- `media`
|
|
- `albumartist`
|
|
- `artist`
|
|
- `albumartistsort`
|
|
- `artistsort`
|
|
|
|
**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)`
|
|
|
|
1. **For tags (Section 9, tag-level):**
|
|
```
|
|
$set(title,$replace(%title%,@,(at)))
|
|
$set(album,$replace(%album%,@,(at)))
|
|
```
|
|
|
|
2. **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**:
|
|
|
|
1. **`coverTributeSort`** - Set to "Tribute" or "Cover"
|
|
2. **`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
|
|
|
|
1. Select the album in Picard
|
|
2. Right-click -> **Tags from file names** or **Edit Tags**
|
|
3. Add a new tag:
|
|
- Tag name: `coverTributeSort`
|
|
- Value: `Tribute` (or `Cover`)
|
|
4. Add another tag:
|
|
- Tag name: `albumartistsort`
|
|
- Value: Original artist name (e.g., "Queen")
|
|
5. 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
|
|
|
|
1. **Bitrate Detection:**
|
|
```
|
|
$if($eq(%_devMode%,1),
|
|
$set(_biitrate,71.426), # Use test bitrate
|
|
$set(_intBitRate,$rreplace(%_bitrate%,\\.\\d*\$,)) # Use real bitrate
|
|
)
|
|
```
|
|
|
|
2. **Audio Metrics:**
|
|
```
|
|
$if($eq(%_devMode%,1),
|
|
$set(_bitRateSpeed,%_saample_rate%KHz), # Test sample rate
|
|
$set(_bitRateSpeed,%_sample_rate%KHz) # Real sample rate
|
|
)
|
|
```
|
|
|
|
3. **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
|
|
|
|
1. Set `_devMode = 1` in configuration
|
|
2. Copy script to Picard
|
|
3. Tag any file
|
|
4. Check filename - should show test values
|
|
5. **IMPORTANT:** Set `_devMode = 0` before 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:**
|
|
1. Right-click file -> Edit Tags
|
|
2. Add tag: `SavePerfectAnyway = yes`
|
|
3. 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
|
|
``` |