Updates metadata parser to include subtitles

This commit is contained in:
Kieran Eglin 2024-01-31 10:20:58 -08:00
parent 2c20e3a87a
commit c0b9c40839
No known key found for this signature in database
GPG key ID: 193984967FCF432D
3 changed files with 4893 additions and 835 deletions

View file

@ -16,12 +16,30 @@ defmodule Pinchflat.MediaClient.Backends.YtDlp.MetadataParser do
Returns map() Returns map()
""" """
def parse_for_media_item(metadata) do def parse_for_media_item(metadata) do
%{ metadata_attrs = %{
title: metadata["title"],
video_filepath: metadata["filepath"],
metadata: %{ metadata: %{
client_response: metadata client_response: metadata
} }
} }
metadata_attrs
|> Map.merge(parse_media_metadata(metadata))
|> Map.merge(parse_subtitle_metadata(metadata))
end
defp parse_media_metadata(metadata) do
%{
title: metadata["title"],
video_filepath: metadata["filepath"]
}
end
defp parse_subtitle_metadata(metadata) do
subtitle_map = metadata["requested_subtitles"] || %{}
%{
# IDEA: if needed, consider filtering out subtitles that don't exist on-disk
subtitles: Enum.map(subtitle_map, fn {lang, attrs} -> [lang, attrs["filepath"]] end)
}
end end
end end

View file

@ -22,7 +22,7 @@ defmodule Pinchflat.MediaClient.Backends.YtDlp.MediaParserTest do
}} }}
end end
describe "parse_for_media_item/1" do describe "parse_for_media_item/1 when testing media metadata" do
test "it extracts the video filepath", %{metadata: metadata} do test "it extracts the video filepath", %{metadata: metadata} do
result = Parser.parse_for_media_item(metadata) result = Parser.parse_for_media_item(metadata)
@ -42,4 +42,31 @@ defmodule Pinchflat.MediaClient.Backends.YtDlp.MediaParserTest do
assert result.metadata.client_response == metadata assert result.metadata.client_response == metadata
end end
end end
describe "parse_for_media_item/1 when testing subtitle metadata" do
test "extracts the subtitle filepaths", %{metadata: metadata} do
result = Parser.parse_for_media_item(metadata)
assert [["de", german_filepath], ["en", english_filepath]] = result.subtitles
assert String.ends_with?(english_filepath, ".en.srt")
assert String.ends_with?(german_filepath, ".de.srt")
end
test "doesn't freak out if the video has no subtitles", %{metadata: metadata} do
metadata = Map.put(metadata, "requested_subtitles", %{})
result = Parser.parse_for_media_item(metadata)
assert result.subtitles == []
end
test "doesn't freak out if the requested_subtitles key is missing", %{metadata: metadata} do
metadata = Map.delete(metadata, "requested_subtitles")
result = Parser.parse_for_media_item(metadata)
assert result.subtitles == []
end
end
end end

File diff suppressed because one or more lines are too long