class ArtistUrl < ApplicationRecord before_save :initialize_normalized_url, on: [ :create ] before_save :normalize validates_presence_of :url validate :validate_url_format belongs_to :artist, :touch => true attr_accessible :url, :artist_id, :normalized_url def self.normalize(url) if url.nil? nil else url = url.gsub(/^https:\/\//, "http://") url = url.gsub(/^http:\/\/blog\d+\.fc2/, "http://blog.fc2") url = url.gsub(/^http:\/\/blog-imgs-\d+\.fc2/, "http://blog.fc2") url = url.gsub(/^http:\/\/blog-imgs-\d+-\w+\.fc2/, "http://blog.fc2") url = url.sub(%r!(http://seiga.nicovideo.jp/user/illust/\d+)\?.+!, '\1/') url = url.sub(%r!^http://pictures.hentai-foundry.com//!, "http://pictures.hentai-foundry.com/") begin url = Sources::Site.new(url).normalize_for_artist_finder! rescue PixivApiClient::Error end url = url.gsub(/\/+\Z/, "") url + "/" end end def self.legacy_normalize(url) if url.nil? nil else url = url.gsub(/^https:\/\//, "http://") url = url.gsub(/^http:\/\/blog\d+\.fc2/, "http://blog.fc2") url = url.gsub(/^http:\/\/blog-imgs-\d+\.fc2/, "http://blog.fc2") url = url.gsub(/^http:\/\/blog-imgs-\d+-\w+\.fc2/, "http://blog.fc2") url = url.gsub(/^http:\/\/img\d+\.pixiv\.net/, "http://img.pixiv.net") url = url.gsub(/^http:\/\/i\d+\.pixiv\.net\/img\d+/, "http://img.pixiv.net") url = url.gsub(/\/+\Z/, "") url + "/" end end def self.normalize_for_search(url) if url =~ /\.\w+\Z/ && url =~ /\w\/\w/ url = File.dirname(url) end url = url.gsub(/^https:\/\//, "http://") url = url.gsub(/^http:\/\/blog\d+\.fc2/, "http://blog*.fc2") url = url.gsub(/^http:\/\/blog-imgs-\d+\.fc2/, "http://blog*.fc2") url = url.gsub(/^http:\/\/blog-imgs-\d+-\w+\.fc2/, "http://blog*.fc2") url = url.gsub(/^http:\/\/img\d+\.pixiv\.net/, "http://img*.pixiv.net") url = url.gsub(/^http:\/\/i\d+\.pixiv\.net\/img\d+/, "http://*.pixiv.net/img*") end def priority if normalized_url =~ /pixiv\.net\/member\.php/ 10 elsif normalized_url =~ /seiga\.nicovideo\.jp\/user\/illust/ 10 elsif normalized_url =~ /twitter\.com/ && normalized_url !~ /status/ 10 elsif normalized_url =~ /tumblr|patreon|deviantart|artstation/ 20 else 100 end end def normalize if !Sources::Site.new(normalized_url).normalized_for_artist_finder? self.normalized_url = self.class.normalize(url) end end def initialize_normalized_url self.normalized_url = url end def to_s url end def validate_url_format uri = Addressable::URI.parse(url) errors[:base] << "'#{url}' must begin with http:// or https://" if !uri.scheme.in?(%w[http https]) rescue Addressable::URI::InvalidURIError => error errors[:base] << "'#{url}' is malformed: #{error}" end end