Files
AntennaPod/scripts/createContributors.py
2025-12-27 22:04:16 +01:00

95 lines
3.2 KiB
Python

#!/usr/bin/env python3
import pycountry, requests, os, glob, subprocess
contributorsFile = open("CONTRIBUTORS.md", "w")
###### Developers #####
MAINTAINERS = ['ByteHamster', 'keunes']
FORMER_MAINTAINERS = ['mfietz', 'TomHennen']
csvFile = open("ui/preferences/src/main/assets/developers.csv", "w")
contributorsFile.write('# Developers\n\n')
page = 1
hasMore = True
first = True
while hasMore:
nextPage = ('https://api.github.com/repos/AntennaPod/AntennaPod/contributors'
+ '?q=contributions&order=desc&per_page=100&page=' + str(page))
print("Loading " + nextPage)
json = requests.get(nextPage).json()
for contributor in json:
role = 'Contributor'
if contributor['login'] == 'danieloeh':
role = 'Original creator of AntennaPod (retired)'
elif contributor['login'] in MAINTAINERS:
role = 'Maintainer'
elif contributor['login'] in FORMER_MAINTAINERS:
role = 'Maintainer (retired)'
csvFile.write(contributor['login'].replace(";", "") + ';' + str(contributor['id']) + ';' + role + '\n')
if not first:
contributorsFile.write(', ')
first = False
contributorsFile.write('[' + contributor['login'] + '](https://github.com/' + contributor['login'] + ')')
page = page + 1
hasMore = len(json) > 0
csvFile.close()
###### Translators #####
path = "ui/i18n/src/main/res"
# Map Android codes to display names when pycountry fails or region matters
ANDROID_LANG_FIXES = {
"pt-rbr": "Portuguese (Brazil)",
"pt-rpt": "Portuguese (Portugal)",
"kn-rin": "Kannada (India)",
"zh-rcn": "Chinese (Simplified)",
"zh-rtw": "Chinese (Traditional)",
"in": "Indonesian",
"iw": "Hebrew",
"ji": "Yiddish",
"sw": "Swahili",
"el": "Modern Greek",
}
def lang_name(code):
code = code.lower()
if code in ANDROID_LANG_FIXES:
return ANDROID_LANG_FIXES[code]
norm = code.replace('-r','_')
try:
base = norm.split('_')[0]
name = pycountry.languages.lookup(base).name
return name + (f" ({norm})" if '_' in norm else "")
except:
return code
files = sorted(
glob.glob(f"{path}/values-*/strings.xml"),
key=lambda f: lang_name(f.split("values-")[1].split("/")[0]).lower())
contributorsFile.write('\n\n# Translators\n\n| Language | Translators |\n| :-- | :-- |\n')
csvFile = open("ui/preferences/src/main/assets/translators.csv", "w")
for f in files:
code = f.split("values-")[1].split("/")[0]
hashes = {l.split()[0] for l in subprocess.check_output(["git", "blame", f]).decode().splitlines()}
names = set()
for h in hashes:
for l in subprocess.check_output(["git", "show", h]).decode().splitlines():
if not f"Translator: {code} by" in l:
continue
n = l.split("by",1)[1].split("<")[0].replace('"','').strip()
if n in ("ByteHamster", "Anonymous"):
continue
names.add(n)
translators = ", ".join(sorted(names)) or "Anonymous"
lang = lang_name(code)
contributorsFile.write(f"| {lang} | {translators} |\n")
csvFile.write(f"{lang};{translators}\n")
print(f"{lang}: {translators}")
csvFile.close()
contributorsFile.close()
print('Done')