]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - IkiWiki/Plugin/filecheck.pm
(no commit message)
[git.ikiwiki.info.git] / IkiWiki / Plugin / filecheck.pm
index d00b6dfd3e0445fe243502929cfa92589e15a77c..6e65283983b472fe26c86351fb6572ec5ae51865 100644 (file)
@@ -48,7 +48,6 @@ sub getsetup () {
                plugin => {
                        safe => 1,
                        rebuild => undef,
                plugin => {
                        safe => 1,
                        rebuild => undef,
-                       section => "misc",
                },
 }
 
                },
 }
 
@@ -132,22 +131,38 @@ sub match_mimetype ($$;@) {
                return IkiWiki::ErrorReason->new("file does not exist");
        }
 
                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};
        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) {
        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";
                }
        }
                if (! defined $mimetype) {
                        $mimetype="unknown";
                }
        }
+       # Ignore any parameters, we only want the type itself
+       $mimetype =~ s/;.*//;
 
        my $regexp=IkiWiki::glob2re($wanted);
 
        my $regexp=IkiWiki::glob2re($wanted);
-       if ($mimetype!~/^$regexp$/i) {
+       if ($mimetype!~$regexp) {
                return IkiWiki::FailReason->new("file MIME type is $mimetype, not $wanted");
        }
        else {
                return IkiWiki::FailReason->new("file MIME type is $mimetype, not $wanted");
        }
        else {