OTC (since 1.6.9.3) is the app’s own channel list format in JSON, an alternative to M3U:
no quoting problems, and values may be base64-encoded. A marker like (since 1.7.1.3) is the first app version that
reads a field.
Give the file an address ending in .otc or otc.json.
{
"provider": { "epg": "http://example.com/epg.xml.gz", "archive_type": "flussonic", "archive_days": 3 },
"categories": {
"news": { "name": "News", "name:es": "Noticias", "type": "news" }
},
"channels": [
{ "category": "news", "name": "News One", "number": 1, "epg_id": "news1", "icon": "http://example.com/news1.png", "url": "http://example.com/news1/index.m3u8" }
]
}
provider : playlist-wide settings, see below.categories : an object; each key is a category id used by channels.channels : an array of channels.General rules:
"base64": "name,url" in provider lists the fields whose values are base64-encoded (without padding
and line breaks); "*" means all text fields. Put provider first in the file: fields read before it are not
decoded.:xx at the end ("name:es") is used only when the app language is xx
(two-letter code) and is skipped otherwise. Put it after the plain field: the later one wins.base64 : fields encoded in base64, comma-separated, or * for all.epg : address of the XMLTV guide; several as an array or separated by ; (array since 1.6.9.3). See
TV guide (XMLTV).archive_type : archive type, like catchup-type in M3U, see
Archive types.archive_days : days of archive for all channels (number).refresh_minutes : reload the playlist every N minutes (number, 10 or more).refresh_at : reload the playlist once at this moment (since 1.7.2.1), UTC, 2024-12-31T23:59:59Z.max_connections : how many streams one account may play at the same time (number).billed_till : when the account expires, unix time in seconds (number). Shown to the user.user_message : a text about the account (balance or any other note), shown to the user.vod_library : address of a media library in OTV, M3U or XML format (since 1.7.0.1);
an array of addresses for several (since 1.7.1.1).The key of the category in categories is its id.
name : the name shown (required, a category without it is ignored).icon : address of the category icon.adult : true or 1 marks the category as adult: its channels are hidden behind the restrict code.type : the kind of category, which sets its icon and related features (since 1.7.1.3): movie, sport, child,
music, news, adult, game, radio, edu, foreign.Required: name and url.
name : channel name.url : stream address.category : id of a category from categories.number : channel number (number).type : radio for a radio station (since 1.7.2.1); movie / series move the entry to the media library.icon : address of the channel logo.epg_id : the channel’s id in the XMLTV guide (<channel id>).epg_name : the channel’s name in the guide (<display-name>), when it differs and there is no epg_id.epg_shift : shift the guide, in whole hours from -12 to 12, otherwise seconds (number).archive_days : days of archive for this channel (number); 0 means none.archive_source : archive address template, like catchup-source in M3U, see
Archive (catch-up) in playlists.user_agent : the User-Agent header.referrer : the Referer header.headers : extra HTTP headers, either a JSON object {"X-Token":"abc"} (since 1.7.1.4) or a string
name1=value1&name2=value2.drm_type : DRM system: widevine, clearkey or playready (values as for
license_type). Always give it when the channel has DRM.drm_url : license server address (the same forms as a license URL in
license_key, including url|headers|body|response).drm_key : static ClearKey keys: kid:key, kid1:key1,kid2:key2 (since 1.7.5.2), {"kid":"key"} or a JWK set.drm_data : base64 of the stream’s default key id (since 1.7.0.1).codec : the player to use by default, a string or an array in order of preference (since 1.6.9.3); values as for
codec in M3U.audio_track - : audio track to select at start, number from 1 (since 1.7.1.4).video_track - : video track to select at start, number (since 1.7.1.4) or resolution like 1920x1080
(since 1.7.3.2).bl_audio_track - : audio tracks never to use, array or comma-separated string: [1,2] (since 1.7.4.1).bl_video_track - : video tracks never to use, numbers and resolutions: [2,"1920x1080"] (since 1.7.4.1).source_format - : the stream format when the URL does not tell it (since 1.7.1.6): ts, hls, dash (or
mpd), ss (Smooth Streaming), rtsp, rtp, udp.runtime_attr_url : an address requested each time the channel starts, answering with this channel’s data in M3U
or OTC (without base64); works like
#EXTATTRFROMURL. The answer must contain
the stream URL. url is still required in the playlist.seek_preview : address of a thumbnail for the moment the user seeks to, with
template variables like {utc} (since 1.7.5.2).There is no channel-level adult flag in OTC: use an adult category.
{
"provider": {
"epg": "http://example.com/epg.xml.gz",
"archive_type": "shift",
"archive_days": 3
},
"categories": {
"main": {
"name": "General channels",
"name:es": "Generales"
},
"adult": {
"name": "Adult",
"adult": true
}
},
"channels": [
{
"category": "main",
"name": "Sample Channel 1",
"name:es": "Canal de ejemplo 1",
"number": 1,
"epg_id": "sample1",
"icon": "http://example.com/logo/sample1.png",
"url": "http://example.com/live/sample1/index.m3u8"
},
{
"category": "main",
"name": "Sample Channel 2",
"number": 2,
"headers": { "Referer": "http://example.com/" },
"drm_type": "clearkey",
"drm_key": "0123456789abcdef0123456789abcdef:fedcba9876543210fedcba9876543210",
"url": "http://example.com/live/sample2/manifest.mpd"
}
]
}