Media Center expression language-NEW
- 1 Overview
- 2 Functions
- 2.1 If(...): Ask closed questions and control output dependent upon result.
- 2.2 Query, Test and Compare using "Is" Functions
- 2.2.1 IsEqual(...): Compares two values in one of nine specified modes
- 2.2.2 IsEmpty(...): Tests to see if a field is empty
- 2.2.3 IsRange(...): Tests a value for inclusion within a given range
- 2.2.4 IsMissing(...): Tests to see if a file exists on the system
- 2.2.5 IsRemovable(...): Tests to see if a file is stored on removable media
- 2.2.6 IsInPlayingNow & IsPlaying(...): Tests to see if a file is in the Playing Now playlist or currently being played
- 2.3 Change how existing data is displayed using Format functions
- 2.3.1 FormatDate(...): Formats a date value in a specified manner
- 2.3.2 FormatNumber(...): Formats a number to a specified number of decimal places
- 2.3.3 PadNumber(...): Used to add leading zeros to a number
- 2.3.4 FormatDuration(...): Presents a duration of seconds in a reader friendly format
- 2.3.5 FormatFileSize(...): Presents a number of bytes in a reader friendly format
- 2.3.6 FormatRange(...): Formats a value as a range
- 2.3.7 FormatBoolean(...): Formats a boolean (true / false) value in a specified manner
- 2.4 Functions for filename and field manipulation
- 2.5 Now(): Retrieve and display the system date
- 2.6 Specify data types for expression based fields
- 3 When, Where and How to use expressions
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. An example using this escaping can be seen here. 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 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.
Using this page
The 'Contents' box above contains a list of available functions roughly grouped by usage scenario, and each function name gives a fair indication of what it might do. Each of the group headers contain some basic information pertinent to the functions inside the group. Click on a function or function group header in the Contents box to be taken directly to more information about it on the page. At the bottom right of each section there is a "Back to top" link which will take you back up to the Contents box allowing you to quickly get to where on the page you would like to go next.
If(...): Ask closed questions and control output dependent upon result.
|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.|
|Construction||if(expression to test,instructions if positive,instructions if negative)|
|Examples|| 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.
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.
IsEqual(...): Compares two values in one of nine specified modes
|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.|
|Construction|| isequal(1st value to compare,2nd value to compare,compare mode)
Available Compare Modes:
If the 'artist' and 'album' values are the same, the output will be 1, otherwise, the output will be 0.
IsEmpty(...): Tests to see if a field is empty
|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 below, as it covers a caveat that comes with this particular function.
|Construction|| isempty([field to test],test mode)
Available test modes:
If the comment field is empty, this expression will return 1, but if the comment field contains data, the expression will return 0.
IsRange(...): Tests a value for inclusion within a given range
|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.|
|Construction|| 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
Abba or Blondie will return 1 (positive), and ZZ Top will return 0 (negative).
IsMissing(...): Tests to see if a file exists on the system
|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.|
|Construction|| IsMissing(Full Path To File)
If no file path is specified, the function will default to checking the current file.
Checks if the current file exists, and returns 1 (positive) if the file does not exist, and 0 (negative) if the file does exist.
IsRemovable(...): Tests to see if a file is stored on removable media
|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.|
|Construction|| IsRemovable(Full Path To File)
If no file path is specified, the function will default to checking the current file.
Checks if the current file is on removable storage, and if so, returns 1 (positive), if not, the function returns 0 (negative).
IsInPlayingNow & IsPlaying(...): Tests to see if a file is in the Playing Now playlist or currently being played
|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.|
Checks the current file, and if in the Playing Now list, returns 1 (positive), and if not, returns 0 (negative).
|Examples|| 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.
Change how existing data is displayed using Format functions
All of these functions (with the exception of FormatBoolean) take raw data from the library and allow us to present that data in a way that we choose. What does "raw data" mean? MEDIA CENTER stores duration information in seconds and converts that information into hours (if needed), minutes and seconds for display in the Duration column in a file list. Likewise, file size information is stored in bytes and is converted into Mb for display in the file list. Dates are stored using a UNIX system (use google if you want to know more about that) which means that the date field could contain 40121.8272916666683159 and MEDIA CENTER will display that as 04/11/2009 19:51 (if that is how your Windows locale setting displays date and time). So there you have it, raw data. The following section gives some idea of what is possible using the raw data and the Format functions. To instruct the expression evaluator to use raw data, a zero is added to the library field, inside the square brackets, like so: [Date Imported,0]
FormatDate(...): Formats a date value in a specified manner
|FormatDate()||As mentioned in the section introduction above, MEDIA CENTER stores date information in a UNIX style, and converts that information into legible date/time information we can understand. By default, MEDIA CENTER presents dates using the system locale settings. This function can be applied to any default library field that contains date information in order to have that information displayed in a non-default format.|
|Construction|| formatdate([date field,0],Format,Output if date is empty)
Available format choices:
Flexible formatting is also available: (Note that these )
Output if date is empty: If the date is empty, anything placed here will be output instead. This could be plain text, such as "No Date", or a library field. This value is optional, and if not given, the expression will default to return nothing if the date is empty.
|Examples|| formatdate([last played,0],yyyy//MM//dd,Not Yet)|
This will return the last played date as year/month/day without the time, and regardless of the system locale setting. If a file has no last played info, the expression will output "Not Yet" instead.
FormatNumber(...): Formats a number to a specified number of decimal places
|FormatNumber()||FormatNumber() allows to format any given value to a set number of decimal places.|
|Construction|| FormatNumber(Value to format,Number of decimal places,Output if value is zero,Label if value is greater than 1,Label if value equals 1)
Note that even if you are only interested in applying a label for those results that equal 1, you must also indicate the preceding instructions, if only to instruct the evaluator to ignore them, as shown in the examples below.
This will return the duration of a track, in seconds, shown to two decimal places.
PadNumber(...): Used to add leading zeros to a number
|PadNumber()||This function is not a 'Format' function by name, but is by nature, hence its inclusion in this section. PadNumber is a nice, simple function that is used to add leading zeros to any given number value.|
|Construction||PadNumber(Field to pad,Total number of digits required)|
|Examples|| padnumber([track #],2)|
This will add a leading zero to all track numbers between one and nine.
FormatDuration(...): Presents a duration of seconds in a reader friendly format
|FormatDuration()||MEDIA CENTER stores duration data in seconds, at up to sixteen decimal places. The value shown in the default "Duration" column in a file list is an internally formatted interpretation of this raw "Duration" data. As MEDIA CENTER automatically applies this formatting for us, there is not a lot of call for this particular function.|
|Construction|| FormatDuration(Value to format)
"Value to format" can be either the raw duration data, or a given number of seconds
This expression will duplicate the contents of the default [duration] field as shown in a file list
FormatFileSize(...): Presents a number of bytes in a reader friendly format
|FormatFilesize()||MEDIA CENTER stores file size data internally in bytes. This function will convert those byte values into reader-friendly values, 3.2 Kb or 10.4 Mb, for example. The function will also accept a byte value directly.|
|Construction|| FormatFileSize(Value to format)
"Value to format" can be either the raw [File Size] data or a given number of bytes.
|Examples|| formatfilesize([file size,0])|
This expression will duplicate the contents of the default [file size] field as shown in a file list
FormatRange(...): Formats a value as a range
|FormatRange()||This function places any given value into its place in any given range.|
|Construction|| FormatRange(Value to format,Range size,Mode)
Value to format: This could be a specific word or number, or any library field
This will return the first letter from the [artist] field. Note that as range size and mode values were not specified, the function defaulted to one and automatic respectively.
Note that this function always starts number ranges from zero, 0-9, 10-19, etc, etc.. If you really need a number grouping that starts from 1, 1-10, 11-20, 21-30,etc. etc., you can use expressions to create a pseudo range. Full details, with a helpful explanation, of "1 based grouping" can be found on this page.
FormatBoolean(...): Formats a boolean (true / false) value in a specified manner
|FormatBoolean()||This function is wrapped around another function and will return specified strings for true and false values returned by that other function.|
|Construction|| FormatBoolean(True/False Test,String to use if true,String to use if false)
|Examples|| formatboolean(isempty([number plays]),Never Played,Has Been Played)|
On it's own, the function isempty([number plays]) will return either 1 or 0. When wrapped inside a formatboolean function as shown here, the output for a true result will be "Never Played", and for a false result, the output will be "Has Been Played".
Functions for filename and field manipulation
The primary use of the functions in this section is to manipulate the data associated with any given file or files. When used with direct editing in the file list, or in the action window, as decribed further down this page, they offer extremely fast and efficient methods for batch editing the data associated with multiple files.
Clean(...): Returns a cleaned up version of a filled in template
|Clean()||The official description for this function is simply "Returns a cleaned up version of a filled in template". This function is better explained through demonstration in the examples below.|
|Construction||Clean(template to clean)|
|Examples|| Clean([Artist] - [Album] /([Genre]/))
FixCase(...): Changes the case of a given string
|FixCase()||This function will output any given text string in one of five specified case modes.|
|Construction|| FixCase(String to modify,Case mode to apply)|
The "String to modify" can be plain text, a library field, or a combination of the two.
The five modes available are:
If no case mode is specified, the function will default to using "Title Case". Title case will start each principal word with a capital. More detail regarding title case can be found here
This will take the contents of the [album] field and present it with the specified capitalisation. As there is no specified mode here, the function defaults to 0, so, if an album is entered in the library as "Time Out Of Mind", the function will return "Time Out of Mind" (note the lower case "of")
Length(...): Returns the number of characters in a string
|Length()||This function returns the number of characters in any given string.|
|Construction|| Length(String to count characters from)|
The "String to count characters from" can be plain text, a library field, or a combination of the two.
This will count the characters in the [filename] field and return the result. Spaces count as characters, so, C:\My File.mp3 would return 14.
Now(): Retrieve and display the system date
Specify data types for expression based fields
When, Where and How to use expressions
|FUNCTION NAME||FUNCTION DESCRIPTION|