Difference between revisions of "Media Center expression language-NEW"

From JRiverWiki
Jump to: navigation, search
Line 12: Line 12:
 
* The player information bar
 
* The player information bar
 
* The image playback caption
 
* The image playback caption
 +
* A view scheme search list
 
* The "Rename, Move or Copy Files" tool
 
* The "Rename, Move or Copy Files" tool
 
* The tag window
 
* The tag window
Line 22: Line 23:
 
* The links manager (''Use expressions to format the URLs for your links'')
 
* The links manager (''Use expressions to format the URLs for your links'')
  
Any given expression can only work on any given single file. It is not possible to compare a field in one file with a field in another file.
+
<ins>'''Any given expression can only work on any given single file. It is not possible to compare a field in one file with a field in another file.'''</ins>
  
 
====Fields====
 
====Fields====
Line 110: Line 111:
 
! scope="row" style="background: #A8E4A0; color: black; border: 1px solid black" | IsRange()
 
! scope="row" style="background: #A8E4A0; color: black; border: 1px solid black" | IsRange()
 
|style="border: 1px solid black" | IsRange allows us to test if any given field falls inside any given range of values. If the field falls inside the given range, the function returns 1, and if outside the given range, the function returns 0. ||style="border: 1px solid black" | '''IsRange([Field to Test],Specified-Range)'''
 
|style="border: 1px solid black" | IsRange allows us to test if any given field falls inside any given range of values. If the field falls inside the given range, the function returns 1, and if outside the given range, the function returns 0. ||style="border: 1px solid black" | '''IsRange([Field to Test],Specified-Range)'''
''The range to test for can be letters or numbers, separated by a hyphen, without spaces, lowest value first, highest second.''
+
''The range to test for can be letters or numbers, separated by a hyphen, without spaces, lowest value first, highest second. Letters and numbers cannot be mixed, the range can only be one or the other''
 
* ''1-100''
 
* ''1-100''
 
* ''a-z''
 
* ''a-z''
 +
* ''c-d''
 +
* ''23-7542''
 
|style="border: 1px solid black" | '''isrange([artist],a-c)'''
 
|style="border: 1px solid black" | '''isrange([artist],a-c)'''
 
''Abba or Blondie will return 1 (positive), and ZZ Top will return 0 (negative).''
 
''Abba or Blondie will return 1 (positive), and ZZ Top will return 0 (negative).''
Line 120: Line 123:
 
''This expression will output "Poor Quality" for any file where the bitrate fall between falls between 96 and 191, and "High Quality" for all others. Note that expressions are only as good as the instructions given, and that the above expression would label files with bitrates less than 96kbps as "High Quality". If this expression were used to add a category to a view, there would be two selectable choices in the category, Low Quality, and High Quality. Selecting either one would then filter the file list accordingly.''
 
''This expression will output "Poor Quality" for any file where the bitrate fall between falls between 96 and 191, and "High Quality" for all others. Note that expressions are only as good as the instructions given, and that the above expression would label files with bitrates less than 96kbps as "High Quality". If this expression were used to add a category to a view, there would be two selectable choices in the category, Low Quality, and High Quality. Selecting either one would then filter the file list accordingly.''
  
