@npio/internals
Version:
A free visual website editor, powered with your own SolidJS components.
68 lines (56 loc) • 1.48 kB
text/typescript
import { NitroMedia } from "@prisma/client";
import { Media } from "../types";
export const svgMime = "image/svg+xml";
export const imageMimes = [
"image/jpeg",
"image/png",
"image/webp",
"image/gif",
"image/avif",
"image/tiff",
svgMime,
];
export const videoMimes = ["video/mp4", "video/ogg", "video/webm"];
export const audioMimes = ["audio/mpeg", "audio/wav", "audio/ogg"];
export const mediaType = function (media: NitroMedia) {
return fileType(media.mime);
};
export const fileType = function (mime: string) {
if (imageMimes.includes(mime)) {
return "image";
}
if (audioMimes.includes(mime)) {
return "audio";
}
if (videoMimes.includes(mime)) {
return "video";
}
return "other";
};
export const fallbackSize = 1920;
export const mediaImageUrl = (
media: Media,
{
size,
aspectRatio,
format = "webp",
dpr,
force,
}: {
force?: boolean;
size?: number;
aspectRatio?: string;
dpr?: number;
format?: string;
} = {},
) => {
if (media.mime === svgMime && !force) return media.rawUrl;
const params = new URLSearchParams();
if (size != null) params.append("s", String(size));
if (aspectRatio) params.append("ar", aspectRatio);
if (dpr != null) params.append("dpr", String(dpr));
if (media.timestamp != null) params.append("ts", String(media.timestamp));
const url = `/image/${media.publicId}.${format}`;
if (!params.size) return url;
return `${url}?${params}`;
};