This commit is contained in:
byte[] 2019-11-30 18:11:24 -05:00
parent 664bd0b0dd
commit 927cc55073
6 changed files with 134 additions and 0 deletions

View file

@ -0,0 +1,34 @@
defmodule PhilomenaWeb.Api.WatchedController do
use PhilomenaWeb, :controller
alias Philomena.Images.{Image, Query}
import Ecto.Query
def index(conn, _params) do
user = conn.assigns.current_user
filter = conn.assigns.compiled_filter
{:ok, query} = Query.compile(user, "my:watched")
images =
Image.search_records(
%{
query: %{
bool: %{
must: query,
must_not: [
filter,
%{term: %{hidden_from_users: true}}
]
}
},
sort: %{created_at: :desc}
},
conn.assigns.image_pagination,
Image |> preload(:tags)
)
conn
|> render("index.rss", images: images)
end
end

View file

@ -0,0 +1,32 @@
defmodule PhilomenaWeb.ApiTokenPlug do
alias Philomena.Users.User
alias Philomena.Repo
alias Pow.Plug
import Ecto.Query
def init([]), do: []
def call(conn, _opts) do
conn
|> maybe_find_user(conn.params["key"])
|> maybe_assign_user()
end
defp maybe_find_user(conn, nil), do: {conn, nil}
defp maybe_find_user(conn, key) do
user =
User
|> where(authentication_token: ^key)
|> Repo.one()
{conn, user}
end
defp maybe_assign_user({conn, nil}), do: conn
defp maybe_assign_user({conn, user}) do
config = Plug.fetch_config(conn)
Plug.assign_current_user(conn, user, config)
end
end

View file

@ -21,6 +21,18 @@ defmodule PhilomenaWeb.Router do
plug PhilomenaWeb.ChannelPlug plug PhilomenaWeb.ChannelPlug
end end
pipeline :rss do
plug :accepts, ["rss"]
plug PhilomenaWeb.ApiTokenPlug
plug Pow.Plug.RequireAuthenticated,
error_handler: Pow.Phoenix.PlugErrorHandler
plug PhilomenaWeb.EnsureUserEnabledPlug
plug PhilomenaWeb.CurrentFilterPlug
plug PhilomenaWeb.ImageFilterPlug
plug PhilomenaWeb.PaginationPlug
end
pipeline :api do pipeline :api do
plug :accepts, ["json"] plug :accepts, ["json"]
end end
@ -54,6 +66,12 @@ defmodule PhilomenaWeb.Router do
end end
end end
scope "/api/rss", PhilomenaWeb.Api, as: :api_rss do
pipe_through :rss
resources "/watched", WatchedController, only: [:index]
end
scope "/", PhilomenaWeb do scope "/", PhilomenaWeb do
pipe_through [:browser, :ensure_totp, :protected] pipe_through [:browser, :ensure_totp, :protected]

View file

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<rss version="2.0">
<channel>
<title>Derpibooru Watchlist</title>
<description>Your watched tags feed from Derpibooru</description>
<link><%= Routes.api_rss_watched_url(@conn, :index) %></link>
<lastBuildDate><%= last_build_date() %></lastBuildDate>
<%= for image <- @images do %>
<item>
<title><%= "##{image.id} - #{image.tag_list_cache}" %></title>
<description>
<![CDATA[
<% mouseovertext = "Size: #{image.image_width}x#{image.image_height} | Tagged: #{image.tag_list_cache}" %>
<a href="<%= Routes.image_url(@conn, :show, image) %>">
<img src="https:<%= medium_url(image) %>" alt="<%= mouseovertext %>" title="<%= mouseovertext %>"/>
</a>
]]>
</description>
<pubDate><%= NaiveDateTime.to_iso8601(image.created_at) %></pubDate>
<link><%= Routes.image_url(@conn, :show, image) %></link>
<guid><%= Routes.image_url(@conn, :show, image) %></guid>
</item>
<% end %>
</channel>
</rss>

View file

@ -38,6 +38,14 @@ h1 Content Settings
=> checkbox f, :no_spoilered_in_watched, class: "checkbox" => checkbox f, :no_spoilered_in_watched, class: "checkbox"
=> label f, :no_spoilered_in_watched, "Hide images spoilered by filter in watchlist" => label f, :no_spoilered_in_watched, "Hide images spoilered by filter in watchlist"
h4 Other
p
' RSS feed link (for Google Reader, Thunderbird, etc.):
br
= url_input f, :subscribe_url, value: Routes.api_rss_watched_url(@conn, :index, key: @conn.assigns.current_user.authentication_token), class: "input input--wide"
br
' Do not share this URL with anyone, it may allow an attacker to compromise your account.
.block__tab.hidden.flex.flex--maybe-wrap data-tab="display" .block__tab.hidden.flex.flex--maybe-wrap data-tab="display"
div div
.field .field

View file

@ -0,0 +1,16 @@
defmodule PhilomenaWeb.Api.WatchedView do
use PhilomenaWeb, :view
alias PhilomenaWeb.ImageView
def last_build_date do
DateTime.utc_now()
|> DateTime.to_iso8601()
end
def medium_url(image) do
image
|> ImageView.thumb_urls(false)
|> Map.get(:medium)
end
end