From 375e823e63e69906c86dc42007b767a0fdcdd4bb Mon Sep 17 00:00:00 2001 From: dopepump <155258061+dopepump@users.noreply.github.com> Date: Sat, 11 May 2024 22:31:24 +0100 Subject: [PATCH 1/2] Add last_played_at filter --- graphql/schema/types/filters.graphql | 2 ++ pkg/models/scene.go | 2 ++ pkg/sqlite/scene.go | 10 ++++++++++ ui/v2.5/src/models/list-filter/scenes.ts | 1 + ui/v2.5/src/models/list-filter/types.ts | 2 ++ 5 files changed, 17 insertions(+) diff --git a/graphql/schema/types/filters.graphql b/graphql/schema/types/filters.graphql index b30f3bc9cd2..2f80b8b02d3 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 4b1f2a01bc5..c7a87151c6d 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 4e3c4c8a9e6..355a503848d 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, "last_played_at")(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 568a23b4100..f6210a91841 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 3becd104118..80f27e2f1ac 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" @@ -205,6 +206,7 @@ export type CriterionType = | "scene_date" | "scene_created_at" | "scene_updated_at" + | "scene_last_played_at" | "description" | "code" | "photographer" From d58f8835b78e6d8178903519b2dbcfc6a74d26d3 Mon Sep 17 00:00:00 2001 From: dopepump <155258061+dopepump@users.noreply.github.com> Date: Sun, 12 May 2024 14:55:18 +0100 Subject: [PATCH 2/2] Handle scenes with no play history on last_played_at filter --- pkg/sqlite/scene.go | 2 +- ui/v2.5/src/models/list-filter/types.ts | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/sqlite/scene.go b/pkg/sqlite/scene.go index 355a503848d..841dfa3f4cc 100644 --- a/pkg/sqlite/scene.go +++ b/pkg/sqlite/scene.go @@ -993,7 +993,7 @@ func (qb *SceneStore) makeFilter(ctx context.Context, sceneFilter *models.SceneF "scene_last_view", fmt.Sprintf("scene_last_view.%s = scenes.id", sceneIDColumn), ) - timestampCriterionHandler(sceneFilter.LastPlayedAt, "last_played_at")(ctx, f) + timestampCriterionHandler(sceneFilter.LastPlayedAt, "IFNULL(last_played_at, datetime(0))")(ctx, f) } })) diff --git a/ui/v2.5/src/models/list-filter/types.ts b/ui/v2.5/src/models/list-filter/types.ts index 80f27e2f1ac..739e3248b99 100644 --- a/ui/v2.5/src/models/list-filter/types.ts +++ b/ui/v2.5/src/models/list-filter/types.ts @@ -206,7 +206,6 @@ export type CriterionType = | "scene_date" | "scene_created_at" | "scene_updated_at" - | "scene_last_played_at" | "description" | "code" | "photographer"