first commit
This commit is contained in:
168
vendor/symfony/mime/Resources/bin/update_mime_types.php
vendored
Normal file
168
vendor/symfony/mime/Resources/bin/update_mime_types.php
vendored
Normal file
@ -0,0 +1,168 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
if ('cli' !== \PHP_SAPI) {
|
||||
throw new Exception('This script must be run from the command line.');
|
||||
}
|
||||
|
||||
// load new map
|
||||
$data = json_decode(file_get_contents('https://cdn.jsdelivr.net/gh/jshttp/mime-db/db.json'), true);
|
||||
$new = [];
|
||||
foreach ($data as $mimeType => $mimeTypeInformation) {
|
||||
if (!array_key_exists('extensions', $mimeTypeInformation)) {
|
||||
continue;
|
||||
}
|
||||
$new[$mimeType] = $mimeTypeInformation['extensions'];
|
||||
}
|
||||
|
||||
$xml = simplexml_load_string(file_get_contents('https://gitlab.freedesktop.org/xdg/shared-mime-info/-/raw/master/data/freedesktop.org.xml.in'));
|
||||
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]);
|
||||
}
|
||||
|
||||
$data = $pre;
|
||||
|
||||
// reverse map
|
||||
// we prefill the extensions with some preferences for content-types
|
||||
$exts = [
|
||||
'asice' => ['application/vnd.etsi.asic-e+zip'],
|
||||
'bz2' => ['application/x-bz2'],
|
||||
'csv' => ['text/csv'],
|
||||
'ecma' => ['application/ecmascript'],
|
||||
'flv' => ['video/x-flv'],
|
||||
'gif' => ['image/gif'],
|
||||
'gz' => ['application/x-gzip'],
|
||||
'htm' => ['text/html'],
|
||||
'html' => ['text/html'],
|
||||
'jar' => ['application/x-java-archive'],
|
||||
'jpg' => ['image/jpeg'],
|
||||
'js' => ['text/javascript'],
|
||||
'keynote' => ['application/vnd.apple.keynote'],
|
||||
'key' => ['application/vnd.apple.keynote'],
|
||||
'm3u' => ['audio/x-mpegurl'],
|
||||
'm4a' => ['audio/mp4'],
|
||||
'md' => ['text/markdown', 'text/x-markdown'],
|
||||
'mdb' => ['application/x-msaccess'],
|
||||
'mid' => ['audio/midi'],
|
||||
'mov' => ['video/quicktime'],
|
||||
'mp3' => ['audio/mpeg'],
|
||||
'ogg' => ['audio/ogg'],
|
||||
'pdf' => ['application/pdf'],
|
||||
'php' => ['application/x-php'],
|
||||
'png' => ['image/png'],
|
||||
'ppt' => ['application/vnd.ms-powerpoint'],
|
||||
'rar' => ['application/x-rar-compressed'],
|
||||
'hqx' => ['application/stuffit'],
|
||||
'sit' => ['application/x-stuffit', 'application/stuffit'],
|
||||
'svg' => ['image/svg+xml'],
|
||||
'tar' => ['application/x-tar'],
|
||||
'tif' => ['image/tiff'],
|
||||
'ttf' => ['application/x-font-truetype'],
|
||||
'vcf' => ['text/x-vcard'],
|
||||
'wav' => ['audio/wav'],
|
||||
'wma' => ['audio/x-ms-wma'],
|
||||
'wmv' => ['audio/x-ms-wmv'],
|
||||
'xls' => ['application/vnd.ms-excel'],
|
||||
'yaml' => ['application/yaml'],
|
||||
'yml' => ['application/yaml'],
|
||||
'zip' => ['application/zip'],
|
||||
];
|
||||
|
||||
// we merge the 2 maps (we never remove old mime types)
|
||||
$map = array_replace_recursive($current, $new);
|
||||
|
||||
foreach ($exts as $ext => $types) {
|
||||
foreach ($types as $mt) {
|
||||
if (!isset($map[$mt])) {
|
||||
$map += [$mt => [$ext]];
|
||||
}
|
||||
}
|
||||
}
|
||||
ksort($map);
|
||||
|
||||
foreach ($map as $mimeType => $extensions) {
|
||||
foreach ($exts as $ext => $types) {
|
||||
if (in_array($mimeType, $types, true)) {
|
||||
array_unshift($extensions, $ext);
|
||||
}
|
||||
}
|
||||
$data .= sprintf(" '%s' => ['%s'],\n", $mimeType, implode("', '", array_unique($extensions)));
|
||||
}
|
||||
$data .= $post;
|
||||
|
||||
foreach ($map as $mimeType => $extensions) {
|
||||
foreach ($extensions as $extension) {
|
||||
if ('application/octet-stream' === $mimeType && 'bin' !== $extension) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$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 .+?\.}', sprintf('Updated from upstream on %s.', date('Y-m-d')), $updated, -1);
|
||||
|
||||
file_put_contents($output, rtrim($updated, "\n")."\n");
|
||||
|
||||
echo "Done.\n";
|
Reference in New Issue
Block a user