MrC-temp: Difference between revisions

From wiki.jriver.com
Jump to navigation Jump to search
(in progress update)
(expression page done)
 
(11 intermediate revisions by the same user not shown)
Line 1: Line 1:
'''This is MrC's scratch space for work-in-progress Wiki pages.'''
'''Note:''' The Smartlist and Search - Rules and Modifiers page is now at its permanent home:
[[Smartlist_and_Search_-_Rules_and_Modifiers|Smartlist and Search - Rules and Modifiers]]


'''Note:''' The Regex() page is now at its permanent home: [[Media_Center_expression_language#Regex.28....29:_Regular_expression_pattern_matching_and_capture|MC expression language page]]
: <span style="color: red">'''Note:'''</span> The Expression language page is complete and is now at its permanent home: [[ Media_Center_expression_language#Functions | Expression language functions]]


'''Note:''' The File Properties page is now at its permanent home: [[File_Properties_%28tags%29|File Properties (tags) page]]
: Note: The Smartlist and Search - Rules and Modifiers page is now at its permanent home: [[Smartlist_and_Search_-_Rules_and_Modifiers|Smartlist and Search - Rules and Modifiers]]


: Note: The Regex() page is now at its permanent home: [[Media_Center_expression_language#Regex.28....29:_Regular_expression_pattern_matching_and_capture|MC expression language page]]
== This is MrC's working space for work-in-progress Wiki pages. ==


: Note: The File Properties page is now at its permanent home: [[File_Properties_%28tags%29|File Properties (tags) page]]
Caution: Debris Ahead...


----
==Functions==
===Conditional Functions===


Caution: Debris Ahead...
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 <span style="font-family: Consolas, monospace;"><b>!</b></span> (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|IfElse()]] sequences.
====If(&hellip;): Conditional if-else evaluator====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="If" valign="top"
! 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; 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).
Nesting is allowed.
If the <i>test expression</i> 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.
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>if(isequal([artist], bob dylan, 1), Genius, Mediocre)</nowiki></b></span>
<p style="margin-left:20pt;">Outputs <span style="font-family: Consolas, monospace;">Genius</span> when artist is (case insensitive) Bob Dylan and <span style="font-family: Consolas, monospace;">Mediocre</span> otherwise.</p>
<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>
<p style="margin-left:20pt;">This nested [[#If|If()]] expression expands on the previous example, by first evaluating if the artist is Bob Dylan, and outputs <span style="font-family: Consolas, monospace;">Genius</span> if true.
When the artist is not Bob Dylan, the album is then tested to see if it is <span style="font-family: Consolas, monospace;">Joshua Tree</span>, and if so outputs <span style="font-family: Consolas, monospace;">Great Album</span>, otherwise outputs <span style="font-family: Consolas, monospace;">Mediocre</span>.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>if(!isempty([comment]), regex([comment], /#^(\\S+\\s+\\S+\\s+\\S+)#/, 1), *No Comment)</nowiki></b></span>
<p style="margin-left:20pt;">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 style="text-align:right;">([[#top|Back to top)]]</div>

====IfElse(&hellip;): Conditional if-elseif evaluator====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="IfElse" valign="top"
! 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; 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.
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:
<div style="font-family: Consolas, monospace;">
<div style="margin-left: 20pt">if (<i>test1</i>)</div>
<div style="margin-left: 40pt"><i>action1</i></div>
<div style="margin-left: 20pt">else if (<i>test2</i>)</div>
<div style="margin-left: 40pt"><i>action2</i></div>
<div style="margin-left: 20pt">else if (<i>test3</i>)</div>
<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:

<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:

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

===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|Conditional Functions]].
====Compare(&hellip;): Compares two numbers====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="Compare" valign="top"
! 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; 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 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;">
<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"><b><</b></td><td>Less than</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"><b>></b></td><td>Greater than</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>>=</b></td><td>Greater than or equal to</td></tr>
</table></div>

Outputs 1 if the comparison is true, and 0 otherwise.
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>compare([bitrate], &lt;, 320)</nowiki></b></span>
<p style="margin-left:20pt;">Returns 1 when the bitrate is less than 320 (Kbps), and 0 otherwise.</p>
<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>
<p style="margin-left:20pt;">Outputs the age of files under 21 days old, or <span style="font-family: Consolas, monospace;">Expired</span> for older files.</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====IsEqual(&hellip;): Compares two values in one of nine specified modes====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="IsEqual" valign="top"
! 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; 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.
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>.

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"><b>0</b></td><td>Case-sensitive 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"><b>2</b></td><td>Numeric compare for equality</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"><b>4</b></td><td>Numeric less than or equal to</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"><b>6</b></td><td>Numeric greater than or equal to</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"><b>8</b></td><td>Substring search (case insensitive)</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>isequal([artist], [album], 1)</nowiki></b></span>
<p style="margin-left:20pt;">If the artist and album values are the same, the output will be 1, otherwise, the output will be 0.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>if(isequal([artist], [album], 1), Eponymous, [album])</nowiki></b></span>
<p style="margin-left:20pt;">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>
<span style="font-family: Consolas, monospace;"><b><nowiki>if(isequal([artist], [album], 1), Eponymous/,, [album]/))</nowiki></b></span>
<p style="margin-left:20pt;">This example demonstrates the character escaping mentioned in the overview earlier.
Here, we want the output to be either <span style="font-family: Consolas, monospace;">Eponymous,</span> (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.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>if(isequal([filename (path)], classical, 8), Classical, Not Classical)</nowiki></b></span>
<p style="margin-left:20pt;">Because compare <i>mode</i> 8 has been specified, if the word <span style="font-family: Consolas, monospace;">classical</span> appears anywhere in the case-insensitive file path, the expression will return <span style="font-family: Consolas, monospace;">Classical</span>, and if not it will return <span style="font-family: Consolas, monospace;">Not Classical</span>.</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====IsEmpty(&hellip;): Tests a value for emptiness====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="IsEmpty" valign="top"
! 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; 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.
Returns 1 when the <i>value</i> is empty, otherwise 0.

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"><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"><b>1</b></td><td>Numerical test (field must be empty, or contain 0 to get a positive result)</td></tr>
</table></div>

Note that Media Center does not discriminate between a 0 <i>value</i> and an empty <i>value</i> 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 <i>value</i> 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 <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>isempty([comment], 0)</nowiki></b></span>
<p style="margin-left:20pt;">If the comment field is empty, [[#IsEmpty|IsEmpty()]] returns 1, otherwise 0.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>isempty([track #], 1)</nowiki></b></span>
<p style="margin-left:20pt;">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>
<span style="font-family: Consolas, monospace;"><b><nowiki>ifelse(!isempty([disc #]), [disc #])</nowiki></b></span>
<p style="margin-left:20pt;">Outputs the <i>value</i> of the disc # field when it is not empty.</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====IsRange(&hellip;): Tests a value for inclusion within a given range====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="IsRange" valign="top"
! 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; 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.
If the <i>value</i> falls within the given <i>range</i>, 1 is returned, otherwise 0 is returned.

A <i>range</i> is specified in the form of low-high, where low and high are either letters or numbers.
The lowest <i>value</i> 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:

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

Additional Examples

:[http://wiki.jriver.com/index.php/CD_Reference_Number#Answer_2 Using [[#IsRange|IsRange()]] in a Search List.]
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====IsMissing(&hellip;): Tests to see if a file exists on the system====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="IsMissing" valign="top"
! 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; 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.
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|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|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|IsMissing()]] with care.

Argument <i>filepath</i> is optional (defaults to [Filename]).

|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>ismissing()</nowiki></b></span>
<p style="margin-left:20pt;">If the referenced file was not found in the file system, 1 is returned; othewise 0 is returned.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>ismissing(C:\Music\My Lost File.mp3)</nowiki></b></span>
<p style="margin-left:20pt;">Checks for <span style="font-family: Consolas, monospace;">My Lost File.mp3</span> and returns 1 (positive) if the file does not exist, and 0 (negative) if the file does exist.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>if(ismissing(), File is missing, File exists)</nowiki></b></span>
<p style="margin-left:20pt;">Outputs <span style="font-family: Consolas, monospace;">File is missing</span> or <span style="font-family: Consolas, monospace;">File Exists</span> depending on the result returned by IsMissing().</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>[=ismissing([filename])]=1</nowiki></b></span>
<p style="margin-left:20pt;">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 <span style="font-family: Consolas, monospace;">Set rules for file display</span> search to give you a view that you can visit periodically to check that your library is not missing any files.</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====IsRemovable(&hellip;): Tests to see if a file is stored on removable media====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="IsRemovable" valign="top"
! 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; 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 Media Center field [Removable] also provides the same value for a given file.

Argument <i>filepath</i> is optional (defaults to [Filename]).

|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>isremovable()</nowiki></b></span>
<p style="margin-left:20pt;">Checks if the current file is on removable storage, and if so, returns 1, otherwise returns 0.</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====IsInPlayingNow(&hellip;): Tests to see if a file is in the Playing Now playlist====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="IsInPlayingNow" valign="top"
! 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; 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.
Used as an expression category, pane or file list column allows distinguishing files that are in the Playing Now list.

Argument <i>filepath</i> is optional (defaults to [Filename]).

|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>isinplayingnow()</nowiki></b></span>
<p style="margin-left:20pt;">If the file in the Playing Now list, returns 1, otherwise returns 0.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>if(isinplayingnow(), Queued, Not queued)</nowiki></b></span>
<p style="margin-left:20pt;">If the file in the Playing Now list, returns <span style="font-family: Consolas, monospace;">Queued</span>, otherwise <span style="font-family: Consolas, monospace;">Not queued</span>.</p>

Additional Examples

:[http://yabb.jriver.com/interact/index.php?topic=57461.0 How to use [[#IsPlaying|IsPlaying()]] and [[#IsInPlayingNow|IsInPlayingNow()]]]
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====IsPlaying(&hellip;): Tests to see if a file is in currently being played====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="IsPlaying" valign="top"
! 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; 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.
Used as an expression category, pane or file list column allows distinguishing files that are playing now.

Argument <i>filepath</i> is optional (defaults to [Filename]).

|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|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>
<p style="margin-left:20pt;">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>

Additional Examples

:[http://yabb.jriver.com/interact/index.php?topic=57461.0 How to use [[#IsPlaying|IsPlaying()]] and [[#IsInPlayingNow|IsInPlayingNow()]]]

:[http://yabb.jriver.com/interact/index.php?topic=58137.msg393905#msg393905 How to play an artist's full work when a genre is shuffling?]
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

===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 <span style="font-family: Consolas, monospace;"><b>,0</b></span> to the field's name inside the brackets, for example <span style="font-family: Consolas, monospace;">[Date Imported,0]</span>.
====Delimit(&hellip;): Outputs a value with head/tail strings when value is non-empty====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="Delimit" valign="top"
! 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; 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.

Argument <i>tail</i> is optional (defaults to SPACE).

Argument <i>head</i> is optional (defaults to EMPTY).

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

====FormatBoolean(&hellip;): Formats a boolean (true / false) value in a specified manner====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="FormatBoolean" valign="top"
! 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; 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.
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.

Argument <i>true string</i> is optional (defaults to True).

Argument <i>false string</i> is optional (defaults to False).

|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|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>
<p style="margin-left:20pt;">Returns <span style="font-family: Consolas, monospace;">Never Played</span> when the expression [[#IsEmpty|IsEmpty()]] evaluates to 0, and <span style="font-family: Consolas, monospace;">Has Been Played</span> when it evaluates to 1.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>formatboolean(math([track #] % 2)</nowiki></b></span>
<p style="margin-left:20pt;">Outputs the default True label for odd track numbers, and the default False label for even ones.</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====FormatDuration(&hellip;): Presents a duration of seconds in a reader friendly format====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="FormatDuration" valign="top"
! 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; 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 <i>duration value</i> 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.
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>formatduration([duration,0])</nowiki></b></span>
<p style="margin-left:20pt;">Outputs a friendly display of the duration field. This is the same output shown using the Duration field in a file list.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>formatduration(600)</nowiki></b></span>
<p style="margin-left:20pt;">This will output ten minutes in the format <span style="font-family: Consolas, monospace;">10:00</span>.</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====FormatFileSize(&hellip;): Presents a number of bytes in a reader friendly format====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="FormatFileSize" valign="top"
! 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; 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 <i>bytes value</i> 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|FormatFileSize()]] will convert those byte values into unitized friendly formats such as 50 bytes, 3.2 KB or 10.4 MB.
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>formatfilesize([file size,0])</nowiki></b></span>
<p style="margin-left:20pt;">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>
<span style="font-family: Consolas, monospace;"><b><nowiki>formatfilesize(56123456)</nowiki></b></span>
<p style="margin-left:20pt;">Outputs the <i>bytes value</i> 56,123,456 as <span style="font-family: Consolas, monospace;">53.5 MB</span>.</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====FormatNumber(&hellip;): Formats and rounds a number to a specified number of decimal places====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="FormatNumber" valign="top"
! 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; 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 <i>value</i> can be any numeric <i>value</i>.
The <i>decimal places</i> argument specifies the number of digits to be used after the decimal point. Use -1 to output as many <i>decimal places</i> as available.

The label selected depends on the original <i>value</i>, not the resulting formatted <i>value</i>.

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

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

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

Argument <i>label zero</i> is optional (defaults to <i>label plural</i>).

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

Argument <i>label singular</i> is optional.

|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>formatnumber([duration,0], 2)</nowiki></b></span>
<p style="margin-left:20pt;">Returns a file's duration (which are in seconds) rounding to two <i>decimal places</i>.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>formatnumber([number plays,0], 0, Unplayed, Plays, Play)</nowiki></b></span>
<p style="margin-left:20pt;">Outputs values in whole number formats (no decimals shown). When the number of plays is 0, the output will be <span style="font-family: Consolas, monospace;">Unplayed</span>.
When it is more than one, such as six, outputs <span style="font-family: Consolas, monospace;">6 Plays</span>.
And when the number of plays is one, outputs <span style="font-family: Consolas, monospace;">1 Play</span>.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>formatnumber([number plays,0], 0, , Plays, Play)</nowiki></b></span>
<p style="margin-left:20pt;">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 <span style="font-family: Consolas, monospace;">0 Plays</span>.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>formatnumber([number plays,0], , , , Time)</nowiki></b></span>
<p style="margin-left:20pt;">In this example, only <i>label singular</i> argument is specified (as <span style="font-family: Consolas, monospace;">Time</span>), so all other arguments use their defaults values.
The output will be <span style="font-family: Consolas, monospace;">0</span> when number of plays is zero, <span style="font-family: Consolas, monospace;">1 Time</span> when number of plays is one, and the actual number of plays for other values (e.g. <span style="font-family: Consolas, monospace;">6</span>).</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====FormatRange(&hellip;): Formats a value as a range====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="FormatRange" valign="top"
! 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; 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.
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>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;">
<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"><b> 1</b></td><td>Letter grouping</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b> 2</b></td><td>Number grouping</td></tr>
</table></div>

Argument <i>range size</i> is optional (defaults to 1).

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>formatrange([artist], 3, 1)</nowiki></b></span>
<p style="margin-left:20pt;">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 be produced in the form of
<span style="font-family: Consolas, monospace;">a-c</span>, <span style="font-family: Consolas, monospace;">d-f</span>, <span style="font-family: Consolas, monospace;">g-i</span>, etc.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>formatrange([artist])</nowiki></b></span>
<p style="margin-left:20pt;">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.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>formatrange([bitrate], 100, 2)</nowiki></b></span>
<p style="margin-left:20pt;">Numeric range groupings of size 100 will be output, for the <i>value</i> of [bitrate]. Possible outputs are: <span style="font-family: Consolas, monospace;">0-99</span>, <span style="font-family: Consolas, monospace;">100-199</span>, <span style="font-family: Consolas, monospace;">200-299</span>, etc.</p>

Additional Examples

:[http://wiki.jriver.com/index.php/CD_Reference_Number How to produce 1-based range values.]
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====Orientation(&hellip;): Outputs the orientation of an image====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="Orientation" valign="top"
! 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; 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:

<div style="margin-left: 20pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<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">Landscape</td><td>When width > height</td></tr>
<tr><td style="text-align:left; padding-right:20pt">Portrait</td><td>When height = width</td></tr>
</table></div>
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>if(isequal(orientation(), Square), Square, Rectangle)</nowiki></b></span>
<p style="margin-left:20pt;">Outputs <span style="font-family: Consolas, monospace;">Square</span> for square images or <span style="font-family: Consolas, monospace;">Rectangle</span> for portrait and landscape images.</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====PadNumber(&hellip;): Adds leading zeros to any given number====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="PadNumber" valign="top"
! 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; 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>.
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>padnumber([track #], 2)</nowiki></b></span>
<p style="margin-left:20pt;">This will pad the track number with leading zeros sufficient to ensure the output is minimally two digits in length.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>padnumber(counter(), 4)</nowiki></b></span>
<p style="margin-left:20pt;">Outputs 4 digits of zero-padded numbers produced by [[#Counter|Counter()]]. For example, <span style="font-family: Consolas, monospace;">0001</span>, <span style="font-family: Consolas, monospace;">0002</span>, <span style="font-family: Consolas, monospace;">0003</span>,
etc.</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====RatingStars(&hellip;): Outputs the value of Rating as a number of star characters====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="RatingStars" valign="top"
! 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; 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.
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>ratingstars()</nowiki></b></span>
<p style="margin-left:20pt;">For a file that has a Rating of 4, outputs &#9733;&#9733;&#9733;&#9733;.</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====Watched(&hellip;): Outputs a formatted video bookmark====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="Watched" valign="top"
! 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; font-size:110%"><b>watched(</b><i>mode</i><b>)</b></span>
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;">
<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"><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"><b>2</b></td><td>Output a watched checkmark &#x2713; if watched</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>watched()</nowiki></b></span>
<p style="margin-left:20pt;">Outputs formatted watched status, such as <span style="font-family: Consolas, monospace;">57% on Sep 25</span>, or <span style="font-family: Consolas, monospace;">Aug 21</span>, or nothing when the video has not been watched.</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

===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(&hellip;): Clean a string to be used for various operations====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="Clean" valign="top"
! 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; 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.
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:

<div style="margin-left: 20pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<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"><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"><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"><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>

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>clean([album] - [date])</nowiki></b></span>
<p style="margin-left:20pt;">The concatenation of [Album] - [Date] may leave a dangling <span style="font-family: Consolas, monospace;"> - </span> <i>string</i> when date is empty. [[#Clean|Clean()]] in the default <i>mode</i> removes this dangling <i>string</i>.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>clean(The Beatles, 1)</nowiki></b></span>
<p style="margin-left:20pt;">For sorting or grouping purposes, it is often desirable to remove the leading article <span style="font-family: Consolas, monospace;">The</span> from a <i>string</i>. [[#Clean|Clean()]] in <i>mode</i> 1 provides a convenient solution, and in this example produces <span style="font-family: Consolas, monospace;">Beatles</span>.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>clean(AC//DC: Back In Black, 3)</nowiki></b></span>
<p style="margin-left:20pt;">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 <span style="font-family: Consolas, monospace;">AC_DC_ Back In Black</span>.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>clean(\//:*?"&lt;&gt;|, 3)</nowiki></b></span>
<p style="margin-left:20pt;">This trivial example demonstrates how all filesystem-illegal characters are converted to underscores,
producing the nine-character output <span style="font-family: Consolas, monospace;">_________</span> which consists entirely of underscores.</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====FixCase(&hellip;): Changes the case of a given string====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="FixCase" valign="top"
! 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; 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> 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;">
<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"><b>1</b></td><td>All Words</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"><b>3</b></td><td>All Uppercase</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>4</b></td><td>All Lowercase</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>fixcase(enjoy the silence)</nowiki></b></span>
<p style="margin-left:20pt;">The default <i>mode</i> 0 is used, so the output is <span style="font-family: Consolas, monospace;">Enjoy the Silence</span>.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>fixcase(enjoy the silence, 1)</nowiki></b></span>
<p style="margin-left:20pt;">Using <i>mode</i> 1, all words are uppercased, so the output is <span style="font-family: Consolas, monospace;">Enjoy The Silence</span>.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>fixcase(MY ALbUm IS cAlLeD: adam, 4)</nowiki></b></span>
<p style="margin-left:20pt;">Outputs <span style="font-family: Consolas, monospace;">my album is called: adam</span>.</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====FixSpacing(&hellip;): Intelligently splits adjacent camel-cased words====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="FixSpacing" valign="top"
! 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; 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>.
It is useful for helping to clean and convert metadata that favors compactness over standard sentence structure.

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"><b>0</b></td><td>Disables 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>

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

|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>fixspacing(OneWorld)</nowiki></b></span>
<p style="margin-left:20pt;">Outputs <span style="font-family: Consolas, monospace;">One World</span>.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>fixspacing([name], 1)</nowiki></b></span>
<p style="margin-left:20pt;">Outputs the name field with any camel-case converted into standard sentence structure.
If the value of name was, <span style="font-family: Consolas, monospace;">MiracleOn34thStreet</span>, the output would be <span style="font-family: Consolas, monospace;">Miracle On 34th Street</span>.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>fixspacing(Another [name])</nowiki></b></span>
<p style="margin-left:20pt;">Assuming the same [name] as above, this would return <span style="font-family: Consolas, monospace;">Another Miracle On 34th Street</span>.</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====Hexify(&hellip;): Hexifies a string to make it suitable for web usage====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="Hexify" valign="top"
! 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; 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.
[[#Hexify|Hexify()]] is typically used by expressions generating or working on URLs in Media Center's Link Manager.
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>hexify(Oasis - /(What's The Story/) Morning Glory?)</nowiki></b></span>
<p style="margin-left:20pt;">The result is <span style="font-family: Consolas, monospace;">Oasis%20-%20%28What%27s%20The%20Story%29%20Morning%20Glory%3F</span>.</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====Left(&hellip;): Retrieves a specified number of characters from the left of a string====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="Left" valign="top"
! 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; 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>.
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>left([filename], 3)</nowiki></b></span>
<p style="margin-left:20pt;">Return the Windows drive letter, colon and first back-slash from the filename.</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====Length(&hellip;): Returns the number of characters in a string====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="Length" valign="top"
! 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; 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>.
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>length(A Simple Plan)</nowiki></b></span>
<p style="margin-left:20pt;">Returns 13.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>if(compare(length([filename]), &gt;=, 68), Long, Short)</nowiki></b></span>
<p style="margin-left:20pt;">The length of the filename is calculated, and compared against 68, outputting <span style="font-family: Consolas, monospace;">Long</span> when the length is greater than or equal to 68, and <span style="font-family: Consolas, monospace;">Short</span> otherwise.</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====Mid(&hellip;): Retrieves specified characters from a string====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="Mid" valign="top"
! 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; 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 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 <i>string</i>.

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

Argument <i>quantity</i> is optional (defaults to 1).

|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>mid(12345)</nowiki></b></span>
<p style="margin-left:20pt;">Returns <span style="font-family: Consolas, monospace;">1</span>, 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>
<span style="font-family: Consolas, monospace;"><b><nowiki>mid(12345, 1, 2)</nowiki></b></span>
<p style="margin-left:20pt;">Returns 2 characters begining at <i>start position</i> 1, which is <span style="font-family: Consolas, monospace;">23</span>.</p>

Additional Examples

:[http://yabb.jriver.com/interact/index.php?topic=52809.0 An example that uses [[#Mid|Mid()]] to re-order a date field.]

:[http://yabb.jriver.com/interact/index.php?topic=75891.0 An example that uses [[#Mid|Mid()]] to output a number of stars based on an arbitrary rating value.]
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====Regex(&hellip;): Regular expression pattern matching and capture====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="Regex" valign="top"
! 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; 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>
The [[#Regex|Regex()]] 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 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|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 <i>run 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"><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"><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"><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>

The <i>case sensitivity</i> argument toggles the case-sensitivity of regular expression matching.
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>).

Available <i>case sensitivity</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"><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"><b>1</b></td><td>Consider case when matching (e.g. the letters E and e are considered different)</td></tr>
</table></div>

The regular expression language assigns special meaning to many characters.
A few of these meta-characters, such as forward slash <span style="font-family: Consolas, monospace;">/</span>, comma <span style="font-family: Consolas, monospace;">,</span> and both <span style="font-family: Consolas, monospace;">(</span> and <span style="font-family: Consolas, monospace;">)</span> are also reserved and used by the Media Center expression language.
To force the Media Center expression engine to ignore the meta-characters in <i>regexp</i>, surround the entire regular expression with <span style="font-family: Consolas, monospace;">/#</span> <span style="font-family: Consolas, monospace;">#/</span>.
This is one of Media Center's escapements, which tells the expression engine to ignore everything inside, so that the entire, uninterpreted <i>regexp</i> can be provided to the [[#Regex|Regex()]] regular expression evaluator.
Although surrounding <i>regexp</i> by <span style="font-family: Consolas, monospace;">/#</span> <span style="font-family: Consolas, monospace;">#/</span> 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 <span style="font-family: Consolas, monospace;">/</span>, it is probably a safe practice to always encase every <i>regexp</i> within <span style="font-family: Consolas, monospace;">/#</span> <span style="font-family: Consolas, monospace;">#/</span>.

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

Argument <i>case sensitivity</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>ifelse(regex([name], /#^(the|an|a)\b#/, 0, 1), Fix your case!)</nowiki></b></span>
<p style="margin-left:20pt;">Searches the name field for any of the lowercase articles <span style="font-family: Consolas, monospace;">the</span>, <span style="font-family: Consolas, monospace;">and</span> and <span style="font-family: Consolas, monospace;">a</span> at the beginning of name, and outputs <span style="font-family: Consolas, monospace;">Fix your case!</span> when the match succeeds.
The <i>run mode</i> is 0 which is a test and capture mode, and <i>case sensitivity</i> is enabled.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>if(regex([artist], /#([[:punct:]])#/, 0), [R1] --&gt; [Artist], No Punctuation)</nowiki></b></span>
<p style="margin-left:20pt;">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> <span style="font-family: Consolas, monospace;"> --> </span> and the artist. In there was no match, the <i>string</i> <span style="font-family: Consolas, monospace;">No Punctuation</span> is output.</p>
<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>
<p style="margin-left:20pt;">The <i>string</i> is matched against the <i>regexp</i> that is looking for a <span style="font-family: Consolas, monospace;">D</span> followed by any number of digits, followed by a <span style="font-family: Consolas, monospace;">T</span> and then more digits.
Those digits were captured, and later used to output the value <span style="font-family: Consolas, monospace;">Disc: 03, Track: 02</span>.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>regex([filename (name)], /#^(\d+)-#/, -1)Track number is [R1]</nowiki></b></span>
<p style="margin-left:20pt;">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 <span style="font-family: Consolas, monospace;">2-foo.mp3</span>, the output would be <span style="font-family: Consolas, monospace;">Track number is 2</span>.</p>
<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>
<p style="margin-left:20pt;">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 <span style="font-family: Consolas, monospace;">2011/08/19</span>.</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====RemoveCharacters(&hellip;): Removes a list of characters from a string====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="RemoveCharacters" valign="top"
! 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>
The [[#RemoveCharacters|RemoveCharacters()]] 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"><b>0</b></td><td>Remove all instances</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>1</b></td><td>Remove from the beginning only</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>2</b></td><td>Remove from the end only</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>3</b></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>
<p style="margin-left:20pt;">Removes <span style="font-family: Consolas, monospace;">P</span>, <span style="font-family: Consolas, monospace;">p</span>, and <span style="font-family: Consolas, monospace;">r</span> from <span style="font-family: Consolas, monospace;">Paper</span>, resulting in <span style="font-family: Consolas, monospace;">ae</span>.
The default <i>mode</i> 0 is in effect, removing all instances of the characters specified in the <i>character list</i>.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>removecharacters(Paper, Ppr, 1)</nowiki></b></span>
<p style="margin-left:20pt;">With <i>mode</i> 1 set, only the inital character <span style="font-family: Consolas, monospace;">P</span> is removed, resulting in <span style="font-family: Consolas, monospace;">aper</span>.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>removecharacters(Paper, Ppr, 2)</nowiki></b></span>
<p style="margin-left:20pt;">In <i>mode</i> 2, only one character from the end of the <i>string</i> are removed, leaving "Pape.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>removecharacters(Paper, Ppr, 3)</nowiki></b></span>
<p style="margin-left:20pt;">Both the front and back are affected in <i>mode</i> 3, causing the removal of the leading <span style="font-family: Consolas, monospace;">P</span> and trailing <span style="font-family: Consolas, monospace;">r</span> resulting in <span style="font-family: Consolas, monospace;">ape</span>.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>removecharacters([artist], /(/))</nowiki></b></span>
<p style="margin-left:20pt;">Removes any <span style="font-family: Consolas, monospace;">(</span> and <span style="font-family: Consolas, monospace;">)</span> characters from anywhere within the [artist] field.</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====RemoveLeft(&hellip;): Trims characters from the beginning of a string====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="RemoveLeft" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | RemoveLeft()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>removeleft(</b><i>string</i><b>, </b><i>quantity</i><b>)</b></span>
The [[#RemoveLeft|RemoveLeft()]] function removes a specified <i>quantity</i> of characters from the left side of a <i>string</i>.
If the <i>quantity</i> is larger than the length of the <i>string</i>, the output will be empty.
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>removeleft(Good Deeds, 5)</nowiki></b></span>
<p style="margin-left:20pt;">Removes the first 5 characters from resulting in <span style="font-family: Consolas, monospace;">Deeds</span> being output.</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====RemoveRight(&hellip;): Trims characters from the end of a string====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="RemoveRight" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | RemoveRight()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>removeright(</b><i>string</i><b>, </b><i>quantity</i><b>)</b></span>
The [[#RemoveRight|RemoveRight()]] function removes a specified <i>quantity</i> of characters from the right side of a <i>string</i>.
If the <i>quantity</i> is larger than the length of the <i>string</i>, the output will be empty.
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>removeright(03-02-1959,5)</nowiki></b></span>
<p style="margin-left:20pt;">Removes the last 5 characters from the given date, leaving only the month and year <span style="font-family: Consolas, monospace;">03-02</span>.</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====Replace(&hellip;): Replace or remove a string segment====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="Replace" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | Replace()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>replace(</b><i>string</i><b>, </b><i>old</i><b>, </b><i>new</i><b>)</b></span>
The [[#Replace|Replace()]] function replaces all instances of <i>old</i> within <i>string</i> with <i>new</i>.
If <i>new</i> is unspecified, it defaults to an empty value, causing <i>old</i> to be removed.
[[#Replace|Replace()]] operates in a case-sensitive manner.

Argument <i>new</i> is optional (defaults to EMPTY).

|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>replace(The Daily Show with John Oliver, hn Oliver, n Stewart)</nowiki></b></span>
<p style="margin-left:20pt;">Now that John Oliver has completed his summer stand-in for Jon Stewart, it is time for a replacement.
The <i>old</i> sequence <span style="font-family: Consolas, monospace;">hn Oliver</span> will be replaced with the <i>new</i> sequence <span style="font-family: Consolas, monospace;">n Stewart</span>, resulting in
<span style="font-family: Consolas, monospace;">The Daily Show with Jon Stewart</span>.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>replace(Sample String, s, Replaced)</nowiki></b></span>
<p style="margin-left:20pt;">In this example, the original <i>string</i> does not contain the <i>old</i> value <span style="font-family: Consolas, monospace;">s</span> anywhere,
so no replacement occurs and the original <i>string</i> is returned.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>replace(Led Zeppelin.[remastered], .[remastered])</nowiki></b></span>
<p style="margin-left:20pt;">Removes the trailing <i>old</i> value <span style="font-family: Consolas, monospace;">.[remastered]</span> from the original <i>string</i>, resulting in <span style="font-family: Consolas, monospace;">Led Zeppelin</span>.
Because no <i>new</i> <i>string</i> is specified, the default empty value is used as a replacement,
effectively stripping the <i>old</i> value.</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====Right(&hellip;): Retrieves a specified number of characters from the right of a string====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="Right" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | Right()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>right(</b><i>string</i><b>, </b><i>quantity</i><b>)</b></span>
The [[#Right|Right()]] function retrieves the specified <i>quantity</i> of characters from the right of the <i>string</i>.
If <i>quantity</i> is larger than the length of <i>string</i>, the original <i>string</i> is returned.
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>right([filename], 3)</nowiki></b></span>
<p style="margin-left:20pt;">Returns the last three characters from the filename (typically this is the file's suffix).</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

===List Manipulation===
Media Center supports several different types of fields, one of them being the List type.
A List type is a library field of type List, or an expression coerced into a list type.

The functions in this section provide the ability to manipulate lists and list items.
A list is a sequence of strings, each separated from one another by an arbitrary delimiter.
The default delimiter is a semicolon.
Media Center does not make a strict distinction between a string and a list of strings.
In fact, a list is just a string, and it is safe to think of a string as a list with zero or more
arbitrary delimiter sequences.
For example, the string "2013-08-17" can be thought of as a dash-delimited list with the three items "2013", "08" and "17".

This weak typing is very useful since a list,
for example, "John; Sally" that contains the two items "John" and "Sally" can be manipulated not only using the
list functions in this section, but because it is just a string, it can also be manipulated with string functions.
For example, taking the same list above and combining it with the string "; Joe" adds a new item
to the list "John; Sally; Joe", and removing the first 6 characters with [[#RemoveLeft|RemoveLeft()]] would
produce a now shortened string/list "Sally; Joe".
The list manipulation functions make this job easier, especially when using the default semicolon delimiter.
Furthermore, since any character or sequence of characters can be considered as a list delimiter,
any string can be treated as a list, and the functions in this section can be used on any string as needed.

In some areas such as a panes column, or a category view, Media Center gives special treatment to List types.
For example, using semicolon as the delimiter, a List will be automatically split apart into its individual items.
====ListBuild(&hellip;): Constructs a list from a series of items====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="ListBuild" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | ListBuild()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>listbuild(</b><i>mode</i><b>, </b><i>delimiter</i><b>, </b><i>item1</i><b>, </b><i>item2</i><b>, </b><i>&hellip;</i><b>)</b></span>
The [[#ListBuild|ListBuild()]] function constructs a list from <i>item1</i>, <i>item2</i>, ... using a supplied delimter to separate the individual items in the resulting list.
The construction <i>mode</i> affects how empty items are handled - they can be included or excluded.
The <i>mode</i> typically used exclude empty items, so that lists do not contain empty slots.
However, there are occasions when retaining empty slots is useful, such as when using a list to act like an array where data is stored in particular slots so that the [[#ListItem|ListItem()]] function may later retrieve values at a given index.
It can also be useful when calculating several expressions and combining the results into a single list for presentation; by including all items, items can be made to line-up for visual inspection in a column.

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"><b>0</b></td><td>Include empty values</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>1</b></td><td>Exclude empty values</td></tr>
</table></div>

The <i>delimiter</i> argument specifies the character or character sequence to be inserted in between items in the list.
An unspecified <i>delimiter</i> will result in a delimiterless concatenation of the supplied arguments <i>item1</i>, <i>item2</i>, etc.

Argument <i>delimiter</i> is optional (defaults to EMPTY).

|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>listbuild(1, ;, Bennie, June)</nowiki></b></span>
<p style="margin-left:20pt;">Returns a standard semicolon-separated list containing two items <span style="font-family: Consolas, monospace;">Bennie; June</span>.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>listbuild(1, \, [album artist (auto)], [album])</nowiki></b></span>
<p style="margin-left:20pt;">Builds a backslash-separated list combining the two fields album artist (auto) and album.
This is useful for building panes column or categories hierarchies in a view.</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>

====ListClean(&hellip;): Various list operations====

{| style="width: 100%; border: 2px solid black;" align="top" cellpadding="3"
|- id="ListClean" valign="top"
! scope="row" style="background: #ecedf3; color: #111; " width=100 | ListClean()
| style="background: #f9f9f9; color: #111; " width=1200 | <span style="font-family: Consolas, monospace; color:#0f3f8d; font-size:110%"><b>listclean(</b><i>list</i><b>, </b><i>mode</i><b>, </b><i>delimiter</i><b>)</b></span>
The [[#ListClean|ListClean()]] function performs one of the operations specified by <i>mode</i> on the given <i>list</i>.
The specified <i>delimiter</i> separates <i>list</i> items.

<div style="margin-left: 20pt;"><table style="background:#f9f9f9; border-spacing:0px; border-collapse:collapse;">
<tr><td style="text-align:left; padding-right:20pt"><b>1</b></td><td>Remove duplicates</td></tr>
<tr><td style="text-align:left; padding-right:20pt"><b>2</b></td><td>Reverse the order of items</td></tr>
</table></div>

Argument <i>delimiter</i> is optional (defaults to ;).


----
|- valign="top"
! scope="row" style="background: #ecedf3; color: #111; " | Examples
|style="background: #f9f9f9; color: #111; " | <span style="font-family: Consolas, monospace;"><b><nowiki>listclean(c;b;c;a, 1)</nowiki></b></span>
<p style="margin-left:20pt;">Removes duplicates from the <i>list</i>, returning <span style="font-family: Consolas, monospace;">c;b;a</span>.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>listclean(d;c;b;a, 2) </nowiki></b></span>
<p style="margin-left:20pt;">Reverses the <i>list</i> items, returning <span style="font-family: Consolas, monospace;">a;b;c;d</span>.</p>
<span style="font-family: Consolas, monospace;"><b><nowiki>listclean(\a\x\x\x\z, 1, \) </nowiki></b></span>
<p style="margin-left:20pt;">Removes duplicates from a backslash-separated <i>list</i>, returning <span style="font-family: Consolas, monospace;">\a\x\z</span>.</p>
|}
<div style="text-align:right;">([[#top|Back to top)]]</div>


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

Latest revision as of 19:18, 26 August 2013

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

Note: The Expression language page is complete and is now at its permanent home: Expression language functions
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

Caution: Debris Ahead...


... and more to come...