Вернуться назад

MIME-типы

IANA - организация, которая ведёт реестр MIME-типов.

Как узнать MIME-тип

Создадим простой текстовый файл "myfile.kaka".


   # С помощью утилиты "file":
   file --mime-type myfile.kaka
      # myfile.kaka: text/plain

   # С помощью "xdg-mime":
   xdg-mime query filetype myfile.kaka
      # text/plain

   # С помощью "gio":
   gio info myfile.kaka | grep content-type
      #  standard::content-type: text/plain
      #  standard::fast-content-type: application/octet-stream

Скрипт "xdg-mime" под капотом использует утилиту "file".


   # папка с MIME-типами:
   /usr/share/mime/packages/
   ~/.local/share/mime/packages/

Теперь создаём файл ~/.magic:

# Содержимое файла ~/.magic:
   0   string   KAKA!   application/x-kaka
   !:mime   application/x-kaka

Проверяем MIME-тип:


   file --mime-type myfile.kaka
      # myfile.kaka: application/x-kaka

   xdg-mime query filetype myfile.kaka
      # application/x-kaka

для чего нужен application-x-kaka.xml

Проверим, какое у нас дефолтное приложение для типа application/x-kaka


   xdg-mime query default application/x-kaka
      # ничего не выдало

---

создаём файл ~/.local/share/mime/packages/application-x-kaka.xml:


   <mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
       <mime-type type="application/x-foobar">
           <comment>foo file</comment>
           <glob pattern="*.kaka"/>
           <magic priority="100">
               <match type="string" value="KAKA!" offset="0"/>
           </magic>
       </mime-type>
   </mime-info>

Далее обновляем базу MIME:


   update-mime-database ~/.local/share/mime

   # После выполнения этой команды мой application/x-kaka становится официально зарегестрированным MIME-типом в системе.
   # Эта команда читает все XML-файлы из ~/.local/share/mime/packages
   # и на их основе перестраивает бинарные кэши (например, ~/.local/share/mime/mime.cache + подкаталоги вроде application/, text/ и т.п.)

Что делает update-mime-database

Эта команда пересобирает несколько служебных файлов. Среди них:

Теперь я хочу привязать к своему MIME-типу определённое приложение.


   # привязываем application/x-kaka к notepadqq:
   xdg-mime default notepadqq.desktop application/x-kaka

   # Теперь проверяем, какое приложение привязано к нашему MIME-типу:
   xdg-mime query default application/x-kaka
      # notepadqq.desktop
# Папка с .desktop-файлами:
   ~/.local/share/applications
   /usr/share/applications

   # Любая программа при установке кладёт сюда свой .desktop-файл.
# Файл mimeapps.list
   ~/.config/mimeapps.list
   ~/.local/share/applications/mimeapps.list

   # в этот файл записывается соответствие между notepadqq.desktop и MIME-типом application/x-kaka
   # То есть когда я запустил команду "xdg-mime default notepadqq.desktop application/x-kaka", ...
   # ... то запись попала в файл ~/.config/mimeapps.list
   # ~/.local/share/applications/mimeapps.list - содержит старые записи

Теперь если мы кликнем по файлу myfile.kaka, то он откроется с помощью notepadqq. Или можно попробовать открыть его через терминал вот так:


   xdg-open myfile.kaka
# Привязать файловый менеджер PCManFM к папкам:
   xdg-mime default pcmanfm.desktop inode/directory

Важно!

Большинство файловых менеджеров не используют под капотом утилиту "file". Они определяют тип файла по расширению и по файлу ~/.local/share/mime/globs. А потом смотрят в ~/.config/mimeapps.list, чтобы найти программу, которой надо открыть файл.

А вот когда мы используем "file --mime-type" или "xdg-open" (который под капотом использует тот же "file"), то file пытается определить тип файла по сигнатуре и поэтому сначала прочитывает файл ~/.magic, где мы описываем её.

"gio info | grep content-type" будет вести себя примерно также, как PCManFM. Он ориентируется на globs и определяет тип по расширению.

список MIME-типов: