pytekstitv/pytekstitv.py
2025-01-13 00:37:29 +02:00

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)