MrC-temp: Difference between revisions

From wiki.jriver.com
Jump to navigation Jump to search
(more test stuff)
(more live updates)
Line 9: Line 9:


Caution: Debris Ahead...
Caution: Debris Ahead...





Line 24: Line 25:
|- id="If" valign="top"
|- id="If" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | If()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | If()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>if(</b><i>test expression</i><b>, </b><i>true expression</i><b>, </b><i>false expression</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>if(</b><i>test expression</i><b>, </b><i>true expression</i><b>, </b><i>false expression</i><b>)</b></span>
The [[#If|If()]] function is used to evaluate a <i>test expression</i>, and will output the result of the <i>true expression</i> or <i>false expression</i>, depending upon the evaluation result. The <i>test expression</i> is expected to return a 0 (false value) or a non-zero (true value).
The [[#If|If()]] function is used to evaluate a <i>test expression</i>, and will output the result of the <i>true expression</i> or <i>false expression</i>, depending upon the evaluation result. The <i>test expression</i> is expected to return a 0 (false value) or a non-zero (true value).
Nesting is allowed.
Nesting is allowed.
Line 30: Line 31:
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>if(isequal([artist], bob dylan, 1), Genius, Mediocre)</nowiki></b></span>
;<span style="font-family: Consolas, monospace;">if(isequal([artist], bob dylan, 1), Genius, Mediocre)</span>
<div style="margin-left: 20pt;"><p>Outputs "Genius" when artist is Bob Dylan and "Mediocre" otherwise.</p></div>
<span style="font-family: Consolas, monospace;"><b><nowiki>if(isequal([artist], bob dylan, 1), Genius, if(isequal([album], Joshua Tree, 8), Great Album, Mediocre))</nowiki></b></span>
: Outputs "Genius" when artist is Bob Dylan and "Mediocre" otherwise.
<div style="margin-left: 20pt;"><p>This nested [[#If|If()]] expression expands on the previous example, by first evaluating if the artist is Bob Dylan, and outputs "Genius" if true.

;<span style="font-family: Consolas, monospace;">if(isequal([artist], bob dylan, 1), Genius, if(isequal([album], Joshua Tree, 8), Great Album, Mediocre))</span>
When the artist is not Bob Dylan, the album is then tested to see if it is "Joshua Tree", and if so outputs "Great Album", otherwise outputs "Mediocre".</p></div>
<span style="font-family: Consolas, monospace;"><b><nowiki>if(!isempty([comment]), regex([comment], /#^(\\S+\\s+\\S+\\s+\\S+)#/, 1), *No Comment)</nowiki></b></span>
: This nested [[#If|If()]] expression expands on the previous example, by first evaluating if the artist is Bob Dylan, and outputs "Genius" if true. When the artist is not Bob Dylan, the album is then tested to see if it is "Joshua Tree", and if so outputs "Great Album", otherwise outputs "Mediocre".
<div style="margin-left: 20pt;"><p>Output's the first three words of the comment field; otherwise, outputs *No Comment. By using the NOT operator, the sense of the conditional is inverted so that the more interesting case is moved ahead of the more mundane case.</p></div>

;<span style="font-family: Consolas, monospace;">if(!isempty([comment]), regex([comment], /#^(\\S+\\s+\\S+\\s+\\S+)#/, 1), *No Comment)</span>
: Output's the first three words of the comment field; otherwise, outputs *No Comment. By using the NOT operator, the sense of the conditional is inverted so that the more interesting case is moved ahead of the more mundane case.
|}
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>
<div style="text-align:right;">([[#top|Back to top)]]</div>
Line 47: Line 46:
|- id="IfElse" valign="top"
|- id="IfElse" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | IfElse()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | IfElse()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>ifelse(</b><i>test1</i><b>, </b><i>action1</i><b>, </b><i>test2</i><b>, </b><i>action2</i><b>, </b><i>test3</i><b>, </b><i>action3</i><b>, </b><i>&hellip;</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>ifelse(</b><i>test1</i><b>, </b><i>action1</i><b>, </b><i>test2</i><b>, </b><i>action2</i><b>, </b><i>test3</i><b>, </b><i>action3</i><b>, </b><i>&hellip;</i><b>)</b></span>
The [[#IfElse|IfElse()]] conditional provides a convenient mechanism for shortening and more clearly expressing nested conditionals into an alternating sequence of tests and actions.
The [[#IfElse|IfElse()]] conditional provides a convenient mechanism for shortening and more clearly expressing nested conditionals into an alternating sequence of tests and actions.
Any number of test/action pairs may be specified.
One or more test/action pairs may be specified.


For example, consider a nested sequence of [[#If|If()]] tests such as the following pseudo-code:
For example, consider a nested sequence of [[#If|If()]] tests such as the following pseudo-code:
<div style="font-family: Consolas, monospace;">

:: <span style="font-family: Consolas, monospace;">if (<i>test1</i>)
<div style="margin-left: 20pt">if (<i>test1</i>)</div>
::: <i>action1</i></span>
<div style="margin-left: 40pt"><i>action1</i></div>
:: <span style="font-family: Consolas, monospace;">else if (<i>test2</i>)
<div style="margin-left: 20pt">else if (<i>test2</i>)</div>
::: <i>action2</i></span>
<div style="margin-left: 40pt"><i>action2</i></div>
:: <span style="font-family: Consolas, monospace;">else if (<i>test3</i>)
<div style="margin-left: 20pt">else if (<i>test3</i>)</div>
::: <i>action3</i></span>
<div style="margin-left: 40pt"><i>action3</i></div>
</div>


The [[#IfElse|IfElse()]] statement may be used to more cleanly express the flow of expression by removing the superfluous internal [[#If|If()]] statements, converting the clumsy expression:
The [[#IfElse|IfElse()]] statement may be used to more cleanly express the flow of expression by removing the superfluous internal [[#If|If()]] statements, converting the clumsy expression:


:: <span style="font-family: Consolas, monospace;">if(<i>test1</i>, <i>action1</i>, if(<i>test2</i>, <i>action2</i>, if(<i>test3</i>, <i>action3</i>)))</span>
<div style="margin-left: 20pt"><span style="font-family: Consolas, monospace;">if(<i>test1</i>, <i>action1</i>, if(<i>test2</i>, <i>action2</i>, if(<i>test3</i>, <i>action3</i>)))</span></div>


into the more elegant:
into the more elegant:


:: <span style="font-family: Consolas, monospace;">ifelse(<i>test1</i>, <i>action1</i>, <i>test2</i>, <i>action2</i>, <i>test3</i>, <i>action3</i>)</span>
<div style="margin-left: 20pt"><span style="font-family: Consolas, monospace;">ifelse(<i>test1</i>, <i>action1</i>, <i>test2</i>, <i>action2</i>, <i>test3</i>, <i>action3</i>)</span></div>


If any of the test expressions <i>test1</i>, etc. are preceded by the NOT operator (!, an exclamation point), the sense of that test is inverted. Non-zero values are inverted to 0, and 0 is inverted to 1.
If any of the test expressions <i>test1</i>, etc. are preceded by the NOT operator (!, an exclamation point), the sense of that test is inverted. Non-zero values are inverted to 0, and 0 is inverted to 1.

Argument <i>test2</i> is optional.

Argument <i>action2</i> is optional.

Argument <i>test3</i> is optional.

Argument <i>action3</i> is optional.

|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>ifelse(isequal([media type], Audio), Le Tunes, isequal([media type], Video]), Flix)</nowiki></b></span>
;<span style="font-family: Consolas, monospace;">ifelse(isequal([media type], Audio), Le Tunes, isequal([media type], Video]), Flix)</span>
<div style="margin-left: 20pt;"><p>If media type is audio, outputs "Le Tunes", else if media type is video, outputs "Flix"</p></div>
<span style="font-family: Consolas, monospace;"><b><nowiki>ifelse(isequal([artist], Bob Dylan), Genius, isequal([album], Joshua Tree, 8), Great Album, 1, Mediocre)</nowiki></b></span>
: If media type is audio, outputs "Le Tunes", else if media type is video, outputs "Flix"
<div style="margin-left: 20pt;"><p>This example, implements the nested if statements from the If() section above, first testing if the artist is Bob Dylan, and if true, outputs "Genius", otherwise evaluates the second test to determine if the album is "Joshua Tree", and if true, outputs "Great Album", otherwise, performs a final test, in this case a degenerate test of 1 (and 1 is always true), thus outputting the value "Mediocre".</p></div>

;<span style="font-family: Consolas, monospace;">ifelse(isequal([artist], Bob Dylan), Genius, isequal([album], Joshua Tree, 8), Great Album, 1, Mediocre)</span>
: This example, implements the nested if statements from the If() section above, first testing if the artist is Bob Dylan, and if true, outputs "Genius", otherwise evaluates the second test to determine if the album is "Joshua Tree", and if true, outputs "Great Album", otherwise, performs a final test, in this case a degenerate test of 1 (and 1 is always true), thus outputting the value "Mediocre".
|}
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>
<div style="text-align:right;">([[#top|Back to top)]]</div>
Line 98: Line 87:
|- id="Compare" valign="top"
|- id="Compare" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | Compare()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | Compare()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>compare(</b><i>value1</i><b>, </b><i>operator</i><b>, </b><i>value2</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>compare(</b><i>value1</i><b>, </b><i>operator</i><b>, </b><i>value2</i><b>)</b></span>
The [[#Compare|Compare()]] function compares two numeric values <i>value1</i> and <i>value2</i> using any <i>operator</i> from the following list:
The [[#Compare|Compare()]] function compares two numeric values <i>value1</i> and <i>value2</i> using the specified <i>operator</i>.

Available <i>operator</i> values:


<div style="margin-left: 20pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<div style="margin-left: 20pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>=</b></span></td><td>Equivalence</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>=</b></td><td>Equivalence</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b><</b></span></td><td>Less than</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b><</b></td><td>Less than</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b><=</b></span></td><td>Less than or equal to</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b><=</b></td><td>Less than or equal to</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>></b></span></td><td>Greater than</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>></b></td><td>Greater than</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>>=</b></span></td><td>Greater than or equal to</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>>=</b></td><td>Greater than or equal to</td></tr>
</table></div>
</table></div>


Line 112: Line 103:
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>compare([bitrate], &lt;, 320)</nowiki></b></span>
;<span style="font-family: Consolas, monospace;">compare([bitrate], &lt;, 320)</span>
<div style="margin-left: 20pt;"><p>Returns 1 when the bitrate is less than 320 (Kbps), and 0 otherwise.</p></div>
<span style="font-family: Consolas, monospace;"><b><nowiki>if(compare(math(now() - [date modified, 0]), &gt;, 21), Expired, formatdate([date modified, 0], elapsed))</nowiki></b></span>
: Returns 1 when the bitrate is less than 320 (Kbps), and 0 otherwise.
<div style="margin-left: 20pt;"><p>Outputs the age of files under 21 days old, or 'Expired' for older files.</p></div>

;<span style="font-family: Consolas, monospace;">if(compare(math(now() - [date modified, 0]), &gt;, 21), Expired, formatdate([date modified, 0], elapsed))</span>
: Outputs the age of files under 21 days old, or 'Expired' for older files.
|}
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>
<div style="text-align:right;">([[#top|Back to top)]]</div>
Line 126: Line 115:
|- id="IsEqual" valign="top"
|- id="IsEqual" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | IsEqual()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | IsEqual()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>isequal(</b><i>value1</i><b>, </b><i>value2</i><b>, </b><i>mode</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>isequal(</b><i>value1</i><b>, </b><i>value2</i><b>, </b><i>mode</i><b>)</b></span>
The [[#IsEqual|IsEqual()]] function compares <i>value1</i> with <i>value2</i> using any <i>mode</i> from the list of modes below.
The [[#IsEqual|IsEqual()]] function compares <i>value1</i> with <i>value2</i> using any <i>mode</i> from the list of modes below.
Outputs 1 when the comparison succeeds according to the <i>mode</i>, and 0 otherwise.
Outputs 1 when the comparison succeeds according to the <i>mode</i>, and 0 otherwise.
Although the <i>mode</i> is specified as the last argument, the comparison should be mentally read as: <i>value1</i> <i>mode</i> <i>value2</i>.
Although the <i>mode</i> is specified as the last argument, the comparison should be mentally read as: <i>value1</i> <i>mode</i> <i>value2</i>.


Available Compare Modes:
Available <i>mode</i> values:


<div style="margin-left: 20pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<div style="margin-left: 20pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>0</b></span></td><td>Case-sensitive string compare for equality</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>0</b></td><td>Case-sensitive string compare for equality</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>1</b></span></td><td>Case-insensitive string compare for equality</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>1</b></td><td>Case-insensitive string compare for equality</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>2</b></span></td><td>Numeric compare for equality</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>2</b></td><td>Numeric compare for equality</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>3</b></span></td><td>Numeric less than</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>3</b></td><td>Numeric less than</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>4</b></span></td><td>Numeric less than or equal to</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>4</b></td><td>Numeric less than or equal to</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>5</b></span></td><td>Numeric greater than</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>5</b></td><td>Numeric greater than</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>6</b></span></td><td>Numeric greater than or equal to</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>6</b></td><td>Numeric greater than or equal to</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>7</b></span></td><td>Substring search (case sensitive)</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>7</b></td><td>Substring search (case sensitive)</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>8</b></span></td><td>Substring search (case insensitive)</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>8</b></td><td>Substring search (case insensitive)</td></tr>
</table></div>
</table></div>


Line 149: Line 138:
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>isequal([artist], [album], 1)</nowiki></b></span>
<div style="margin-left: 20pt;"><p>If the artist and album values are the same, the output will be 1, otherwise, the output will be 0.</p></div>
;<span style="font-family: Consolas, monospace;">isequal([artist], [album], 1)</span>
<span style="font-family: Consolas, monospace;"><b><nowiki>if(isequal([artist], [album], 1), Eponymous, [album])</nowiki></b></span>
: If the artist and album values are the same, the output will be 1, otherwise, the output will be 0.
<div style="margin-left: 20pt;"><p>The [[#If|If()]] function basis its decision on the outcome of [[#IsEqual|IsEqual()]], so if the artist and album values are the same, the output will be Eponymous, otherwise, the output will be the value of album.</p></div>

;<span style="font-family: Consolas, monospace;">if(isequal([artist], [album], 1), Eponymous, [album])</span>
<span style="font-family: Consolas, monospace;"><b><nowiki>if(isequal([artist], [album], 1), Eponymous/,, [album]/))</nowiki></b></span>
<div style="margin-left: 20pt;"><p>This example demonstrates the character 'escaping' mentioned in the overview earlier.
: The [[#If|If()]] function basis its decision on the outcome of [[#IsEqual|IsEqual()]], so if the artist and album values are the same, the output will be Eponymous, otherwise, the output will be the value of album.
Here, we want the output to be either "Eponymous," (note the inclusion of the comma) or the album value with a closing parenthesis.

In order to achieve this, the comma, and the closing parenthesis, are escaped using a forward-slash character.
;<span style="font-family: Consolas, monospace;">if(isequal([artist], [album], 1), Eponymous/,, [album]/))</span>
: This example demonstrates the character 'escaping' mentioned in the overview earlier. Here, we want the output to be either "Eponymous," (note the inclusion of the comma) or the album value with a closing parenthesis. In order to achieve this, the comma, and the closing parenthesis, are escaped using a forward-slash character. This informs the expression evaluator that these characters are not part of the expression syntax and are to be treated literally.
This informs the expression evaluator that these characters are not part of the expression syntax and are to be treated literally.</p></div>
<span style="font-family: Consolas, monospace;"><b><nowiki>if(isequal([filename (path)], classical, 8), Classical, Not Classical)</nowiki></b></span>

;<span style="font-family: Consolas, monospace;">if(isequal([filename (path)], classical, 8), Classical, Not Classical)</span>
<div style="margin-left: 20pt;"><p>Because compare <i>mode</i> 8 has been specified, if the word "classical" appears anywhere in the case-insensitive file path, the expression will return Classical, and if not it will return Not Classical.</p></div>
: Because compare <i>mode</i> 8 has been specified, if the word "classical" appears anywhere in the case-insensitive file path, the expression will return Classical, and if not it will return Not Classical.
|}
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>
<div style="text-align:right;">([[#top|Back to top)]]</div>
Line 169: Line 157:
|- id="IsEmpty" valign="top"
|- id="IsEmpty" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | IsEmpty()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | IsEmpty()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>isempty(</b><i>value</i><b>, </b><i>mode</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>isempty(</b><i>value</i><b>, </b><i>mode</i><b>)</b></span>
The [[#IsEmpty|IsEmpty()]] function tests the given <i>value</i> for emptiness. The <i>value</i> passed is typically an Media Center field, so that some action may be taken when the field is or is not empty.
The [[#IsEmpty|IsEmpty()]] function tests the given <i>value</i> for emptiness. The <i>value</i> passed is typically an Media Center field, so that some action may be taken when the field is or is not empty.
Returns 1 when the <i>value</i> is empty, otherwise 0.
Returns 1 when the <i>value</i> is empty, otherwise 0.


Select a <i>mode</i> from the following:
Available <i>mode</i> values:


<div style="margin-left: 20pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<div style="margin-left: 20pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>0</b></span></td><td>String test (field must be empty to get a positive result)</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>0</b></td><td>String test (field must be empty to get a positive result)</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>1</b></span></td><td>Numerical test (field must be empty, or contain 0 to get a positive result)</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>1</b></td><td>Numerical test (field must be empty, or contain 0 to get a positive result)</td></tr>
</table></div>
</table></div>


Line 189: Line 177:
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>isempty([comment], 0)</nowiki></b></span>
;<span style="font-family: Consolas, monospace;">isempty([comment], 0)</span>
<div style="margin-left: 20pt;"><p>If the comment field is empty, [[#IsEmpty|IsEmpty()]] returns 1, otherwise 0.</p></div>
<span style="font-family: Consolas, monospace;"><b><nowiki>isempty([track #], 1)</nowiki></b></span>
: If the comment field is empty, [[#IsEmpty|IsEmpty()]] returns 1, otherwise 0.
<div style="margin-left: 20pt;"><p>Performs a numerical test for data in the [track #] field. If the field is empty or 0, a 1 is returned, otherwise 0 is returned.</p></div>

;<span style="font-family: Consolas, monospace;">isempty([track #], 1)</span>
<span style="font-family: Consolas, monospace;"><b><nowiki>ifelse(!isempty([disc #]), [disc #])</nowiki></b></span>
<div style="margin-left: 20pt;"><p>Outputs the <i>value</i> of the disc # field when it is not empty.</p></div>
: Performs a numerical test for data in the [track #] field. If the field is empty or 0, a 1 is returned, otherwise 0 is returned.

;<span style="font-family: Consolas, monospace;">ifelse(!isempty([disc #]), [disc #])</span>
: Outputs the <i>value</i> of the disc # field when it is not empty.
|}
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>
<div style="text-align:right;">([[#top|Back to top)]]</div>
Line 206: Line 191:
|- id="IsRange" valign="top"
|- id="IsRange" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | IsRange()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | IsRange()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>isrange(</b><i>value</i><b>, </b><i>range</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>isrange(</b><i>value</i><b>, </b><i>range</i><b>)</b></span>
The [[#IsRange|IsRange()]] function tests if a <i>value</i> falls within a given <i>range</i> of values.
The [[#IsRange|IsRange()]] function tests if a <i>value</i> falls within a given <i>range</i> of values.
If the <i>value</i> falls within the given <i>range</i>, 1 is returned, otherwise 0 is returned.
If the <i>value</i> falls within the given <i>range</i>, 1 is returned, otherwise 0 is returned.
Line 216: Line 201:
Example Ranges:
Example Ranges:


<div style="font-family: Consolas, monospace;">
:: 1-100
<div style="margin-left: 20pt">1-100</div>
:: a-z
<div style="margin-left: 20pt">a-z</div>
:: c-d
<div style="margin-left: 20pt">c-d</div>
:: 23-7542
<div style="margin-left: 20pt">23-7542 </div>
</div>
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>isrange([artist], a-c)</nowiki></b></span>
<div style="margin-left: 20pt;"><p>Artist values of Abba or Blondie will result in a 1, but ZZ Top will return a 0.</p></div>
;<span style="font-family: Consolas, monospace;">isrange([artist], a-c)</span>
<span style="font-family: Consolas, monospace;"><b><nowiki>if(isrange([bitrate], 96-191), Poor Quality, High Quality)</nowiki></b></span>
: Artist values of Abba or Blondie will result in a 1, but ZZ Top will return a 0.
<div style="margin-left: 20pt;"><p>Returns Poor Quality for any file whose bitrate falls in the <i>range</i> of 96 to 191, and returns "High Quality" for all bitrates.</p></div>

;<span style="font-family: Consolas, monospace;">if(isrange([bitrate], 96-191), Poor Quality, High Quality)</span>
: Returns Poor Quality for any file whose bitrate falls in the <i>range</i> of 96 to 191, and returns "High Quality" for all bitrates.


Additional Examples
Additional Examples
Line 240: Line 225:
|- id="IsMissing" valign="top"
|- id="IsMissing" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | IsMissing()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | IsMissing()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>ismissing(</b><i>filepath</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>ismissing(</b><i>filepath</i><b>)</b></span>
The [[#IsMissing|IsMissing()]] function tests for the existence of a file in the file system.
The [[#IsMissing|IsMissing()]] function tests for the existence of a file in the file system.
If the file is missing, the function returns 1, otherwise 0 is returned if the file exists.
If the file is missing, the function returns 1, otherwise 0 is returned if the file exists.
Line 253: Line 238:
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>ismissing()</nowiki></b></span>
<div style="margin-left: 20pt;"><p>If the referenced file was not found in the file system, 1 is returned; othewise 0 is returned.</p></div>
;<span style="font-family: Consolas, monospace;">ismissing()</span>
<span style="font-family: Consolas, monospace;"><b><nowiki>ismissing(C:\Music\My Lost File.mp3)</nowiki></b></span>
: If the referenced file was not found in the file system, 1 is returned; othewise 0 is returned.
<div style="margin-left: 20pt;"><p>Checks for "My Lost File.mp3" and returns 1 (positive) if the file does not exist, and 0 (negative) if the file does exist.</p></div>

;<span style="font-family: Consolas, monospace;">ismissing(C:\Music\My Lost File.mp3)</span>
<span style="font-family: Consolas, monospace;"><b><nowiki>if(ismissing(), File is missing, File exists)</nowiki></b></span>
<div style="margin-left: 20pt;"><p>Outputs "File is missing" or "File Exists" depending on the result returned by IsMissing().</p></div>
: Checks for "My Lost File.mp3" and returns 1 (positive) if the file does not exist, and 0 (negative) if the file does exist.
<span style="font-family: Consolas, monospace;"><b><nowiki>[=ismissing([filename])]=1</nowiki></b></span>

<div style="margin-left: 20pt;"><p>This example demonstrates how to construct an expression for use as a Media Center search query. If you place this in the search field in the top right corner of the program while viewing all of your library, it will filter the list, leaving only the missing files on view. If all files in library exist, this list will be empty. You could also create a view scheme and use this string in the "Set rules for file display" search to give you a view that you can visit periodically to check that your library is not missing any files.</p></div>
;<span style="font-family: Consolas, monospace;">if(ismissing(), File is missing, File exists)</span>
: Outputs "File is missing" or "File Exists" depending on the result returned by IsMissing().

;<span style="font-family: Consolas, monospace;">[=ismissing([filename])]=1</span>
: This example demonstrates how to construct an expression for use as a Media Center search query. If you place this in the search field in the top right corner of the program while viewing all of your library, it will filter the list, leaving only the missing files on view. If all files in library exist, this list will be empty. You could also create a view scheme and use this string in the "Set rules for file display" search to give you a view that you can visit periodically to check that your library is not missing any files.
|}
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>
<div style="text-align:right;">([[#top|Back to top)]]</div>
Line 273: Line 254:
|- id="IsRemovable" valign="top"
|- id="IsRemovable" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | IsRemovable()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | IsRemovable()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>isremovable(</b><i>filepath</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>isremovable(</b><i>filepath</i><b>)</b></span>
The [[#IsRemovable|IsRemovable()]] function tests if a file resides on removable media and if so, returns 1, and if not, returns 0.
The [[#IsRemovable|IsRemovable()]] function tests if a file resides on removable media and if so, returns 1, and if not, returns 0.
The Media Center field [Removable] also provides the same value for a given file.
The Media Center field [Removable] also provides the same value for a given file.
Line 281: Line 262:
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>isremovable()</nowiki></b></span>
<div style="margin-left: 20pt;"><p>Checks if the current file is on removable storage, and if so, returns 1, otherwise returns 0.</p></div>
;<span style="font-family: Consolas, monospace;">isremovable()</span>
: Checks if the current file is on removable storage, and if so, returns 1, otherwise returns 0.
|}
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>
<div style="text-align:right;">([[#top|Back to top)]]</div>
Line 292: Line 272:
|- id="IsInPlayingNow" valign="top"
|- id="IsInPlayingNow" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | IsInPlayingNow()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | IsInPlayingNow()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>isinplayingnow(</b><i>filepath</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>isinplayingnow(</b><i>filepath</i><b>)</b></span>
The [[#IsInPlayingNow|IsInPlayingNow()]] function tests if a file is in any zone's Playing Now list.
The [[#IsInPlayingNow|IsInPlayingNow()]] function tests if a file is in any zone's Playing Now list.
Used as an expression category, pane or file list column allows distinguishing files that are in the Playing Now list.
Used as an expression category, pane or file list column allows distinguishing files that are in the Playing Now list.
Line 300: Line 280:
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>isinplayingnow()</nowiki></b></span>
<div style="margin-left: 20pt;"><p>If the file in the Playing Now list, returns 1, otherwise returns 0.</p></div>
;<span style="font-family: Consolas, monospace;">isinplayingnow()</span>
<span style="font-family: Consolas, monospace;"><b><nowiki>if(isinplayingnow(), Queued, Not queued)</nowiki></b></span>
: If the file in the Playing Now list, returns 1, otherwise returns 0.
<div style="margin-left: 20pt;"><p>If the file in the Playing Now list, returns Queued, otherwise Not queued.</p></div>

;<span style="font-family: Consolas, monospace;">if(isinplayingnow(), Queued, Not queued)</span>
: If the file in the Playing Now list, returns Queued, otherwise Not queued.


Additional Examples
Additional Examples
Line 318: Line 296:
|- id="IsPlaying" valign="top"
|- id="IsPlaying" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | IsPlaying()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | IsPlaying()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>isplaying(</b><i>filepath</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>isplaying(</b><i>filepath</i><b>)</b></span>
The [[#IsPlaying|IsPlaying()]] function tests if a file is playing in any zone.
The [[#IsPlaying|IsPlaying()]] function tests if a file is playing in any zone.
Used as an expression category, pane or file list column allows distinguishing files that are playing now.
Used as an expression category, pane or file list column allows distinguishing files that are playing now.
Line 326: Line 304:
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>IfElse(IsPlaying(), &lt;font color="ff0000"&gt;&#9834;&lt;//font&gt;, IsInPlayingNow(), &#9834;)</nowiki></b></span>
<div style="margin-left: 20pt;"><p>This expression in a file list expression column shows which files are in the Playing Now list and which are currently playing by outputing a musical note in the column. The musical note will be displayed in red for any currently playing file.</p></div>
;<span style="font-family: Consolas, monospace;">IfElse(IsPlaying(), &lt;font color="ff0000"&gt;&#9834;&lt;//font&gt;, IsInPlayingNow(), &#9834;)</span>
: This expression in a file list expression column shows which files are in the Playing Now list and which are currently playing by outputing a musical note in the column. The musical note will be displayed in red for any currently playing file.


Additional Examples
Additional Examples
Line 355: Line 332:
|- id="Delimit" valign="top"
|- id="Delimit" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | Delimit()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | Delimit()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>delimit(</b><i>expression</i><b>, </b><i>tail</i><b>, </b><i>head</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>delimit(</b><i>expression</i><b>, </b><i>tail</i><b>, </b><i>head</i><b>)</b></span>
The [[#Delimit|Delimit()]] function outputs the value of <i>expression</i> prepended with a <i>head</i> string and/or appended with a <i>tail</i> string, but only if the value of the <i>expression</i> is non-empty. Nothing is output when the <i>expression</i> evaluates to empty.
The [[#Delimit|Delimit()]] function outputs the value of <i>expression</i> prepended with a <i>head</i> string and/or appended with a <i>tail</i> string, but only if the value of the <i>expression</i> is non-empty. Nothing is output when the <i>expression</i> evaluates to empty.


Line 364: Line 341:
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>delimit([Track #], .)</nowiki></b></span>
;<span style="font-family: Consolas, monospace;">delimit([Track #], .)</span>
<div style="margin-left: 20pt;"><p>Appends a period after a track number if [Track #] is not empty, such as "12.".</p></div>
<span style="font-family: Consolas, monospace;"><b><nowiki>delimit([Date (year)], {, })</nowiki></b></span>
: Appends a period after a track number if [Track #] is not empty, such as "12.".
<div style="margin-left: 20pt;"><p>Outputs the year surrounded by curly braces, for example "{2012}".</p></div>

;<span style="font-family: Consolas, monospace;">delimit([Date (year)], {, })</span>
: Outputs the year surrounded by curly braces, for example "{2012}".
|}
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>
<div style="text-align:right;">([[#top|Back to top)]]</div>
Line 378: Line 353:
|- id="FormatBoolean" valign="top"
|- id="FormatBoolean" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | FormatBoolean()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | FormatBoolean()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>formatboolean(</b><i>conditional</i><b>, </b><i>true string</i><b>, </b><i>false string</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>formatboolean(</b><i>conditional</i><b>, </b><i>true string</i><b>, </b><i>false string</i><b>)</b></span>
The [[#FormatBoolean|FormatBoolean()]] function outputs <i>true string</i> and <i>false string</i> values to represent the 0 or 1 Boolean output resulting from the <i>conditional</i> expression.
The [[#FormatBoolean|FormatBoolean()]] function outputs <i>true string</i> and <i>false string</i> values to represent the 0 or 1 Boolean output resulting from the <i>conditional</i> expression.
When the <i>conditional</i> evalutes to 1, the <i>true string</i> will be output, otherwise the <i>false string</i> will be output.
When the <i>conditional</i> evalutes to 1, the <i>true string</i> will be output, otherwise the <i>false string</i> will be output.
Line 388: Line 363:
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>formatboolean(isempty([number plays]), Never Played, Has Been Played)</nowiki></b></span>
;<span style="font-family: Consolas, monospace;">formatboolean(isempty([number plays]), Never Played, Has Been Played)</span>
<div style="margin-left: 20pt;"><p>Returns "Never Played" when the expression [[#IsEmpty|IsEmpty()]] evaluates to 0, and "Has Been Played" when it evaluates to 1.</p></div>
<span style="font-family: Consolas, monospace;"><b><nowiki>formatboolean(math([track #] % 2)</nowiki></b></span>
: Returns "Never Played" when the expression [[#IsEmpty|IsEmpty()]] evaluates to 0, and "Has Been Played" when it evaluates to 1.
<div style="margin-left: 20pt;"><p>Outputs the default True label for odd track numbers, and the default False label for even ones.</p></div>

;<span style="font-family: Consolas, monospace;">formatboolean(math([track #] % 2)</span>
: Outputs the default True label for odd track numbers, and the default False label for even ones.
|}
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>
<div style="text-align:right;">([[#top|Back to top)]]</div>
Line 402: Line 375:
|- id="FormatDuration" valign="top"
|- id="FormatDuration" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | FormatDuration()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | FormatDuration()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>formatduration(</b><i>duration value</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>formatduration(</b><i>duration value</i><b>)</b></span>
The [[#FormatDuration|FormatDuration()]] function formats a <i>duration value</i> into a friendly format.
The [[#FormatDuration|FormatDuration()]] function formats a <i>duration value</i> into a friendly format.
The <i>duration value</i> argument is expected to be a value representing a number of seconds, typically used for media file duration.
The <i>duration value</i> argument is expected to be a value representing a number of seconds, typically used for media file duration.
Line 408: Line 381:
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>formatduration([duration,0])</nowiki></b></span>
<div style="margin-left: 20pt;"><p>Outputs a friendly display of the duration field. This is the same output shown using the Duration field in a file list.</p></div>
;<span style="font-family: Consolas, monospace;">formatduration([duration,0])</span>
<span style="font-family: Consolas, monospace;"><b><nowiki>formatduration(600)</nowiki></b></span>
: Outputs a friendly display of the duration field. This is the same output shown using the Duration field in a file list.
<div style="margin-left: 20pt;"><p>This will output ten minutes in the format 10:00.</p></div>

;<span style="font-family: Consolas, monospace;">formatduration(600)</span>
: This will output ten minutes in the format 10:00.
|}
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>
<div style="text-align:right;">([[#top|Back to top)]]</div>
Line 422: Line 393:
|- id="FormatFileSize" valign="top"
|- id="FormatFileSize" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | FormatFileSize()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | FormatFileSize()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>formatfilesize(</b><i>bytes value</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>formatfilesize(</b><i>bytes value</i><b>)</b></span>
The [[#FormatFileSize|FormatFileSize()]] function formats a <i>bytes value</i> into a friendly format.
The [[#FormatFileSize|FormatFileSize()]] function formats a <i>bytes value</i> into a friendly format.
The <i>bytes value</i> argument is expected to be a value representing a number of bytes, typically used for media file size.
The <i>bytes value</i> argument is expected to be a value representing a number of bytes, typically used for media file size.
Line 428: Line 399:
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>formatfilesize([file size,0])</nowiki></b></span>
<div style="margin-left: 20pt;"><p>Outputs a friendly format of the file size field. This is the same output shown using the File Size field in a file list.</p></div>
;<span style="font-family: Consolas, monospace;">formatfilesize([file size,0])</span>
<span style="font-family: Consolas, monospace;"><b><nowiki>formatfilesize(56123456)</nowiki></b></span>
: Outputs a friendly format of the file size field. This is the same output shown using the File Size field in a file list.
<div style="margin-left: 20pt;"><p>Outputs the <i>bytes value</i> 56,123,456 as 53.5 MB.</p></div>

;<span style="font-family: Consolas, monospace;">formatfilesize(56123456)</span>
: Outputs the <i>bytes value</i> 56,123,456 as 53.5 MB.
|}
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>
<div style="text-align:right;">([[#top|Back to top)]]</div>
Line 442: Line 411:
|- id="FormatNumber" valign="top"
|- id="FormatNumber" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | FormatNumber()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | FormatNumber()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>formatnumber(</b><i>value</i><b>, </b><i>decimal places</i><b>, </b><i>label zero</i><b>, </b><i>label plural</i><b>, </b><i>label singular</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>formatnumber(</b><i>value</i><b>, </b><i>decimal places</i><b>, </b><i>label zero</i><b>, </b><i>label plural</i><b>, </b><i>label singular</i><b>)</b></span>
The [[#FormatNumber|FormatNumber()]] function formats a numeric <i>value</i> to a specified number of <i>decimal places</i>, rounding its <i>value</i>, and optionally outputs <i>value</i>-dependent labels, which can be used to construct more gramatically-correct output.
The [[#FormatNumber|FormatNumber()]] function formats a numeric <i>value</i> to a specified number of <i>decimal places</i>, rounding its <i>value</i>, and optionally outputs <i>value</i>-dependent labels, which can be used to construct more gramatically-correct output.
The <i>value</i> can be any numeric <i>value</i>.
The <i>value</i> can be any numeric <i>value</i>.
Line 465: Line 434:
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>formatnumber([duration,0], 2)</nowiki></b></span>
<div style="margin-left: 20pt;"><p>Returns a file's duration (which are in seconds) rounding to two <i>decimal places</i>.</p></div>
;<span style="font-family: Consolas, monospace;">formatnumber([duration,0], 2)</span>
<span style="font-family: Consolas, monospace;"><b><nowiki>formatnumber([number plays,0], 0, Unplayed, Plays, Play)</nowiki></b></span>
: Returns a file's duration (which are in seconds) rounding to two <i>decimal places</i>.
<div style="margin-left: 20pt;"><p>Outputs values in whole number formats (no decimals shown). When the number of plays is 0, the output will be "Unplayed".

When it is more than one, such as six, outputs "6 Plays".
;<span style="font-family: Consolas, monospace;">formatnumber([number plays,0], 0, Unplayed, Plays, Play)</span>
: Outputs values in whole number formats (no decimals shown). When the number of plays is 0, the output will be "Unplayed". When it is more than one, such as six, outputs "6 Plays". And when the number of plays is one, outputs "1 Play".
And when the number of plays is one, outputs "1 Play".</p></div>
<span style="font-family: Consolas, monospace;"><b><nowiki>formatnumber([number plays,0], 0, , Plays, Play)</nowiki></b></span>

<div style="margin-left: 20pt;"><p>Same as the previous example, but uses the default <i>value</i> for <i>label zero</i> (which is <i>label plural</i>), so that when number of plays is zero, output is "0 Plays".</p></div>
;<span style="font-family: Consolas, monospace;">formatnumber([number plays,0], 0, , Plays, Play)</span>
<span style="font-family: Consolas, monospace;"><b><nowiki>formatnumber([number plays,0], , , , Time)</nowiki></b></span>
: Same as the previous example, but uses the default <i>value</i> for <i>label zero</i> (which is <i>label plural</i>), so that when number of plays is zero, output is "0 Plays".
<div style="margin-left: 20pt;"><p>In this example, only <i>label singular</i> argument is specified (as "Time"), so all other arguments use their defaults values.

The output will be "0" when number of plays is zero, "1 Time" when number of plays is one, and the actual number of plays for other values (e.g. "6").</p></div>
;<span style="font-family: Consolas, monospace;">formatnumber([number plays,0], , , , Time)</span>
: In this example, only <i>label singular</i> argument is specified (as "Time"), so all other arguments use their defaults values. The output will be "0" when number of plays is zero, "1 Time" when number of plays is one, and the actual number of plays for other values (e.g. "6").
|}
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>
<div style="text-align:right;">([[#top|Back to top)]]</div>
Line 485: Line 453:
|- id="FormatRange" valign="top"
|- id="FormatRange" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | FormatRange()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | FormatRange()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>formatrange(</b><i>value</i><b>, </b><i>range size</i><b>, </b><i>mode</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>formatrange(</b><i>value</i><b>, </b><i>range size</i><b>, </b><i>mode</i><b>)</b></span>
The [[#FormatRange|FormatRange()]] function creates numerical or alphabetic groupings of size <i>range size</i>, and returns the grouping where <i>value</i> falls.
The [[#FormatRange|FormatRange()]] function creates numerical or alphabetic groupings of size <i>range size</i>, and returns the grouping where <i>value</i> falls.
Only the first character of <i>value</i> is considered and used.
Only the first character of <i>value</i> is considered and used.
The <i>range size</i> is a numerical <i>value</i> specifying how wide the range should be. Numeric ranges are 0-based.
The <i>range size</i> is a numerical <i>value</i> specifying how wide the range should be. Numeric ranges are 0-based.
The <i>mode</i> specifies the type of range grouping, and can be one of the following values:
The <i>mode</i> specifies the type of range grouping.

Available <i>mode</i> values:


<div style="margin-left: 0pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<div style="margin-left: 0pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>0</b></span></td><td>Automatically choose between number / letter grouping</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>0</b></td><td>Automatically choose between number / letter grouping</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b> 1</b></span></td><td>Letter grouping</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b> 1</b></td><td>Letter grouping</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b> 2</b></span></td><td>Number grouping</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b> 2</b></td><td>Number grouping</td></tr>
</table></div>
</table></div>


Line 503: Line 473:
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>formatrange([artist], 3, 1)</nowiki></b></span>
<div style="margin-left: 20pt;"><p>Outputs the range that the artist's first letter falls within.
;<span style="font-family: Consolas, monospace;">formatrange([artist], 3, 1)</span>
: Outputs the range that the artist's first letter falls within. With a <i>range size</i> of 3 and using <i>mode</i> 1 (letter grouping), ranges will produced in the form of a-c, d-f, g-i, ...
With a <i>range size</i> of 3 and using <i>mode</i> 1 (letter grouping), ranges will produced in the form of a-c, d-f, g-i, ...</p></div>
<span style="font-family: Consolas, monospace;"><b><nowiki>formatrange([artist])</nowiki></b></span>

<div style="margin-left: 20pt;"><p>With <i>range size</i> and <i>mode</i> values left unspecified, default values are used, so automatic range groupings of size 1 are output.
;<span style="font-family: Consolas, monospace;">formatrange([artist])</span>
: With <i>range size</i> and <i>mode</i> values left unspecified, default values are used, so automatic range groupings of size 1 are output. Hence, the first character of [artist] will be output.
Hence, the first character of [artist] will be output.</p></div>
<span style="font-family: Consolas, monospace;"><b><nowiki>formatrange([bitrate], 100, 2)</nowiki></b></span>

<div style="margin-left: 20pt;"><p>Numeric range groupings of size 100 will be output, for the <i>value</i> of [bitrate]. Possible outputs are: 0-99, 100-199, 200-299, ...</p></div>
;<span style="font-family: Consolas, monospace;">formatrange([bitrate], 100, 2)</span>
: Numeric range groupings of size 100 will be output, for the <i>value</i> of [bitrate]. Possible outputs are: 0-99, 100-199, 200-299, ...


Additional Examples
Additional Examples
Line 524: Line 493:
|- id="Orientation" valign="top"
|- id="Orientation" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | Orientation()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | Orientation()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>orientation(</b><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>orientation(</b><b>)</b></span>
The [[#Orientation|Orientation()]] function outputs one of the following words indicating the orientation of an image file:
The [[#Orientation|Orientation()]] function outputs one of the following words indicating the orientation of an image file:


<div style="margin-left: 20pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<div style="margin-left: 20pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;">Portrait</span></td><td>When height > width</td></tr>
<tr><td style="text-align:left; padding-right:20pt">Portrait</td><td>When height > width</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;">Landscape</span></td><td>When width > height</td></tr>
<tr><td style="text-align:left; padding-right:20pt">Landscape</td><td>When width > height</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;">Portrait</span></td><td>When height = width</td></tr>
<tr><td style="text-align:left; padding-right:20pt">Portrait</td><td>When height = width</td></tr>
</table></div>
</table></div>
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>if(isequal(orientation(), Square), Square, Rectangle)</nowiki></b></span>
;<span style="font-family: Consolas, monospace;">if(isequal(orientation(), Square), Square, Rectangle)</span>
<div style="margin-left: 20pt;"><p>Outputs "Square" for square images or "Rectangle" for portrait and landscape images.</p></div>
: Outputs "Square" for square images or "Rectangle" for portrait and landscape images.
|}
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>
<div style="text-align:right;">([[#top|Back to top)]]</div>
Line 545: Line 513:
|- id="PadNumber" valign="top"
|- id="PadNumber" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | PadNumber()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | PadNumber()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>padnumber(</b><i>value</i><b>, </b><i>number digits</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>padnumber(</b><i>value</i><b>, </b><i>number digits</i><b>)</b></span>
The [[#PadNumber|PadNumber()]] function adds leading zeros to any given number <i>value</i>, producing a <i>value</i> of length <i>number digits</i>.
The [[#PadNumber|PadNumber()]] function adds leading zeros to any given number <i>value</i>, producing a <i>value</i> of length <i>number digits</i>.
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>padnumber([track #], 2)</nowiki></b></span>
<div style="margin-left: 20pt;"><p>This will pad the track number with leading zeros sufficient to ensure the output is minimally two digits in length.</p></div>
;<span style="font-family: Consolas, monospace;">padnumber([track #], 2)</span>
<span style="font-family: Consolas, monospace;"><b><nowiki>padnumber(counter(), 4)</nowiki></b></span>
: This will pad the track number with leading zeros sufficient to ensure the output is minimally two digits in length.
<div style="margin-left: 20pt;"><p>Outputs 4 digits of zero-padded numbers produced by [[#Counter|Counter()]]. For example, 0001, 0002, 0003, ...</p></div>

;<span style="font-family: Consolas, monospace;">padnumber(counter(), 4)</span>
: Outputs 4 digits of zero-padded numbers produced by [[#Counter|Counter()]]. For example, 0001, 0002, 0003, ...
|}
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>
<div style="text-align:right;">([[#top|Back to top)]]</div>
Line 563: Line 529:
|- id="RatingStars" valign="top"
|- id="RatingStars" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | RatingStars()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | RatingStars()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>ratingstars(</b><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>ratingstars(</b><b>)</b></span>
The [[#RatingStars|RatingStars()]] function outputs the Rating field's value as the equivalent number of black star characters.
The [[#RatingStars|RatingStars()]] function outputs the Rating field's value as the equivalent number of black star characters.
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>ratingstars()</nowiki></b></span>
<div style="margin-left: 20pt;"><p>For a file that has a Rating of 4, outputs &#9733;&#9733;&#9733;&#9733;.</p></div>
;<span style="font-family: Consolas, monospace;">ratingstars()</span>
: For a file that has a Rating of 4, outputs &#9733;&#9733;&#9733;&#9733;.
|}
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>
<div style="text-align:right;">([[#top|Back to top)]]</div>
Line 578: Line 543:
|- id="Watched" valign="top"
|- id="Watched" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | Watched()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | Watched()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>watched(</b><i>mode</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>watched(</b><i>mode</i><b>)</b></span>
Outputs a video's bookmark position in a human-readable format, using any <i>mode</i> formats from the following:
Outputs a video's bookmark position in a human-readable format, using a specified <i>mode</i>.

Available <i>mode</i> values:


<div style="margin-left: 20pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<div style="margin-left: 20pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>0</b></span></td><td>Output a human-readable watched status.</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>0</b></td><td>Output a human-readable watched status.</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>1</b></span></td><td>Output a numeric watched value, 0 if not watched, 1 if partially watched, 2 if entirely watched.</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>1</b></td><td>Output a numeric watched value, 0 if not watched, 1 if partially watched, 2 if entirely watched.</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>2</b></span></td><td>Output a watched checkmark &#x2713; if watched</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>2</b></td><td>Output a watched checkmark &#x2713; if watched</td></tr>
</table></div>
</table></div>


Line 591: Line 558:
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>watched()</nowiki></b></span>
<div style="margin-left: 20pt;"><p>Outputs formatted watched status, such as "57% on Sep 25", or "Aug 21", or nothing when the video has not been watched.</p></div>
;<span style="font-family: Consolas, monospace;">watched()</span>
: Outputs formatted watched status, such as "57% on Sep 25", or "Aug 21", or nothing when the video has not been watched.
|}
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>
<div style="text-align:right;">([[#top|Back to top)]]</div>
Line 605: Line 571:
|- id="Clean" valign="top"
|- id="Clean" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | Clean()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | Clean()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>clean(</b><i>string</i><b>, </b><i>mode</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>clean(</b><i>string</i><b>, </b><i>mode</i><b>)</b></span>
The [[#Clean|Clean()]] function is generally used to sanitize a <i>string</i> by stripping empty brackets, remove superfluous dash characters, eliminate leading or trailing articles, or replace filesystem-illegal characters.
The [[#Clean|Clean()]] function is generally used to sanitize a <i>string</i> by stripping empty brackets, remove superfluous dash characters, eliminate leading or trailing articles, or replace filesystem-illegal characters.
It is typically employed before some operation such as Rename to clean the product of joining various fields, some of which may be empty, or to produce filesystem-safe filenames. It may be used for a variety of purposes, however.
It is typically employed before some operation such as Rename to clean the product of joining various fields, some of which may be empty, or to produce filesystem-safe filenames. It may be used for a variety of purposes, however.


Available <i>mode</i> values:
The [[#Clean|Clean()]] function operates using a <i>mode</i> specified from the following choices:


<div style="margin-left: 20pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<div style="margin-left: 20pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>0</b></span></td><td>Removes empty () and [], superfluous dash (-) and whitespace characters and sometimes comma (be careful)</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>0</b></td><td>Removes empty () and [], superfluous dash (-) and whitespace characters and sometimes comma (be careful)</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>1</b></span></td><td>Removes the article 'the' from the beginning and ', the' from the end</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>1</b></td><td>Removes the article 'the' from the beginning and ', the' from the end</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>2</b></span></td><td>Removes any article (a, an, the, etc.) from the beginning and end</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>2</b></td><td>Removes any article (a, an, the, etc.) from the beginning and end</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>3</b></span></td><td>Replaces each filesystem-illegal character <span style="font-family: Consolas, monospace;">\ / : * ? " < > |</span> with an underscore <span style="font-family: Consolas, monospace;">_</span>, and replaces each unprintable character with a space</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>3</b></td><td>Replaces each filesystem-illegal character <span style="font-family: Consolas, monospace;">\ / : * ? " < > |</span> with an underscore <span style="font-family: Consolas, monospace;">_</span>, and replaces each unprintable character with a space</td></tr>
</table></div>
</table></div>


Line 622: Line 588:
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>clean([album] - [date])</nowiki></b></span>
<div style="margin-left: 20pt;"><p>The concatenation of [Album] - [Date] may leave a dangling " - " <i>string</i> when date is empty. [[#Clean|Clean()]] in the default <i>mode</i> removes this dangling <i>string</i>.</p></div>
;<span style="font-family: Consolas, monospace;">clean([album] - [date])</span>
<span style="font-family: Consolas, monospace;"><b><nowiki>clean(The Beatles, 1)</nowiki></b></span>
: The concatenation of [Album] - [Date] may leave a dangling " - " <i>string</i> when date is empty. [[#Clean|Clean()]] in the default <i>mode</i> removes this dangling <i>string</i>.
<div style="margin-left: 20pt;"><p>For sorting or grouping purposes, it is often desirable to remove the leading article "The" from a <i>string</i>. [[#Clean|Clean()]] in <i>mode</i> 1 provides a convenient solution, and in this example produces "Beatles".</p></div>

;<span style="font-family: Consolas, monospace;">clean(The Beatles, 1)</span>
<span style="font-family: Consolas, monospace;"><b><nowiki>clean(AC//DC: Back In Black, 3)</nowiki></b></span>
<div style="margin-left: 20pt;"><p>When an expression is to be used to produce a filename, filesystem-illegal characters must be removed or converted to legal characters. [[#Clean|Clean()]] in <i>mode</i> 3 will convert such characters into safe underscores. This example would produce the filesystem-safe value of "AC_DC_ Back In Black".</p></div>
: For sorting or grouping purposes, it is often desirable to remove the leading article "The" from a <i>string</i>. [[#Clean|Clean()]] in <i>mode</i> 1 provides a convenient solution, and in this example produces "Beatles".
<span style="font-family: Consolas, monospace;"><b><nowiki>clean(\//:*?"&lt;&gt;|, 3)</nowiki></b></span>

<div style="margin-left: 20pt;"><p>This trivial example demonstrates how all filesystem-illegal characters are converted to underscores,
;<span style="font-family: Consolas, monospace;">clean(AC//DC: Back In Black, 3)</span>
producing the nine-character output "_________" which consists entirely of underscores.</p></div>
: When an expression is to be used to produce a filename, filesystem-illegal characters must be removed or converted to legal characters. [[#Clean|Clean()]] in <i>mode</i> 3 will convert such characters into safe underscores. This example would produce the filesystem-safe value of "AC_DC_ Back In Black".

;<span style="font-family: Consolas, monospace;">clean(\//:*?"&lt;&gt;|, 3)</span>
: This trivial example demonstrates how all filesystem-illegal characters are converted to underscores, producing the nine-character <i>string</i> consisting entirely of underscores "_________".
|}
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>
<div style="text-align:right;">([[#top|Back to top)]]</div>
Line 642: Line 605:
|- id="FixCase" valign="top"
|- id="FixCase" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | FixCase()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | FixCase()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>fixcase(</b><i>string</i><b>, </b><i>mode</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>fixcase(</b><i>string</i><b>, </b><i>mode</i><b>)</b></span>
The [[#FixCase|FixCase()]] function will convert the supplied text <i>string</i> using one <i>mode</i> from the following:
The [[#FixCase|FixCase()]] function will convert the supplied text <i>string</i> according to the specified <i>mode</i>.

Available <i>mode</i> values:


<div style="margin-left: 20pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<div style="margin-left: 20pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>0</b></span></td><td>Title Case</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>0</b></td><td>Title Case</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>1</b></span></td><td>All Words</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>1</b></td><td>All Words</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>2</b></span></td><td>First Word</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>2</b></td><td>First Word</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>3</b></span></td><td>All Uppercase</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>3</b></td><td>All Uppercase</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>4</b></span></td><td>All Lowercase</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>4</b></td><td>All Lowercase</td></tr>
</table></div>
</table></div>


Line 657: Line 622:
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>fixcase(enjoy the silence)</nowiki></b></span>
<div style="margin-left: 20pt;"><p>The default <i>mode</i> 0 is used, so the output is "Enjoy the Silence".</p></div>
;<span style="font-family: Consolas, monospace;">fixcase(enjoy the silence)</span>
<span style="font-family: Consolas, monospace;"><b><nowiki>fixcase(enjoy the silence, 1)</nowiki></b></span>
: The default <i>mode</i> 0 is used, so the output is "Enjoy the Silence".
<div style="margin-left: 20pt;"><p>Using <i>mode</i> 1, all words are uppercased, so the output is "Enjoy The Silence".</p></div>

;<span style="font-family: Consolas, monospace;">fixcase(enjoy the silence, 1)</span>
<span style="font-family: Consolas, monospace;"><b><nowiki>fixcase(MY ALbUm IS cAlLeD: adam, 4)</nowiki></b></span>
<div style="margin-left: 20pt;"><p>Outputs "my album is called: adam".</p></div>
: Using <i>mode</i> 1, all words are uppercased, so the output is "Enjoy The Silence".

;<span style="font-family: Consolas, monospace;">fixcase(MY ALbUm IS cAlLeD: adam, 4)</span>
: Outputs "my album is called: adam".
|}
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>
<div style="text-align:right;">([[#top|Back to top)]]</div>
Line 674: Line 636:
|- id="FixSpacing" valign="top"
|- id="FixSpacing" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | FixSpacing()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | FixSpacing()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>fixspacing(</b><i>string</i><b>, </b><i>mode</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>fixspacing(</b><i>string</i><b>, </b><i>mode</i><b>)</b></span>
The [[#FixSpacing|FixSpacing()]] function inserts spaces between adjacent camel-cased words in <i>string</i>.
The [[#FixSpacing|FixSpacing()]] function inserts spaces between adjacent camel-cased words in <i>string</i>.
It is useful for helping to clean and convert metadata that favors compactness over standard sentence structure.
It is useful for helping to clean and convert metadata that favors compactness over standard sentence structure.


Use one <i>mode</i> from the following:
Available <i>mode</i> values:


<div style="margin-left: 20pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<div style="margin-left: 20pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>0</b></span></td><td>Disables conversion</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>0</b></td><td>Disables conversion</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>1</b></span></td><td>Enables camel-case conversion</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>1</b></td><td>Enables camel-case conversion</td></tr>
</table></div>
</table></div>


Line 689: Line 651:
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>fixspacing(OneWorld)</nowiki></b></span>
;<span style="font-family: Consolas, monospace;">fixspacing(OneWorld)</span>
<div style="margin-left: 20pt;"><p>Outputs "One World".</p></div>
<span style="font-family: Consolas, monospace;"><b><nowiki>fixspacing([name], 1)</nowiki></b></span>
: Outputs "One World".
<div style="margin-left: 20pt;"><p>Outputs the name field with any camel-case converted into standard sentence structure.

If the value of name was, "MiracleOn34thStreet", the output would be "Miracle On 34th Street".</p></div>
;<span style="font-family: Consolas, monospace;">fixspacing([name], 1)</span>
<span style="font-family: Consolas, monospace;"><b><nowiki>fixspacing(Another [name])</nowiki></b></span>
: Outputs the name field with any camel-case converted into standard sentence structure. If the value of name was, "MiracleOn34thStreet", the output would be "Miracle On 34th Street".
<div style="margin-left: 20pt;"><p>Assuming the same [name] as above, this would return "Another Miracle On 34th Street".</p></div>

;<span style="font-family: Consolas, monospace;">fixspacing(Another [name])</span>
: Assuming the same [name] as above, this would return "Another Miracle On 34th Street".
|}
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>
<div style="text-align:right;">([[#top|Back to top)]]</div>
Line 706: Line 666:
|- id="Hexify" valign="top"
|- id="Hexify" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | Hexify()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | Hexify()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>hexify(</b><i>string</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>hexify(</b><i>string</i><b>)</b></span>
The [[#Hexify|Hexify()]] function URI encodes a <i>string</i> to make it useable by a browser or search engine.
The [[#Hexify|Hexify()]] function URI encodes a <i>string</i> to make it useable by a browser or search engine.
[[#Hexify|Hexify()]] is typically used by expressions generating or working on URLs in Media Center's Link Manager.
[[#Hexify|Hexify()]] is typically used by expressions generating or working on URLs in Media Center's Link Manager.
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>hexify(Oasis - /(What's The Story/) Morning Glory?)</nowiki></b></span>
<div style="margin-left: 20pt;"><p>The result is "Oasis%20-%20%28What%27s%20The%20Story%29%20Morning%20Glory%3F".</p></div>
;<span style="font-family: Consolas, monospace;">hexify(Oasis - /(What's The Story/) Morning Glory?)</span>
: The result is "Oasis%20-%20%28What%27s%20The%20Story%29%20Morning%20Glory%3F".
|}
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>
<div style="text-align:right;">([[#top|Back to top)]]</div>
Line 722: Line 681:
|- id="Left" valign="top"
|- id="Left" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | Left()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | Left()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>left(</b><i>string</i><b>, </b><i>quantity</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>left(</b><i>string</i><b>, </b><i>quantity</i><b>)</b></span>
The [[#Left|Left()]] function retrieves no more than <i>quantity</i> characters from the left of the <i>string</i>.
The [[#Left|Left()]] function retrieves no more than <i>quantity</i> characters from the left of the <i>string</i>.
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>left([filename], 3)</nowiki></b></span>
<div style="margin-left: 20pt;"><p>Return the Windows drive letter, colon and first back-slash from the filename.</p></div>
;<span style="font-family: Consolas, monospace;">left([filename], 3)</span>
: Return the Windows drive letter, colon and first back-slash from the filename.
|}
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>
<div style="text-align:right;">([[#top|Back to top)]]</div>
Line 737: Line 695:
|- id="Length" valign="top"
|- id="Length" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | Length()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | Length()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>length(</b><i>string</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>length(</b><i>string</i><b>)</b></span>
The [[#Length|Length()]] function returns the number of characters contained in <i>string</i>.
The [[#Length|Length()]] function returns the number of characters contained in <i>string</i>.
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>length(A Simple Plan)</nowiki></b></span>
;<span style="font-family: Consolas, monospace;">length(A Simple Plan)</span>
<div style="margin-left: 20pt;"><p>Returns 13.</p></div>
<span style="font-family: Consolas, monospace;"><b><nowiki>if(compare(length([filename]), &gt;=, 68), Long, Short)</nowiki></b></span>
: Returns 13.
<div style="margin-left: 20pt;"><p>The length of the filename is calculated, and compared against 68, outputting "Long" when the length is greater than or equal to 68, and "Short" otherwise.</p></div>

;<span style="font-family: Consolas, monospace;">if(compare(length([filename]), &gt;=, 68), Long, Short)</span>
: The length of the filename is calculated, and compared against 68, outputting "Long" when the length is greater than or equal to 68, and "Short" otherwise.
|}
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>
<div style="text-align:right;">([[#top|Back to top)]]</div>
Line 755: Line 711:
|- id="Mid" valign="top"
|- id="Mid" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | Mid()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | Mid()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>mid(</b><i>string</i><b>, </b><i>start position</i><b>, </b><i>quantity</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>mid(</b><i>string</i><b>, </b><i>start position</i><b>, </b><i>quantity</i><b>)</b></span>
The [[#Mid|Mid()]] function returns a specified <i>quantity</i> of characters from the start postion in <i>string</i>.
The [[#Mid|Mid()]] function returns a specified <i>quantity</i> of characters from the start postion in <i>string</i>.


Line 767: Line 723:
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>mid(12345)</nowiki></b></span>
<div style="margin-left: 20pt;"><p>Returns "1", using is the default <i>quantity</i> (1) of characters from the default <i>start position</i> of (0 - the beginning of the <i>string</i>).</p></div>
;<span style="font-family: Consolas, monospace;">mid(12345)</span>
<span style="font-family: Consolas, monospace;"><b><nowiki>mid(12345, 1, 2)</nowiki></b></span>
: Returns "1", using is the default <i>quantity</i> (1) of characters from the default <i>start position</i> of (0 - the beginning of the <i>string</i>).
<div style="margin-left: 20pt;"><p>Returns 2 characters begining at <i>start position</i> 1, which is "23".</p></div>

;<span style="font-family: Consolas, monospace;">mid(12345, 1, 2)</span>
: Returns 2 characters begining at <i>start position</i> 1, which is "23".


Additional Examples
Additional Examples
Line 787: Line 741:
|- id="Regex" valign="top"
|- id="Regex" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | Regex()
! scope="row" style="background: #ecedf3; color: #111; " width=100 | Regex()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d"><b>regex(</b><i>string</i><b>, </b><i>regexp</i><b>, </b><i>run mode</i><b>, </b><i>case sensitivity</i><b>)</b></span>
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>regex(</b><i>string</i><b>, </b><i>regexp</i><b>, </b><i>run mode</i><b>, </b><i>case sensitivity</i><b>)</b></span>
This function performs regular expression (RE) pattern matching on a <i>string</i>.
This function performs regular expression (RE) pattern matching on a <i>string</i>.
The <i>string</i> is evaluated against the regular expression <i>regexp</i>, and <i>run mode</i> dictates the values output by [[#Regex|Regex()]].
The <i>string</i> is evaluated against the regular expression <i>regexp</i>, and <i>run mode</i> dictates the values output by [[#Regex|Regex()]].
Line 796: Line 750:
The regular expression implementation used prior to Media Cener 19 is the Microsoft 2010 TR1 engine, and in Media Cener 19 it is the Boost engine.
The regular expression implementation used prior to Media Cener 19 is the Microsoft 2010 TR1 engine, and in Media Cener 19 it is the Boost engine.


The <i>run mode</i> argument can be one the following:
Available <i>run mode</i> values:


<div style="margin-left: 20pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<div style="margin-left: 20pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>0</b></span></td><td>Runs in Boolean test mode, returning either a 1 or 0, indicating whether the <i>string</i> matched (1) or did not match (0) the <i>regexp</i>. This <i>run mode</i> is useful within an [[#If|If()]] test, so that different true or false actions may be taken.</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>0</b></td><td>Runs in Boolean test mode, returning either a 1 or 0, indicating whether the <i>string</i> matched (1) or did not match (0) the <i>regexp</i>. This <i>run mode</i> is useful within an [[#If|If()]] test, so that different true or false actions may be taken.</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>1 to 9</b></span></td><td>Outputs the specified Nth capture group's contents, where N ranges from 1 to 9. Only a single capture is output in this mode, but all captures are available in the [R1] ... [R9] capture variables. This <i>run mode</i> is used to easily output a single matching sub-<i>string</i>.</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>1 to 9</b></td><td>Outputs the specified Nth capture group's contents, where N ranges from 1 to 9. Only a single capture is output in this mode, but all captures are available in the [R1] ... [R9] capture variables. This <i>run mode</i> is used to easily output a single matching sub-<i>string</i>.</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>-1</b></span></td><td>Runs in silent mode, with no output being produced. This <i>run mode</i> is useful as a means to capture portions of the <i>string</i> to be later used in subsequent portions of an expression.</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>-1</b></td><td>Runs in silent mode, with no output being produced. This <i>run mode</i> is useful as a means to capture portions of the <i>string</i> to be later used in subsequent portions of an expression.</td></tr>
</table></div>
</table></div>


The <i>case sensitivity</i> argument toggles the case-sensitivity of regular expression matching.
The <i>case sensitivity</i> argument toggles the case-sensitivity of regular expression matching.
Case insensitivity does not apply to characters inside a character class <span style="font-family: Consolas, monospace;">[ ]</span>.
Note that case insensitivity does not apply to characters inside a character class <span style="font-family: Consolas, monospace;">[ ]</span>.
Use both uppercase and lowercase characters when necessary to match either case (e.g. <span style="font-family: Consolas, monospace;">[aAbB]</span> to match either uppercase or lowercase <span style="font-family: Consolas, monospace;">A</span> or <span style="font-family: Consolas, monospace;">B</span>).
Use both uppercase and lowercase characters when necessary to match either case (e.g. <span style="font-family: Consolas, monospace;">[aAbB]</span> to match either uppercase or lowercase <span style="font-family: Consolas, monospace;">A</span> or <span style="font-family: Consolas, monospace;">B</span>).

Available <i>case sensitivity</i> values:


<div style="margin-left: 20pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<div style="margin-left: 20pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>0</b></span></td><td>Ignore case when matching (e.g. the letters E and e are identical)</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>0</b></td><td>Ignore case when matching (e.g. the letters E and e are identical)</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><span style="font-family: Consolas, monospace;"><b>1</b></span></td><td>Consider case when matching (e.g. the letters E and e are considered different)</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>1</b></td><td>Consider case when matching (e.g. the letters E and e are considered different)</td></tr>
</table></div>
</table></div>


Line 825: Line 781:
|- valign="top"
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " |
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>ifelse(regex([name], /#^(the|an|a)\b#/, 0, 1), Fix your case!)</nowiki></b></span>
<div style="margin-left: 20pt;"><p>Searches the name field for any of the lowercse articles "the", "and" and "a" at the beginning of name, and outputs "Fix your case!" when the match succeeds.
;<span style="font-family: Consolas, monospace;">regex([filename (name)], /#^(\d+)-#/, 1)Track number is [R1]</span>
The <i>run mode</i> is 0 which is a test and capture mode, and <i>case sensitivity</i> is enabled.</p></div>
: Using <i>run mode</i> 1, the file's name is pattern tested against the <i>regexp</i> which is looking for leading digits followed by a dash. Those digits are captured in buffer [R1] which is used later in the expression. If the file name was "2-foo.mp3", the output would be "Track number is 2".
<span style="font-family: Consolas, monospace;"><b><nowiki>if(regex([artist], /#([[:punct:]])#/, 0), [R1] --&gt; [Artist], No Punctuation)</nowiki></b></span>
<div style="margin-left: 20pt;"><p>Using the default mode 0, [[#Regex|Regex()]] will output a Boolean for use inside a condtional to cause some action to occur based on the match success or failure.
This example matches against the artist field looking for any punctuation character.
If the match succeeds (a punctuation character was found), that character is output followed by the <i>string</i> " --> " and the artist. In there was no match, the <i>string</i> "No Punctuation" is output.</p></div>
<span style="font-family: Consolas, monospace;"><b><nowiki>regex(D03T02 some track.mp3, /#^D(\d+)T(\d+)#/, 1)Disc: [R1], Track: [R2]</nowiki></b></span>
<div style="margin-left: 20pt;"><p>The <i>string</i> is matched against the <i>regexp</i> that is looking for a D followed by any number of digits, followed by a T and then more digits.
Those digits were captured, and later used to output the value "Disc: 03, Track: 02".</p></div>
<span style="font-family: Consolas, monospace;"><b><nowiki>regex([filename (name)], /#^(\d+)-#/, -1)Track number is [R1]</nowiki></b></span>
<div style="margin-left: 20pt;"><p>Using <i>run mode</i> -1, the file's name is pattern tested against the <i>regexp</i> which is looking for leading digits followed by a dash.
Those digits are captured in buffer [R1] which is used later in the expression. If the file name was "2-foo.mp3", the output would be "Track number is 2".</p></div>
<span style="font-family: Consolas, monospace;"><b><nowiki>regex([filename], /#(\d{1,2})\.(\d{1,2}).(\d{4})#/, -1)[R3]//[R1]//[R2]</nowiki></b></span>
<div style="margin-left: 20pt;"><p>Matches and captures a date formatted as dd.mm.yyyy anywhere within the filename, and rearranges it in a standard format of yyyy/mm/dd.
Since <i>run mode</i> is -1, no output occurs.
However, captured match segments are made available for subsequent use.
The three captures, [R1], [R2] and [R3] are arranged in the textual output so that we get the desired year/month/day ordering, such as 2011/08/19.</p></div>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>


====RemoveCharacters(&hellip;): Removes specified characters from a string====
;<span style="font-family: Consolas, monospace;">regex(D03T02 some track.mp3, /#^D(\d+)T(\d+)#/, 1)Disc: [R1], Track: [R2]</span>
: The <i>string</i> is matched against the <i>regexp</i> that is looking for a D followed by any number of digits, followed by a T and then more digits. Those digits were captured, and later used to output the value "Disc: 03, Track: 02".


{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
;<span style="font-family: Consolas, monospace;">if(regex([artist], /#([[:punct:]])#/, 0), [R1] --&gt; [Artist], No Punctuation)</span>
|- id="RemoveCharacters" valign="top"
: Using the default mode 0, [[#Regex|Regex()]] will output a Boolean for use inside a condtional to cause some action to occur based on the match success or failure. This example matches against the artist field looking for any punctuation character. If the match succeeds (a punctuation character was found), that character is output followed by the <i>string</i> " --> " and the artist. In there was no match, the <i>string</i> "No Punctuation" is output.
! scope="row" style="background: #ecedf3; color: #111; " width=100 | RemoveCharacters()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>removecharacters(</b><i>string</i><b>, </b><i>character list</i><b>, </b><i>mode</i><b>)</b></span>
This function will remove from <i>string</i> any characters in the <i>character list</i>. The characters removed depend upon the <i>mode</i> specified.
The function operates in a case-sensitive manner.

Available <i>mode</i> values:

<div style="margin-left: 20pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<tr><td style="text-align:left; padding-right:20pt">0</td><td>Remove all instances</td></tr>
<tr><td style="text-align:left; padding-right:20pt">1</td><td>Remove from the beginning only</td></tr>
<tr><td style="text-align:left; padding-right:20pt">2</td><td>Remove from the end only</td></tr>
<tr><td style="text-align:left; padding-right:20pt">3</td><td>Remove from each end</td></tr>
</table></div>

Argument <i>mode</i> is optional (defaults to 0).

|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>removecharacters(Paper, Ppr)</nowiki></b></span>
<div style="margin-left: 20pt;"><p>Removes TT{P}, TT{p}, and TT{r} from "Paper", resulting in "ae".
The default <i>mode</i> 0 is in effect, removing all instances of the characters specified in the <i>character list</i>.</p></div>
<span style="font-family: Consolas, monospace;"><b><nowiki>removecharacters(Paper, Ppr, 1)</nowiki></b></span>
<div style="margin-left: 20pt;"><p>With <i>mode</i> 1 set, only the inital character TT{P} is removed, resulting in "aper".</p></div>
<span style="font-family: Consolas, monospace;"><b><nowiki>removecharacters(Paper, Ppr, 2)</nowiki></b></span>
<div style="margin-left: 20pt;"><p>In <i>mode</i> 2, only one character from the end of the <i>string</i> are removed, leaving "Pape".</p></div>
<span style="font-family: Consolas, monospace;"><b><nowiki>removecharacters(Paper, Ppr, 3)</nowiki></b></span>
<div style="margin-left: 20pt;"><p>Both the front and back are affected in <i>mode</i> 3, causing the removal of the leading TT{P} and trailing TT{r} resulting in "ape".</p></div>
<span style="font-family: Consolas, monospace;"><b><nowiki>removecharacters([artist], /(/))</nowiki></b></span>
<div style="margin-left: 20pt;"><p>Removes any opening or closing parenthesis from anywhere within the [artist] field.</p></div>
|}
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>
<div style="text-align:right;">([[#top|Back to top)]]</div>

... and more to come...
... and more to come...

Revision as of 04:27, 17 August 2013

Note: The Smartlist and Search - Rules and Modifiers page is now at its permanent home: Smartlist and Search - Rules and Modifiers

Note: The Regex() page is now at its permanent home: MC expression language page

Note: The File Properties page is now at its permanent home: File Properties (tags) page

This is MrC's working space for work-in-progress Wiki pages.

Caution: Debris Ahead...


Functions

Conditional Functions

The functions in this section test one or more arguments to produce either a true or false outcome, and execute specific actions depending upon that result.

Although the expression language does not directly support AND, OR, and XOR, these can be easily emulated. See: Database_Expressions_AND_OR_And_XOR.

The NOT operator ! (exclamation point) may be used in a conditional to invert the sense of the conditional test. Inverting the sense of a test can make reading expressions easier, or support better IfElse() sequences.

If(…): Conditional if-else evaluator

If() if(test expression, true expression, false expression)

The If() function is used to evaluate a test expression, and will output the result of the true expression or false expression, depending upon the evaluation result. The test expression is expected to return a 0 (false value) or a non-zero (true value). Nesting is allowed. If the test expression is preceded by the NOT operator (!, an exclamation point), the sense of the test is inverted. Non-zero values are inverted to 0, and 0 is inverted to 1.

Examples if(isequal([artist], bob dylan, 1), Genius, Mediocre)

Outputs "Genius" when artist is Bob Dylan and "Mediocre" otherwise.

if(isequal([artist], bob dylan, 1), Genius, if(isequal([album], Joshua Tree, 8), Great Album, Mediocre))

This nested If() expression expands on the previous example, by first evaluating if the artist is Bob Dylan, and outputs "Genius" if true. When the artist is not Bob Dylan, the album is then tested to see if it is "Joshua Tree", and if so outputs "Great Album", otherwise outputs "Mediocre".

if(!isempty([comment]), regex([comment], /#^(\\S+\\s+\\S+\\s+\\S+)#/, 1), *No Comment)

Output's the first three words of the comment field; otherwise, outputs *No Comment. By using the NOT operator, the sense of the conditional is inverted so that the more interesting case is moved ahead of the more mundane case.

(Back to top)

IfElse(…): Conditional if-elseif evaluator

IfElse() ifelse(test1, action1, test2, action2, test3, action3, )

The IfElse() conditional provides a convenient mechanism for shortening and more clearly expressing nested conditionals into an alternating sequence of tests and actions. One or more test/action pairs may be specified.

For example, consider a nested sequence of If() tests such as the following pseudo-code:

if (test1)
action1
else if (test2)
action2
else if (test3)
action3

The IfElse() statement may be used to more cleanly express the flow of expression by removing the superfluous internal If() statements, converting the clumsy expression:

if(test1, action1, if(test2, action2, if(test3, action3)))

into the more elegant:

ifelse(test1, action1, test2, action2, test3, action3)

If any of the test expressions test1, etc. are preceded by the NOT operator (!, an exclamation point), the sense of that test is inverted. Non-zero values are inverted to 0, and 0 is inverted to 1.

Examples ifelse(isequal([media type], Audio), Le Tunes, isequal([media type], Video]), Flix)

If media type is audio, outputs "Le Tunes", else if media type is video, outputs "Flix"

ifelse(isequal([artist], Bob Dylan), Genius, isequal([album], Joshua Tree, 8), Great Album, 1, Mediocre)

This example, implements the nested if statements from the If() section above, first testing if the artist is Bob Dylan, and if true, outputs "Genius", otherwise evaluates the second test to determine if the album is "Joshua Tree", and if true, outputs "Great Album", otherwise, performs a final test, in this case a degenerate test of 1 (and 1 is always true), thus outputting the value "Mediocre".

(Back to top)

Test and Comparison Functions

The functions in this section return a Boolean value of either 1 (true) or 0 (false). They are generally used to drive an action specified in one of the Conditional Functions.

Compare(…): Compares two numbers

Compare() compare(value1, operator, value2)

The Compare() function compares two numeric values value1 and value2 using the specified operator.

Available operator values:

=Equivalence
<Less than
<=Less than or equal to
>Greater than
>=Greater than or equal to

Outputs 1 if the comparison is true, and 0 otherwise.

Examples compare([bitrate], <, 320)

Returns 1 when the bitrate is less than 320 (Kbps), and 0 otherwise.

if(compare(math(now() - [date modified, 0]), >, 21), Expired, formatdate([date modified, 0], elapsed))

Outputs the age of files under 21 days old, or 'Expired' for older files.

(Back to top)

IsEqual(…): Compares two values in one of nine specified modes

IsEqual() isequal(value1, value2, mode)

The IsEqual() function compares value1 with value2 using any mode from the list of modes below. Outputs 1 when the comparison succeeds according to the mode, and 0 otherwise. Although the mode is specified as the last argument, the comparison should be mentally read as: value1 mode value2.

Available mode values:

0Case-sensitive string compare for equality
1Case-insensitive string compare for equality
2Numeric compare for equality
3Numeric less than
4Numeric less than or equal to
5Numeric greater than
6Numeric greater than or equal to
7Substring search (case sensitive)
8Substring search (case insensitive)

Argument mode is optional (defaults to 0).

Examples isequal([artist], [album], 1)

If the artist and album values are the same, the output will be 1, otherwise, the output will be 0.

if(isequal([artist], [album], 1), Eponymous, [album])

The If() function basis its decision on the outcome of IsEqual(), so if the artist and album values are the same, the output will be Eponymous, otherwise, the output will be the value of album.

if(isequal([artist], [album], 1), Eponymous/,, [album]/))

This example demonstrates the character 'escaping' mentioned in the overview earlier.

Here, we want the output to be either "Eponymous," (note the inclusion of the comma) or the album value with a closing parenthesis. In order to achieve this, the comma, and the closing parenthesis, are escaped using a forward-slash character.

This informs the expression evaluator that these characters are not part of the expression syntax and are to be treated literally.

if(isequal([filename (path)], classical, 8), Classical, Not Classical)

Because compare mode 8 has been specified, if the word "classical" appears anywhere in the case-insensitive file path, the expression will return Classical, and if not it will return Not Classical.

(Back to top)

IsEmpty(…): Tests a value for emptiness

IsEmpty() isempty(value, mode)

The IsEmpty() function tests the given value for emptiness. The value passed is typically an Media Center field, so that some action may be taken when the field is or is not empty. Returns 1 when the value is empty, otherwise 0.

Available mode values:

0String test (field must be empty to get a positive result)
1Numerical test (field must be empty, or contain 0 to get a positive result)

Note that Media Center does not discriminate between a 0 value and an empty value for fields of type Integer and Decimal - both 0 and empty are considered equivalent for these field types. This is useful for fields such as the integer field Disc #, where an empty or 0 value implies that Disc # contains no useful data, and should be generally ignored or absent in display output.

Pay particular attention to the third example offered below, as it covers a caveat that comes with this particular function.

Argument mode is optional (defaults to 0).

Examples isempty([comment], 0)

If the comment field is empty, IsEmpty() returns 1, otherwise 0.

isempty([track #], 1)

Performs a numerical test for data in the [track #] field. If the field is empty or 0, a 1 is returned, otherwise 0 is returned.

ifelse(!isempty([disc #]), [disc #])

Outputs the value of the disc # field when it is not empty.

(Back to top)

IsRange(…): Tests a value for inclusion within a given range

IsRange() isrange(value, range)

The IsRange() function tests if a value falls within a given range of values. If the value falls within the given range, 1 is returned, otherwise 0 is returned.

A range is specified in the form of low-high, where low and high are either letters or numbers. The lowest value comes first, the highest second. Both low and high must be the same kind (letters or numbers). The low and high values are inclusive.

Example Ranges:

1-100
a-z
c-d
23-7542
Examples isrange([artist], a-c)

Artist values of Abba or Blondie will result in a 1, but ZZ Top will return a 0.

if(isrange([bitrate], 96-191), Poor Quality, High Quality)

Returns Poor Quality for any file whose bitrate falls in the range of 96 to 191, and returns "High Quality" for all bitrates.

Additional Examples

Using IsRange() in a Search List.
(Back to top)

IsMissing(…): Tests to see if a file exists on the system

IsMissing() ismissing(filepath)

The IsMissing() function tests for the existence of a file in the file system. If the file is missing, the function returns 1, otherwise 0 is returned if the file exists. This function is useful for checking for missing files in a Library. IsMissing() treats special entries such as ripped Blu-ray or DVDs as single files, even though they physically exist in the file system as several files and directories.

Note: Any view or list that uses IsMissing() will be slow, is Media Center must interogate each referenced file in the file system. The larger the number of files being queried, the longer it will take to produce results. Use IsMissing() with care.

Argument filepath is optional (defaults to [Filename]).

Examples ismissing()

If the referenced file was not found in the file system, 1 is returned; othewise 0 is returned.

ismissing(C:\Music\My Lost File.mp3)

Checks for "My Lost File.mp3" and returns 1 (positive) if the file does not exist, and 0 (negative) if the file does exist.

if(ismissing(), File is missing, File exists)

Outputs "File is missing" or "File Exists" depending on the result returned by IsMissing().

[=ismissing([filename])]=1

This example demonstrates how to construct an expression for use as a Media Center search query. If you place this in the search field in the top right corner of the program while viewing all of your library, it will filter the list, leaving only the missing files on view. If all files in library exist, this list will be empty. You could also create a view scheme and use this string in the "Set rules for file display" search to give you a view that you can visit periodically to check that your library is not missing any files.

(Back to top)

IsRemovable(…): Tests to see if a file is stored on removable media

IsRemovable() isremovable(filepath)

The IsRemovable() function tests if a file resides on removable media and if so, returns 1, and if not, returns 0. The Media Center field [Removable] also provides the same value for a given file.

Argument filepath is optional (defaults to [Filename]).

Examples isremovable()

Checks if the current file is on removable storage, and if so, returns 1, otherwise returns 0.

(Back to top)

IsInPlayingNow(…): Tests to see if a file is in the Playing Now playlist

IsInPlayingNow() isinplayingnow(filepath)

The IsInPlayingNow() function tests if a file is in any zone's Playing Now list. Used as an expression category, pane or file list column allows distinguishing files that are in the Playing Now list.

Argument filepath is optional (defaults to [Filename]).

Examples isinplayingnow()

If the file in the Playing Now list, returns 1, otherwise returns 0.

if(isinplayingnow(), Queued, Not queued)

If the file in the Playing Now list, returns Queued, otherwise Not queued.

Additional Examples

How to use IsPlaying() and IsInPlayingNow()
(Back to top)

IsPlaying(…): Tests to see if a file is in currently being played

IsPlaying() isplaying(filepath)

The IsPlaying() function tests if a file is playing in any zone. Used as an expression category, pane or file list column allows distinguishing files that are playing now.

Argument filepath is optional (defaults to [Filename]).

Examples IfElse(IsPlaying(), <font color="ff0000">♪<//font>, IsInPlayingNow(), ♪)

This expression in a file list expression column shows which files are in the Playing Now list and which are currently playing by outputing a musical note in the column. The musical note will be displayed in red for any currently playing file.

Additional Examples

How to use IsPlaying() and IsInPlayingNow()
How to play an artist's full work when a genre is shuffling?
(Back to top)

Formatting Functions

The functions in this section format their arguments in specific ways. Some functions are used for formatting values for better presentation, or according to some format, while other functions work on Media Center internal "raw" data to convert to user-friendly formats.

Certain Media Center fields are used to store values in ways that are internally convenient or effecient. But these field values are not terribly useful or meaningful when used directly.

For example, the Duration field holds values as a number seconds of length, while various Date/Time fields such as Date or Last Played store values as floating point numbers specifying a number of days and fractions of a day since a particular epoch time.

Media Center will generally format fields using the "display" format where necessary, such as in panes, file list columns, or various tools such as the Rename, Move & Copy tool. When a function requires a raw field value, or you want to access a raw field value, by sure to use the raw field format. This is done by appending a ,0 to the field's name inside the brackets. Example: [Date Imported,0].

Delimit(…): Outputs a value with head/tail strings when value is non-empty

Delimit() delimit(expression, tail, head)

The Delimit() function outputs the value of expression prepended with a head string and/or appended with a tail string, but only if the value of the expression is non-empty. Nothing is output when the expression evaluates to empty.

Argument tail is optional (defaults to SPACE).

Argument head is optional (defaults to EMPTY).

Examples delimit([Track #], .)

Appends a period after a track number if [Track #] is not empty, such as "12.".

delimit([Date (year)], {, })

Outputs the year surrounded by curly braces, for example "{2012}".

(Back to top)

FormatBoolean(…): Formats a boolean (true / false) value in a specified manner

FormatBoolean() formatboolean(conditional, true string, false string)

The FormatBoolean() function outputs true string and false string values to represent the 0 or 1 Boolean output resulting from the conditional expression. When the conditional evalutes to 1, the true string will be output, otherwise the false string will be output.

Argument true string is optional (defaults to True).

Argument false string is optional (defaults to False).

Examples formatboolean(isempty([number plays]), Never Played, Has Been Played)

Returns "Never Played" when the expression IsEmpty() evaluates to 0, and "Has Been Played" when it evaluates to 1.

formatboolean(math([track #] % 2)

Outputs the default True label for odd track numbers, and the default False label for even ones.

(Back to top)

FormatDuration(…): Presents a duration of seconds in a reader friendly format

FormatDuration() formatduration(duration value)

The FormatDuration() function formats a duration value into a friendly format. The duration value argument is expected to be a value representing a number of seconds, typically used for media file duration. Media Center internally stores duration values in seconds.

Examples formatduration([duration,0])

Outputs a friendly display of the duration field. This is the same output shown using the Duration field in a file list.

formatduration(600)

This will output ten minutes in the format 10:00.

(Back to top)

FormatFileSize(…): Presents a number of bytes in a reader friendly format

FormatFileSize() formatfilesize(bytes value)

The FormatFileSize() function formats a bytes value into a friendly format. The bytes value argument is expected to be a value representing a number of bytes, typically used for media file size. Media Center internally stores file size values in bytes. FormatFileSize() will convert those byte values into unitized friendly formats such as 50 bytes, 3.2 KB or 10.4 MB.

Examples formatfilesize([file size,0])

Outputs a friendly format of the file size field. This is the same output shown using the File Size field in a file list.

formatfilesize(56123456)

Outputs the bytes value 56,123,456 as 53.5 MB.

(Back to top)

FormatNumber(…): Formats and rounds a number to a specified number of decimal places

FormatNumber() formatnumber(value, decimal places, label zero, label plural, label singular)

The FormatNumber() function formats a numeric value to a specified number of decimal places, rounding its value, and optionally outputs value-dependent labels, which can be used to construct more gramatically-correct output. The value can be any numeric value. The decimal places argument specifies the number of digits to be used after the decimal point. Use -1 to output as many decimal places as available.

The label selected depends on the original value, not the resulting formatted value.

The label zero argument is output instead of a formatted value when the original value is 0. When this label is specified as empty, label plural is used. The label plural argument is appended to the formatted value when the original value is more than 1. The label singular argument is appended to the formatted value when the original value is equal to 1.

Note: FormatNumber() will not output additional zero's after the decimal point. In otherwords, FormatNumber() rounds fractional values, but does not zero fill.

Argument decimal places is optional (defaults to 0).

Argument label zero is optional (defaults to label plural).

Argument label plural is optional (defaults to 0).

Argument label singular is optional.

Examples formatnumber([duration,0], 2)

Returns a file's duration (which are in seconds) rounding to two decimal places.

formatnumber([number plays,0], 0, Unplayed, Plays, Play)

Outputs values in whole number formats (no decimals shown). When the number of plays is 0, the output will be "Unplayed".

When it is more than one, such as six, outputs "6 Plays".

And when the number of plays is one, outputs "1 Play".

formatnumber([number plays,0], 0, , Plays, Play)

Same as the previous example, but uses the default value for label zero (which is label plural), so that when number of plays is zero, output is "0 Plays".

formatnumber([number plays,0], , , , Time)

In this example, only label singular argument is specified (as "Time"), so all other arguments use their defaults values. The output will be "0" when number of plays is zero, "1 Time" when number of plays is one, and the actual number of plays for other values (e.g. "6").

(Back to top)

FormatRange(…): Formats a value as a range

FormatRange() formatrange(value, range size, mode)

The FormatRange() function creates numerical or alphabetic groupings of size range size, and returns the grouping where value falls. Only the first character of value is considered and used. The range size is a numerical value specifying how wide the range should be. Numeric ranges are 0-based. The mode specifies the type of range grouping.

Available mode values:

0Automatically choose between number / letter grouping
1Letter grouping
2Number grouping

Argument range size is optional (defaults to 1).

Argument mode is optional (defaults to 0).

Examples formatrange([artist], 3, 1)

Outputs the range that the artist's first letter falls within. With a range size of 3 and using mode 1 (letter grouping), ranges will produced in the form of a-c, d-f, g-i, ...

formatrange([artist])

With range size and mode values left unspecified, default values are used, so automatic range groupings of size 1 are output. Hence, the first character of [artist] will be output.

formatrange([bitrate], 100, 2)

Numeric range groupings of size 100 will be output, for the value of [bitrate]. Possible outputs are: 0-99, 100-199, 200-299, ...

Additional Examples

How to produce 1-based range values.
(Back to top)

Orientation(…): Outputs the orientation of an image

Orientation() orientation()

The Orientation() function outputs one of the following words indicating the orientation of an image file:

PortraitWhen height > width
LandscapeWhen width > height
PortraitWhen height = width
Examples if(isequal(orientation(), Square), Square, Rectangle)

Outputs "Square" for square images or "Rectangle" for portrait and landscape images.

(Back to top)

PadNumber(…): Adds leading zeros to any given number

PadNumber() padnumber(value, number digits)

The PadNumber() function adds leading zeros to any given number value, producing a value of length number digits.

Examples padnumber([track #], 2)

This will pad the track number with leading zeros sufficient to ensure the output is minimally two digits in length.

padnumber(counter(), 4)

Outputs 4 digits of zero-padded numbers produced by Counter(). For example, 0001, 0002, 0003, ...

(Back to top)

RatingStars(…): Outputs the value of Rating as a number of star characters

RatingStars() ratingstars()

The RatingStars() function outputs the Rating field's value as the equivalent number of black star characters.

Examples ratingstars()

For a file that has a Rating of 4, outputs ★★★★.

(Back to top)

Watched(…): Outputs a formatted video bookmark

Watched() watched(mode)

Outputs a video's bookmark position in a human-readable format, using a specified mode.

Available mode values:

0Output a human-readable watched status.
1Output a numeric watched value, 0 if not watched, 1 if partially watched, 2 if entirely watched.
2Output a watched checkmark ✓ if watched

Argument mode is optional (defaults to 0).

Examples watched()

Outputs formatted watched status, such as "57% on Sep 25", or "Aug 21", or nothing when the video has not been watched.

(Back to top)

String Manipulation

The functions in this section are used primarly to manipulate strings. Since the Media Center expression language is primarly string-oriented, these functions provide a means to manipulate field values or the output from other expressions.

Clean(…): Clean a string to be used for various operations

Clean() clean(string, mode)

The Clean() function is generally used to sanitize a string by stripping empty brackets, remove superfluous dash characters, eliminate leading or trailing articles, or replace filesystem-illegal characters. It is typically employed before some operation such as Rename to clean the product of joining various fields, some of which may be empty, or to produce filesystem-safe filenames. It may be used for a variety of purposes, however.

Available mode values:

0Removes empty () and [], superfluous dash (-) and whitespace characters and sometimes comma (be careful)
1Removes the article 'the' from the beginning and ', the' from the end
2Removes any article (a, an, the, etc.) from the beginning and end
3Replaces each filesystem-illegal character \ / : * ? " < > | with an underscore _, and replaces each unprintable character with a space

Argument mode is optional (defaults to 0).

Examples clean([album] - [date])

The concatenation of [Album] - [Date] may leave a dangling " - " string when date is empty. Clean() in the default mode removes this dangling string.

clean(The Beatles, 1)

For sorting or grouping purposes, it is often desirable to remove the leading article "The" from a string. Clean() in mode 1 provides a convenient solution, and in this example produces "Beatles".

clean(AC//DC: Back In Black, 3)

When an expression is to be used to produce a filename, filesystem-illegal characters must be removed or converted to legal characters. Clean() in mode 3 will convert such characters into safe underscores. This example would produce the filesystem-safe value of "AC_DC_ Back In Black".

clean(\//:*?"<>|, 3)

This trivial example demonstrates how all filesystem-illegal characters are converted to underscores, producing the nine-character output "_________" which consists entirely of underscores.

(Back to top)

FixCase(…): Changes the case of a given string

FixCase() fixcase(string, mode)

The FixCase() function will convert the supplied text string according to the specified mode.

Available mode values:

0Title Case
1All Words
2First Word
3All Uppercase
4All Lowercase

Argument mode is optional (defaults to 0).

Examples fixcase(enjoy the silence)

The default mode 0 is used, so the output is "Enjoy the Silence".

fixcase(enjoy the silence, 1)

Using mode 1, all words are uppercased, so the output is "Enjoy The Silence".

fixcase(MY ALbUm IS cAlLeD: adam, 4)

Outputs "my album is called: adam".

(Back to top)

FixSpacing(…): Intelligently splits adjacent camel-cased words

FixSpacing() fixspacing(string, mode)

The FixSpacing() function inserts spaces between adjacent camel-cased words in string. It is useful for helping to clean and convert metadata that favors compactness over standard sentence structure.

Available mode values:

0Disables conversion
1Enables camel-case conversion

Argument mode is optional (defaults to 1).

Examples fixspacing(OneWorld)

Outputs "One World".

fixspacing([name], 1)

Outputs the name field with any camel-case converted into standard sentence structure. If the value of name was, "MiracleOn34thStreet", the output would be "Miracle On 34th Street".

fixspacing(Another [name])

Assuming the same [name] as above, this would return "Another Miracle On 34th Street".

(Back to top)

Hexify(…): Hexifies a string to make it suitable for web usage

Hexify() hexify(string)

The Hexify() function URI encodes a string to make it useable by a browser or search engine. Hexify() is typically used by expressions generating or working on URLs in Media Center's Link Manager.

Examples hexify(Oasis - /(What's The Story/) Morning Glory?)

The result is "Oasis%20-%20%28What%27s%20The%20Story%29%20Morning%20Glory%3F".

(Back to top)

Left(…): Retrieves a specified number of characters from the left of a string

Left() left(string, quantity)

The Left() function retrieves no more than quantity characters from the left of the string.

Examples left([filename], 3)

Return the Windows drive letter, colon and first back-slash from the filename.

(Back to top)

Length(…): Returns the number of characters in a string

Length() length(string)

The Length() function returns the number of characters contained in string.

Examples length(A Simple Plan)

Returns 13.

if(compare(length([filename]), >=, 68), Long, Short)

The length of the filename is calculated, and compared against 68, outputting "Long" when the length is greater than or equal to 68, and "Short" otherwise.

(Back to top)

Mid(…): Retrieves specified characters from a string

Mid() mid(string, start position, quantity)

The Mid() function returns a specified quantity of characters from the start postion in string.

The start postion is 0-based (i.e. the first character is considered position 0). A quantify of -1 returns all characters from the start postion to the end of string.

Argument start position is optional (defaults to 0).

Argument quantity is optional (defaults to 1).

Examples mid(12345)

Returns "1", using is the default quantity (1) of characters from the default start position of (0 - the beginning of the string).

mid(12345, 1, 2)

Returns 2 characters begining at start position 1, which is "23".

Additional Examples

An example that uses Mid() to re-order a date field.
An example that uses Mid() to output a number of stars based on an arbitrary rating value.
(Back to top)

Regex(…): Regular expression pattern matching and capture

Regex() regex(string, regexp, run mode, case sensitivity)

This function performs regular expression (RE) pattern matching on a string. The string is evaluated against the regular expression regexp, and run mode dictates the values output by Regex(). The three modes allow for match testing, capture output, or silent operation.

All match captures are placed into special variables referenced as [R1], [R2], ... [R9], which can be used in later in the expression. The contents of the captures [R1] ... [R9] are available until the end of the expression, or Regex() is run again, whereby they are replaced. The regular expression implementation used prior to Media Cener 19 is the Microsoft 2010 TR1 engine, and in Media Cener 19 it is the Boost engine.

Available run mode values:

0Runs in Boolean test mode, returning either a 1 or 0, indicating whether the string matched (1) or did not match (0) the regexp. This run mode is useful within an If() test, so that different true or false actions may be taken.
1 to 9Outputs the specified Nth capture group's contents, where N ranges from 1 to 9. Only a single capture is output in this mode, but all captures are available in the [R1] ... [R9] capture variables. This run mode is used to easily output a single matching sub-string.
-1Runs in silent mode, with no output being produced. This run mode is useful as a means to capture portions of the string to be later used in subsequent portions of an expression.

The case sensitivity argument toggles the case-sensitivity of regular expression matching. Note that case insensitivity does not apply to characters inside a character class [ ]. Use both uppercase and lowercase characters when necessary to match either case (e.g. [aAbB] to match either uppercase or lowercase A or B).

Available case sensitivity values:

0Ignore case when matching (e.g. the letters E and e are identical)
1Consider case when matching (e.g. the letters E and e are considered different)

The regular expression language assigns special meaning to many characters. A few of these meta-characters, such as forward slash /, comma , and both ( and ) are also reserved and used by the Media Center expression language. To force the Media Center expression engine to ignore the meta-characters in regexp, surround the entire regular expression with /# #/. This is one of Media Center's escapements, which tells the expression engine to ignore everything inside, so that the entire, uninterpreted regexp can be provided to the Regex() regular expression evaluator. Although surrounding regexp by /# #/ is not necessary or required when no conflicting characters are in use, and you may manually escape the expression languages meta-characters with a forward slash /, it is probably a safe practice to always encase every regexp within /# #/.

Argument run mode is optional (defaults to 0).

Argument case sensitivity is optional (defaults to 0).

Examples ifelse(regex([name], /#^(the|an|a)\b#/, 0, 1), Fix your case!)

Searches the name field for any of the lowercse articles "the", "and" and "a" at the beginning of name, and outputs "Fix your case!" when the match succeeds. The run mode is 0 which is a test and capture mode, and case sensitivity is enabled.

if(regex([artist], /#([[:punct:]])#/, 0), [R1] --> [Artist], No Punctuation)

Using the default mode 0, Regex() will output a Boolean for use inside a condtional to cause some action to occur based on the match success or failure.

This example matches against the artist field looking for any punctuation character.

If the match succeeds (a punctuation character was found), that character is output followed by the string " --> " and the artist. In there was no match, the string "No Punctuation" is output.

regex(D03T02 some track.mp3, /#^D(\d+)T(\d+)#/, 1)Disc: [R1], Track: [R2]

The string is matched against the regexp that is looking for a D followed by any number of digits, followed by a T and then more digits. Those digits were captured, and later used to output the value "Disc: 03, Track: 02".

regex([filename (name)], /#^(\d+)-#/, -1)Track number is [R1]

Using run mode -1, the file's name is pattern tested against the regexp which is looking for leading digits followed by a dash. Those digits are captured in buffer [R1] which is used later in the expression. If the file name was "2-foo.mp3", the output would be "Track number is 2".

regex([filename], /#(\d{1,2})\.(\d{1,2}).(\d{4})#/, -1)[R3]//[R1]//[R2]

Matches and captures a date formatted as dd.mm.yyyy anywhere within the filename, and rearranges it in a standard format of yyyy/mm/dd.

Since run mode is -1, no output occurs. However, captured match segments are made available for subsequent use.

The three captures, [R1], [R2] and [R3] are arranged in the textual output so that we get the desired year/month/day ordering, such as 2011/08/19.

(Back to top)

RemoveCharacters(…): Removes specified characters from a string

RemoveCharacters() removecharacters(string, character list, mode)

This function will remove from string any characters in the character list. The characters removed depend upon the mode specified. The function operates in a case-sensitive manner.

Available mode values:

0Remove all instances
1Remove from the beginning only
2Remove from the end only
3Remove from each end

Argument mode is optional (defaults to 0).

Examples removecharacters(Paper, Ppr)

Removes TT{P}, TT{p}, and TT{r} from "Paper", resulting in "ae". The default mode 0 is in effect, removing all instances of the characters specified in the character list.

removecharacters(Paper, Ppr, 1)

With mode 1 set, only the inital character TT{P} is removed, resulting in "aper".

removecharacters(Paper, Ppr, 2)

In mode 2, only one character from the end of the string are removed, leaving "Pape".

removecharacters(Paper, Ppr, 3)

Both the front and back are affected in mode 3, causing the removal of the leading TT{P} and trailing TT{r} resulting in "ape".

removecharacters([artist], /(/))

Removes any opening or closing parenthesis from anywhere within the [artist] field.

(Back to top)


... and more to come...