MusicBrainz Picard/Documentation/Scripting: Difference between revisions

From MusicBrainz Wiki
Jump to navigationJump to search
(replace very basic script with more advanced one)
(Make function list comprehensive)
Line 42: Line 42:
''Added in version 0.12''
''Added in version 0.12''


* Returns the number of matched tracks within a release.
* Returns the number of matched tracks within a release. (Since Picard 0.12)


===$right(text,num)===
===$right(text,num)===
Line 69: Line 69:


===$inmulti(x,y)===
===$inmulti(x,y)===
''Added in version 1.0''


* Returns true, if multi-value variable <code><nowiki>x</nowiki></code> contains <code><nowiki>y</nowiki></code>.
* Returns true, if multi-value variable <code><nowiki>x</nowiki></code> contains <code><nowiki>y</nowiki></code>. (Since Picard 1.0)


===$unset(name)===
===$unset(name)===
Line 84: Line 83:


===$setmulti(name, value, separator="; ")===
===$setmulti(name, value, separator="; ")===
''Added in version 1.0''


* Sets the variable <code><nowiki>name</nowiki></code> to <code><nowiki>value</nowiki></code>, using the separator (or "; " if not passed) to coerce the value back into a proper multi-valued tag. This can be used to operate on multi-valued tags as a string, and then set them back as proper multi-valued tags, e.g
* Sets the variable <code><nowiki>name</nowiki></code> to <code><nowiki>value</nowiki></code>, using the separator (or "; " if not passed) to coerce the value back into a proper multi-valued tag. This can be used to operate on multi-valued tags as a string, and then set them back as proper multi-valued tags, e.g
<pre>$setmulti(genre,$lower(%genre%))</pre>
<pre>$setmulti(genre,$lower(%genre%))</pre>. (Since Picard 1.0)


===$get(name)===
===$get(name)===
Line 95: Line 93:
===$copy(new,old)===
===$copy(new,old)===


* Copies metadata from variable <code><nowiki>old</nowiki></code> to <code><nowiki>new</nowiki></code>. The difference between <code><nowiki>$set(new,%old%)</nowiki></code> is that <code><nowiki>$copy(new,old)</nowiki></code> copies multi-value variables without flattening them.
* Copies metadata from variable <code><nowiki>old</nowiki></code> to <code><nowiki>new</nowiki></code>. The difference between <code><nowiki>$set(new,%old%)</nowiki></code> is that <code><nowiki>$copy(new,old)</nowiki></code> copies multi-value variables without flattening them. (Since Picard 0.9.)


===$copymerge(new,old)===
===$copymerge(new,old)===
''Added in version 1.0''


* Merges metadata from variable <code><nowiki>old</nowiki></code> into <code><nowiki>new</nowiki></code>, removing duplicates and appending to the end, so retaining the original ordering. Like <code><nowiki>$copy</nowiki></code>, this will also copy multi-valued variables without flattening them.
* Merges metadata from variable <code><nowiki>old</nowiki></code> into <code><nowiki>new</nowiki></code>, removing duplicates and appending to the end, so retaining the original ordering. Like <code><nowiki>$copy</nowiki></code>, this will also copy multi-valued variables without flattening them. (Since Picard 1.0)


===$trim(text[,char])===
===$trim(text[,char])===
Line 172: Line 169:
===$performer(pattern="",join=", ")===
===$performer(pattern="",join=", ")===


* Returns the performers where the performance type (e.g. "vocal") matches <code>pattern</code>, joined by <code>join</code>.
* Returns the performers where the performance type (e.g. "vocal") matches <code>pattern</code>, joined by <code>join</code>. (Since Picard 0.10)


===$firstalphachar(text,nonalpha="#")===
===$firstalphachar(text,nonalpha="#")===


* Returns the first character of <code>text</code>. If <code>text</code> is not an alphabetic character <code>nonalpha</code> is returned instead.
* Returns the first character of <code>text</code>. If <code>text</code> is not an alphabetic character <code>nonalpha</code> is returned instead. (Since Picard 0.12)


===$initials(text)===
===$initials(text)===


* Returns the first character of each word in <code>text</code>, if it is an alphabetic character.
* Returns the first character of each word in <code>text</code>, if it is an alphabetic character. (Since Picard 0.12)


===$truncate(text,length)===
===$truncate(text,length)===


* Truncate <code>text</code> to <code>length</code>.
* Truncate <code>text</code> to <code>length</code>. (Since Picard 0.12)

===$firstwords(text,length)===

