;;;; cl-mime-from-string.lisp (in-package #:cl-mime-from-string) (eval-when (:compile-toplevel :load-toplevel :execute) (defun to-cond-form-string= (str1 form) (if (or (eq t (first form)) (eq 'otherwise (first form))) `(t ,(second form)) `((string= ,str1 ,(first form)) ,(second form)))) (defmacro string-case (string &body cases) `(cond ,@(mapcar (lambda (sym) (to-cond-form-string= string sym)) cases))) (defun mime-type-from-string (file-string &optional (default "application/octet-stream")) "takes in a string like 'abc.txt' and returns its associated mime-type from https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types. If there is no extension, or one that is unknown then the value of default is returned" (let* ((pos (position #\. file-string :test #'char= :from-end t)) (type (reverse (subseq file-string (if pos (1+ pos) 0))))) (string-case type ("txt" "text/plain") ("aac" "audio/acc") ("abw" "application/x-abiword") ("arc" "application/x-freearc") ("avi" "video/x-msvideo") ("azw" "application/vnd.amazon.ebook") ("bin" "application/vnd.amazon.ebook") ("bmp" "image/bmp") ("bz" "application/x-bzip") ("bz2" "application/x-bzip2") ("csh" "application/x-csh") ("css" "text/css") ("csv" "text/csv") ("doc" "application/msword") ("docx" "application/vnd.openxmlformats-officedocument.wordprocessingml.document") ("eot" "application/vnd.ms-fontobject") ("epub" "application/epub+zip") ("gz" "application/gzip") ("htm" "text/html") ("html" "text/html") ("ico" "image/vnd.microsoft.icon") ("ics" "text/calendar") ("jar" "application/java-archive") ("jpeg" "image/jpeg") ("jpg" "image/jpeg") ("js" "text/javascript") ("json" "application/json") ("jsonld" "application/json") ("mid" "audio/midi");;could also be audio/x-midi ("midi" "audio/midi");;^ ("mjs" "text/javascript") ("mp3" "audio/mpeg") ("mpeg" "video/mpeg") ("mpkg" "application/vnd.apple.installer+xml") ("odp" "application/vnd.oasis.opendocument.presentation") ("ods" "application/vnd.oasis.opendocument.spreadsheet") ("odt" "application/vnd.oasis.opendocument.text") ("oga" "audio/ogg") ("ogv" "video/ogg") ("ogx" "application/ogg") ("opus" "audio/opus") ("otf" "font/otf") ("png" "image/png") ("pdf" "application/pdf") ("php" "application/php") ("ppt" "application/vnd.ms-powerpoint") ("pptx" "application/vnd.openxmlformats-officedocument.presentationml.presentation") ("rar" "application/vnd.rar") ("rtf" "application/rtf") ("sh" "application/x-sh") ("svg" "image/svg+xml") ("swf" "application/x-shockwave-flash") ("tar" "application/x-tar") ("tif" "image/tiff") ("tiff" "image/tiff") ("ts" "video/mp2t") ("ttf" "font/ttf") ("vsd" "application/vnd.visio") ("wav" "audio/wav") ("weba" "audio/webm") ("webm" "video/webm") ("webp" "image/webp") ("woff" "font/woff") ("woff2" "font/woff2") ("xhtml" "application/xhtml+xml") ("xls" "application/vnd.ms-excel") ("xlsx" "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") ("xml" "application/xml") ("xul" "application/vnd.mozilla.xul+xml") ("zip" "application/zip") ("3gp" "video/3gpp") ("3g2" "video/3gpp2") ("7z" "application/x-7z-compressed") (otherwise default)))) )