X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/7a04e2d4161d2f23f92bc87e23349354c06e820b..6e448a5b1ea12f44753bab5776e99037d33f8638:/IkiWiki/Plugin/filecheck.pm

diff --git a/IkiWiki/Plugin/filecheck.pm b/IkiWiki/Plugin/filecheck.pm
index d00b6dfd3..6e6528398 100644
--- a/IkiWiki/Plugin/filecheck.pm
+++ b/IkiWiki/Plugin/filecheck.pm
@@ -48,7 +48,6 @@ sub getsetup () {
 		plugin => {
 			safe => 1,
 			rebuild => undef,
-			section => "misc",
 		},
 }
 
@@ -132,22 +131,38 @@ sub match_mimetype ($$;@) {
 		return IkiWiki::ErrorReason->new("file does not exist");
 	}
 
-	# Use ::magic to get the mime type, the idea is to only trust
-	# data obtained by examining the actual file contents.
+	# Get the mime type.
+	#
+	# First, try File::Mimeinfo. This is fast, but doesn't recognise
+	# all files.
 	eval q{use File::MimeInfo::Magic};
-	if ($@) {
-		return IkiWiki::ErrorReason->new("failed to load File::MimeInfo::Magic ($@); cannot check MIME type");
+	my $mimeinfo_ok=! $@;
+	my $mimetype;
+	if ($mimeinfo_ok) {
+		$mimetype=File::MimeInfo::Magic::magic($file);
+	}
+
+	# Fall back to using file, which has a more complete
+	# magic database.
+	if (! defined $mimetype) {
+		open(my $file_h, "-|", "file", "-bi", $file);
+		$mimetype=<$file_h>;
+		chomp $mimetype;
+		close $file_h;
 	}
-	my $mimetype=File::MimeInfo::Magic::magic($file);
 	if (! defined $mimetype) {
-		$mimetype=File::MimeInfo::Magic::default($file);
+		# Fall back to default value.
+		$mimetype=File::MimeInfo::Magic::default($file)
+			if $mimeinfo_ok;
 		if (! defined $mimetype) {
 			$mimetype="unknown";
 		}
 	}
+	# Ignore any parameters, we only want the type itself
+	$mimetype =~ s/;.*//;
 
 	my $regexp=IkiWiki::glob2re($wanted);
-	if ($mimetype!~/^$regexp$/i) {
+	if ($mimetype!~$regexp) {
 		return IkiWiki::FailReason->new("file MIME type is $mimetype, not $wanted");
 	}
 	else {