forked from thunderbird/thunderbird-website
-
Notifications
You must be signed in to change notification settings - Fork 0
/
product_details.py
197 lines (158 loc) · 7.27 KB
/
product_details.py
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
# -*- coding: utf-8 -*-
from collections import OrderedDict
from operator import itemgetter
import sys
if sys.version_info[0] == 3:
from urllib.parse import urlencode
else:
from urllib import urlencode
import json
import os
import re
import settings
def load_json(path):
"""Load the .json at `path` and return data."""
path = os.path.join(settings.JSON_PATH, path)
with open(path, 'r') as f:
return json.load(f)
class ThunderbirdDetails():
""" Loads Thunderbird versioning information from product details JSON files."""
platform_labels = OrderedDict([
# ('winsha1', 'Windows (XP/Vista)'),
('win64', 'Windows 64-bit'),
('msi', 'Windows MSI 64-bit'),
('osx', 'macOS'),
('linux64', 'Linux 64-bit'),
('win', 'Windows 32-bit'),
('linux', 'Linux 32-bit')
])
languages = load_json('languages.json')
current_versions = load_json('thunderbird_versions.json')
all_builds = load_json('thunderbird_primary_builds.json')
major_releases = load_json('thunderbird_history_major_releases.json')
minor_releases = load_json('thunderbird_history_stability_releases.json')
major_releases = load_json('thunderbird_history_major_releases.json')
dev_releases = load_json('thunderbird_history_development_releases.json')
version_map = {
'daily': 'LATEST_THUNDERBIRD_NIGHTLY_VERSION',
'beta': 'LATEST_THUNDERBIRD_DEVEL_VERSION',
'release': 'LATEST_THUNDERBIRD_VERSION',
}
def latest_version(self, channel='release'):
"""Returns the latest release version of Thunderbird by default, or other `channel`."""
version_name = self.version_map.get(channel, 'LATEST_THUNDERBIRD_VERSION')
return self.current_versions[version_name]
def latest_builds(self, locale, channel='release'):
"""Returns builds for the latest version of Thunderbird based on `channel`."""
version = self.latest_version(channel)
# We don't really have any build data for non-release builds
_version = self.latest_version('release')
builds = self.all_builds
if locale in builds and _version in builds[locale]:
_builds = builds[locale][_version]
# Append 64-bit builds
if 'Linux' in _builds:
_builds['Linux 64-bit'] = _builds['Linux']
if 'Windows' in _builds:
_builds['Windows 64-bit'] = _builds['Windows']
return version, _builds
def get_filtered_full_builds(self, channel, version):
version = version or self.latest_version(channel)
_version = self.latest_version('release')
f_builds = []
builds = self.all_builds
for locale, build in builds.items():
if locale not in self.languages or not build.get(_version):
continue
build_info = {
'locale': locale,
'name_en': self.languages[locale]['English'],
'name_native': self.languages[locale]['native'],
'platforms': {},
}
for platform, label in self.platform_labels.items():
build_info['platforms'][platform] = {
'download_url': self.get_download_url(channel, version,
platform, locale,
True),
}
f_builds.append(build_info)
return sorted(f_builds, key=itemgetter('name_en'))
def get_download_url(self, channel, version, platform, locale, force_direct=True):
_version = version
_locale = 'ja-JP-mac' if platform == 'osx' and locale == 'ja' else locale
_platform = 'win' if platform == 'winsha1' else platform
product_url = 'thunderbird-%s-SSL'
if platform == 'msi':
_platform = 'win64'
product_url = 'thunderbird-%s-msi-SSL'
# Check if direct download link has been requested
# (bypassing the transition page)
if not force_direct:
# Currently we don't have the transition page for Thunderbird, so
# return a direct link instead
pass
# The 'daily' channel is hosted on FTP and uses a different filename format.
if channel == 'daily':
platform_filetype = {
'osx': 'mac.dmg',
'linux': 'linux-i686.tar.bz2',
'linux64': 'linux-x86_64.tar.bz2',
'win': 'win32.installer.exe',
'win64': 'win64.installer.exe'
}
platform_filename = platform_filetype.get(_platform, '')
daily_url = 'thunderbird-{version}.{locale}.{platform}'.format(version=_version, locale=_locale, platform=platform_filename)
return ''.join([settings.DAILY_URL, daily_url])
# build a direct download link for 'beta' and 'release' channels.
return '?'.join([settings.BOUNCER_URL,
urlencode([
('product', product_url % _version),
('os', _platform),
# Order matters, lang must be last for bouncer.
('lang', _locale),
])])
def platforms(self, channel='release'):
return self.platform_labels.items()
def list_releases(self, channel='beta'):
version_name = self.version_map.get(channel, 'LATEST_THUNDERBIRD_DEVEL_VERSION')
esr_major_versions = (
list(range(10, 59, 7))
+ [60, 68]
+ list(range(78, int(self.current_versions[version_name].split('.')[0]) + 1, 13))
)
releases = {}
for release in self.major_releases:
major_version = float(re.findall(r'^\d+\.\d+', release)[0])
# The version numbering scheme of Firefox changes sometimes. The second
# number has not been used since Firefox 4, then reintroduced with
# Firefox ESR 24 (Bug 870540). On this index page, 24.1.x should be
# fallen under 24.0. This pattern is a tricky part.
converter = '%g' if int(major_version) in esr_major_versions else '%s'
major_pattern = r'^' + re.escape(converter % round(major_version, 1))
releases[major_version] = {
'major': release,
'minor': sorted(filter(lambda x: re.findall(major_pattern, x),
self.minor_releases),
key=lambda x: list(map(lambda y: int(y), x.split('.'))))
}
return sorted(releases.items(), reverse=True)
def beta_version_to_canonical(self, version):
last = ''
for x in range(1, 10):
v = re.sub(r'beta', 'b{0}'.format(x), version)
date = self.dev_releases.get(v, '')
if date:
last = v
return last
def get_release_date(self, version):
date = ''
if 'b' in version:
version = self.beta_version_to_canonical(version)
date = self.dev_releases.get(version, '')
if not date:
date = self.major_releases.get(version, '')
if not date:
date = self.minor_releases.get(version, '')
return date
thunderbird_desktop = ThunderbirdDetails()