summarylogtreecommitdiffstats
path: root/get_latest_info.py
blob: 6b0168e188f7c52b89122e82ca6b2268e69f25ae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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
    )