add interface to get file metadata w/ admin command

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk 2024-08-26 22:15:42 +00:00
parent e7b2c14280
commit 7b0e830f4c
3 changed files with 27 additions and 2 deletions

View file

@ -257,3 +257,11 @@ pub(super) async fn delete_all_from_server(
"Deleted {deleted_count} total files.",
)))
}
#[admin_command]
pub(super) async fn get_file_info(&self, mxc: OwnedMxcUri) -> Result<RoomMessageEventContent> {
let mxc: Mxc<'_> = mxc.as_str().try_into()?;
let metadata = self.services.media.get_metadata(&mxc);
Ok(RoomMessageEventContent::notice_markdown(format!("```\n{metadata:#?}\n```")))
}

View file

@ -2,7 +2,7 @@ mod commands;
use clap::Subcommand;
use conduit::Result;
use ruma::{EventId, MxcUri, ServerName};
use ruma::{EventId, MxcUri, OwnedMxcUri, ServerName};
use crate::admin_command_dispatch;
@ -55,4 +55,9 @@ pub(super) enum MediaCommand {
#[arg(short, long)]
force: bool,
},
GetFileInfo {
/// The MXC URL to lookup info for.
mxc: OwnedMxcUri,
},
}

View file

@ -31,7 +31,7 @@ pub struct FileMeta {
pub struct Service {
url_preview_mutex: MutexMap<String, ()>,
pub(crate) db: Data,
pub(super) db: Data,
services: Services,
}
@ -347,6 +347,18 @@ impl Service {
Ok(file)
}
#[inline]
pub fn get_metadata(&self, mxc: &Mxc<'_>) -> Option<FileMeta> {
self.db
.search_file_metadata(mxc, 0, 0)
.map(|metadata| FileMeta {
content_disposition: metadata.content_disposition,
content_type: metadata.content_type,
content: None,
})
.ok()
}
#[inline]
#[must_use]
pub fn get_media_file(&self, key: &[u8]) -> PathBuf { self.get_media_file_sha256(key) }