MusicBrainz Picard/Documentation/Scripting: Difference between revisions

From MusicBrainz Wiki
Jump to navigationJump to search
mNo edit summary
(manually redirecting anyone naughtily linking to the wiki instead of /doc/)
 
(38 intermediate revisions by 19 users not shown)
Line 1: Line 1:
#REDIRECT [[MusicBrainz Picard]]
This page describes a simple scripting language implemented in [[Picard Qt|PicardQt]].

==Syntax==

The syntax is derived from [http://wiki.hydrogenaudio.org/index.php?title=Foobar2000:Titleformat_Reference Foobar2000's titleformat]. There are three base elements: '''text''', '''variable''' and '''function'''. Variables consist of alpha-numeric characters enclosed in percent signs (e.g. <code><nowiki>%artist%</nowiki></code>). Functions start with a dollar sign and end with an argument list enclosed in parentheses (e.g. <code><nowiki>$lower(...)</nowiki></code>).

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

==Metadata Variables==

See [[Picard Tags|PicardTags]] for list of variables available in [[Tagger Script|TaggerScript]].

==Technical Variables==

===%_extension%===

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

==Functions==

===$if(if,then,else)===

* If <code><nowiki>if</nowiki></code> is not empty, it returns <code><nowiki>then</nowiki></code>, otherwise it returns <code><nowiki>else</nowiki></code>.

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

* Returns first non empty argument.

===$lower(text)===

* Returns <code><nowiki>text</nowiki></code> in lower case.

===$upper(text)===

* Returns <code><nowiki>text</nowiki></code> in upper case.

===$left(text,num)===

* Returns first <code><nowiki>num</nowiki></code> characters from <code><nowiki>text</nowiki></code>.

===$right(text,num)===

* Returns last <code><nowiki>num</nowiki></code> characters from <code><nowiki>text</nowiki></code>.

===$num(num,len)===

* Returns <code><nowiki>num</nowiki></code> formatted to <code><nowiki>len</nowiki></code> digits.

===$replace(text,search,replace)===

* Replaces occurrences of <code><nowiki>search</nowiki></code> in <code><nowiki>text</nowiki></code> with value of <code><nowiki>replace</nowiki></code> and returns the resulting string.

===$rsearch(text,pattern)===

* [http://docs.python.org/lib/re-syntax.html Regular expression] search. This function will return the first matching group.

===$rreplace(text,pattern,replace)===

* [http://docs.python.org/lib/re-syntax.html Regular expression] replace.

===$in(x,y)===

* Returns true, if <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code> contains <code><nowiki></nowiki></code>y<code><nowiki></nowiki></code>.

===$unset(name)===

* Unsets the variable <code><nowiki></nowiki></code>name<code><nowiki></nowiki></code>.

===$set(name, value)===

* Sets the variable <code><nowiki></nowiki></code>name<code><nowiki></nowiki></code> to <code><nowiki></nowiki></code>value<code><nowiki></nowiki></code>.

===$get(name)===

* Returns the variable <code><nowiki></nowiki></code>name<code><nowiki></nowiki></code> (equivalent to <code><nowiki></nowiki></code>%name%<code><nowiki></nowiki></code>).

===$copy(new,old)===

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

===$trim(text[,char])===

* Trims all leading and trailing whitespaces from <code><nowiki></nowiki></code>text<code><nowiki></nowiki></code>. The optional second parameter specifies the character to trim.

===$add(x,y)===

* Add <code><nowiki></nowiki></code>y<code><nowiki></nowiki></code> to <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code>.

===$sub(x,y)===

* Substracts <code><nowiki></nowiki></code>y<code><nowiki></nowiki></code> from <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code>.

===$div(x,y)===

* Divides <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code> by <code><nowiki></nowiki></code>y<code><nowiki></nowiki></code>.

===$mod(x,y)===

* Returns the remainder of <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code> divided by <code><nowiki></nowiki></code>y<code><nowiki></nowiki></code>.

===$mul(x,y)===

* Multiplies <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code> by <code><nowiki></nowiki></code>y<code><nowiki></nowiki></code>.

===$or(x,y)===

* Returns true, if either <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code> or <code><nowiki></nowiki></code>y<code><nowiki></nowiki></code> not empty.

===$and(x,y)===

* Returns true, if both <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code> and <code><nowiki></nowiki></code>y<code><nowiki></nowiki></code> are not empty.

===$not(x)===

* Returns true, if <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code> is empty.

===$eq(x,y)===

* Returns true, if <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code> equals <code><nowiki></nowiki></code>y<code><nowiki></nowiki></code>.

===$ne(x,y)===

* Returns true, if <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code> not equals <code><nowiki></nowiki></code>y<code><nowiki></nowiki></code>.

===$lt(x,y)===

* Returns true, if <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code> is lower than <code><nowiki></nowiki></code>y<code><nowiki></nowiki></code>.

===$lte(x,y)===

* Returns true, if <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code> is lower than or equals <code><nowiki></nowiki></code>y<code><nowiki></nowiki></code>.

===$gt(x,y)===

* Returns true, if <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code> is greater than <code><nowiki></nowiki></code>y<code><nowiki></nowiki></code>.

===$gte(x,y)===

* Returns true, if <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code> is greater than or equals <code><nowiki></nowiki></code>y<code><nowiki></nowiki></code>.

===$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 <code><nowiki></nowiki></code>pattern<code><nowiki></nowiki></code>, joined by <code><nowiki></nowiki></code>join<code><nowiki></nowiki></code>.

==Examples==

===Use case 1: Disc numbers===

<pre>$set(discnumber,$rsearch(%album%,\\\(disc \(\\d+\)\\\)))
$set(album,$rreplace(%album%,\\s\\\(disc \\d+\\\),))
</pre>
* Would it be possible to trim all of ''(disc 1: Subtitle Here)'' and also set the disc number? --[[User:AaronCooper|AaronCooper]] (2007-03-07)
** You can use the plugin from [[Picard Qt/Plugins|PicardQt/Plugins]]. --[[User:LukasLalinsky|LukasLalinsky]]
*** %totaldiscs% Doesn't really work, is there some way to fix that? --Madness

===Use case 2: Artist names===

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

===Use case 3: Live tracks on live albums===

<pre>$if($and($eq(%releasetype%,live),$not($in(%title%,\(live\)))),$set(title,%title% \(live\)))
</pre>

===Lower case filenames with underscores===

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

===(Year) only if available===

<pre>$if(%date%,\($left(%date%,4)\))
</pre>

===Remove "feat." from track titles===

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

===Convert triple-dot to ellipsis===

<pre>$set(title,$replace(%title%,...,…))
$set(album,$replace(%album%,...,…))
</pre>

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.

===Use a different naming pattern for NATs===

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

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

[[Category:Picard]] [[Category:Development]]

Latest revision as of 21:16, 25 November 2014

Redirect to: