- Filters — decide which channels survive into a target.
- Mapping — rename, regroup and enrich the channels that pass.
Filter DSL
Filters are string expressions evaluated against each playlist entry.Fields
| Field | Description |
|---|---|
Group | Group/category name |
Title | Channel title |
Name | Channel name |
Caption | Display caption |
Url | Stream URL |
Genre | Genre tag |
Input | Name of the source input |
Type | Content type: live, vod or series |
Operators
| Operator | Meaning |
|---|---|
~ | Regex match |
== | Exact string equals |
!= | String not equals |
AND | Logical AND |
OR | Logical OR |
NOT(...) | Logical NOT |
regex crate. Use (?i) for case-insensitive matching.
For interactive testing, regex101.com works well when the Rust flavour is selected.
Basic examples
Include all channels:Combining operators
Template system
Templates let you name reusable filter fragments and reference them with!name! syntax.
Defining templates
source.yml
Using templates in targets
source.yml
template_path in config.yml to a file or directory of *.yml files:
config.yml
mapping.yml
Rename rules
Simple group/channel renaming is available directly on a target without a full mapper:source.yml
field can be group, title, name or caption. pattern is a Rust regex; new_name supports $1, $2 capture-group references.
Mapper DSL
For complex transformations, define amapping.yml and reference the mapping ID from the target.
Structure of mapping.yml
mapping.yml
source.yml
Playlist field variables
Access playlist fields with the@Field syntax:
| Variable | Description |
|---|---|
@Group | Group name (writable) |
@Caption | Display caption (writable) |
@Title | Title (writable) |
@Name | Channel name (writable) |
@Url | Stream URL |
@Genre | Genre tag |
@Input | Source input name |
@Type | Content type |
@Group, @Caption etc. changes the value in the output.
Built-in functions
| Function | Description |
|---|---|
concat(a, b, ...) | Concatenate strings |
uppercase(s) | Convert to upper case |
lowercase(s) | Convert to lower case |
capitalize(s) | Capitalise first letter |
trim(s) | Strip leading/trailing whitespace |
number(s) | Parse string to number |
first(a, b) | Return first non-null value |
replace(s, pattern, replacement) | Regex replacement |
pad(n, width) | Zero-pad a number |
format(template, ...) | String formatting |
print(s) | Log value for debugging |
template(name) | Expand a named template |
add_favourite(group) | Add channel to a favourite group |
Regex captures
Capture groups from a regex match are accessed with.1, .2 etc.:
match blocks
map blocks
for_each
Iterate over split values or capture groups:Complex mapping example
This script groups French channels into quality and category buckets:Grouping by release year
Counters
Counters append or prepend an incrementing number to a field:mapping.yml
| Field | Description |
|---|---|
filter | Which channels receive the counter |
value | Starting counter value |
field | Target field: group, title, name or caption |
modifier | prefix or suffix |
concat | Separator string between field value and counter |
padding | Minimum digit width (zero-padded) |
Processing order
By default tuliprox applies Filter → Rename → Map. Change this withprocessing_order:
source.yml
frm, fmr, rfm, rmf, mfr, mrf
(f = filter, r = rename, m = map).