Music tagging process
Beets
Install
Current Debian versions tend to be old.
python3.7 -m venv venv37
source venv37/bin/activate
pip install -U beets
Import
- Check the config for albumartist vs album
-
beet import /path/to/downloaded/album
Move
- Tweak settings in
~/.config/beets/config.yaml
- beet move -a [-p] album-name
MusicBrainz
- picard
- Import
- Collect
- Scan
- easytag
- write playlists
- check CRLF (should have DOS line-endings)
Picard Settings
Metadata
Translate artist names to locale
: ON, English
(fixes Kitaro)
Use standardised artist names : ON
Convert Unicode punctuation characters to ASCII : ON
Use release relationships : ON
Use track relationships : ON
Use folksonomy tags as genre : ON
Preferred Release Countries : UK, US, ZA
Preferred Release Formats : CD
Before Tagging : clear existing, remove ID3 from FLAC, remove APE from MP3
Tag Compatibility : ID3v2.4, UTF-8
Albums
Cover Art
: Save cover images as separate files, folder
Collections
Cover Art : Embed cover images into tags, Embed only front images
File naming
Replace non-ASCII characters : OFF
Replace Windows-incompatible characters : OFF
Delete empty directories : ON
Move additional files
: *.jpg *.png
Picard Genres
Plugins : Last.fm.Plus
General Options / Join Tags With : blank
Forces multiple genres into separate tags.
Picard Rename
Default
$if2(%albumartist%,%artist%)/%album%/%artist% - %title%
With Custom Replacements
- Also replace ' / ' (which is forced to '_' by picard) to '; '
- Album: drop everything from the second ':' onwards
-
DiscSubtitle: add to the path if it exists
$replace($noop(?) $replace($noop(:) $replace($noop(") $replace($noop(|) $replace($noop(<) $replace($noop(>) $rreplace(
$if2(%albumartist%,%artist%)/$if2($rsearch(%album%,(.:.):),%album%)/%discsubtitle%/%artist% - %title%
,\s_\b,;) ,>,)) ,<,() ,|,) ,",') ,:, -) ,?,)
Classical
Trying for something like composer/work/performance/(01x01 - )composer - title
.
- If albumartist has ';' use just the first part (the composer)
- In album
- If < 30 chars, use it, otherwise
- Drop anything from the second ':', or
- Drop anything from a '(' onwards
- Extract performers from the second part of albumartist
- Extract "orchestra, conductor" as best we can
- Use discsubtitle (large collections) else:
- performer part of the albumartist if it's shorter than 60 chars, else
- "orchestra - conductor"
-
01x01 if total discs is large (>2)
$set(_maincomposer,$if2($rsearch(%albumartist%,(.); ),%albumartist%,%artist%)) $set(_work,$if2($if($lt($len(%album%),30),%album%),$rsearch(%album%,(.:.):),$rsearch(%album%,(.)[(]),%album%)) $set(_performers,$rsearch(%albumartist%,; (.))) $set(_conductor,$if2($rsearch(%conductor%,(.);),%conductor%,$rsearch($performer(conductor),(.*);),$performer(conductor))) $set(_orchestra_conductor,$if(%_conductor%,$performer(orchestra)\, %_conductor%,$performer(orchestra))) $set(_performance,$if2(%discsubtitle%,$if($lt($len(%_performers%),60),%_performers%),%_orchestra_conductor%)) $set(_tracknums,$if($gt(%totaldiscs%,2),$num(%discnumber%,2)x$num(%tracknumber%,2) - ))
%_maincomposer%/%_work%/%_performance%/%_tracknums%%artist% - %title%
Produces:
-
Wolfgang Amadeus Mozart/Don Giovanni/Freiburger Barockorchester, René Jacobs/01x01 - Wolfgang Amadeus Mozart - Il dissoluto punito, ossia il Don Giovanni, K. 527 - Ouverture. Andante - allegro molto.mp3
- @@Wolfgang Amadeus Mozart/Requiem/Berliner Philharmoniker/Wolfgang Amadeus Mozart - Requiem in D minor, K. 626 (Süßmayr completion) - IIIa. Sequenz - 'Dies irae'.mp3
@@
-
John Rutter/Requiem and other Sacred Music/Choir of Clare College, Cambridge, Timothy Brown/John Rutter - Requiem - I. Requiem Aeternam.ogg
Large Collections
Add 01x01
only if totaldiscs > 1
.
album-artist/album/01x01 - artist - title
:
$if2(%albumartist%,%artist%)/%album%/$if($gt(%totaldiscs%,1),$num(%discnumber%,2)x$num(%tracknumber%,2) - )%artist% - %title%
Putting it all Together
$set(_maincomposer,$if2($rsearch(%albumartist%,\(.*\); ),%albumartist%,%artist%))
$set(_work,$if2($if($lt($len(%album%),30),%album%),$rsearch(%album%,\(.*:.*\):),$rsearch(%album%,\(.*\)[\(]),%album%))
$set(_performers,$rsearch(%albumartist%,; \(.*\)))
$set(_conductor,$if2($rsearch(%conductor%,\(.*\);),%conductor%,$rsearch($performer(conductor),\(.*\);),$performer(conductor)))
$set(_orchestra_conductor,$if(%_conductor%,$performer(orchestra)\, %_conductor%,$performer(orchestra)))
$set(_performance,$if2(%discsubtitle%,$if($lt($len(%_performers%),60),%_performers%),%_orchestra_conductor%))
$set(_tracknums,$if($gt(%totaldiscs%,2),$num(%discnumber%,2)x$num(%tracknumber%,2) - ))
$replace($noop(.)
$replace($noop(?)
$replace($noop(:)
$replace($noop(")
$replace($noop(|)
$replace($noop(<)
$replace($noop(>)
$rreplace(
$rreplace(
%_maincomposer%/%_work%/%_performance%/%_tracknums%%artist% - %title%
,\\s_\\b,;)
,_, )
,>,\))
,<,\()
,|,)
,",')
,:, -)
,?,)
,...,)