diff --git a/graphql/schema/types/filters.graphql b/graphql/schema/types/filters.graphql index b30f3bc9c..2f80b8b02 100644 --- a/graphql/schema/types/filters.graphql +++ b/graphql/schema/types/filters.graphql @@ -279,6 +279,8 @@ input SceneFilterType { play_count: IntCriterionInput "Filter by play duration (in seconds)" play_duration: IntCriterionInput + "Filter by scene last played time" + last_played_at: TimestampCriterionInput "Filter by date" date: DateCriterionInput "Filter by creation time" diff --git a/pkg/models/scene.go b/pkg/models/scene.go index 4b1f2a01b..c7a87151c 100644 --- a/pkg/models/scene.go +++ b/pkg/models/scene.go @@ -93,6 +93,8 @@ type SceneFilterType struct { PlayCount *IntCriterionInput `json:"play_count"` // Filter by play duration (in seconds) PlayDuration *IntCriterionInput `json:"play_duration"` + // Filter by last played at + LastPlayedAt *TimestampCriterionInput `json:"last_played_at"` // Filter by date Date *DateCriterionInput `json:"date"` // Filter by created at diff --git a/pkg/sqlite/scene.go b/pkg/sqlite/scene.go index 4e3c4c8a9..841dfa3f4 100644 --- a/pkg/sqlite/scene.go +++ b/pkg/sqlite/scene.go @@ -986,6 +986,16 @@ func (qb *SceneStore) makeFilter(ctx context.Context, sceneFilter *models.SceneF query.handleCriterion(ctx, floatIntCriterionHandler(sceneFilter.ResumeTime, "scenes.resume_time", nil)) query.handleCriterion(ctx, floatIntCriterionHandler(sceneFilter.PlayDuration, "scenes.play_duration", nil)) query.handleCriterion(ctx, scenePlayCountCriterionHandler(sceneFilter.PlayCount)) + query.handleCriterion(ctx, criterionHandlerFunc(func(ctx context.Context, f *filterBuilder) { + if sceneFilter.LastPlayedAt != nil { + f.addLeftJoin( + fmt.Sprintf("(SELECT %s, MAX(%s) as last_played_at FROM %s GROUP BY %s)", sceneIDColumn, sceneViewDateColumn, scenesViewDatesTable, sceneIDColumn), + "scene_last_view", + fmt.Sprintf("scene_last_view.%s = scenes.id", sceneIDColumn), + ) + timestampCriterionHandler(sceneFilter.LastPlayedAt, "IFNULL(last_played_at, datetime(0))")(ctx, f) + } + })) query.handleCriterion(ctx, sceneTagsCriterionHandler(qb, sceneFilter.Tags)) query.handleCriterion(ctx, sceneTagCountCriterionHandler(qb, sceneFilter.TagCount)) diff --git a/ui/v2.5/src/models/list-filter/scenes.ts b/ui/v2.5/src/models/list-filter/scenes.ts index 568a23b41..f6210a918 100644 --- a/ui/v2.5/src/models/list-filter/scenes.ts +++ b/ui/v2.5/src/models/list-filter/scenes.ts @@ -89,6 +89,7 @@ const criterionOptions = [ createDurationCriterionOption("resume_time"), createDurationCriterionOption("play_duration"), createMandatoryNumberCriterionOption("play_count"), + createMandatoryTimestampCriterionOption("last_played_at"), HasMarkersCriterionOption, SceneIsMissingCriterionOption, TagsCriterionOption, diff --git a/ui/v2.5/src/models/list-filter/types.ts b/ui/v2.5/src/models/list-filter/types.ts index 3becd1041..739e3248b 100644 --- a/ui/v2.5/src/models/list-filter/types.ts +++ b/ui/v2.5/src/models/list-filter/types.ts @@ -179,6 +179,7 @@ export type CriterionType = | "resume_time" | "play_count" | "play_duration" + | "last_played_at" | "name" | "details" | "title"