* Like $truncate except that it will only return the complete words from <code>text</code> which fit within <code>length</code> characters. (Since Picard 0.12)

===$swapprefix(text,*prefixes="A","The")===

* Moves the specified prefixes from the beginning to the end of text. If no prefix is specified 'A' and 'The' are used by default. (Integrated since Picard 1.3, previously as a plugin since Picard 0.13)

===$delprefix(text,*prefixes="A","The")===

* Deletes the specified prefixes from the beginning of text. If no prefix is specified 'A' and 'The' are used by default. (Since Picard 1.3)


==Tagger Script Examples==
==Tagger Script Examples==

Revision as of 14:58, 6 March 2014

This page describes the simple scripting language implemented in MusicBrainz Picard.

Syntax

The syntax is derived from Foobar2000's titleformat. There are three base elements: text, variable and function. Variables consist of alpha-numeric characters enclosed in percent signs (e.g. %artist%). Functions start with a dollar sign and end with an argument list enclosed in parentheses (e.g. $lower(...)).

To use parenthesis or commas as-is inside a function call you must escape them with a backslash.

Metadata Variables

See Picard tags for list of usable variables.

Technical Variables

%_extension%

  • Extension of the file name. For example mp3 for file 01 Track.mp3.

Functions

$if(if,then,else)

  • If if is not empty, it returns then, otherwise it returns else.

$if2(a1,a2,a3,...)

  • Returns first non empty argument.

$lower(text)

  • Returns text in lower case.

$upper(text)

  • Returns text in upper case.

$left(text,num)

  • Returns first num characters from text.

$matchedtracks()

Added in version 0.12

  • Returns the number of matched tracks within a release. (Since Picard 0.12)

$right(text,num)

  • Returns last num characters from text.

$num(num,len)

  • Returns num formatted to len digits.

$replace(text,search,replace)

  • Replaces occurrences of search in text with value of replace and returns the resulting string.

$rsearch(text,pattern)

$rreplace(text,pattern,replace)

$in(x,y)

  • Returns true, if x contains y.

$inmulti(x,y)

  • Returns true, if multi-value variable x contains y. (Since Picard 1.0)

$unset(name)

  • Unsets the variable name.

$set(name, value)

  • Sets the variable name to value.

Note: To create a variable which can be used for the file naming string, but which will not be written as a tag in the file, prefix the variable name with an underscore. %something% will create a "something" tag; %_something% will not.

$setmulti(name, value, separator="; ")

  • Sets the variable name to value, using the separator (or "; " if not passed) to coerce the value back into a proper multi-valued tag. This can be used to operate on multi-valued tags as a string, and then set them back as proper multi-valued tags, e.g
$setmulti(genre,$lower(%genre%))

. (Since Picard 1.0)

$get(name)

  • Returns the variable name (equivalent to %name%).

$copy(new,old)

  • Copies metadata from variable old to new. The difference between $set(new,%old%) is that $copy(new,old) copies multi-value variables without flattening them. (Since Picard 0.9.)

$copymerge(new,old)

  • Merges metadata from variable old into new, removing duplicates and appending to the end, so retaining the original ordering. Like $copy, this will also copy multi-valued variables without flattening them. (Since Picard 1.0)

$trim(text[,char])

  • Trims all leading and trailing whitespaces from text. The optional second parameter specifies the character to trim.

$add(x,y)

  • Add y to x.

$sub(x,y)

  • Subtracts y from x.

$div(x,y)

  • Divides x by y.

$mod(x,y)

  • Returns the remainder of x divided by y.

$mul(x,y)

  • Multiplies x by y.

$or(x,y)

  • Returns true, if either x or y not empty.

$and(x,y)

  • Returns true, if both x and y are not empty.

$not(x)

  • Returns true, if x is empty.

$eq(x,y)

  • Returns true, if x equals y.

$ne(x,y)

  • Returns true, if x not equals y.

$lt(x,y)

  • Returns true, if x is lower than y.

$lte(x,y)

  • Returns true, if x is lower than or equals y.

$gt(x,y)

  • Returns true, if x is greater than y.

$gte(x,y)

  • Returns true, if x is greater than or equals y.

$noop(...)

  • Does nothing (useful for comments or disabling a block of code).

$len(text)

  • Returns the number of characters in text.

$performer(pattern="",join=", ")

  • Returns the performers where the performance type (e.g. "vocal") matches pattern, joined by join. (Since Picard 0.10)

$firstalphachar(text,nonalpha="#")

  • Returns the first character of text. If text is not an alphabetic character nonalpha is returned instead. (Since Picard 0.12)

