From 4219d2d576ecf98841f263b66a6da1acf42f47c1 Mon Sep 17 00:00:00 2001 From: Kieran Eglin Date: Tue, 16 Apr 2024 17:30:18 -0700 Subject: [PATCH] Update metadata thumbnail fetcher to use the best jpg available --- .../metadata/metadata_file_helpers.ex | 9 +++++++- test/pinchflat/media_test.exs | 12 +++------- .../metadata/metadata_file_helpers_test.exs | 22 ++++++++++++------- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/lib/pinchflat/metadata/metadata_file_helpers.ex b/lib/pinchflat/metadata/metadata_file_helpers.ex index 959d1ca..a804ecd 100644 --- a/lib/pinchflat/metadata/metadata_file_helpers.ex +++ b/lib/pinchflat/metadata/metadata_file_helpers.ex @@ -54,11 +54,18 @@ defmodule Pinchflat.Metadata.MetadataFileHelpers do @doc """ Downloads and stores a thumbnail for a media item, returning the filepath. + Chooses the highest quality jpg thumbnail available. Returns binary() """ 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)) thumbnail_blob = fetch_thumbnail_from_url(thumbnail_url) diff --git a/test/pinchflat/media_test.exs b/test/pinchflat/media_test.exs index fad36c0..f972259 100644 --- a/test/pinchflat/media_test.exs +++ b/test/pinchflat/media_test.exs @@ -731,9 +731,7 @@ defmodule Pinchflat.MediaTest do metadata: %{ metadata_filepath: MetadataFileHelpers.compress_and_store_metadata_for(media_item, %{}), thumbnail_filepath: - MetadataFileHelpers.download_and_store_thumbnail_for(media_item, %{ - "thumbnail" => "https://example.com/thumbnail.jpg" - }) + MetadataFileHelpers.download_and_store_thumbnail_for(media_item, render_parsed_metadata(:media_metadata)) } } @@ -760,9 +758,7 @@ defmodule Pinchflat.MediaTest do metadata: %{ metadata_filepath: MetadataFileHelpers.compress_and_store_metadata_for(media_item, %{}), thumbnail_filepath: - MetadataFileHelpers.download_and_store_thumbnail_for(media_item, %{ - "thumbnail" => "https://example.com/thumbnail.jpg" - }) + MetadataFileHelpers.download_and_store_thumbnail_for(media_item, render_parsed_metadata(:media_metadata)) } } @@ -831,9 +827,7 @@ defmodule Pinchflat.MediaTest do metadata: %{ metadata_filepath: MetadataFileHelpers.compress_and_store_metadata_for(media_item, %{}), thumbnail_filepath: - MetadataFileHelpers.download_and_store_thumbnail_for(media_item, %{ - "thumbnail" => "https://example.com/thumbnail.jpg" - }) + MetadataFileHelpers.download_and_store_thumbnail_for(media_item, render_parsed_metadata(:media_metadata)) } } diff --git a/test/pinchflat/metadata/metadata_file_helpers_test.exs b/test/pinchflat/metadata/metadata_file_helpers_test.exs index 4e2c73b..554afd2 100644 --- a/test/pinchflat/metadata/metadata_file_helpers_test.exs +++ b/test/pinchflat/metadata/metadata_file_helpers_test.exs @@ -54,13 +54,11 @@ defmodule Pinchflat.Metadata.MetadataFileHelpersTest do describe "download_and_store_thumbnail_for/2" do setup do # This tests that the HTTP endpoint is being called with every test - expect(HTTPClientMock, :get, fn url, _headers, _opts -> - assert url =~ "example.com" - + expect(HTTPClientMock, :get, fn _url, _headers, _opts -> {:ok, "thumbnail data"} end) - metadata = %{"thumbnail" => "example.com/thumbnail.jpg"} + metadata = render_parsed_metadata(:media_metadata) {:ok, %{metadata: metadata}} end @@ -68,7 +66,7 @@ defmodule Pinchflat.Metadata.MetadataFileHelpersTest do test "returns the filepath", %{media_item: media_item, metadata: metadata} do 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 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)) end - test "the filename and extension is based on the URL", %{media_item: media_item} do - metadata = %{"thumbnail" => "example.com/maxres.webp"} + test "chooses the highest preference jpg thumbnail available", %{media_item: media_item} do + 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) - assert Path.basename(filepath) == "maxres.webp" + assert filepath =~ ~r{/media_items/#{media_item.id}/img_2.jpg} end end