From b0593585dfa6060e434b2ac25f3c3575968eafaa Mon Sep 17 00:00:00 2001 From: redxef Date: Wed, 26 Feb 2025 22:31:18 +0100 Subject: [PATCH] fix: move FilterCollectionItems from Common.cs to GenerateCollection.cs. It had no place being in common. --- .../ScheduledTasks/Common.cs | 34 ----------------- .../ScheduledTasks/GenerateCollection.cs | 38 +++++++++++++++++++ 2 files changed, 38 insertions(+), 34 deletions(-) diff --git a/Jellyfin.Plugin.SmartPlaylist/ScheduledTasks/Common.cs b/Jellyfin.Plugin.SmartPlaylist/ScheduledTasks/Common.cs index 9148179..2fb2388 100644 --- a/Jellyfin.Plugin.SmartPlaylist/ScheduledTasks/Common.cs +++ b/Jellyfin.Plugin.SmartPlaylist/ScheduledTasks/Common.cs @@ -77,39 +77,5 @@ namespace Jellyfin.Plugin.SmartPlaylist.ScheduledTasks { } return executor; } - public IEnumerable FilterCollectionItems(IEnumerable items, User? user, string name, string program, string sortProgram) { - List results = new List(); - Expression expression = new Parser(StringTokenStream.generate(program)).parse(); // parse here, so that we don't repeat the work for each item - Executor executor = SetupExecutor(); - - executor.environment.Set("*user*", Lisp.Object.FromBase(user)); - foreach (var i in items) { - executor.environment.Set("*item*", Lisp.Object.FromBase(i)); - var r = executor.eval(expression); - _logger.LogTrace("Item {0} evaluated to {1}", i, r.ToString()); - if ((r is not Lisp.Boolean r_bool) || (r_bool.Value())) { - _logger.LogDebug("Added '{0}' to Smart Collection {1}", i, name); - results.Add(i); - } - } - executor = SetupExecutor(); - executor.environment.Set("*user*", Lisp.Object.FromBase(user)); - executor.environment.Set("*items*", Lisp.Object.FromBase(results)); - results = new List(); - var sort_result = executor.eval(sortProgram); - if (sort_result is Cons sorted_items) { - foreach (var i in sorted_items.ToList()) { - if (i is Lisp.Object iObject && iObject.Value() is BaseItem iBaseItem) { - results.Add(iBaseItem); - continue; - } - throw new ApplicationException($"Returned sorted list does contain unexpected items, got {i}"); - } - } else if (sort_result == Lisp.Boolean.FALSE) { - } else { - throw new ApplicationException($"Did not return a list of items, returned {sort_result}"); - } - return results.Select(x => x.Id); - } } } diff --git a/Jellyfin.Plugin.SmartPlaylist/ScheduledTasks/GenerateCollection.cs b/Jellyfin.Plugin.SmartPlaylist/ScheduledTasks/GenerateCollection.cs index d450d5b..3930a33 100644 --- a/Jellyfin.Plugin.SmartPlaylist/ScheduledTasks/GenerateCollection.cs +++ b/Jellyfin.Plugin.SmartPlaylist/ScheduledTasks/GenerateCollection.cs @@ -7,7 +7,10 @@ using MediaBrowser.Controller.Providers; using MediaBrowser.Model.IO; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; +using Jellyfin.Data.Entities; +using Jellyfin.Plugin.SmartPlaylist.Lisp; +using Jellyfin.Plugin.SmartPlaylist.Lisp.Compiler; namespace Jellyfin.Plugin.SmartPlaylist.ScheduledTasks { public class GenerateCollection: Common, IScheduledTask { @@ -61,6 +64,41 @@ namespace Jellyfin.Plugin.SmartPlaylist.ScheduledTasks { )).Id; } + public IEnumerable FilterCollectionItems(IEnumerable items, User? user, string name, string program, string sortProgram) { + List results = new List(); + Expression expression = new Parser(StringTokenStream.generate(program)).parse(); // parse here, so that we don't repeat the work for each item + Executor executor = SetupExecutor(); + + executor.environment.Set("*user*", Lisp.Object.FromBase(user)); + foreach (var i in items) { + executor.environment.Set("*item*", Lisp.Object.FromBase(i)); + var r = executor.eval(expression); + _logger.LogTrace("Item {0} evaluated to {1}", i, r.ToString()); + if ((r is not Lisp.Boolean r_bool) || (r_bool.Value())) { + _logger.LogDebug("Added '{0}' to Smart Collection {1}", i, name); + results.Add(i); + } + } + executor = SetupExecutor(); + executor.environment.Set("*user*", Lisp.Object.FromBase(user)); + executor.environment.Set("*items*", Lisp.Object.FromBase(results)); + results = new List(); + var sort_result = executor.eval(sortProgram); + if (sort_result is Cons sorted_items) { + foreach (var i in sorted_items.ToList()) { + if (i is Lisp.Object iObject && iObject.Value() is BaseItem iBaseItem) { + results.Add(iBaseItem); + continue; + } + throw new ApplicationException($"Returned sorted list does contain unexpected items, got {i}"); + } + } else if (sort_result == Lisp.Boolean.FALSE) { + } else { + throw new ApplicationException($"Did not return a list of items, returned {sort_result}"); + } + return results.Select(x => x.Id); + } + private IEnumerable GetAllMedia() { var req = new InternalItemsQuery() { IncludeItemTypes = AvailableFilterItems,