From 8f5b248e571406cf8a29c147587847edddcac22a Mon Sep 17 00:00:00 2001
From: Chaska <166928710+chaskayote@users.noreply.github.com>
Date: Sun, 21 Apr 2024 18:08:14 -0500
Subject: [PATCH] Scraper fixes + adding multiple sources

---
 assets/js/upload.js                   | 19 ++++++++++++++++
 lib/philomena/scrapers.ex             |  1 +
 lib/philomena/scrapers/furaffinity.ex | 31 +++++++++++++++++++++++++++
 3 files changed, 51 insertions(+)
 create mode 100644 lib/philomena/scrapers/furaffinity.ex

diff --git a/assets/js/upload.js b/assets/js/upload.js
index 84482341..09f6638a 100644
--- a/assets/js/upload.js
+++ b/assets/js/upload.js
@@ -35,6 +35,7 @@ function setupImageUpload() {
   const descrEl = $('.js-image-descr-input', form);
   const tagsEl = $('.js-image-tags-input', form);
   const sourceEl = $$('.js-source-url', form).find(input => input.value === '');
+  const sourceAdd = $('.js-image-add-source');
   const fetchButton = $('#js-scraper-preview');
   if (!fetchButton) return;
 
@@ -116,6 +117,24 @@ function setupImageUpload() {
       if (descrEl) descrEl.value = descrEl.value || data.description || '';
       // Add author
       if (tagsEl && data.author_name) addTag(tagsEl, `artist:${data.author_name.toLowerCase()}`);
+      // Add multiple authors if provided
+      if (tagsEl && data.authors) data.authors.forEach(item => addTag(tagsEl, `artist:${item.toLowerCase()}`));
+      // Add Tags
+      if (tagsEl && data.tags) data.tags.forEach(item => addTag(tagsEl, `${item.toLowerCase()}`));
+      // Add multiple sources
+      if (sourceAdd && data.sources && data.sources.length > 0) {
+        data.sources.forEach(() => {
+          sourceAdd.dispatchEvent(new Event('click'));
+        });
+
+        let index;
+        const inps = document.querySelectorAll('.js-image-source input:placeholder-shown');
+
+        data.sources.forEach(item => {
+          index = data.sources.indexOf(item);
+          if (inps[index]) inps[index].value = item;
+        });
+      }
       // Clear selected file, if any
       fileField.value = '';
       showImages(data.images);
diff --git a/lib/philomena/scrapers.ex b/lib/philomena/scrapers.ex
index 31830c88..d0ac22ae 100644
--- a/lib/philomena/scrapers.ex
+++ b/lib/philomena/scrapers.ex
@@ -6,6 +6,7 @@ defmodule Philomena.Scrapers do
     Philomena.Scrapers.Tumblr,
     Philomena.Scrapers.Inkbunny,
     Philomena.Scrapers.E621,
+    Philomena.Scrapers.Furaffinity,
     Philomena.Scrapers.Raw
   ]
 
diff --git a/lib/philomena/scrapers/furaffinity.ex b/lib/philomena/scrapers/furaffinity.ex
new file mode 100644
index 00000000..e103f8fe
--- /dev/null
+++ b/lib/philomena/scrapers/furaffinity.ex
@@ -0,0 +1,31 @@
+defmodule Philomena.Scrapers.Furaffinity do
+  @url_regex ~r|\Ahttps?://furaffinity\.net/view/([0-9]+)|
+
+  @spec can_handle?(URI.t(), String.t()) :: true | false
+  def can_handle?(_uri, url) do
+    String.match?(url, @url_regex)
+  end
+
+  def scrape(_uri, url) do
+[_, submission_id] = Regex.run(@url_regex, url, capture: :all)
+    api_url = "https://faexport.spangle.org.uk/submission/#{submission_id}.json"
+    {:ok, %Tesla.Env{status: 200, body: body}} = Philomena.Http.get(api_url)
+
+    json = Jason.decode!(body)
+    [submission] = json
+
+    images = for x <- submission do
+      %{
+        url: "#{x["download"]}",
+        camo_url: Camo.Image.image_url(x["thumbnail"])
+      }
+    end
+
+    %{
+      source_url: url,
+      author_name: submission["name"],
+      description: submission["description"],
+      images: images
+    }
+  end
+end