个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Turns RSS feeds into numbered text lines and JPG images for TV tickers and playout graphics. By OnAir Garage.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Downloads RSS feeds on a schedule and turns each one into numbered text lines and JPG images for TV tickers and playout graphics. Free desktop app (Electron) from OnAir Garage.
• Tool page: https://onairgarage.com/tools/ticker-feed-builder/
• Author: Graziano Melzi · OnAir Garage — [email protected]
• License: MIT (see LICENSE)
• Systems: Windows (installer), macOS (dmg, Apple silicon and Intel), Linux (AppImage, x64). Built for all three; only macOS has been run so far (see Validation).查看完整 README ↗Downloads RSS feeds on a schedule and turns each one into numbered text lines and JPG images for TV tickers and playout graphics. Free desktop app (Electron) from OnAir Garage.
LICENSE)Ticker-Feed-Builder-Manual-EN-<version>.pdf), Italian (-IT-) and Spanish (-ES-); the source is in docs/manual/ (python3 docs/manual/build.py <version> <folder> makes the PDFs; it needs Chrome or Chromium).Screenshots use invented demo feeds, taken from the real app (version 26.10.9, running on Linux; dark and light themes).
It replaces the rss_ticker_downloader.py scripts that fed NeMedia Morpheus from Windows Task Scheduler. The app lives in the tray, runs 24/7 and, for every feed of every profile, writes:
| File | Content |
|---|---|
<Name>_Title.Txt | one headline per line |
<Name>_Description.Txt | one description per line, same order |
<Name>/00001.JPG, 00002.JPG… | one JPG per story, same order |
<Name>_metadata.json | counters of the last run (optional) |
- (configurable); a missing or unreadable image becomes the placeholder image.{folder}), image number start/digits/extension, JPEG quality, optional resize (fill or fit), title/description length limits.ETag / Last-Modified; answer 304 = nothing is downloaded). If the server cannot say, the feed is downloaded and its content compared with the previous copy (same content = no image download, no file touched). Images are downloaded and files written only when something is new; a failed image is retried at the next check, and a deleted output file or an edited setting triggers a rebuild. "Run now" always rebuilds everything.The default layout is the one the original scripts produced for NeMedia Morpheus. It has not been checked against NeMedia documentation (none was read); other ticker systems may need other names, encodings or sizes, which is why everything is configurable.
A feed that is free to download is not necessarily free to broadcast. Publishers usually offer RSS for personal reading; showing their headlines publicly on TV, screens or websites normally needs an agreement with the publisher. That responsibility is the user's; this is not legal advice. The app ships without any feed; the examples below come from the pages read on 8 October 2026 (paraphrased; the pages carry no version or date, so read the current text before relying on it).
| Publisher | What its RSS page says | Page |
|---|---|---|
| ANSA | Non-commercial use by individuals and non-profit organisations, only to view the feeds in RSS reader programs; using them to publish the latest headlines on websites or blogs is not allowed; any other use must be requested and expressly authorised. | https://www.ansa.it/sito/static/ansa_rss.html |
| Adnkronos | Non-commercial use by individuals and non-profit organisations; the feeds may not be made public (websites, blogs, outdoor communication systems, any other means that spreads the news publicly) without a prior agreement with Adnkronos. | https://www.adnkronos.com/rss |
Both pages list their feeds by section (politics, foreign news, sport…); use them as examples of what to ask for in an agreement.
No measurements or standards-based formulas. The external rules used:
| Value / rule | Source | Status |
|---|---|---|
RSS 2.0 item fields (title, description, enclosure), Atom entry, Media RSS media:content / media:thumbnail | feed formats as found in the feeds themselves (Adnkronos, ANSA); no specification was read for this release | recommended (practice, not verified against the specifications) |
Characters not allowed in a file name, reserved names (CON, PRN, NUL, COM1…) | Microsoft Learn, Naming Files, Paths, and Namespaces — same rules as in File Renamer | official (read in the File Renamer project, not re-read for this release) |
| Default output layout and file names | original scripts v3.2 supplied by the author | reference implementation |
Telegram sendMessage | Telegram Bot API | not re-read for this release |
| SMTP submission (STARTTLS / TLS), Bcc | nodemailer library defaults; no RFC read for this release | recommended (practice) |
| Terms of use of the ANSA and Adnkronos RSS feeds | the two RSS pages above | official (read 2026-10-08, summarised) |
Results as of October 2026.
| Reference | What it validates | Result | How to re-run |
|---|---|---|---|
| Automated tests (82) | text cleaning, text changes (replacements, capital letters, text before / after, own limits), the ad-hoc signature hook, RSS/Atom parsing, line/image sync, empty values, orphan removal, unchanged files, change detection (304, same content, failed-image retry, deleted output, per-feed interval), WebP/AVIF decoding, time windows, filters, merged feeds, duplicates across feeds, file check, remembered state, frozen-feed alert, daily summary, headless CLI, failure keeps old files, missing folder not created, private image addresses, scheduler, alerts | pass | npm test |
| Original Python script v3.2 on 8 live feeds (2026-10-08, macOS; a one-off development check with the feeds the script used, not part of the app) | same titles and descriptions as the original for the same feeds | 14 of 16 text files byte-identical; the other 2 differ only because the feeds changed between the two runs (stories shifted by one); one title carried an invisible BOM character in the original, which the app removes | run both on the same feeds and compare (cmp) |
| Same run | number of images per feed | equal for all 8 feeds | same |
| End-to-end on the real Electron app (macOS; Linux for the 26.10.10 interface) | create profile, run, files on disk, status in the UI, language switch, Settings tabs, show / hide password, backup box, Help & About, feed options, no console errors | pass | node dev/e2e-electron.mjs [screenshotDir] |
Not validated: WebP/AVIF with real-world files from publishers (only synthetic images in the tests); the headless mode on Windows and as a service; playback in NeMedia Morpheus or any other ticker system; Linux on a real desktop; runs lasting days; Telegram and email delivery against real services (unit-tested with fakes; the email envelope is checked with the real Nodemailer message builder, not with a mail server); Windows-1252 output beyond a unit test. Opening the ad-hoc signed app on an Apple Silicon Mac (only the build job checks the signature; the author tries the preview by hand); a click on the tip jar opening the system browser on Windows and macOS; the text changes on a live ticker. This is not a certified tool.
| Document | Version read |
|---|---|
| RSS 2.0 specification, Atom (RFC 4287), Media RSS | not read for this release |
| Telegram Bot API | not read for this release |
| SMTP (RFC 5321 / 6409) | not read for this release |
| NeMedia Morpheus manual (expected file layout) | not read |
ANSA RSS page (ansa.it/sito/static/ansa_rss.html) | read 2026-10-08, no version or date on the page |
Adnkronos RSS page (adnkronos.com/rss) | read 2026-10-08, no version on the page |
npm install
npm start # the app
npm test # unit tests (Node 20+)
node dev/e2e-electron.mjs # end-to-end on the real app
npm run dist:mac # or dist:win / dist:linux
src/cli.js runs the same engine, schedules, filters, alerts (Telegram, email) and daily summary without a window or tray (no desktop notifications).
node src/cli.js --settings exported-settings.json --data ./tfb-data # runs until stopped (Ctrl+C)
node src/cli.js --settings exported-settings.json --data ./tfb-data --once # one run, then exit
The installed app can run it without Node.js: ELECTRON_RUN_AS_NODE=1 "<app executable>" "<resources>/app.asar/src/cli.js" --settings … --data … (the exact command for this computer is shown in Settings → Headless mode). --once exits with 0 (all feeds fine), 1 (some problem) or 2 (settings unusable). Use the file written by "Export settings"; it contains no secrets, so set TFB_TELEGRAM_TOKEN and TFB_SMTP_PASS in the environment. The file is read again every 30 seconds. On Windows start it with Task Scheduler at startup ("run whether the user is logged on or not"), on Linux with a systemd service, on macOS with launchd. Logs and the remembered state go to the --data folder.
main.js, preload.cjs — Electron main process and bridge.src/ — the engine, independent of Electron: engine.js (download → filter → convert → write → check), runtime.js (engine + scheduler + alerts + summary + remembered state, shared by the app and the headless mode), cli.js, feed.js, filters.js, schedule-rules.js, digest.js, text.js, image.js, image-modern.js, output.js, format.js, http.js, scheduler.js, notify.js, messages.js, settings.js, logger.js, updater.js, secrets.js (the one list of every secret) and backup.js (the backup file and its import). updater.js, secrets.js and backup.js start with // garage-common: <name> <version>: they are copies of modules shared by the OnAir Garage apps.renderer/ — the interface (strict CSP, no inline scripts or styles, no CDN, system fonts).assets/ — the logo as SVG (logo.svg app icon, tray.svg single-colour menu-bar glyph), the generated icons and the built-in placeholder. node dev/make-icons.mjs regenerates every icon from the two SVGs (needs Playwright with a Chromium; see the top of the script).dev/ — tests, end-to-end script, icon and placeholder generators.Versions are YY.M.N (e.g. 26.10.1), tags vYY.M.N.
fast-xml-parser (MIT), jimp (MIT), iconv-lite (MIT), nodemailer (MIT-0), @jsquash/webp and @jsquash/avif (Apache-2.0), Electron (MIT). No fonts are bundled.
src/cli.js): the same engine without a window, for a server or a machine that must update the ticker after a restart before anyone logs in. See "Headless mode" below.[Ticker Feed Builder · installation name] (Settings, General; default the computer name).SHA256SUMS.txt, start with the computer, keep-awake option.SHA256SUMS.txt. Close and install is refused while a profile is running, saves a safety copy of the settings first (last 3 kept) and starts the installer (Windows), opens the disk image (macOS) or shows the AppImage (Linux). A What's new window shows once after an update. Nothing installs without a click.ticker-feed-builder-backup-YYYY-MM-DD.json with profiles, feeds, formats and settings. The box Include passwords and tokens is off by default; ticked, the SMTP password, the Telegram token and feed credentials (user:password@) are written in plain text (red warning) and the file is created with mode 0600. Import replaces everything or adds only the missing profiles, keeps a password already on the computer when the mail server and user are the same, and lists what must be typed again. Alert state, check history, logs and window position are never in a backup.search → replace with, one per line, plain text, capital letters count), ALL CAPITALS / lowercase / only the first letter capital, a text before and/or after the title (e.g. ANSA – ), own title and description limits. Applied just before the length limits (order: replacements, capital letters, text before / after, length limit with "…" at the end of a word); the test dialog shows the result. Off by default; no regular expressions.xattr -cr "/Applications/Ticker Feed Builder.app" && codesign --force --deep -s - "/Applications/Ticker Feed Builder.app".