{"id":15671700,"url":"https://github.com/defgsus/teletext-archive-2024","last_synced_at":"2026-02-13T15:03:10.519Z","repository":{"id":214883722,"uuid":"737586018","full_name":"defgsus/teletext-archive-2024","owner":"defgsus","description":"daily commits of german teletext pages ","archived":false,"fork":false,"pushed_at":"2024-10-29T08:23:29.000Z","size":797638,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-10-29T09:43:48.207Z","etag":null,"topics":["archive","teletext"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/defgsus.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-12-31T16:22:05.000Z","updated_at":"2024-10-29T08:23:33.000Z","dependencies_parsed_at":"2023-12-31T17:27:08.301Z","dependency_job_id":"97fc3fdb-27c7-4eb3-89b3-54d70bc59154","html_url":"https://github.com/defgsus/teletext-archive-2024","commit_stats":{"total_commits":851,"total_committers":2,"mean_commits":425.5,"dds":0.001175088131609825,"last_synced_commit":"88972950222436601f1857fb101181c4da8944d3"},"previous_names":["defgsus/teletext-archive-2024"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/defgsus%2Fteletext-archive-2024","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/defgsus%2Fteletext-archive-2024/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/defgsus%2Fteletext-archive-2024/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/defgsus%2Fteletext-archive-2024/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/defgsus","download_url":"https://codeload.github.com/defgsus/teletext-archive-2024/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248863005,"owners_count":21173914,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["archive","teletext"],"created_at":"2024-10-03T15:04:42.275Z","updated_at":"2026-02-13T15:03:05.450Z","avatar_url":"https://github.com/defgsus.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# archive of (german) online teletexts\n\nOr *videotext*, as we used to call it. \n\n[![Scraper](https://github.com/defgsus/teletext-archive-2024/actions/workflows/scraper.yml/badge.svg)](https://github.com/defgsus/teletext-archive-2024/actions/workflows/scraper.yml)\n\nThis repo uses github actions to scrape teletext pages from \nweb sources and converts the html into easy digestible json/unicode files. \n\nThe data is stored in [docs/snapshots](docs/snapshots) in a new-line \ndelimited json file for each station. \n\n\n### scraped stations:\n\n| station                               | since      | type               | link                                              |\n|:--------------------------------------|:-----------|:-------------------|:--------------------------------------------------|\n| ✔ [3sat](docs/snapshots/3sat)         | 2022-01-28 | html with font-map | https://blog.3sat.de/ttx/                         |\n| ✔ [ARD](docs/snapshots/ard)           | 2022-01-28 | html               | https://www.ard-text.de/                          |\n| ✔ [NDR](docs/snapshots/ndr)           | 2022-01-27 | html               | https://www.ndr.de/fernsehen/videotext/index.html |\n| ✔ [n-tv](docs/snapshots/ntv)          | 2022-01-28 | json               | https://www.n-tv.de/mediathek/teletext/           |\n| ✔ [SR](docs/snapshots/sr)             | 2022-01-28 | html               | https://www.saartext.de/                          |\n| ✔ [WDR](docs/snapshots/wdr)           | 2022-01-28 | html               | https://www1.wdr.de/wdrtext/index.html            |\n| ✔ [ZDF](docs/snapshots/zdf)           | 2022-01-27 | html               | https://teletext.zdf.de/teletext/zdf/             |\n| ✔ [ZDFinfo](docs/snapshots/zdf-info)  | 2022-01-27 | html               | https://teletext.zdf.de/teletext/zdfinfo/         |\n| ✔ [ZDFneo](docs/snapshots/zdf-neo)    | 2022-01-27 | html               | https://teletext.zdf.de/teletext/zdfneo/          |\n\n\n### :star: view it :star:\n\nSetup a python env, install `requirements.txt` and call `python show.py`.\n\n![console screenshot](docs/img/console-screenshot.png)\n\nYou can browse pages *horizontally* and *vertically*, \nmeaning **through history**.\nThe snapshots are loaded from the git repo in the back. There are about\n3 snapshots per day.\n\n![animated weather](docs/img/weather.gif) ![animated soccer table](docs/img/sports.gif)\n\n![animated stocks](docs/img/stocks.gif) ![animated air quality table](docs/img/air-quality.gif)\n\n\n### format\n\nEach line is one complete json object. \nEach file starts with a simple line like this. All timestamps are UTC.\n```json\n{\"scraper\":\"3sat\",\"timestamp\":\"2022-02-05T04:09:36\"}\n```\n\nThen each page starts like this:\n```json\n{\"page\":100,\"sub_page\":1,\"timestamp\":\"2022-02-05T04:09:36\"}\n```\n\nand is followed by lines of content like this:\n```json lines\n[[\"wb\",\"  \"],[\"rb\",\"🬦🬚🬋🬋🬩🬚🬹 \"],[\"bb\",\"🬞🬭🬏 🬭🬭 🬻🬭                     \"]]\n[[\"wb\",\"  \"],[\"rb\",\"▐█🬱🬵🬆🬵█ \"],[\"bb\",\"█🬒🬎🬉🬆🬨▌█🬂 \"],[\"rb\",\"                    \"]]\n[[\"wb\",\"  \"],[\"rb\",\"▐█🬝🬟🬜██ \"],[\"bb\",\"🬁🬬🬱🬞🬜🬬▌█  \"],[\"rb\",\"                    \"]]\n[[\"wb\",\"  \"],[\"rb\",\"▐█🬬█🬱🬁█ \"],[\"bb\",\"🬬🬹🬝🬉🬺🬜▌🬬🬜 \"],[\"rb\",\"                    \"]]\n[[\"wb\",\"  \"],[\"rb\",\"▐🬲🬁🬎🬎🬞█                               \"]]\n[[\"wb\",\"  \"],[\"rb\",\"🬉🬎🬌🬋🬋🬎🬎                               \"]]\n[[\"wb\",\"  \"],[\"rb\",\"🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂🬂 \"]]\n[[\"wb\",\"  \"],[\"rb\",\"502 \"],[\"bb\",\"Köln will Benin-Bronzen           \"]]\n[[\"wb\",\"  \"],[\"rb\",\"    \"],[\"bb\",\"zurückgeben                       \"]]\n[[\"wb\",\"  \"],[\"rb\",\"401 \"],[\"bb\",\"Wetterwerte und Prognosen         \"]]\n[[\"wb\",\"  \"],[\"rb\",\"525 \"],[\"bb\",\"Theater und Konzerte Österreich   \"]]\n[[\"wb\",\"  \"],[\"rb\",\"555 \"],[\"bb\",\"Buchtipps und Literatur           \"]]\n[[\"wb\",\"  \"],[\"rb\",\"🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭🬭 \"]]\n[[\"wb\",\"    \"],[\"rb\",\"Jetzt in 3sat                       \"]]\n[[\"wb\",\"  \"],[\"rb\",\"  \"],[\"wb\",\"04:39 Kurzstrecke mit Pierre M.     \"]]\n[[\"wb\",\"  \"],[\"rb\",\"        \"],[\"wb\",\"Krause ................. 343  \"]]\n[[\"wb\",\"  \"],[\"rb\",\"  \"],[\"wb\",\"05:01 Kurzstrecke mit Pierre M.     \"]]\n[[\"wb\",\"  \"],[\"rb\",\"        \"],[\"wb\",\"Krause ................. 344  \"]]\n[[\"wb\",\"                                        \"]]\n[[\"wb\",\"  \"],[\"rb\",\"🬋🬋🬋 \"],[\"bb\",\"Nachrichten     200 Sport         \"]]\n[[\"wb\",\"  \"],[\"bb\",\"112 Deutschland     300 Programm      \"]]\n[[\"wb\",\"  \"],[\"bb\",\"150 Österreich      400 Wetter/Verkehr\"]]\n[[\"wb\",\"  \"],[\"bb\",\"151 Schweiz         500 Kultur        \"]]\n[[\"wb\",\"                                        \"]]\n[[\"wb\",\"                                        \"]]\n```\n\nEach content line consists of one or several blocks with color and text.\nThe two-letter color code represents foreground and background colors\n(**b**lack, **r**ed, **g**reen, b**l**ue, **m**agenta, **c**yan, **w**hite).\n\nA third argument might be in one block which would then be a link to another table:\n```json lines\n[[\"wb\", 101, \"Seite 101\"]]\n[[\"wb\", [101, 5], \"Seite 101/5\"]]\n```\n\nIf you can see the graphic blocks in the above example you have a font \ninstalled that supports the unicode\n[symbols for legacy computing](https://en.wikipedia.org/wiki/Symbols_for_Legacy_Computing)\nstarting at `0x1bf00`. If not, you can install a font like \n[unscii](http://viznut.fi/unscii/).\n\nThe original character codes from the teletext pages are converted to \nthe unicode mappings via \n[these tables](https://en.wikipedia.org/wiki/Teletext_character_set#Graphics_character_sets).\n\n\n### technicals\n\n- Scraping is currently done about every 8 hours. I'd love to leave this\nrunning **forever** but need to watch the growing repository size. \nThe [alpha version](https://github.com/defgsus/teletext-archive) exploded\nin only a few weeks time.\n\n- To walk the historical commits look at file \n  [docs/snapshots/zdf.ndjson](docs/snapshots/zdf.ndjson). It's been there\n  since the beginning. For example, to list all commit timestamps and hashes:\n  ```shell script\n  git log --reverse --pretty='%aI %H' -- docs/snapshots/zdf.ndjson\n  ```\n  (However, the first 50 or so commits are replayed from another repo and the \n  timestamps do not fit the snapshot timestamps.) \n  \n  A more convenient way is to read the contents of \n  [docs/snapshots/_timestamps.ndjson](docs/snapshots/_timestamps.ndjson) \n  which holds each snapshot commit hash and the actual snapshot timestamp.\n  \n  Knowing the commit hashes, one can read the files of each commit via:\n  ```shell script\n  git archive \u003chash\u003e docs/snapshots \u003e files.tar\n  ```\n  Each file contains the actual timestamp of the snapshot. \n  \n- Not all special characters are decoded for each station. Currently they\nare replaced by `?`.  \n\n- Before 2022-02-21, the ZDF recordings have an encoding problem which i couldn't \ncorrectly fix afterwards. Parsing the ndjson files will actually result in \nsome json decoding errors because of a spooky sequence like `96 c2 00 0a` after\nthe letter 'Ö'. Ignoring json errors and skipping those lines works. You'll just\nmiss some lines in the page content. However, other stupid character sequences\nare in there as well and some lines might have more than 40 characters. \nAlso the block graphics might be expurgated. \n\n\n### related stuff\n\nOh boy, look what else exists on the web: \n\n- https://archive.teletextarchaeologist.org\n- http://teletext.mb21.co.uk/\n- https://www.teletextart.com/\n- https://galax.xyz/TELETEXT/\n- https://zxnet.co.uk/teletext/viewer/\n\n\n## TODO\n\n- there is at least one other character set with thinner box graphics. \n  it's not supported by unicode but it would be good to store \n  at least the charset switch\n- unrecognized chars on **NTV 218**\n- ZDF scraper report in commit message only shows *pages added*\n\n\n## TODO other sites\n    \n- **SWR** https://www.swrfernsehen.de/videotext/index.html\n\n  They only deliver gif files, boy!\n    \n- **KIKA** https://www.kika.de/kikatext/kikatext-start100.html\n\n  Images once more\n    \n- **Seven-One** https://www.sevenonemedia.de/tv/portfolio/teletext/teletext-viewer\n  \n  This is the Pro7/Sat1 empire. They have **a lot** of channels. All images :(\n\n- **VOX** https://www.vox.de/cms/service/footer-navigation/teletext.html\n\n  Requires .. aehm ... Flash :rofl:\n\n\n### beyond the borders\n\n- **CT** https://www.ceskatelevize.cz/teletext/ct/\n\n  Images\n\n- **Swiss Teletext** https://mobile.txt.ch/  \n  \n  Does not really seem to work - with my script-blockers anyways\n\n- **SRF** https://www.teletext.ch/\n\n  Images\n\n- **ORF** https://teletext.orf.at/\n\n  JSON API delivering ... image-urls\n\n- **HRT** https://teletekst.hrt.hr/\n\n  Images\n  \n- **RTVSLO** https://teletext.rtvslo.si/\n\n  Images\n  \n- **NOS** https://nos.nl/teletekst\n\n- **Supersport** https://www.supersport.hr/teletext/661\n\n- **RTVFBiH** https://teletext.rtvfbih.ba/\n\n  Images\n  \n- **??** https://www.teletext.hu/\n\n  Many things i cannot read\n\n- **TRT** https://www.trt.net.tr/Kurumsal/Teletext.aspx\n\n  Not getting it to work\n  \n- **Markiza** https://markizatext.sk/\n  \n  Not getting it to work, either\n  \n- **RTP** https://www.rtp.pt/wportal/teletexto/\n\n  Images\n  \n- **SVT** https://www.svt.se/text-tv/101\n\n  Images\n  \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdefgsus%2Fteletext-archive-2024","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdefgsus%2Fteletext-archive-2024","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdefgsus%2Fteletext-archive-2024/lists"}