iqdb: lower similarity cutoff, return more results (fix #4190).

* Change cutoffs on upload page to max 5 results, min. 20% similarity.
* Change cutoffs on standalone /iqdb_queries page to max 20 results, min. 0% similarity.
* /iqdb_queries.json: add `limit` and `similarity` params to change default cutoffs.
This commit is contained in:
evazion
2019-10-14 21:16:04 -05:00
parent ca54e2d67b
commit fa37b1edcd
4 changed files with 25 additions and 21 deletions

View File

@@ -3,15 +3,12 @@ class IqdbQueriesController < ApplicationController
def show def show
if params[:url] if params[:url]
strategy = Sources::Strategies.find(params[:url]) url = Sources::Strategies.find(params[:url]).image_url
@matches = IqdbProxy.query(strategy.image_url) @matches = IqdbProxy.query(url, params[:limit], params[:similarity])
end elsif params[:post_id]
url = Post.find(params[:post_id]).preview_file_url
if params[:post_id] @matches = IqdbProxy.query(url, params[:limit], params[:similarity])
@matches = IqdbProxy.query(Post.find(params[:post_id]).preview_file_url) elsif params[:matches]
end
if params[:matches]
@matches = IqdbProxy.decorate_posts(JSON.parse(params[:matches])) @matches = IqdbProxy.decorate_posts(JSON.parse(params[:matches]))
end end

View File

@@ -68,7 +68,7 @@ Upload.validate_upload = function (e) {
Upload.initialize_iqdb_source = function() { Upload.initialize_iqdb_source = function() {
if (/^https?:\/\//.test($("#upload_source").val())) { if (/^https?:\/\//.test($("#upload_source").val())) {
$.get("/iqdb_queries.js", { url: $("#upload_source").val() }); $.get("/iqdb_queries.js", { url: $("#upload_source").val(), limit: 5, similarity: 20 });
} }
} }

View File

@@ -1,12 +1,15 @@
class IqdbProxy class IqdbProxy
def self.query(image_url) def self.query(url, limit, similarity)
raise NotImplementedError unless Danbooru.config.iqdbs_server.present? raise NotImplementedError unless Danbooru.config.iqdbs_server.present?
url = URI.parse(Danbooru.config.iqdbs_server) limit ||= 20
url.path = "/similar" similarity ||= 0.0
url.query = {url: image_url}.to_query query = { url: url, limit: limit }
json = HTTParty.get(url.to_s, Danbooru.config.httparty_options).parsed_response response = HTTParty.get("#{Danbooru.config.iqdbs_server}/similar", query: query, **Danbooru.config.httparty_options)
decorate_posts(json)
json = decorate_posts(response.parsed_response)
json = json.select { |result| result["score"] >= similarity.to_f }.take(limit.to_i)
json
end end
def self.decorate_posts(json) def self.decorate_posts(json)

View File

@@ -23,8 +23,10 @@ class IqdbQueriesControllerTest < ActionDispatch::IntegrationTest
end end
should "render a response" do should "render a response" do
IqdbProxy.expects(:query).with(@url).returns(@mocked_response) IqdbProxy.expects(:query).returns(@mocked_response)
get_auth iqdb_queries_path(variant: "xhr"), @user, params: @params get_auth iqdb_queries_path, @user, as: :javascript, params: @params
assert_response :success
assert_select("#post_#{@posts[0].id}") assert_select("#post_#{@posts[0].id}")
end end
end end
@@ -41,22 +43,24 @@ class IqdbQueriesControllerTest < ActionDispatch::IntegrationTest
end end
should "redirect to iqdbs" do should "redirect to iqdbs" do
IqdbProxy.expects(:query).with(@posts[0].preview_file_url).returns(@mocked_response) IqdbProxy.expects(:query).returns(@mocked_response)
get_auth iqdb_queries_path, @user, params: @params get_auth iqdb_queries_path, @user, params: @params
assert_response :success
assert_select("#post_#{@posts[0].id}") assert_select("#post_#{@posts[0].id}")
end end
end end
context "with matches" do context "with matches" do
setup do setup do
json = @posts.map {|x| {"post_id" => x.id, "score" => 1}}.to_json json = @posts.map {|x| {"post_id" => x.id, "score" => 1}}.to_json
@params = { matches: json } @params = { matches: json }
end end
should "render with matches" do should "render with matches" do
get_auth iqdb_queries_path, @user, params: @params get_auth iqdb_queries_path, @user, params: @params
assert_response :success assert_response :success
end end
end end
end end
end end