Compare commits
3 commits
e236031920
...
a2abe724b7
Author | SHA1 | Date | |
---|---|---|---|
a2abe724b7 | |||
dc5435fa68 | |||
c5c2b86557 |
5 changed files with 37 additions and 12 deletions
|
@ -41,8 +41,8 @@ namespace Jellyfin.Plugin.SmartPlaylist {
|
|||
|
||||
[Serializable]
|
||||
public class SmartPlaylistDto : ISerializable {
|
||||
private static string DEFAULT_PROGRAM = "(begin (invoke item \"IsFavoriteOrLiked\" (list user)))";
|
||||
private static string DEFAULT_SORT_PROGRAM = "(begin items)";
|
||||
private static string DEFAULT_PROGRAM = "(begin (invoke item \"IsFavoriteOrLiked\" (list *user*)))";
|
||||
private static string DEFAULT_SORT_PROGRAM = "(begin *items*)";
|
||||
public SmartPlaylistId Id { get; set; }
|
||||
public SmartPlaylistLinkDto[] Playlists { get; set; }
|
||||
public string Name { get; set; }
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
name: Smart Playlist
|
||||
guid: dd2326e3-4d3e-4bfc-80e6-28502c1131df
|
||||
version: 0.3.0.0
|
||||
version: 0.4.0.0
|
||||
targetAbi: 10.10.3.0
|
||||
framework: net8.0
|
||||
owner: redxef
|
||||
|
@ -14,6 +14,31 @@ artifacts:
|
|||
- jellyfin-smart-playlist.dll
|
||||
- YamlDotNet.dll
|
||||
changelog: |
|
||||
## v0.4.0.0
|
||||
- Add a basic UI to configure the playlists.
|
||||
- It's now possible to print log messages to the jellyfin log by calling `logd`, `logi`, `logw` or `loge`
|
||||
for the respective levels `debug`, `info`, `warning` or `error`.
|
||||
- Allow calling generic methods via `(invoke-generic object methodname args list-of-types)`.
|
||||
- Add quoting via single quote: `'`.
|
||||
- Add special case for `(quote <form>)` to be rendered as `'<form>`.
|
||||
- It is now possible to include comments in the source via a semicolon (`;`).
|
||||
- Respect the `Enabled` flag and only process the playlists that are enabled.
|
||||
- New methods have been added: `rand`, `shuf`.
|
||||
- Add `find-artist`, `get-name` and `find-parent` default definitions.
|
||||
- Update YamlDotNet to v16.2.1.
|
||||
|
||||
**Breaking changes**:
|
||||
- Rename global environment variables to be enclosed by `*`.
|
||||
|
||||
**Fixes**:
|
||||
- The initialization of the executor now contains the same default definitions for the SortProgram and the normal Program.
|
||||
- The progress report now considers the SmartPlaylists and not the individual playlists per user.
|
||||
- It is now possible to pass builtins as arguments. Previously to get `(qsort > (list 1 2 3))` one had to write
|
||||
something like this: `(qsort (lambda (a b) (> a b)) (list 1 2 3))`.
|
||||
- A program no longer has to be a list, `t` is a valid program.
|
||||
- Fix list parsing in cases where a space was before the closing parenthesis.
|
||||
|
||||
|
||||
## v0.3.0.0
|
||||
- Add a second program (`SortProgram`) which is run after the filtering, this
|
||||
program should return the list of items, but in the order in which they should appear in
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<RootNamespace>Jellyfin.Plugin.SmartPlaylist</RootNamespace>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<Version>0.3.0.0</Version>
|
||||
<Version>0.4.0.0</Version>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
14
README.md
14
README.md
|
@ -5,7 +5,7 @@ Smart playlists with Lisp filter engine.
|
|||
This readme contains instructions for the most recent changes in
|
||||
the development branch (`main`). To view the file appropriate
|
||||
for your version select the tag corresponding to your version.
|
||||
The latest version is [v0.3.0.0](https://gitea.redxef.at/redxef/jellyfin-smart-playlist/src/tag/v0.3.0.0).
|
||||
The latest version is [v0.4.0.0](https://gitea.redxef.at/redxef/jellyfin-smart-playlist/src/tag/v0.4.0.0).
|
||||
|
||||
## How to use
|
||||
|
||||
|
@ -28,7 +28,7 @@ Playlists:
|
|||
- PlaylistId: 24f12e1e-3278-d6d6-0ca4-066e93296c95
|
||||
UserId: 6eec632a-ff0d-4d09-aad0-bf9e90b14bc6
|
||||
Name: Rock
|
||||
Program: (begin (invoke item "IsFavoriteOrLiked" (user)))
|
||||
Program: (begin (invoke item "IsFavoriteOrLiked" (list *user*)))
|
||||
SortProgram: (begin items)
|
||||
Filename: /config/data/smartplaylists/Rock.yaml
|
||||
Enabled: true
|
||||
|
@ -43,7 +43,7 @@ line and write multiline filters like this:
|
|||
```yaml
|
||||
Porgram: |
|
||||
(begin
|
||||
(invoke item "IsFavoriteOrLiked" (list user)))
|
||||
(invoke item "IsFavoriteOrLiked" (list *user*)))
|
||||
```
|
||||
|
||||
This is equivalent to the above example (not counting the other
|
||||
|
@ -85,7 +85,7 @@ still work and remember the correct playlist.
|
|||
|
||||
A lisp program to decide on a per item basis if it should be included in
|
||||
the playlist, return `nil` to not include items, return any other value
|
||||
to include them. Global variables `user` and `item` are predefined
|
||||
to include them. Global variables `*user*` and `*item*` are predefined
|
||||
and contain a [User](https://github.com/jellyfin/jellyfin/blob/master/Jellyfin.Data/Entities/User.cs) and
|
||||
[BaseItem](https://github.com/jellyfin/jellyfin/blob/master/MediaBrowser.Controller/Entities/BaseItem.cs)
|
||||
respectively.
|
||||
|
@ -107,8 +107,8 @@ to: `(is-favourite)`.
|
|||
### SortProgram
|
||||
|
||||
This works exactly like [Program](#program), but the input is the
|
||||
user and a list of items (`items`) matched by [Program](#program).
|
||||
The default is `(begin items)`, which doesn't sort at all. To sort
|
||||
user and a list of items (`*items*`) matched by [Program](#program).
|
||||
The default is `(begin *items*)`, which doesn't sort at all. To sort
|
||||
the items by name you could use the following program:
|
||||
|
||||
```lisp
|
||||
|
@ -118,7 +118,7 @@ the items by name you could use the following program:
|
|||
(string>
|
||||
(car (getitems a "Name"))
|
||||
(car (getitems b "Name"))))
|
||||
items)
|
||||
*items*)
|
||||
```
|
||||
|
||||
### Filename
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
Program: |
|
||||
(let
|
||||
(parent
|
||||
(invoke-generic item "FindParent" nil (list "MediaBrowser.Controller.Entities.Audio.MusicArtist, MediaBrowser.Controller")))
|
||||
(invoke-generic *item* "FindParent" nil (list "MediaBrowser.Controller.Entities.Audio.MusicArtist, MediaBrowser.Controller")))
|
||||
(cond
|
||||
((null parent) nil)
|
||||
(t (string= (car (getitems parent "Name")) "Haller"))))
|
||||
|
|
Loading…
Reference in a new issue