Skip to main content

FFS — Full-manual Fetcher & Stitcher: turn a Triumph service manual into an offline PDF

Project description

FFS — Full-manual Fetcher & Stitcher

For F**'s Sake, just let me print my own service manual.*

ffs-triumph turns a Triumph Technical Information service manual — delivered as a JavaScript single-page app you can't download or print — into a single, self-contained, paginated PDF for offline use.

It logs in with your account, finds your motorcycle from your subscription, crawls the whole manual, converts the site's structured content into HTML, inlines the diagrams, and renders a clean PDF with a title page, table of contents, page numbers, and proper page breaks.

Disclaimer. This tool is for owners with legitimate, licensed access archiving their own manual for personal, offline use. You need a valid Triumph Technical Information subscription; it only ever fetches content your account is already entitled to. It is not affiliated with or endorsed by Triumph, and you are responsible for complying with the site's terms of use.

Install

pip install ffs-triumph
ffs install-browser          # one-time: downloads the Chromium build for PDF rendering

(install-browser runs python -m playwright install chromium. You can skip it if you only use --html-only.)

Quick start

# Provide credentials (or you'll be prompted):
export TTI_EMAIL="you@example.com"
export TTI_PASSWORD="..."

ffs build out/

That's it. With one motorcycle on your account and one service manual in your language, no other input is neededffs auto-detects your VIN from your subscription, picks the Service Manual, and writes the PDF to out/.

Not sure what's available? Inspect your account first:

ffs discover                 # lists your VIN(s), product context, and documents

How it figures things out

From just your email + password:

  1. Your bike — read from your subscription's VIN(s). One → used automatically; several → you pick from a menu showing year/model. (Override with --vin.)
  2. Product context — model code/year, serial, engine number and market are looked up from the VIN automatically.
  3. The manual — the single Service Manual document for your language is selected automatically. Use --doc-type "Owner Handbook" for a different type, --all-types to browse everything, or --root-id <id> to pick exactly.

After a successful run it offers to remember your email + bike + manual in ~/.config/ffs-triumph/config.toml (your password is never saved), so the next run is just ffs build out/.

Commands

Command Purpose
ffs build OUTPUT Fetch the manual and render OUTPUT/manual.html + the PDF
ffs discover List your VIN(s), product context, and available documents
ffs list Print the manual's table of contents with topic IDs
ffs audit Verify every topic fetches with non-empty content
ffs install-browser Download the Chromium build needed for PDF rendering

Useful build options

Flag Purpose
--html-only Assemble HTML but skip PDF rendering (no Chromium needed)
--topic ID Only that topic's subtree — fast for previewing
--limit N Render at most N topics
--inline-images Embed images as base64 in one large portable HTML file (default: write to OUTPUT/images/; the PDF is self-contained either way)
--cache-dir DIR Where fetched topics/images are cached (default .cache)
--no-cache Ignore the cache (still writes it)
-v Verbose progress

Credentials come from --email/--password, the TTI_EMAIL/TTI_PASSWORD environment variables, a local .env, the saved config, or interactive prompts — in that order. Every prompt has a corresponding flag, so the tool is fully scriptable / CI-friendly.

Use as a library

from ffs_triumph import TriumphClient, ManualConfig

client = TriumphClient("you@example.com", "password")
vin = client.subscribed_vins()[0]
client.config = ManualConfig.from_product(client.product_search(vin), root_id="<doc id>")
root = client.get_root()          # the manual's table-of-contents tree

License

MIT — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ffs_triumph-0.1.0.tar.gz (58.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ffs_triumph-0.1.0-py3-none-any.whl (20.8 kB view details)

Uploaded Python 3

File details

Details for the file ffs_triumph-0.1.0.tar.gz.

File metadata

  • Download URL: ffs_triumph-0.1.0.tar.gz
  • Upload date:
  • Size: 58.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ffs_triumph-0.1.0.tar.gz
Algorithm Hash digest
SHA256 0159388986a0a1f3294c005c43ff606848c26d3283fa3e53901d74f0f6c4effc
MD5 210fac96c95e8db0ffd89d4da71132b7
BLAKE2b-256 261600d5a89fe4ec9950a434322591e512303ac50a6ee8b1df9f2d9297403e18

See more details on using hashes here.

Provenance

The following attestation bundles were made for ffs_triumph-0.1.0.tar.gz:

Publisher: publish.yml on jerlbaum/ffs-triumph

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ffs_triumph-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: ffs_triumph-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 20.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ffs_triumph-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a27b919ae8b68d8d0d4d61e54a9e1af4fc5f70b9ae2500d80a4b9ee4f4c233e0
MD5 e79653915890548e606328eb17a6832b
BLAKE2b-256 03aedaf96dd7e216c7b99af27ccf83b40b2b6e17e85d7cfd90202b9bb18f575e

See more details on using hashes here.

Provenance

The following attestation bundles were made for ffs_triumph-0.1.0-py3-none-any.whl:

Publisher: publish.yml on jerlbaum/ffs-triumph

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page