From 63b2601e6758ff2ae8d8222d80b596eb76be95aa Mon Sep 17 00:00:00 2001 From: Matthew Barbour Date: Thu, 28 May 2020 10:05:20 -0500 Subject: [PATCH] Mime type handling overhaul Changed mime type map to deal with the reality that certain file types have multiple extensions and/or multiple mime types, as well as constants supporting all of the data. Created new functions using the updated mime type map to resolve mime types and extensions. Updated various items around the project that determine mime/extension to take advantage of the new functions. --- core/basethemelet.php | 2 +- core/extension.php | 13 +- core/filetypes.php | 409 +++++++++++++++++++++++++++++ core/imageboard/image.php | 2 +- core/imageboard/misc.php | 2 +- core/imageboard/tag.php | 2 - core/polyfills.php | 97 +------ ext/alias_editor/main.php | 2 +- ext/auto_tagger/main.php | 2 +- ext/autocomplete/main.php | 2 +- ext/browser_search/main.php | 2 +- ext/danbooru_api/main.php | 6 +- ext/handle_archive/main.php | 2 +- ext/handle_cbz/main.php | 4 +- ext/handle_flash/main.php | 2 +- ext/handle_ico/main.php | 2 +- ext/handle_mp3/main.php | 4 +- ext/handle_pixel/main.php | 8 +- ext/handle_svg/main.php | 6 +- ext/handle_video/main.php | 13 +- ext/handle_video/theme.php | 16 +- ext/image/main.php | 12 +- ext/media/main.php | 58 ++-- ext/media/media_engine.php | 68 ++--- ext/random_image/main.php | 2 +- ext/resize/main.php | 2 +- ext/rotate/main.php | 4 +- ext/rss_comments/main.php | 2 +- ext/rss_comments/test.php | 2 +- ext/rss_images/main.php | 2 +- ext/rss_images/test.php | 10 +- ext/shimmie_api/main.php | 2 +- ext/sitemap/main.php | 4 +- ext/static_files/main.php | 11 +- ext/tag_list/main.php | 2 +- ext/tagger_xml/main.php | 2 +- ext/transcode/main.php | 32 +-- ext/update/main.php | 2 +- ext/upload/main.php | 10 +- ext/upload/theme.php | 18 +- themes/rule34v2/themelet.class.php | 2 +- 41 files changed, 575 insertions(+), 270 deletions(-) create mode 100644 core/filetypes.php diff --git a/core/basethemelet.php b/core/basethemelet.php index cc493bb8..bcae8d9f 100644 --- a/core/basethemelet.php +++ b/core/basethemelet.php @@ -53,7 +53,7 @@ class BaseThemelet $h_tip = html_escape($image->get_tooltip()); $h_tags = html_escape(strtolower($image->get_tag_list())); - $extArr = array_flip(['swf', 'svg', 'mp3']); //List of thumbless filetypes + $extArr = array_flip([EXTENSION_FLASH, EXTENSION_SVG, EXTENSION_MP3]); //List of thumbless filetypes if (!isset($extArr[$image->ext])) { $tsize = get_thumbnail_size($image->width, $image->height); } else { diff --git a/core/extension.php b/core/extension.php index a0060fb0..37d6cad9 100644 --- a/core/extension.php +++ b/core/extension.php @@ -275,7 +275,7 @@ abstract class FormatterExtension extends Extension */ abstract class DataHandlerExtension extends Extension { - protected $SUPPORTED_EXT = []; + protected $SUPPORTED_MIME = []; protected function move_upload_to_archive(DataUploadEvent $event) { @@ -403,7 +403,7 @@ abstract class DataHandlerExtension extends Extension $image->hash = $metadata['hash']; $image->filename = (($pos = strpos($metadata['filename'], '?')) !== false) ? substr($metadata['filename'], 0, $pos) : $metadata['filename']; if ($config->get_bool("upload_use_mime")) { - $image->ext = get_extension(getMimeType($filename)); + $image->ext = get_extension_for_file($filename); } else { $image->ext = (($pos = strpos($metadata['extension'], '?')) !== false) ? substr($metadata['extension'], 0, $pos) : $metadata['extension']; } @@ -419,15 +419,20 @@ abstract class DataHandlerExtension extends Extension protected function supported_ext(string $ext): bool { - return in_array(strtolower($ext), $this->SUPPORTED_EXT); + return in_array(get_mime_for_extension($ext), $this->SUPPORTED_MIME); } public static function get_all_supported_exts(): array { $arr = []; foreach (getSubclassesOf("DataHandlerExtension") as $handler) { - $arr = array_merge($arr, (new $handler())->SUPPORTED_EXT); + $handler = (new $handler()); + + foreach($handler->SUPPORTED_MIME as $mime) { + $arr = array_merge($arr, get_all_extension_for_mime($mime)); + } } + $arr = array_unique($arr); return $arr; } } diff --git a/core/filetypes.php b/core/filetypes.php new file mode 100644 index 00000000..169ba58e --- /dev/null +++ b/core/filetypes.php @@ -0,0 +1,409 @@ + [ + MIME_TYPE_MAP_EXT => [EXTENSION_ANI], + MIME_TYPE_MAP_MIME => [MIME_TYPE_ANI], + ], + MIME_TYPE_AVI => [ + MIME_TYPE_MAP_EXT => [EXTENSION_AVI], + MIME_TYPE_MAP_MIME => [MIME_TYPE_AVI,'video/avi','video/msvideo'], + ], + MIME_TYPE_ASF => [ + MIME_TYPE_MAP_EXT => [EXTENSION_ASF,EXTENSION_WMA,EXTENSION_WMV], + MIME_TYPE_MAP_MIME => [MIME_TYPE_ASF,'audio/x-ms-wma','video/x-ms-wmv'], + ], + MIME_TYPE_BMP => [ + MIME_TYPE_MAP_EXT => [EXTENSION_BMP], + MIME_TYPE_MAP_MIME => [MIME_TYPE_BMP], + ], + MIME_TYPE_BZIP => [ + MIME_TYPE_MAP_EXT => [EXTENSION_BZIP], + MIME_TYPE_MAP_MIME => [MIME_TYPE_BZIP], + ], + MIME_TYPE_BZIP2 => [ + MIME_TYPE_MAP_EXT => [EXTENSION_BZIP2], + MIME_TYPE_MAP_MIME => [MIME_TYPE_BZIP2], + ], + MIME_TYPE_COMIC_ZIP => [ + MIME_TYPE_MAP_EXT => [EXTENSION_CBZ], + MIME_TYPE_MAP_MIME => [MIME_TYPE_COMIC_ZIP], + ], + MIME_TYPE_CSS => [ + MIME_TYPE_MAP_EXT => [EXTENSION_CSS], + MIME_TYPE_MAP_MIME => [MIME_TYPE_CSS], + ], + MIME_TYPE_CSV => [ + MIME_TYPE_MAP_EXT => [EXTENSION_CSV], + MIME_TYPE_MAP_MIME => [MIME_TYPE_CSV], + ], + MIME_TYPE_FLASH => [ + MIME_TYPE_MAP_EXT => [EXTENSION_FLASH], + MIME_TYPE_MAP_MIME => [MIME_TYPE_FLASH], + ], + MIME_TYPE_FLASH_VIDEO => [ + MIME_TYPE_MAP_EXT => [EXTENSION_FLASH_VIDEO], + MIME_TYPE_MAP_MIME => [MIME_TYPE_FLASH_VIDEO,'video/flv'], + ], + MIME_TYPE_GIF => [ + MIME_TYPE_MAP_EXT => [EXTENSION_GIF], + MIME_TYPE_MAP_MIME => [MIME_TYPE_GIF], + ], + MIME_TYPE_GZIP => [ + MIME_TYPE_MAP_EXT => [EXTENSION_GZIP], + MIME_TYPE_MAP_MIME => [MIME_TYPE_TAR], + ], + MIME_TYPE_HTML => [ + MIME_TYPE_MAP_EXT => [EXTENSION_HTM, EXTENSION_HTML], + MIME_TYPE_MAP_MIME => [MIME_TYPE_HTML], + ], + MIME_TYPE_ICO => [ + MIME_TYPE_MAP_EXT => [EXTENSION_ICO, EXTENSION_CUR], + MIME_TYPE_MAP_MIME => [MIME_TYPE_ICO, MIME_TYPE_WIN_BITMAP], + ], + MIME_TYPE_JPEG => [ + MIME_TYPE_MAP_EXT => [EXTENSION_JPG, EXTENSION_JPEG, EXTENSION_JFIF, EXTENSION_JFI], + MIME_TYPE_MAP_MIME => [MIME_TYPE_JPEG], + ], + MIME_TYPE_JS => [ + MIME_TYPE_MAP_EXT => [EXTENSION_JS], + MIME_TYPE_MAP_MIME => [MIME_TYPE_JS], + ], + MIME_TYPE_JSON => [ + MIME_TYPE_MAP_EXT => [EXTENSION_JSON], + MIME_TYPE_MAP_MIME => [MIME_TYPE_JSON], + ], + MIME_TYPE_MKV => [ + MIME_TYPE_MAP_EXT => [EXTENSION_MKV], + MIME_TYPE_MAP_MIME => [MIME_TYPE_MKV], + ], + MIME_TYPE_MP3 => [ + MIME_TYPE_MAP_EXT => [EXTENSION_MP3], + MIME_TYPE_MAP_MIME => [MIME_TYPE_MP3], + ], + MIME_TYPE_MP4_AUDIO => [ + MIME_TYPE_MAP_EXT => [EXTENSION_M4A], + MIME_TYPE_MAP_MIME => [MIME_TYPE_MP4_AUDIO,"audio/m4a"], + ], + MIME_TYPE_MP4_VIDEO => [ + MIME_TYPE_MAP_EXT => [EXTENSION_MP4,EXTENSION_M4V], + MIME_TYPE_MAP_MIME => [MIME_TYPE_MP4_VIDEO,'video/x-m4v'], + ], + MIME_TYPE_MPEG => [ + MIME_TYPE_MAP_EXT => [EXTENSION_MPG,EXTENSION_MPEG], + MIME_TYPE_MAP_MIME => [MIME_TYPE_MPEG], + ], + MIME_TYPE_PDF => [ + MIME_TYPE_MAP_EXT => [EXTENSION_PDF], + MIME_TYPE_MAP_MIME => [MIME_TYPE_PDF], + ], + MIME_TYPE_PHP => [ + MIME_TYPE_MAP_EXT => [EXTENSION_PHP,EXTENSION_PHP5], + MIME_TYPE_MAP_MIME => [MIME_TYPE_PHP], + ], + MIME_TYPE_PNG => [ + MIME_TYPE_MAP_EXT => [EXTENSION_PNG], + MIME_TYPE_MAP_MIME => [MIME_TYPE_PNG], + ], + MIME_TYPE_PSD => [ + MIME_TYPE_MAP_EXT => [EXTENSION_PSD], + MIME_TYPE_MAP_MIME => [MIME_TYPE_PSD], + ], + MIME_TYPE_OGG_AUDIO => [ + MIME_TYPE_MAP_EXT => [EXTENSION_OGG_AUDIO,EXTENSION_OGG], + MIME_TYPE_MAP_MIME => [MIME_TYPE_OGG_AUDIO,MIME_TYPE_OGG], + ], + MIME_TYPE_OGG_VIDEO => [ + MIME_TYPE_MAP_EXT => [EXTENSION_OGG_VIDEO], + MIME_TYPE_MAP_MIME => [MIME_TYPE_OGG_VIDEO], + ], + MIME_TYPE_QUICKTIME => [ + MIME_TYPE_MAP_EXT => [EXTENSION_MOV], + MIME_TYPE_MAP_MIME => [MIME_TYPE_QUICKTIME], + ], + MIME_TYPE_RSS => [ + MIME_TYPE_MAP_EXT => [EXTENSION_RSS], + MIME_TYPE_MAP_MIME => [MIME_TYPE_RSS], + ], + MIME_TYPE_SVG => [ + MIME_TYPE_MAP_EXT => [EXTENSION_SVG], + MIME_TYPE_MAP_MIME => [MIME_TYPE_SVG], + ], + MIME_TYPE_TAR => [ + MIME_TYPE_MAP_EXT => [EXTENSION_TAR], + MIME_TYPE_MAP_MIME => [MIME_TYPE_TAR], + ], + MIME_TYPE_TEXT => [ + MIME_TYPE_MAP_EXT => [EXTENSION_TEXT, EXTENSION_ASC], + MIME_TYPE_MAP_MIME => [MIME_TYPE_TEXT], + ], + MIME_TYPE_TIFF => [ + MIME_TYPE_MAP_EXT => [EXTENSION_TIF,EXTENSION_TIFF], + MIME_TYPE_MAP_MIME => [MIME_TYPE_TIFF], + ], + MIME_TYPE_WAV => [ + MIME_TYPE_MAP_EXT => [EXTENSION_WAV], + MIME_TYPE_MAP_MIME => [MIME_TYPE_WAV], + ], + MIME_TYPE_WEBM => [ + MIME_TYPE_MAP_EXT => [EXTENSION_WEBM], + MIME_TYPE_MAP_MIME => [MIME_TYPE_WEBM], + ], + MIME_TYPE_WEBP => [ + MIME_TYPE_MAP_EXT => [EXTENSION_WEBP], + MIME_TYPE_MAP_MIME => [MIME_TYPE_WEBP], + ], + MIME_TYPE_XML => [ + MIME_TYPE_MAP_EXT => [EXTENSION_XML], + MIME_TYPE_MAP_MIME => [MIME_TYPE_XML,MIME_TYPE_XML_APPLICATION], + ], + MIME_TYPE_XSL => [ + MIME_TYPE_MAP_EXT => [EXTENSION_XSL], + MIME_TYPE_MAP_MIME => [MIME_TYPE_XSL], + ], + MIME_TYPE_ZIP => [ + MIME_TYPE_MAP_EXT => [EXTENSION_ZIP], + MIME_TYPE_MAP_MIME => [MIME_TYPE_ZIP], + ], +]; + +/** + * Returns the mimetype that matches the provided extension. + */ +function get_mime_for_extension(string $ext): ?string +{ + $ext = strtolower($ext); + + foreach (MIME_TYPE_MAP as $key=>$value) { + if(in_array($ext,$value[MIME_TYPE_MAP_EXT])) { + return $key; + } + } + return null; +} + +/** + * Returns the mimetype for the specified file, trying file inspection methods before falling back on extension-based detection. + * @param String $file + * @param String $ext The files extension, for if the current filename somehow lacks the extension + * @return String The extension that was found. + */ +function get_mime(string $file, string $ext=""): string +{ + if(!file_exists($file)) { + throw new SCoreException("File not found: ".$file); + } + + $type = false; + + if (extension_loaded('fileinfo')) { + $finfo = finfo_open(FILEINFO_MIME_TYPE); + try { + $type = finfo_file($finfo, $file); + } finally { + finfo_close($finfo); + } + } elseif (function_exists('mime_content_type')) { + // If anyone is still using mime_content_type() + $type = trim(mime_content_type($file)); + } + + if($type===false || empty($type)) { + // Checking by extension is our last resort + if($ext==null||strlen($ext) == 0) + $ext = pathinfo($file, PATHINFO_EXTENSION); + + $type = get_mime_for_extension($ext); + } + + if ($type !== false && strlen($type) > 0) { + return $type; + } + + return MIME_TYPE_OCTET_STREAM; +} + +/** + * Returns the file extension associated with the specified mimetype. + */ +function get_extension(?string $mime_type): ?string +{ + if (empty($mime_type)) { + return null; + } + + if($mime_type==MIME_TYPE_OCTET_STREAM) { + return null; + } + + foreach (MIME_TYPE_MAP as $key=>$value) { + if(in_array($mime_type,$value[MIME_TYPE_MAP_MIME])) { + return $value[MIME_TYPE_MAP_EXT][0]; + } + } + return null; +} + +/** + * Returns all of the file extensions associated with the specified mimetype. + */ +function get_all_extension_for_mime(?string $mime_type): array +{ + $output = []; + if (empty($mime_type)) { + return $output; + } + + foreach (MIME_TYPE_MAP as $key=>$value) { + if(in_array($mime_type,$value[MIME_TYPE_MAP_MIME])) { + $output = array_merge($output, $value[MIME_TYPE_MAP_EXT]); + } + } + return $output; +} + +/** + * Gets an the extension defined in MIME_TYPE_MAP for a file. + * + * @param String $file_path + * @return String The extension that was found, or null if one can not be found. + */ +function get_extension_for_file(String $file_path): ?String +{ + $mime = get_mime($file_path); + if (!empty($mime)) { + if($mime==MIME_TYPE_OCTET_STREAM) { + return null; + } else { + $ext = get_extension($mime); + } + if (!empty($ext)) { + return $ext; + } + } + return null; +} diff --git a/core/imageboard/image.php b/core/imageboard/image.php index 513ddbc1..6b786472 100644 --- a/core/imageboard/image.php +++ b/core/imageboard/image.php @@ -570,7 +570,7 @@ class Image */ public function get_mime_type(): string { - return getMimeType($this->get_image_filename(), $this->get_ext()); + return get_mime($this->get_image_filename(), $this->get_ext()); } /** diff --git a/core/imageboard/misc.php b/core/imageboard/misc.php index 393e0f94..2fe18795 100644 --- a/core/imageboard/misc.php +++ b/core/imageboard/misc.php @@ -142,7 +142,7 @@ function create_scaled_image(string $inname, string $outname, array $tsize, stri } $output_format = $config->get_string(ImageConfig::THUMB_TYPE); - if ($output_format=="webp") { + if ($output_format==EXTENSION_WEBP) { $output_format = Media::WEBP_LOSSY; } diff --git a/core/imageboard/tag.php b/core/imageboard/tag.php index 6b10de46..129bdc39 100644 --- a/core/imageboard/tag.php +++ b/core/imageboard/tag.php @@ -116,8 +116,6 @@ class Tag for ($i = 0; $i < count($tags1); $i++) { if ($tags1[$i]!==$tags2[$i]) { - var_dump($tags1); - var_dump($tags2); return false; } } diff --git a/core/polyfills.php b/core/polyfills.php index 0b733987..38c82baf 100644 --- a/core/polyfills.php +++ b/core/polyfills.php @@ -3,6 +3,9 @@ * Things which should be in the core API * \* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +require_once "filetypes.php"; + + /** * Return the unique elements of an array, case insensitively */ @@ -253,99 +256,6 @@ if (!function_exists('mb_strlen')) { } } -const MIME_TYPE_MAP = [ - 'jpg' => 'image/jpeg', - 'gif' => 'image/gif', - 'png' => 'image/png', - 'tif' => 'image/tiff', - 'tiff' => 'image/tiff', - 'ico' => 'image/x-icon', - 'swf' => 'application/x-shockwave-flash', - 'flv' => 'video/x-flv', - 'svg' => 'image/svg+xml', - 'pdf' => 'application/pdf', - 'zip' => 'application/zip', - 'gz' => 'application/x-gzip', - 'tar' => 'application/x-tar', - 'bz' => 'application/x-bzip', - 'bz2' => 'application/x-bzip2', - 'txt' => 'text/plain', - 'asc' => 'text/plain', - 'htm' => 'text/html', - 'html' => 'text/html', - 'css' => 'text/css', - 'js' => 'text/javascript', - 'xml' => 'text/xml', - 'xsl' => 'application/xsl+xml', - 'ogg' => 'application/ogg', - 'mp3' => 'audio/mpeg', - 'wav' => 'audio/x-wav', - 'avi' => 'video/x-msvideo', - 'mpg' => 'video/mpeg', - 'mpeg' => 'video/mpeg', - 'mov' => 'video/quicktime', - 'php' => 'text/x-php', - 'mp4' => 'video/mp4', - 'ogv' => 'video/ogg', - 'webm' => 'video/webm', - 'webp' => 'image/webp', - 'bmp' =>'image/x-ms-bmp', - 'psd' => 'image/vnd.adobe.photoshop', - 'mkv' => 'video/x-matroska' -]; - -/** - * Get MIME type for file - * - * The contents of this function are taken from the __getMimeType() function - * from the "Amazon S3 PHP class" which is Copyright (c) 2008, Donovan Schönknecht - * and released under the 'Simplified BSD License'. - */ -function getMimeType(string $file, string $ext=""): string -{ - // Static extension lookup - $ext = strtolower($ext); - - if (array_key_exists($ext, MIME_TYPE_MAP)) { - return MIME_TYPE_MAP[$ext]; - } - - $type = false; - // Fileinfo documentation says fileinfo_open() will use the - // MAGIC env var for the magic file - if (extension_loaded('fileinfo') && isset($_ENV['MAGIC']) && - ($finfo = finfo_open(FILEINFO_MIME, $_ENV['MAGIC'])) !== false) { - if (($type = finfo_file($finfo, $file)) !== false) { - // Remove the charset and grab the last content-type - $type = explode(' ', str_replace('; charset=', ';charset=', $type)); - $type = array_pop($type); - $type = explode(';', $type); - $type = trim(array_shift($type)); - } - finfo_close($finfo); - - // If anyone is still using mime_content_type() - } elseif (function_exists('mime_content_type')) { - $type = trim(mime_content_type($file)); - } - - if ($type !== false && strlen($type) > 0) { - return $type; - } - - return 'application/octet-stream'; -} - -function get_extension(?string $mime_type): ?string -{ - if (empty($mime_type)) { - return null; - } - - $ext = array_search($mime_type, MIME_TYPE_MAP); - return ($ext ? $ext : null); -} - /** @noinspection PhpUnhandledExceptionInspection */ function getSubclassesOf(string $parent) { @@ -860,3 +770,4 @@ function stringer($s) } return (string)$s; } + diff --git a/ext/alias_editor/main.php b/ext/alias_editor/main.php index e8a3a678..f3d4f979 100644 --- a/ext/alias_editor/main.php +++ b/ext/alias_editor/main.php @@ -96,7 +96,7 @@ class AliasEditor extends Extension $this->theme->display_aliases($t->table($t->query()), $t->paginator()); } elseif ($event->get_arg(0) == "export") { $page->set_mode(PageMode::DATA); - $page->set_type("text/csv"); + $page->set_type(MIME_TYPE_CSV); $page->set_filename("aliases.csv"); $page->set_data($this->get_alias_csv($database)); } elseif ($event->get_arg(0) == "import") { diff --git a/ext/auto_tagger/main.php b/ext/auto_tagger/main.php index da32789a..8f8d16b9 100644 --- a/ext/auto_tagger/main.php +++ b/ext/auto_tagger/main.php @@ -98,7 +98,7 @@ class AutoTagger extends Extension $this->theme->display_auto_tagtable($t->table($t->query()), $t->paginator()); } elseif ($event->get_arg(0) == "export") { $page->set_mode(PageMode::DATA); - $page->set_type("text/csv"); + $page->set_type(MIME_TYPE_CSV); $page->set_filename("auto_tag.csv"); $page->set_data($this->get_auto_tag_csv($database)); } elseif ($event->get_arg(0) == "import") { diff --git a/ext/autocomplete/main.php b/ext/autocomplete/main.php index 843c8536..4d459651 100644 --- a/ext/autocomplete/main.php +++ b/ext/autocomplete/main.php @@ -20,7 +20,7 @@ class AutoComplete extends Extension } $page->set_mode(PageMode::DATA); - $page->set_type("application/json"); + $page->set_type(MIME_TYPE_JSON); $s = strtolower($_GET["s"]); if ( diff --git a/ext/browser_search/main.php b/ext/browser_search/main.php index d29326e0..c3965896 100644 --- a/ext/browser_search/main.php +++ b/ext/browser_search/main.php @@ -42,7 +42,7 @@ class BrowserSearch extends Extension // And now to send it to the browser $page->set_mode(PageMode::DATA); - $page->set_type("text/xml"); + $page->set_type(MIME_TYPE_XML); $page->set_data($xml); } elseif ($event->page_matches("browser_search")) { $suggestions = $config->get_string("search_suggestions_results_order"); diff --git a/ext/danbooru_api/main.php b/ext/danbooru_api/main.php index 4eadd66c..0892e3fd 100644 --- a/ext/danbooru_api/main.php +++ b/ext/danbooru_api/main.php @@ -10,13 +10,13 @@ class DanbooruApi extends Extension if ($event->page_matches("api/danbooru/add_post") || $event->page_matches("api/danbooru/post/create.xml")) { // No XML data is returned from this function - $page->set_type("text/plain"); + $page->set_type(MIME_TYPE_TEXT); $this->api_add_post(); } elseif ($event->page_matches("api/danbooru/find_posts") || $event->page_matches("api/danbooru/post/index.xml")) { - $page->set_type("application/xml"); + $page->set_type(MIME_TYPE_XML_APPLICATION); $page->set_data($this->api_find_posts()); } elseif ($event->page_matches("api/danbooru/find_tags")) { - $page->set_type("application/xml"); + $page->set_type(MIME_TYPE_XML_APPLICATION); $page->set_data($this->api_find_tags()); } diff --git a/ext/handle_archive/main.php b/ext/handle_archive/main.php index 04937c90..d493d354 100644 --- a/ext/handle_archive/main.php +++ b/ext/handle_archive/main.php @@ -2,7 +2,7 @@ class ArchiveFileHandler extends DataHandlerExtension { - protected $SUPPORTED_EXT = ["zip"]; + protected $SUPPORTED_MIME = [MIME_TYPE_ZIP]; public function onInitExt(InitExtEvent $event) { diff --git a/ext/handle_cbz/main.php b/ext/handle_cbz/main.php index b9011c52..c6ce429e 100644 --- a/ext/handle_cbz/main.php +++ b/ext/handle_cbz/main.php @@ -2,7 +2,7 @@ class CBZFileHandler extends DataHandlerExtension { - public $SUPPORTED_EXT = ["cbz"]; + public $SUPPORTED_MIME = [MIME_TYPE_COMIC_ZIP]; protected function media_check_properties(MediaCheckPropertiesEvent $event): void { @@ -27,7 +27,7 @@ class CBZFileHandler extends DataHandlerExtension $cover, warehouse_path(Image::THUMBNAIL_DIR, $hash), get_thumbnail_max_size_scaled(), - get_extension(getMimeType($cover)), + get_extension(get_mime($cover)), null ); return true; diff --git a/ext/handle_flash/main.php b/ext/handle_flash/main.php index 2f8fd1aa..2bad8e3e 100644 --- a/ext/handle_flash/main.php +++ b/ext/handle_flash/main.php @@ -2,7 +2,7 @@ class FlashFileHandler extends DataHandlerExtension { - protected $SUPPORTED_EXT = ["swf"]; + protected $SUPPORTED_MIME = [MIME_TYPE_FLASH]; protected function media_check_properties(MediaCheckPropertiesEvent $event): void { diff --git a/ext/handle_ico/main.php b/ext/handle_ico/main.php index f80555d3..50e570fd 100644 --- a/ext/handle_ico/main.php +++ b/ext/handle_ico/main.php @@ -2,7 +2,7 @@ class IcoFileHandler extends DataHandlerExtension { - protected $SUPPORTED_EXT = ["ico", "ani", "cur"]; + protected $SUPPORTED_MIME = [MIME_TYPE_ICO, MIME_TYPE_ANI]; protected function media_check_properties(MediaCheckPropertiesEvent $event): void { diff --git a/ext/handle_mp3/main.php b/ext/handle_mp3/main.php index 1d943b62..17123bff 100644 --- a/ext/handle_mp3/main.php +++ b/ext/handle_mp3/main.php @@ -2,7 +2,7 @@ class MP3FileHandler extends DataHandlerExtension { - protected $SUPPORTED_EXT = ["mp3"]; + protected $SUPPORTED_MIME = [MIME_TYPE_MP3]; protected function media_check_properties(MediaCheckPropertiesEvent $event): void { @@ -23,6 +23,6 @@ class MP3FileHandler extends DataHandlerExtension protected function check_contents(string $tmpname): bool { - return getMimeType($tmpname) == 'audio/mpeg'; + return get_mime($tmpname) === MIME_TYPE_MP3; } } diff --git a/ext/handle_pixel/main.php b/ext/handle_pixel/main.php index c44f7bd0..0ba5c73e 100644 --- a/ext/handle_pixel/main.php +++ b/ext/handle_pixel/main.php @@ -2,13 +2,13 @@ class PixelFileHandler extends DataHandlerExtension { - protected $SUPPORTED_EXT = ["jpg", "jpeg", "gif", "png", "webp"]; + protected $SUPPORTED_MIME = [MIME_TYPE_JPEG, MIME_TYPE_GIF, MIME_TYPE_PNG, MIME_TYPE_WEBP]; protected function media_check_properties(MediaCheckPropertiesEvent $event): void { if (in_array($event->ext, Media::LOSSLESS_FORMATS)) { $event->image->lossless = true; - } elseif ($event->ext=="webp") { + } elseif ($event->ext==EXTENSION_WEBP) { $event->image->lossless = Media::is_lossless_webp($event->file_name); } @@ -17,10 +17,10 @@ class PixelFileHandler extends DataHandlerExtension } $event->image->audio = false; switch ($event->ext) { - case "gif": + case EXTENSION_GIF: $event->image->video = Media::is_animated_gif($event->file_name); break; - case "webp": + case EXTENSION_WEBP: $event->image->video = Media::is_animated_webp($event->file_name); break; default: diff --git a/ext/handle_svg/main.php b/ext/handle_svg/main.php index 84eb19a6..7b366a4a 100644 --- a/ext/handle_svg/main.php +++ b/ext/handle_svg/main.php @@ -3,7 +3,7 @@ use enshrined\svgSanitize\Sanitizer; class SVGFileHandler extends DataHandlerExtension { - protected $SUPPORTED_EXT = ["svg"]; + protected $SUPPORTED_MIME = [MIME_TYPE_SVG]; /** @var SVGFileHandlerTheme */ protected $theme; @@ -16,7 +16,7 @@ class SVGFileHandler extends DataHandlerExtension $image = Image::by_id($id); $hash = $image->hash; - $page->set_type("image/svg+xml"); + $page->set_type(MIME_TYPE_SVG); $page->set_mode(PageMode::DATA); $sanitizer = new Sanitizer(); @@ -67,7 +67,7 @@ class SVGFileHandler extends DataHandlerExtension protected function check_contents(string $file): bool { - if (getMimeType($file)!="image/svg+xml") { + if (get_mime($file)!==MIME_TYPE_SVG) { return false; } diff --git a/ext/handle_video/main.php b/ext/handle_video/main.php index 5b5b3beb..cd3d5453 100644 --- a/ext/handle_video/main.php +++ b/ext/handle_video/main.php @@ -3,13 +3,12 @@ class VideoFileHandler extends DataHandlerExtension { protected $SUPPORTED_MIME = [ - 'video/webm', - 'video/mp4', - 'video/ogg', - 'video/flv', - 'video/x-flv' + MIME_TYPE_WEBM, + MIME_TYPE_MP4_VIDEO, + MIME_TYPE_OGG_VIDEO, + MIME_TYPE_FLASH_VIDEO, ]; - protected $SUPPORTED_EXT = ["flv", "mp4", "m4v", "ogv", "webm"]; + protected $SUPPORTED_EXT = [EXTENSION_FLASH_VIDEO, EXTENSION_MP4, EXTENSION_M4V, EXTENSION_OGG_VIDEO, EXTENSION_WEBM]; public function onInitExt(InitExtEvent $event) { @@ -87,6 +86,6 @@ class VideoFileHandler extends DataHandlerExtension protected function check_contents(string $tmpname): bool { - return in_array(getMimeType($tmpname), $this->SUPPORTED_MIME); + return in_array(get_mime($tmpname), $this->SUPPORTED_MIME); } } diff --git a/ext/handle_video/theme.php b/ext/handle_video/theme.php index 24619e0c..f0e7b71e 100644 --- a/ext/handle_video/theme.php +++ b/ext/handle_video/theme.php @@ -2,6 +2,9 @@ class VideoFileHandlerTheme extends Themelet { + + const SUPPORTED_TYPES = [MIME_TYPE_MP4_VIDEO, MIME_TYPE_OGG_VIDEO, MIME_TYPE_WEBM, MIME_TYPE_FLASH_VIDEO]; + public function display_image(Page $page, Image $image) { global $config; @@ -16,10 +19,11 @@ class VideoFileHandlerTheme extends Themelet $html = "Video not playing? Click here to download the file.
"; //Browser media format support: https://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats - $supportedExts = ['mp4' => 'video/mp4', 'm4v' => 'video/mp4', 'ogv' => 'video/ogg', 'webm' => 'video/webm', 'flv' => 'video/flv']; - if (array_key_exists($ext, $supportedExts)) { + $mime = get_mime_for_extension($ext); + + if (in_array($mime, self::SUPPORTED_TYPES)) { //FLV isn't supported by