From 6bf050c607d26bc29f7b397ada7184419d81ae30 Mon Sep 17 00:00:00 2001 From: r888888888 Date: Mon, 6 Feb 2017 11:59:27 -0800 Subject: [PATCH 1/2] add download strategy for artstation --- .../rewrite_strategies/art_station.rb | 21 +++++++++++++++++++ .../downloads/rewrite_strategies/base.rb | 2 +- test/unit/downloads/art_station_test.rb | 18 ++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 app/logical/downloads/rewrite_strategies/art_station.rb create mode 100644 test/unit/downloads/art_station_test.rb diff --git a/app/logical/downloads/rewrite_strategies/art_station.rb b/app/logical/downloads/rewrite_strategies/art_station.rb new file mode 100644 index 000000000..dc59062db --- /dev/null +++ b/app/logical/downloads/rewrite_strategies/art_station.rb @@ -0,0 +1,21 @@ +module Downloads + module RewriteStrategies + class ArtStation < Base + def rewrite(url, headers, data = {}) + # example: https://cdnb3.artstation.com/p/assets/images/images/003/716/071/large/aoi-ogata-hate-city.jpg?1476754974 + if url =~ %r!^https?://cdn\w*\.artstation\.com/p/assets/images/images/\d+/\d+/\d+/large/! + url, headers = rewrite_large_url(url, headers) + end + + return [url, headers, data] + end + + protected + def rewrite_large_url(url, headers) + # example: https://cdnb3.artstation.com/p/assets/images/images/003/716/071/original/aoi-ogata-hate-city.jpg?1476754974 + url = url.sub(%r!/large/!, "/original/") + return [url, headers] + end + end + end +end diff --git a/app/logical/downloads/rewrite_strategies/base.rb b/app/logical/downloads/rewrite_strategies/base.rb index 31e7906f0..9fd98da3c 100644 --- a/app/logical/downloads/rewrite_strategies/base.rb +++ b/app/logical/downloads/rewrite_strategies/base.rb @@ -10,7 +10,7 @@ module Downloads end def self.strategies - [Downloads::RewriteStrategies::Pixiv, Downloads::RewriteStrategies::NicoSeiga, Downloads::RewriteStrategies::Twitpic, Downloads::RewriteStrategies::DeviantArt, Downloads::RewriteStrategies::Tumblr, Downloads::RewriteStrategies::Moebooru, Downloads::RewriteStrategies::Twitter, Downloads::RewriteStrategies::Nijie] + [Downloads::RewriteStrategies::Pixiv, Downloads::RewriteStrategies::NicoSeiga, Downloads::RewriteStrategies::ArtStation, Downloads::RewriteStrategies::Twitpic, Downloads::RewriteStrategies::DeviantArt, Downloads::RewriteStrategies::Tumblr, Downloads::RewriteStrategies::Moebooru, Downloads::RewriteStrategies::Twitter, Downloads::RewriteStrategies::Nijie] end def rewrite(url, headers, data = {}) diff --git a/test/unit/downloads/art_station_test.rb b/test/unit/downloads/art_station_test.rb new file mode 100644 index 000000000..8268dfd86 --- /dev/null +++ b/test/unit/downloads/art_station_test.rb @@ -0,0 +1,18 @@ +require 'test_helper' + +module Downloads + class ArtStationTest < ActiveSupport::TestCase + context "a download for a (small) artstation image" do + setup do + @source = "https://cdnb3.artstation.com/p/assets/images/images/003/716/071/large/aoi-ogata-hate-city.jpg?1476754974" + @tempfile = Tempfile.new("danbooru-test") + @download = Downloads::File.new(@source, @tempfile.path) + @download.download! + end + + should "download the large image instead" do + assert_equal("https://cdnb3.artstation.com/p/assets/images/images/003/716/071/original/aoi-ogata-hate-city.jpg?1476754974", @download.source) + end + end + end +end From 7a2f652152b8c655d83dd18d114caff536af1da7 Mon Sep 17 00:00:00 2001 From: r888888888 Date: Mon, 6 Feb 2017 17:07:09 -0800 Subject: [PATCH 2/2] add source strategy for artstation --- app/logical/sources/site.rb | 2 +- app/logical/sources/strategies/art_station.rb | 50 +++++++++++++++++++ test/unit/sources/art_station_test.rb | 33 ++++++++++++ 3 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 app/logical/sources/strategies/art_station.rb create mode 100644 test/unit/sources/art_station_test.rb diff --git a/app/logical/sources/site.rb b/app/logical/sources/site.rb index 6c1838253..7fa8e9f7a 100644 --- a/app/logical/sources/site.rb +++ b/app/logical/sources/site.rb @@ -10,7 +10,7 @@ module Sources :artist_commentary_desc, :rewrite_thumbnails, :illust_id_from_url, :to => :strategy def self.strategies - [Strategies::PixivWhitecube, Strategies::Pixiv, Strategies::NicoSeiga, Strategies::DeviantArt, Strategies::Nijie, Strategies::Twitter, Strategies::Tumblr] + [Strategies::PixivWhitecube, Strategies::Pixiv, Strategies::NicoSeiga, Strategies::DeviantArt, Strategies::ArtStation, Strategies::Nijie, Strategies::Twitter, Strategies::Tumblr] end def initialize(url, options = {}) diff --git a/app/logical/sources/strategies/art_station.rb b/app/logical/sources/strategies/art_station.rb new file mode 100644 index 000000000..faeb9d914 --- /dev/null +++ b/app/logical/sources/strategies/art_station.rb @@ -0,0 +1,50 @@ +module Sources::Strategies + class ArtStation < Base + attr_reader :json, :image_urls + + def self.url_match?(url) + url =~ %r!^https?://\w+\.artstation\.com/artwork/[a-z0-9]+!i + end + + def referer_url + end + + def tags + json["categories"].map {|x| x["name"].downcase.tr(" ", "_")} + end + + def site_name + "ArtStation" + end + + def api_url + url.sub(%r!^https?://\w+\.!, "https://www.").sub(%r!/artwork/!, "/projects/") + ".json" + end + + def image_url + image_urls.first + end + + def get + uri = URI.parse(api_url) + Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.is_a?(URI::HTTPS)) do |http| + resp = http.request_get(uri.request_uri) + image_url_rewriter = Downloads::RewriteStrategies::ArtStation.new + if resp.is_a?(Net::HTTPSuccess) + @json = JSON.parse(resp.body) + @artist_name = json["user"]["username"] + @profile_url = json["user"]["permalink"] + @image_urls = json["assets"].map do |x| + y, _, _ = image_url_rewriter.rewrite(x["image_url"], nil) + y + end + @tags = json["categories"].map {|x| x["name"].downcase.tr(" ", "_")} if json["categories"] + @artist_commentary_title = json["title"] + @artist_commentary_desc = ActionView::Base.full_sanitizer.sanitize(json["description"]) + else + raise "HTTP error code: #{resp.code} #{resp.message}" + end + end + end + end +end diff --git a/test/unit/sources/art_station_test.rb b/test/unit/sources/art_station_test.rb new file mode 100644 index 000000000..f8ce918cf --- /dev/null +++ b/test/unit/sources/art_station_test.rb @@ -0,0 +1,33 @@ +require 'test_helper' + +module Sources + class ArtStationTest < ActiveSupport::TestCase + context "The source site for an art station artwork page" do + setup do + @site = Sources::Site.new("https://jeyrain.artstation.com/artwork/04XA4") + @site.get + end + + should "get the image url" do + assert_equal("https://cdna.artstation.com/p/assets/images/images/000/705/368/original/jey-rain-one1.jpg", @site.image_url.sub(/\?\d+/, "")) + end + + should "get the profile" do + assert_equal("https://www.artstation.com/artist/jeyrain", @site.profile_url) + end + + should "get the artist name" do + assert_equal("jeyrain", @site.artist_name) + end + + should "get the tags" do + assert_equal([], @site.tags) + end + + should "get the artist commentary" do + assert_equal("pink", @site.artist_commentary_title) + assert_equal("", @site.artist_commentary_desc) + end + end + end +end