Skip to content

Commit

Permalink
[Bugfix] Fix yt-dlp illegal write issue that causes failure to fetch …
Browse files Browse the repository at this point in the history
…source details (#247)

* Bandaid fix for yt-dlp write issue

* Ensured tempfile directory on app boot
  • Loading branch information
kieraneglin authored May 16, 2024
1 parent a7b0af6 commit b1a6a6a
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 1 deletion.
9 changes: 9 additions & 0 deletions lib/pinchflat/boot/pre_job_startup_tasks.ex
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ defmodule Pinchflat.Boot.PreJobStartupTasks do
"""
@impl true
def init(state) do
ensure_tmpfile_directory()
reset_executing_jobs()
create_blank_yt_dlp_files()
create_blank_user_script_file()
Expand All @@ -39,6 +40,14 @@ defmodule Pinchflat.Boot.PreJobStartupTasks do
{:ok, state}
end

defp ensure_tmpfile_directory do
tmpfile_dir = Application.get_env(:pinchflat, :tmpfile_directory)

if !File.exists?(tmpfile_dir) do
File.mkdir_p!(tmpfile_dir)
end
end

# If a node cannot gracefully shut down, the currently executing jobs get stuck
# in the "executing" state. This is a problem because the job runner will not
# pick them up again
Expand Down
12 changes: 11 additions & 1 deletion lib/pinchflat/utils/cli_utils.ex
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,12 @@ defmodule Pinchflat.Utils.CliUtils do
def wrap_cmd(command, args, passthrough_opts \\ [], opts \\ []) do
wrapper_command = Path.join(:code.priv_dir(:pinchflat), "cmd_wrapper.sh")
actual_command = [command] ++ args
command_opts = set_command_opts() ++ passthrough_opts
logging_arg_override = Keyword.get(opts, :logging_arg_override, Enum.join(args, " "))

Logger.info("[command_wrapper]: #{command} called with: #{logging_arg_override}")

{output, status} = System.cmd(wrapper_command, actual_command, passthrough_opts)
{output, status} = System.cmd(wrapper_command, actual_command, command_opts)
log_cmd_result(command, logging_arg_override, status, output)

{output, status}
Expand Down Expand Up @@ -81,4 +82,13 @@ defmodule Pinchflat.Utils.CliUtils do

Logger.log(log_level, log_message)
end

defp set_command_opts do
# This resolves an issue where yt-dlp would attempt to write to a read-only directory
# if you scanned a new video with `--windows-filenames` enabled. Hopefully can be removed
# in the future.
[
cd: Application.get_env(:pinchflat, :tmpfile_directory)
]
end
end
15 changes: 15 additions & 0 deletions test/pinchflat/boot/pre_job_startup_tasks_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,19 @@ defmodule Pinchflat.Boot.PreJobStartupTasksTest do
:ok
end

describe "ensure_tmpfile_directory" do
test "creates the tmpfile directory if it doesn't exist" do
tmpfile_dir = Application.get_env(:pinchflat, :tmpfile_directory)
File.rm_rf!(tmpfile_dir)

refute File.exists?(tmpfile_dir)

PreJobStartupTasks.init(%{})

assert File.exists?(tmpfile_dir)
end
end

describe "reset_executing_jobs" do
test "resets executing jobs" do
job = job_fixture()
Expand Down Expand Up @@ -78,6 +91,7 @@ defmodule Pinchflat.Boot.PreJobStartupTasksTest do

describe "apply_default_settings" do
test "sets yt_dlp version" do
File.rm_rf!(Application.get_env(:pinchflat, :tmpfile_directory))
Settings.set(yt_dlp_version: nil)

refute Settings.get!(:yt_dlp_version)
Expand All @@ -88,6 +102,7 @@ defmodule Pinchflat.Boot.PreJobStartupTasksTest do
end

test "sets apprise version" do
File.rm_rf!(Application.get_env(:pinchflat, :tmpfile_directory))
Settings.set(apprise_version: nil)

refute Settings.get!(:apprise_version)
Expand Down
4 changes: 4 additions & 0 deletions test/pinchflat/utils/cli_utils_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ defmodule Pinchflat.Utils.CliUtilsTest do
test "delegates to System.cmd/3" do
assert {"output\n", 0} = CliUtils.wrap_cmd("echo", ["output"])
end

test "sets the current directory to the tmp dir" do
assert {"/tmp/test/tmpfiles\n", 0} = CliUtils.wrap_cmd("pwd", [])
end
end

describe "parse_options/1" do
Expand Down

0 comments on commit b1a6a6a

Please sign in to comment.