*/
protected $mIEAnalyzer;
+ /** @var string Extra MIME types, set for example by media handling extensions
+ */
+ private $mExtraTypes = '';
+
+ /** @var string Extra MIME info, set for example by media handling extensions
+ */
+ private $mExtraInfo = '';
+
/** @var MimeMagic The singleton instance
*/
private static $instance = null;
global $wgMimeTypeFile, $IP;
+ # Allow media handling extensions adding MIME-types and MIME-info
+ wfRunHooks( 'MimeMagicInit', array( $this ) );
+
$types = MM_WELL_KNOWN_MIME_TYPES;
if ( $wgMimeTypeFile == 'includes/mime.types' ) {
wfDebug( __METHOD__ . ": no mime types file defined, using build-ins only.\n" );
}
+ $types .= "\n" . $this->mExtraTypes;
+
$types = str_replace( array( "\r\n", "\n\r", "\n\n", "\r\r", "\r" ), "\n", $types );
$types = str_replace( "\t", " ", $types );
$this->mMimeToExt = array();
- $this->mToMime = array();
+ $this->mExtToMime = array();
$lines = explode( "\n", $types );
foreach ( $lines as $s ) {
wfDebug( __METHOD__ . ": no mime info file defined, using build-ins only.\n" );
}
+ $info .= "\n" . $this->mExtraInfo;
+
$info = str_replace( array( "\r\n", "\n\r", "\n\n", "\r\r", "\r" ), "\n", $info );
$info = str_replace( "\t", " ", $info );
return self::$instance;
}
+ /**
+ * Adds to the list mapping MIME to file extensions.
+ * As an extension author, you are encouraged to submit patches to
+ * MediaWiki's core to add new MIME types to mime.types.
+ * @param string $types
+ */
+ public function addExtraTypes( $types ) {
+ $this->mExtraTypes .= "\n" . $types;
+ }
+
+ /**
+ * Adds to the list mapping MIME to media type.
+ * As an extension author, you are encouraged to submit patches to
+ * MediaWiki's core to add new MIME info to mime.info.
+ * @param string $info
+ */
+ public function addExtraInfo( $info ) {
+ $this->mExtraInfo .= "\n" . $info;
+ }
+
/**
* Returns a list of file extensions for a given mime type as a space
* separated string or null if the mime type was unrecognized. Resolves
* by looking at the file extension. Typically, this method would be called on the
* result of guessMimeType().
*
- * Currently, this method does the following:
- *
- * If $mime is "unknown/unknown" and isRecognizableExtension( $ext ) returns false,
- * return the result of guessTypesForExtension($ext).
- *
- * If $mime is "application/x-opc+zip" and isMatchingExtension( $ext, $mime )
- * gives true, return the result of guessTypesForExtension($ext).
- *
* @param string $mime The mime type, typically guessed from a file's content.
* @param string $ext The file extension, as taken from the file name
*
".$ext is not a known OPC extension.\n" );
$mime = 'application/zip';
}
+ } elseif ( $mime === 'text/plain' && $this->findMediaType( ".$ext" ) === MEDIATYPE_TEXT ) {
+ // Textual types are sometimes not recognized properly.
+ // If detected as text/plain, and has an extension which is textual
+ // improve to the extension's type. For example, csv and json are often
+ // misdetected as text/plain.
+ $mime = $this->guessTypesForExtension( $ext );
}
+ # Media handling extensions can improve the MIME detected
+ wfRunHooks( 'MimeMagicImproveFromExtension', array( $this, $ext, &$mime ) );
+
if ( isset( $this->mMimeTypeAliases[$mime] ) ) {
$mime = $this->mMimeTypeAliases[$mime];
}
return 'image/vnd.djvu';
}
- return false;
+ # Media handling extensions can guess the MIME by content
+ # It's intentionally here so that if core is wrong about a type (false positive),
+ # people will hopefully nag and submit patches :)
+ $mime = false;
+ # Some strings by reference for performance - assuming well-behaved hooks
+ wfRunHooks(
+ 'MimeMagicGuessFromContent',
+ array( $this, &$head, &$tail, $file, &$mime )
+ );
+
+ return $mime;
}
/**
$head = fread( $f, 256 );
fclose( $f );
- $head = strtolower( $head );
+ $head = str_replace( 'ffmpeg2theora', '', strtolower( $head ) );
// This is an UGLY HACK, file should be parsed correctly
if ( strpos( $head, 'theora' ) !== false ) {