pytekstitv/pytekstitv.py

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')