MusicBrainz Picard/Documentation/Scripting: Difference between revisions

From MusicBrainz Wiki
Jump to navigationJump to search
(from looking at the source code, this seems to be how the function works (Imported from MoinMoin))
(manually redirecting anyone naughtily linking to the wiki instead of /doc/)
 
(42 intermediate revisions by 20 users not shown)
Line 1: Line 1:
=Scripting in Picard=
#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%===

<ul><li style="list-style-type:none">Extension of the file name. For example ''mp3'' for file ''01 Track.mp3''.
</ul>

==Functions==

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

<ul><li style="list-style-type:none">If <code><nowiki>if</nowiki></code> is not empty, it returns <code><nowiki>then</nowiki></code>, otherwise it returns <code><nowiki>else</nowiki></code>.
</ul>

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

<ul><li style="list-style-type:none">Returns first non empty argument.
</ul>

===$lower(text)===

<ul><li style="list-style-type:none">Returns <code><nowiki>text</nowiki></code> in lower case.
</ul>

===$upper(text)===

<ul><li style="list-style-type:none">Returns <code><nowiki>text</nowiki></code> in upper case.
</ul>

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

<ul><li style="list-style-type:none">Returns first <code><nowiki>num</nowiki></code> characters from <code><nowiki>text</nowiki></code>.
</ul>

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

<ul><li style="list-style-type:none">Returns last <code><nowiki>num</nowiki></code> characters from <code><nowiki>text</nowiki></code>.
</ul>

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

<ul><li style="list-style-type:none">Returns <code><nowiki>num</nowiki></code> formatted to <code><nowiki>len</nowiki></code> digits.
</ul>

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

<ul><li style="list-style-type:none">Returns <code><nowiki>replace</nowiki></code> in place of <code><nowiki>text</nowiki></code>, if <code><nowiki>search</nowiki></code> was found in <code><nowiki>text</nowiki></code>.
</ul>

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

<ul><li style="list-style-type:none">[http://docs.python.org/lib/re-syntax.html Regular expression] search. This function will return the first matching group.
</ul>

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

<ul><li style="list-style-type:none">[http://docs.python.org/lib/re-syntax.html Regular expression] replace.
</ul>

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

<ul><li style="list-style-type:none">Returns true, if <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code> contains <code><nowiki></nowiki></code>y<code><nowiki></nowiki></code>.
</ul>

===$unset(name)===

<ul><li style="list-style-type:none">Unsets the variable <code><nowiki></nowiki></code>name<code><nowiki></nowiki></code>.
</ul>

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

<ul><li style="list-style-type:none">Sets the variable <code><nowiki></nowiki></code>name<code><nowiki></nowiki></code> to <code><nowiki></nowiki></code>value<code><nowiki></nowiki></code>.
</ul>

===$get(name)===

<ul><li style="list-style-type:none">Returns the variable <code><nowiki></nowiki></code>name<code><nowiki></nowiki></code> (equivalent to <code><nowiki></nowiki></code>%name%<code><nowiki></nowiki></code>).
</ul>

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

<ul><li style="list-style-type:none">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.
</ul>

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

<ul><li style="list-style-type:none">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.
</ul>

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

<ul><li style="list-style-type:none">Add <code><nowiki></nowiki></code>y<code><nowiki></nowiki></code> to <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code>.
</ul>

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

<ul><li style="list-style-type:none">Substracts <code><nowiki></nowiki></code>y<code><nowiki></nowiki></code> from <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code>.
</ul>

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

<ul><li style="list-style-type:none">Divides <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code> by <code><nowiki></nowiki></code>y<code><nowiki></nowiki></code>.
</ul>

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

<ul><li style="list-style-type:none">Returns the remainder of <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code> divided by <code><nowiki></nowiki></code>y<code><nowiki></nowiki></code>.
</ul>

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

<ul><li style="list-style-type:none">Multiplies <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code> by <code><nowiki></nowiki></code>y<code><nowiki></nowiki></code>.
</ul>

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

<ul><li style="list-style-type:none">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.
</ul>

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

<ul><li style="list-style-type:none">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.
</ul>

===$not(x)===

<ul><li style="list-style-type:none">Returns true, if <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code> is empty.
</ul>

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

<ul><li style="list-style-type:none">Returns true, if <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code> equals <code><nowiki></nowiki></code>y<code><nowiki></nowiki></code>.
</ul>

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

<ul><li style="list-style-type:none">Returns true, if <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code> not equals <code><nowiki></nowiki></code>y<code><nowiki></nowiki></code>.
</ul>

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

<ul><li style="list-style-type:none">Returns true, if <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code> is lower than <code><nowiki></nowiki></code>y<code><nowiki></nowiki></code>.
</ul>

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

<ul><li style="list-style-type:none">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>.
</ul>

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

<ul><li style="list-style-type:none">Returns true, if <code><nowiki></nowiki></code>x<code><nowiki></nowiki></code> is greater than <code><nowiki></nowiki></code>y<code><nowiki></nowiki></code>.
</ul>

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

<ul><li style="list-style-type:none">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>.
</ul>

===$noop(...)===

<ul><li style="list-style-type:none">Does nothing (useful for comments or disabling a block of code).
</ul>

===$len(text)===

<ul><li style="list-style-type:none">Returns the number of characters in text.
</ul>

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

<ul><li style="list-style-type:none">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>.
</ul>

==Examples==

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

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

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

<pre>$if($search(%album%,(feat. conductor)),
$set(artist,%orchestra%))
</pre>
<ul><li style="list-style-type:none">''Stupid assumption that all classical albums have "feat. conductor" in the title, but it shows the idea. :)''
</ul>

===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:To Be Reviewed]] [[Category:Picard]] [[Category:Development]]

Latest revision as of 21:16, 25 November 2014

Redirect to: