Sida 1 av 1

Gratis text-tv-app

Postat: 04 feb 2011, 01:05
av David Andersson
Såg en nyhet på SVT Text igår:
text-tv skrev: Text-TV populärast på Ipad

En sk app som visar SVT Text har
blivit den mest nedladdade betal-
appen för Ipad, skriver Ny Teknik.
(...)

-Det är fantastiskt att Sveriges
största skrivna nyhetsmedium finns med
i framtiden, säger Morgan Olofsson,
redaktionschef på SVT:s Rapport.
(...)

Tvärtemot vad man skulle kunna tro är
det inte SVT som har utvecklat appen,
utan ett privat företag.
(...)

-De tillhandahåller ett program som
gör det möjligt att läsa text-tv
i mobilen eller Ipad, men själva
innehållet är vårt.
SVT Text finns redan på vanliga internet anpassad för mobil: http://m.svt.se/2.27903/svt_text
Man kan naturligtvis läsa den utan att betala, med hjälp av en vanlig gratis generell webbläsare. Det som gör att folk betalar för appen (i princip en webbläsare som bara kan visa SVT Text) är tydligen att den visar ljus text på svart botten. Som på TV.

Det är ju bara löjligt. Folk måste lära sig att program och information är gratis.

Här är en gratis app som visar SVT Text med svart bakgrund. Den är skriven i python och kan f.n. bara användas i terminalen.

Kod: Markera allt

#!/usr/bin/python
#  encoding: utf-8
#
# Copyright 2011 David Andersson
# Programmet får användas, modifieras och distribueras fritt.
#
usage="""\
mysvttext - Visa text-tv-sida från http://svt.se/svttext i terminalen.

Synopsis 
  mysvttext [VÄXLAR] [SIDNUMMER...]

Default sidnummer är 100.

Växlar
  -h, --help   Visa denna hjälptext

Unicode
  Teckenkodningen för stdout måste kunna hantera unicode.
  Om den är okänd antas UTF-8.
"""

import urllib2
import re
import sys

def write(string):
    sys.stdout.write(string.encode(sys.stdout.encoding or 'UTF-8'))

def load_web_page(url):
    fileHandle = urllib2.urlopen(url)
    content = fileHandle.read()
    fileHandle.close()
    return content

class RegexScanner:
    pos = 0
    txt = None
    m = None
    def __init__(_, txt):
        _.txt = txt

    def match(_, re):
        _.m = re.match(_.txt, _.pos)
        if _.m:
            _.pos = _.m.end()
        return _.m

    def search(_, re):
        _.m = re.search(_.txt, _.pos)
        if _.m:
            _.pos = _.m.end()
        return _.m

    def group(_, g=0):
        return _.m.group(g)

    def eos(_):
        return _.pos >= len(_.txt)

    def look(_, count):
        return _.txt[_.pos:min(_.pos+count,len(_.txt))]

ent_map = {
    '&' : '&',
    '<'  : '<',
    '>'  : '>',
}

color_white_on_black = '\033[37;40m'
color_default        = '\033[0m'
color_class_to_ansi = {
    'BK' : '\033[30m',     # förgrundsfärger
    'R'  : '\033[31m',
    'G'  : '\033[32m',
    'Y'  : '\033[33m',
    'B'  : '\033[34m',
    'M'  : '\033[35m',
    'C'  : '\033[36m',
    'W'  : '\033[37m',

    'bgBK' : '\033[40m',   # bakgrundsfärger
    'bgR'  : '\033[41m',
    'bgG'  : '\033[42m',
    'bgY'  : '\033[43m',
    'bgB'  : '\033[44m',
    'bgM'  : '\033[45m',
    'bgC'  : '\033[46m',
    'bgW'  : '\033[47m',

    'DH' : '\033[1m',      # dubbel höjd visas som fet stil
    ''   : '',             # tom klass gör ingenting
}

def write_color_codes(props):
    for color in props.split(' '):
        write(color_class_to_ansi[color])

def texttvblock_to_braille(ttcode):
    # Hittar ingen text-tv-grafik i unicode. Approximera med braille-tecken.
    # Text-TV block-grafik, 3x2-matris.
    # Addera vikterna med 32 för ASCII-kod.
    #   -- --
    #  | 1| 2|
    #  |--|--|
    #  | 4| 8|
    #  |--|--|
    #  |16|64|
    #   -- --
    # Braille punkt-grafik, 4x2-matris.
    # Addera vikterna med 0x2800 för Unicode-nummer.
    #   -- --
    #  | 1| 8|
    #  |--|--|
    #  | 2|16|
    #  |--|--|
    #  | 4|32|
    #  |--|--|
    #  |64|128
    #   -- --
    braille = 0x2800
    if ttcode &  1: braille |= 1
    if ttcode &  2: braille |= 8
    if ttcode &  4: braille |= 2+4
    if ttcode &  8: braille |= 16+32
    if ttcode & 16: braille |= 64
    if ttcode & 64: braille |= 128
    return unichr(braille)

