94 lines
2.8 KiB
Python
94 lines
2.8 KiB
Python
import json
|
|
import urllib.request
|
|
import select
|
|
import sys
|
|
import termios
|
|
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}'
|
|
|
|
def tulosta_sivu(sivu):
|
|
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')
|
|
|
|
if __name__ == '__main__':
|
|
puu = lataa(int(sys.argv[1]))
|
|
sivu = puu.getroot().find('page')
|
|
edellinen = sivu.get('prevpg')
|
|
seuraava = sivu.get('nextpg')
|
|
print(f'Sisällön lähde: {puu.getroot().get('network')}')
|
|
print(f'<<< {edellinen} {seuraava} >>>')
|
|
tulosta_sivu(sivu)
|
|
try:
|
|
pääte = sys.stdout.fileno()
|
|
vanhat_attribuutit = termios.tcgetattr(pääte)
|
|
iflag, oflag, cflag, lflag, ispeed, ospeed, cc = vanhat_attribuutit
|
|
lflag &= ~termios.ECHO
|
|
lflag &= ~termios.ICANON
|
|
uudet_attribuutit = [iflag, oflag, cflag, lflag, ispeed, ospeed, cc]
|
|
termios.tcsetattr(pääte, termios.TCSADRAIN, uudet_attribuutit)
|
|
|
|
käynnissä = True
|
|
while käynnissä:
|
|
poll = select.poll()
|
|
poll.register(sys.stdin.fileno(), select.POLLIN)
|
|
|
|
for fd, tapahtuma in poll.poll():
|
|
assert fd == sys.stdin.fileno()
|
|
assert tapahtuma == select.POLLIN
|
|
merkki = sys.stdin.read(1)
|
|
if merkki == 'q':
|
|
käynnissä = False
|
|
|
|
except KeyboardInterrupt:
|
|
pass
|
|
|
|
finally:
|
|
termios.tcsetattr(pääte, termios.TCSADRAIN, vanhat_attribuutit)
|