61 lines
1.9 KiB
Python
61 lines
1.9 KiB
Python
import json
|
|
import urllib.request
|
|
import sys
|
|
import xml.etree.ElementTree
|
|
|
|
with open('apiavain.json') as f:
|
|
apiavain = json.load(f)
|
|
|
|
def lataa(sivu):
|
|
url = f'https://external.api.yle.fi/v1/teletext/pages/{sivu}.xml?app_id={apiavain['app_id']}&app_key={apiavain['app_key']}'
|
|
with urllib.request.urlopen(url) as f:
|
|
return xml.etree.ElementTree.parse(f)
|
|
|
|
värit = {
|
|
'black': 30,
|
|
'red': 31,
|
|
'green': 32,
|
|
'yellow': 93,
|
|
'blue': 34,
|
|
'magenta': 95,
|
|
'cyan': 96,
|
|
'white': 97,
|
|
}
|
|
|
|
def grafiikkamerkki(arvo):
|
|
assert 0x20 <= arvo <= 0x7f
|
|
if arvo == 0x20: return '\u00a0' # No-Break Space
|
|
elif arvo < 0x35: return chr(0x1fb00 - 1 - 0x20 + arvo)
|
|
elif arvo == 0x35: return '\u258c' # Left Half Block
|
|
elif arvo <= 0x3f: return chr(0x1fb00 - 2 - 0x20 + arvo)
|
|
elif arvo < 0x60: return chr(arvo)
|
|
elif arvo < 0x6a: return chr(0x1fb00 - 2 - 0x40 + arvo)
|
|
elif arvo == 0x6a: return '\u2590' # Right Half Block
|
|
elif arvo < 0x7f: return chr(0x1fb00 - 3 - 0x40 + arvo)
|
|
elif arvo == 0x7f: return '\u2588' # Full Block
|
|
|
|
def ohjauskoodit(jakso):
|
|
grafiikka = False
|
|
väri = värit.get(jakso.get('fg'))
|
|
if väri == None:
|
|
assert jakso.get('fg')[0] == 'g'
|
|
väri = värit[jakso.get('fg')[1:]]
|
|
grafiikka = True
|
|
tausta = värit[jakso.get('bg')] + 10
|
|
teksti = jakso.text
|
|
if grafiikka:
|
|
teksti = ''.join(grafiikkamerkki(ord(merkki)) for merkki in teksti)
|
|
return f'\x1b[{väri};{tausta}m{teksti}'
|
|
|
|
if __name__ == '__main__':
|
|
puu = lataa(int(sys.argv[1]))
|
|
sivu = puu.getroot().find('page')
|
|
print(f'Sisällön lähde: {puu.getroot().get('network')}')
|
|
print(f'<<< {sivu.get('prevpg')} {sivu.get('nextpg')} >>>')
|
|
alasivuja = int(sivu.get('subpagecount'))
|
|
for alasivunumero in range(1, alasivuja + 1):
|
|
for rivinumero in range(1, 24 + 1):
|
|
rivi = sivu.find(f'subpage[@number="{alasivunumero}"]/content[@type="structured"]/line[@number="{rivinumero}"]')
|
|
for jakso in rivi:
|
|
print(ohjauskoodit(jakso), end='')
|
|
print('\x1b[0m')
|