Skip to content

Custom Formatter

Viren070 edited this page Jun 17, 2025 · 57 revisions

Here is a complete reference to the custom formatter system

A custom format allows you to fully control the output of the streams. You can test your formats live at the configuration page using the Preview.

When writing your format, you have access to specific objects, known as variables, each with their own properties. The format to access a variable is as follows:

{variableName.propertyName}.

You may also apply specific "modifiers". The available modifiers depend on the type of properties. i.e. strings, numbers, lists, each have their own modifiers.

Variables

Config

Access Type Description
{config.addonName} string The name of the AIOStreams instance (the value of the ADDON_NAME environment variable)

Stream

Access Type Description
{stream.proxied} boolean Whether the stream is proxied using MediaFlow proxy
{stream.filename} string Filename of the stream or media file
{stream.folderName} string The folder name of the stream, usually only available to specific addons.
{stream.size} number Size of the stream/file in bytes
{stream.library} boolean Whether the stream is considered to be a stream from a personal library (e.g. debrid account
{stream.quality} string Quality indicator of the stream
{stream.resolution} string Video resolution (e.g., "1080p", "4K")
{stream.languages} string[] Available audio/subtitle languages
{stream.languageEmojis} string[] Available audio/subtitle languages in emoji form
{stream.visualTags} string[] Tags related to video characteristics
{stream.audioTags} string[] Tags related to audio characteristics
{stream.releaseGroup} string Name of the group that released the content
{stream.regexMatched} string The name of the highest sort regex that was matched
{stream.encode} string Encoding format (e.g., "x264", "HEVC")
{stream.indexer} string Source indexer that provided the stream
{stream.title} string The title of the movie or show, extracted from the filename
{stream.year} string Any year contained in the filename
{stream.seasonEpisode} string[] A list of pre-formatted season and episode strings, e.g. ['S01', 'E201']
{stream.season} number The season number
{stream.seasons} number[] A list of seasons detected for multi-season packs
{stream.episode} number The episode number
{stream.seeders} number Number of seeders (for torrents)
{stream.age} string Age of the stream since release
{stream.duration} number Duration of the media in seconds
{stream.infoHash} string Info hash for torrent streams
{stream.message} string Additional information or status message

Service

Access Type Description
{service.id} string Unique identifier of the service (e.g. realdebrid)
{service.shortName} string Abbreviated name of the service (e.g. RD)
{service.name} string Full name of the provider (e.g. Real-Debrid)
{service.cached} boolean Whether the stream is cached

Addon

Access Type Description
{addon.presetId} string The ID of the preset that the addon was generated from
{addon.name} string Display name of the addon
{addon.manifestUrl} string The manifest URL of the addon

Debug

Access Type Description
{debug.json} string Raw JSON string representation of data
{debug.jsonf} string Formatted JSON string representation of data

Modifiers

String Modifiers

  • ::upper - Convert string to uppercase
  • ::lower - Convert string to lowercase
  • ::title - Title case the string (capitalise the first letters)
  • ::length - Return the length of the string
  • ::reverse - Reverses the string

Number Modifiers

  • ::bytes - Format number as bytes with appropriate unit (KB, MB, GB)
  • ::time - Format number of seconds as human-readable time
  • ::hex - Encode the number to hex
  • ::octal - Encode the number to octal
  • ::binary - Encode the number to binary

Array Modifiers

  • ::join('separator') - Join array elements with specified separator
  • ::length - Return the number of elements in the array
  • ::first - Return the first element of the array
  • ::last - Return the last element of the array

Conditional Modifiers

To use conditional modifiers, you need to add them after the variable with a double colon ::, like normal modifiers but with a different format: {variableName.property::conditionalModifier["trueString"||"falseString"]}.

For example, to show the seeders if greater than 1, you would do the following:

  • {stream.seeders::>1["{stream.seeders}"||""]}
Modifier Description Types Variables
istrue If the boolean is true boolean None
isfalse If the boolean is false boolean None
exists Whether the element exists string, array None
$X If the string starts with X string X = string
^X If the string ends with X string X = string
~X If the string/array includes X string, array X = string
=X If the value equals to X string, number X = string or number
>=X If the number is greater or equal to X number X = number
>X If the number is greater than X number X = number
<=X If the number is lesser or equal to X number X = number
<X If the number is lesser than X number X = number

Note

The istrue and isfalse modifiers returns false when the property is null. Therefore, you must use two conditional modifiers when wanting to show an output depending on whether a value is true or false but not null.

Tools

You also have a few formatting tools available through the following syntax:

{tools.toolName}

Access Description
{tools.newLine} Will add a newline wherever placed. Use this when you want an empty line.
{tools.removeLine} Will remove the entire line wherever found

Examples

If you would like to see some examples of formatters, join the Discord Server to see all the formats that have been created by the community.

You may also see the definitions for the built-in formatters at https://github.com/Viren070/AIOStreams/blob/main/packages/core/src/formatters/predefined.ts

Clone this wiki locally