Add last_played_at filter (#4829)

This commit is contained in:
NotForMyCV 2024-05-14 05:40:46 +01:00 committed by GitHub
parent 1d565a7cbd
commit c8aeb7966a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 16 additions and 0 deletions

View file

@ -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"

View file

@ -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

View file

@ -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))

View file

@ -89,6 +89,7 @@ const criterionOptions = [
createDurationCriterionOption("resume_time"),
createDurationCriterionOption("play_duration"),
createMandatoryNumberCriterionOption("play_count"),
createMandatoryTimestampCriterionOption("last_played_at"),
HasMarkersCriterionOption,
SceneIsMissingCriterionOption,
TagsCriterionOption,

View file

@ -179,6 +179,7 @@ export type CriterionType =
| "resume_time"
| "play_count"
| "play_duration"
| "last_played_at"
| "name"
| "details"
| "title"