# Regex-definitioner av tokens i html från webbsidan.
# re_charset och re_startpre används med 'search'. Text innan dem ignoreras.
# Övriga regex används mellan re_startpre och re_endpre och används med 'match'.
# Det ska inte finnas okänd text mellan dem. Allt mellan re_startpre och re_endpre
# ska vara kända tokens.
re_charset     = re.compile('<meta[^<>]*charset=([^ "]*)')
re_startpre    = re.compile('<pre class="root[^"]*">')
re_endpre      = re.compile('</pre>')
re_text        = re.compile('[^<&\r\n]+')
re_char_ent    = re.compile('&#?\w+;')
re_newline     = re.compile('\r?\n')
re_prop_graph  = re.compile('<span class="([^"]*)" style="background: url\\(([^"()0-9]*)([0-9]*)[^"()]*\\)"> </span>')
re_graph       = re.compile('<span style="background: url\\(([^"()0-9]*)([0-9]*)[^"()]*\\)"> </span>')
re_prop_square = re.compile('<span class="([^"]*)" style="background: url\\(../../images/mos/W/127.gif\\)"> </span>&#0;')
re_square      = re.compile('<span style="background: url\\(../../images/mos/W/127.gif\\)"> </span>&#0;')
re_prop_begin  = re.compile('<span class="([^"]*)">')
re_prop_end    = re.compile('</span>')
re_page_ref    = re.compile('<a href="(...)\\.html">(...)</a>')


def parse_html(htmltext):
    lex = RegexScanner(htmltext)
    if lex.search(re_charset):
        web_encoding = lex.group(1)
    else:
        web_encoding = 'iso-8859-1'

    while lex.search(re_startpre):  # slinga över del-sidor
        write('\n')
        props = ''
        while not lex.match(re_endpre):  # slinga över rader på en sida
            write(' '+color_white_on_black+' ')
            while not lex.match(re_newline):  # slinga över tokens på en rad
                if lex.match(re_text):
                    text = lex.group()
                    write(unicode(text, web_encoding))

                elif lex.match(re_prop_begin):
                    props = lex.group(1)
                    write_color_codes(props)

                elif lex.match(re_prop_end):
                    pass

                elif lex.match(re_square):
                    write(unichr(0x25A0))

                elif lex.match(re_prop_square):
                    props = lex.group(1)
                    write_color_codes(props)
                    write(unichr(0x25A0))

                elif lex.match(re_graph):
                    graph = int(lex.group(2))
                    write(texttvblock_to_braille(graph))

                elif lex.match(re_prop_graph):
                    props = lex.group(1)
                    write_color_codes(props)
                    graph = int(lex.group(3))
                    write(texttvblock_to_braille(graph))

                elif lex.match(re_page_ref):
                    pagenum = lex.group(1)
                    write(pagenum)

                elif lex.match(re_char_ent):
                    ent = lex.group()
                    write(ent_map[ent])

                else:
                    write(color_default+'\n')
                    raise SystemExit('Unrecognized token looking at: "'+lex.look(10)+'"')
            write(color_white_on_black+' ')
            write(color_default+'\n')

def main():
    if len(sys.argv)>1 and sys.argv[1] in ['-h','--help']:
        print usage
        exit(0)
    for pagenum in sys.argv[1:] or ['100']:
        url = 'http://svt.se/svttext/tv/pages/'+pagenum+'.html'
        htmltext = load_web_page(url)
        parse_html(htmltext)

try:
    main()
except Exception, msg:
    print >>sys.stderr, msg
    exit(1)

Re: Gratis text-tv-app

Postat: 04 feb 2011, 04:28
av nicefinger
Funkar :) Men man får ju bara en sida i taget.
Borde väl gå att bygga på programmet så att man kan navigera på vanligt sätt?

Re: Gratis text-tv-app

