From 909684426669d99a74d5163cef2f859520772b26 Mon Sep 17 00:00:00 2001 From: "N0\\A" Date: Tue, 14 Jul 2026 23:19:56 +0200 Subject: [PATCH] Mimetype --- src/embed.odin | 841 +++++++++++++++++++++++++++++-------------------- 1 file changed, 504 insertions(+), 337 deletions(-) diff --git a/src/embed.odin b/src/embed.odin index d12216f..4a11f48 100644 --- a/src/embed.odin +++ b/src/embed.odin @@ -23,347 +23,498 @@ get_ext :: proc(url: string) -> string { return "" } -detect_embed_type :: proc(url: string) -> string { +detect_mime_type :: proc(url: string) -> string { ext := get_ext(url) switch ext { - case ".jpg", - ".jpeg", - ".jpe", - ".jfif", - ".jif", - ".pjpeg", - ".pjp", - ".png", - ".apng", - ".gif", - ".webp", - ".avif", - ".heic", - ".heif", - ".hif", - ".bmp", - ".dib", - ".tif", - ".tiff", - ".ico", - ".cur", - ".svg", - ".svgz", - ".raw", - ".cr2", - ".cr3", - ".nef", - ".nrw", - ".orf", - ".sr2", - ".arw", - ".srf", - ".rw2", - ".pef", - ".raf", - ".dng", - ".3fr", - ".ari", - ".bay", - ".cap", - ".dcr", - ".erf", - ".fff", - ".iiq", - ".k25", - ".kdc", - ".mdc", - ".mos", - ".mrw", - ".obm", - ".ptx", - ".pxn", - ".r3d", - ".rwl", - ".rwz", - ".srw", - ".x3f", - ".gpr", - ".pgm", - ".ppm", - ".pbm", - ".pnm", - ".pam", - ".pfm", - ".tga", - ".icb", - ".vda", - ".vst", - ".pcx", - ".xbm", - ".xpm", - ".xwd", - ".sgi", - ".rgb", - ".rgba", - ".bw", - ".jp2", - ".j2k", - ".j2c", - ".jpf", - ".jpx", - ".jpm", - ".mj2", - ".wbmp", - ".emf", - ".wmf", - ".eps", - ".epsi", - ".epsf", - ".psd", - ".psb", - ".ai", - ".cdr", - ".xcf", - ".gbr", - ".gih", - ".pat", - ".art", - ".jxl", - ".jxr", - ".wdp", - ".hdp", - ".exr", - ".hdr", - ".dpx", - ".cin", - ".fits", - ".fit", - ".fts", - ".icns", - ".flif", - ".dds", - ".ktx", - ".ktx2", - ".astc", - ".kodak", - ".fpx", - ".pcd", - ".cmx", - ".drw", - ".cgm", - ".plt", - ".hpgl", - ".iff", - ".ilbm", - ".lbm", - ".mac", - ".msp", - ".pct", - ".pic", - ".pict", - ".pntg", - ".qtif", - ".qti", - ".ras", - ".sun", - ".tpic", - ".wpg", - ".g3", - ".g4", - ".dcm", - ".dicom", - ".ora", - ".kra", - ".clip": - return "image" - case ".mp3", - ".mp2", - ".mp1", - ".mpa", - ".mpga", - ".ogg", - ".oga", - ".opus", - ".spx", - ".wav", - ".wave", - ".flac", - ".aac", - ".adts", - ".wma", - ".m4a", - ".m4b", - ".m4p", - ".m4r", - ".aif", - ".aiff", - ".aifc", - ".au", - ".snd", - ".mid", - ".midi", - ".rmi", - ".kar", - ".ra", - ".ram", - ".mka", - ".ape", - ".wv", - ".ac3", - ".ec3", - ".eac3", - ".dts", - ".dtshd", - ".amr", - ".awb", - ".caf", - ".gsm", - ".mpc", - ".shn", - ".tta", - ".voc", - ".vox", - ".8svx", - ".mod", - ".s3m", - ".xm", - ".it", - ".stm", - ".med", - ".mtm", - ".umx", - ".669", - ".far", - ".amf", - ".dsm", - ".gdm", - ".imf", - ".okt", - ".sfx", - ".ult", - ".uni", - ".psm", - ".j2b", - ".dbm", - ".digi", - ".dtm", - ".plm", - ".nsf", - ".nsfe", - ".spc", - ".gym", - ".vgm", - ".vgz", - ".gbs", - ".hes", - ".ay", - ".sid", - ".oma", - ".aa3", - ".at3", - ".at9", - ".qcp", - ".tak", - ".ofr", - ".ofs", - ".sox", - ".weba", - ".dss", - ".alac", - ".vqf", - ".vql", - ".mxmf", - ".ota", - ".imy", - ".rtttl", - ".rtx", - ".xmf", - ".w64", - ".rf64", - ".bwf", - ".cda", - ".aup": - return "audio" - case ".mp4", - ".m4v", - ".mp4v", - ".webm", - ".mov", - ".qt", - ".avi", - ".mkv", - ".flv", - ".f4v", - ".f4p", - ".f4a", - ".f4b", - ".wmv", - ".mpg", - ".mpeg", - ".mpe", - ".m1v", - ".m2v", - ".mpv", - ".mp2v", - ".mpv2", - ".ogv", - ".ogx", - ".3gp", - ".3g2", - ".3gpp", - ".3gpp2", - ".asf", - ".asx", - ".vob", - ".ts", - ".mts", - ".m2ts", - ".tsv", - ".tsa", - ".divx", - ".xvid", - ".rm", - ".rmvb", - ".swf", - ".dv", - ".dif", - ".gifv", - ".roq", - ".nsv", - ".svi", - ".annodex", - ".axv", - ".amv", - ".bik", - ".bk2", - ".smk", - ".ivf", - ".mxf", - ".nut", - ".ogm", - ".fli", - ".flc", - ".y4m", - ".264", - ".h264", - ".265", - ".h265", - ".hevc", - ".av1", - ".vc1", - ".vp8", - ".vp9", - ".wtv", - ".yuv", - ".str", - ".pva", - ".trp", - ".rec", - ".vid", - ".rv", - ".cpk", - ".film": - return "video" + case ".jpg", ".jpeg", ".jpe", ".jfif", ".jif", ".pjpeg", ".pjp": + return "image/jpeg" + case ".png": + return "image/png" + case ".apng": + return "image/apng" + case ".gif": + return "image/gif" + case ".webp": + return "image/webp" + case ".avif": + return "image/avif" + case ".heic": + return "image/heic" + case ".heif", ".hif": + return "image/heif" + case ".bmp", ".dib": + return "image/bmp" + case ".tif", ".tiff": + return "image/tiff" + case ".ico", ".cur": + return "image/x-icon" + case ".svg", ".svgz": + return "image/svg+xml" + case ".raw": + return "image/x-raw" + case ".cr2": + return "image/x-canon-cr2" + case ".cr3": + return "image/x-canon-cr3" + case ".nef": + return "image/x-nikon-nef" + case ".nrw": + return "image/x-nikon-nrw" + case ".orf": + return "image/x-olympus-orf" + case ".sr2", ".srf": + return "image/x-sony-sr2" + case ".arw": + return "image/x-sony-arw" + case ".rw2": + return "image/x-panasonic-rw2" + case ".pef": + return "image/x-pentax-pef" + case ".rwl": + return "image/x-pentax-rwl" + case ".raf": + return "image/x-fuji-raf" + case ".dng": + return "image/x-adobe-dng" + case ".3fr": + return "image/x-3fr" + case ".ari": + return "image/x-ari" + case ".bay": + return "image/x-bay" + case ".cap": + return "image/x-cap" + case ".dcr": + return "image/x-kodak-dcr" + case ".erf": + return "image/x-epson-erf" + case ".fff": + return "image/x-hasselblad-fff" + case ".iiq": + return "image/x-iiq" + case ".k25": + return "image/x-kodak-k25" + case ".kdc": + return "image/x-kodak-kdc" + case ".mdc": + return "image/x-minolta-mdc" + case ".mos": + return "image/x-mamiya-mos" + case ".mrw": + return "image/x-minolta-mrw" + case ".obm": + return "image/x-obm" + case ".ptx": + return "image/x-pentax-ptx" + case ".pxn": + return "image/x-panasonic-pxn" + case ".r3d": + return "image/x-red-r3d" + case ".rwz": + return "image/x-rwz" + case ".srw": + return "image/x-samsung-srw" + case ".x3f": + return "image/x-sigma-x3f" + case ".gpr": + return "image/x-gpr" + case ".pgm": + return "image/x-portable-graymap" + case ".ppm": + return "image/x-portable-pixmap" + case ".pbm": + return "image/x-portable-bitmap" + case ".pnm": + return "image/x-portable-anymap" + case ".pam": + return "image/x-portable-arbitrarymap" + case ".pfm": + return "image/x-portable-floatmap" + case ".tga", ".icb", ".vda", ".vst": + return "image/x-targa" + case ".pcx": + return "image/x-pcx" + case ".xbm": + return "image/x-xbitmap" + case ".xpm": + return "image/x-xpixmap" + case ".xwd": + return "image/x-xwindowdump" + case ".sgi", ".rgb", ".rgba", ".bw": + return "image/x-sgi" + case ".jp2", ".j2k", ".j2c": + return "image/jp2" + case ".jpf", ".jpx", ".jpm", ".mj2": + return "image/jpx" + case ".wbmp": + return "image/vnd.wap.wbmp" + case ".emf": + return "image/x-emf" + case ".wmf": + return "image/x-wmf" + case ".eps", ".epsi", ".epsf": + return "application/postscript" + case ".psd": + return "image/vnd.adobe.photoshop" + case ".psb": + return "image/vnd.adobe.photoshop" + case ".ai": + return "application/postscript" + case ".cdr": + return "image/x-coreldraw" + case ".xcf": + return "image/x-xcf" + case ".gbr": + return "image/x-gimp-gbr" + case ".gih": + return "image/x-gimp-gih" + case ".pat": + return "image/x-gimp-pat" + case ".art": + return "image/x-art" + case ".jxl": + return "image/jxl" + case ".jxr", ".wdp", ".hdp": + return "image/vnd.ms-photo" + case ".exr": + return "image/x-exr" + case ".hdr": + return "image/vnd.radiance" + case ".dpx": + return "image/x-dpx" + case ".cin": + return "image/x-cineon" + case ".fits", ".fit", ".fts": + return "image/fits" + case ".icns": + return "image/x-icns" + case ".flif": + return "image/x-flif" + case ".dds": + return "image/vnd.ms-dds" + case ".ktx": + return "image/ktx" + case ".ktx2": + return "image/ktx2" + case ".astc": + return "image/x-astc" + case ".kodak": + return "image/x-kodak" + case ".fpx": + return "image/vnd.fpx" + case ".pcd": + return "image/x-photo-cd" + case ".cmx": + return "image/x-cmx" + case ".drw": + return "image/x-drw" + case ".cgm": + return "image/cgm" + case ".plt", ".hpgl": + return "image/x-hpgl" + case ".iff", ".ilbm", ".lbm": + return "image/x-iff" + case ".mac": + return "image/x-macpaint" + case ".msp": + return "image/x-mspaint" + case ".pct", ".pic", ".pict": + return "image/x-pict" + case ".pntg": + return "image/x-macpaint" + case ".qtif", ".qti": + return "image/x-quicktime" + case ".ras", ".sun": + return "image/x-sun-raster" + case ".tpic": + return "image/x-tpic" + case ".wpg": + return "image/x-wpg" + case ".g3": + return "image/g3fax" + case ".g4": + return "image/g4fax" + case ".dcm", ".dicom": + return "application/dicom" + case ".ora": + return "image/openraster" + case ".kra": + return "application/x-krita" + case ".clip": + return "image/x-clip" + + case ".mp3", ".mp2", ".mp1", ".mpa", ".mpga": + return "audio/mpeg" + case ".ogg", ".oga", ".opus": + return "audio/ogg" + case ".spx": + return "audio/x-speex" + case ".wav", ".wave": + return "audio/wav" + case ".flac": + return "audio/flac" + case ".aac", ".adts": + return "audio/aac" + case ".wma": + return "audio/x-ms-wma" + case ".m4a", ".m4b", ".m4p", ".m4r": + return "audio/mp4" + case ".aif", ".aiff", ".aifc": + return "audio/aiff" + case ".au", ".snd": + return "audio/basic" + case ".mid", ".midi", ".rmi", ".kar": + return "audio/midi" + case ".ra", ".ram": + return "audio/x-pn-realaudio" + case ".mka": + return "audio/x-matroska" + case ".ape": + return "audio/x-ape" + case ".wv": + return "audio/x-wavpack" + case ".ac3": + return "audio/ac3" + case ".ec3", ".eac3": + return "audio/eac3" + case ".dts": + return "audio/vnd.dts" + case ".dtshd": + return "audio/vnd.dts.hd" + case ".amr", ".awb": + return "audio/amr" + case ".caf": + return "audio/x-caf" + case ".gsm": + return "audio/x-gsm" + case ".mpc": + return "audio/x-musepack" + case ".shn": + return "audio/x-shn" + case ".tta": + return "audio/x-tta" + case ".voc": + return "audio/x-voc" + case ".vox": + return "audio/x-vox" + case ".8svx": + return "audio/x-8svx" + case ".mod": + return "audio/x-mod" + case ".s3m": + return "audio/x-s3m" + case ".xm": + return "audio/x-xm" + case ".it": + return "audio/x-it" + case ".stm": + return "audio/x-stm" + case ".med": + return "audio/x-med" + case ".mtm": + return "audio/x-mtm" + case ".umx": + return "audio/x-umx" + case ".669": + return "audio/x-669" + case ".far": + return "audio/x-far" + case ".amf": + return "audio/x-amf" + case ".dsm": + return "audio/x-dsm" + case ".gdm": + return "audio/x-gdm" + case ".imf": + return "audio/x-imf" + case ".okt": + return "audio/x-okt" + case ".sfx": + return "audio/x-sfx" + case ".ult": + return "audio/x-ult" + case ".uni": + return "audio/x-uni" + case ".psm": + return "audio/x-psm" + case ".j2b": + return "audio/x-j2b" + case ".dbm": + return "audio/x-dbm" + case ".digi": + return "audio/x-digi" + case ".dtm": + return "audio/x-dtm" + case ".plm": + return "audio/x-plm" + case ".nsf", ".nsfe": + return "audio/x-nsf" + case ".spc": + return "audio/x-spc" + case ".gym": + return "audio/x-gym" + case ".vgm", ".vgz": + return "audio/x-vgm" + case ".gbs": + return "audio/x-gbs" + case ".hes": + return "audio/x-hes" + case ".ay": + return "audio/x-ay" + case ".sid": + return "audio/x-sid" + case ".oma": + return "audio/x-oma" + case ".aa3", ".at3", ".at9": + return "audio/x-atrac" + case ".qcp": + return "audio/qcelp" + case ".tak": + return "audio/x-tak" + case ".ofr", ".ofs": + return "audio/x-optimfrog" + case ".sox": + return "audio/x-sox" + case ".weba": + return "audio/webm" + case ".dss": + return "audio/x-dss" + case ".alac": + return "audio/alac" + case ".vqf", ".vql": + return "audio/x-vqf" + case ".mxmf": + return "audio/x-mxmf" + case ".ota": + return "audio/x-ota" + case ".imy": + return "audio/i-melody" + case ".rtttl": + return "audio/x-rtttl" + case ".rtx": + return "audio/x-rtx" + case ".xmf": + return "audio/x-xmf" + case ".w64": + return "audio/x-w64" + case ".rf64": + return "audio/x-rf64" + case ".bwf": + return "audio/x-bwf" + case ".cda": + return "audio/x-cda" + case ".aup": + return "audio/x-aup" + + case ".mp4", ".m4v", ".mp4v": + return "video/mp4" + case ".webm": + return "video/webm" + case ".mov", ".qt": + return "video/quicktime" + case ".avi": + return "video/x-msvideo" + case ".mkv": + return "video/x-matroska" + case ".flv": + return "video/x-flv" + case ".f4v", ".f4p": + return "video/x-f4v" + case ".f4a", ".f4b": + return "audio/mp4" + case ".wmv": + return "video/x-ms-wmv" + case ".mpg", ".mpeg", ".mpe", ".m1v", ".m2v", ".mpv", ".mp2v", ".mpv2": + return "video/mpeg" + case ".ogv", ".ogx": + return "video/ogg" + case ".3gp", ".3gpp": + return "video/3gpp" + case ".3g2", ".3gpp2": + return "video/3gpp2" + case ".asf", ".asx": + return "video/x-ms-asf" + case ".vob": + return "video/x-vob" + case ".ts", ".mts", ".m2ts", ".tsv", ".tsa": + return "video/mp2t" + case ".divx": + return "video/x-divx" + case ".xvid": + return "video/x-xvid" + case ".rm", ".rmvb": + return "video/x-pn-realvideo" + case ".swf": + return "application/x-shockwave-flash" + case ".dv", ".dif": + return "video/x-dv" + case ".gifv": + return "video/x-gifv" + case ".roq": + return "video/x-roq" + case ".nsv": + return "video/x-nsv" + case ".svi": + return "video/x-svi" + case ".annodex": + return "application/x-annodex" + case ".axv": + return "video/x-annodex" + case ".amv": + return "video/x-amv" + case ".bik", ".bk2": + return "video/x-bik" + case ".smk": + return "video/x-smacker" + case ".ivf": + return "video/x-ivf" + case ".mxf": + return "application/mxf" + case ".nut": + return "video/x-nut" + case ".ogm": + return "video/x-ogm" + case ".fli", ".flc": + return "video/x-fli" + case ".y4m": + return "video/x-yuv4mpegpipe" + case ".264", ".h264": + return "video/H264" + case ".265", ".h265", ".hevc": + return "video/H265" + case ".av1": + return "video/AV1" + case ".vc1": + return "video/x-vc1" + case ".vp8": + return "video/VP8" + case ".vp9": + return "video/VP9" + case ".wtv": + return "video/x-wtv" + case ".yuv": + return "video/x-yuv" + case ".str": + return "video/x-str" + case ".pva": + return "video/x-pva" + case ".trp": + return "video/x-trp" + case ".rec": + return "video/x-rec" + case ".vid": + return "video/x-vid" + case ".rv": + return "video/vnd.rn-realvideo" + case ".cpk": + return "video/x-cpk" + case ".film": + return "video/x-film" + case "js", "javascript": - return "script" + return "text/javascript" case: - return "iframe" + return "text/html" } } @@ -383,3 +534,19 @@ parse_type_hint :: proc(type_hint: string) -> string { return "" } } + +detect_embed_type :: proc(url: string) -> string { + mime := detect_mime_type(url) + switch { + case strings.has_prefix(mime, "image/"): + return "image" + case strings.has_prefix(mime, "audio/"): + return "audio" + case strings.has_prefix(mime, "video/"): + return "video" + case mime == "text/javascript" || mime == "application/javascript": + return "script" + case: + return "iframe" + } +}