Support blurhash
This commit is contained in:
		
							parent
							
								
									6f0b42656d
								
							
						
					
					
						commit
						543e9402d6
					
				
					 5 changed files with 19 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -25,6 +25,7 @@ defmodule Pleroma.Upload do
 | 
			
		|||
  path as the temporary file is also tracked by `Plug.Upload{}` and automatically deleted once the request is over.
 | 
			
		||||
  * `:width` - width of the media in pixels
 | 
			
		||||
  * `:height` - height of the media in pixels
 | 
			
		||||
  * `:blurhash` - string hash of the image encoded with the blurhash algorithm (https://blurha.sh/)
 | 
			
		||||
 | 
			
		||||
  Related behaviors:
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -58,9 +59,10 @@ defmodule Pleroma.Upload do
 | 
			
		|||
          content_type: String.t(),
 | 
			
		||||
          width: integer(),
 | 
			
		||||
          height: integer(),
 | 
			
		||||
          blurhash: String.t(),
 | 
			
		||||
          path: String.t()
 | 
			
		||||
        }
 | 
			
		||||
  defstruct [:id, :name, :tempfile, :content_type, :width, :height, :path]
 | 
			
		||||
  defstruct [:id, :name, :tempfile, :content_type, :width, :height, :blurhash, :path]
 | 
			
		||||
 | 
			
		||||
  defp get_description(opts, upload) do
 | 
			
		||||
    case {opts[:description], Pleroma.Config.get([Pleroma.Upload, :default_description])} do
 | 
			
		||||
| 
						 | 
				
			
			@ -98,7 +100,8 @@ def store(upload, opts \\ []) do
 | 
			
		|||
           |> Maps.put_if_present("height", upload.height)
 | 
			
		||||
         ],
 | 
			
		||||
         "name" => description
 | 
			
		||||
       }}
 | 
			
		||||
       }
 | 
			
		||||
       |> Maps.put_if_present("blurhash", upload.blurhash)}
 | 
			
		||||
    else
 | 
			
		||||
      {:description_limit, _} ->
 | 
			
		||||
        {:error, :description_too_long}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,6 +23,7 @@ def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _} = upload)
 | 
			
		|||
        upload
 | 
			
		||||
        |> Map.put(:width, image.width)
 | 
			
		||||
        |> Map.put(:height, image.height)
 | 
			
		||||
        |> Map.put(:blurhash, get_blurhash(file))
 | 
			
		||||
 | 
			
		||||
      {:ok, :filtered, upload}
 | 
			
		||||
    rescue
 | 
			
		||||
| 
						 | 
				
			
			@ -33,4 +34,12 @@ def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _} = upload)
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  def filter(_), do: {:ok, :noop}
 | 
			
		||||
 | 
			
		||||
  defp get_blurhash(file) do
 | 
			
		||||
    with {:ok, blurhash} <- :eblurhash.magick(file) do
 | 
			
		||||
      blurhash
 | 
			
		||||
    else
 | 
			
		||||
      _ -> nil
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -973,6 +973,7 @@ def prepare_attachments(object) do
 | 
			
		|||
        }
 | 
			
		||||
        |> Maps.put_if_present("width", url["width"])
 | 
			
		||||
        |> Maps.put_if_present("height", url["height"])
 | 
			
		||||
        |> Maps.put_if_present("blurhash", data["blurhash"])
 | 
			
		||||
      end)
 | 
			
		||||
 | 
			
		||||
    Map.put(object, "attachment", attachments)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										3
									
								
								mix.exs
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								mix.exs
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -198,6 +198,9 @@ defp deps do
 | 
			
		|||
      {:open_api_spex,
 | 
			
		||||
       git: "https://git.pleroma.social/pleroma/elixir-libraries/open_api_spex.git",
 | 
			
		||||
       ref: "f296ac0924ba3cf79c7a588c4c252889df4c2edd"},
 | 
			
		||||
      {:eblurhash,
 | 
			
		||||
       git: "https://github.com/zotonic/eblurhash.git",
 | 
			
		||||
       ref: "04a0b76eadf4de1be17726f39b6313b88708fd12"},
 | 
			
		||||
 | 
			
		||||
      ## dev & test
 | 
			
		||||
      {:ex_doc, "~> 0.22", only: :dev, runtime: false},
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										1
									
								
								mix.lock
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								mix.lock
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -29,6 +29,7 @@
 | 
			
		|||
  "deep_merge": {:hex, :deep_merge, "1.0.0", "b4aa1a0d1acac393bdf38b2291af38cb1d4a52806cf7a4906f718e1feb5ee961", [:mix], [], "hexpm", "ce708e5f094b9cd4e8f2be4f00d2f4250c4095be93f8cd6d018c753894885430"},
 | 
			
		||||
  "earmark": {:hex, :earmark, "1.4.3", "364ca2e9710f6bff494117dbbd53880d84bebb692dafc3a78eb50aa3183f2bfd", [:mix], [], "hexpm", "8cf8a291ebf1c7b9539e3cddb19e9cef066c2441b1640f13c34c1d3cfc825fec"},
 | 
			
		||||
  "earmark_parser": {:hex, :earmark_parser, "1.4.10", "6603d7a603b9c18d3d20db69921527f82ef09990885ed7525003c7fe7dc86c56", [:mix], [], "hexpm", "8e2d5370b732385db2c9b22215c3f59c84ac7dda7ed7e544d7c459496ae519c0"},
 | 
			
		||||
  "eblurhash": {:git, "https://github.com/zotonic/eblurhash.git", "04a0b76eadf4de1be17726f39b6313b88708fd12", [ref: "04a0b76eadf4de1be17726f39b6313b88708fd12"]},
 | 
			
		||||
  "ecto": {:hex, :ecto, "3.4.6", "08f7afad3257d6eb8613309af31037e16c36808dfda5a3cd0cb4e9738db030e4", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "6f13a9e2a62e75c2dcfc7207bfc65645ab387af8360db4c89fee8b5a4bf3f70b"},
 | 
			
		||||
  "ecto_enum": {:hex, :ecto_enum, "1.4.0", "d14b00e04b974afc69c251632d1e49594d899067ee2b376277efd8233027aec8", [:mix], [{:ecto, ">= 3.0.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "> 3.0.0", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:mariaex, ">= 0.0.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:postgrex, ">= 0.0.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "8fb55c087181c2b15eee406519dc22578fa60dd82c088be376d0010172764ee4"},
 | 
			
		||||
  "ecto_sql": {:hex, :ecto_sql, "3.4.5", "30161f81b167d561a9a2df4329c10ae05ff36eca7ccc84628f2c8b9fa1e43323", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.4.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.3.0 or ~> 0.4.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.0", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "31990c6a3579b36a3c0841d34a94c275e727de8b84f58509da5f1b2032c98ac2"},
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue