diff --git a/assets/js/upload.js b/assets/js/upload.js index d3e98a92..4f1a0d57 100644 --- a/assets/js/upload.js +++ b/assets/js/upload.js @@ -7,7 +7,7 @@ import { $, $$, hideEl, showEl, makeEl, clearEl } from './utils/dom'; import { addTag } from './tagsinput'; function scrapeUrl(url) { - return fetchJson('POST', '/images/scrape_url', { url }) + return fetchJson('POST', '/images/scrape', { url }) .then(handleError) .then(response => response.json()); } diff --git a/lib/philomena_web/controllers/image/scrape_controller.ex b/lib/philomena_web/controllers/image/scrape_controller.ex new file mode 100644 index 00000000..7c5dfff1 --- /dev/null +++ b/lib/philomena_web/controllers/image/scrape_controller.ex @@ -0,0 +1,17 @@ +defmodule PhilomenaWeb.Image.ScrapeController do + use PhilomenaWeb, :controller + + alias Philomena.Scrapers + + def create(conn, params) do + result = + params + |> Map.get("url") + |> to_string() + |> String.trim() + |> Scrapers.scrape!() + + conn + |> json(result) + end +end \ No newline at end of file diff --git a/lib/philomena_web/controllers/image_controller.ex b/lib/philomena_web/controllers/image_controller.ex index 3f7bbf47..83b22866 100644 --- a/lib/philomena_web/controllers/image_controller.ex +++ b/lib/philomena_web/controllers/image_controller.ex @@ -14,6 +14,7 @@ defmodule PhilomenaWeb.ImageController do plug PhilomenaWeb.FilterBannedUsersPlug when action in [:new, :create] plug PhilomenaWeb.UserAttributionPlug when action in [:create] plug PhilomenaWeb.CaptchaPlug when action in [:create] + plug PhilomenaWeb.ScraperPlug, [params_name: "image", params_key: "image"] when action in [:create] def index(conn, _params) do query = conn.assigns.compiled_filter diff --git a/lib/philomena_web/plugs/scraper_plug.ex b/lib/philomena_web/plugs/scraper_plug.ex new file mode 100644 index 00000000..24d61544 --- /dev/null +++ b/lib/philomena_web/plugs/scraper_plug.ex @@ -0,0 +1,39 @@ +defmodule PhilomenaWeb.ScraperPlug do + def init(opts), do: opts + + def call(conn, opts) do + case conn.params do + %{"scraper_cache" => url} -> + Philomena.Http.get!(url, [], max_body_length: 30_000_000) + |> maybe_fixup_params(opts, conn) + + _ -> + conn + end + end + + defp maybe_fixup_params(%HTTPoison.Response{body: body, status_code: 200}, opts, conn) do + params_name = Keyword.get(opts, :params_name, "image") + params_key = Keyword.get(opts, :params_key, "image") + file = Briefly.create!() + now = DateTime.utc_now() |> DateTime.to_unix(:microsecond) + + File.write!(file, body) + + fake_upload = + %Plug.Upload{ + path: file, + content_type: "application/octet-stream", + filename: "scraper-#{now}" + } + + updated_form = + Map.put(conn.params[params_name], params_key, fake_upload) + + updated_params = + Map.put(conn.params, params_name, updated_form) + + %{conn | params: updated_params} + end + defp maybe_fixup_params(_response, _opts, conn), do: conn +end \ No newline at end of file diff --git a/lib/philomena_web/router.ex b/lib/philomena_web/router.ex index d003462c..4f99d933 100644 --- a/lib/philomena_web/router.ex +++ b/lib/philomena_web/router.ex @@ -84,6 +84,9 @@ defmodule PhilomenaWeb.Router do get "/", ActivityController, :index resources "/activity", ActivityController, only: [:index] + scope "/images", Image, as: :image do + resources "/scrape", ScrapeController, only: [:create] + end resources "/images", ImageController, only: [:index, :show, :new, :create] do resources "/comments", Image.CommentController, only: [:index, :show, :create] resources "/tags", Image.TagController, only: [:update], singleton: true diff --git a/lib/philomena_web/templates/image/new.html.slime b/lib/philomena_web/templates/image/new.html.slime index c0b3a894..22a7fb41 100644 --- a/lib/philomena_web/templates/image/new.html.slime +++ b/lib/philomena_web/templates/image/new.html.slime @@ -28,7 +28,7 @@ h4 Select an image .image-other #js-image-upload-previews - p Upload a file from your computer + p Upload a file from your computer, or provide a link to the page containing the image and click Fetch. .field = file_input f, :image, class: "input js-scraper" = error_tag f, :image_size @@ -37,6 +37,11 @@ = error_tag f, :image_name = error_tag f, :image_mime_type + .field.field--inline + = url_input f, :scraper_url, class: "input input--wide js-scraper", placeholder: "Link a deviantART page, a Tumblr post, or the image directly" + button.button.button--separate-left#js-scraper-preview type="button" title="Fetch the image at the specified URL" data-disable-with="Fetch" + ' Fetch + .field-error-js.hidden.js-scraper h4 About this image