- with {:ok, zip_items} <- :zip.table(to_charlist(file.path)) do
- emojies =
- for {_, path, s, _, _, _} <- zip_items, elem(s, 2) == :regular do
- filename = Path.basename(path)
- shortcode = Path.basename(filename, Path.extname(filename))
-
- %{
- path: path,
- filename: path,
- shortcode: shortcode,
- exist: not is_nil(Pleroma.Emoji.get(shortcode))
- }
- end
- |> Enum.group_by(& &1[:exist])
-
- case Map.get(emojies, false, []) do
- [_ | _] = new_emojies ->
- {:ok, tmp_dir} = Pleroma.Utils.tmp_dir("emoji")
-
- try do
- {:ok, _emoji_files} =
- :zip.unzip(
- to_charlist(file.path),
- [
- {:file_list, Enum.map(new_emojies, & &1[:path])},
- {:cwd, tmp_dir}
- ]
+ with {:ok, zip_files} <- :zip.table(to_charlist(file.path)),
+ [_ | _] = emojies <- unpack_zip_emojies(zip_files),
+ {:ok, tmp_dir} <- Utils.tmp_dir("emoji") do
+ try do
+ {:ok, _emoji_files} =
+ :zip.unzip(
+ to_charlist(file.path),
+ [{:file_list, Enum.map(emojies, & &1[:path])}, {:cwd, tmp_dir}]
+ )
+
+ {_, updated_pack} =
+ Enum.map_reduce(emojies, pack, fn item, emoji_pack ->
+ emoji_file = %Plug.Upload{
+ filename: item[:filename],
+ path: Path.join(tmp_dir, item[:path])
+ }
+
+ {:ok, updated_pack} =
+ do_add_file(
+ emoji_pack,
+ item[:shortcode],
+ to_string(item[:filename]),
+ emoji_file