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