From 0d6c9d69bb194c3234b0577dc92ac86d01f5e91a Mon Sep 17 00:00:00 2001 From: Sebastian Heinlein Date: Thu, 19 Feb 2009 05:07:23 +0100 Subject: [PATCH] APT: Add script to extract information from app-install desktop files --- backends/apt/update-packagekit-app-data | 86 +++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100755 backends/apt/update-packagekit-app-data diff --git a/backends/apt/update-packagekit-app-data b/backends/apt/update-packagekit-app-data new file mode 100755 index 000000000..b0e6a570b --- /dev/null +++ b/backends/apt/update-packagekit-app-data @@ -0,0 +1,86 @@ +#!/usr/bin/env python +# update-packagekit-app-data - Generate a cache of mime type and codec handlers +# Authors: Michael Vogt +# Sebastian Heinlein + +import sys +import glob +import os +import os.path +import re +import sys + +from optparse import OptionParser + +import gdbm + +try: + import xdg.DesktopEntry +except ImportError, e: + print "WARNING: can not import xdg.DesktopEntry, aborting" + sys.exit(0) + +def generate_mime_map(desktop_dir, cache_dir): + dicts = { 'mime':{}, 'codec':{} } + + def record_provider(de, cp, defield,dictname): + try: + keys = de.get(defield, list=True) + except keyError: + return + if not keys: return + dict = dicts[dictname] + for key in keys: + # gst-caps support + if dictname == 'codec' and ',' in key: + key = key.split(",")[0] + try: + l = dict[key] + except KeyError: + l = []; dict[key] = l + l.append(cp) + + for fn in glob.glob(os.path.join(desktop_dir, 'desktop/*.desktop')): + try: + de = xdg.DesktopEntry.DesktopEntry(fn) + except Exception, e: + print >>sys.stderr, "bad .desktop file: %s: %s" % (fn, e) + try: + component = de.get('X-AppInstall-Section') + package = de.get('X-AppInstall-Package') + except KeyError: + continue + cp = component+"/"+package + record_provider(de, cp, 'MimeType','mime') + record_provider(de, cp, 'X-AppInstall-Codecs','codec') + + for (dictname, dict) in dicts.iteritems(): + g = gdbm.open(os.path.join(cache_dir, + dictname+"-map.gdbm"), + 'nfu') + for (key,l) in dict.iteritems(): + g[key] = ' '.join(l) + g.sync() + g.close() + +def main(): + parser = OptionParser() + parser.add_option ("-d", "--desktop-dir", action="store", + dest="desktop_dir", + default="/usr/share/app-install", + help="Directory that contains the desktop files " + "of the applications") + parser.add_option ("-c", "--cache-dir", action="store", + dest="cache_dir", + default="/var/lib/PackageKit", + help="Directory where the data should be cached in") + (options, args) = parser.parse_args() + for path in (options.desktop_dir, options.cache_dir): + if not os.path.isdir(path): + print "%s is not a valid directory" % path + sys.exit(1) + print "Generating mime/codec maps..." + generate_mime_map(options.desktop_dir, options.cache_dir) + +if __name__ == "__main__": + main()