ファイル情報取得で 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()
おお、しっかり取得してくれているじゃないか。
しかし Python Script では
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!