xmltv
A high-performance Rust library and CLI tool for parsing, filtering, and generating XMLTV Electronic Program Guide (EPG) files. It leverages serde for robust serialization and deserialization of the XMLTV standard.
Features
xmltv library
It is minimalistic, it contains XMLTV struct so you can use them through serde and some utility functions.
It also flatten some elements like <new/> to be a boolean in order to avoid boilerplate.
CLI
- Fast Parsing: Efficiently handles large XMLTV files using quick-xml.
- Flexible Filtering: Filter by channel IDs, time slots (with day-of-week support), and keyword searches.
- Data Minimization: Remove heavy elements like credits, icons, or descriptions to reduce file size.
- Multi-Format Export: Convert XMLTV to JSON, iCal (ICS), Atom Feed, or JSON Feed.
- Timezone Aware: Shift or normalize timestamps to UTC or local time.
- Deteriministic IDs: Generates stable UUID v8 identifiers for programs based on content hashing.
Installation
# Clone and build the CLI
Usage
Command line interface (CLI)
The CLI allows you to process EPG data from local files or multiple merged sources.
Install it with cargo install xmltv or with the binaries.
Options
-c <CHANNEL LIST>or--channels=<CHANNEL LIST>: channels you want to keep, ie:-c tf1,m6,Arte. You can also check them with the TUI using-c ?--cleanse <ITEM LIST>: items you want to remove form the XMLTV file. I made this option because, in XMLTV file there are a lot of data and we don't need all of them and we may want to reduce the size of the file. Available items are:credits: remove all credits. If you want to remove some of them, use:directorsactorswritersadaptersproducerscomposerseditorspresenterscommentatorsguests
categoriesnewcountrieskeywordssub-titleslanguagesvideosaudiossubtitleslast-chancesdescriptionsdatesorigin-languageslengthpremierespreviously-shownsratingsstar-ratingsreviewsimagesepisode-numsiconsurls
-d NUMBERor--days NUMBER: number of days in the EPG to keep (from today)-l <FILE>or--load <FILE>: load configuration from a JSON file-m <FILE>or--merge <FILE>: merge another XMLTV file (can be used multiple times to merge several files)-s <QUERY>or--search <QUERY>: search programmes by title (case-insensitive)-t <TZ>or--timezone <TZ>: output timezone for programme times. Values:utc(default),local(system timezone), or offset like+0100-f <FORMAT>or--format <FORMAT>: output format:xml(default),json,ical,atom,jsonfeed--epg: display the EPG in a terminal UI
Example
Basic Filtering and Conversion
# Convert XMLTV to JSON for the next 3 days, keeping only specific channels
Advanced Time Slots: filter programs based on when you actually watch TV.
# Keep programs on weekdays from 6 PM to 11 PM and all day on weekends
Merging and Cleaning
# Merge two sources and remove heavy metadata to save space
Creating Calendar Reminders
# Search for "Football" and export as an iCal file
Library
use FromStr;
use from_str;
use to_string_with_root;
use *;
To serialize big files, you can look into tests/from_files.rs::test_programmes_from_files.
It reads programmes one by one without loading everything in RAM.
Ressources
XMLTV DTD is here: https://github.com/XMLTV/xmltv/blob/master/xmltv.dtd