Store item content MIME type
This commit is contained in:
parent
198ca0345b
commit
26bfb2e58f
|
@ -141,6 +141,10 @@ label.sidebar-toggle > .oi {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
|
|
||||||
.post-content img {
|
.item-content img {
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.item-content > .raw-content {
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
|
|
@ -45,6 +45,7 @@ defmodule Frenzy.Item do
|
||||||
|
|
||||||
schema "items" do
|
schema "items" do
|
||||||
field :content, :string
|
field :content, :string
|
||||||
|
field :content_type, :string
|
||||||
field :date, :utc_datetime
|
field :date, :utc_datetime
|
||||||
field :creator, :string
|
field :creator, :string
|
||||||
field :guid, :string
|
field :guid, :string
|
||||||
|
@ -63,6 +64,7 @@ defmodule Frenzy.Item do
|
||||||
__meta__: Ecto.Schema.Metadata.t(),
|
__meta__: Ecto.Schema.Metadata.t(),
|
||||||
id: integer() | nil,
|
id: integer() | nil,
|
||||||
content: String.t(),
|
content: String.t(),
|
||||||
|
content_type: String.t() | nil,
|
||||||
date: DateTime.t(),
|
date: DateTime.t(),
|
||||||
creator: String.t(),
|
creator: String.t(),
|
||||||
guid: String.t(),
|
guid: String.t(),
|
||||||
|
|
|
@ -11,8 +11,8 @@ defmodule Frenzy.Pipeline.GeminiScrapeStage do
|
||||||
Logger.warn("Unable to get Gemini content for #{url}: #{reason}")
|
Logger.warn("Unable to get Gemini content for #{url}: #{reason}")
|
||||||
{:ok, item_params}
|
{:ok, item_params}
|
||||||
|
|
||||||
content ->
|
{content, content_type} ->
|
||||||
{:ok, %{item_params | content: content}}
|
{:ok, %{item_params | content: content, content_type: content_type}}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -24,14 +24,21 @@ defmodule Frenzy.Pipeline.GeminiScrapeStage do
|
||||||
@impl Stage
|
@impl Stage
|
||||||
def default_opts(), do: %{}
|
def default_opts(), do: %{}
|
||||||
|
|
||||||
@spec get_content(String.t(), map()) :: {:ok, String.t()} | {:error, term()}
|
@spec get_content(String.t(), map()) :: {String.t(), String.t()} | {:error, term()}
|
||||||
def get_content(url, _opts) do
|
def get_content(url, _opts) do
|
||||||
case Network.gemini_request(url) do
|
case Network.gemini_request(url) do
|
||||||
{:error, reason} ->
|
{:error, reason} ->
|
||||||
{:error, reason}
|
{:error, reason}
|
||||||
|
|
||||||
{:ok, %Gemini.Response{body: body}} ->
|
{:ok, %Gemini.Response{body: body, meta: meta}} ->
|
||||||
body
|
{body, parse_content_type(meta)}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp parse_content_type(meta) do
|
||||||
|
meta
|
||||||
|
|> String.split(";")
|
||||||
|
|> hd()
|
||||||
|
|> String.trim()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -32,7 +32,9 @@ defmodule Frenzy.Task.CreateItem do
|
||||||
url: url,
|
url: url,
|
||||||
date: date,
|
date: date,
|
||||||
creator: "",
|
creator: "",
|
||||||
content: entry.content
|
content: entry.content,
|
||||||
|
# we assume text/html in the feed itself, other stages may alter this
|
||||||
|
content_type: "text/html"
|
||||||
}
|
}
|
||||||
|
|
||||||
feed = Repo.preload(feed, :pipeline)
|
feed = Repo.preload(feed, :pipeline)
|
||||||
|
|
|
@ -16,6 +16,10 @@
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<article class="mt-4">
|
<article class="item-content mt-4">
|
||||||
|
<%= if @item.content_type in [nil, "text/html"] do %>
|
||||||
<%= raw(@item.content) %>
|
<%= raw(@item.content) %>
|
||||||
|
<% else %>
|
||||||
|
<pre class="raw-content"><%= raw(@item.content) %></pre>
|
||||||
|
<% end %>
|
||||||
</article>
|
</article>
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
defmodule Frenzy.Repo.Migrations.ItemAddContentType do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def change do
|
||||||
|
alter table(:items) do
|
||||||
|
add :content_type, :string, default: nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue