diff --git a/config/config.exs b/config/config.exs index 4e7a854..b395950 100644 --- a/config/config.exs +++ b/config/config.exs @@ -12,7 +12,9 @@ config :pinchflat, generators: [timestamp_type: :utc_datetime], # Specifying backend data here makes mocking and local testing SUPER easy yt_dlp_executable: System.find_executable("yt-dlp"), + apprise_executable: System.find_executable("apprise"), yt_dlp_runner: Pinchflat.YtDlp.CommandRunner, + apprise_runner: Pinchflat.Notifications.CommandRunner, media_directory: "/downloads", # The user may or may not store metadata for their needs, but the app will always store its copy metadata_directory: "/config/metadata", diff --git a/dev.Dockerfile b/dev.Dockerfile index 517ca63..bbf2683 100644 --- a/dev.Dockerfile +++ b/dev.Dockerfile @@ -5,15 +5,10 @@ ARG DEV_IMAGE="hexpm/elixir:${ELIXIR_VERSION}-erlang-${OTP_VERSION}-debian-${DEB FROM ${DEV_IMAGE} -# Set the locale deets -ENV LANG en_US.UTF-8 -ENV LANGUAGE en_US:en -ENV LC_ALL en_US.UTF-8 - # Install debian packages RUN apt-get update -qq RUN apt-get install -y inotify-tools ffmpeg curl git openssh-client \ - python3 python3-pip python3-setuptools python3-wheel python3-dev + python3 python3-pip python3-setuptools python3-wheel python3-dev locales # Install nodejs RUN curl -sL https://deb.nodesource.com/setup_20.x -o nodesource_setup.sh @@ -25,9 +20,20 @@ RUN npm install -g yarn RUN mix local.hex --force RUN mix local.rebar --force -# Download YT-DLP +# Download and update YT-DLP # NOTE: If you're seeing weird issues, consider using the FFMPEG released by yt-dlp -RUN python3 -m pip install -U --pre yt-dlp --break-system-packages +RUN curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/yt-dlp +RUN chmod a+rx /usr/local/bin/yt-dlp +RUN yt-dlp -U + +# Download Apprise +RUN python3 -m pip install -U apprise --break-system-packages + +# Set the locale +RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && locale-gen +ENV LANG en_US.UTF-8 +ENV LANGUAGE en_US:en +ENV LC_ALL en_US.UTF-8 # Create app directory and copy the Elixir projects into it. WORKDIR /app diff --git a/lib/pinchflat/notifications/command_runner.ex b/lib/pinchflat/notifications/command_runner.ex index 5481c9d..9415d39 100644 --- a/lib/pinchflat/notifications/command_runner.ex +++ b/lib/pinchflat/notifications/command_runner.ex @@ -5,9 +5,32 @@ defmodule Pinchflat.Notifications.CommandRunner do require Logger + alias Pinchflat.Utils.FunctionUtils + @doc """ # TODO """ - def run do + def run() do + end + + # TODO: test + # TODO: add behaviour + def version do + case System.cmd(backend_executable(), ["--version"]) do + {output, 0} -> + output + |> String.split(~r{\r?\n}) + |> List.first() + |> String.replace("Apprise", "") + |> String.trim() + |> FunctionUtils.wrap_ok() + + {output, _} -> + {:error, output} + end + end + + defp backend_executable do + Application.get_env(:pinchflat, :apprise_executable) end end diff --git a/lib/pinchflat/utils/cli_utils.ex b/lib/pinchflat/utils/cli_utils.ex new file mode 100644 index 0000000..a0a567b --- /dev/null +++ b/lib/pinchflat/utils/cli_utils.ex @@ -0,0 +1,32 @@ +defmodule Pinchflat.Utils.CliUtils do + # TODO: test + def parse_options(command_opts) do + Enum.reduce(command_opts, [], &parse_option/2) + end + + # We want to satisfy the following behaviours: + # + # 1. If the key is an atom, convert it to a string and convert it to kebab case (for convenience) + # 2. If the key is a string, assume we want it as-is and don't convert it + # 3. If the key is accompanied by a value, append the value to the list + # 4. If the key is not accompanied by a value, assume it's a flag and PREpend it to the list + defp parse_option({k, v}, acc) when is_atom(k) do + stringified_key = StringUtils.to_kebab_case(Atom.to_string(k)) + + parse_option({"--#{stringified_key}", v}, acc) + end + + defp parse_option({k, v}, acc) when is_binary(k) do + acc ++ [k, to_string(v)] + end + + defp parse_option(arg, acc) when is_atom(arg) do + stringified_arg = StringUtils.to_kebab_case(Atom.to_string(arg)) + + parse_option("--#{stringified_arg}", acc) + end + + defp parse_option(arg, acc) when is_binary(arg) do + acc ++ [arg] + end +end diff --git a/selfhosted.Dockerfile b/selfhosted.Dockerfile index 0dfc70a..62b2c70 100644 --- a/selfhosted.Dockerfile +++ b/selfhosted.Dockerfile @@ -79,7 +79,7 @@ ARG PORT=8945 RUN apt-get update -y RUN apt-get install -y libstdc++6 openssl libncurses5 locales ca-certificates \ - ffmpeg curl git openssh-client nano + ffmpeg curl git openssh-client nano python3 python3-pip RUN apt-get clean && rm -f /var/lib/apt/lists/*_* # Download and update YT-DLP @@ -87,9 +87,11 @@ RUN curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o RUN chmod a+rx /usr/local/bin/yt-dlp RUN yt-dlp -U +# Download Apprise +RUN python3 -m pip install -U apprise --break-system-packages + # Set the locale RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && locale-gen - ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8