#!/usr/bin/env python # fm -- search the freshmeat repository by Stuart Langridge # downloaded from: http://www.kryogenix.org/code/fm # thp added: whitespace on commandline (ex. fm search window maker) import sys,urllib,xml.dom.minidom,urlparse def usage(): print """fm -- search the freshmeat repository Usage: fm [options] command [parameters] fm searches the Freshmeat repository, will display details about selected packages, and can download a package for you. Commands: search - Searches Freshmeat for packages matching word show - Shows full details for package pkg get - Downloads a tar.gz for package pkg if such exists Options: -h - show this help text """ sys.exit(0) def node2dict(n): r = {} for c in n.childNodes: if c.nodeType == c.ELEMENT_NODE: if c.childNodes: r[c.tagName] = c.firstChild.nodeValue else: r[c.tagName] = '' return r def getSearchResults(s): fp = urllib.urlopen('http://freshmeat.net/search-xml/?q=%s' % s.replace(' ', '%20')) dom = xml.dom.minidom.parseString(fp.read()) matches = [] for n in dom.documentElement.childNodes: this = {} if n.nodeType == n.ELEMENT_NODE and n.tagName == 'match': this = node2dict(n) if this: matches.append(this) return matches def search(s): matches = getSearchResults(s) for m in matches: print "%(projectname_short)s - %(desc_short)s" % m def show(s): matches = getSearchResults(s) for m in matches: if m["projectname_short"] == s: print """Package: %(projectname_short)s (%(projectname_full)s) Download locations: tar.gz: %(url_tgz)s deb: %(url_deb)s rpm: %(url_rpm)s Licence: %(license)s Freshmeat URL: %(url_homepage)s Description: %(desc_short)s %(desc_full)s """ % m def get(s): matches = getSearchResults(s) for m in matches: if m["projectname_short"] == s: if m["url_tgz"] <> '': try: # do a urlopen first to get the real filename fp=urllib.urlopen(m["url_tgz"]) realURL = fp.geturl() fp.close() tup = urlparse.urlparse(realURL) realFilename = tup[2].split('/')[-1] urllib.urlretrieve(m["url_tgz"],realFilename) print "Fetched %s" % realFilename except: print "Download of %s failed." % m["url_tgz"] else: print "Download of %s failed." % m["url_tgz"] def main(): if len(sys.argv) > 1 and sys.argv[1] == '-h': usage() if len(sys.argv) <> 3 and sys.argv[1] != 'search': usage() if sys.argv[1] == 'search': search(' '.join( sys.argv[2:])) elif sys.argv[1] == 'show': show(sys.argv[2]) elif sys.argv[1] == 'get': get(sys.argv[2]) else: usage() if __name__ == "__main__": main()