mirror of
https://github.com/philomena-dev/philomena.git
synced 2025-02-21 12:53:11 +01:00
finish scraper
This commit is contained in:
parent
da09d45c7f
commit
109f3f781a
6 changed files with 67 additions and 2 deletions
|
@ -7,7 +7,7 @@ import { $, $$, hideEl, showEl, makeEl, clearEl } from './utils/dom';
|
||||||
import { addTag } from './tagsinput';
|
import { addTag } from './tagsinput';
|
||||||
|
|
||||||
function scrapeUrl(url) {
|
function scrapeUrl(url) {
|
||||||
return fetchJson('POST', '/images/scrape_url', { url })
|
return fetchJson('POST', '/images/scrape', { url })
|
||||||
.then(handleError)
|
.then(handleError)
|
||||||
.then(response => response.json());
|
.then(response => response.json());
|
||||||
}
|
}
|
||||||
|
|
17
lib/philomena_web/controllers/image/scrape_controller.ex
Normal file
17
lib/philomena_web/controllers/image/scrape_controller.ex
Normal file
|
@ -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
|
|
@ -14,6 +14,7 @@ defmodule PhilomenaWeb.ImageController do
|
||||||
plug PhilomenaWeb.FilterBannedUsersPlug when action in [:new, :create]
|
plug PhilomenaWeb.FilterBannedUsersPlug when action in [:new, :create]
|
||||||
plug PhilomenaWeb.UserAttributionPlug when action in [:create]
|
plug PhilomenaWeb.UserAttributionPlug when action in [:create]
|
||||||
plug PhilomenaWeb.CaptchaPlug 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
|
def index(conn, _params) do
|
||||||
query = conn.assigns.compiled_filter
|
query = conn.assigns.compiled_filter
|
||||||
|
|
39
lib/philomena_web/plugs/scraper_plug.ex
Normal file
39
lib/philomena_web/plugs/scraper_plug.ex
Normal file
|
@ -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
|
|
@ -84,6 +84,9 @@ defmodule PhilomenaWeb.Router do
|
||||||
get "/", ActivityController, :index
|
get "/", ActivityController, :index
|
||||||
|
|
||||||
resources "/activity", ActivityController, only: [: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 "/images", ImageController, only: [:index, :show, :new, :create] do
|
||||||
resources "/comments", Image.CommentController, only: [:index, :show, :create]
|
resources "/comments", Image.CommentController, only: [:index, :show, :create]
|
||||||
resources "/tags", Image.TagController, only: [:update], singleton: true
|
resources "/tags", Image.TagController, only: [:update], singleton: true
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
h4 Select an image
|
h4 Select an image
|
||||||
.image-other
|
.image-other
|
||||||
#js-image-upload-previews
|
#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
|
.field
|
||||||
= file_input f, :image, class: "input js-scraper"
|
= file_input f, :image, class: "input js-scraper"
|
||||||
= error_tag f, :image_size
|
= error_tag f, :image_size
|
||||||
|
@ -37,6 +37,11 @@
|
||||||
= error_tag f, :image_name
|
= error_tag f, :image_name
|
||||||
= error_tag f, :image_mime_type
|
= 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
|
.field-error-js.hidden.js-scraper
|
||||||
|
|
||||||
h4 About this image
|
h4 About this image
|
||||||
|
|
Loading…
Reference in a new issue