Update metadata thumbnail fetcher to use the best jpg available

This commit is contained in:
Kieran Eglin 2024-04-16 17:30:18 -07:00
parent 853173e30a
commit 4219d2d576
No known key found for this signature in database
GPG key ID: 193984967FCF432D
3 changed files with 25 additions and 18 deletions

View file

@ -54,11 +54,18 @@ defmodule Pinchflat.Metadata.MetadataFileHelpers do
@doc """ @doc """
Downloads and stores a thumbnail for a media item, returning the filepath. Downloads and stores a thumbnail for a media item, returning the filepath.
Chooses the highest quality jpg thumbnail available.
Returns binary() Returns binary()
""" """
def download_and_store_thumbnail_for(database_record, metadata_map) do def download_and_store_thumbnail_for(database_record, metadata_map) do
thumbnail_url = metadata_map["thumbnail"] thumbnail_url =
metadata_map["thumbnails"]
|> Enum.filter(&(&1["preference"] && String.ends_with?(&1["url"], ".jpg")))
|> Enum.sort(&(&1["preference"] >= &2["preference"]))
|> List.first()
|> Map.get("url")
filepath = generate_filepath_for(database_record, Path.basename(thumbnail_url)) filepath = generate_filepath_for(database_record, Path.basename(thumbnail_url))
thumbnail_blob = fetch_thumbnail_from_url(thumbnail_url) thumbnail_blob = fetch_thumbnail_from_url(thumbnail_url)

View file

@ -731,9 +731,7 @@ defmodule Pinchflat.MediaTest do
metadata: %{ metadata: %{
metadata_filepath: MetadataFileHelpers.compress_and_store_metadata_for(media_item, %{}), metadata_filepath: MetadataFileHelpers.compress_and_store_metadata_for(media_item, %{}),
thumbnail_filepath: thumbnail_filepath:
MetadataFileHelpers.download_and_store_thumbnail_for(media_item, %{ MetadataFileHelpers.download_and_store_thumbnail_for(media_item, render_parsed_metadata(:media_metadata))
"thumbnail" => "https://example.com/thumbnail.jpg"
})
} }
} }
@ -760,9 +758,7 @@ defmodule Pinchflat.MediaTest do
metadata: %{ metadata: %{
metadata_filepath: MetadataFileHelpers.compress_and_store_metadata_for(media_item, %{}), metadata_filepath: MetadataFileHelpers.compress_and_store_metadata_for(media_item, %{}),
thumbnail_filepath: thumbnail_filepath:
MetadataFileHelpers.download_and_store_thumbnail_for(media_item, %{ MetadataFileHelpers.download_and_store_thumbnail_for(media_item, render_parsed_metadata(:media_metadata))
"thumbnail" => "https://example.com/thumbnail.jpg"
})
} }
} }
@ -831,9 +827,7 @@ defmodule Pinchflat.MediaTest do
metadata: %{ metadata: %{
metadata_filepath: MetadataFileHelpers.compress_and_store_metadata_for(media_item, %{}), metadata_filepath: MetadataFileHelpers.compress_and_store_metadata_for(media_item, %{}),
thumbnail_filepath: thumbnail_filepath:
MetadataFileHelpers.download_and_store_thumbnail_for(media_item, %{ MetadataFileHelpers.download_and_store_thumbnail_for(media_item, render_parsed_metadata(:media_metadata))
"thumbnail" => "https://example.com/thumbnail.jpg"
})
} }
} }

View file

@ -54,13 +54,11 @@ defmodule Pinchflat.Metadata.MetadataFileHelpersTest do
describe "download_and_store_thumbnail_for/2" do describe "download_and_store_thumbnail_for/2" do
setup do setup do
# This tests that the HTTP endpoint is being called with every test # This tests that the HTTP endpoint is being called with every test
expect(HTTPClientMock, :get, fn url, _headers, _opts -> expect(HTTPClientMock, :get, fn _url, _headers, _opts ->
assert url =~ "example.com"
{:ok, "thumbnail data"} {:ok, "thumbnail data"}
end) end)
metadata = %{"thumbnail" => "example.com/thumbnail.jpg"} metadata = render_parsed_metadata(:media_metadata)
{:ok, %{metadata: metadata}} {:ok, %{metadata: metadata}}
end end
@ -68,7 +66,7 @@ defmodule Pinchflat.Metadata.MetadataFileHelpersTest do
test "returns the filepath", %{media_item: media_item, metadata: metadata} do test "returns the filepath", %{media_item: media_item, metadata: metadata} do
filepath = Helpers.download_and_store_thumbnail_for(media_item, metadata) filepath = Helpers.download_and_store_thumbnail_for(media_item, metadata)
assert filepath =~ ~r{/media_items/#{media_item.id}/thumbnail.jpg} assert filepath =~ ~r{/media_items/#{media_item.id}/maxresdefault.jpg}
end end
test "creates folder structure based on passed record", %{media_item: media_item, metadata: metadata} do test "creates folder structure based on passed record", %{media_item: media_item, metadata: metadata} do
@ -77,11 +75,19 @@ defmodule Pinchflat.Metadata.MetadataFileHelpersTest do
assert File.exists?(Path.dirname(filepath)) assert File.exists?(Path.dirname(filepath))
end end
test "the filename and extension is based on the URL", %{media_item: media_item} do test "chooses the highest preference jpg thumbnail available", %{media_item: media_item} do
metadata = %{"thumbnail" => "example.com/maxres.webp"} metadata = %{
"thumbnails" => [
%{"url" => "https://i.ytimg.com/vi/ABC123/img_1.jpg", "preference" => -1},
%{"url" => "https://i.ytimg.com/vi/ABC123/img_2.jpg", "preference" => 1},
%{"url" => "https://i.ytimg.com/vi/ABC123/img_3.jpg", "preference" => -10},
%{"url" => "https://i.ytimg.com/vi/ABC123/img_4.webp", "preference" => 10}
]
}
filepath = Helpers.download_and_store_thumbnail_for(media_item, metadata) filepath = Helpers.download_and_store_thumbnail_for(media_item, metadata)
assert Path.basename(filepath) == "maxres.webp" assert filepath =~ ~r{/media_items/#{media_item.id}/img_2.jpg}
end end
end end