[Enhancement] Track the predicted final filepath for indexed media items (#461)
* Added ability to pass additional yt-dlp options to indexing step * Added predicted_filename to media struct * WIP added ability to predict filepath to source indexing * renamed predicted_filepath * Added the ability to predict filepath when fast indexing * Add predicted_media_filepath to media items table * Addressed TODOs
This commit is contained in:
@@ -461,6 +461,22 @@ defmodule Pinchflat.Downloading.DownloadOptionBuilderTest do
|
||||
end
|
||||
end
|
||||
|
||||
describe "build_quality_options_for/1" do
|
||||
test "builds quality options for a media item", %{media_item: media_item} do
|
||||
options = DownloadOptionBuilder.build_quality_options_for(media_item)
|
||||
|
||||
assert {:format_sort, "res:1080,+codec:avc:m4a"} in options
|
||||
assert {:remux_video, "mp4"} in options
|
||||
end
|
||||
|
||||
test "builds quality options for a source", %{media_item: media_item} do
|
||||
options = DownloadOptionBuilder.build_quality_options_for(media_item.source)
|
||||
|
||||
assert {:format_sort, "res:1080,+codec:avc:m4a"} in options
|
||||
assert {:remux_video, "mp4"} in options
|
||||
end
|
||||
end
|
||||
|
||||
defp update_media_profile_attribute(media_item_with_preloads, attrs) do
|
||||
media_item_with_preloads.source.media_profile
|
||||
|> Profiles.change_media_profile(attrs)
|
||||
|
||||
@@ -61,6 +61,18 @@ defmodule Pinchflat.FastIndexing.FastIndexingHelpersTest do
|
||||
assert [_] = Tasks.list_tasks_for(media_item, "MediaDownloadWorker")
|
||||
end
|
||||
|
||||
test "passes the source's download options to the yt-dlp runner", %{source: source} do
|
||||
expect(HTTPClientMock, :get, fn _url -> {:ok, "<yt:videoId>test_1</yt:videoId>"} end)
|
||||
|
||||
expect(YtDlpRunnerMock, :run, fn _url, opts, _ot, _addl_opts ->
|
||||
assert {:output, "/tmp/test/media/%(title)S.%(ext)S"} in opts
|
||||
assert {:remux_video, "mp4"} in opts
|
||||
{:ok, media_attributes_return_fixture()}
|
||||
end)
|
||||
|
||||
FastIndexingHelpers.kickoff_download_tasks_from_youtube_rss_feed(source)
|
||||
end
|
||||
|
||||
test "sets use_cookies if the source uses cookies" do
|
||||
expect(HTTPClientMock, :get, fn _url -> {:ok, "<yt:videoId>test_1</yt:videoId>"} end)
|
||||
|
||||
|
||||
@@ -202,6 +202,16 @@ defmodule Pinchflat.SlowIndexing.SlowIndexingHelpersTest do
|
||||
assert %Ecto.Changeset{} = changeset
|
||||
end
|
||||
|
||||
test "passes the source's download options to the yt-dlp runner", %{source: source} do
|
||||
expect(YtDlpRunnerMock, :run, fn _url, opts, _ot, _addl_opts ->
|
||||
assert {:output, "/tmp/test/media/%(title)S.%(ext)S"} in opts
|
||||
assert {:remux_video, "mp4"} in opts
|
||||
{:ok, source_attributes_return_fixture()}
|
||||
end)
|
||||
|
||||
SlowIndexingHelpers.index_and_enqueue_download_for_media_items(source)
|
||||
end
|
||||
|
||||
test "sets use_cookies if the source uses cookies" do
|
||||
expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot, addl_opts ->
|
||||
assert {:use_cookies, true} in addl_opts
|
||||
|
||||
@@ -35,6 +35,16 @@ defmodule Pinchflat.YtDlp.MediaCollectionTest do
|
||||
assert {:error, "Big issue", 1} = MediaCollection.get_media_attributes_for_collection(@channel_url)
|
||||
end
|
||||
|
||||
test "passes long additional command options" do
|
||||
expect(YtDlpRunnerMock, :run, fn _url, opts, _ot, _addl_opts ->
|
||||
assert :foo in opts
|
||||
|
||||
{:ok, ""}
|
||||
end)
|
||||
|
||||
assert {:ok, _} = MediaCollection.get_media_attributes_for_collection(@channel_url, [:foo])
|
||||
end
|
||||
|
||||
test "passes additional args to runner" do
|
||||
expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot, addl_opts ->
|
||||
assert [{:output_filepath, filepath} | _] = addl_opts
|
||||
@@ -56,7 +66,7 @@ defmodule Pinchflat.YtDlp.MediaCollectionTest do
|
||||
end
|
||||
|
||||
assert {:ok, _} =
|
||||
MediaCollection.get_media_attributes_for_collection(@channel_url, file_listener_handler: handler)
|
||||
MediaCollection.get_media_attributes_for_collection(@channel_url, [], file_listener_handler: handler)
|
||||
|
||||
assert_receive {:handler, filename}
|
||||
assert String.ends_with?(filename, ".json")
|
||||
|
||||
@@ -120,13 +120,22 @@ defmodule Pinchflat.YtDlp.MediaTest do
|
||||
assert {:ok, _} = Media.get_media_attributes(@media_url)
|
||||
end
|
||||
|
||||
test "passes along additional command options" do
|
||||
expect(YtDlpRunnerMock, :run, fn _url, opts, _ot, _addl ->
|
||||
assert [:simulate, :skip_download, :custom_arg] = opts
|
||||
{:ok, media_attributes_return_fixture()}
|
||||
end)
|
||||
|
||||
assert {:ok, _} = Media.get_media_attributes(@media_url, [:custom_arg])
|
||||
end
|
||||
|
||||
test "passes along additional options" do
|
||||
expect(YtDlpRunnerMock, :run, fn _url, _opts, _ot, addl ->
|
||||
assert [addl_arg: true] = addl
|
||||
{:ok, media_attributes_return_fixture()}
|
||||
end)
|
||||
|
||||
assert {:ok, _} = Media.get_media_attributes(@media_url, addl_arg: true)
|
||||
assert {:ok, _} = Media.get_media_attributes(@media_url, [], addl_arg: true)
|
||||
end
|
||||
|
||||
test "returns the error straight through when the command fails" do
|
||||
@@ -139,7 +148,7 @@ defmodule Pinchflat.YtDlp.MediaTest do
|
||||
describe "indexing_output_template/0" do
|
||||
test "contains all the greatest hits" do
|
||||
attrs =
|
||||
~w(id title live_status original_url description aspect_ratio duration upload_date timestamp playlist_index)a
|
||||
~w(id title live_status original_url description aspect_ratio duration upload_date timestamp playlist_index filename)a
|
||||
|
||||
formatted_attrs = "%(.{#{Enum.join(attrs, ",")}})j"
|
||||
|
||||
@@ -159,7 +168,8 @@ defmodule Pinchflat.YtDlp.MediaTest do
|
||||
"duration" => 60,
|
||||
"upload_date" => "20210101",
|
||||
"timestamp" => 1_600_000_000,
|
||||
"playlist_index" => 1
|
||||
"playlist_index" => 1,
|
||||
"filename" => "TiZPUDkDYbk.mp4"
|
||||
}
|
||||
|
||||
assert %Media{
|
||||
@@ -171,7 +181,8 @@ defmodule Pinchflat.YtDlp.MediaTest do
|
||||
short_form_content: false,
|
||||
uploaded_at: ~U[2020-09-13 12:26:40Z],
|
||||
duration_seconds: 60,
|
||||
playlist_index: 1
|
||||
playlist_index: 1,
|
||||
predicted_media_filepath: "TiZPUDkDYbk.mp4"
|
||||
} == Media.response_to_struct(response)
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user