Skip to content

Commit 63bb4d2

Browse files
authored
Added pending check before downloading media (#571)
1 parent 80406c9 commit 63bb4d2

File tree

2 files changed

+76
-9
lines changed

2 files changed

+76
-9
lines changed

lib/pinchflat/downloading/media_download_worker.ex

+15-2
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,7 @@ defmodule Pinchflat.Downloading.MediaDownloadWorker do
4949

5050
media_item = fetch_and_run_prevent_download_user_script(media_item_id)
5151

52-
# If the source or media item is set to not download media, perform a no-op unless forced
53-
if (media_item.source.download_media && !media_item.prevent_download) || should_force do
52+
if should_download_media?(media_item, should_force, is_quality_upgrade) do
5453
download_media_and_schedule_jobs(media_item, is_quality_upgrade, should_force)
5554
else
5655
:ok
@@ -60,6 +59,20 @@ defmodule Pinchflat.Downloading.MediaDownloadWorker do
6059
Ecto.StaleEntryError -> Logger.info("#{__MODULE__} discarded: media item #{media_item_id} stale")
6160
end
6261

62+
# If this is a quality upgrade, only check if the source is set to download media
63+
# or that the media item's download hasn't been prevented
64+
defp should_download_media?(media_item, should_force, true = _is_quality_upgrade) do
65+
(media_item.source.download_media && !media_item.prevent_download) || should_force
66+
end
67+
68+
# If it's not a quality upgrade, additionally check if the media item is pending download
69+
defp should_download_media?(media_item, should_force, _is_quality_upgrade) do
70+
source = media_item.source
71+
is_pending = Media.pending_download?(media_item)
72+
73+
(is_pending && source.download_media && !media_item.prevent_download) || should_force
74+
end
75+
6376
# If a user script exists and, when run, returns a non-zero exit code, prevent this and all future downloads
6477
# of the media item.
6578
defp fetch_and_run_prevent_download_user_script(media_item_id) do

test/pinchflat/downloading/media_download_worker_test.exs

+61-7
Original file line numberDiff line numberDiff line change
@@ -67,28 +67,28 @@ defmodule Pinchflat.Downloading.MediaDownloadWorkerTest do
6767
:ok
6868
end
6969

70-
test "it saves attributes to the media_item", %{media_item: media_item} do
70+
test "saves attributes to the media_item", %{media_item: media_item} do
7171
assert media_item.media_filepath == nil
7272
perform_job(MediaDownloadWorker, %{id: media_item.id})
7373
media_item = Repo.reload(media_item)
7474

7575
assert media_item.media_filepath != nil
7676
end
7777

78-
test "it saves the metadata to the media_item", %{media_item: media_item} do
78+
test "saves the metadata to the media_item", %{media_item: media_item} do
7979
assert media_item.metadata == nil
8080
perform_job(MediaDownloadWorker, %{id: media_item.id})
8181
assert Repo.reload(media_item).metadata != nil
8282
end
8383

84-
test "it won't double-schedule downloading jobs", %{media_item: media_item} do
84+
test "won't double-schedule downloading jobs", %{media_item: media_item} do
8585
Oban.insert(MediaDownloadWorker.new(%{id: media_item.id}))
8686
Oban.insert(MediaDownloadWorker.new(%{id: media_item.id}))
8787

8888
assert [_] = all_enqueued(worker: MediaDownloadWorker)
8989
end
9090

91-
test "it sets the job to retryable if the download fails", %{media_item: media_item} do
91+
test "sets the job to retryable if the download fails", %{media_item: media_item} do
9292
expect(YtDlpRunnerMock, :run, 2, fn
9393
_url, :get_downloadable_status, _opts, _ot, _addl -> {:ok, "{}"}
9494
_url, :download, _opts, _ot, _addl -> {:error, "error"}
@@ -140,7 +140,7 @@ defmodule Pinchflat.Downloading.MediaDownloadWorkerTest do
140140
end)
141141
end
142142

143-
test "it ensures error are returned in a 2-item tuple", %{media_item: media_item} do
143+
test "ensures error are returned in a 2-item tuple", %{media_item: media_item} do
144144
expect(YtDlpRunnerMock, :run, 2, fn
145145
_url, :get_downloadable_status, _opts, _ot, _addl -> {:ok, "{}"}
146146
_url, :download, _opts, _ot, _addl -> {:error, "error", 1}
@@ -149,7 +149,7 @@ defmodule Pinchflat.Downloading.MediaDownloadWorkerTest do
149149
assert {:error, :download_failed} = perform_job(MediaDownloadWorker, %{id: media_item.id})
150150
end
151151

152-
test "it does not download if the source is set to not download", %{media_item: media_item} do
152+
test "does not download if the source is set to not download", %{media_item: media_item} do
153153
expect(YtDlpRunnerMock, :run, 0, fn _url, :download, _opts, _ot, _addl -> :ok end)
154154

155155
Sources.update_source(media_item.source, %{download_media: false})
@@ -165,7 +165,7 @@ defmodule Pinchflat.Downloading.MediaDownloadWorkerTest do
165165
perform_job(MediaDownloadWorker, %{id: media_item.id})
166166
end
167167

168-
test "it saves the file's size to the database", %{media_item: media_item} do
168+
test "saves the file's size to the database", %{media_item: media_item} do
169169
expect(YtDlpRunnerMock, :run, 3, fn
170170
_url, :get_downloadable_status, _opts, _ot, _addl ->
171171
{:ok, "{}"}
@@ -214,6 +214,14 @@ defmodule Pinchflat.Downloading.MediaDownloadWorkerTest do
214214

215215
perform_job(MediaDownloadWorker, %{id: media_item.id})
216216
end
217+
218+
test "does not download if the media item isn't pending download", %{media_item: media_item} do
219+
expect(YtDlpRunnerMock, :run, 0, fn _url, :download, _opts, _ot, _addl -> :ok end)
220+
221+
Media.update_media_item(media_item, %{media_filepath: "foo.mp4"})
222+
223+
perform_job(MediaDownloadWorker, %{id: media_item.id})
224+
end
217225
end
218226

219227
describe "perform/1 when testing non-downloadable media" do
@@ -232,12 +240,30 @@ defmodule Pinchflat.Downloading.MediaDownloadWorkerTest do
232240

233241
describe "perform/1 when testing forced downloads" do
234242
test "ignores 'prevent_download' if forced", %{media_item: media_item} do
243+
expect(YtDlpRunnerMock, :run, 3, fn
244+
_url, :get_downloadable_status, _opts, _ot, _addl -> {:ok, "{}"}
245+
_url, :download, _opts, _ot, _addl -> {:ok, render_metadata(:media_metadata)}
246+
_url, :download_thumbnail, _opts, _ot, _addl -> {:ok, ""}
247+
end)
248+
235249
Sources.update_source(media_item.source, %{download_media: false})
236250
Media.update_media_item(media_item, %{prevent_download: true})
237251

238252
perform_job(MediaDownloadWorker, %{id: media_item.id, force: true})
239253
end
240254

255+
test "ignores whether the media item is pending when forced", %{media_item: media_item} do
256+
expect(YtDlpRunnerMock, :run, 3, fn
257+
_url, :get_downloadable_status, _opts, _ot, _addl -> {:ok, "{}"}
258+
_url, :download, _opts, _ot, _addl -> {:ok, render_metadata(:media_metadata)}
259+
_url, :download_thumbnail, _opts, _ot, _addl -> {:ok, ""}
260+
end)
261+
262+
Media.update_media_item(media_item, %{media_filepath: "foo.mp4"})
263+
264+
perform_job(MediaDownloadWorker, %{id: media_item.id, force: true})
265+
end
266+
241267
test "sets force_overwrites runner option", %{media_item: media_item} do
242268
expect(YtDlpRunnerMock, :run, 3, fn
243269
_url, :get_downloadable_status, _opts, _ot, _addl ->
@@ -265,6 +291,34 @@ defmodule Pinchflat.Downloading.MediaDownloadWorkerTest do
265291
assert media_item.media_redownloaded_at != nil
266292
end
267293

294+
test "ignores whether the media item is pending when re-downloaded", %{media_item: media_item} do
295+
expect(YtDlpRunnerMock, :run, 3, fn
296+
_url, :get_downloadable_status, _opts, _ot, _addl -> {:ok, "{}"}
297+
_url, :download, _opts, _ot, _addl -> {:ok, render_metadata(:media_metadata)}
298+
_url, :download_thumbnail, _opts, _ot, _addl -> {:ok, ""}
299+
end)
300+
301+
Media.update_media_item(media_item, %{media_filepath: "foo.mp4"})
302+
303+
perform_job(MediaDownloadWorker, %{id: media_item.id, quality_upgrade?: true})
304+
end
305+
306+
test "doesn't redownload if the source is set to not download", %{media_item: media_item} do
307+
expect(YtDlpRunnerMock, :run, 0, fn _url, :download, _opts, _ot, _addl -> :ok end)
308+
309+
Sources.update_source(media_item.source, %{download_media: false})
310+
311+
perform_job(MediaDownloadWorker, %{id: media_item.id, quality_upgrade?: true})
312+
end
313+
314+
test "doesn't redownload if the media item is set to not download", %{media_item: media_item} do
315+
expect(YtDlpRunnerMock, :run, 0, fn _url, :download, _opts, _ot, _addl -> :ok end)
316+
317+
Media.update_media_item(media_item, %{prevent_download: true})
318+
319+
perform_job(MediaDownloadWorker, %{id: media_item.id, quality_upgrade?: true})
320+
end
321+
268322
test "sets force_overwrites runner option", %{media_item: media_item} do
269323
expect(YtDlpRunnerMock, :run, 3, fn
270324
_url, :get_downloadable_status, _opts, _ot, _addl ->

0 commit comments

Comments
 (0)