<?php 
 
/* 
 * This file is part of the Symfony package. 
 * 
 * (c) Fabien Potencier <[email protected]> 
 * 
 * For the full copyright and license information, please view the LICENSE 
 * file that was distributed with this source code. 
 */ 
 
// load new map 
$data = file_get_contents('https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types'); 
$new = []; 
foreach (explode("\n", $data) as $line) { 
    if (!$line || '#' == $line[0]) { 
        continue; 
    } 
    $mimeType = substr($line, 0, strpos($line, "\t")); 
    $extensions = explode(' ', substr($line, strrpos($line, "\t") + 1)); 
    $new[$mimeType] = $extensions; 
} 
 
$xml = simplexml_load_string(file_get_contents('https://raw.github.com/minad/mimemagic/master/script/freedesktop.org.xml')); 
foreach ($xml as $node) { 
    $exts = []; 
    foreach ($node->glob as $glob) { 
        $pattern = (string) $glob['pattern']; 
        if ('*' != $pattern[0] || '.' != $pattern[1]) { 
            continue; 
        } 
 
        $exts[] = substr($pattern, 2); 
    } 
 
    if (!$exts) { 
        continue; 
    } 
 
    $mt = strtolower((string) $node['type']); 
    $new[$mt] = array_merge($new[$mt] ?? [], $exts); 
    foreach ($node->alias as $alias) { 
        $mt = strtolower((string) $alias['type']); 
        $new[$mt] = array_merge($new[$mt] ?? [], $exts); 
    } 
} 
 
// load current map 
$data = file_get_contents($output = __DIR__.'/../../MimeTypes.php'); 
$current = []; 
$pre = ''; 
$post = ''; 
foreach (explode("\n", $data) as $line) { 
    if (!preg_match("{^        '([^']+/[^']+)' => \['(.+)'\],$}", $line, $matches)) { 
        if (!$current) { 
            $pre .= $line."\n"; 
        } else { 
            $post .= $line."\n"; 
        } 
        continue; 
    } 
    $current[$matches[1]] = explode("', '", $matches[2]); 
} 
 
// we merge the 2 maps (we never remove old mime types) 
$map = array_replace_recursive($current, $new); 
ksort($map); 
 
$data = $pre; 
foreach ($map as $mimeType => $exts) { 
    $data .= sprintf("        '%s' => ['%s'],\n", $mimeType, implode("', '", array_unique($exts))); 
} 
$data .= $post; 
 
// reverse map 
// we prefill the extensions with some preferences for content-types 
$exts = [ 
    'aif' => ['audio/x-aiff'], 
    'aiff' => ['audio/x-aiff'], 
    'aps' => ['application/postscript'], 
    'avi' => ['video/avi'], 
    'bmp' => ['image/bmp'], 
    'bz2' => ['application/x-bz2'], 
    'css' => ['text/css'], 
    'csv' => ['text/csv'], 
    'dmg' => ['application/x-apple-diskimage'], 
    'doc' => ['application/msword'], 
    'docx' => ['application/vnd.openxmlformats-officedocument.wordprocessingml.document'], 
    'eml' => ['message/rfc822'], 
    'exe' => ['application/x-ms-dos-executable'], 
    'flv' => ['video/x-flv'], 
    'gif' => ['image/gif'], 
    'gz' => ['application/x-gzip'], 
    'hqx' => ['application/stuffit'], 
    'htm' => ['text/html'], 
    'html' => ['text/html'], 
    'jar' => ['application/x-java-archive'], 
    'jpeg' => ['image/jpeg'], 
    'jpg' => ['image/jpeg'], 
    'js' => ['text/javascript'], 
    'm3u' => ['audio/x-mpegurl'], 
    'm4a' => ['audio/mp4'], 
    'mdb' => ['application/x-msaccess'], 
    'mid' => ['audio/midi'], 
    'midi' => ['audio/midi'], 
    'mov' => ['video/quicktime'], 
    'mp3' => ['audio/mpeg'], 
    'mp4' => ['video/mp4'], 
    'mpeg' => ['video/mpeg'], 
    'mpg' => ['video/mpeg'], 
    'ogg' => ['audio/ogg'], 
    'pdf' => ['application/pdf'], 
    'php' => ['application/x-php'], 
    'php3' => ['application/x-php'], 
    'php4' => ['application/x-php'], 
    'php5' => ['application/x-php'], 
    'png' => ['image/png'], 
    'ppt' => ['application/vnd.ms-powerpoint'], 
    'pptx' => ['application/vnd.openxmlformats-officedocument.presentationml.presentation'], 
    'ps' => ['application/postscript'], 
    'rar' => ['application/x-rar-compressed'], 
    'rtf' => ['application/rtf'], 
    'sit' => ['application/x-stuffit'], 
    'svg' => ['image/svg+xml'], 
    'tar' => ['application/x-tar'], 
    'tif' => ['image/tiff'], 
    'tiff' => ['image/tiff'], 
    'ttf' => ['application/x-font-truetype'], 
    'txt' => ['text/plain'], 
    'vcf' => ['text/x-vcard'], 
    'wav' => ['audio/wav'], 
    'wma' => ['audio/x-ms-wma'], 
    'wmv' => ['audio/x-ms-wmv'], 
    'xls' => ['application/vnd.ms-excel'], 
    'xlsx' => ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'], 
    'xml' => ['application/xml'], 
    'zip' => ['application/zip'], 
]; 
foreach ($map as $mimeType => $extensions) { 
    foreach ($extensions as $extension) { 
        $exts[$extension][] = $mimeType; 
    } 
} 
ksort($exts); 
 
$updated = ''; 
$state = 0; 
foreach (explode("\n", $data) as $line) { 
    if (!preg_match("{^        '([^'/]+)' => \['(.+)'\],$}", $line, $matches)) { 
        if (1 === $state) { 
            $state = 2; 
            foreach ($exts as $ext => $mimeTypes) { 
                $updated .= sprintf("        '%s' => ['%s'],\n", $ext, implode("', '", array_unique($mimeTypes))); 
            } 
        } 
        $updated .= $line."\n"; 
        continue; 
    } 
    $state = 1; 
} 
 
$updated = preg_replace('{Updated from upstream on .+?\.}', 'Updated from upstream on '.date('Y-m-d'), $updated, -1); 
 
file_put_contents($output, rtrim($updated, "\n")."\n"); 
 
echo "Done.\n"; 
 
 |