@skax/hls-parse 0.0.1-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +271 -0
- package/dist/index.esm.js +6 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/index.umd.js +6 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/types/index.d.ts +1102 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/utils.ts","../src/constants.ts","../src/parse.ts","../src/types.ts"],"sourcesContent":["/**\n * Utility functions for HLS parsing.\n *\n * @module utils\n * @category Internal\n * @internal\n */\n\n/**\n * Custom error class for invalid playlist parsing.\n *\n * Thrown by {@link parse} when a playlist violates RFC 8216 syntax rules.\n * Extends the standard `Error` class.\n *\n * @example\n * ```ts\n * try {\n * parse(m3u8);\n * } catch (e) {\n * if (e instanceof InvalidPlaylistError) {\n * console.log(e.message);\n * }\n * }\n * ```\n */\nexport class InvalidPlaylistError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"InvalidPlaylistError\";\n }\n}\n\n/**\n * Throws an {@link InvalidPlaylistError} with the given message.\n * Used throughout the parser to enforce RFC 8216 compliance.\n *\n * @param message - The error message describing the violation\n * @returns never — function always throws\n * @throws {InvalidPlaylistError} Always\n * @internal\n */\nexport function INVALIDPLAYLIST(message: string) {\n // throw new InvalidPlaylistError(message);\n console.warn(message);\n}\n\n/**\n * Trims matching characters from both ends of a string.\n * Used primarily for removing quotes from attribute values.\n *\n * @param str - The string to trim, or `undefined`\n * @param char - The character to strip from both ends\n * @returns The trimmed string, or `undefined` if input was `undefined`\n *\n * @example\n * ```ts\n * trim('\"hello\"', '\"'); // \"hello\"\n * trim(undefined, '\"'); // undefined\n * ```\n * @internal\n */\nexport function trim(str: string | undefined, char: string): string | undefined {\n if (str === undefined) return undefined;\n let start = 0;\n let end = str.length - 1;\n while (start <= end && str[start] === char) start++;\n while (end >= start && str[end] === char) end--;\n return str.slice(start, end + 1);\n}\n\n/**\n * Splits a string at the first occurrence of a delimiter.\n * Returns a `[before, after]` tuple.\n *\n * @param str - The string to split\n * @param delimiter - The delimiter character\n * @returns A tuple `[beforeDelimiter, afterDelimiter]`\n *\n * @example\n * ```ts\n * splitAt('hello=world', '='); // ['hello', 'world']\n * ```\n * @internal\n */\nexport function splitAt(str: string, delimiter: string): [string, string] {\n const index = str.indexOf(delimiter);\n if (index === -1) {\n return [str, \"\"];\n }\n return [str.slice(0, index), str.slice(index + 1)];\n}\n\n/**\n * Splits a comma-separated list while preserving quoted strings.\n *\n * This is essential for correctly parsing HLS attribute lists where\n * values may contain commas inside quotes.\n *\n * @param str - The comma-separated attribute string\n * @returns Array of individual attribute key=value pairs\n *\n * @example\n * ```ts\n * splitByCommaWithPreservingQuotes('a=\"1,2\",b=hello');\n * // ['a=\"1,2\"', 'b=hello']\n * ```\n * @internal\n */\nexport function splitByCommaWithPreservingQuotes(str: string): string[] {\n const result: string[] = [];\n let current = \"\";\n let inQuotes = false;\n\n for (let i = 0; i < str.length; i++) {\n const char = str[i];\n if (char === '\"') {\n inQuotes = !inQuotes;\n current += char;\n } else if (char === \",\" && !inQuotes) {\n result.push(current);\n current = \"\";\n } else {\n current += char;\n }\n }\n\n if (current) {\n result.push(current);\n }\n\n return result;\n}\n\n/**\n * Converts a string to a number (decimal-integer or decimal-floating-point).\n * Handles the full range of HLS numeric formats.\n *\n * @param str - The numeric string (e.g., `\"10.5\"`)\n * @returns The parsed number\n * @throws {InvalidPlaylistError} If the string is not a valid number\n * @internal\n */\nexport function toNumber(str: string): number {\n const num = Number(str);\n if (isNaN(num)) {\n INVALIDPLAYLIST(`Invalid numeric value: ${str}`);\n }\n return num;\n}\n\n/**\n * Converts a hexadecimal string to a `Uint8Array`.\n *\n * Handles the `0x` / `0X` prefix and odd-length hex strings.\n *\n * @param hex - The hex string, optionally prefixed with `0x` or `0X`\n * @returns Byte array representation\n *\n * @example\n * ```ts\n * hexToByteSequence('0xFF'); // Uint8Array [255]\n * hexToByteSequence('0F'); // Uint8Array [15] (padded)\n * ```\n */\nexport function hexToByteSequence(hex: string): Uint8Array {\n let h = hex;\n if (h.startsWith(\"0x\") || h.startsWith(\"0X\")) {\n h = h.slice(2);\n }\n // Ensure even length\n if (h.length % 2 !== 0) {\n h = \"0\" + h;\n }\n const bytes = new Uint8Array(h.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(h.slice(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n}\n\n/**\n * Converts a snake_case or UPPER-KEBAB string to camelCase.\n * Used for mapping HLS attribute names (e.g., `GROUP-ID`) to\n * JavaScript property names (e.g., `groupId`).\n *\n * @param str - The HLS attribute name\n * @returns camelCase version\n *\n * @example\n * ```ts\n * camelify('CLOSED-CAPTIONS'); // 'closedCaptions'\n * ```\n * @internal\n */\nexport function camelify(str: string): string {\n return str.toLowerCase().replace(/[-_](.)/g, (_, c) => c.toUpperCase());\n}\n\n/**\n * Resolves a relative URI against a base URI.\n *\n * If the URI is absolute (has a scheme), it is returned as-is.\n * If no base URI is provided, the URI is returned as-is.\n * Supports `http://`, `https://`, and other standard schemes.\n *\n * @param base - The base URI for resolution, or `undefined`\n * @param relative - The relative URI to resolve\n * @returns The resolved absolute URI, or the original if already absolute\n *\n * @example\n * ```ts\n * resolveUrl('https://example.com/dir/playlist.m3u8', 'segment.ts');\n * // 'https://example.com/dir/segment.ts'\n *\n * resolveUrl(undefined, 'segment.ts');\n * // 'segment.ts' (no base, returned as-is)\n * ```\n */\nexport function resolveUrl(base: string | undefined, relative: string): string {\n if (!base) return relative;\n\n // If already absolute, return as-is\n if (/^[a-zA-Z][a-zA-Z0-9+\\-.]*:/.test(relative)) {\n return relative;\n }\n\n try {\n // Use the URL constructor for proper resolution\n const baseUrl = new URL(base);\n // Handle protocol-relative URLs (starting with //)\n if (relative.startsWith(\"//\")) {\n return baseUrl.protocol + relative;\n }\n return new URL(relative, baseUrl).href;\n } catch {\n // If base is not a valid URL, try simple concatenation\n if (relative.startsWith(\"/\")) {\n // Absolute path relative to domain\n const match = base.match(/^[a-zA-Z][a-zA-Z0-9+\\-.]*:\\/\\/[^/]+/);\n if (match) {\n return match[0] + relative;\n }\n }\n // Relative path\n const baseDir = base.replace(/\\/[^/]*$/, \"/\");\n // Handle ./ and ../ in relative\n const resolved = baseDir + relative;\n // Normalize .. and .\n const parts = resolved.split(\"/\");\n const result: string[] = [];\n for (const part of parts) {\n if (part === \"..\") {\n result.pop();\n } else if (part !== \".\") {\n result.push(part);\n }\n }\n return result.join(\"/\");\n }\n}\n","/**\n * HLS Tag 常量定义\n *\n * 所有 M3U8 / HLS 标签名称的统一常量。\n * 每个 tag 附带中英双语文档注释,\n * 使用时通过 `TAGS.TAG_NAME` 引用,避免硬编码字符串。\n *\n * @module constants\n * @category Types\n *\n * @example\n * ```ts\n * import { TAGS } from '@skax/hls-parse';\n * // TAGS.EXT_X_TARGETDURATION === \"#EXT-X-TARGETDURATION\"\n * ```\n */\n\n// ============================================================================\n// Basic Tags — 基础标签\n// ============================================================================\n\n/**\n * 文件格式标识符\n *\n * Extended M3U Playlist format identifier.\n * MUST be the first line of every Media or Master Playlist.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.1.1 | RFC 8216 §4.3.1.1}\n */\nexport const EXTM3U = \"EXTM3U\";\n/**\n * 协议兼容版本号\n *\n * Protocol compatibility version number.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.1.2 | RFC 8216 §4.3.1.2}\n */\nexport const EXT_X_VERSION = \"EXT-X-VERSION\";\n/**\n * 内容转向服务器配置\n *\n * Content Steering server URI.\n *\n * @beta RFC 8216bis\n */\nexport const EXT_X_CONTENT_STEERING = \"EXT-X-CONTENT-STEERING\";\n\n// ============================================================================\n// Media Segment Tags — 媒体片段标签\n// ============================================================================\n\n/**\n * 片段时长及标题\n *\n * Segment duration and optional human-readable title.\n * REQUIRED for each Media Segment.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.2.1 | RFC 8216 §4.3.2.1}\n */\nexport const EXTINF = \"EXTINF\";\n/**\n * 子范围字节区间\n *\n * Sub-range byte range within a resource.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.2.2 | RFC 8216 §4.3.2.2}\n */\nexport const EXT_X_BYTERANGE = \"EXT-X-BYTERANGE\";\n/**\n * 不连续标记\n *\n * Discontinuity between the following segment and the one before it.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.2.3 | RFC 8216 §4.3.2.3}\n */\nexport const EXT_X_DISCONTINUITY = \"EXT-X-DISCONTINUITY\";\n/**\n * LL-HLS 预取不连续\n *\n * Discontinuity marker for LL-HLS prefetch segments.\n *\n * @beta LL-HLS feature\n */\nexport const EXT_X_PREFETCH_DISCONTINUITY = \"EXT-X-PREFETCH-DISCONTINUITY\";\n/**\n * 加密密钥\n *\n * Encryption / decryption key for Media Segments.\n * Method: NONE | AES-128 | SAMPLE-AES\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.2.4 | RFC 8216 §4.3.2.4}\n */\nexport const EXT_X_KEY = \"EXT-X-KEY\";\n/**\n * 媒体初始化段\n *\n * Media Initialization Section URI and optional byte range.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.2.5 | RFC 8216 §4.3.2.5}\n */\nexport const EXT_X_MAP = \"EXT-X-MAP\";\n/**\n * 绝对日期时间\n *\n * Associating the first sample of a Media Segment with an absolute wall-clock time.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.2.6 | RFC 8216 §4.3.2.6}\n */\nexport const EXT_X_PROGRAM_DATE_TIME = \"EXT-X-PROGRAM-DATE-TIME\";\n/**\n * 日期范围元数据\n *\n * Date Range metadata — carries SCTE-35 and ad-insertion data.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.2.7 | RFC 8216 §4.3.2.7}\n */\nexport const EXT_X_DATERANGE = \"EXT-X-DATERANGE\";\n/**\n * 广告插播开始\n *\n * Splice-out marker — indicates the start of an ad break.\n */\nexport const EXT_X_CUE_OUT = \"EXT-X-CUE-OUT\";\n/**\n * 广告插播结束\n *\n * Splice-in marker — indicates the end of an ad break.\n */\nexport const EXT_X_CUE_IN = \"EXT-X-CUE-IN\";\n/**\n * 广告插播延续\n *\n * Splice-out continuation marker.\n */\nexport const EXT_X_CUE_OUT_CONT = \"EXT-X-CUE-OUT-CONT\";\n/**\n * 通用提示标记\n *\n * Generic cue marker.\n */\nexport const EXT_X_CUE = \"EXT-X-CUE\";\n/**\n * OATCLS SCTE-35 数据\n *\n * OATCLS SCTE-35 payload marker.\n */\nexport const EXT_OATCLS_SCTE35 = \"EXT-OATCLS-SCTE35\";\n/**\n * 资产元数据\n *\n * Asset metadata (CAID) marker.\n */\nexport const EXT_X_ASSET = \"EXT-X-ASSET\";\n/**\n * SCTE-35 数据\n *\n * SCTE-35 payload marker.\n */\nexport const EXT_X_SCTE35 = \"EXT-X-SCTE35\";\n/**\n * LL-HLS 部分片段\n *\n * Partial Segment for Low-Latency HLS.\n *\n * @beta LL-HLS feature\n */\nexport const EXT_X_PART = \"EXT-X-PART\";\n/**\n * LL-HLS 预加载提示\n *\n * Preload Hint for Low-Latency HLS — TYPE=PART or TYPE=MAP.\n *\n * @beta LL-HLS feature\n */\nexport const EXT_X_PRELOAD_HINT = \"EXT-X-PRELOAD-HINT\";\n/**\n * 间隔片段标记\n *\n * Gap segment marker — indicates a Media Segment without media content.\n * Extends target duration for timing but carries no samples.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.2.8 | RFC 8216 §4.3.2.8 (bis)}\n */\nexport const EXT_X_GAP = \"EXT-X-GAP\";\n\n// -- RFC 8216bis: EXT-X-BITRATE (Media Playlist tag)\n/**\n * 媒体播放列表码率\n *\n * Indicates the segment bitrate of a Media Playlist.\n * Enables ABR without a Master Playlist (RFC 8216bis).\n *\n * @beta\n */\nexport const EXT_X_BITRATE = \"EXT-X-BITRATE\";\n\n// ============================================================================\n// Media Playlist Tags — 媒体播放列表全局标签\n// ============================================================================\n\n/**\n * 最大片段时长 (秒)\n *\n * Maximum Media Segment duration in seconds. REQUIRED for every Media Playlist.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.3.1 | RFC 8216 §4.3.3.1}\n */\nexport const EXT_X_TARGETDURATION = \"EXT-X-TARGETDURATION\";\n/**\n * 媒体序列号基数\n *\n * Base Media Sequence Number of the first Media Segment.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.3.2 | RFC 8216 §4.3.3.2}\n */\nexport const EXT_X_MEDIA_SEQUENCE = \"EXT-X-MEDIA-SEQUENCE\";\n/**\n * 不连续序列号基数\n *\n * Base Discontinuity Sequence Number.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.3.3 | RFC 8216 §4.3.3.3}\n */\nexport const EXT_X_DISCONTINUITY_SEQUENCE = \"EXT-X-DISCONTINUITY-SEQUENCE\";\n/**\n * 播放列表终止标记\n *\n * End-of-playlist marker — no more segments will be added.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.3.4 | RFC 8216 §4.3.3.4}\n */\nexport const EXT_X_ENDLIST = \"EXT-X-ENDLIST\";\n/**\n * 播放列表类型\n *\n * Playlist type — EVENT or VOD.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.3.5 | RFC 8216 §4.3.3.5}\n */\nexport const EXT_X_PLAYLIST_TYPE = \"EXT-X-PLAYLIST-TYPE\";\n/**\n * 仅 I 帧播放列表\n *\n * I-frame only playlist — each segment is a single I-frame (trick play).\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.3.6 | RFC 8216 §4.3.3.6}\n */\nexport const EXT_X_I_FRAMES_ONLY = \"EXT-X-I-FRAMES-ONLY\";\n/**\n * LL-HLS 服务端控制参数\n *\n * Low-Latency HLS server control — CAN-BLOCK-RELOAD, CAN-SKIP-UNTIL, HOLD-BACK, PART-HOLD-BACK.\n *\n * @beta LL-HLS feature\n */\nexport const EXT_X_SERVER_CONTROL = \"EXT-X-SERVER-CONTROL\";\n/**\n * LL-HLS 部分片段目标时长\n *\n * Partial Segment target duration for Low-Latency HLS — PART-TARGET.\n *\n * @beta LL-HLS feature\n */\nexport const EXT_X_PART_INF = \"EXT-X-PART-INF\";\n/**\n * LL-HLS 预取片段\n *\n * Prefetch segment for Low-Latency HLS.\n *\n * @beta LL-HLS feature\n */\nexport const EXT_X_PREFETCH = \"EXT-X-PREFETCH\";\n/**\n * LL-HLS 呈现报告\n *\n * Rendition Report for Low-Latency HLS — carries last MSN and last Part of a Rendition.\n *\n * @beta LL-HLS feature\n */\nexport const EXT_X_RENDITION_REPORT = \"EXT-X-RENDITION-REPORT\";\n/**\n * LL-HLS 跳过片段\n *\n * Skip indicator for Low-Latency HLS — SKIPPED-SEGMENTS count.\n *\n * @beta LL-HLS feature\n */\nexport const EXT_X_SKIP = \"EXT-X-SKIP\";\n\n// ============================================================================\n// Master Playlist Tags — 主播放列表标签\n// ============================================================================\n\n/**\n * 替代呈现\n *\n * Alternative Rendition — TYPE: AUDIO | VIDEO | SUBTITLES | CLOSED-CAPTIONS.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.4.1 | RFC 8216 §4.3.4.1}\n */\nexport const EXT_X_MEDIA = \"EXT-X-MEDIA\";\n/**\n * 变体流\n *\n * Variant Stream — ABR adaptive bitrate stream.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.4.2 | RFC 8216 §4.3.4.2}\n */\nexport const EXT_X_STREAM_INF = \"EXT-X-STREAM-INF\";\n/**\n * I 帧变体流\n *\n * I-frame Variant Stream — independent I-frame playlist for trick-play.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.4.3 | RFC 8216 §4.3.4.3}\n */\nexport const EXT_X_I_FRAME_STREAM_INF = \"EXT-X-I-FRAME-STREAM-INF\";\n/**\n * 会话数据\n *\n * Session data — key-value pairs or JSON URI for arbitrary metadata.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.4.4 | RFC 8216 §4.3.4.4}\n */\nexport const EXT_X_SESSION_DATA = \"EXT-X-SESSION-DATA\";\n/**\n * 会话加密密钥\n *\n * Session-wide encryption key — preloaded keys for the entire Master Playlist.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.4.5 | RFC 8216 §4.3.4.5}\n */\nexport const EXT_X_SESSION_KEY = \"EXT-X-SESSION-KEY\";\n\n// ============================================================================\n// Media-or-Master Playlist Tags — 通用标签\n// ============================================================================\n\n/**\n * 独立片段声明\n *\n * All Media Segments in the playlist are independently decodable.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.5.1 | RFC 8216 §4.3.5.1}\n */\nexport const EXT_X_INDEPENDENT_SEGMENTS = \"EXT-X-INDEPENDENT-SEGMENTS\";\n/**\n * 建议起始位置\n *\n * Preferred point at which to start playback — TIME-OFFSET.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.5.2 | RFC 8216 §4.3.5.2}\n */\nexport const EXT_X_START = \"EXT-X-START\";\n/**\n * 变量定义\n *\n * Variable definition — NAME and VALUE pair for substitution.\n */\nexport const EXT_X_DEFINE = \"EXT-X-DEFINE\";\n","/**\n * HLS / M3U8 Playlist Parser\n *\n * Parses M3U8 playlists according to RFC 8216 (HTTP Live Streaming),\n * including support for:\n * - Master Playlists (EXT-X-STREAM-INF, EXT-X-I-FRAME-STREAM-INF, etc.)\n * - Media Playlists (Media Segments, Encryption Keys, etc.)\n * - LL-HLS / Low-Latency HLS (EXT-X-PART, EXT-X-PRELOAD-HINT,\n * EXT-X-SERVER-CONTROL, EXT-X-SKIP, EXT-X-RENDITION-REPORT, etc.)\n * - Relative URL resolution\n * - Automatic protocol version detection\n * - Variable substitution (EXT-X-DEFINE)\n *\n * Usage:\n * import { parse } from '@skax/hls-parse';\n * const playlist = parse(m3u8Content);\n * // With URL resolution:\n * const playlist = parse(m3u8Content, { uri: 'https://example.com/playlist.m3u8' });\n *\n * @see https://datatracker.ietf.org/doc/html/rfc8216\n */\n\nimport {\n AllowedCpc,\n Byterange,\n ContentSteering,\n DateRange,\n ExtInfo,\n Key,\n LowLatencyCompatibility,\n MasterPlaylist,\n MediaInitializationSection,\n MediaPlaylist,\n ParseOptions,\n PartialSegment,\n PrefetchSegment,\n Rendition,\n RenditionReport,\n Resolution,\n Segment,\n SessionData,\n SpliceInfo,\n StartData,\n TagParam,\n UserAttribute,\n Variant,\n} from \"./types\";\nimport * as utils from \"./utils\";\nimport * as T from \"./constants\";\n\n// ---------------------------------------------------------------------------\n// Internal types\n// ---------------------------------------------------------------------------\n\n/** Internal tag category for grouping tags */\ntype TagCategory = \"Basic\" | \"Segment\" | \"MasterPlaylist\" | \"MediaPlaylist\" | \"MediaorMasterPlaylist\" | \"Unknown\";\n\n/** Parsed tag representation */\ninterface Tag {\n name: string;\n category: TagCategory;\n value: any;\n attributes: Record<string, any>;\n}\n\n/** A line in the playlist - either a parsed tag or a URI string */\ntype Line = string | Tag;\n\n/** Internal parsing state */\ninterface ParseState {\n isMasterPlaylist?: boolean;\n hasMap: boolean;\n targetDuration: number;\n compatibleVersion: number;\n isClosedCaptionsNone: boolean;\n hash: Record<string, boolean>;\n}\n\n// ---------------------------------------------------------------------------\n// Tag category classification\n// ---------------------------------------------------------------------------\n\n/**\n * Determines the category of an HLS tag based on RFC 8216.\n * Categories determine which playlist type the tag belongs to.\n *\n * 根据 RFC 8216 判断 HLS tag 的分类。\n * 分类决定了该 tag 属于哪种播放列表类型。\n */\nfunction getTagCategory(tagName: string): TagCategory {\n switch (tagName) {\n // ── Basic Tags ──────────────────────────────────────────────\n case T.EXTM3U:\n case T.EXT_X_VERSION:\n case T.EXT_X_CONTENT_STEERING:\n return \"Basic\";\n\n // ── Media Segment Tags ──────────────────────────────────────\n case T.EXTINF:\n case T.EXT_X_BYTERANGE:\n case T.EXT_X_DISCONTINUITY:\n case T.EXT_X_PREFETCH_DISCONTINUITY:\n case T.EXT_X_KEY:\n case T.EXT_X_MAP:\n case T.EXT_X_PROGRAM_DATE_TIME:\n case T.EXT_X_DATERANGE:\n case T.EXT_X_CUE_OUT:\n case T.EXT_X_CUE_IN:\n case T.EXT_X_CUE_OUT_CONT:\n case T.EXT_X_CUE:\n case T.EXT_OATCLS_SCTE35:\n case T.EXT_X_ASSET:\n case T.EXT_X_SCTE35:\n case T.EXT_X_PART:\n case T.EXT_X_PRELOAD_HINT:\n case T.EXT_X_GAP:\n return \"Segment\";\n\n // -- RFC 8216bis\n case T.EXT_X_BITRATE:\n return \"MediaPlaylist\";\n\n // ── Media Playlist Tags ─────────────────────────────────────\n case T.EXT_X_TARGETDURATION:\n case T.EXT_X_MEDIA_SEQUENCE:\n case T.EXT_X_DISCONTINUITY_SEQUENCE:\n case T.EXT_X_ENDLIST:\n case T.EXT_X_PLAYLIST_TYPE:\n case T.EXT_X_I_FRAMES_ONLY:\n case T.EXT_X_SERVER_CONTROL:\n case T.EXT_X_PART_INF:\n case T.EXT_X_PREFETCH:\n case T.EXT_X_RENDITION_REPORT:\n case T.EXT_X_SKIP:\n return \"MediaPlaylist\";\n\n // ── Master Playlist Tags ────────────────────────────────────\n case T.EXT_X_MEDIA:\n case T.EXT_X_STREAM_INF:\n case T.EXT_X_I_FRAME_STREAM_INF:\n case T.EXT_X_SESSION_DATA:\n case T.EXT_X_SESSION_KEY:\n return \"MasterPlaylist\";\n\n // ── Media-or-Master Tags ────────────────────────────────────\n case T.EXT_X_INDEPENDENT_SEGMENTS:\n case T.EXT_X_START:\n case T.EXT_X_DEFINE:\n return \"MediaorMasterPlaylist\";\n\n default:\n // 未知标签 — 按 RFC 8216 要求应忽略 / Unknown tag — MUST be ignored per RFC\n return \"Unknown\";\n }\n}\n\n// ---------------------------------------------------------------------------\n// Tag parameter parsers\n// ---------------------------------------------------------------------------\n\n/**\n * Parses the EXTINF tag value.\n * Format: #EXTINF:<duration>,[<title>]\n *\n * The title field may contain percent-encoded UTF-8 characters.\n * We use encodeURIComponent + decodeURIComponent for safe decoding\n * (replaces the deprecated escape() function).\n */\nfunction parseEXTINF(param: string): ExtInfo {\n const pair = utils.splitAt(param, \",\") as [string, string];\n return {\n duration: utils.toNumber(pair[0]),\n title: pair[1] ? decodeURIComponent(encodeURIComponent(pair[1])) : undefined,\n };\n}\n\n/**\n * Parses the EXT-X-BYTERANGE tag value.\n * Format: #EXT-X-BYTERANGE:<n>[@<o>]\n */\nfunction parseBYTERANGE(param: string): Byterange {\n const pair = utils.splitAt(param, \"@\");\n return {\n length: utils.toNumber(pair[0]),\n offset: pair[1] ? utils.toNumber(pair[1]) : -1,\n };\n}\n\n/**\n * Parses a resolution string \"widthxheight\".\n */\nfunction parseResolution(str: string): Resolution {\n const pair = utils.splitAt(str, \"x\") as [string, string];\n return {\n width: utils.toNumber(pair[0]),\n height: utils.toNumber(pair[1]),\n };\n}\n\n/**\n * Parses ALLOWED-CPC attribute value.\n */\nfunction parseAllowedCpc(str: string): AllowedCpc[] {\n const message = \"ALLOWED-CPC: Each entry must consist of KEYFORMAT and Content Protection Configuration\";\n const list = str.split(\",\");\n const allowedCpcList: AllowedCpc[] = [];\n for (const item of list) {\n const [format, cpcText] = utils.splitAt(item, \":\");\n if (!format || !cpcText) {\n utils.INVALIDPLAYLIST(message);\n continue;\n }\n allowedCpcList.push({ format, cpcList: cpcText.split(\"/\") });\n }\n return allowedCpcList;\n}\n\n/**\n * Parses an Initialization Vector from a hex string.\n * Must be exactly 128 bits (16 bytes).\n */\nfunction parseIV(str: string): Uint8Array {\n const iv = utils.hexToByteSequence(str);\n if (iv.length !== 16) {\n utils.INVALIDPLAYLIST(\"IV must be a 128-bit unsigned integer\");\n }\n return iv;\n}\n\n/**\n * Parses a user-defined attribute value (X- prefixed).\n * Can be a quoted string, hex sequence, or number.\n */\nfunction parseUserAttribute(str: string): UserAttribute {\n if (str.startsWith('\"')) {\n return utils.trim(str, '\"')!;\n }\n if (str.startsWith(\"0x\") || str.startsWith(\"0X\")) {\n return utils.hexToByteSequence(str);\n }\n return utils.toNumber(str);\n}\n\n/**\n * Updates compatible version based on Key attributes.\n */\nfunction setCompatibleVersionOfKey(params: ParseState, attributes: Record<string, any>) {\n if (attributes[\"IV\"] && params.compatibleVersion < 2) {\n params.compatibleVersion = 2;\n }\n if ((attributes[\"KEYFORMAT\"] || attributes[\"KEYFORMATVERSIONS\"]) && params.compatibleVersion < 5) {\n params.compatibleVersion = 5;\n }\n}\n\n/**\n * Parses an attribute list (comma-separated key=value pairs).\n * This handles all the attribute types defined in RFC 8216 Section 4.2.\n */\nfunction parseAttributeList(param: string): Record<string, any> {\n const attributes: Record<string, any> = {};\n for (const item of utils.splitByCommaWithPreservingQuotes(param)) {\n const [key, value] = utils.splitAt(item, \"=\");\n const val = utils.trim(value, '\"')!;\n switch (key) {\n case \"URI\":\n attributes[key] = val;\n break;\n case \"START-DATE\":\n case \"END-DATE\":\n attributes[key] = new Date(val);\n break;\n case \"IV\":\n attributes[key] = parseIV(val);\n break;\n case \"BYTERANGE\":\n attributes[key] = parseBYTERANGE(val);\n break;\n case \"RESOLUTION\":\n attributes[key] = parseResolution(val);\n break;\n case \"ALLOWED-CPC\":\n attributes[key] = parseAllowedCpc(val);\n break;\n case \"END-ON-NEXT\":\n case \"DEFAULT\":\n case \"AUTOSELECT\":\n case \"FORCED\":\n case \"PRECISE\":\n case \"CAN-BLOCK-RELOAD\":\n case \"INDEPENDENT\":\n case \"GAP\":\n attributes[key] = val === \"YES\";\n break;\n case \"DURATION\":\n case \"PLANNED-DURATION\":\n case \"BANDWIDTH\":\n case \"AVERAGE-BANDWIDTH\":\n case \"FRAME-RATE\":\n case \"TIME-OFFSET\":\n case \"CAN-SKIP-UNTIL\":\n case \"HOLD-BACK\":\n case \"PART-HOLD-BACK\":\n case \"PART-TARGET\":\n case \"BYTERANGE-START\":\n case \"BYTERANGE-LENGTH\":\n case \"LAST-MSN\":\n case \"LAST-PART\":\n case \"SKIPPED-SEGMENTS\":\n case \"SCORE\":\n case \"PROGRAM-ID\":\n attributes[key] = utils.toNumber(val);\n break;\n default:\n if (key.startsWith(\"SCTE35-\")) {\n attributes[key] = utils.hexToByteSequence(val);\n } else if (key.startsWith(\"X-\")) {\n attributes[key] = parseUserAttribute(value!);\n } else {\n if (key === \"VIDEO-RANGE\" && val !== \"SDR\" && val !== \"HLG\" && val !== \"PQ\") {\n utils.INVALIDPLAYLIST(`VIDEO-RANGE: unknown value \"${val}\"`);\n }\n attributes[key] = val;\n }\n }\n }\n return attributes;\n}\n\n/**\n * Splits a tag line into name and parameter.\n * Format: #EXT-TAG-NAME:parameter or #EXT-TAG-NAME\n */\nfunction splitTag(line: string): [string, string | null] {\n const index = line.indexOf(\":\");\n if (index === -1) {\n return [line.slice(1).trim(), null];\n }\n return [line.slice(1, index).trim(), line.slice(index + 1).trim()];\n}\n\n/**\n * Parses a tag's parameters into a structured [value, attributes] pair.\n * Different tags have different parameter formats.\n */\nfunction parseTagParam(name: string, param: string | null): TagParam {\n if (param === null) {\n return [null, null];\n }\n\n switch (name) {\n case T.EXTM3U:\n case T.EXT_X_DISCONTINUITY:\n case T.EXT_X_ENDLIST:\n case T.EXT_X_I_FRAMES_ONLY:\n case T.EXT_X_INDEPENDENT_SEGMENTS:\n case T.EXT_X_CUE_IN:\n case T.EXT_X_GAP:\n return [null, null];\n case T.EXT_X_VERSION:\n case T.EXT_X_TARGETDURATION:\n case T.EXT_X_MEDIA_SEQUENCE:\n case T.EXT_X_DISCONTINUITY_SEQUENCE:\n case T.EXT_X_BITRATE:\n return [utils.toNumber(param), null];\n case T.EXT_X_CUE_OUT:\n // For backwards compatibility: attributes list is optional.\n // If only a number is found, use it as the duration.\n if (!Number.isNaN(Number(param))) {\n return [utils.toNumber(param), null];\n }\n // If attributes are found, parse them (e.g., DURATION=...)\n return [null, parseAttributeList(param)];\n case T.EXT_X_KEY:\n case T.EXT_X_MAP:\n case T.EXT_X_DATERANGE:\n case T.EXT_X_MEDIA:\n case T.EXT_X_STREAM_INF:\n case T.EXT_X_I_FRAME_STREAM_INF:\n case T.EXT_X_SESSION_DATA:\n case T.EXT_X_SESSION_KEY:\n case T.EXT_X_START:\n case T.EXT_X_SERVER_CONTROL:\n case T.EXT_X_PART_INF:\n case T.EXT_X_PART:\n case T.EXT_X_PRELOAD_HINT:\n case T.EXT_X_RENDITION_REPORT:\n case T.EXT_X_SKIP:\n case T.EXT_X_DEFINE:\n case T.EXT_X_CONTENT_STEERING:\n return [null, parseAttributeList(param)];\n case T.EXTINF:\n return [parseEXTINF(param), null];\n case T.EXT_X_BYTERANGE:\n return [parseBYTERANGE(param), null];\n case T.EXT_X_PROGRAM_DATE_TIME:\n return [new Date(param), null];\n case T.EXT_X_PLAYLIST_TYPE:\n return [param, null]; // <EVENT|VOD>\n default:\n return [param, null]; // Unknown tag - return raw value\n }\n}\n\n/**\n * Throws a mixed tags error when a playlist contains both\n * media and master playlist tags.\n *\n * 当播放列表同时包含 Media 和 Master 标签时抛出混合标签错误。\n */\nfunction MIXEDTAGS() {\n utils.INVALIDPLAYLIST(\"The file contains both media and master playlist tags.\");\n}\n\n// ---------------------------------------------------------------------------\n// Tag line parsing\n// ---------------------------------------------------------------------------\n\n/**\n * Parses a single tag line and determines its category.\n *\n * 解析单个 tag 行并判断其分类。\n */\nfunction parseTag(line: string, params: ParseState): Tag | null {\n const [name, param] = splitTag(line);\n const category = getTagCategory(name);\n CHECKTAGCATEGORY(category, params);\n if (category === \"Unknown\") {\n return null; // RFC 8216: unrecognized tags MUST be ignored / 未识别标签必须忽略\n }\n // Media playlist tags (except RENDITION-REPORT and PREFETCH) must be unique\n // 媒体播放列表标签(RENDITION-REPORT 和 PREFETCH 除外)同一类型只能出现一次\n if (category === \"MediaPlaylist\" && name !== T.EXT_X_RENDITION_REPORT && name !== T.EXT_X_PREFETCH) {\n if (params.hash[name]) {\n utils.INVALIDPLAYLIST(\"There MUST NOT be more than one Media Playlist tag of each type in any Media Playlist\");\n }\n params.hash[name] = true;\n }\n const [value, attributes] = parseTagParam(name, param);\n return { name, category, value, attributes: attributes || {} };\n}\n\n/**\n * Checks that the tag category is consistent with the playlist type.\n * Ensures master and media tags aren't mixed.\n *\n * 检查 tag 分类是否与播放列表类型一致。\n * 确保 Master 和 Media 标签不会混用。\n *\n * Logic / 逻辑:\n * - Segment / MediaPlaylist → 设定 isMasterPlaylist = false\n * - MasterPlaylist → 设定 isMasterPlaylist = true\n * - 如果已设定为相反类型 → 抛出 MIXEDTAGS 错误\n * - Basic / MediaorMasterPlaylist / Unknown → 不改变判定\n */\nfunction CHECKTAGCATEGORY(category: TagCategory, params: ParseState) {\n if (category === \"Segment\" || category === \"MediaPlaylist\") {\n // 媒体标签 → 判定为 Media Playlist\n if (params.isMasterPlaylist === undefined) {\n params.isMasterPlaylist = false;\n return;\n }\n if (params.isMasterPlaylist) {\n MIXEDTAGS(); // 之前判定为 Master,现在出现媒体标签 → 混用\n }\n return;\n }\n if (category === \"MasterPlaylist\") {\n // 主播放列表标签 → 判定为 Master Playlist\n if (params.isMasterPlaylist === undefined) {\n params.isMasterPlaylist = true;\n return;\n }\n if (params.isMasterPlaylist === false) {\n MIXEDTAGS(); // 之前判定为 Media,现在出现主列表标签 → 混用\n }\n }\n // Basic / MediaorMasterPlaylist / Unknown → 不改变类型判定\n}\n\n// ---------------------------------------------------------------------------\n// Lexical analysis (line-by-line parsing)\n// ---------------------------------------------------------------------------\n\n/**\n * Performs the initial lexical parsing of the raw playlist text.\n * Splits into lines, categorizes tags, and returns an array of Lines.\n */\nfunction lexicalParse(text: string, params: ParseState): Line[] {\n const lines: Line[] = [];\n\n // Strip UTF-8 BOM if present (RFC 8216 §4.1: MUST NOT contain BOM)\n let normalized = text;\n if (normalized.charCodeAt(0) === 0xfeff) {\n normalized = normalized.slice(1);\n }\n\n // Split by common line endings\n const rawLines = normalized.split(/\\r?\\n/);\n\n for (const l of rawLines) {\n // Trim whitespace (V8 optimization: create a new string)\n const line = l.trim();\n if (!line) {\n // Empty line - skip\n continue;\n }\n if (line.startsWith(\"#\")) {\n if (line.startsWith(\"#EXT\")) {\n // Tag line\n const tag = parseTag(line, params);\n if (tag) {\n lines.push(tag);\n }\n }\n // Comment line (##... or other) - skip\n continue;\n }\n // URI line\n lines.push(line);\n }\n\n // Validate that the first line is EXTM3U\n if (lines.length === 0 || typeof lines[0] !== \"object\" || (lines[0] as Tag).name !== T.EXTM3U) {\n utils.INVALIDPLAYLIST(\"The EXTM3U tag MUST be the first line.\");\n }\n\n return lines;\n}\n\n// ---------------------------------------------------------------------------\n// Master Playlist parsing\n// ---------------------------------------------------------------------------\n\n/**\n * Parses a Rendition from an EXT-X-MEDIA tag.\n */\nfunction parseRendition(tag: Tag): Rendition {\n const attrs = tag.attributes;\n return {\n type: attrs[\"TYPE\"],\n uri: attrs[\"URI\"],\n groupId: attrs[\"GROUP-ID\"],\n language: attrs[\"LANGUAGE\"],\n assocLanguage: attrs[\"ASSOC-LANGUAGE\"],\n name: attrs[\"NAME\"],\n isDefault: attrs[\"DEFAULT\"],\n autoselect: attrs[\"AUTOSELECT\"],\n forced: attrs[\"FORCED\"],\n instreamId: attrs[\"INSTREAM-ID\"],\n characteristics: attrs[\"CHARACTERISTICS\"],\n channels: attrs[\"CHANNELS\"],\n pathwayId: attrs[\"PATHWAY-ID\"],\n };\n}\n\n/**\n * Validates that variant attributes reference valid rendition groups.\n */\nfunction matchTypes(attrs: Record<string, any>, variant: Variant, params: ParseState) {\n for (const type of [\"AUDIO\", \"VIDEO\", \"SUBTITLES\", \"CLOSED-CAPTIONS\"]) {\n if (type === \"CLOSED-CAPTIONS\" && attrs[type] === \"NONE\") {\n params.isClosedCaptionsNone = true;\n (variant as any).closedCaptions = [];\n } else if (attrs[type]) {\n const key = utils.camelify(type) as keyof Variant;\n const renditions = (variant[key] as Rendition[]) || [];\n if (renditions.length > 0 && !renditions.some((item) => item.groupId === attrs[type])) {\n utils.INVALIDPLAYLIST(`${type} attribute MUST match the value of the GROUP-ID attribute of an EXT-X-MEDIA tag whose TYPE attribute is ${type}.`);\n }\n }\n }\n}\n\n/**\n * Parses a Variant Stream from EXT-X-STREAM-INF or EXT-X-I-FRAME-STREAM-INF.\n *\n * @param mediaGroups — pre-indexed Map<TYPE, Map<GROUP-ID, Rendition[]>>\n */\nfunction parseVariant(variantAttrs: Record<string, any>, uri: string, iFrameOnly: boolean, params: ParseState, mediaGroups: Map<string, Map<string, Rendition[]>>): Variant {\n const variant: Variant = {\n uri,\n bandwidth: variantAttrs[\"BANDWIDTH\"],\n averageBandwidth: variantAttrs[\"AVERAGE-BANDWIDTH\"],\n score: variantAttrs[\"SCORE\"],\n codecs: variantAttrs[\"CODECS\"],\n resolution: variantAttrs[\"RESOLUTION\"],\n frameRate: variantAttrs[\"FRAME-RATE\"],\n hdcpLevel: variantAttrs[\"HDCP-LEVEL\"],\n allowedCpc: variantAttrs[\"ALLOWED-CPC\"],\n videoRange: variantAttrs[\"VIDEO-RANGE\"],\n stableVariantId: variantAttrs[\"STABLE-VARIANT-ID\"],\n pathwayId: variantAttrs[\"PATHWAY-ID\"] || variantAttrs[\"STABLE-PATHWAY-ID\"],\n programId: variantAttrs[\"PROGRAM-ID\"],\n isIFrameOnly: iFrameOnly,\n };\n\n // Attach matching renditions using pre-indexed map (O(1) per group)\n for (const type of [\"AUDIO\", \"VIDEO\", \"SUBTITLES\", \"CLOSED-CAPTIONS\"]) {\n const attrsGroupId = variantAttrs[type];\n if (!attrsGroupId) continue;\n const typeMap = mediaGroups.get(type);\n if (!typeMap) continue;\n const renditions = typeMap.get(attrsGroupId);\n if (renditions) {\n for (const r of renditions) {\n addRenditionToList(variant, r, type);\n }\n }\n }\n\n matchTypes(variantAttrs, variant, params);\n return variant;\n}\n\n/** Add an already-parsed Rendition to a variant's list */\nfunction addRenditionToList(variant: Variant, rendition: Rendition, type: string) {\n const key = utils.camelify(type) as keyof Variant;\n let renditions = variant[key] as Rendition[] | undefined;\n if (!renditions) {\n renditions = [];\n (variant as any)[key] = renditions;\n }\n renditions.push(rendition);\n}\n\n/**\n * Compares two Key objects for equality.\n */\nfunction sameKey(key1: Key, key2: Key): boolean {\n if (key1.method !== key2.method) return false;\n if (key1.uri !== key2.uri) return false;\n if (key1.iv) {\n if (!key2.iv) return false;\n if (key1.iv.byteLength !== key2.iv.byteLength) return false;\n for (let i = 0; i < key1.iv.byteLength; i++) {\n if (key1.iv[i] !== key2.iv[i]) return false;\n }\n } else if (key2.iv) {\n return false;\n }\n if (key1.format !== key2.format) return false;\n if (key1.formatVersion !== key2.formatVersion) return false;\n return true;\n}\n\n/**\n * Pre-index EXT-X-MEDIA tags into Map<TYPE, Map<GROUP-ID, Rendition[]>>.\n * This allows O(1) lookup when attaching renditions to variants,\n * replacing the previous O(V × N) per-variant scan.\n */\nfunction buildMediaGroupIndex(lines: Line[]): Map<string, Map<string, Rendition[]>> {\n const index = new Map<string, Map<string, Rendition[]>>();\n for (const line of lines) {\n if (typeof line === \"object\" && line.name === T.EXT_X_MEDIA) {\n const rendition = parseRendition(line);\n const type = rendition.type;\n const groupId = rendition.groupId;\n if (!type || !groupId) {\n utils.INVALIDPLAYLIST(\"EXT-X-MEDIA TYPE attribute is REQUIRED.\");\n }\n let typeMap = index.get(type);\n if (!typeMap) {\n typeMap = new Map();\n index.set(type, typeMap);\n }\n let group = typeMap.get(groupId);\n if (!group) {\n group = [];\n typeMap.set(groupId, group);\n }\n // Validate uniqueness (same GROUP, same NAME)\n if (group.some((r) => r.name === rendition.name)) {\n utils.INVALIDPLAYLIST(\"All EXT-X-MEDIA tags in the same Group MUST have different NAME attributes.\");\n }\n // Validate only one DEFAULT per group\n if (rendition.isDefault && group.some((r) => r.isDefault)) {\n utils.INVALIDPLAYLIST(\"A Group MUST NOT have more than one member with a DEFAULT attribute of YES.\");\n }\n group.push(rendition);\n }\n }\n return index;\n}\n\n/**\n * Parses a Master Playlist (contains EXT-X-STREAM-INF, EXT-X-MEDIA, etc.).\n */\nfunction parseMasterPlaylist(lines: Line[], params: ParseState): MasterPlaylist {\n const playlist: MasterPlaylist = {\n isMasterPlaylist: true,\n variants: [],\n sessionDataList: [],\n sessionKeyList: [],\n };\n\n // Pre-index EXT-X-MEDIA tags into Map<TYPE, Map<GROUP-ID, Rendition[]>>\n // This avoids O(V×N) scanning in parseVariant.\n const mediaGroups = buildMediaGroupIndex(lines);\n\n let variantIsScored = false;\n\n for (const [index, line] of lines.entries()) {\n if (typeof line === \"string\") continue;\n const { name, value, attributes } = line;\n\n if (name === T.EXT_X_VERSION) {\n playlist.version = value;\n } else if (name === T.EXT_X_CONTENT_STEERING) {\n playlist.contentSteering = {\n serverUri: attributes[\"SERVER-URI\"],\n pathwayId: attributes[\"PATHWAY-ID\"],\n };\n } else if (name === T.EXT_X_STREAM_INF) {\n const uriLine = lines[index + 1];\n if (typeof uriLine !== \"string\" || uriLine.startsWith(\"#\")) {\n utils.INVALIDPLAYLIST(\"EXT-X-STREAM-INF must be followed by a URI line\");\n }\n const variant = parseVariant(attributes, uriLine as string, false, params, mediaGroups);\n if (typeof variant.score === \"number\") {\n variantIsScored = true;\n if (variant.score < 0) {\n utils.INVALIDPLAYLIST(\"SCORE attribute on EXT-X-STREAM-INF must be a positive decimal-floating-point number.\");\n }\n }\n playlist.variants.push(variant);\n } else if (name === T.EXT_X_I_FRAME_STREAM_INF) {\n const variant = parseVariant(attributes, attributes.URI, true, params, mediaGroups);\n playlist.variants.push(variant);\n } else if (name === T.EXT_X_SESSION_DATA) {\n const sessionData: SessionData = {\n id: attributes[\"DATA-ID\"],\n value: attributes[\"VALUE\"],\n uri: attributes[\"URI\"],\n language: attributes[\"LANGUAGE\"],\n };\n if (playlist.sessionDataList.some((item) => item.id === sessionData.id && item.language === sessionData.language)) {\n utils.INVALIDPLAYLIST(\"A Playlist MUST NOT contain more than one EXT-X-SESSION-DATA tag with the same DATA-ID attribute and the same LANGUAGE attribute.\");\n }\n playlist.sessionDataList.push(sessionData);\n } else if (name === T.EXT_X_SESSION_KEY) {\n if (attributes[\"METHOD\"] === \"NONE\") {\n utils.INVALIDPLAYLIST(\"EXT-X-SESSION-KEY: The value of the METHOD attribute MUST NOT be NONE\");\n }\n const sessionKey: Key = {\n method: attributes[\"METHOD\"],\n uri: attributes[\"URI\"],\n iv: attributes[\"IV\"],\n format: attributes[\"KEYFORMAT\"],\n formatVersion: attributes[\"KEYFORMATVERSIONS\"],\n };\n if (playlist.sessionKeyList.some((item) => sameKey(item, sessionKey))) {\n utils.INVALIDPLAYLIST(\"A Master Playlist MUST NOT contain more than one EXT-X-SESSION-KEY tag with the same METHOD, URI, IV, KEYFORMAT, and KEYFORMATVERSIONS attribute values.\");\n }\n setCompatibleVersionOfKey(params, attributes);\n playlist.sessionKeyList.push(sessionKey);\n } else if (name === T.EXT_X_INDEPENDENT_SEGMENTS) {\n if (playlist.independentSegments) {\n utils.INVALIDPLAYLIST(\"EXT-X-INDEPENDENT-SEGMENTS tag MUST NOT appear more than once in a Playlist\");\n }\n playlist.independentSegments = true;\n } else if (name === T.EXT_X_START) {\n if (playlist.start) {\n utils.INVALIDPLAYLIST(\"EXT-X-START tag MUST NOT appear more than once in a Playlist\");\n }\n if (typeof attributes[\"TIME-OFFSET\"] !== \"number\") {\n utils.INVALIDPLAYLIST(\"EXT-X-START: TIME-OFFSET attribute is REQUIRED\");\n }\n playlist.start = {\n offset: attributes[\"TIME-OFFSET\"],\n precise: attributes[\"PRECISE\"] || false,\n };\n } else if (name === T.EXT_X_DEFINE) {\n if (!playlist.defines) playlist.defines = [];\n playlist.defines.push(attributes);\n }\n }\n\n // Validate scores: if any variant has a score, all should\n if (variantIsScored) {\n for (const variant of playlist.variants) {\n if (typeof variant.score !== \"number\") {\n utils.INVALIDPLAYLIST(\"If any Variant Stream contains the SCORE attribute, then all Variant Streams in the Master Playlist SHOULD have a SCORE attribute\");\n }\n }\n }\n\n // Validate closed-captions consistency\n if (params.isClosedCaptionsNone) {\n for (const variant of playlist.variants) {\n const cc = variant.closedCaptions;\n if (cc && cc.length > 0) {\n utils.INVALIDPLAYLIST(\"If there is a variant with CLOSED-CAPTIONS attribute of NONE, all EXT-X-STREAM-INF tags MUST have this attribute with a value of NONE\");\n }\n }\n }\n\n return playlist;\n}\n\n// ---------------------------------------------------------------------------\n// Media Playlist parsing\n// ---------------------------------------------------------------------------\n\n/**\n * Parses an EXT-X-DATERANGE tag's attributes into a DateRange object.\n */\nfunction parseDateRange(attributes: Record<string, any>): DateRange {\n const attrs: Record<string, any> = {};\n for (const key of Object.keys(attributes)) {\n if (key.startsWith(\"SCTE35-\") || key.startsWith(\"X-\")) {\n attrs[key] = attributes[key];\n }\n }\n return {\n id: attributes[\"ID\"],\n classId: attributes[\"CLASS\"],\n start: attributes[\"START-DATE\"],\n cue: attributes[\"CUE\"],\n end: attributes[\"END-DATE\"],\n duration: attributes[\"DURATION\"],\n plannedDuration: attributes[\"PLANNED-DURATION\"],\n endOnNext: attributes[\"END-ON-NEXT\"],\n attributes: attrs,\n };\n}\n\n/**\n * Parses a Media Segment from a range of lines in the playlist.\n * Collects all the segment-level tags that apply to a URI.\n */\nfunction parseSegment(lines: Line[], uri: string, start: number, end: number, mediaSequenceNumber: number, discontinuitySequence: number, params: ParseState): Segment {\n const segment: Segment = {\n uri,\n mediaSequenceNumber,\n discontinuitySequence,\n markers: [],\n parts: [],\n };\n\n let partHint = false;\n\n for (let i = start; i <= end; i++) {\n if (typeof lines[i] === \"string\") continue;\n const { name, value, attributes } = lines[i] as Tag;\n\n if (name === T.EXTINF) {\n if (!Number.isInteger(value.duration) && params.compatibleVersion < 3) {\n params.compatibleVersion = 3;\n }\n // https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.2.1\n if (Math.round(value.duration) > params.targetDuration) {\n utils.INVALIDPLAYLIST(\"EXTINF duration, when rounded to the nearest integer, MUST be less than or equal to the target duration\");\n }\n segment.duration = value.duration;\n segment.title = value.title;\n } else if (name === T.EXT_X_BYTERANGE) {\n if (params.compatibleVersion < 4) {\n params.compatibleVersion = 4;\n }\n segment.byterange = value;\n } else if (name === T.EXT_X_DISCONTINUITY) {\n if (segment.parts && segment.parts.length > 0) {\n utils.INVALIDPLAYLIST(\"EXT-X-DISCONTINUITY must appear before the first EXT-X-PART tag of the Parent Segment.\");\n }\n segment.discontinuity = true;\n } else if (name === T.EXT_X_GAP) {\n if (params.compatibleVersion < 8) {\n params.compatibleVersion = 8;\n }\n segment.gap = true;\n } else if (name === T.EXT_X_KEY) {\n if (segment.parts && segment.parts.length > 0) {\n utils.INVALIDPLAYLIST(\"EXT-X-KEY must appear before the first EXT-X-PART tag of the Parent Segment.\");\n }\n setCompatibleVersionOfKey(params, attributes);\n segment.key = {\n method: attributes[\"METHOD\"],\n uri: attributes[\"URI\"],\n iv: attributes[\"IV\"],\n format: attributes[\"KEYFORMAT\"],\n formatVersion: attributes[\"KEYFORMATVERSIONS\"],\n };\n } else if (name === T.EXT_X_MAP) {\n if (segment.parts && segment.parts.length > 0) {\n utils.INVALIDPLAYLIST(\"EXT-X-MAP must appear before the first EXT-X-PART tag of the Parent Segment.\");\n }\n if (params.compatibleVersion < 5) {\n params.compatibleVersion = 5;\n }\n params.hasMap = true;\n segment.map = {\n uri: attributes[\"URI\"],\n byterange: attributes[\"BYTERANGE\"],\n };\n } else if (name === T.EXT_X_PROGRAM_DATE_TIME) {\n segment.programDateTime = value;\n } else if (name === T.EXT_X_DATERANGE) {\n segment.dateRange = parseDateRange(attributes);\n } else if (name === T.EXT_X_CUE_OUT) {\n if (!segment.markers) segment.markers = [];\n segment.markers.push({\n type: \"OUT\",\n duration: (attributes && attributes.DURATION) || value,\n });\n } else if (name === T.EXT_X_CUE_IN) {\n if (!segment.markers) segment.markers = [];\n segment.markers.push({ type: \"IN\" });\n } else if (name === T.EXT_X_CUE_OUT_CONT || name === T.EXT_X_CUE || name === T.EXT_OATCLS_SCTE35 || name === T.EXT_X_ASSET || name === T.EXT_X_SCTE35) {\n if (!segment.markers) segment.markers = [];\n segment.markers.push({\n type: \"RAW\",\n tagName: name,\n value,\n });\n } else if (name === T.EXT_X_PRELOAD_HINT && !attributes[\"TYPE\"]) {\n utils.INVALIDPLAYLIST(\"EXT-X-PRELOAD-HINT: TYPE attribute is mandatory\");\n } else if (name === T.EXT_X_PRELOAD_HINT && attributes[\"TYPE\"] === \"PART\" && partHint) {\n utils.INVALIDPLAYLIST(\"Servers should not add more than one EXT-X-PRELOAD-HINT tag with the same TYPE attribute to a Playlist.\");\n } else if ((name === T.EXT_X_PART || name === T.EXT_X_PRELOAD_HINT) && !attributes[\"URI\"]) {\n utils.INVALIDPLAYLIST(\"EXT-X-PART / EXT-X-PRELOAD-HINT: URI attribute is mandatory\");\n } else if (name === T.EXT_X_PRELOAD_HINT && attributes[\"TYPE\"] === \"MAP\") {\n params.hasMap = true;\n segment.map = {\n hint: true,\n uri: attributes[\"URI\"],\n byterange: {\n length: attributes[\"BYTERANGE-LENGTH\"],\n offset: attributes[\"BYTERANGE-START\"] || 0,\n },\n };\n } else if (name === T.EXT_X_PART || (name === T.EXT_X_PRELOAD_HINT && attributes[\"TYPE\"] === \"PART\")) {\n if (name === T.EXT_X_PART && !attributes[\"DURATION\"]) {\n utils.INVALIDPLAYLIST(\"EXT-X-PART: DURATION attribute is mandatory\");\n }\n if (name === T.EXT_X_PRELOAD_HINT) {\n partHint = true;\n }\n if (!segment.parts) segment.parts = [];\n const partialSegment: PartialSegment = {\n hint: name === T.EXT_X_PRELOAD_HINT,\n uri: attributes[\"URI\"],\n byterange:\n name === T.EXT_X_PART\n ? attributes[\"BYTERANGE\"]\n : {\n length: attributes[\"BYTERANGE-LENGTH\"],\n offset: attributes[\"BYTERANGE-START\"] || 0,\n },\n duration: attributes[\"DURATION\"],\n independent: attributes[\"INDEPENDENT\"],\n gap: attributes[\"GAP\"],\n };\n if (segment.gap && !partialSegment.gap) {\n utils.INVALIDPLAYLIST(\"Partial segments must have GAP=YES if they are in a gap (EXT-X-GAP)\");\n }\n segment.parts.push(partialSegment);\n }\n }\n\n return segment;\n}\n\n/**\n * Parses a Prefetch Segment (EXT-X-PREFETCH) for LL-HLS.\n */\nfunction parsePrefetchSegment(lines: Line[], uri: string, start: number, end: number, mediaSequenceNumber: number, discontinuitySequence: number, params: ParseState): PrefetchSegment {\n const segment: PrefetchSegment = {\n uri,\n mediaSequenceNumber,\n discontinuitySequence,\n };\n\n for (let i = start; i <= end; i++) {\n if (typeof lines[i] === \"string\") continue;\n const { name, attributes } = lines[i] as Tag;\n\n if (name === T.EXTINF) {\n utils.INVALIDPLAYLIST(\"A prefetch segment must not be advertised with an EXTINF tag.\");\n } else if (name === T.EXT_X_DISCONTINUITY) {\n utils.INVALIDPLAYLIST(\"A prefetch segment must not be advertised with an EXT-X-DISCONTINUITY tag.\");\n } else if (name === T.EXT_X_PREFETCH_DISCONTINUITY) {\n segment.discontinuity = true;\n } else if (name === T.EXT_X_KEY) {\n setCompatibleVersionOfKey(params, attributes);\n segment.key = {\n method: attributes[\"METHOD\"],\n uri: attributes[\"URI\"],\n iv: attributes[\"IV\"],\n format: attributes[\"KEYFORMAT\"],\n formatVersion: attributes[\"KEYFORMATVERSIONS\"],\n };\n } else if (name === T.EXT_X_MAP) {\n utils.INVALIDPLAYLIST(\"Prefetch segments must not be advertised with an EXT-X-MAP tag.\");\n }\n }\n\n return segment;\n}\n\n/**\n * Adds a segment to the playlist, resolving inherited properties\n * (key, map, discontinuity sequence, byterange offset).\n */\nfunction addSegment(\n playlist: MediaPlaylist,\n segment: Segment,\n discontinuitySequence: number,\n currentKey?: Key | null,\n currentMap?: MediaInitializationSection | null,\n): [number, Key | null, MediaInitializationSection | null] {\n const { discontinuity, key, map, byterange, uri } = segment;\n\n // Calculate discontinuity sequence\n if (discontinuity) {\n segment.discontinuitySequence = discontinuitySequence + 1;\n }\n\n // Inherit key from previous segment if not specified\n if (!key) {\n segment.key = currentKey;\n }\n\n // Inherit map from previous segment if not specified\n if (!map) {\n segment.map = currentMap;\n }\n\n // Resolve implicit byterange offset\n if (byterange && byterange.offset === -1) {\n const { segments } = playlist;\n if (segments.length > 0) {\n const prevSegment = segments[segments.length - 1];\n if (prevSegment.byterange && prevSegment.uri === uri) {\n byterange.offset = prevSegment.byterange.offset + prevSegment.byterange.length;\n } else {\n utils.INVALIDPLAYLIST(\"If offset of EXT-X-BYTERANGE is not present, a previous Media Segment MUST be a sub-range of the same media resource\");\n }\n } else {\n utils.INVALIDPLAYLIST(\"If offset of EXT-X-BYTERANGE is not present, a previous Media Segment MUST appear in the Playlist file\");\n }\n }\n\n playlist.segments.push(segment);\n\n return [segment.discontinuitySequence, segment.key ?? null, segment.map ?? null];\n}\n\n/**\n * Validates DateRange constraints across all segments.\n */\nfunction checkDateRange(segments: Segment[]) {\n const earliestDates = new Map<string, Date>();\n const rangeList = new Map<string, Array<{ start: number; end: number }>>();\n let hasDateRange = false;\n let hasProgramDateTime = false;\n\n for (let i = segments.length - 1; i >= 0; i--) {\n const { programDateTime, dateRange } = segments[i];\n if (programDateTime) {\n hasProgramDateTime = true;\n }\n if (dateRange && dateRange.start) {\n hasDateRange = true;\n\n // END-ON-NEXT cannot coexist with DURATION or END-DATE\n if (dateRange.endOnNext && (dateRange.end || dateRange.duration)) {\n utils.INVALIDPLAYLIST(\"An EXT-X-DATERANGE tag with an END-ON-NEXT=YES attribute MUST NOT contain DURATION or END-DATE attributes.\");\n }\n\n const start = dateRange.start.getTime();\n const duration = dateRange.duration || 0;\n\n // END-DATE must equal START-DATE + DURATION\n if (dateRange.end && dateRange.duration) {\n if (start + duration * 1000 !== dateRange.end.getTime()) {\n utils.INVALIDPLAYLIST(\"END-DATE MUST be equal to the value of the START-DATE attribute plus the value of the DURATION\");\n }\n }\n\n // Resolve END-ON-NEXT\n if (dateRange.endOnNext && dateRange.classId) {\n dateRange.end = earliestDates.get(dateRange.classId);\n }\n\n earliestDates.set(dateRange.classId!, dateRange.start);\n\n const end = dateRange.end ? dateRange.end.getTime() : start + duration * 1000;\n\n // Check overlapping ranges with same CLASS\n if (dateRange.classId) {\n const range = rangeList.get(dateRange.classId);\n if (range) {\n for (const entry of range) {\n if ((entry.start <= start && entry.end > start) || (entry.start >= start && entry.start < end)) {\n utils.INVALIDPLAYLIST(\"DATERANGE tags with the same CLASS should not overlap\");\n }\n }\n range.push({ start, end });\n } else {\n rangeList.set(dateRange.classId, [{ start, end }]);\n }\n }\n }\n }\n\n // If any DateRange exists, there must be at least one PROGRAM-DATE-TIME\n if (hasDateRange && !hasProgramDateTime) {\n utils.INVALIDPLAYLIST(\"If a Playlist contains an EXT-X-DATERANGE tag, it MUST also contain at least one EXT-X-PROGRAM-DATE-TIME tag.\");\n }\n}\n\n/**\n * Validates LL-HLS (Low-Latency HLS) compatibility constraints.\n */\nfunction checkLowLatencyCompatibility(playlist: MediaPlaylist, containsParts: boolean) {\n const { lowLatencyCompatibility, targetDuration, partTargetDuration } = playlist;\n\n if (!lowLatencyCompatibility) return;\n\n const { canSkipUntil, holdBack, partHoldBack } = lowLatencyCompatibility;\n\n // Skip boundary must be at least 6x target duration\n if (canSkipUntil !== undefined && canSkipUntil < targetDuration! * 6) {\n utils.INVALIDPLAYLIST(\"The Skip Boundary must be at least six times the EXT-X-TARGETDURATION.\");\n }\n\n // HOLD-BACK must be at least 3x target duration\n if (holdBack !== undefined && holdBack < targetDuration! * 3) {\n utils.INVALIDPLAYLIST(\"HOLD-BACK must be at least three times the EXT-X-TARGETDURATION.\");\n }\n\n if (containsParts) {\n if (partTargetDuration === undefined) {\n utils.INVALIDPLAYLIST(\"EXT-X-PART-INF is required if a Playlist contains one or more EXT-X-PART tags\");\n }\n if (partHoldBack === undefined) {\n utils.INVALIDPLAYLIST(\"PART-HOLD-BACK attribute is mandatory\");\n }\n if (partHoldBack !== undefined && partHoldBack < partTargetDuration!) {\n utils.INVALIDPLAYLIST(\"PART-HOLD-BACK must be at least PART-TARGET\");\n }\n\n // Validate partial segment durations\n for (const [segmentIndex, { parts }] of playlist.segments.entries()) {\n if (!parts || parts.length === 0) continue;\n if (segmentIndex < playlist.segments.length - 3) {\n utils.INVALIDPLAYLIST(\"Remove EXT-X-PART tags from the Playlist after they are greater than three target durations from the end of the Playlist.\");\n }\n for (const [partIndex, { duration }] of parts.entries()) {\n if (duration === undefined) continue;\n if (duration > partTargetDuration!) {\n utils.INVALIDPLAYLIST(\"PART-TARGET is the maximum duration of any Partial Segment\");\n }\n if (partIndex < parts.length - 1 && duration < partTargetDuration! * 0.85) {\n utils.INVALIDPLAYLIST(\"All Partial Segments except the last part of a segment must have a duration of at least 85% of PART-TARGET\");\n }\n }\n }\n\n // Fill in rendition report defaults\n for (const report of playlist.renditionReports) {\n const lastSegment = playlist.segments[playlist.segments.length - 1];\n if (report.lastMSN === undefined && lastSegment) {\n report.lastMSN = lastSegment.mediaSequenceNumber;\n }\n if ((report.lastPart === undefined || report.lastPart === null) && lastSegment && lastSegment.parts && lastSegment.parts.length > 0) {\n report.lastPart = lastSegment.parts.length - 1;\n }\n }\n }\n}\n\n/**\n * Parses a Media Playlist (contains segments and media-level tags).\n */\nfunction parseMediaPlaylist(lines: Line[], params: ParseState): MediaPlaylist {\n const playlist: MediaPlaylist = {\n isMasterPlaylist: false,\n segments: [],\n prefetchSegments: [],\n renditionReports: [],\n dateRanges: [],\n };\n\n let segmentStart = -1;\n let mediaSequence = 0;\n let discontinuitySequence = 0;\n let currentKey: Key | null = null;\n let currentMap: MediaInitializationSection | null = null;\n let containsParts = false;\n let prefetchFound = false;\n\n for (const [index, line] of lines.entries()) {\n if (typeof line === \"string\") {\n // URI line - finalize the current segment\n if (segmentStart === -1) {\n utils.INVALIDPLAYLIST(\"A URI line is not preceded by any segment tags\");\n }\n if (!playlist.targetDuration) {\n utils.INVALIDPLAYLIST(\"The EXT-X-TARGETDURATION tag is REQUIRED\");\n }\n if (prefetchFound) {\n utils.INVALIDPLAYLIST(\"These segments must appear after all complete segments.\");\n }\n\n const segment = parseSegment(lines, line, segmentStart, index - 1, mediaSequence++, discontinuitySequence, params);\n\n const [newDiscSeq, newKey, newMap] = addSegment(playlist, segment, discontinuitySequence, currentKey, currentMap);\n discontinuitySequence = newDiscSeq;\n currentKey = newKey;\n currentMap = newMap;\n\n if (!containsParts && segment.parts && segment.parts.length > 0) {\n containsParts = true;\n }\n\n segmentStart = -1;\n continue;\n }\n\n // Tag line\n const { name, value, attributes, category } = line as Tag;\n\n // Handle EXT-X-DATERANGE at playlist level (before category segmentation)\n if (name === T.EXT_X_DATERANGE) {\n const dateRange = parseDateRange(attributes);\n playlist.dateRanges.push(dateRange);\n }\n\n if (category === \"Segment\") {\n if (segmentStart === -1) {\n segmentStart = index;\n }\n continue;\n }\n\n if (name === T.EXT_X_VERSION) {\n if (playlist.version === undefined) {\n playlist.version = value;\n } else {\n utils.INVALIDPLAYLIST(\"A Playlist file MUST NOT contain more than one EXT-X-VERSION tag.\");\n }\n } else if (name === T.EXT_X_TARGETDURATION) {\n playlist.targetDuration = params.targetDuration = value;\n } else if (name === T.EXT_X_MEDIA_SEQUENCE) {\n if (playlist.segments.length > 0) {\n utils.INVALIDPLAYLIST(\"The EXT-X-MEDIA-SEQUENCE tag MUST appear before the first Media Segment in the Playlist.\");\n }\n playlist.mediaSequenceBase = value;\n mediaSequence = value;\n } else if (name === T.EXT_X_BITRATE) {\n // RFC 8216bis: segment bitrate of the media playlist\n playlist.bitrate = value;\n } else if (name === T.EXT_X_DISCONTINUITY_SEQUENCE) {\n if (playlist.segments.length > 0) {\n utils.INVALIDPLAYLIST(\"The EXT-X-DISCONTINUITY-SEQUENCE tag MUST appear before the first Media Segment in the Playlist.\");\n }\n if (segmentStart !== -1) {\n utils.INVALIDPLAYLIST(\"The EXT-X-DISCONTINUITY-SEQUENCE tag MUST appear before any EXT-X-DISCONTINUITY tag.\");\n }\n playlist.discontinuitySequenceBase = value;\n discontinuitySequence = value;\n } else if (name === T.EXT_X_ENDLIST) {\n playlist.endlist = true;\n } else if (name === T.EXT_X_PLAYLIST_TYPE) {\n playlist.playlistType = value;\n } else if (name === T.EXT_X_I_FRAMES_ONLY) {\n if (params.compatibleVersion < 4) {\n params.compatibleVersion = 4;\n }\n playlist.isIFrame = true;\n } else if (name === T.EXT_X_INDEPENDENT_SEGMENTS) {\n if (playlist.independentSegments) {\n utils.INVALIDPLAYLIST(\"EXT-X-INDEPENDENT-SEGMENTS tag MUST NOT appear more than once in a Playlist\");\n }\n playlist.independentSegments = true;\n } else if (name === T.EXT_X_START) {\n if (playlist.start) {\n utils.INVALIDPLAYLIST(\"EXT-X-START tag MUST NOT appear more than once in a Playlist\");\n }\n if (typeof attributes[\"TIME-OFFSET\"] !== \"number\") {\n utils.INVALIDPLAYLIST(\"EXT-X-START: TIME-OFFSET attribute is REQUIRED\");\n }\n playlist.start = {\n offset: attributes[\"TIME-OFFSET\"],\n precise: attributes[\"PRECISE\"] || false,\n };\n } else if (name === T.EXT_X_SERVER_CONTROL) {\n if (!attributes[\"CAN-BLOCK-RELOAD\"]) {\n utils.INVALIDPLAYLIST(\"EXT-X-SERVER-CONTROL: CAN-BLOCK-RELOAD=YES is mandatory for Low-Latency HLS\");\n }\n playlist.lowLatencyCompatibility = {\n canBlockReload: attributes[\"CAN-BLOCK-RELOAD\"],\n canSkipUntil: attributes[\"CAN-SKIP-UNTIL\"],\n holdBack: attributes[\"HOLD-BACK\"],\n partHoldBack: attributes[\"PART-HOLD-BACK\"],\n };\n } else if (name === T.EXT_X_PART_INF) {\n if (!attributes[\"PART-TARGET\"]) {\n utils.INVALIDPLAYLIST(\"EXT-X-PART-INF: PART-TARGET attribute is mandatory\");\n }\n playlist.partTargetDuration = attributes[\"PART-TARGET\"];\n } else if (name === T.EXT_X_RENDITION_REPORT) {\n if (!attributes[\"URI\"]) {\n utils.INVALIDPLAYLIST(\"EXT-X-RENDITION-REPORT: URI attribute is mandatory\");\n }\n if (/^[a-z]+:/i.test(attributes[\"URI\"])) {\n utils.INVALIDPLAYLIST(\"EXT-X-RENDITION-REPORT: URI must be relative to the playlist uri\");\n }\n playlist.renditionReports.push({\n uri: attributes[\"URI\"],\n lastMSN: attributes[\"LAST-MSN\"],\n lastPart: attributes[\"LAST-PART\"],\n });\n } else if (name === T.EXT_X_SKIP) {\n if (!attributes[\"SKIPPED-SEGMENTS\"]) {\n utils.INVALIDPLAYLIST(\"EXT-X-SKIP: SKIPPED-SEGMENTS attribute is mandatory\");\n }\n if (params.compatibleVersion < 9) {\n params.compatibleVersion = 9;\n }\n playlist.skip = attributes[\"SKIPPED-SEGMENTS\"];\n mediaSequence += playlist.skip!;\n } else if (name === T.EXT_X_PREFETCH) {\n const segment = parsePrefetchSegment(lines, value, segmentStart === -1 ? index : segmentStart, index - 1, mediaSequence++, discontinuitySequence, params);\n if (segment.discontinuity) {\n segment.discontinuitySequence++;\n discontinuitySequence = segment.discontinuitySequence;\n }\n if (!segment.key) {\n segment.key = currentKey;\n }\n playlist.prefetchSegments.push(segment);\n prefetchFound = true;\n segmentStart = -1;\n } else if (name === T.EXT_X_DEFINE) {\n if (!playlist.defines) playlist.defines = [];\n playlist.defines.push(attributes);\n }\n }\n\n // Handle trailing segments (no URI line at end)\n if (segmentStart !== -1) {\n const segment = parseSegment(lines, \"\", segmentStart, lines.length - 1, mediaSequence++, discontinuitySequence, params);\n const { parts } = segment;\n if (parts && parts.length > 0 && !playlist.endlist && !parts[parts.length - 1]?.hint) {\n utils.INVALIDPLAYLIST(\"If the Playlist contains EXT-X-PART tags and does not contain an EXT-X-ENDLIST tag, the Playlist must contain an EXT-X-PRELOAD-HINT tag with a TYPE=PART attribute\");\n }\n addSegment(playlist, segment, discontinuitySequence, currentKey, currentMap);\n if (!containsParts && segment.parts && segment.parts.length > 0) {\n containsParts = true;\n }\n }\n\n // Validate DateRanges\n checkDateRange(playlist.segments);\n\n // Validate LL-HLS compatibility\n if (playlist.lowLatencyCompatibility) {\n checkLowLatencyCompatibility(playlist, containsParts);\n }\n\n return playlist;\n}\n\n// ---------------------------------------------------------------------------\n// Semantic analysis (structured parsing)\n// ---------------------------------------------------------------------------\n\n/**\n * Performs semantic analysis on the parsed lines to produce\n * a structured MasterPlaylist or MediaPlaylist.\n */\nfunction semanticParse(lines: Line[], params: ParseState): MasterPlaylist | MediaPlaylist {\n let playlist: MasterPlaylist | MediaPlaylist;\n\n if (params.isMasterPlaylist) {\n playlist = parseMasterPlaylist(lines, params);\n } else {\n playlist = parseMediaPlaylist(lines, params);\n if (!playlist.isMasterPlaylist && !playlist.isIFrame && params.hasMap && params.compatibleVersion < 6) {\n params.compatibleVersion = 6;\n }\n }\n\n // Validate protocol version compatibility\n // Only throw if an explicit EXT-X-VERSION tag is present and is too low.\n // If no version tag is specified, we accept the playlist for interoperability.\n if (params.compatibleVersion > 1) {\n if (playlist.version !== undefined && playlist.version !== null && playlist.version < params.compatibleVersion) {\n utils.INVALIDPLAYLIST(`EXT-X-VERSION needs to be ${params.compatibleVersion} or higher.`);\n }\n }\n\n return playlist;\n}\n\n// ---------------------------------------------------------------------------\n// URI resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolves all relative URIs in a playlist against a base URI.\n * This supports both Master Playlists and Media Playlists.\n */\nfunction resolvePlaylistUris(playlist: MasterPlaylist | MediaPlaylist, baseUri: string): void {\n if (playlist.isMasterPlaylist) {\n const master = playlist as MasterPlaylist;\n\n // Resolve variant URIs\n for (const variant of master.variants) {\n variant.uri = utils.resolveUrl(baseUri, variant.uri);\n\n // Resolve rendition URIs inside each variant (audio / video / subtitles)\n for (const type of [\"audio\", \"video\", \"subtitles\", \"closedCaptions\"] as const) {\n const renditions = variant[type];\n if (renditions) {\n for (const r of renditions) {\n if (r.uri) {\n r.uri = utils.resolveUrl(baseUri, r.uri);\n }\n }\n }\n }\n }\n\n // Resolve session data URIs\n for (const sd of master.sessionDataList) {\n if (sd.uri) {\n sd.uri = utils.resolveUrl(baseUri, sd.uri);\n }\n }\n\n // Resolve session key URIs\n for (const sk of master.sessionKeyList) {\n if (sk.uri) {\n sk.uri = utils.resolveUrl(baseUri, sk.uri);\n }\n }\n\n // Resolve content steering URI\n const steering = master.contentSteering;\n if (steering) {\n steering.serverUri = utils.resolveUrl(baseUri, steering.serverUri);\n }\n } else {\n const mp = playlist as MediaPlaylist;\n // Resolve segment URIs\n for (const segment of mp.segments) {\n segment.uri = utils.resolveUrl(baseUri, segment.uri);\n if (segment.key && segment.key.uri) {\n segment.key.uri = utils.resolveUrl(baseUri, segment.key.uri);\n }\n if (segment.map && segment.map.uri) {\n segment.map.uri = utils.resolveUrl(baseUri, segment.map.uri);\n }\n if (segment.parts) {\n for (const part of segment.parts) {\n part.uri = utils.resolveUrl(baseUri, part.uri);\n }\n }\n }\n // Resolve prefetch segment URIs\n for (const prefetch of mp.prefetchSegments) {\n prefetch.uri = utils.resolveUrl(baseUri, prefetch.uri);\n if (prefetch.key && prefetch.key.uri) {\n prefetch.key.uri = utils.resolveUrl(baseUri, prefetch.key.uri);\n }\n }\n // Resolve rendition report URIs\n for (const report of mp.renditionReports) {\n report.uri = utils.resolveUrl(baseUri, report.uri);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main parse function\n// ---------------------------------------------------------------------------\n\n/**\n * Parses an M3U8 playlist string into a structured object.\n *\n * Automatically detects whether the playlist is a Master Playlist or\n * Media Playlist and parses accordingly.\n *\n * @param text - The raw M3U8 playlist content as a string\n * @param options - Optional parsing options\n * @param options.uri - Base URI for resolving relative URLs in the playlist\n * @returns A structured MasterPlaylist or MediaPlaylist object\n *\n * @throws {InvalidPlaylistError} If the playlist violates RFC 8216 syntax rules\n *\n * @example\n * ```typescript\n * import { parse } from '@skax/hls-parse';\n *\n * // Parse a simple media playlist\n * const media = parse(`#EXTM3U\n * #EXT-X-TARGETDURATION:10\n * #EXTINF:9.009,\n * segment1.ts\n * #EXTINF:9.009,\n * segment2.ts\n * #EXT-X-ENDLIST`);\n *\n * // Parse with relative URL resolution\n * const master = parse(m3u8Content, {\n * uri: 'https://example.com/path/to/playlist.m3u8'\n * });\n * ```\n */\nfunction parse(text: string, options?: ParseOptions): MasterPlaylist | MediaPlaylist {\n const params: ParseState = {\n isMasterPlaylist: undefined,\n hasMap: false,\n targetDuration: 0,\n compatibleVersion: 1,\n isClosedCaptionsNone: false,\n hash: {},\n };\n\n const lines = lexicalParse(text, params);\n const playlist = semanticParse(lines, params);\n playlist.source = text;\n\n // Resolve relative URIs if a base URI is provided\n if (options?.uri) {\n resolvePlaylistUris(playlist, options.uri);\n }\n\n return playlist;\n}\n\nexport default parse;\nexport { parse };\n","/**\n * HLS Playlist Type Definitions\n *\n * All types conforming to {@link https://datatracker.ietf.org/doc/html/rfc8216 | RFC 8216}\n * (HTTP Live Streaming) and LL-HLS (Low-Latency HLS) extensions.\n *\n * @remarks\n * All URIs in these types will be resolved to absolute when\n * {@link ParseOptions.uri} is provided to {@link parse}.\n *\n * @module types\n * @category Types\n */\n\n/**\n * Media Initialization Section.\n *\n * Corresponds to the `#EXT-X-MAP` tag.\n * Contains the URI and optional byte range of the initialization resource\n * required to parse applicable Media Segments.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.2.5 | RFC 8216 §4.3.2.5}\n */\nexport interface MediaInitializationSection {\n /** Whether this is a preload hint (LL-HLS). */\n hint?: boolean;\n /** URI to the initialization section resource. */\n uri: string;\n /** Byte range within the resource. */\n byterange?: Byterange;\n}\n\n/**\n * Byte range specification.\n *\n * Corresponds to the `#EXT-X-BYTERANGE` tag value.\n *\n * @remarks\n * When `offset` is `-1` it indicates the sub-range begins at the next byte\n * following the sub-range of the previous Media Segment.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.2.2 | RFC 8216 §4.3.2.2}\n */\nexport interface Byterange {\n /** Length of the byte range in bytes. */\n length: number;\n /**\n * Start offset in bytes.\n *\n * @defaultValue `-1` (implicit offset)\n */\n offset: number;\n}\n\n/**\n * Display resolution.\n *\n * Corresponds to the `RESOLUTION` attribute value.\n *\n * @example `{ width: 1920, height: 1080 }` for `RESOLUTION=1920x1080`\n */\nexport interface Resolution {\n /** Horizontal pixel dimension. */\n width: number;\n /** Vertical pixel dimension. */\n height: number;\n}\n\n/**\n * Encryption / decryption key.\n *\n * Corresponds to `#EXT-X-KEY` and `#EXT-X-SESSION-KEY` tags.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.2.4 | RFC 8216 §4.3.2.4}\n */\nexport interface Key {\n /**\n * Encryption method.\n *\n * @remarks Valid values: `\"NONE\"`, `\"AES-128\"`, `\"SAMPLE-AES\"`.\n */\n method: string;\n /** URI to obtain the key file. */\n uri?: string;\n /**\n * Initialization Vector.\n *\n * @remarks Must be exactly 128 bits (16 bytes) when present.\n */\n iv?: Uint8Array;\n /**\n * Key format identifier.\n *\n * @defaultValue `\"identity\"`\n */\n format?: string;\n /** Key format version(s), separated by `/`. */\n formatVersion?: string;\n}\n\n/**\n * Parsed `#EXTINF` tag data.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.2.1 | RFC 8216 §4.3.2.1}\n */\nexport interface ExtInfo {\n /** Segment duration in seconds. */\n duration: number;\n /** Optional human-readable title. */\n title?: string;\n}\n\n/**\n * Partial segment for Low-Latency HLS.\n *\n * Corresponds to `#EXT-X-PART` and `#EXT-X-PRELOAD-HINT` (TYPE=PART) tags.\n *\n * @beta LL-HLS feature\n */\nexport interface PartialSegment {\n /** Whether this is a preload hint (`#EXT-X-PRELOAD-HINT`). */\n hint?: boolean;\n /** URI to the partial segment. */\n uri: string;\n /** Byte range within the resource. */\n byterange?: Byterange;\n /** Duration in seconds. */\n duration?: number;\n /** Whether this segment can be decoded independently. */\n independent?: boolean;\n /** Whether this segment is a gap. */\n gap?: boolean;\n}\n\n/**\n * Prefetch segment for Low-Latency HLS.\n *\n * Corresponds to the `#EXT-X-PREFETCH` tag.\n *\n * @beta LL-HLS feature\n */\nexport interface PrefetchSegment {\n /** URI of the prefetch segment. */\n uri: string;\n /** Media Sequence Number. */\n mediaSequenceNumber: number;\n /** Discontinuity Sequence Number. */\n discontinuitySequence: number;\n /** Whether this segment indicates a discontinuity. */\n discontinuity?: boolean;\n /** Encryption key (inherited from previous segment if not specified). */\n key?: Key | null;\n}\n\n/**\n * Media Segment.\n *\n * Represents a single segment in a Media Playlist, including all associated tags\n * (`#EXTINF`, `#EXT-X-KEY`, `#EXT-X-MAP`, `#EXT-X-BYTERANGE`, etc.).\n */\nexport interface Segment {\n /** URI of the media segment. */\n uri: string;\n /** Duration in seconds (from `#EXTINF`). */\n duration?: number;\n /** Optional title (from `#EXTINF`). */\n title?: string;\n /** Byte range within the resource (from `#EXT-X-BYTERANGE`). */\n byterange?: Byterange;\n /** Media Sequence Number. */\n mediaSequenceNumber: number;\n /** Discontinuity Sequence Number. */\n discontinuitySequence: number;\n /** Whether this segment is a discontinuity (`#EXT-X-DISCONTINUITY`). */\n discontinuity?: boolean;\n /** Whether this segment is a gap (`#EXT-X-GAP`). */\n gap?: boolean;\n /** Encryption key (`#EXT-X-KEY`). Inherited if not present. */\n key?: Key | null;\n /** Media Initialization Section (`#EXT-X-MAP`). Inherited if not present. */\n map?: MediaInitializationSection | null;\n /** Program date/time (`#EXT-X-PROGRAM-DATE-TIME`). */\n programDateTime?: Date;\n /** Date range metadata (`#EXT-X-DATERANGE`). */\n dateRange?: DateRange;\n /** Splice / marker information. */\n markers?: SpliceInfo[];\n /** Partial segments (LL-HLS `#EXT-X-PART` / `#EXT-X-PRELOAD-HINT`). */\n parts?: PartialSegment[];\n}\n\n/**\n * Date Range metadata.\n *\n * Corresponds to the `#EXT-X-DATERANGE` tag.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.2.7 | RFC 8216 §4.3.2.7}\n */\nexport interface DateRange {\n /** Unique identifier. */\n id: string;\n /** CLASS name grouping ranges with shared semantics. */\n classId?: string;\n /** Start date/time. */\n start: Date;\n /** Cue information. */\n cue?: string;\n /** End date/time. */\n end?: Date;\n /** Duration in seconds. */\n duration?: number;\n /** Expected duration (when actual is not yet known). */\n plannedDuration?: number;\n /**\n * Whether this range ends at the start of the next range of the same CLASS.\n *\n * @remarks Cannot coexist with `duration` or `end`.\n */\n endOnNext?: boolean;\n /** Custom attributes (SCTE35- and X- prefixed). */\n attributes?: Record<string, any>;\n}\n\n/**\n * Splice / marker information.\n *\n * Carried by `#EXT-X-CUE-OUT`, `#EXT-X-CUE-IN`, and raw SCTE-35 tags.\n */\nexport interface SpliceInfo {\n /** Marker type. */\n type: \"OUT\" | \"IN\" | \"RAW\";\n /** Duration in seconds (for `OUT` type). */\n duration?: number;\n /** Original tag name (for `RAW` type). */\n tagName?: string;\n /** Raw tag value. */\n value?: any;\n}\n\n/**\n * Alternative Rendition.\n *\n * Corresponds to the `#EXT-X-MEDIA` tag.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.4.1 | RFC 8216 §4.3.4.1}\n */\nexport interface Rendition {\n /** Media type: `\"AUDIO\"`, `\"VIDEO\"`, `\"SUBTITLES\"`, or `\"CLOSED-CAPTIONS\"`. */\n type: string;\n /** URI of the media playlist (optional for AUDIO/VIDEO). */\n uri?: string;\n /** Rendition group ID. */\n groupId: string;\n /** Primary language (RFC 5646 tag). */\n language?: string;\n /** Associated language (RFC 5646 tag). */\n assocLanguage?: string;\n /** Human-readable name. */\n name: string;\n /** Whether this is the default rendition. */\n isDefault?: boolean;\n /** Whether this can be auto-selected. */\n autoselect?: boolean;\n /** Whether this is forced (SUBTITLES only). */\n forced?: boolean;\n /**\n * In-stream ID.\n *\n * @remarks Required when `type` is `\"CLOSED-CAPTIONS\"`.\n * Valid: `\"CC1\"`-`\"CC4\"`, `\"SERVICE1\"`-`\"SERVICE63\"`.\n */\n instreamId?: string;\n /** Uniform Type Identifiers (UTIs), comma-separated. */\n characteristics?: string;\n /** Audio channel count and parameters. */\n channels?: string;\n /** Pathway ID for content steering. */\n pathwayId?: string;\n}\n\n/**\n * Variant Stream.\n *\n * Corresponds to `#EXT-X-STREAM-INF` or `#EXT-X-I-FRAME-STREAM-INF`.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.4.2 | RFC 8216 §4.3.4.2}\n */\nexport interface Variant {\n /** URI of the media playlist. */\n uri: string;\n /** Peak bit rate in bits per second. */\n bandwidth: number;\n /** Average bit rate in bits per second. */\n averageBandwidth?: number;\n /**\n * Variant SCORE (LL-HLS), used for prioritised playlist reload.\n *\n * @remarks If any variant has a SCORE, all variants SHOULD have one.\n */\n score?: number;\n /** Codec identifiers (RFC 6381). */\n codecs?: string;\n /** Optimal display resolution. */\n resolution?: Resolution;\n /** Maximum frame rate (rounded to 3 decimal places). */\n frameRate?: number;\n /** HDCP level: `\"TYPE-0\"` or `\"NONE\"`. */\n hdcpLevel?: string;\n /** Allowed Content Protection Configurations. */\n allowedCpc?: AllowedCpc[];\n /** Video range: `\"SDR\"`, `\"HLG\"`, or `\"PQ\"`. */\n videoRange?: string;\n /** Stable variant identifier. */\n stableVariantId?: string;\n /** Pathway ID for content steering. */\n pathwayId?: string;\n /** Program ID.\n *\n * @deprecated Removed in protocol version 6.\n */\n programId?: number;\n /** Whether this is an I-frame variant (`#EXT-X-I-FRAME-STREAM-INF`). */\n isIFrameOnly?: boolean;\n /** Audio renditions matching this variant's GROUP-ID. */\n audio?: Rendition[];\n /** Video renditions matching this variant's GROUP-ID. */\n video?: Rendition[];\n /** Subtitle renditions matching this variant's GROUP-ID. */\n subtitles?: Rendition[];\n /** Closed-caption renditions matching this variant's GROUP-ID. */\n closedCaptions?: Rendition[];\n}\n\n/**\n * Allowed Content Protection Configuration entry.\n *\n * Part of the `ALLOWED-CPC` attribute value.\n */\nexport interface AllowedCpc {\n /** Content protection format identifier. */\n format: string;\n /** List of Content Protection Configurations. */\n cpcList: string[];\n}\n\n/**\n * Session Data.\n *\n * Corresponds to the `#EXT-X-SESSION-DATA` tag.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.4.4 | RFC 8216 §4.3.4.4}\n */\nexport interface SessionData {\n /** Data identifier (reverse-DNS recommended). */\n id: string;\n /** Inline value (mutually exclusive with `uri`). */\n value?: string;\n /** URI to a JSON resource (mutually exclusive with `value`). */\n uri?: string;\n /** Language of the value (RFC 5646 tag). */\n language?: string;\n}\n\n/**\n * Content Steering configuration.\n *\n * Corresponds to the `#EXT-X-CONTENT-STEERING` tag.\n */\nexport interface ContentSteering {\n /** Server URI for the steering manifest. */\n serverUri: string;\n /** Pathway ID to use. */\n pathwayId?: string;\n}\n\n/**\n * Rendition Report for Low-Latency HLS.\n *\n * Corresponds to the `#EXT-X-RENDITION-REPORT` tag.\n *\n * @beta LL-HLS feature\n */\nexport interface RenditionReport {\n /** URI of the rendition playlist (must be relative). */\n uri: string;\n /** Last Media Sequence Number. */\n lastMSN?: number;\n /** Last Part index. */\n lastPart?: number;\n}\n\n/**\n * Preferred start position.\n *\n * Corresponds to the `#EXT-X-START` tag.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.5.2 | RFC 8216 §4.3.5.2}\n */\nexport interface StartData {\n /**\n * Time offset in seconds.\n *\n * @remarks Positive = from beginning, negative = from end.\n */\n offset: number;\n /**\n * Whether to precisely seek to the TIME-OFFSET.\n *\n * @defaultValue `false`\n */\n precise?: boolean;\n}\n\n/**\n * Low-Latency HLS server control parameters.\n *\n * Corresponds to the `#EXT-X-SERVER-CONTROL` tag.\n *\n * @beta LL-HLS feature\n */\nexport interface LowLatencyCompatibility {\n /** Whether block reload is supported. */\n canBlockReload: boolean;\n /** Maximum skip duration in seconds. */\n canSkipUntil?: number;\n /** Minimum hold-back time in seconds. */\n holdBack?: number;\n /** Minimum part hold-back time in seconds. */\n partHoldBack?: number;\n}\n\n/**\n * Tag parameter tuple: `[value, attributes]`.\n *\n * @internal\n */\nexport type TagParam = [any, Record<string, any> | null];\n\n/**\n * User-defined attribute value.\n *\n * @internal\n */\nexport type UserAttribute = string | number | Uint8Array;\n\n/**\n * Master Playlist.\n *\n * Contains variant streams and renditions for adaptive bitrate streaming.\n *\n * @remarks\n * Type discriminator: `isMasterPlaylist === true`.\n *\n * @example\n * ```ts\n * import { parse } from '@skax/hls-parse';\n * const pl = parse(m3u8Content) as MasterPlaylist;\n * for (const v of pl.variants) {\n * console.log(v.bandwidth, v.uri);\n * }\n * ```\n */\nexport interface MasterPlaylist {\n /** Type discriminator — always `true` for Master Playlist. */\n isMasterPlaylist: true;\n /** The raw playlist source text. */\n source?: string;\n /** Protocol compatibility version. */\n version?: number;\n /** Whether independent segments are signaled. */\n independentSegments?: boolean;\n /** Preferred start position. */\n start?: StartData;\n /** Content steering configuration. */\n contentSteering?: ContentSteering;\n /** Variable definitions (`#EXT-X-DEFINE`). */\n defines?: Record<string, any>[];\n /** Session data entries. */\n sessionDataList: SessionData[];\n /** Session keys. */\n sessionKeyList: Key[];\n /** Variant streams (`#EXT-X-STREAM-INF` / `#EXT-X-I-FRAME-STREAM-INF`). */\n variants: Variant[];\n}\n\n/**\n * Media Playlist.\n *\n * Contains segments and metadata for sequential playback.\n *\n * @remarks\n * Type discriminator: `isMasterPlaylist === false`.\n *\n * @example\n * ```ts\n * import { parse } from '@skax/hls-parse';\n * const pl = parse(m3u8Content) as MediaPlaylist;\n * for (const seg of pl.segments) {\n * console.log(seg.uri, seg.duration);\n * }\n * ```\n */\nexport interface MediaPlaylist {\n /** Type discriminator — always `false` for Media Playlist. */\n isMasterPlaylist: false;\n /** The raw playlist source text. */\n source?: string;\n /** Protocol compatibility version. */\n version?: number;\n /** Whether independent segments are signaled. */\n independentSegments?: boolean;\n /** Preferred start position. */\n start?: StartData;\n /** Variable definitions (`#EXT-X-DEFINE`). */\n defines?: Record<string, any>[];\n /** Maximum segment duration in seconds (`#EXT-X-TARGETDURATION`). */\n targetDuration?: number;\n /** Base media sequence number. */\n mediaSequenceBase?: number;\n /** Base discontinuity sequence number. */\n discontinuitySequenceBase?: number;\n /** Whether the playlist is complete (`#EXT-X-ENDLIST`). */\n endlist?: boolean;\n /** Playlist type: `\"EVENT\"` or `\"VOD\"`. */\n playlistType?: string;\n /** Whether this is an I-frame only playlist. */\n isIFrame?: boolean;\n /** LL-HLS server control parameters. */\n lowLatencyCompatibility?: LowLatencyCompatibility;\n /** Partial segment target duration (LL-HLS). */\n partTargetDuration?: number;\n /** Bitrate of the media playlist in bps (RFC 8216bis EXT-X-BITRATE). */\n bitrate?: number;\n /** Number of skipped segments (LL-HLS `#EXT-X-SKIP`). */\n skip?: number;\n /** Media segments. */\n segments: Segment[];\n /** Prefetch segments (LL-HLS). */\n prefetchSegments: PrefetchSegment[];\n /** Rendition reports (LL-HLS). */\n renditionReports: RenditionReport[];\n /** Date ranges in the playlist. */\n dateRanges: DateRange[];\n}\n\n/**\n * Union type for any parsed playlist.\n *\n * @remarks\n * Use the `isMasterPlaylist` discriminator to narrow the type:\n * ```ts\n * if (pl.isMasterPlaylist) {\n * // pl is MasterPlaylist\n * } else {\n * // pl is MediaPlaylist\n * }\n * ```\n */\nexport type Playlist = MasterPlaylist | MediaPlaylist;\n\n/**\n * Options for the {@link parse} function.\n */\nexport interface ParseOptions {\n /**\n * Base URI for resolving relative URLs in the playlist.\n *\n * @remarks\n * If provided, all relative URIs (segment URIs, key URIs, map URIs,\n * variant URIs, etc.) will be resolved to absolute URLs.\n *\n * @example\n * ```ts\n * const pl = parse(m3u8, { uri: 'https://example.com/hls/main.m3u8' });\n * // pl.segments[0].uri → 'https://example.com/hls/segment.ts'\n * ```\n */\n uri?: string;\n}\n\n// ============================================================================\n// Type guard helpers\n// ============================================================================\n\n/**\n * Type guard: returns `true` if the parsed playlist is a Master Playlist.\n *\n * @example\n * ```ts\n * const pl = parse(m3u8);\n * if (isMasterPlaylist(pl)) {\n * pl.variants; // ← narrowed to MasterPlaylist\n * }\n * ```\n */\nexport function isMasterPlaylist(pl: Playlist): pl is MasterPlaylist {\n return pl.isMasterPlaylist === true;\n}\n\n/**\n * Type guard: returns `true` if the parsed playlist is a Media Playlist.\n *\n * @example\n * ```ts\n * const pl = parse(m3u8);\n * if (isMediaPlaylist(pl)) {\n * pl.segments; // ← narrowed to MediaPlaylist\n * }\n * ```\n */\nexport function isMediaPlaylist(pl: Playlist): pl is MediaPlaylist {\n return pl.isMasterPlaylist === false;\n}\n"],"names":["InvalidPlaylistError","message","name","Error","INVALIDPLAYLIST","console","warn","trim","str","char","undefined","start","end","length","slice","splitAt","delimiter","index","indexOf","splitByCommaWithPreservingQuotes","result","current","inQuotes","i","push","toNumber","num","Number","isNaN","hexToByteSequence","hex","h","startsWith","bytes","Uint8Array","parseInt","camelify","toLowerCase","replace","_","c","toUpperCase","resolveUrl","base","relative","test","baseUrl","URL","protocol","href","match","baseDir","resolved","parts","split","_create_for_of_iterator_helper_loose","part","pop","join","EXTM3U","EXT_X_VERSION","EXT_X_CONTENT_STEERING","EXTINF","EXT_X_BYTERANGE","EXT_X_DISCONTINUITY","EXT_X_PREFETCH_DISCONTINUITY","EXT_X_KEY","EXT_X_MAP","EXT_X_PROGRAM_DATE_TIME","EXT_X_DATERANGE","EXT_X_CUE_OUT","EXT_X_CUE_IN","EXT_X_CUE_OUT_CONT","EXT_X_CUE","EXT_OATCLS_SCTE35","EXT_X_ASSET","EXT_X_SCTE35","EXT_X_PART","EXT_X_PRELOAD_HINT","EXT_X_GAP","EXT_X_BITRATE","EXT_X_TARGETDURATION","EXT_X_MEDIA_SEQUENCE","EXT_X_DISCONTINUITY_SEQUENCE","EXT_X_ENDLIST","EXT_X_PLAYLIST_TYPE","EXT_X_I_FRAMES_ONLY","EXT_X_SERVER_CONTROL","EXT_X_PART_INF","EXT_X_PREFETCH","EXT_X_RENDITION_REPORT","EXT_X_SKIP","EXT_X_MEDIA","EXT_X_STREAM_INF","EXT_X_I_FRAME_STREAM_INF","EXT_X_SESSION_DATA","EXT_X_SESSION_KEY","EXT_X_INDEPENDENT_SEGMENTS","EXT_X_START","EXT_X_DEFINE","getTagCategory","tagName","T","parseEXTINF","param","pair","utils","duration","title","decodeURIComponent","encodeURIComponent","parseBYTERANGE","offset","parseResolution","width","height","parseAllowedCpc","list","allowedCpcList","item","format","cpcText","cpcList","parseIV","iv","parseUserAttribute","setCompatibleVersionOfKey","params","attributes","compatibleVersion","parseAttributeList","key","value","val","Date","splitTag","line","parseTagParam","MIXEDTAGS","parseTag","category","CHECKTAGCATEGORY","hash","isMasterPlaylist","lexicalParse","text","lines","normalized","charCodeAt","rawLines","l","tag","parseRendition","attrs","type","uri","groupId","language","assocLanguage","isDefault","autoselect","forced","instreamId","characteristics","channels","pathwayId","matchTypes","variant","isClosedCaptionsNone","closedCaptions","renditions","some","parseVariant","variantAttrs","iFrameOnly","mediaGroups","bandwidth","averageBandwidth","score","codecs","resolution","frameRate","hdcpLevel","allowedCpc","videoRange","stableVariantId","programId","isIFrameOnly","attrsGroupId","typeMap","get","r","addRenditionToList","rendition","sameKey","key1","key2","method","byteLength","formatVersion","buildMediaGroupIndex","Map","set","group","parseMasterPlaylist","playlist","version","contentSteering","serverUri","uriLine","variantIsScored","variants","URI","sessionData","id","sessionDataList","sessionKey","sessionKeyList","independentSegments","precise","defines","entries","cc","parseDateRange","Object","keys","classId","cue","plannedDuration","endOnNext","parseSegment","mediaSequenceNumber","discontinuitySequence","segment","markers","partHint","isInteger","Math","round","targetDuration","byterange","discontinuity","gap","hasMap","map","programDateTime","dateRange","DURATION","hint","partialSegment","independent","parsePrefetchSegment","addSegment","currentKey","currentMap","segments","prevSegment","checkDateRange","earliestDates","rangeList","hasDateRange","hasProgramDateTime","getTime","range","entry","checkLowLatencyCompatibility","containsParts","lowLatencyCompatibility","partTargetDuration","canSkipUntil","holdBack","partHoldBack","segmentIndex","partIndex","renditionReports","report","lastSegment","lastMSN","lastPart","parseMediaPlaylist","prefetchSegments","dateRanges","segmentStart","mediaSequence","prefetchFound","newDiscSeq","newKey","newMap","mediaSequenceBase","bitrate","discontinuitySequenceBase","endlist","playlistType","isIFrame","canBlockReload","skip","semanticParse","resolvePlaylistUris","baseUri","master","sd","sk","steering","mp","prefetch","parse","options","source","pl","isMediaPlaylist"],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @skax/hls-parse v0.0.1-beta.1
|
|
3
|
+
* Copyright (c) 2026-05-23 ShineShao <xiaoshaoqq@gmail.com>
|
|
4
|
+
* Released under the MIT License.
|
|
5
|
+
*/
|
|
6
|
+
"use strict";function _array_like_to_array$1(arr,len){(null==len||len>arr.length)&&(len=arr.length);for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}function _construct(Parent,args,Class){return _construct=_is_native_reflect_construct()?Reflect.construct:function(Parent,args,Class){var a=[null];a.push.apply(a,args);var instance=new(Function.bind.apply(Parent,a));return Class&&_set_prototype_of(instance,Class.prototype),instance},_construct.apply(null,arguments)}function _get_prototype_of(o){return _get_prototype_of=Object.setPrototypeOf?Object.getPrototypeOf:function(o){return o.__proto__||Object.getPrototypeOf(o)},_get_prototype_of(o)}function _set_prototype_of(o,p){return _set_prototype_of=Object.setPrototypeOf||function(o,p){return o.__proto__=p,o},_set_prototype_of(o,p)}function _wrap_native_super(Class){var _cache="function"==typeof Map?new Map:void 0;return _wrap_native_super=function(Class){if(null===Class||(fn=Class,-1===Function.toString.call(fn).indexOf("[native code]")))return Class;var fn;if("function"!=typeof Class)throw new TypeError("Super expression must either be null or a function");if(void 0!==_cache){if(_cache.has(Class))return _cache.get(Class);_cache.set(Class,Wrapper)}function Wrapper(){return _construct(Class,arguments,_get_prototype_of(this).constructor)}return Wrapper.prototype=Object.create(Class.prototype,{constructor:{value:Wrapper,enumerable:!1,writable:!0,configurable:!0}}),_set_prototype_of(Wrapper,Class)},_wrap_native_super(Class)}function _is_native_reflect_construct(){try{var result=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(_){}return(_is_native_reflect_construct=function(){return!!result})()}function _create_for_of_iterator_helper_loose$1(o,allowArrayLike){var it="undefined"!=typeof Symbol&&o[Symbol.iterator]||o["@@iterator"];if(it)return(it=it.call(o)).next.bind(it);if(Array.isArray(o)||(it=function(o,minLen){if(o){if("string"==typeof o)return _array_like_to_array$1(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);return"Object"===n&&o.constructor&&(n=o.constructor.name),"Map"===n||"Set"===n?Array.from(n):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_array_like_to_array$1(o,minLen):void 0}}(o))||allowArrayLike){it&&(o=it);var i=0;return function(){return i>=o.length?{done:!0}:{done:!1,value:o[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}Object.defineProperty(exports,"__esModule",{value:!0});var InvalidPlaylistError=function(Error1){function InvalidPlaylistError(message){var _this;return(_this=Error1.call(this,message)||this).name="InvalidPlaylistError",_this}return function(subClass,superClass){if("function"!=typeof superClass&&null!==superClass)throw new TypeError("Super expression must either be null or a function");subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,writable:!0,configurable:!0}}),superClass&&_set_prototype_of(subClass,superClass)}(InvalidPlaylistError,Error1),InvalidPlaylistError}(_wrap_native_super(Error));function trim(str,char){if(void 0!==str){for(var start=0,end=str.length-1;start<=end&&str[start]===char;)start++;for(;end>=start&&str[end]===char;)end--;return str.slice(start,end+1)}}function splitAt(str,delimiter){var index=str.indexOf(delimiter);return-1===index?[str,""]:[str.slice(0,index),str.slice(index+1)]}function toNumber(str){return Number(str)}function hexToByteSequence(hex){var h=hex;(h.startsWith("0x")||h.startsWith("0X"))&&(h=h.slice(2)),h.length%2!=0&&(h="0"+h);for(var bytes=new Uint8Array(h.length/2),i=0;i<bytes.length;i++)bytes[i]=parseInt(h.slice(2*i,2*i+2),16);return bytes}function camelify(str){return str.toLowerCase().replace(/[-_](.)/g,function(_,c){return c.toUpperCase()})}function resolveUrl(base,relative){if(!base)return relative;if(/^[a-zA-Z][a-zA-Z0-9+\-.]*:/.test(relative))return relative;try{var baseUrl=new URL(base);return relative.startsWith("//")?baseUrl.protocol+relative:new URL(relative,baseUrl).href}catch(unused){if(relative.startsWith("/")){var match=base.match(/^[a-zA-Z][a-zA-Z0-9+\-.]*:\/\/[^/]+/);if(match)return match[0]+relative}for(var _step,result=[],_iterator=_create_for_of_iterator_helper_loose$1((base.replace(/\/[^/]*$/,"/")+relative).split("/"));!(_step=_iterator()).done;){var part=_step.value;".."===part?result.pop():"."!==part&&result.push(part)}return result.join("/")}}var constants=Object.freeze({__proto__:null,EXTINF:"EXTINF",EXTM3U:"EXTM3U",EXT_OATCLS_SCTE35:"EXT-OATCLS-SCTE35",EXT_X_ASSET:"EXT-X-ASSET",EXT_X_BITRATE:"EXT-X-BITRATE",EXT_X_BYTERANGE:"EXT-X-BYTERANGE",EXT_X_CONTENT_STEERING:"EXT-X-CONTENT-STEERING",EXT_X_CUE:"EXT-X-CUE",EXT_X_CUE_IN:"EXT-X-CUE-IN",EXT_X_CUE_OUT:"EXT-X-CUE-OUT",EXT_X_CUE_OUT_CONT:"EXT-X-CUE-OUT-CONT",EXT_X_DATERANGE:"EXT-X-DATERANGE",EXT_X_DEFINE:"EXT-X-DEFINE",EXT_X_DISCONTINUITY:"EXT-X-DISCONTINUITY",EXT_X_DISCONTINUITY_SEQUENCE:"EXT-X-DISCONTINUITY-SEQUENCE",EXT_X_ENDLIST:"EXT-X-ENDLIST",EXT_X_GAP:"EXT-X-GAP",EXT_X_INDEPENDENT_SEGMENTS:"EXT-X-INDEPENDENT-SEGMENTS",EXT_X_I_FRAMES_ONLY:"EXT-X-I-FRAMES-ONLY",EXT_X_I_FRAME_STREAM_INF:"EXT-X-I-FRAME-STREAM-INF",EXT_X_KEY:"EXT-X-KEY",EXT_X_MAP:"EXT-X-MAP",EXT_X_MEDIA:"EXT-X-MEDIA",EXT_X_MEDIA_SEQUENCE:"EXT-X-MEDIA-SEQUENCE",EXT_X_PART:"EXT-X-PART",EXT_X_PART_INF:"EXT-X-PART-INF",EXT_X_PLAYLIST_TYPE:"EXT-X-PLAYLIST-TYPE",EXT_X_PREFETCH:"EXT-X-PREFETCH",EXT_X_PREFETCH_DISCONTINUITY:"EXT-X-PREFETCH-DISCONTINUITY",EXT_X_PRELOAD_HINT:"EXT-X-PRELOAD-HINT",EXT_X_PROGRAM_DATE_TIME:"EXT-X-PROGRAM-DATE-TIME",EXT_X_RENDITION_REPORT:"EXT-X-RENDITION-REPORT",EXT_X_SCTE35:"EXT-X-SCTE35",EXT_X_SERVER_CONTROL:"EXT-X-SERVER-CONTROL",EXT_X_SESSION_DATA:"EXT-X-SESSION-DATA",EXT_X_SESSION_KEY:"EXT-X-SESSION-KEY",EXT_X_SKIP:"EXT-X-SKIP",EXT_X_START:"EXT-X-START",EXT_X_STREAM_INF:"EXT-X-STREAM-INF",EXT_X_TARGETDURATION:"EXT-X-TARGETDURATION",EXT_X_VERSION:"EXT-X-VERSION"});function _array_like_to_array(arr,len){(null==len||len>arr.length)&&(len=arr.length);for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}function _type_of(obj){return obj&&"undefined"!=typeof Symbol&&obj.constructor===Symbol?"symbol":typeof obj}function _create_for_of_iterator_helper_loose(o,allowArrayLike){var it="undefined"!=typeof Symbol&&o[Symbol.iterator]||o["@@iterator"];if(it)return(it=it.call(o)).next.bind(it);if(Array.isArray(o)||(it=function(o,minLen){if(o){if("string"==typeof o)return _array_like_to_array(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);return"Object"===n&&o.constructor&&(n=o.constructor.name),"Map"===n||"Set"===n?Array.from(n):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_array_like_to_array(o,minLen):void 0}}(o))||allowArrayLike){it&&(o=it);var i=0;return function(){return i>=o.length?{done:!0}:{done:!1,value:o[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function parseEXTINF(param){var pair=splitAt(param,",");return{duration:toNumber(pair[0]),title:pair[1]?decodeURIComponent(encodeURIComponent(pair[1])):void 0}}function parseBYTERANGE(param){var pair=splitAt(param,"@");return{length:toNumber(pair[0]),offset:pair[1]?toNumber(pair[1]):-1}}function parseResolution(str){var pair=splitAt(str,"x");return{width:toNumber(pair[0]),height:toNumber(pair[1])}}function parseAllowedCpc(str){for(var _step,allowedCpcList=[],_iterator=_create_for_of_iterator_helper_loose(str.split(","));!(_step=_iterator()).done;){var _utils_splitAt=splitAt(_step.value,":"),format=_utils_splitAt[0],cpcText=_utils_splitAt[1];format&&cpcText&&allowedCpcList.push({format:format,cpcList:cpcText.split("/")})}return allowedCpcList}function parseIV(str){var iv=hexToByteSequence(str);return iv.length,iv}function parseUserAttribute(str){return str.startsWith('"')?trim(str,'"'):str.startsWith("0x")||str.startsWith("0X")?hexToByteSequence(str):toNumber(str)}function setCompatibleVersionOfKey(params,attributes){attributes.IV&¶ms.compatibleVersion<2&&(params.compatibleVersion=2),(attributes.KEYFORMAT||attributes.KEYFORMATVERSIONS)&¶ms.compatibleVersion<5&&(params.compatibleVersion=5)}function parseAttributeList(param){for(var _step,attributes={},_iterator=_create_for_of_iterator_helper_loose(function(str){for(var result=[],current="",inQuotes=!1,i=0;i<str.length;i++){var char=str[i];'"'===char?(inQuotes=!inQuotes,current+=char):","!==char||inQuotes?current+=char:(result.push(current),current="")}return current&&result.push(current),result}(param));!(_step=_iterator()).done;){var _utils_splitAt=splitAt(_step.value,"="),key=_utils_splitAt[0],value=_utils_splitAt[1],val=trim(value,'"');switch(key){case"URI":attributes[key]=val;break;case"START-DATE":case"END-DATE":attributes[key]=new Date(val);break;case"IV":attributes[key]=parseIV(val);break;case"BYTERANGE":attributes[key]=parseBYTERANGE(val);break;case"RESOLUTION":attributes[key]=parseResolution(val);break;case"ALLOWED-CPC":attributes[key]=parseAllowedCpc(val);break;case"END-ON-NEXT":case"DEFAULT":case"AUTOSELECT":case"FORCED":case"PRECISE":case"CAN-BLOCK-RELOAD":case"INDEPENDENT":case"GAP":attributes[key]="YES"===val;break;case"DURATION":case"PLANNED-DURATION":case"BANDWIDTH":case"AVERAGE-BANDWIDTH":case"FRAME-RATE":case"TIME-OFFSET":case"CAN-SKIP-UNTIL":case"HOLD-BACK":case"PART-HOLD-BACK":case"PART-TARGET":case"BYTERANGE-START":case"BYTERANGE-LENGTH":case"LAST-MSN":case"LAST-PART":case"SKIPPED-SEGMENTS":case"SCORE":case"PROGRAM-ID":attributes[key]=toNumber(val);break;default:key.startsWith("SCTE35-")?attributes[key]=hexToByteSequence(val):key.startsWith("X-")?attributes[key]=parseUserAttribute(value):attributes[key]=val}}return attributes}function parseTag(line,params){var _splitTag=function(line){var index=line.indexOf(":");return-1===index?[line.slice(1).trim(),null]:[line.slice(1,index).trim(),line.slice(index+1).trim()]}(line),name=_splitTag[0],param=_splitTag[1],category=function(tagName){switch(tagName){case"EXTM3U":case"EXT-X-VERSION":case"EXT-X-CONTENT-STEERING":return"Basic";case"EXTINF":case"EXT-X-BYTERANGE":case"EXT-X-DISCONTINUITY":case"EXT-X-PREFETCH-DISCONTINUITY":case"EXT-X-KEY":case"EXT-X-MAP":case"EXT-X-PROGRAM-DATE-TIME":case"EXT-X-DATERANGE":case"EXT-X-CUE-OUT":case"EXT-X-CUE-IN":case"EXT-X-CUE-OUT-CONT":case"EXT-X-CUE":case"EXT-OATCLS-SCTE35":case"EXT-X-ASSET":case"EXT-X-SCTE35":case"EXT-X-PART":case"EXT-X-PRELOAD-HINT":case"EXT-X-GAP":return"Segment";case"EXT-X-BITRATE":case"EXT-X-TARGETDURATION":case"EXT-X-MEDIA-SEQUENCE":case"EXT-X-DISCONTINUITY-SEQUENCE":case"EXT-X-ENDLIST":case"EXT-X-PLAYLIST-TYPE":case"EXT-X-I-FRAMES-ONLY":case"EXT-X-SERVER-CONTROL":case"EXT-X-PART-INF":case"EXT-X-PREFETCH":case"EXT-X-RENDITION-REPORT":case"EXT-X-SKIP":return"MediaPlaylist";case"EXT-X-MEDIA":case"EXT-X-STREAM-INF":case"EXT-X-I-FRAME-STREAM-INF":case"EXT-X-SESSION-DATA":case"EXT-X-SESSION-KEY":return"MasterPlaylist";case"EXT-X-INDEPENDENT-SEGMENTS":case"EXT-X-START":case"EXT-X-DEFINE":return"MediaorMasterPlaylist";default:return"Unknown"}}(name);if(function(category,params){if("Segment"===category||"MediaPlaylist"===category)return void 0===params.isMasterPlaylist?void(params.isMasterPlaylist=!1):void params.isMasterPlaylist;if("MasterPlaylist"===category){if(void 0===params.isMasterPlaylist)return void(params.isMasterPlaylist=!0);params.isMasterPlaylist}}(category,params),"Unknown"===category)return null;"MediaPlaylist"===category&&"EXT-X-RENDITION-REPORT"!==name&&"EXT-X-PREFETCH"!==name&&(params.hash[name],params.hash[name]=!0);var _parseTagParam=function(name,param){if(null===param)return[null,null];switch(name){case"EXTM3U":case"EXT-X-DISCONTINUITY":case"EXT-X-ENDLIST":case"EXT-X-I-FRAMES-ONLY":case"EXT-X-INDEPENDENT-SEGMENTS":case"EXT-X-CUE-IN":case"EXT-X-GAP":return[null,null];case"EXT-X-VERSION":case"EXT-X-TARGETDURATION":case"EXT-X-MEDIA-SEQUENCE":case"EXT-X-DISCONTINUITY-SEQUENCE":case"EXT-X-BITRATE":return[toNumber(param),null];case"EXT-X-CUE-OUT":return Number.isNaN(Number(param))?[null,parseAttributeList(param)]:[toNumber(param),null];case"EXT-X-KEY":case"EXT-X-MAP":case"EXT-X-DATERANGE":case"EXT-X-MEDIA":case"EXT-X-STREAM-INF":case"EXT-X-I-FRAME-STREAM-INF":case"EXT-X-SESSION-DATA":case"EXT-X-SESSION-KEY":case"EXT-X-START":case"EXT-X-SERVER-CONTROL":case"EXT-X-PART-INF":case"EXT-X-PART":case"EXT-X-PRELOAD-HINT":case"EXT-X-RENDITION-REPORT":case"EXT-X-SKIP":case"EXT-X-DEFINE":case"EXT-X-CONTENT-STEERING":return[null,parseAttributeList(param)];case"EXTINF":return[parseEXTINF(param),null];case"EXT-X-BYTERANGE":return[parseBYTERANGE(param),null];case"EXT-X-PROGRAM-DATE-TIME":return[new Date(param),null];default:return[param,null]}}(name,param);return{name:name,category:category,value:_parseTagParam[0],attributes:_parseTagParam[1]||{}}}function parseVariant(variantAttrs,uri,iFrameOnly,params,mediaGroups){for(var variant={uri:uri,bandwidth:variantAttrs.BANDWIDTH,averageBandwidth:variantAttrs["AVERAGE-BANDWIDTH"],score:variantAttrs.SCORE,codecs:variantAttrs.CODECS,resolution:variantAttrs.RESOLUTION,frameRate:variantAttrs["FRAME-RATE"],hdcpLevel:variantAttrs["HDCP-LEVEL"],allowedCpc:variantAttrs["ALLOWED-CPC"],videoRange:variantAttrs["VIDEO-RANGE"],stableVariantId:variantAttrs["STABLE-VARIANT-ID"],pathwayId:variantAttrs["PATHWAY-ID"]||variantAttrs["STABLE-PATHWAY-ID"],programId:variantAttrs["PROGRAM-ID"],isIFrameOnly:iFrameOnly},_i=0,_iter=["AUDIO","VIDEO","SUBTITLES","CLOSED-CAPTIONS"];_i<_iter.length;_i++){var type=_iter[_i],attrsGroupId=variantAttrs[type];if(attrsGroupId){var typeMap=mediaGroups.get(type);if(typeMap){var renditions=typeMap.get(attrsGroupId);if(renditions)for(var _step,_iterator=_create_for_of_iterator_helper_loose(renditions);!(_step=_iterator()).done;){addRenditionToList(variant,_step.value,type)}}}}return function(attrs,variant,params){for(var _loop=function(_i,_iter){var type=_iter[_i];if("CLOSED-CAPTIONS"===type&&"NONE"===attrs[type])params.isClosedCaptionsNone=!0,variant.closedCaptions=[];else if(attrs[type]){var key=camelify(type),renditions=variant[key]||[];renditions.length>0&&renditions.some(function(item){return item.groupId===attrs[type]})}},_i=0,_iter=["AUDIO","VIDEO","SUBTITLES","CLOSED-CAPTIONS"];_i<_iter.length;_i++)_loop(_i,_iter)}(variantAttrs,variant,params),variant}function addRenditionToList(variant,rendition,type){var key=camelify(type),renditions=variant[key];renditions||(renditions=[],variant[key]=renditions),renditions.push(rendition)}function parseMasterPlaylist(lines,params){for(var _step,_loop=function(){var _step_value=_step.value,index=_step_value[0],line=_step_value[1];if("string"==typeof line)return"continue";var name=line.name,value=line.value,attributes=line.attributes;if("EXT-X-VERSION"===name)playlist.version=value;else if("EXT-X-CONTENT-STEERING"===name)playlist.contentSteering={serverUri:attributes["SERVER-URI"],pathwayId:attributes["PATHWAY-ID"]};else if("EXT-X-STREAM-INF"===name){var uriLine=lines[index+1];"string"!=typeof uriLine||uriLine.startsWith("#");var variant=parseVariant(attributes,uriLine,!1,params,mediaGroups);"number"==typeof variant.score&&(variantIsScored=!0,variant.score),playlist.variants.push(variant)}else if("EXT-X-I-FRAME-STREAM-INF"===name){var variant1=parseVariant(attributes,attributes.URI,!0,params,mediaGroups);playlist.variants.push(variant1)}else if("EXT-X-SESSION-DATA"===name){var sessionData={id:attributes["DATA-ID"],value:attributes.VALUE,uri:attributes.URI,language:attributes.LANGUAGE};playlist.sessionDataList.some(function(item){return item.id===sessionData.id&&item.language===sessionData.language}),playlist.sessionDataList.push(sessionData)}else if("EXT-X-SESSION-KEY"===name){attributes.METHOD;var sessionKey={method:attributes.METHOD,uri:attributes.URI,iv:attributes.IV,format:attributes.KEYFORMAT,formatVersion:attributes.KEYFORMATVERSIONS};playlist.sessionKeyList.some(function(item){return function(key1,key2){if(key1.method!==key2.method)return!1;if(key1.uri!==key2.uri)return!1;if(key1.iv){if(!key2.iv)return!1;if(key1.iv.byteLength!==key2.iv.byteLength)return!1;for(var i=0;i<key1.iv.byteLength;i++)if(key1.iv[i]!==key2.iv[i])return!1}else if(key2.iv)return!1;return key1.format===key2.format&&key1.formatVersion===key2.formatVersion}(item,sessionKey)}),setCompatibleVersionOfKey(params,attributes),playlist.sessionKeyList.push(sessionKey)}else"EXT-X-INDEPENDENT-SEGMENTS"===name?(playlist.independentSegments,playlist.independentSegments=!0):"EXT-X-START"===name?(playlist.start,attributes["TIME-OFFSET"],playlist.start={offset:attributes["TIME-OFFSET"],precise:attributes.PRECISE||!1}):"EXT-X-DEFINE"===name&&(playlist.defines||(playlist.defines=[]),playlist.defines.push(attributes))},playlist={isMasterPlaylist:!0,variants:[],sessionDataList:[],sessionKeyList:[]},mediaGroups=function(lines){for(var _step,_loop=function(){var attrs,line=_step.value;if("object"===(void 0===line?"undefined":_type_of(line))&&"EXT-X-MEDIA"===line.name){var rendition={type:(attrs=line.attributes).TYPE,uri:attrs.URI,groupId:attrs["GROUP-ID"],language:attrs.LANGUAGE,assocLanguage:attrs["ASSOC-LANGUAGE"],name:attrs.NAME,isDefault:attrs.DEFAULT,autoselect:attrs.AUTOSELECT,forced:attrs.FORCED,instreamId:attrs["INSTREAM-ID"],characteristics:attrs.CHARACTERISTICS,channels:attrs.CHANNELS,pathwayId:attrs["PATHWAY-ID"]},type=rendition.type,groupId=rendition.groupId,typeMap=index.get(type);typeMap||(typeMap=new Map,index.set(type,typeMap));var group=typeMap.get(groupId);group||(group=[],typeMap.set(groupId,group)),group.some(function(r){return r.name===rendition.name}),rendition.isDefault&&group.some(function(r){return r.isDefault}),group.push(rendition)}},index=new Map,_iterator=_create_for_of_iterator_helper_loose(lines);!(_step=_iterator()).done;)_loop();return index}(lines),variantIsScored=!1,_iterator=_create_for_of_iterator_helper_loose(lines.entries());!(_step=_iterator()).done;)_loop();if(variantIsScored)for(var _step1,_iterator1=_create_for_of_iterator_helper_loose(playlist.variants);!(_step1=_iterator1()).done;){_step1.value.score}if(params.isClosedCaptionsNone)for(var _step2,_iterator2=_create_for_of_iterator_helper_loose(playlist.variants);!(_step2=_iterator2()).done;){var cc=_step2.value.closedCaptions;cc&&cc.length}return playlist}function parseDateRange(attributes){for(var _step,attrs={},_iterator=_create_for_of_iterator_helper_loose(Object.keys(attributes));!(_step=_iterator()).done;){var key=_step.value;(key.startsWith("SCTE35-")||key.startsWith("X-"))&&(attrs[key]=attributes[key])}return{id:attributes.ID,classId:attributes.CLASS,start:attributes["START-DATE"],cue:attributes.CUE,end:attributes["END-DATE"],duration:attributes.DURATION,plannedDuration:attributes["PLANNED-DURATION"],endOnNext:attributes["END-ON-NEXT"],attributes:attrs}}function parseSegment(lines,uri,start,end,mediaSequenceNumber,discontinuitySequence,params){for(var segment={uri:uri,mediaSequenceNumber:mediaSequenceNumber,discontinuitySequence:discontinuitySequence,markers:[],parts:[]},partHint=!1,i=start;i<=end;i++)if("string"!=typeof lines[i]){var _lines_i=lines[i],name=_lines_i.name,value=_lines_i.value,attributes=_lines_i.attributes;if("EXTINF"===name)!Number.isInteger(value.duration)&¶ms.compatibleVersion<3&&(params.compatibleVersion=3),Math.round(value.duration),params.targetDuration,segment.duration=value.duration,segment.title=value.title;else if("EXT-X-BYTERANGE"===name)params.compatibleVersion<4&&(params.compatibleVersion=4),segment.byterange=value;else if("EXT-X-DISCONTINUITY"===name)segment.parts&&segment.parts.length,segment.discontinuity=!0;else if("EXT-X-GAP"===name)params.compatibleVersion<8&&(params.compatibleVersion=8),segment.gap=!0;else if("EXT-X-KEY"===name)segment.parts&&segment.parts.length,setCompatibleVersionOfKey(params,attributes),segment.key={method:attributes.METHOD,uri:attributes.URI,iv:attributes.IV,format:attributes.KEYFORMAT,formatVersion:attributes.KEYFORMATVERSIONS};else if("EXT-X-MAP"===name)segment.parts&&segment.parts.length,params.compatibleVersion<5&&(params.compatibleVersion=5),params.hasMap=!0,segment.map={uri:attributes.URI,byterange:attributes.BYTERANGE};else if("EXT-X-PROGRAM-DATE-TIME"===name)segment.programDateTime=value;else if("EXT-X-DATERANGE"===name)segment.dateRange=parseDateRange(attributes);else if("EXT-X-CUE-OUT"===name)segment.markers||(segment.markers=[]),segment.markers.push({type:"OUT",duration:attributes&&attributes.DURATION||value});else if("EXT-X-CUE-IN"===name)segment.markers||(segment.markers=[]),segment.markers.push({type:"IN"});else if("EXT-X-CUE-OUT-CONT"===name||"EXT-X-CUE"===name||"EXT-OATCLS-SCTE35"===name||"EXT-X-ASSET"===name||"EXT-X-SCTE35"===name)segment.markers||(segment.markers=[]),segment.markers.push({type:"RAW",tagName:name,value:value});else if("EXT-X-PRELOAD-HINT"!==name||attributes.TYPE)if("EXT-X-PRELOAD-HINT"===name&&"PART"===attributes.TYPE&&partHint);else if("EXT-X-PART"!==name&&"EXT-X-PRELOAD-HINT"!==name||attributes.URI){if("EXT-X-PRELOAD-HINT"===name&&"MAP"===attributes.TYPE)params.hasMap=!0,segment.map={hint:!0,uri:attributes.URI,byterange:{length:attributes["BYTERANGE-LENGTH"],offset:attributes["BYTERANGE-START"]||0}};else if("EXT-X-PART"===name||"EXT-X-PRELOAD-HINT"===name&&"PART"===attributes.TYPE){"EXT-X-PART"===name&&attributes.DURATION,"EXT-X-PRELOAD-HINT"===name&&(partHint=!0),segment.parts||(segment.parts=[]);var partialSegment={hint:"EXT-X-PRELOAD-HINT"===name,uri:attributes.URI,byterange:"EXT-X-PART"===name?attributes.BYTERANGE:{length:attributes["BYTERANGE-LENGTH"],offset:attributes["BYTERANGE-START"]||0},duration:attributes.DURATION,independent:attributes.INDEPENDENT,gap:attributes.GAP};segment.gap,segment.parts.push(partialSegment)}}else;else;}return segment}function parsePrefetchSegment(lines,uri,start,end,mediaSequenceNumber,discontinuitySequence,params){for(var segment={uri:uri,mediaSequenceNumber:mediaSequenceNumber,discontinuitySequence:discontinuitySequence},i=start;i<=end;i++)if("string"!=typeof lines[i]){var _lines_i=lines[i],name=_lines_i.name,attributes=_lines_i.attributes;"EXTINF"===name||"EXT-X-DISCONTINUITY"===name||("EXT-X-PREFETCH-DISCONTINUITY"===name?segment.discontinuity=!0:"EXT-X-KEY"===name&&(setCompatibleVersionOfKey(params,attributes),segment.key={method:attributes.METHOD,uri:attributes.URI,iv:attributes.IV,format:attributes.KEYFORMAT,formatVersion:attributes.KEYFORMATVERSIONS}))}return segment}function addSegment(playlist,segment,discontinuitySequence,currentKey,currentMap){var _segment_key,_segment_map,discontinuity=segment.discontinuity,key=segment.key,map=segment.map,byterange=segment.byterange,uri=segment.uri;if(discontinuity&&(segment.discontinuitySequence=discontinuitySequence+1),key||(segment.key=currentKey),map||(segment.map=currentMap),byterange&&-1===byterange.offset){var segments=playlist.segments;if(segments.length>0){var prevSegment=segments[segments.length-1];prevSegment.byterange&&prevSegment.uri===uri&&(byterange.offset=prevSegment.byterange.offset+prevSegment.byterange.length)}}return playlist.segments.push(segment),[segment.discontinuitySequence,null!=(_segment_key=segment.key)?_segment_key:null,null!=(_segment_map=segment.map)?_segment_map:null]}function parseMediaPlaylist(lines,params){for(var _step,playlist={isMasterPlaylist:!1,segments:[],prefetchSegments:[],renditionReports:[],dateRanges:[]},segmentStart=-1,mediaSequence=0,discontinuitySequence=0,currentKey=null,currentMap=null,containsParts=!1,_iterator=_create_for_of_iterator_helper_loose(lines.entries());!(_step=_iterator()).done;){var _step_value=_step.value,index=_step_value[0],line=_step_value[1];if("string"!=typeof line){var name=line.name,value=line.value,attributes=line.attributes,category=line.category;if("EXT-X-DATERANGE"===name){var dateRange=parseDateRange(attributes);playlist.dateRanges.push(dateRange)}if("Segment"!==category)if("EXT-X-VERSION"===name)void 0===playlist.version&&(playlist.version=value);else if("EXT-X-TARGETDURATION"===name)playlist.targetDuration=params.targetDuration=value;else if("EXT-X-MEDIA-SEQUENCE"===name)playlist.segments.length,playlist.mediaSequenceBase=value,mediaSequence=value;else if("EXT-X-BITRATE"===name)playlist.bitrate=value;else if("EXT-X-DISCONTINUITY-SEQUENCE"===name)playlist.segments.length,playlist.discontinuitySequenceBase=value,discontinuitySequence=value;else if("EXT-X-ENDLIST"===name)playlist.endlist=!0;else if("EXT-X-PLAYLIST-TYPE"===name)playlist.playlistType=value;else if("EXT-X-I-FRAMES-ONLY"===name)params.compatibleVersion<4&&(params.compatibleVersion=4),playlist.isIFrame=!0;else if("EXT-X-INDEPENDENT-SEGMENTS"===name)playlist.independentSegments,playlist.independentSegments=!0;else if("EXT-X-START"===name)playlist.start,attributes["TIME-OFFSET"],playlist.start={offset:attributes["TIME-OFFSET"],precise:attributes.PRECISE||!1};else if("EXT-X-SERVER-CONTROL"===name)attributes["CAN-BLOCK-RELOAD"],playlist.lowLatencyCompatibility={canBlockReload:attributes["CAN-BLOCK-RELOAD"],canSkipUntil:attributes["CAN-SKIP-UNTIL"],holdBack:attributes["HOLD-BACK"],partHoldBack:attributes["PART-HOLD-BACK"]};else if("EXT-X-PART-INF"===name)attributes["PART-TARGET"],playlist.partTargetDuration=attributes["PART-TARGET"];else if("EXT-X-RENDITION-REPORT"===name)attributes.URI,/^[a-z]+:/i.test(attributes.URI),playlist.renditionReports.push({uri:attributes.URI,lastMSN:attributes["LAST-MSN"],lastPart:attributes["LAST-PART"]});else if("EXT-X-SKIP"===name)attributes["SKIPPED-SEGMENTS"],params.compatibleVersion<9&&(params.compatibleVersion=9),playlist.skip=attributes["SKIPPED-SEGMENTS"],mediaSequence+=playlist.skip;else if("EXT-X-PREFETCH"===name){var segment1=parsePrefetchSegment(lines,value,-1===segmentStart?index:segmentStart,index-1,mediaSequence++,discontinuitySequence,params);segment1.discontinuity&&(segment1.discontinuitySequence++,discontinuitySequence=segment1.discontinuitySequence),segment1.key||(segment1.key=currentKey),playlist.prefetchSegments.push(segment1),segmentStart=-1}else"EXT-X-DEFINE"===name&&(playlist.defines||(playlist.defines=[]),playlist.defines.push(attributes));else-1===segmentStart&&(segmentStart=index)}else{playlist.targetDuration;var segment=parseSegment(lines,line,segmentStart,index-1,mediaSequence++,discontinuitySequence,params),_addSegment=addSegment(playlist,segment,discontinuitySequence,currentKey,currentMap);discontinuitySequence=_addSegment[0],currentKey=_addSegment[1],currentMap=_addSegment[2],!containsParts&&segment.parts&&segment.parts.length>0&&(containsParts=!0),segmentStart=-1}}if(-1!==segmentStart){var _parts_,segment2=parseSegment(lines,"",segmentStart,lines.length-1,mediaSequence++,discontinuitySequence,params),parts=segment2.parts;parts&&parts.length>0&&!playlist.endlist&&(null==(_parts_=parts[parts.length-1])||_parts_.hint),addSegment(playlist,segment2,discontinuitySequence,currentKey,currentMap),!containsParts&&segment2.parts&&segment2.parts.length>0&&(containsParts=!0)}return function(segments){for(var earliestDates=new Map,rangeList=new Map,i=segments.length-1;i>=0;i--){var _segments_i=segments[i];_segments_i.programDateTime;var dateRange=_segments_i.dateRange;if(dateRange&&dateRange.start){dateRange.endOnNext&&(dateRange.end||dateRange.duration);var start=dateRange.start.getTime(),duration=dateRange.duration||0;dateRange.end&&dateRange.duration&&dateRange.end.getTime(),dateRange.endOnNext&&dateRange.classId&&(dateRange.end=earliestDates.get(dateRange.classId)),earliestDates.set(dateRange.classId,dateRange.start);var end=dateRange.end?dateRange.end.getTime():start+1e3*duration;if(dateRange.classId){var range=rangeList.get(dateRange.classId);if(range){for(var _step,_iterator=_create_for_of_iterator_helper_loose(range);!(_step=_iterator()).done;){var entry=_step.value;entry.start<=start&&entry.end>start||entry.start>=start&&entry.start}range.push({start:start,end:end})}else rangeList.set(dateRange.classId,[{start:start,end:end}])}}}}(playlist.segments),playlist.lowLatencyCompatibility&&function(playlist,containsParts){var lowLatencyCompatibility=playlist.lowLatencyCompatibility;if(playlist.targetDuration,playlist.partTargetDuration,lowLatencyCompatibility&&(lowLatencyCompatibility.canSkipUntil,lowLatencyCompatibility.holdBack,lowLatencyCompatibility.partHoldBack,containsParts)){for(var _step,_iterator=_create_for_of_iterator_helper_loose(playlist.segments.entries());!(_step=_iterator()).done;){var _step_value=_step.value,parts=(_step_value[0],_step_value[1].parts);if(parts&&0!==parts.length){playlist.segments.length;for(var _step1,_iterator1=_create_for_of_iterator_helper_loose(parts.entries());!(_step1=_iterator1()).done;){var _step_value1=_step1.value;void 0!==(_step_value1[0],_step_value1[1].duration)&&parts.length}}}for(var _step2,_iterator2=_create_for_of_iterator_helper_loose(playlist.renditionReports);!(_step2=_iterator2()).done;){var report=_step2.value,lastSegment=playlist.segments[playlist.segments.length-1];void 0===report.lastMSN&&lastSegment&&(report.lastMSN=lastSegment.mediaSequenceNumber),(void 0===report.lastPart||null===report.lastPart)&&lastSegment&&lastSegment.parts&&lastSegment.parts.length>0&&(report.lastPart=lastSegment.parts.length-1)}}}(playlist,containsParts),playlist}function parse(text,options){var params={isMasterPlaylist:void 0,hasMap:!1,targetDuration:0,compatibleVersion:1,isClosedCaptionsNone:!1,hash:{}},lines=function(text,params){var lines=[],normalized=text;65279===normalized.charCodeAt(0)&&(normalized=normalized.slice(1));for(var _step,_iterator=_create_for_of_iterator_helper_loose(normalized.split(/\r?\n/));!(_step=_iterator()).done;){var line=_step.value.trim();if(line)if(line.startsWith("#")){if(line.startsWith("#EXT")){var tag=parseTag(line,params);tag&&lines.push(tag)}}else lines.push(line)}return 0===lines.length||"object"!==_type_of(lines[0])||lines[0].name,lines}(text,params),playlist=function(lines,params){var playlist;return params.isMasterPlaylist?playlist=parseMasterPlaylist(lines,params):!(playlist=parseMediaPlaylist(lines,params)).isMasterPlaylist&&!playlist.isIFrame&¶ms.hasMap&¶ms.compatibleVersion<6&&(params.compatibleVersion=6),params.compatibleVersion>1&&void 0!==playlist.version&&null!==playlist.version&&playlist.version<params.compatibleVersion&¶ms.compatibleVersion,playlist}(lines,params);return playlist.source=text,(null==options?void 0:options.uri)&&function(playlist,baseUri){if(playlist.isMasterPlaylist){for(var _step,master=playlist,_iterator=_create_for_of_iterator_helper_loose(master.variants);!(_step=_iterator()).done;){var variant=_step.value;variant.uri=resolveUrl(baseUri,variant.uri);for(var _i=0,_iter=["audio","video","subtitles","closedCaptions"];_i<_iter.length;_i++){var renditions=variant[_iter[_i]];if(renditions)for(var _step1,_iterator1=_create_for_of_iterator_helper_loose(renditions);!(_step1=_iterator1()).done;){var r=_step1.value;r.uri&&(r.uri=resolveUrl(baseUri,r.uri))}}}for(var _step2,_iterator2=_create_for_of_iterator_helper_loose(master.sessionDataList);!(_step2=_iterator2()).done;){var sd=_step2.value;sd.uri&&(sd.uri=resolveUrl(baseUri,sd.uri))}for(var _step3,_iterator3=_create_for_of_iterator_helper_loose(master.sessionKeyList);!(_step3=_iterator3()).done;){var sk=_step3.value;sk.uri&&(sk.uri=resolveUrl(baseUri,sk.uri))}var steering=master.contentSteering;steering&&(steering.serverUri=resolveUrl(baseUri,steering.serverUri))}else{for(var _step4,mp=playlist,_iterator4=_create_for_of_iterator_helper_loose(mp.segments);!(_step4=_iterator4()).done;){var segment=_step4.value;if(segment.uri=resolveUrl(baseUri,segment.uri),segment.key&&segment.key.uri&&(segment.key.uri=resolveUrl(baseUri,segment.key.uri)),segment.map&&segment.map.uri&&(segment.map.uri=resolveUrl(baseUri,segment.map.uri)),segment.parts)for(var _step5,_iterator5=_create_for_of_iterator_helper_loose(segment.parts);!(_step5=_iterator5()).done;){var part=_step5.value;part.uri=resolveUrl(baseUri,part.uri)}}for(var _step6,_iterator6=_create_for_of_iterator_helper_loose(mp.prefetchSegments);!(_step6=_iterator6()).done;){var prefetch=_step6.value;prefetch.uri=resolveUrl(baseUri,prefetch.uri),prefetch.key&&prefetch.key.uri&&(prefetch.key.uri=resolveUrl(baseUri,prefetch.key.uri))}for(var _step7,_iterator7=_create_for_of_iterator_helper_loose(mp.renditionReports);!(_step7=_iterator7()).done;){var report=_step7.value;report.uri=resolveUrl(baseUri,report.uri)}}}(playlist,options.uri),playlist}exports.InvalidPlaylistError=InvalidPlaylistError,exports.TAGS=constants,exports.default=parse,exports.isMasterPlaylist=function(pl){return!0===pl.isMasterPlaylist},exports.isMediaPlaylist=function(pl){return!1===pl.isMasterPlaylist},exports.parse=parse,exports.resolveUrl=resolveUrl;
|