diff --git a/app/src/main/java/com/github/damontecres/stashapp/filter/DescriptionExtractors.kt b/app/src/main/java/com/github/damontecres/stashapp/filter/DescriptionExtractors.kt index b80d9139..a9e5a7d5 100644 --- a/app/src/main/java/com/github/damontecres/stashapp/filter/DescriptionExtractors.kt +++ b/app/src/main/java/com/github/damontecres/stashapp/filter/DescriptionExtractors.kt @@ -18,6 +18,7 @@ import com.github.damontecres.stashapp.api.type.CircumcisionCriterionInput import com.github.damontecres.stashapp.api.type.CircumisedEnum import com.github.damontecres.stashapp.api.type.CriterionModifier import com.github.damontecres.stashapp.api.type.DateCriterionInput +import com.github.damontecres.stashapp.api.type.DuplicationCriterionInput import com.github.damontecres.stashapp.api.type.FloatCriterionInput import com.github.damontecres.stashapp.api.type.GenderCriterionInput import com.github.damontecres.stashapp.api.type.GenderEnum @@ -26,7 +27,6 @@ import com.github.damontecres.stashapp.api.type.IntCriterionInput import com.github.damontecres.stashapp.api.type.MultiCriterionInput import com.github.damontecres.stashapp.api.type.OrientationCriterionInput import com.github.damontecres.stashapp.api.type.OrientationEnum -import com.github.damontecres.stashapp.api.type.PHashDuplicationCriterionInput import com.github.damontecres.stashapp.api.type.PhashDistanceCriterionInput import com.github.damontecres.stashapp.api.type.ResolutionCriterionInput import com.github.damontecres.stashapp.api.type.ResolutionEnum @@ -368,7 +368,8 @@ fun filterSummary(f: PhashDistanceCriterionInput): String { } } -fun filterSummary(f: PHashDuplicationCriterionInput): String { +fun filterSummary(f: DuplicationCriterionInput): String { + // TODO update to new fields val duplicated = f.duplicated.getOrNull() val distance = f.distance.getOrNull() return if (distance != null) { @@ -553,7 +554,7 @@ fun filterSummary( filterSummary(value) } - is PHashDuplicationCriterionInput -> { + is DuplicationCriterionInput -> { filterSummary(value) } diff --git a/app/src/main/java/com/github/damontecres/stashapp/filter/FilterOption.kt b/app/src/main/java/com/github/damontecres/stashapp/filter/FilterOption.kt index df6fd7fe..ffcc9ad9 100644 --- a/app/src/main/java/com/github/damontecres/stashapp/filter/FilterOption.kt +++ b/app/src/main/java/com/github/damontecres/stashapp/filter/FilterOption.kt @@ -1253,6 +1253,15 @@ private val GroupFilterOptions = { filter, value -> filter.copy(rating100 = value) }, TwoValueCriterionModifiers, ), + FilterOption( + "scene_count", + R.string.stashapp_scene_count, + null, + IntCriterionInput::class, + { it.scene_count }, + { filter, value -> filter.copy(scene_count = value) }, + TwoValueCriterionModifiers, + ), FilterOption( "studios", R.string.stashapp_studios, diff --git a/app/src/main/java/com/github/damontecres/stashapp/filter/output/FilterOutputs.kt b/app/src/main/java/com/github/damontecres/stashapp/filter/output/FilterOutputs.kt index 802ace0d..4c3c16e5 100644 --- a/app/src/main/java/com/github/damontecres/stashapp/filter/output/FilterOutputs.kt +++ b/app/src/main/java/com/github/damontecres/stashapp/filter/output/FilterOutputs.kt @@ -5,6 +5,7 @@ import com.github.damontecres.stashapp.api.type.CircumisedEnum import com.github.damontecres.stashapp.api.type.CriterionModifier import com.github.damontecres.stashapp.api.type.CustomFieldCriterionInput import com.github.damontecres.stashapp.api.type.DateCriterionInput +import com.github.damontecres.stashapp.api.type.DuplicationCriterionInput import com.github.damontecres.stashapp.api.type.FloatCriterionInput import com.github.damontecres.stashapp.api.type.GenderCriterionInput import com.github.damontecres.stashapp.api.type.GenderEnum @@ -13,11 +14,11 @@ import com.github.damontecres.stashapp.api.type.IntCriterionInput import com.github.damontecres.stashapp.api.type.MultiCriterionInput import com.github.damontecres.stashapp.api.type.OrientationCriterionInput import com.github.damontecres.stashapp.api.type.OrientationEnum -import com.github.damontecres.stashapp.api.type.PHashDuplicationCriterionInput import com.github.damontecres.stashapp.api.type.PhashDistanceCriterionInput import com.github.damontecres.stashapp.api.type.ResolutionCriterionInput import com.github.damontecres.stashapp.api.type.ResolutionEnum import com.github.damontecres.stashapp.api.type.StashIDCriterionInput +import com.github.damontecres.stashapp.api.type.StashIDsCriterionInput import com.github.damontecres.stashapp.api.type.StringCriterionInput import com.github.damontecres.stashapp.api.type.TimestampCriterionInput @@ -143,7 +144,7 @@ fun PhashDistanceCriterionInput.toMap(): Map = ) } -fun PHashDuplicationCriterionInput.toMap(): Map = +fun DuplicationCriterionInput.toMap(): Map = buildMap { put("modifier", CriterionModifier.EQUALS.rawValue) if (duplicated.getOrNull() == false) { @@ -151,6 +152,11 @@ fun PHashDuplicationCriterionInput.toMap(): Map = } else { put("value", true) } + distance.getOrNull()?.let { put("distance", it) } + phash.getOrNull()?.let { put("phash", it) } + stash_id.getOrNull()?.let { put("stash_id", it) } + title.getOrNull()?.let { put("title", it) } + url.getOrNull()?.let { put("url", it) } } fun ResolutionCriterionInput.toMap(): Map = @@ -206,6 +212,18 @@ fun StashIDCriterionInput.toMap(): Map = ) } +fun StashIDsCriterionInput.toMap(): Map = + buildMap { + put("modifier", modifier.rawValue) + put( + "value", + buildMap { + put("stashIDs", stash_ids.getOrNull() ?: "") + put("endpoint", endpoint.getOrNull() ?: "") + }, + ) + } + fun TimestampCriterionInput.toMap(): Map = buildMap { put("modifier", modifier.rawValue) diff --git a/app/src/main/java/com/github/damontecres/stashapp/filter/output/FilterWriter.kt b/app/src/main/java/com/github/damontecres/stashapp/filter/output/FilterWriter.kt index 176e7318..ff0a71c2 100644 --- a/app/src/main/java/com/github/damontecres/stashapp/filter/output/FilterWriter.kt +++ b/app/src/main/java/com/github/damontecres/stashapp/filter/output/FilterWriter.kt @@ -5,17 +5,18 @@ import com.github.damontecres.stashapp.api.type.CircumcisionCriterionInput import com.github.damontecres.stashapp.api.type.CriterionModifier import com.github.damontecres.stashapp.api.type.CustomFieldCriterionInput import com.github.damontecres.stashapp.api.type.DateCriterionInput +import com.github.damontecres.stashapp.api.type.DuplicationCriterionInput import com.github.damontecres.stashapp.api.type.FloatCriterionInput import com.github.damontecres.stashapp.api.type.GenderCriterionInput import com.github.damontecres.stashapp.api.type.HierarchicalMultiCriterionInput import com.github.damontecres.stashapp.api.type.IntCriterionInput import com.github.damontecres.stashapp.api.type.MultiCriterionInput import com.github.damontecres.stashapp.api.type.OrientationCriterionInput -import com.github.damontecres.stashapp.api.type.PHashDuplicationCriterionInput import com.github.damontecres.stashapp.api.type.PhashDistanceCriterionInput import com.github.damontecres.stashapp.api.type.ResolutionCriterionInput import com.github.damontecres.stashapp.api.type.StashDataFilter import com.github.damontecres.stashapp.api.type.StashIDCriterionInput +import com.github.damontecres.stashapp.api.type.StashIDsCriterionInput import com.github.damontecres.stashapp.api.type.StringCriterionInput import com.github.damontecres.stashapp.api.type.TimestampCriterionInput import com.github.damontecres.stashapp.data.DataType @@ -60,7 +61,7 @@ class FilterWriter( o.toMap() } - is PHashDuplicationCriterionInput -> { + is DuplicationCriterionInput -> { o.toMap() } @@ -76,6 +77,10 @@ class FilterWriter( o.toMap() } + is StashIDsCriterionInput -> { + o.toMap() + } + is TimestampCriterionInput -> { o.toMap() } diff --git a/app/src/main/java/com/github/damontecres/stashapp/util/FilterParser.kt b/app/src/main/java/com/github/damontecres/stashapp/util/FilterParser.kt index 0904e694..193694aa 100644 --- a/app/src/main/java/com/github/damontecres/stashapp/util/FilterParser.kt +++ b/app/src/main/java/com/github/damontecres/stashapp/util/FilterParser.kt @@ -6,6 +6,8 @@ import com.github.damontecres.stashapp.api.type.CircumisedEnum import com.github.damontecres.stashapp.api.type.CriterionModifier import com.github.damontecres.stashapp.api.type.CustomFieldCriterionInput import com.github.damontecres.stashapp.api.type.DateCriterionInput +import com.github.damontecres.stashapp.api.type.DuplicationCriterionInput +import com.github.damontecres.stashapp.api.type.FileDuplicationCriterionInput import com.github.damontecres.stashapp.api.type.FloatCriterionInput import com.github.damontecres.stashapp.api.type.GenderCriterionInput import com.github.damontecres.stashapp.api.type.GenderEnum @@ -14,13 +16,13 @@ import com.github.damontecres.stashapp.api.type.IntCriterionInput import com.github.damontecres.stashapp.api.type.MultiCriterionInput import com.github.damontecres.stashapp.api.type.OrientationCriterionInput import com.github.damontecres.stashapp.api.type.OrientationEnum -import com.github.damontecres.stashapp.api.type.PHashDuplicationCriterionInput import com.github.damontecres.stashapp.api.type.PhashDistanceCriterionInput import com.github.damontecres.stashapp.api.type.ResolutionCriterionInput import com.github.damontecres.stashapp.api.type.ResolutionEnum import com.github.damontecres.stashapp.api.type.SortDirectionEnum import com.github.damontecres.stashapp.api.type.StashDataFilter import com.github.damontecres.stashapp.api.type.StashIDCriterionInput +import com.github.damontecres.stashapp.api.type.StashIDsCriterionInput import com.github.damontecres.stashapp.api.type.StringCriterionInput import com.github.damontecres.stashapp.api.type.TimestampCriterionInput import com.github.damontecres.stashapp.data.DataType @@ -233,6 +235,18 @@ class FilterParser( null } + fun convertStashIDsCriterionInput(it: Map?): StashIDsCriterionInput? = + if (it != null) { + val values = it["value"] as Map? + StashIDsCriterionInput( + endpoint = Optional.presentIfNotNull(values?.get("endpoint")?.toString()), + stash_ids = Optional.presentIfNotNull(values?.get("stashIDs") as? List), + modifier = CriterionModifier.valueOf(it["modifier"]!! as String), + ) + } else { + null + } + fun convertPhashDistanceCriterionInput(it: Map?): PhashDistanceCriterionInput? = if (it != null) { val values = it["value"] as Map? @@ -245,11 +259,28 @@ class FilterParser( null } - fun convertPHashDuplicationCriterionInput(it: Map?): PHashDuplicationCriterionInput? = + fun convertDuplicationCriterionInput(it: Map?): DuplicationCriterionInput? = + if (it != null) { + // TODO test + DuplicationCriterionInput( + duplicated = Optional.presentIfNotNull(it["value"]?.toString()?.toBoolean()), + distance = Optional.presentIfNotNull(it["distance"]?.toString()?.toInt()), + phash = Optional.presentIfNotNull(it["phash"]?.toString()?.toBoolean()), + url = Optional.presentIfNotNull(it["url"]?.toString()?.toBoolean()), + stash_id = Optional.presentIfNotNull(it["stash_id"]?.toString()?.toBoolean()), + title = Optional.presentIfNotNull(it["title"]?.toString()?.toBoolean()), + ) + } else { + null + } + + fun convertFileDuplicationCriterionInput(it: Map?): FileDuplicationCriterionInput? = if (it != null) { - PHashDuplicationCriterionInput( + // TODO test + FileDuplicationCriterionInput( duplicated = Optional.presentIfNotNull(it["value"]?.toString()?.toBoolean()), distance = Optional.presentIfNotNull(it["distance"]?.toString()?.toInt()), + phash = Optional.presentIfNotNull(it["phash"]?.toString()?.toBoolean()), ) } else { null diff --git a/app/src/main/java/com/github/damontecres/stashapp/util/FilterParserExtensions.kt b/app/src/main/java/com/github/damontecres/stashapp/util/FilterParserExtensions.kt index 1be26b83..af1c6006 100644 --- a/app/src/main/java/com/github/damontecres/stashapp/util/FilterParserExtensions.kt +++ b/app/src/main/java/com/github/damontecres/stashapp/util/FilterParserExtensions.kt @@ -39,6 +39,8 @@ fun FilterParser.convertPerformerFilterType(f: Any?): PerformerFilterType? = penis_length = Optional.presentIfNotNull(convertFloatCriterionInput(filter["penis_length"])), circumcised = Optional.presentIfNotNull(convertCircumcisionCriterionInput(filter["circumcised"])), career_length = Optional.presentIfNotNull(convertStringCriterionInput(filter["career_length"])), + career_start = Optional.presentIfNotNull(convertIntCriterionInput(filter["career_start"])), + career_end = Optional.presentIfNotNull(convertIntCriterionInput(filter["career_end"])), tattoos = Optional.presentIfNotNull(convertStringCriterionInput(filter["tattoos"])), piercings = Optional.presentIfNotNull(convertStringCriterionInput(filter["piercings"])), aliases = Optional.presentIfNotNull(convertStringCriterionInput(filter["aliases"])), @@ -47,11 +49,13 @@ fun FilterParser.convertPerformerFilterType(f: Any?): PerformerFilterType? = tags = Optional.presentIfNotNull(convertHierarchicalMultiCriterionInput(filter["tags"])), tag_count = Optional.presentIfNotNull(convertIntCriterionInput(filter["tag_count"])), scene_count = Optional.presentIfNotNull(convertIntCriterionInput(filter["scene_count"])), + marker_count = Optional.presentIfNotNull(convertIntCriterionInput(filter["marker_count"])), image_count = Optional.presentIfNotNull(convertIntCriterionInput(filter["image_count"])), gallery_count = Optional.presentIfNotNull(convertIntCriterionInput(filter["gallery_count"])), play_count = Optional.presentIfNotNull(convertIntCriterionInput(filter["play_count"])), o_counter = Optional.presentIfNotNull(convertIntCriterionInput(filter["o_counter"])), stash_id_endpoint = Optional.presentIfNotNull(convertStashIDCriterionInput(filter["stash_id_endpoint"])), + stash_ids_endpoint = Optional.presentIfNotNull(convertStashIDsCriterionInput(filter["stash_ids_endpoint"])), rating100 = Optional.presentIfNotNull(convertIntCriterionInput(filter["rating100"])), url = Optional.presentIfNotNull(convertStringCriterionInput(filter["url"])), hair_color = Optional.presentIfNotNull(convertStringCriterionInput(filter["hair_color"])), @@ -67,6 +71,7 @@ fun FilterParser.convertPerformerFilterType(f: Any?): PerformerFilterType? = images_filter = Optional.presentIfNotNull(convertImageFilterType(filter["images_filter"])), galleries_filter = Optional.presentIfNotNull(convertGalleryFilterType(filter["galleries_filter"])), tags_filter = Optional.presentIfNotNull(convertTagFilterType(filter["tags_filter"])), + markers_filter = Optional.presentIfNotNull(convertSceneMarkerFilterType(filter["markers_filter"])), created_at = Optional.presentIfNotNull(convertTimestampCriterionInput(filter["created_at"])), updated_at = Optional.presentIfNotNull(convertTimestampCriterionInput(filter["updated_at"])), custom_fields = Optional.presentIfNotNull(convertCustomFieldCriterionInput(filter["custom_fields"] as List<*>?)), @@ -98,7 +103,7 @@ fun FilterParser.convertSceneFilterType(f: Any?): SceneFilterType? = rating100 = Optional.presentIfNotNull(convertIntCriterionInput(filter["rating100"])), organized = Optional.presentIfNotNull(convertBoolean(filter["organized"])), o_counter = Optional.presentIfNotNull(convertIntCriterionInput(filter["o_counter"])), - duplicated = Optional.presentIfNotNull(convertPHashDuplicationCriterionInput(filter["duplicated"])), + duplicated = Optional.presentIfNotNull(convertDuplicationCriterionInput(filter["duplicated"])), resolution = Optional.presentIfNotNull(convertResolutionCriterionInput(filter["resolution"])), orientation = Optional.presentIfNotNull(convertOrientationCriterionInput(filter["orientation"])), framerate = Optional.presentIfNotNull(convertIntCriterionInput(filter["framerate"])), @@ -120,6 +125,8 @@ fun FilterParser.convertSceneFilterType(f: Any?): SceneFilterType? = performers = Optional.presentIfNotNull(convertMultiCriterionInput(filter["performers"])), performer_count = Optional.presentIfNotNull(convertIntCriterionInput(filter["performer_count"])), stash_id_endpoint = Optional.presentIfNotNull(convertStashIDCriterionInput(filter["stash_id_endpoint"])), + stash_ids_endpoint = Optional.presentIfNotNull(convertStashIDsCriterionInput(filter["stash_ids_endpoint"])), + stash_id_count = Optional.presentIfNotNull(convertIntCriterionInput(filter["stash_id_count"])), url = Optional.presentIfNotNull(convertStringCriterionInput(filter["url"])), interactive = Optional.presentIfNotNull(convertBoolean(filter["interactive"])), interactive_speed = Optional.presentIfNotNull(convertIntCriterionInput(filter["interactive_speed"])), @@ -139,6 +146,7 @@ fun FilterParser.convertSceneFilterType(f: Any?): SceneFilterType? = groups_filter = Optional.presentIfNotNull(convertGroupFilterType(filter["groups_filter"])), markers_filter = Optional.presentIfNotNull(convertSceneMarkerFilterType(filter["markers_filter"])), files_filter = Optional.presentIfNotNull(convertFileFilterType(filter["files_filter"])), + custom_fields = Optional.presentIfNotNull(convertCustomFieldCriterionInput(filter["custom_fields"] as List<*>?)), ) } else { null @@ -157,6 +165,7 @@ fun FilterParser.convertStudioFilterType(f: Any?): StudioFilterType? = details = Optional.presentIfNotNull(convertStringCriterionInput(filter["details"])), parents = Optional.presentIfNotNull(convertMultiCriterionInput(filter["parents"])), stash_id_endpoint = Optional.presentIfNotNull(convertStashIDCriterionInput(filter["stash_id_endpoint"])), + stash_ids_endpoint = Optional.presentIfNotNull(convertStashIDsCriterionInput(filter["stash_ids_endpoint"])), tags = Optional.presentIfNotNull(convertHierarchicalMultiCriterionInput(filter["tags"])), is_missing = Optional.presentIfNotNull(convertString(filter["is_missing"])), rating100 = Optional.presentIfNotNull(convertIntCriterionInput(filter["rating100"])), @@ -164,16 +173,20 @@ fun FilterParser.convertStudioFilterType(f: Any?): StudioFilterType? = scene_count = Optional.presentIfNotNull(convertIntCriterionInput(filter["scene_count"])), image_count = Optional.presentIfNotNull(convertIntCriterionInput(filter["image_count"])), gallery_count = Optional.presentIfNotNull(convertIntCriterionInput(filter["gallery_count"])), + group_count = Optional.presentIfNotNull(convertIntCriterionInput(filter["group_count"])), tag_count = Optional.presentIfNotNull(convertIntCriterionInput(filter["tag_count"])), url = Optional.presentIfNotNull(convertStringCriterionInput(filter["url"])), aliases = Optional.presentIfNotNull(convertStringCriterionInput(filter["aliases"])), child_count = Optional.presentIfNotNull(convertIntCriterionInput(filter["child_count"])), ignore_auto_tag = Optional.presentIfNotNull(convertBoolean(filter["ignore_auto_tag"])), + organized = Optional.presentIfNotNull(convertBoolean(filter["organized"])), scenes_filter = Optional.presentIfNotNull(convertSceneFilterType(filter["scenes_filter"])), images_filter = Optional.presentIfNotNull(convertImageFilterType(filter["images_filter"])), galleries_filter = Optional.presentIfNotNull(convertGalleryFilterType(filter["galleries_filter"])), + groups_filter = Optional.presentIfNotNull(convertGroupFilterType(filter["groups_filter"])), created_at = Optional.presentIfNotNull(convertTimestampCriterionInput(filter["created_at"])), updated_at = Optional.presentIfNotNull(convertTimestampCriterionInput(filter["updated_at"])), + custom_fields = Optional.presentIfNotNull(convertCustomFieldCriterionInput(filter["custom_fields"] as List<*>?)), ) } else { null @@ -208,11 +221,17 @@ fun FilterParser.convertTagFilterType(f: Any?): TagFilterType? = child_count = Optional.presentIfNotNull(convertIntCriterionInput(filter["child_count"])), ignore_auto_tag = Optional.presentIfNotNull(convertBoolean(filter["ignore_auto_tag"])), stash_id_endpoint = Optional.presentIfNotNull(convertStashIDCriterionInput(filter["stash_id_endpoint"])), + stash_ids_endpoint = Optional.presentIfNotNull(convertStashIDsCriterionInput(filter["stash_ids_endpoint"])), scenes_filter = Optional.presentIfNotNull(convertSceneFilterType(filter["scenes_filter"])), images_filter = Optional.presentIfNotNull(convertImageFilterType(filter["images_filter"])), galleries_filter = Optional.presentIfNotNull(convertGalleryFilterType(filter["galleries_filter"])), + groups_filter = Optional.presentIfNotNull(convertGroupFilterType(filter["groups_filter"])), + performers_filter = Optional.presentIfNotNull(convertPerformerFilterType(filter["performers_filter"])), + studios_filter = Optional.presentIfNotNull(convertStudioFilterType(filter["studios_filter"])), + markers_filter = Optional.presentIfNotNull(convertSceneMarkerFilterType(filter["markers_filter"])), created_at = Optional.presentIfNotNull(convertTimestampCriterionInput(filter["created_at"])), updated_at = Optional.presentIfNotNull(convertTimestampCriterionInput(filter["updated_at"])), + custom_fields = Optional.presentIfNotNull(convertCustomFieldCriterionInput(filter["custom_fields"] as List<*>?)), ) } else { null @@ -246,8 +265,10 @@ fun FilterParser.convertGroupFilterType(f: Any?): GroupFilterType? = sub_groups = Optional.presentIfNotNull(convertHierarchicalMultiCriterionInput(filter["sub_groups"])), containing_group_count = Optional.presentIfNotNull(convertIntCriterionInput(filter["containing_group_count"])), sub_group_count = Optional.presentIfNotNull(convertIntCriterionInput(filter["sub_group_count"])), + scene_count = Optional.presentIfNotNull(convertIntCriterionInput(filter["scene_count"])), scenes_filter = Optional.presentIfNotNull(convertSceneFilterType(filter["scenes_filter"])), studios_filter = Optional.presentIfNotNull(convertStudioFilterType(filter["studios_filter"])), + custom_fields = Optional.presentIfNotNull(convertCustomFieldCriterionInput(filter["custom_fields"] as List<*>?)), ) } else { null @@ -288,6 +309,7 @@ fun FilterParser.convertImageFilterType(f: Any?): ImageFilterType? = details = Optional.presentIfNotNull(convertStringCriterionInput(filter["details"])), id = Optional.presentIfNotNull(convertIntCriterionInput(filter["id"])), checksum = Optional.presentIfNotNull(convertStringCriterionInput(filter["checksum"])), + phash_distance = Optional.presentIfNotNull(convertPhashDistanceCriterionInput(filter["phash_distance"])), path = Optional.presentIfNotNull(convertStringCriterionInput(filter["path"])), file_count = Optional.presentIfNotNull(convertIntCriterionInput(filter["file_count"])), rating100 = Optional.presentIfNotNull(convertIntCriterionInput(filter["rating100"])), @@ -316,6 +338,7 @@ fun FilterParser.convertImageFilterType(f: Any?): ImageFilterType? = studios_filter = Optional.presentIfNotNull(convertStudioFilterType(filter["studios_filter"])), tags_filter = Optional.presentIfNotNull(convertTagFilterType(filter["tags_filter"])), files_filter = Optional.presentIfNotNull(convertFileFilterType(filter["files_filter"])), + custom_fields = Optional.presentIfNotNull(convertCustomFieldCriterionInput(filter["custom_fields"] as List<*>?)), ) } else { null @@ -365,6 +388,7 @@ fun FilterParser.convertGalleryFilterType(f: Any?): GalleryFilterType? = tags_filter = Optional.presentIfNotNull(convertTagFilterType(filter["tags_filter"])), files_filter = Optional.presentIfNotNull(convertFileFilterType(filter["files_filter"])), folders_filter = Optional.presentIfNotNull(convertFolderFilterType(filter["folders_filter"])), + custom_fields = Optional.presentIfNotNull(convertCustomFieldCriterionInput(filter["custom_fields"] as List<*>?)), ) } else { null @@ -415,7 +439,7 @@ fun FilterParser.convertFileFilterType(f: Any?): FileFilterType? = parent_folder = Optional.presentIfNotNull(convertHierarchicalMultiCriterionInput(filter["parent_folder"])), zip_file = Optional.presentIfNotNull(convertMultiCriterionInput(filter["zip_file"])), mod_time = Optional.presentIfNotNull(convertTimestampCriterionInput(filter["mod_time"])), - duplicated = Optional.presentIfNotNull(convertPHashDuplicationCriterionInput(filter["duplicated"])), + duplicated = Optional.presentIfNotNull(convertFileDuplicationCriterionInput(filter["duplicated"])), video_file_filter = Optional.presentIfNotNull(convertVideoFileFilterInput(filter["video_file_filter"])), image_file_filter = Optional.presentIfNotNull(convertImageFileFilterInput(filter["image_file_filter"])), scene_count = Optional.presentIfNotNull(convertIntCriterionInput(filter["scene_count"])), diff --git a/stash-server b/stash-server index b23b0267..d8448ba3 160000 --- a/stash-server +++ b/stash-server @@ -1 +1 @@ -Subproject commit b23b0267adc668bb22390ccc5772e75946aed492 +Subproject commit d8448ba37ecf7749b4d75356b33be471ac6c8fdd