Add the media downloader with hash storage and local file serving
This commit is contained in:
@@ -13,10 +13,14 @@ const AUDIO_EXT = new Set(["mp3", "m4a", "ogg", "wav", "flac"]);
|
||||
/** Sticker formatType to file extension. 3 is Lottie JSON; not archived. */
|
||||
const STICKER_EXT: Record<number, string | undefined> = { 1: "png", 2: "apng", 4: "gif" };
|
||||
|
||||
/** Where the item came from. Embeds are never downloaded. */
|
||||
export type MediaSource = "attachment" | "sticker" | "embed";
|
||||
|
||||
/** A media item extracted from a message. `url` is the original source link. */
|
||||
export interface ExtractedMedia {
|
||||
kind: MediaKind;
|
||||
url: string;
|
||||
source: MediaSource;
|
||||
provider: string | null;
|
||||
contentType: string | null;
|
||||
size: number | null;
|
||||
@@ -68,6 +72,7 @@ function hostname(url: string | null): string | null {
|
||||
function extractEmbed(embed: CoreEmbed): ExtractedMedia | null {
|
||||
const provider = embed.provider ?? hostname(embed.url);
|
||||
const common = {
|
||||
source: "embed" as const,
|
||||
provider,
|
||||
downloaded: false,
|
||||
size: null,
|
||||
@@ -117,6 +122,7 @@ function extractSticker(sticker: CoreSticker): ExtractedMedia | null {
|
||||
|
||||
return {
|
||||
kind: ext === "gif" ? "gif" : "image",
|
||||
source: "sticker",
|
||||
url: `https://cdn.discordapp.com/stickers/${sticker.id}.${ext}`,
|
||||
provider: "discord",
|
||||
contentType: null,
|
||||
@@ -138,6 +144,7 @@ function extractFrom(message: MediaMessage): ExtractedMedia[] {
|
||||
if (!kind) continue;
|
||||
items.push({
|
||||
kind,
|
||||
source: "attachment",
|
||||
url: attachment.url,
|
||||
provider: "discord",
|
||||
contentType: attachment.contentType,
|
||||
|
||||
Reference in New Issue
Block a user