mod_muc_media_metadata/mod_muc_media_metadata.lua
author Matthew Wild <mwild1@gmail.com>
Sat, 24 Sep 2022 09:25:46 +0100
changeset 5062 39c2824c2880
parent 3692 d4537f045a78
permissions -rw-r--r--
mod_cloud_notify: README overhaul
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3686
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     1
local async = require "util.async";
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     2
local promise = require "util.promise";
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     3
local http = require "net.http";
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     4
local st = require "util.stanza";
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     5
3690
2573d143621f mod_muc_media_metadata: Update namespace
Matthew Wild <mwild1@gmail.com>
parents: 3689
diff changeset
     6
local xmlns_metadata = "xmpp:prosody.im/protocol/media-metadata#0"
3686
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     7
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     8
local fetch_headers = {
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     9
	bytes = "content-length";
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    10
	type = "content-type";
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    11
	etag = "etag";
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    12
	blurhash = "blurhash";
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
};
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    15
local function fetch_media_metadata(url)
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    16
	return promise.new(function (resolve)
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    17
		http.request(url, { method = "HEAD" }, function (body, code, response) --luacheck: ignore 212/body
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    18
			if code == 200 then
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    19
				local metadata = {};
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    20
				for metadata_name, header_name in pairs(fetch_headers) do
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    21
					metadata[metadata_name] = response.headers[header_name];
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    22
				end
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    23
				resolve(metadata);
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    24
			else
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    25
				resolve(nil);
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    26
			end
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    27
		end);
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    28
	end);
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    29
end
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    30
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    31
local function metadata_to_tag(metadata)
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    32
	if not metadata then return; end
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    33
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    34
	local metadata_tag = st.stanza("metadata", { xmlns = xmlns_metadata });
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    35
	for k, v in pairs(metadata) do
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    36
		metadata_tag:text_tag(k, v)
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    37
	end
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    38
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    39
	return metadata_tag;
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    40
end
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    41
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    42
module:hook("muc-occupant-groupchat", function (event)
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    43
	local stanza = event.stanza;
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    44
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    45
	local promises;
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    46
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    47
	for oob in stanza:childtags("x", "jabber:x:oob") do
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    48
		if not promises then promises = {}; end
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    49
		local url = oob:get_child_text("url");
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    50
		local p = fetch_media_metadata(url)
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    51
			:next(metadata_to_tag)
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    52
			:next(function (metadata_tag)
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    53
				oob:add_child(metadata_tag);
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    54
			end);
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    55
		table.insert(promises, p);
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    56
	end
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    57
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    58
	if not promises then return; end
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    59
3692
d4537f045a78 mod_muc_media_metadata: Actually consensus is on async.wait after all
Matthew Wild <mwild1@gmail.com>
parents: 3690
diff changeset
    60
	async.wait(promise.all(promises));
3686
47e1c94fb6fb mod_muc_media_metadata: Module to automatically fetch metadata for posted media
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    61
end);