'''[http://yabb.jriver.com/interact/index.php?topic=38566.msg262229#msg262229 This post]''' ''on Interact shows the use of IsRange in a Search List. (right click the link, open in new tab to keep this page open). The expression format in that post shows how to form expressions for use in standard MEDIA CENTER searches, something that is also'' [[#When, Where and How to use expressions|covered later on this page.]]
+
'''[http://yabb.jriver.com/interact/index.php?topic=38566.msg262229#msg262229 This post]''' ''on Interact shows the use of IsRange in a Search List. (right click the link, open in new tab to keep this page open). The expression format in that post shows how to form expressions for use in standard MEDIA CENTER searches, something that is also covered later'' [[#When, Where and How to use expressions|on this page.]]
 
 
 
 
 
|-
 
|-
 
|- valign="top"
 
|- valign="top"
 
! scope="row" style="background: #A8E4A0; color: black; border: 1px solid black" | IsMissing()
 
! scope="row" style="background: #A8E4A0; color: black; border: 1px solid black" | IsMissing()
|style="border: 1px solid black" | A ||style="border: 1px solid black" | B ||style="border: 1px solid black" | C
+
|style="border: 1px solid black" | This function checks to see if a file exists on the system. If the file is missing, the function returns 1 (positive), and if the file is found, the function returns 0 (negative). It is possible to specify a specific file to check for, but if you know that much, it will be quicker to fire up explorer and check yourself. This function comes in handy for checking the integrity of your MEDIA CENTER library as you can use it to produce a list of any files in your library that MEDIA CENTER cannot find. However, be aware that the larger your library, the longer this list will take to produce as MEDIA CENTER will need to physically check each files' existance in turn. ||style="border: 1px solid black" | '''IsMissing(Full Path To File)'''
 +
''If no file path is specified, the function will default to checking the current file.''
 +
|style="border: 1px solid black" | '''ismissing()'''
 +
''Checks if the current file exists, and returns 1 (positive) if the file does not exist, and 0 (negative) if the file does exist.''
 +
 
 +
'''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.''
 +
 
 +
'''[=ismissing([filename])]=1'''
 +
 
 +
''This example also demonstrates how to construct an expression for use as a MEDIA CENTER search string. 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 your library is in good order, this list should 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 intact
 +
 
 +
'''if(ismissing(),File is missing,File exists)'''
 +
 
 +
''Wrapped inside an "If()" function, the expression outputs "File is missing" or "File Exists" depending on the result returned by IsMissing()''
 +
 
 
|-
 
|-
 
|- valign="top"
 
|- valign="top"
 
! scope="row" style="background: #A8E4A0; color: black; border: 1px solid black" | IsRemovable()
 
! scope="row" style="background: #A8E4A0; color: black; border: 1px solid black" | IsRemovable()
|style="border: 1px solid black" | A ||style="border: 1px solid black" | B ||style="border: 1px solid black" | C
+
|style="border: 1px solid black" | Checks to see if a file resides on removable media and if so, returns 1 (positive), and if not, returns 0 (negative). There is not a lot to say about this function, especially since MEDIA CENTER comes equipped with a [Removable] field by default that is automatically populated with 1 for all files in the library that are on removable storage. The function works in exactly the same way as the IsMissing function described above, returning 1 (positive) if the file is on removable storage, and 0 (negative) if not. ||style="border: 1px solid black" | '''IsRemovable(Full Path To File)'''
 +
 
 +
''If no file path is specified, the function will default to checking the current file.''
 +
|style="border: 1px solid black" | '''isremovable()'''
 +
 
 +
''Checks if the current file is on removable storage, and if so, returns 1 (positive), if not, the function returns 0 (negative).''
 
|-
 
|-
 
|- valign="top"
 
|- valign="top"
 
! scope="row" style="background: #A8E4A0; color: black; border: 1px solid black" | IsInPlayingNow()
 
! scope="row" style="background: #A8E4A0; color: black; border: 1px solid black" | IsInPlayingNow()
|style="border: 1px solid black" | A ||style="border: 1px solid black" | B ||style="border: 1px solid black" | C
+
|rowspan="2" style="border: 1px solid black" | These two functions will be dealt with together as from their names, they are self-explanatory. One checks to see if a file has been added to the playing now list, and the other checks if a file in a list is currently playing or not. With this in mind, their most practical use is as expression columns in a file list. To add an expression column to a list, right click on any existing column header and click on the "Add expression column" option. ||rowspan="2" style="border: 1px solid black" | '''IsInPlayingNow()'''
 +
 
 +
''Checks the current file, and if in the Playing Now list, returns 1 (positive), and if not, returns 0 (negative).
 +
 
 +
'''IsPlaying()'''
 +
 
 +
''Checks the current file, and if currently playing, returns 1 (positive), and if not, returns 0 (negative).
 +
|rowspan="2" style="border: 1px solid black" | '''if(isinplayingnow(),Selected,Not Selected)'''
 +
 
 +
''As mentioned in the description, the ideal place for these functions is as 'expression columns'. If this example were used in an expression column, then files added to Playing Now will show as "Selected" and all other files would show as "Not Selected". If the idea here is to be able to quickly see which files have been added, this might look a bit 'busy' and defeat the purpose, to which end, it is perfectly acceptable to tell the expression that if a file is not in Playing Now, to output nothing, by simply not giving any instructions for the negative result, like so: '''if(isinplayingnow(),Selected,)'''. Now, this expression column will only show "Selected" against files that are in Playing Now, leaving all others empty, giving a much easier column to read.
 +
 
 +
Use'' IsPlaying ''in exactly the same way as IsInPlayingNow()''
 +
 
 +
''On the Interact support forum,'' '''[http://yabb.jriver.com/interact/index.php?topic=57461.0 mark_h describes how he puts these two functions to work for him]''', ''and rick.ca shows how he tweaked the idea when he answers the question:'' '''"[http://yabb.jriver.com/interact/index.php?topic=58137.msg393905#msg393905 is it possible to play an artist's full work when a genre is shuffling?]"'''
 
|-
 
|-
 
|- valign="top"
 
|- valign="top"
 
! scope="row" style="background: #A8E4A0; color: black; border: 1px solid black" | IsPlaying()
 
! scope="row" style="background: #A8E4A0; color: black; border: 1px solid black" | IsPlaying()
|style="border: 1px solid black" | A ||style="border: 1px solid black" | B ||style="border: 1px solid black" | C
 
 
|}
 
|}
  

Revision as of 04:00, 17 August 2010

Overview

The J. River Media Core database engine supports Excel-style functions for use in view schemes, searches, displayed columns, and tag editing.

An expression is a mixture of text, fields, and functions. A function allows special operations to be performed. Functions are all listed with a name followed by an opening and closing parenthesis. When building expressions, the instructions you wish to pass to the function are placed inside these parenthesis, with multiple instructions separated by commas. When your expression is evaluated, any spaces entered after a comma are ignored. This allows you to compose complex expressions on multiple lines, making it easier to keep track of where you are in your expression. Occasionally, you will find that you want a space, or parenthesis character to be treated literally as part of your instructions, rather than expression syntax, and in these cases, the character is "escaped" by using a preceding forward slash. As you progress with your expression building, you will begin nesting multiple functions into a single expression; always remember that a completed expression must contain a matching number of opening and closing parenthesis in order to work reliably.

The functions available to us range from highly functional, with a broad range of applicable uses, through specialised, limited use functions that only appeal to a select group of users, to seemingly redundant functions and obscure functions that MEDIA CENTER uses internally. The functions below are listed with those with the broadest appeal at the top, and the more obscure at the bottom.

Expressions can be used in many places within MEDIA CENTER, for varying reasons. Places that you might consider using expressions include:

  • The player information bar
  • The image playback caption
  • A view scheme search list
  • The "Rename, Move or Copy Files" tool
  • The tag window
  • Panes (aka categories)
  • List columns
  • Thumbnail text
  • The search field
  • The library field manager (Create expression based library fields)
  • Theatre View
  • The links manager (Use expressions to format the URLs for your links)

Any given expression can only work on any given single file. It is not possible to compare a field in one file with a field in another file.

Fields

Any text between brackets [] will be replaced with the corresponding field from your library. As an example, [Artist] would be replaced by Bob Dylan for any Bob Dylan tracks. If the text between brackets doesn't match any known fields, it will be left alone. After the field name, a comma can be placed followed by a 0 or 1 for whether the field should get formatted. So, [Duration] and [Duration, 1] will give "4:02" while [Duration, 0] will give "242". This is particularly important when working with the "Format" functions, where most times you will want the evaluator to work with the raw field contents rather than the formatted contents you see in the file list.

Function and field values in expressions are not case-sensitive. Available functions with descriptions and examples are listed below.

Functions

If(...): Ask closed questions and control output dependent upon result.

Function Description Construction Examples
If() This will be the function you will likely use more than any other. It is typically used in conjunction with one or more other functions and allows you to give specific instructions depending upon whether the result is positive (1) or negative (0). The positive instruction is always given first. if(expression to test,instructions if positive,instructions if negative) if(isequal([artist],bob dylan,1),Genius,Mediocre)

Wherever this expression is applied, be it as an expression column or category, as part of a renaming rule, thumbnail text, if the artist tag is Bob Dylan, MEDIA CENTER will produce Genius, and for all other artists, it will produce Mediocre. The "IsEqual()" function is described in the first table below.

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

Here, we have two nested "If" functions. First we ask if the artist is Bob Dylan, if the result is positive, write "Genius". If the artist is not Dylan, we then ask if the album is "Joshua Tree", if yes, write "Great Album", and if no, write mediocre

On it's own, "If()" is rather boring and not a lot of use. When used in conjunction with other functions, however, it becomes very powerful indeed. In the two examples above, the numbers 1 and 8 have been used. These are comparison mode switches used by the IsEqual function. There are 9 different compare modes in total, all of which are detailed below. Note how the second example ends with two closing parenthesis, one for each "If" function.

Query, Test and Compare using "Is" Functions

All of the functions in this section, when used on their own, will only ever return one of two values, 1 (true) or 0 (false). There is a "FormatBoolean()" function that can be wrapped around these and allows us to specify the output for each case and is discussed in more depth in the Format section. The real power and versatility of these "Is" functions is released when they are wrapped inside the If() function discussed above.

Function Description Construction Examples
IsEqual() Compares two values in one of nine specified modes ("exact match", "Is greater than" etc.) and outputs 1 for a positive match and 0 for a negative match. If no compare mode is specified, the compare will default to 0. isequal(1st value to compare,2nd value to compare,compare mode)

Available Compare Modes:

  • 0: case-sensitive string compare for equality
  • 1: case-insensitive string compare for equality
  • 2: numeric compare for equality
  • 3: numeric less than
  • 4: numeric less than or equal to
  • 5: numeric greater than
  • 6: numeric greater than or equal to
  • 7: substring search (case sensitive)
  • 8: substring search (case insensitive)
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),Self Titled,[album])

