import { Mime } from "mime/lite"; import standardTypes from "mime/types/standard.js"; import otherTypes from "mime/types/other.js"; import { nanoid } from "nanoid"; export const formatBytes = (bytes: number) => { const sizes = ["Bytes", "KB", "MB", "GB", "TB"]; if (bytes === 0) return "n/a"; const i = parseInt(String(Math.floor(Math.log(bytes) / Math.log(1024))), 10); if (i === 0) return `${bytes} ${sizes[i]}`; return `${(bytes / 1024 ** i).toFixed(2)} ${sizes[i]}`; }; export const secondsToTime = (seconds: number) => { const d = Math.floor(seconds / (3600 * 24)); const h = Math.floor((seconds % (3600 * 24)) / 3600); const m = Math.floor((seconds % 3600) / 60); // const s = Math.floor(seconds % 60); return `${d}d ${h}h ${m}m`; }; export const mime = new Mime(standardTypes, otherTypes); mime.define( { "video/webm": ["mkv"], }, true ); export const getMimeType = (path: string) => { return mime.getType(path) || "application/octet-stream"; }; export const slugify = (text: string, lowerCase = true) => { let str = text.replace(/^\s+|\s+$/g, ""); // Make the string lowercase if (lowerCase) { str = str.toLowerCase(); } // Remove accents, swap ñ for n, etc const from = "ÁÄÂÀÃÅČÇĆĎÉĚËÈÊẼĔȆÍÌÎÏŇÑÓÖÒÔÕØŘŔŠŤÚŮÜÙÛÝŸŽáäâàãåčçćďéěëèêẽĕȇíìîïňñóöòôõøðřŕšťúůüùûýÿžþÞĐđ߯a·/_,:;"; const to = "AAAAAACCCDEEEEEEEEIIIINNOOOOOORRSTUUUUUYYZaaaaaacccdeeeeeeeeiiiinnooooooorrstuuuuuyyzbBDdBAa------"; for (let i = 0, l = from.length; i < l; i += 1) { str = str.replace(new RegExp(from.charAt(i), "g"), to.charAt(i)); } // Remove invalid chars str = str // .replace(/[^A-Za-z0-9 -]/g, '') .replace(/[\\/:"*?<>|]/g, "") // Collapse whitespace and replace by - .replace(/\s+/g, "-") // Collapse dashes .replace(/-+/g, "-"); if (!str.length) { str = nanoid(); } return str; };