Postat: 04 feb 2011, 07:36
av David Andersson
nicefinger skrev:Funkar :) Men man får ju bara en sida i taget.
Man får flera sidor om man anger flera argument. Eller om sidan är en fler-sida.
nicefinger skrev:Borde väl gå att bygga på programmet så att man kan navigera på vanligt sätt?
Ja, man skulle kunna bygga på så man t.ex. kan bläddra i terminalen med piltangenterna. T.ex. med modulen curses. Men jag tror det ger mer att bygga ett riktigt grafiskt gränssnitt. Har ännu inte bestämt mej om Tkinter eller pygkt är bäst, och om själva tv-bilden ska vara en canvas- eller textfält-widget.

Sen, hur får man in det i iPhones programförråd (app store)?

Re: Gratis text-tv-app

Postat: 04 feb 2011, 08:27
av David Andersson
David Andersson skrev:Har ännu inte bestämt mej...
Medans man väntar. Ett bash-script som frågar efter sidnummer eller kommandon och anropar mysvttext. Spara filen i ~/bin/mysvttextwrapper
(Förutsätter att mysvttext från första inlägget ovan är sparad i ~/bin/mysvttext)

Kod: Markera allt

#!/bin/bash
#
page=100

while true; do
    mysvttext $page

    while [ -z "$nextpage" ]; do
        read -n 3 -p $'\r'"($page) Enter page number or n/p/q: " cmd
        case "$cmd" in
            q) exit;;
            p|$'\e[B'|$'\e[D') nextpage=$((page-1));;
            n|$'\e[A'|$'\e[C') nextpage=$((page+1));;
            [1-8][0-9][0-9]) nextpage=$cmd;;
            "") ;;
            *) echo " Unrecognized command or number range: $cmd";;
        esac
        case "$nextpage" in
            99|099) nextpage="";;
            900) nextpage="";;
        esac
    done
    page=$nextpage
    nextpage=""
done
När man anger tre-siffrigt sidnummer behöver man inte avsluta med Return. Man kan bläddra med piltangenter eller "p" och "n". Avsluta med "q".

Re: Gratis text-tv-app

Postat: 04 feb 2011, 10:26
av m!rage
David Andersson skrev:---
Det som gör att folk betalar för appen (i princip en webbläsare som bara kan visa SVT Text) är tydligen att den visar ljus text på svart botten. Som på TV.

Det är ju bara löjligt. Folk måste lära sig att program och information är gratis.
---
Förstår du nu varför det ligger så mycket pengar i utveckling för mobila plattformar? Sådant som varit gratis i tiotals år blir folk plötsligt beredda att betala för.

Re: Gratis text-tv-app

Postat: 21 sep 2011, 00:57
av ledoyen
Kan någon förklara steg för steg hur man går till väga för att använda sig av text tv i terminalen?

Räcker det med att spara informationen i en text fil och sedan döpa den till .py?

Re: Gratis text-tv-app

Postat: 23 sep 2011, 16:38
av David Andersson
ledoyen skrev:Kan någon förklara steg för steg hur man går till väga för att använda sig av text tv i terminalen?
  • Skapa en mapp i din hemmamapp som heter "bin" (på unix-språk heter den alltså ~/bin)
  • Om ~/bin inte fanns förut och du just skapade den, så logga ut och logga in igen.
  • Öppna en text-editor och kopiera in programmet från första inlägget, spara som ~/bin/mysvttext (på människospråk alltså som "mysvttext" i mappen "bin" i hemmamappen)
  • Öppna en terminal
  • Sätt exekveringsrättighet på mysvttext, antingen genom att högerklicka filen och gå till rättigheter, eller i en terminal med kommandot chmod +x ~/bin/mysvttext
  • Skriv i terminalen kommandot mysvttext 100
  • Skriv i terminalen kommandot mysvttext 101
  • och så vidare...
ledoyen skrev:Räcker det med att spara informationen i en text fil och sedan döpa den till .py?
Spara en textfil, ja. Men den behöver inte heta .py. Det som gör att datorn förstår att det är python är att första raden börjar med #!/usr/bin/python. Alla program måste ha exekveringsrättigheter, oavsett om det är bython, bash, kompilerad C, eller vadsomhelst. (I princip alltså. Det skulle gå att starta mysvttext utan exekveringsrättigheter med kommandot python ~/bin/mysvttext 100)

Re: Gratis text-tv-app

Postat: 23 sep 2011, 16:45
av David Andersson
David Andersson skrev: Folk måste lära sig att program och information är gratis.
Har upptäckt att den finns gratis text-tv-app för android. Det kanske finns hopp trots allt.

Re: Gratis text-tv-app

Postat: 26 sep 2011, 13:21
av bittin
du kanske kan få med den i: http://cydia.saurik.com/