$initials(text)

  • Returns the first character of each word in text, if it is an alphabetic character. (Since Picard 0.12)

$truncate(text,length)

  • Truncate text to length. (Since Picard 0.12)

$firstwords(text,length)

  • Like $truncate except that it will only return the complete words from text which fit within length characters. (Since Picard 0.12)

$swapprefix(text,*prefixes="A","The")

  • Moves the specified prefixes from the beginning to the end of text. If no prefix is specified 'A' and 'The' are used by default. (Integrated since Picard 1.3, previously as a plugin since Picard 0.13)

$delprefix(text,*prefixes="A","The")

  • Deletes the specified prefixes from the beginning of text. If no prefix is specified 'A' and 'The' are used by default. (Since Picard 1.3)

Tagger Script Examples

OptionsOptions...AdvancedScripting

Tagger Script usually creates, modifies or deletes metadata variables.

Artist names

$if($search(%album%,(feat. conductor)),
  $set(artist,%orchestra%))
  • Stupid assumption that all classical albums have "feat. conductor" in the title, but it shows the idea. :)

Live tracks on live albums

$if($and($eq(%releasetype%,live),$not($in(%title%,\(live\)))),$set(title,%title% \(live\)))

Remove "feat." from track titles

$set(title,$rreplace(%title%,\\s\\\(feat. [^\)]+\\\),))

Convert triple-dot to ellipsis

$set(title,$replace(%title%,...,…))
$set(album,$replace(%album%,...,…))

This one is useful for people concerned about correct typography and also fixes one problem on Linux: if an album (assuming it's also a directory) is called something like "...for you!", it is considered hidden and therefore might be not accessible from some applications.

Remove "Various Artists" on compilations

By default, Picard marks various-artist compilations with an album artist called "Various Artists". Even if you don't have anything by Torsten Pröfrock, it still means that you player will sort your comps between Vangelis and VCR instead of down at the end, which you may not want.

This is easy to fix:

$if($and($eq(%compilation%,1), $eq(%albumartist%,Various Artists)), $unset(albumartist) $unset(albumartistsort))

Merge writers into both composer and lyricist tags

Supported from version 1.0

Suppose you want to add anyone involved in writing to both the composer and lyricist tags.

$copymerge(composer,writer)
$copymerge(lyricist,writer)
$unset(writer)


File Naming Examples

OptionsOptions...File naming

Lower case filenames with underscores

$lower($replace(%albumartist%/%album%/$num(%tracknumber%,2) %title%, ,_))

(Year) only if available

$if(%date%,\($left(%date%,4)\))

Use a different naming pattern for NATs

$if($eq([non-album tracks],%album%),[non-album tracks]/%tracknumber%. %artist% - ,%artist% - $if(%date%, $left(%date%,4) )- %album%/%tracknumber%.)%title%

Result:

  • Non-Album Tracks: [non-album tracks]/Band Name - Track Name.ext
  • Tracks in releases: Band Name - year - Release Name/##. Track Name.ext

Organize by alphabetical folders excluding leading The

To keep music organized by initial letter of artist's name you must first set the directory where saved files are to be stored in Options --> Moving Files. Then under Options --> File Naming check Rename files when saving. This script will then move saved files to your Moving Files location using the following hierarchy:
Result:

  • A/Artist Name, The/Year - Album Name (type-status)/Album (type-status)-disc#-Track-Song Title

for Various Artists-Albums

  • Various Artist/Year - Album Name (type-status)/Album (type-status)-disc#-Track-Song Title
$if($eq(%musicbrainz_albumartistid%,89ad4ac3-39f7-470e-963a-56509c546377),

$left($if2(%albumartistsort%, %artistsort%),30)/
$if(%date%,$left(%date%,4)) - $left(%album%,40) \(%releasestatus%-%releasetype%\)/
$left(%album%,30) \(%releasestatus%-%releasetype%\)-$if($gt(%totaldiscs%,1),$if2(%media%,CD)%discnumber%-,)$num(%tracknumber%,2)-$left(%title%,30)

,
$upper($firstalphachar($if2(%albumartistsort%, %artistsort%),#))
/$left($if2(%albumartistsort%, %artistsort%),18)/
$if(%date%,$left(%date%,4)) - $left(%album%,40) \(%releasestatus%-%releasetype%\)/
$left(%album%,30) \(%releasestatus%-%releasetype%\)-$if($gt(%totaldiscs%,1),$if2(%media%,CD)%discnumber%-,)$num(%tracknumber%,2)-$left(%title%,30)

)