diff options
Diffstat (limited to 'get_latest_info.py')
-rwxr-xr-x | get_latest_info.py | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/get_latest_info.py b/get_latest_info.py new file mode 100755 index 000000000000..6b0168e188f7 --- /dev/null +++ b/get_latest_info.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python + +import requests +import requests.exceptions +import sys + +from argparse import ArgumentParser +from xml.etree import ElementTree as ET + + +def setup_argparser(): + arg_parser = ArgumentParser( + description="Retrieve latest information for a Mozilla add-on. This " + "includes the latest version and the current download URL." + ) + + arg_parser.add_argument( + "-u", + "--url-prefix", + default="", + help="Optional string to prepend to URL before outputting it." + ) + arg_parser.add_argument( + "-o", + "--os", + help="If given, fetch URL for the given operating system. Not " + "specifying this option fetches the first URL in the API response." + ) + arg_parser.add_argument( + "-p", + "--pkgbuild", + action="store_true", + help="Output appropriate lines for a PKGBUILD." + ) + + arg_parser.add_argument( + "addon_id", + type=int, + help="ID of add-on to retrieve information for." + ) + + return arg_parser + +def get_latest_addon_info(addon_id, os): + resp = requests.get( + "https://services.addons.mozilla.org/api/1.5/addon/%d" % addon_id + ) + resp.raise_for_status() + + # Now we got the API response, so parse it. + parsed_resp = ET.fromstring(resp.text) + + install_xpath = "install" + if os is not None: + install_xpath += "[@os='%s']" % os + + version = parsed_resp.find("version") + install = parsed_resp.find(install_xpath) + + # XXX: Quick and dirty: If the response does not contain + # the version tag, then we fail horribly here. Should be handled + # properly. + return version.text, install.text if install is not None else None + + +parsed_args = setup_argparser().parse_args() + +try: + version, url = get_latest_addon_info(parsed_args.addon_id, parsed_args.os) +except (requests.exceptions.RequestException, ET.ParseError) as e: + print( + "Could not retrieve latest information: %s" % e, + file=sys.stderr + ) + sys.exit(2) + +if url is None: + print( + "No matching URL for OS `%s' found." % parsed_args.os, + file=sys.stderr + ) + sys.exit(3) + +url = parsed_args.url_prefix + url + +if not parsed_args.pkgbuild: + print( + "VERSION=%s" % version + ) + print( + "URL=%s" % url + ) +else: + print( + "pkgver='%s'" % version + ) + print( + "source=('%s')" % url + ) |