Get MIME Type

ファイル情報取得で MIME Type を取得したい。
mimetypes モジュールでは拡張子判別しかできないみたいですけど。
Nautilus は拡張子が優先だけど無くても取得できているじゃないか。
ということで地味に方法を探してみる。

ファイルの MIME タイプの検出 (GNOME 2.2 システム管理 (Linux 版)) – Sun Microsystems

/etc/gnome-vfs-mime-magic
/etc/mime.types

のファイルが元ということになっているみたいなんだが Ubuntu では

ubuntuで対応しているMIME Typeを調べるには:Linux つれづれ日記:So-net blog

/usr/share/mime 以下なのか。
xdg-mime は MIME Types のインストール関連に使うものだがどっちに登録するのかな?

つーか Nautilus が取得できているんだから絶対にシェルから取得できるはずだ。
色々調べていたらこんなのを見つけた。

Nautilus File Manager Scripts: File Information Querying Scripts

file コマンドだけでこんなことができるのか。

$ file --help

で調べると –mime-type オプションがあるらしい、それならこうしてみよう。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import gtk
import urllib
import os.path
import commands

class MimeWin(gtk.Window):
    """
        Showing MIME Type of Dropped file
    """
    def __init__(self):
        gtk.Window.__init__(self)
        dnd_list = [("text/uri-list", 0, 0)]
        self.drag_dest_set( gtk.DEST_DEFAULT_MOTION |
                            gtk.DEST_DEFAULT_HIGHLIGHT |
                            gtk.DEST_DEFAULT_DROP,
                            dnd_list, gtk.gdk.ACTION_MOVE )
        self.connect("drag_data_received", self.on_drop)
        self.label = gtk.Label("Drop")
        self.add(self.label)
        self.connect("delete-event", gtk.main_quit)
        self.resize(320, 150)
        self.show_all()

    def on_drop(self, widget, context, x, y, selection_data, info, time):
        drops = selection_data.data.split("\n")
        for drop in drops:
            name = urllib.unquote(drop)[7:-1]
            if os.path.isfile(name):
                # Get MIME Type
                mime = commands.getoutput("file --mime-type %s" % name)
                self.label.set_text(mime)

if __name__ == "__main__":
    w = MimeWin()
    gtk.main()

ext_non

おお、しっかり取得してくれているじゃないか。
しかし Python Script では

ext_py

text/x-java …
text/x-python のはずなのに、ダメだこりゃ。

mime = mimetypes.guess_type(name)[0]
if mime:
    self.label.set_text(mime)
else:
    self.label.set_text("Non Extension")

ならキチンと text/x-python になる、しかし拡張子が無いなら None になる。
んーどっちも使えない、もうちょっと調べます。

Enjoy!