refactored source code, work on pixiv integration
This commit is contained in:
@@ -1,13 +1,63 @@
|
|||||||
$(function() {
|
(function() {
|
||||||
var img = $("#image-preview img");
|
Danbooru.Upload = {};
|
||||||
if (img) {
|
|
||||||
var height = img.attr("height");
|
Danbooru.Upload.initialize_all = function() {
|
||||||
var width = img.attr("width");
|
this.initialize_image();
|
||||||
if (height > 400) {
|
this.initialize_info();
|
||||||
var ratio = 400.0 / height;
|
}
|
||||||
img.attr("height", height * ratio);
|
|
||||||
img.attr("width", width * ratio);
|
Danbooru.Upload.initialize_info = function() {
|
||||||
$("#scale").html("Scaled " + parseInt(100 * ratio) + "%");
|
$("#c-uploads #source-info ul").hide();
|
||||||
|
$("#c-uploads #fetch-data").click(function(e) {
|
||||||
|
Danbooru.ajax_start(e.target);
|
||||||
|
$.get(e.target.href).success(function(data) {
|
||||||
|
var artist_name = data.artist_name;
|
||||||
|
var profile_url = data.profile_url;
|
||||||
|
var tags = data.tags;
|
||||||
|
var danbooru_id = data.danbooru_id;
|
||||||
|
var danbooru_name = data.danbooru_name;
|
||||||
|
var tag_html = "";
|
||||||
|
$.each(data.tags, function(i, v) {
|
||||||
|
var name = v[0];
|
||||||
|
var url = v[1];
|
||||||
|
tag_html += ('<a href="' + url + '">' + name + '</a> ');
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#source-artist").html('<a href="' + data.profile_url + '">' + data.artist_name + '</a>');
|
||||||
|
$("#source-tags").html(tag_html);
|
||||||
|
|
||||||
|
var new_artist_link = '<a href="/artists/new?name=' + data.unique_id + '&other_names=' + data.artist_name + '&urls=' + encodeURIComponent(profile_url) + '+' + encodeURIComponent($("#image").attr("src")) + '">new</a>';
|
||||||
|
|
||||||
|
if (data.danbooru_id) {
|
||||||
|
$("#source-record").html('<a href="/artists/' + data.danbooru_id + '">' + data.danbooru_name + '</a> ' + new_artist_link);
|
||||||
|
} else {
|
||||||
|
$("#source-record").html(new_artist_link);
|
||||||
|
}
|
||||||
|
|
||||||
|
$("#source-info p").hide();
|
||||||
|
$("#source-info ul").show();
|
||||||
|
}).complete(function(data) {
|
||||||
|
Danbooru.ajax_stop(e.target);
|
||||||
|
});
|
||||||
|
e.preventDefault();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Danbooru.Upload.initialize_image = function() {
|
||||||
|
var $image = $("#c-uploads #image");
|
||||||
|
if ($image.size() > 0) {
|
||||||
|
var height = $image.height();
|
||||||
|
var width = $image.width();
|
||||||
|
if (height > 400) {
|
||||||
|
var ratio = 400.0 / height;
|
||||||
|
$image.height(height * ratio);
|
||||||
|
$image.width(width * ratio);
|
||||||
|
$("#scale").html("Scaled " + parseInt(100 * ratio) + "%");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
})();
|
||||||
|
|
||||||
|
$(function() {
|
||||||
|
Danbooru.Upload.initialize_all();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -935,6 +935,22 @@ div#c-uploads {
|
|||||||
display: inline;
|
display: inline;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
div#source-info {
|
||||||
|
margin: 1em 0;
|
||||||
|
padding: 1em;
|
||||||
|
border: 1px solid gray;
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
a {
|
||||||
|
margin-right: 1em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,12 @@ class SourcesController < ApplicationController
|
|||||||
|
|
||||||
def show
|
def show
|
||||||
@source = Sources::Site.new(params[:url])
|
@source = Sources::Site.new(params[:url])
|
||||||
respond_with(@source)
|
@source.get
|
||||||
|
|
||||||
|
respond_with(@source) do |format|
|
||||||
|
format.json do
|
||||||
|
render :json => @source.to_json
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ class UploadsController < ApplicationController
|
|||||||
@upload = Upload.new(:rating => "q")
|
@upload = Upload.new(:rating => "q")
|
||||||
if params[:url]
|
if params[:url]
|
||||||
@post = Post.find_by_source(params[:url])
|
@post = Post.find_by_source(params[:url])
|
||||||
|
@source = Sources::Site.new(params[:url])
|
||||||
end
|
end
|
||||||
respond_with(@upload)
|
respond_with(@upload)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,18 +1,36 @@
|
|||||||
module Sources
|
module Sources
|
||||||
class Site
|
class Site
|
||||||
attr_reader :url, :strategy
|
attr_reader :url, :strategy
|
||||||
delegate :artist_name, :profile_url, :image_url, :tags, :to => :strategy
|
delegate :get, :site_name, :artist_name, :artist_alias, :profile_url, :image_url, :tags, :artist_record, :unique_id, :to => :strategy
|
||||||
|
|
||||||
|
def self.strategies
|
||||||
|
[Strategies::Fc2, Strategies::NicoSeiga, Strategies::Pixa, Strategies::Pixiv, Strategies::Tinami, Strategies::Default]
|
||||||
|
end
|
||||||
|
|
||||||
def initialize(url)
|
def initialize(url)
|
||||||
@url = url
|
@url = url
|
||||||
|
|
||||||
case url
|
Site.strategies.each do |strategy|
|
||||||
when /pixiv\.net/
|
if strategy.url_match?(url)
|
||||||
@strategy = Strategies::Pixiv.new(url)
|
@strategy = strategy.new(url)
|
||||||
|
break
|
||||||
else
|
end
|
||||||
@strategy = Strategies::Default.new(url)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def to_json
|
||||||
|
return {
|
||||||
|
:artist_name => artist_name,
|
||||||
|
:profile_url => profile_url,
|
||||||
|
:tags => tags,
|
||||||
|
:danbooru_name => artist_record.first.try(:name),
|
||||||
|
:danbooru_id => artist_record.first.try(:id),
|
||||||
|
:unique_id => unique_id
|
||||||
|
}.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
def available?
|
||||||
|
strategy.present?
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -3,11 +3,23 @@ module Sources
|
|||||||
class Base
|
class Base
|
||||||
attr_reader :url, :agent
|
attr_reader :url, :agent
|
||||||
|
|
||||||
|
def self.url_match?(url)
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
def initialize(url)
|
def initialize(url)
|
||||||
@url = url
|
@url = url
|
||||||
@agent = create_agent
|
@agent = create_agent
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def get
|
||||||
|
raise NotImplementedError
|
||||||
|
end
|
||||||
|
|
||||||
|
def site_name
|
||||||
|
raise NotImplementedError
|
||||||
|
end
|
||||||
|
|
||||||
def artist_name
|
def artist_name
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
end
|
end
|
||||||
@@ -24,6 +36,18 @@ module Sources
|
|||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def artist_alias
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
|
||||||
|
def unique_id
|
||||||
|
artist_name
|
||||||
|
end
|
||||||
|
|
||||||
|
def artist_record
|
||||||
|
Artist.other_names_match(artist_name)
|
||||||
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
def create_agent
|
def create_agent
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
module Sources
|
module Sources
|
||||||
module Strategies
|
module Strategies
|
||||||
class Default < Base
|
class Default < Base
|
||||||
|
def site_name
|
||||||
|
"?"
|
||||||
|
end
|
||||||
|
|
||||||
def artist_name
|
def artist_name
|
||||||
"?"
|
"?"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
module Sources
|
module Sources
|
||||||
module Strategies
|
module Strategies
|
||||||
class Fc2 < Base
|
class Fc2 < Base
|
||||||
|
def site_name
|
||||||
|
"FC2"
|
||||||
|
end
|
||||||
|
|
||||||
def artist_name
|
def artist_name
|
||||||
"?"
|
"?"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
module Sources
|
module Sources
|
||||||
module Strategies
|
module Strategies
|
||||||
class NicoSeiga < Base
|
class NicoSeiga < Base
|
||||||
|
def site_name
|
||||||
|
"Nico Seiga"
|
||||||
|
end
|
||||||
|
|
||||||
def artist_name
|
def artist_name
|
||||||
"?"
|
"?"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
module Sources
|
module Sources
|
||||||
module Strategies
|
module Strategies
|
||||||
class Pixa < Base
|
class Pixa < Base
|
||||||
|
def site_name
|
||||||
|
"Pixa"
|
||||||
|
end
|
||||||
|
|
||||||
def artist_name
|
def artist_name
|
||||||
"?"
|
"?"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -3,13 +3,21 @@ module Sources
|
|||||||
class Pixiv < Base
|
class Pixiv < Base
|
||||||
attr_reader :artist_name, :profile_url, :image_url, :tags
|
attr_reader :artist_name, :profile_url, :image_url, :tags
|
||||||
|
|
||||||
def initialize(url)
|
def self.url_match?(url)
|
||||||
super
|
url =~ /^https?:\/\/(?:\w+\.)?pixiv\.net/
|
||||||
get
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def is_pixiv?
|
def initialize(url)
|
||||||
url =~ /pixiv\.net/
|
super
|
||||||
|
end
|
||||||
|
|
||||||
|
def site_name
|
||||||
|
"Pixiv"
|
||||||
|
end
|
||||||
|
|
||||||
|
def unique_id
|
||||||
|
image_url =~ /\/img\/([^\/]+)/
|
||||||
|
$1
|
||||||
end
|
end
|
||||||
|
|
||||||
def get
|
def get
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
module Sources
|
module Sources
|
||||||
module Strategies
|
module Strategies
|
||||||
class Tinami < Base
|
class Tinami < Base
|
||||||
|
def site_name
|
||||||
|
"Tinami"
|
||||||
|
end
|
||||||
|
|
||||||
def artist_name
|
def artist_name
|
||||||
"?"
|
"?"
|
||||||
end
|
end
|
||||||
|
|||||||
15
app/views/sources/_info.html.erb
Normal file
15
app/views/sources/_info.html.erb
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<!--
|
||||||
|
- source
|
||||||
|
-->
|
||||||
|
|
||||||
|
<% if source.try(:available?) %>
|
||||||
|
<div id="source-info">
|
||||||
|
<p>This looks like a <%= source.site_name %> upload. <%= link_to "Fetch data", source_path(:format => "json", :url => params[:url]), :id => "fetch-data" %>.</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li><strong>Artist</strong>: <span id="source-artist"></span></li>
|
||||||
|
<li><strong>Tags</strong>: <span id="source-tags"></span></li>
|
||||||
|
<li><strong>Record</strong>: <span id="source-record"></span></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
({
|
|
||||||
"artist_name": "<%= j @source.artist_name %>",
|
|
||||||
"profile_url": "<%= j @source.profile_url %>",
|
|
||||||
"image_url": "<%= j @source.image_url %>",
|
|
||||||
"tags": <%= @source.tags.to_json.html_safe %>
|
|
||||||
});
|
|
||||||
4
app/views/uploads/_image.html.erb
Normal file
4
app/views/uploads/_image.html.erb
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<% if params[:url] %>
|
||||||
|
<%= image_tag(params[:url], :title => "Preview", :id => "image") %>
|
||||||
|
<p id="scale"></p>
|
||||||
|
<% end %>
|
||||||
6
app/views/uploads/_post.html.erb
Normal file
6
app/views/uploads/_post.html.erb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<!--
|
||||||
|
- post
|
||||||
|
-->
|
||||||
|
<% if post %>
|
||||||
|
<p>This post was probably already uploaded (<%= link_to "post ##{post.id}", posts_path(post), :target => "_blank" %>).</p>
|
||||||
|
<% end %>
|
||||||
@@ -6,18 +6,11 @@
|
|||||||
<p>Before uploading, please read the <%= link_to "how to upload guide", wiki_pages_path(:title => "howto:upload") %>.</p>
|
<p>Before uploading, please read the <%= link_to "how to upload guide", wiki_pages_path(:title => "howto:upload") %>.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<%= render "image" %>
|
||||||
|
<%= render "post" %>
|
||||||
|
<%= render "sources/info", :source => @source %>
|
||||||
|
|
||||||
<%= form_for(@upload, :html => {:multipart => true, :class => "simple_form"}) do |f| %>
|
<%= form_for(@upload, :html => {:multipart => true, :class => "simple_form"}) do |f| %>
|
||||||
<% if params[:url] %>
|
|
||||||
<div id="image-preview">
|
|
||||||
<%= image_tag(params[:url], :title => "Preview") %>
|
|
||||||
<p id="scale"></p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<% if @post %>
|
|
||||||
<p>This post was probably already uploaded (<%= link_to "post ##{@post.id}", posts_path(@post), :target => "_blank" %>).</p>
|
|
||||||
<% end %>
|
|
||||||
<% end %>
|
|
||||||
|
|
||||||
<div class="input">
|
<div class="input">
|
||||||
<%= f.label :file %>
|
<%= f.label :file %>
|
||||||
<%= f.file_field :file, :size => 50 %>
|
<%= f.file_field :file, :size => 50 %>
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ Danbooru::Application.routes.draw do
|
|||||||
resources :advertisements do
|
resources :advertisements do
|
||||||
resources :hits, :controller => "advertisement_hits", :only => [:create]
|
resources :hits, :controller => "advertisement_hits", :only => [:create]
|
||||||
end
|
end
|
||||||
resource :art_site_proxy, :only => [:show]
|
resource :source, :only => [:show]
|
||||||
resources :artists do
|
resources :artists do
|
||||||
member do
|
member do
|
||||||
put :revert
|
put :revert
|
||||||
|
|||||||
@@ -5,11 +5,12 @@ require 'test_helper'
|
|||||||
class PixivProxyTest < ActiveSupport::TestCase
|
class PixivProxyTest < ActiveSupport::TestCase
|
||||||
context "The proxy" do
|
context "The proxy" do
|
||||||
should "get a single post" do
|
should "get a single post" do
|
||||||
proxy = Sources::Site.new("http://www.pixiv.net/member_illust.php?mode=medium&illust_id=9646484")
|
site = Sources::Site.new("http://www.pixiv.net/member_illust.php?mode=medium&illust_id=9646484")
|
||||||
|
site.get
|
||||||
|
|
||||||
assert_equal("http://www.pixiv.net/member.php?id=4015", proxy.profile_url)
|
assert_equal("http://www.pixiv.net/member.php?id=4015", site.profile_url)
|
||||||
assert(proxy.tags.size > 0)
|
assert(site.tags.size > 0)
|
||||||
first_tag = proxy.tags.first
|
first_tag = site.tags.first
|
||||||
assert_equal(2, first_tag.size)
|
assert_equal(2, first_tag.size)
|
||||||
assert(first_tag[0] =~ /./)
|
assert(first_tag[0] =~ /./)
|
||||||
assert(first_tag[1] =~ /tags\.php\?tag=/)
|
assert(first_tag[1] =~ /tags\.php\?tag=/)
|
||||||
|
|||||||
Reference in New Issue
Block a user