Wrapped inside an 'If' function, if the 'artist' and 'album' values are the same, the output will be 'Self Titled', otherwise, the output will be the 'album' value.

if(isequal([artist],[album],1),Self Titled/,,[album]/))

This example demonstrates the character 'escaping' mentioned in the overview. Here, we want the output to be either "Self Titled," (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 preceding forward-slash character. This informs the expression evaluator that these characters are not part of the expression syntax and are to be treated literally

IsEmpty() Tests any given field for data. If the field is empty, the function returns 1, and if populated, the function returns 0. There are two different test modes available, a "string" test, and a "number" test. This is because as far as MEDIA CENTER is concerned, fields designated as containing numerical values that are populated with the number zero, are empty. If no test mode is specified, the function will default to 0.

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

isempty([field to test],test mode)

Available test modes:

  • 0: String test (field must be empty to get a positive result)
  • 1: Numerical test (field must be empty, or contain 0 to get a positive result)
isempty([comment],0)

If the comment field is empty, this expression will return 1, but if the comment field contains data, the expression will return 0.

isempty([track #],1)

This expression will perform a numerical test for data in the [track #] field. If the field is empty, or contains 0, the expression will return a positive result, 1, otherwise, the result will be negative, 0.

if(isempty([disc #]),,[disc #])

Here, by not entering any instructions to carry out for a positive result, the expression will do just that, and output nothing, but if the [disc #] field does contain data, the expression will write that out. Upon first look, you would think that this could work really well in the "Rename, Move and Copy Files" tool for only creating a \Disc #\ directory if needed. This will not work. When asking the rename tool to create directories from field data, it is smart enough to know that directories with no name are illegal in Windows, so when it encounters an empty field, it automatically converts it to "Unknown [Field Name]". It does this before the expression engine gets to see it, which means that the IsEmpty function will always return a negative result when used in the rename tool, even when the specified field is indeed empty. As we now know that empty fields are passed through the rename tool as "Unknown [field name]" we can use if(isequal([disc #],unknown,8),,[disc #]) to achieve the desired result. Note that this only applies when using the rename files tool.

IsRange() IsRange allows us to test if any given field falls inside any given range of values. If the field falls inside the given range, the function returns 1, and if outside the given range, the function returns 0. IsRange([Field to Test],Specified-Range)

The range to test for can be letters or numbers, separated by a hyphen, without spaces, lowest value first, highest second. Letters and numbers cannot be mixed, the range can only be one or the other

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

Abba or Blondie will return 1 (positive), and ZZ Top will return 0 (negative).

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

This expression will output "Poor Quality" for any file where the bitrate fall between falls between 96 and 191, and "High Quality" for all others. Note that expressions are only as good as the instructions given, and that the above expression would label files with bitrates less than 96kbps as "High Quality". If this expression were used to add a category to a view, there would be two selectable choices in the category, Low Quality, and High Quality. Selecting either one would then filter the file list accordingly.

This post on Interact shows the use of IsRange in a Search List. (right click the link, open in new tab to keep this page open). The expression format in that post shows how to form expressions for use in standard MEDIA CENTER searches, something that is also covered later on this page.

IsMissing() This function checks to see if a file exists on the system. If the file is missing, the function returns 1 (positive), and if the file is found, the function returns 0 (negative). It is possible to specify a specific file to check for, but if you know that much, it will be quicker to fire up explorer and check yourself. This function comes in handy for checking the integrity of your MEDIA CENTER library as you can use it to produce a list of any files in your library that MEDIA CENTER cannot find. However, be aware that the larger your library, the longer this list will take to produce as MEDIA CENTER will need to physically check each files' existance in turn. IsMissing(Full Path To File)

If no file path is specified, the function will default to checking the current file.

ismissing()

Checks if the current file exists, and returns 1 (positive) if the file does not exist, and 0 (negative) if the file does exist.

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.

[=ismissing([filename])]=1

This example also demonstrates how to construct an expression for use as a MEDIA CENTER search string. 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 your library is in good order, this list should 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 intact

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

Wrapped inside an "If()" function, the expression outputs "File is missing" or "File Exists" depending on the result returned by IsMissing()

IsRemovable() Checks to see if a file resides on removable media and if so, returns 1 (positive), and if not, returns 0 (negative). There is not a lot to say about this function, especially since MEDIA CENTER comes equipped with a [Removable] field by default that is automatically populated with 1 for all files in the library that are on removable storage. The function works in exactly the same way as the IsMissing function described above, returning 1 (positive) if the file is on removable storage, and 0 (negative) if not. IsRemovable(Full Path To File)

If no file path is specified, the function will default to checking the current file.

isremovable()

Checks if the current file is on removable storage, and if so, returns 1 (positive), if not, the function returns 0 (negative).

IsInPlayingNow() These two functions will be dealt with together as from their names, they are self-explanatory. One checks to see if a file has been added to the playing now list, and the other checks if a file in a list is currently playing or not. With this in mind, their most practical use is as expression columns in a file list. To add an expression column to a list, right click on any existing column header and click on the "Add expression column" option. IsInPlayingNow()

Checks the current file, and if in the Playing Now list, returns 1 (positive), and if not, returns 0 (negative).

IsPlaying()

Checks the current file, and if currently playing, returns 1 (positive), and if not, returns 0 (negative).

if(isinplayingnow(),Selected,Not Selected)

As mentioned in the description, the ideal place for these functions is as 'expression columns'. If this example were used in an expression column, then files added to Playing Now will show as "Selected" and all other files would show as "Not Selected". If the idea here is to be able to quickly see which files have been added, this might look a bit 'busy' and defeat the purpose, to which end, it is perfectly acceptable to tell the expression that if a file is not in Playing Now, to output nothing, by simply not giving any instructions for the negative result, like so: if(isinplayingnow(),Selected,). Now, this expression column will only show "Selected" against files that are in Playing Now, leaving all others empty, giving a much easier column to read.

Use IsPlaying in exactly the same way as IsInPlayingNow()

On the Interact support forum, mark_h describes how he puts these two functions to work for him, and rick.ca shows how he tweaked the idea when he answers the question: "is it possible to play an artist's full work when a genre is shuffling?"

IsPlaying()

Change how existing data is displayed using Format functions

Function Description Construction Examples
FormatDate() A B C
FormatNumber() A B C
FormatDuration() A B C
FormatFilesize() A B C
FormatRange() A B C
FormatBoolean() A B C

When, Where and How to use expressions