evazion
2021-09-16 02:13:15 -05:00
parent c14e3ec902
commit 313257b771
2 changed files with 31 additions and 1 deletions

View File

@@ -37,7 +37,7 @@ class PostQueryBuilder
ordpool note comment commentary id rating locked source status filetype
disapproved parent child search embedded md5 width height mpixels ratio
score favcount filesize date age order limit tagcount pixiv_id pixiv
unaliased
unaliased exif
] + COUNT_METATAGS + COUNT_METATAG_SYNONYMS + CATEGORY_COUNT_METATAGS
ORDER_METATAGS = %w[
@@ -192,6 +192,8 @@ class PostQueryBuilder
ordfav_matches(value)
when "unaliased"
unaliased_matches(value)
when "exif"
exif_matches(value)
when "user"
user_matches(:uploader, value)
when "approver"
@@ -242,6 +244,20 @@ class PostQueryBuilder
end
end
def exif_matches(string)
# string = exif:File:ColorComponents=3
if string.include?("=")
key, value = string.split(/=/, 2)
hash = { key => value }
metadata = MediaMetadata.joins(:media_asset).where_json_contains(:metadata, hash)
# string = exif:File:ColorComponents
else
metadata = MediaMetadata.joins(:media_asset).where_json_has_key(:metadata, string)
end
Post.where(md5: metadata.select(:md5))
end
def attribute_matches(value, field, type = :integer)
operator, *args = parse_metatag_value(value, type)
Post.where_operator(field, operator, *args)

View File

@@ -901,6 +901,20 @@ class PostQueryBuilderTest < ActiveSupport::TestCase
end
end
should "return posts for an exif:<value> metatag" do
jpg = create(:post, media_asset: create(:media_asset, file: "test/files/test.jpg"))
gif = create(:post, media_asset: create(:media_asset, file: "test/files/test.gif"))
png = create(:post, media_asset: create(:media_asset, file: "test/files/test.png"))
assert_tag_match([jpg], "exif:File:ColorComponents")
assert_tag_match([jpg], "exif:File:ColorComponents=3")
assert_tag_match([gif], "exif:GIF:GIFVersion")
assert_tag_match([gif], "exif:GIF:GIFVersion=89a")
assert_tag_match([png], "exif:PNG:ColorType")
assert_tag_match([png], "exif:PNG:ColorType=RGB")
assert_tag_match([], "exif:DNE")
end
should "return posts ordered by a particular attribute" do
posts = (1..2).map do |n|
tags = ["tagme", "gentag1 gentag2 artist:arttag char:chartag copy:copytag"]