Smart Playlists¶
To add a smart playlist to the server, create a new text file with a filename ending with .smartpl; the filename doesn't matter, only the .smartpl ending does. The file must be placed somewhere in your library folder.
Syntax¶
The contents of a smart playlist must follow the syntax:
There is exactly one smart playlist allowed for a .smartpl file.
An expression consists of:
Where valid field-names (with their types) are:
artist(string)album_artist(string)album(string)title(string)genre(string)composer(string)comment(string)path(string)type(string)grouping(string)data_kind(enumeration)media_kind(enumeration)play_count(integer)skip_count(integer)rating(integer)year(integer)compilation(integer)track(integer)disc(integer)time_added(date)time_modified(date)time_played(date)time_skipped(date)random(special)file_size(integer)
Valid operators include:
is,includes,starts with,ends with(string)>,<,<=,>=,=(int)after,before(date)is(enumeration)
The is operator must exactly match the field value, while the includes operator matches a substring. The starts with operator matches, if the value starts with the given prefix, and ends with matches the opposite. All these matches are case-insensitive.
Valid operands include:
- "string value" (string)
- integer (int)
empty
The empty operand is only valid with the is operator and matches items with no value for the given field-name e.g. comment
Valid operands for the enumeration data_kind are:
fileurlspotifypipe
Valid operands for the enumeration media_kind are:
musicmoviepodcastaudiobooktvshow
Multiple expressions can be anded or ored together, using the keywords OR and AND. The unary not operator is also supported using the keyword NOT.
Use parentheses to group e.g. play_count = 0 and (media_kind is podcast or media_kind is audiobook).
It is possible to define the sort order and limit the number of items by adding an order clause and/or a limit clause after the last expression:
"sort-direction" is either ASC (ascending) or DESC (descending). "limit" is the maximum number of items.
There is additionally a special random field-name that can be used in conjunction with limit to select a random number of items based on current expression.
Examples¶
This would match songs by "Rob Zombie" or "White Zombie", as well as those with a genre of "Techno-Industrial" or "Trance/Techno", for example.
"techno 2015" {
genre includes "techno"
and artist includes "zombie"
and not genre includes "industrial"
}
This would exclude e. g. songs with the genre "Techno-Industrial".
This would match all songs added as files to the library that are not placed under the folders for podcasts, audiobooks.
"Unplayed podcasts and audiobooks" {
play_count = 0
and (media_kind is podcast or media_kind is audiobook)
}
This would match any podcast and audiobook file that was never played.
This would match the last 10 music files added to the library.
"Random 10 Rated Pop songs" {
rating > 0 and
genre is "Pop" and
media_kind is music
order by random desc
limit 10
}
This generates a random set of, maximum of 10, rated Pop music tracks every time the playlist is queried.
"All Jazz, No Foo" {
media_kind is music and
genre is "jazz" and
(not comment includes "foo" or
comment is empty)
}
This matches both the songs with comments that do not include "foo", but also the songs with no comment.
Date Operand Syntax¶
One example of a valid date is a date in yyyy-mm-dd format:
There are also some special date keywords:
today,yesterday,this week,last week,last month,last year
These dates refer to the start of that period; today means 00:00hrs of today, this week means current Monday 00:00hrs, last week means the previous Monday 00:00hrs, last month is the first day of the previous month at 00:00hrs etc.
A valid date can also be made by applying an interval to a date. Intervals can be defined as days, weeks, months, years. As an example, a valid date might be:
3 weeks before today or 3 weeks ago
Examples:
This matches all songs added in the last 2 weeks.
This matches all audiobooks played since the start of the last Monday 00:00AM.
All dates, except for YYYY-DD-HH, are relative to the day of when the server evaluates the smartpl query; time_added after today run on a Monday would match against items added since Monday 00:00hrs and evaluating the same smartpl on Friday would only match against added on Friday 00:00hrs.
Note that time_added after 4 weeks ago and time_added after last month are subtly different; the former is exactly 4 weeks ago (from today) whereas the latter is the first day of the previous month.
Differences with MT-daapd Smart Playlists¶
The syntax is really close to the mt-daapd smart playlist syntax (see Multi-Threaded DAAP Daemon Code.
Even this documentation is based on the document linked above.
Some differences are:
- only one smart playlist per file
- the not operator must be placed before an expression and not before the operator
||,&&,!are not supported (useor,and,not)- comments are not supported