diff --git a/app/controllers/artists_controller.rb b/app/controllers/artists_controller.rb
index 1c83352fd..21deaee0d 100644
--- a/app/controllers/artists_controller.rb
+++ b/app/controllers/artists_controller.rb
@@ -92,20 +92,6 @@ class ArtistsController < ApplicationController
end
end
- def finder
- @artists = Artist.find_artists(params[:url], params[:referer_url])
-
- respond_with(@artists) do |format|
- format.xml do
- render :xml => @artists.to_xml(:include => [:sorted_urls], :root => "artists")
- end
- format.json do
- render :json => @artists.to_json(:include => [:sorted_urls])
- expires_in params[:expiry].to_i.days if params[:expiry]
- end
- end
- end
-
private
def load_artist
diff --git a/app/javascript/src/javascripts/posts.js.erb b/app/javascript/src/javascripts/posts.js.erb
index 7d617b8b1..9a1eb4b96 100644
--- a/app/javascript/src/javascripts/posts.js.erb
+++ b/app/javascript/src/javascripts/posts.js.erb
@@ -441,7 +441,7 @@ Post.initialize_post_sections = function() {
$("#share").hide();
$("#post_tag_string").focus().selectEnd().height($("#post_tag_string")[0].scrollHeight);
$("#related-tags-button").trigger("click");
- $("#find-artist-button").trigger("click");
+ $("#fetch-data-manual").trigger("click");
$("#recommended").hide();
} else if (e.target.hash === "#recommended") {
$("#comments").hide();
diff --git a/app/javascript/src/javascripts/related_tag.js.erb b/app/javascript/src/javascripts/related_tag.js.erb
index 55acec5a0..85980c60e 100644
--- a/app/javascript/src/javascripts/related_tag.js.erb
+++ b/app/javascript/src/javascripts/related_tag.js.erb
@@ -1,3 +1,4 @@
+import Upload from './uploads';
import Utility from './utility';
import Cookie from './cookie';
@@ -16,7 +17,6 @@ RelatedTag.initialize_buttons = function() {
<% TagCategory.related_button_list.each do |category| %>
RelatedTag.common_bind("#related-<%= category %>-button", "<%= category %>"); // eslint-disable-line indent
<% end %>
- $("#find-artist-button").on("click.danbooru", RelatedTag.find_artist);
}
RelatedTag.tags_include = function(name) {
@@ -281,21 +281,6 @@ RelatedTag.toggle_tag = function(e) {
e.preventDefault();
}
-RelatedTag.find_artist = function(e) {
- $("#artist-tags").html("Loading...");
- var url = $("#upload_source,#post_source");
- var referer_url = $("#upload_referer_url");
- $.get("/artists/finder.json", {"url": url.val(), "referer_url": referer_url.val()}, RelatedTag.process_artist);
- if (e) {
- e.preventDefault();
- }
-}
-
-RelatedTag.process_artist = function(data) {
- RelatedTag.recent_artists = data;
- RelatedTag.build_all();
-}
-
RelatedTag.toggle = function() {
if ($("#related-tags").is(":visible")) {
RelatedTag.hide();
@@ -332,7 +317,7 @@ RelatedTag.disable_artist_url = function(e) {
is_active: false
}
}
- }).done(RelatedTag.find_artist);
+ }).done(Upload.fetch_data_manual);
}
});
return false;
diff --git a/app/logical/sources/strategies/base.rb b/app/logical/sources/strategies/base.rb
index 2404e2f40..9d87b2273 100644
--- a/app/logical/sources/strategies/base.rb
+++ b/app/logical/sources/strategies/base.rb
@@ -129,6 +129,8 @@ module Sources
normalize_for_artist_finder.present?
end
+ # The url to use for artist finding purposes. This will be stored in the
+ # artist entry. Normally this will be the profile url.
def normalize_for_artist_finder
profile_url || url
end
@@ -139,8 +141,7 @@ module Sources
end
def artists
- url = profile_url.presence || image_url.presence
- Artist.find_artists(url)
+ Artist.url_matches(normalize_for_artist_finder)
end
def file_url
diff --git a/app/logical/sources/strategies/twitter.rb b/app/logical/sources/strategies/twitter.rb
index 99f28fba3..b1c83a261 100644
--- a/app/logical/sources/strategies/twitter.rb
+++ b/app/logical/sources/strategies/twitter.rb
@@ -66,14 +66,6 @@ module Sources::Strategies
""
end
- def artists
- if profile_url.present?
- Artist.find_artists(profile_url)
- else
- []
- end
- end
-
def artist_name
return "" if api_response.blank?
api_response.attrs[:user][:screen_name]
diff --git a/app/models/artist.rb b/app/models/artist.rb
index 0ef989b19..3b54ee35d 100644
--- a/app/models/artist.rb
+++ b/app/models/artist.rb
@@ -148,7 +148,7 @@ class Artist < ApplicationRecord
%r!\Ahttps?://(?:[a-zA-Z0-9_-]+\.)*#{domain}/\z!i
end)
- def find_all_by_url(url)
+ def url_matches(url)
url = ArtistUrl.normalize(url)
artists = []
@@ -163,7 +163,7 @@ class Artist < ApplicationRecord
break if url =~ SITE_BLACKLIST_REGEXP
end
- artists.inject({}) {|h, x| h[x.name] = x; h}.values.slice(0, 20)
+ where(id: artists.uniq(&:name).take(20))
end
end
@@ -456,40 +456,6 @@ class Artist < ApplicationRecord
end
module SearchMethods
- def find_artists(url, referer_url = nil)
- artists = url_matches(url).order("id desc").limit(10)
-
- if artists.empty? && referer_url.present? && referer_url != url
- artists = url_matches(referer_url).order("id desc").limit(20)
- end
-
- artists
- rescue PixivApiClient::Error => e
- []
- end
-
- def url_matches(string)
- matches = find_all_by_url(string).map(&:id)
-
- if matches.any?
- where("id in (?)", matches)
- elsif matches = search_for_profile(string)
- where("id in (?)", matches)
- else
- where("false")
- end
- end
-
- def search_for_profile(url)
- source = Sources::Strategies.find(url)
- find_all_by_url(source.profile_url)
- rescue Net::OpenTimeout, PixivApiClient::Error
- raise if Rails.env.test?
- nil
- rescue Exception
- nil
- end
-
def other_names_match(string)
if string =~ /\*/ && CurrentUser.is_builder?
where("artists.other_names ILIKE ? ESCAPE E'\\\\'", string.to_escaped_for_sql_like)
diff --git a/app/views/posts/partials/show/_edit.html.erb b/app/views/posts/partials/show/_edit.html.erb
index f70a07af4..2b5ddc82a 100644
--- a/app/views/posts/partials/show/_edit.html.erb
+++ b/app/views/posts/partials/show/_edit.html.erb
@@ -69,7 +69,6 @@
<%= f.label :source %>
<%= f.text_field :source %>
<%= button_tag "Similar", :id => "similar-button", :type => "button", :class => "ui-button ui-widget ui-corner-all sub gradient" %>
- <%= button_tag "Artist", :id => "find-artist-button", :type => "button", :class => "ui-button ui-widget ui-corner-all sub gradient" %>
<% if Danbooru.config.iqdbs_server %>
diff --git a/app/views/uploads/new.html.erb b/app/views/uploads/new.html.erb
index 077cc9cda..314735a67 100644
--- a/app/views/uploads/new.html.erb
+++ b/app/views/uploads/new.html.erb
@@ -43,7 +43,6 @@
<%= f.label :source %>
<%= f.text_field :source, :size => 50, :value => params[:url] %>
<%= button_tag "Similar", :id => "similar-button", :type => "button", :class => "ui-button ui-widget ui-corner-all sub gradient" %>
- <%= button_tag "Artist", :id => "find-artist-button", :type => "button", :class => "ui-button ui-widget ui-corner-all sub gradient" %>
You can enter a URL to have <%= Danbooru.config.app_name %> automatically download and process it
diff --git a/config/routes.rb b/config/routes.rb
index 6a8f10b87..d4a354b7a 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -79,7 +79,6 @@ Rails.application.routes.draw do
collection do
get :show_or_new
get :banned
- get :finder
end
end
resources :artist_urls, only: [:update]
diff --git a/test/functional/artists_controller_test.rb b/test/functional/artists_controller_test.rb
index ad3ba74e7..99ba4e9dd 100644
--- a/test/functional/artists_controller_test.rb
+++ b/test/functional/artists_controller_test.rb
@@ -3,7 +3,7 @@ require 'test_helper'
class ArtistsControllerTest < ActionDispatch::IntegrationTest
def assert_artist_found(expected_artist, source_url = nil)
if source_url
- get_auth finder_artists_path(format: "json", url: source_url), @user
+ get_auth artists_path(format: "json", search: { url_matches: source_url }), @user
if response.body =~ /Net::OpenTimeout/
skip "Remote connection to #{source_url} failed"
return
@@ -16,9 +16,7 @@ class ArtistsControllerTest < ActionDispatch::IntegrationTest
end
def assert_artist_not_found(source_url)
- tries = 0
-
- get_auth finder_artists_path(format: "json", url: source_url), @user
+ get_auth artists_path(format: "json", search: { url_matches: source_url }), @user
if response.body =~ /Net::OpenTimeout/
skip "Remote connection to #{source_url} failed"
return
diff --git a/test/unit/artist_test.rb b/test/unit/artist_test.rb
index 74925eaa4..a6df35c0a 100644
--- a/test/unit/artist_test.rb
+++ b/test/unit/artist_test.rb
@@ -154,9 +154,7 @@ class ArtistTest < ActiveSupport::TestCase
should "resolve ambiguous urls" do
bobross = FactoryBot.create(:artist, :name => "bob_ross", :url_string => "http://artists.com/bobross/image.jpg")
bob = FactoryBot.create(:artist, :name => "bob", :url_string => "http://artists.com/bob/image.jpg")
- matches = Artist.find_all_by_url("http://artists.com/bob/test.jpg")
- assert_equal(1, matches.size)
- assert_equal("bob", matches.first.name)
+ assert_artist_found("bob", "http://artists.com/bob/test.jpg")
end
should "parse urls" do
@@ -190,7 +188,7 @@ class ArtistTest < ActiveSupport::TestCase
should "ignore pixiv.net/ and pixiv.net/img/ url matches" do
a1 = FactoryBot.create(:artist, :name => "yomosaka", :url_string => "http://i2.pixiv.net/img18/img/evazion/14901720.png")
a2 = FactoryBot.create(:artist, :name => "niwatazumi_bf", :url_string => "http://i2.pixiv.net/img18/img/evazion/14901720_big_p0.png")
- assert_equal([], Artist.find_all_by_url("http://i2.pixiv.net/img28/img/kyang692/35563903.jpg"))
+ assert_artist_not_found("http://i2.pixiv.net/img28/img/kyang692/35563903.jpg")
end
should "find matches by url" do
@@ -198,11 +196,11 @@ class ArtistTest < ActiveSupport::TestCase
a2 = FactoryBot.create(:artist, :name => "subway", :url_string => "http://subway.com/x/test.jpg")
a3 = FactoryBot.create(:artist, :name => "minko", :url_string => "https://minko.com/x/test.jpg")
- assert_equal(["rembrandt"], Artist.find_all_by_url("http://rembrandt.com/x/test.jpg").map(&:name))
- assert_equal(["rembrandt"], Artist.find_all_by_url("http://rembrandt.com/x/another.jpg").map(&:name))
- assert_equal([], Artist.find_all_by_url("http://nonexistent.com/test.jpg").map(&:name))
- assert_equal(["minko"], Artist.find_all_by_url("https://minko.com/x/test.jpg").map(&:name))
- assert_equal(["minko"], Artist.find_all_by_url("http://minko.com/x/test.jpg").map(&:name))
+ assert_artist_found("rembrandt", "http://rembrandt.com/x/test.jpg")
+ assert_artist_found("rembrandt", "http://rembrandt.com/x/another.jpg")
+ assert_artist_not_found("http://nonexistent.com/test.jpg")
+ assert_artist_found("minko", "https://minko.com/x/test.jpg")
+ assert_artist_found("minko", "http://minko.com/x/test.jpg")
end
should "be case-insensitive to domains when finding matches by url" do
@@ -212,7 +210,7 @@ class ArtistTest < ActiveSupport::TestCase
should "not find duplicates" do
FactoryBot.create(:artist, :name => "warhol", :url_string => "http://warhol.com/x/a/image.jpg\nhttp://warhol.com/x/b/image.jpg")
- assert_equal(["warhol"], Artist.find_all_by_url("http://warhol.com/x/test.jpg").map(&:name))
+ assert_artist_found("warhol", "http://warhol.com/x/test.jpg")
end
should "not include duplicate urls" do
@@ -222,7 +220,7 @@ class ArtistTest < ActiveSupport::TestCase
should "hide deleted artists" do
FactoryBot.create(:artist, :name => "warhol", :url_string => "http://warhol.com/a/image.jpg", :is_active => false)
- assert_equal([], Artist.find_all_by_url("http://warhol.com/a/image.jpg").map(&:name))
+ assert_artist_not_found("http://warhol.com/a/image.jpg")
end
context "when finding deviantart artists" do