defmodule ExshomePlayer.Web.Live.UploadFileModal do @moduledoc """ Modal for uploading files. """ use ExshomeWeb.Live.AppPage, dependencies: [] alias ExshomePlayer.Schemas.Track alias ExshomePlayer.Services.MpvServer @impl LiveView def mount(_params, _session, %Socket{} = socket) do {:ok, allow_upload(socket, :music, accept: ~w(.mp3), max_entries: 10)} end @impl LiveView def handle_event("validate", _params, %Socket{} = socket) do {:noreply, socket} end @impl LiveView def handle_event("cancel-upload", %{"ref" => ref}, %Socket{} = socket) do {:noreply, cancel_upload(socket, :music, ref)} end @impl LiveView def handle_event("save", _params, %Socket{} = socket) do files = consume_uploaded_entries(socket, :music, fn %{path: path}, entry -> music_folder = MpvServer.music_folder() file_name = sanitize_file_name(music_folder, entry.client_name) dest = Path.join(music_folder, file_name) File.cp!(path, dest) {:ok, path} end) if length(files) > 0 do Track.refresh_tracklist() end {:noreply, close_modal(socket)} end @spec sanitize_file_name(String.t(), String.t()) :: String.t() defp sanitize_file_name(music_folder, file_name) do extension = Path.extname(file_name) name = Path.basename(file_name, extension) name = Regex.replace(~r"\W+", name, "_") file_name = "#{name}#{extension}" if file_name in File.ls!(music_folder) do sanitize_file_name(music_folder, "#{name}_1#{extension}") else file_name end end end