========================================================================= TiviMate M3U/HLS Parser - Regex Patterns (v5.3.3 decompiled) Source: C4409.java (ar.tvplayer.tv) ========================================================================= === CORE M3U PATTERNS === // EXTINF duration + channel name Pattern.compile("#EXTINF:\\s*([\\d\\.]+)\\b") // duration Pattern.compile("#EXTINF:[\\d\\.]+\\b,(.+)") // channel name // HLS Playlist tags Pattern.compile("#EXT-X-TARGETDURATION:(\\d+)\\b") Pattern.compile("#EXT-X-MEDIA-SEQUENCE:(\\d+)\\b") Pattern.compile("#EXT-X-VERSION:(\\d+)\\b") Pattern.compile("#EXT-X-PLAYLIST-TYPE:(.+)\\b") Pattern.compile("#EXT-X-BYTERANGE:(\\d+(?:@\\d+)?)\\b") Pattern.compile("#EXT-X-KEY") === HLS VARIANT/STREAM PATTERNS === Pattern.compile("AVERAGE-BANDWIDTH=(\\d+)\\b") Pattern.compile("[^-]BANDWIDTH=(\\d+)\\b") Pattern.compile("CODECS=\"((?:.|\\f)+?)\"") Pattern.compile("RESOLUTION=(\\d+x\\d+)") Pattern.compile("FRAME-RATE=([\\d\\.]+)\\b") Pattern.compile("VIDEO-RANGE=(SDR|PQ|HLG)") Pattern.compile("VIDEO=\"((?:.|\\f)+?)\"") Pattern.compile("AUDIO=\"((?:.|\\f)+?)\"") Pattern.compile("SUBTITLES=\"((?:.|\\f)+?)\"") Pattern.compile("CLOSED-CAPTIONS=\"((?:.|\\f)+?)\"") Pattern.compile("CHANNELS=\"((?:.|\\f)+?)\"") Pattern.compile("SUPPLEMENTAL-CODECS=\"((?:.|\\f)+?)\"") === HLS MEDIA RENDITION PATTERNS === Pattern.compile("TYPE=(AUDIO|VIDEO|SUBTITLES|CLOSED-CAPTIONS)") Pattern.compile("GROUP-ID=\"((?:.|\\f)+?)\"") Pattern.compile("NAME=\"((?:.|\\f)+?)\"") Pattern.compile("LANGUAGE=\"((?:.|\\f)+?)\"") Pattern.compile("DEFAULT") Pattern.compile("AUTOSELECT") Pattern.compile("FORCED") Pattern.compile("CHARACTERISTICS=\"((?:.|\\f)+?)\"") Pattern.compile("INSTREAM-ID=\"((?:CC|SERVICE)\\d+)\"") === HLS ENCRYPTION PATTERNS === Pattern.compile("METHOD=(NONE|AES-128|SAMPLE-AES|SAMPLE-AES-CENC|SAMPLE-AES-CTR)\\s*(?:,|$)") Pattern.compile("URI=\"((?:.|\\f)+?)\"") Pattern.compile("IV=([^,.*]+)") Pattern.compile("KEYFORMAT=\"((?:.|\\f)+?)\"") Pattern.compile("KEYFORMATVERSIONS=\"((?:.|\\f)+?)\"") === HLS DATE RANGE / SCTE PATTERNS === Pattern.compile("START-DATE=\"((?:.|\\f)+?)\"") Pattern.compile("END-DATE=\"((?:.|\\f)+?)\"") Pattern.compile("PLANNED-DURATION=([\\d\\.]+)\\b") Pattern.compile("CUE=\"((?:.|\\f)+?)\"") Pattern.compile("CLASS=\"((?:.|\\f)+?)\"") === HLS PARTIAL SEGMENT PATTERNS === Pattern.compile("TYPE=(PART|MAP)") Pattern.compile("DURATION=([\\d\\.]+)\\b") Pattern.compile("[:,]DURATION=([\\d\\.]+)\\b") Pattern.compile("PART-TARGET=([\\d\\.]+)\\b") Pattern.compile("INDEPENDENT") Pattern.compile("GAP") Pattern.compile("BYTERANGE=\"(\\d+(?:@\\d+)?)\\b\"") Pattern.compile("BYTERANGE-START=(\\d+)\\b") Pattern.compile("BYTERANGE-LENGTH=(\\d+)\\b") === HLS SKIP / DELTA UPDATE PATTERNS === Pattern.compile("CAN-SKIP-UNTIL=([\\d\\.]+)\\b") Pattern.compile("CAN-SKIP-DATERANGES") Pattern.compile("SKIPPED-SEGMENTS=(\\d+)\\b") Pattern.compile("[:|,]HOLD-BACK=([\\d\\.]+)\\b") Pattern.compile("PART-HOLD-BACK=([\\d\\.]+)\\b") Pattern.compile("CAN-BLOCK-RELOAD") === HLS VARIABLE SUBSTITUTION === Pattern.compile("\\{\\$([a-zA-Z0-9\\-_]+)\\}") Pattern.compile("VALUE=\"((?:.|\\f)+?)\"") Pattern.compile("IMPORT=\"((?:.|\\f)+?)\"") === HLS CUSTOM TAGS === Pattern.compile("\\b(X-[A-Z0-9-]+)=") Pattern.compile("X-ASSET-URI=\"((?:.|\\f)+?)\"") Pattern.compile("X-ASSET-LIST=\"((?:.|\\f)+?)\"") Pattern.compile("X-RESUME-OFFSET=(-?[\\d\\.]+)\\b") Pattern.compile("X-PLAYOUT-LIMIT=([\\d\\.]+)\\b") Pattern.compile("X-SNAP=\"((?:.|\\f)+?)\"") Pattern.compile("X-RESTRICT=\"((?:.|\\f)+?)\"") Pattern.compile("X-CONTENT-MAY-VARY=\"((?:.|\\f)+?)\"") ========================================================================= HOW TO USE: These patterns parse M3U8/HLS playlists. The key ones for IPTV M3U parsing are: - EXTINF patterns -> duration + channel name - tvg-* attributes -> ID, name, logo, group (parsed separately via key=value) - group-title -> category grouping All others are for HLS streaming (.m3u8 variant playlists) =========================================================================