From 06889ce378b7f179a659924a42d3edb01ea1a578 Mon Sep 17 00:00:00 2001 From: Slava Leleka Date: Tue, 7 Feb 2023 10:03:55 +0300 Subject: [PATCH] AG-18722 add m3u-prune scriptlet. #277 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Squashed commit of the following: commit dc4d7a4e77de904f86b930691c62b94b57d17323 Author: Slava Leleka Date: Mon Feb 6 19:13:39 2023 +0200 update changelog commit ef02fc99a0aa23a7b5b13148338fe6d6be51676f Author: Adam Wróblewski Date: Mon Feb 6 14:01:18 2023 +0100 Style the multiple array methods in different way commit 52295a93c6e608ef8fe192436bf8e0b5870fa5d0 Author: Adam Wróblewski Date: Mon Feb 6 13:52:23 2023 +0100 Add a comment commit 169a9e1d4998921bce9e3ac291533cc981225b1b Author: Adam Wróblewski Date: Mon Feb 6 13:41:35 2023 +0100 Use `map()` method instead of `for loop` commit 1c7aaaf9ace30568daef7a18bc2ea1993a2561c0 Author: Adam Wróblewski Date: Mon Jan 30 13:42:12 2023 +0100 Rename IMPORTANT_TAGS to TAGS_ALLOWLIST Rename isImportantTag to isAllowedTag Use startsWith native function Use includes insted of indexOf Use async/await commit b6fffbc7023f4ebb7d49e2423de535a7221c4839 Author: Adam Wróblewski Date: Thu Jan 26 18:33:52 2023 +0100 Fix linter errors and warnings Use logMessage helper commit 1931b76c651cbb01c13ff76246fd92a90a515281 Merge: 641057e5 3ed6475d Author: Slava Leleka Date: Thu Jan 26 18:13:07 2023 +0200 resolve conflicts commit 3ed6475da34b1d320f6eea7771f4df77df24efa9 Merge: 602a5024 c179e6fd Author: Adam Wróblewski Date: Thu Jan 26 15:03:22 2023 +0100 Merge branch 'release/v1.8' into feature/AG-16687 commit 602a5024510b46e8531a5f3585f648caab511a2e Author: Adam Wróblewski Date: Thu Jan 26 14:54:35 2023 +0100 Do nothing if response type is not a string commit c179e6fd358ec6f4fcef39fd5e87318db6f81757 Author: Stanislav A Date: Thu Jan 19 12:42:46 2023 +0300 update docs commit 7fa8b464f711a2554828c9b97ce23d2e54aa31d2 Author: Stanislav A Date: Thu Jan 19 12:33:56 2023 +0300 set v1.8.1 in changelog commit 35e0e5a7002b086ba793e9a53c787c1a53908b43 Author: Stanislav Atroschenko Date: Wed Jan 18 21:38:19 2023 +0300 AG-18125 add inject-css-in-shadow-dom scriplet #267 Merge in ADGUARD-FILTERS/scriptlets from feature/AG-18125 to release/v1.8 Squashed commit of the following: commit 0e8aa2f157b368666701514a09a80d0b63e8a3c5 Merge: 25eaacac d6d46626 Author: Stanislav A Date: Wed Jan 18 21:14:26 2023 +0300 Merge branch 'release/v1.8' into feature/AG-18125 commit 25eaacac0db5fd3ec8493f67b6272e50ae220700 Author: Stanislav A Date: Wed Jan 18 19:20:20 2023 +0300 fix description commit 0b78ff21c4b08d87e35a223330c8c8e39bccd7af Author: Stanislav A Date: Wed Jan 18 19:19:14 2023 +0300 fix test and improve hostSelector arg description commit 5443317377e7d497e6a90fe1cbb6fc95f594a99f Author: Stanislav A Date: Wed Jan 18 17:47:49 2023 +0300 improve logging invalid rule and fix description commit 9191fc8953c036a855b45df6b14a4b1662ff2c93 Author: Stanislav A Date: Wed Jan 18 17:09:27 2023 +0300 gaurd CSSStyleSheet constructor commit 65f1b08594fa0c2c83ab480276ca6278334aa139 Author: Stanislav A Date: Wed Jan 18 16:44:06 2023 +0300 guard Proxy and Reflect commit 3d351b6e1e2babee355ce1c27bc9e67f69dc31f7 Author: Stanislav A Date: Wed Jan 18 16:08:40 2023 +0300 add image-set to disallowed css functions commit b283b307b1f5acbcf40a607bee1afc2191aa9a5c Author: Stanislav A Date: Wed Jan 18 15:14:18 2023 +0300 update changelog commit 95ec59bd3b6b704231aeb0ea8f930754001623da Author: Stanislav A Date: Wed Jan 18 14:47:59 2023 +0300 add testcase for complex layout and open root commit ca7b9d03c1d960920e85621b028ba4c0929c965a Author: Stanislav A Date: Wed Jan 18 14:09:43 2023 +0300 disallow url func in styles and add testcases commit ccf89284060637b889e8a502a304dd7b41b7118e Author: Stanislav A Date: Tue Jan 17 20:43:10 2023 +0300 add hostSelector, limit selectors to 1 rule and 1 host selectors, add testcase commit ed308a9d48ae523fdfb8e4587f0b0e182f51f66e Author: Stanislav A Date: Tue Jan 17 16:02:14 2023 +0300 add css injection via style tag and add testcase commit f1a6ff873264ca3f4f8c330c2399f289fd396ac8 Author: Stanislav A Date: Tue Jan 17 04:50:56 2023 +0300 remove legacy leftovers commit c8808ba2bfb713992242869d5046d11f14390fb9 Author: Stanislav A Date: Tue Jan 17 04:45:18 2023 +0300 add inject-css-in-shadow-dom scriplet commit d6d46626e18859a33445135a0e9f369eeb26c4d7 Author: Stanislav A Date: Wed Jan 18 20:37:59 2023 +0300 add missing gh issue number to changelog commit 59528ffaf3a81f63bf6a9362305086db4894a9db Author: Stanislav Atroschenko Date: Tue Jan 17 03:46:53 2023 +0300 update 1.8 changelog Merge in ADGUARD-FILTERS/scriptlets from update_1.8_changelog to release/v1.8 Squashed commit of the following: commit 3e7e3bee1975c49746745f95fd72677fc4c5af53 Author: Stanislav A Date: Mon Jan 16 20:11:34 2023 +0300 add getScriptletFunction change to log commit cc63542420601caf561ed99b121847858acff692 Author: Stanislav A Date: Mon Jan 16 19:08:15 2023 +0300 update changelog commit 0b493a8811569762fc90ea4f291da6538582ab53 Author: Stanislav A Date: Mon Jan 16 16:19:53 2023 +0300 fix jsdoc tag for trusted-set-constant commit c8868cb11fbb90bdf6cd00d54efb979db4ad6842 Author: Stanislav Atroschenko Date: Mon Jan 16 15:27:26 2023 +0300 AG-17126 Update browsers compatibility Merge in ADGUARD-FILTERS/scriptlets from fix/AG-17126 to release/v1.8 Squashed commit of the following: commit e705cd2cf0c0c7b56baac28f6e3229d4752a0fd7 Merge: e56f3055 d09e5efc Author: Stanislav A Date: Mon Jan 16 15:16:47 2023 +0300 Merge branch 'release/v1.8' into fix/AG-17126 commit e56f305573ca40f956b4c26922da164b67277cac Author: Stanislav A Date: Fri Jan 13 18:58:35 2023 +0300 remove compatibilityGuartd helper commit 7dccc55cc21ad851c5ebba5f05b4b22d65b05856 Author: Stanislav A Date: Fri Jan 13 18:52:33 2023 +0300 Revert "use isBrowserSupported in tests" This reverts commit b7b1156511584d997d2fba8b7ab319127efa92c6. commit 6d4dc6db50afcca1f9cc7742f8b1ebb6228ec7c2 Author: Stanislav A Date: Fri Jan 13 18:42:33 2023 +0300 revert removing global methods check commit bdee33f3e3f82510f8c347b1bda857fd839794d1 Author: Stanislav A Date: Fri Jan 13 17:48:38 2023 +0300 add targets to babel config commit 283d0be744b7b3b6cfefb70e4e4ab25e569c0732 Author: Stanislav A Date: Fri Jan 13 13:45:17 2023 +0300 remove attachShadow from isBrowserSupported commit 6ee9c62f3108b65d0effbada30d4735d9ca83183 Author: Stanislav A Date: Fri Jan 13 13:39:28 2023 +0300 remove eslint compat plugin commit 94a4d062afea9c8193fe8259caa6ff98ac210c8c Author: Stanislav A Date: Fri Jan 13 12:38:44 2023 +0300 fix compat guard commit b7b1156511584d997d2fba8b7ab319127efa92c6 Author: Stanislav A Date: Thu Jan 12 15:02:07 2023 +0300 use isBrowserSupported in tests commit 53884e64414fda8e713b27ab76e11f95a15937eb Author: Stanislav A Date: Thu Jan 12 14:47:53 2023 +0300 remove legacy wrappers from prevent-setTimeout and prevent-setInterval scriptlets commit c19db5d6bb84beaa9ef0be1315d376bd54a061fd Author: Stanislav A Date: Thu Jan 12 14:40:03 2023 +0300 remove checking global methods in scriptlets commit ff07fb52d28c900e3af59693fa922fddaf50ebe6 Author: Stanislav A Date: Thu Jan 12 14:16:17 2023 +0300 improve compatibility check commit 71986f35656b989b0b0a98a211858f4fe8a9d656 Author: Stanislav A Date: Wed Jan 11 14:28:29 2023 +0300 remove babel plugins that are included in preset and fix transforms commit d415b9cf51e724e4fe8c44e1ee12e5e3947efcd3 Author: Stanislav A Date: Wed Jan 11 13:40:49 2023 +0300 remove compat/compat rule and exclusions commit 179a7b45c0eee65a31c209f413a63f03ae01798f Author: Stanislav A Date: Wed Jan 11 13:18:43 2023 +0300 update babel config commit 27a3fda547ea51bdec81b49fd4e688eb0db333ed Author: Stanislav A Date: Wed Jan 11 12:35:52 2023 +0300 fix checkCompatibility injections commit fa12a236da7c42e434a59ad7e56191a26fc2d02e Author: Stanislav A Date: Wed Jan 11 12:07:07 2023 +0300 update babel deps commit 51056fe90167a793d4265fa8763e42663d17bf86 Author: Stanislav A Date: Wed Jan 11 11:54:50 2023 +0300 add compatibility guard commit 9531694dee095d2016b6506416d41e0470b02996 Author: Stanislav A Date: Wed Jan 11 11:34:36 2023 +0300 update readme commit d09e5efc857042d04158194fa646b68a378f778e Merge: 0f789e19 b350a74e Author: Stanislav A Date: Mon Jan 16 15:02:33 2023 +0300 merge master commit 0f789e19a74a823c1c2855709961bbd88c697fa1 Author: Stanislav Atroschenko Date: Fri Jan 13 11:48:02 2023 +0300 AG-9480 add trusted-set-constant scriptlet #137 Merge in ADGUARD-FILTERS/scriptlets from feature/AG-9480 to release/v1.8 Squashed commit of the following: commit e69dccdaba283b37e85a1540c7541baf0fa060e0 Author: Stanislav A Date: Thu Jan 12 14:49:58 2023 +0300 improve inferValue description commit 3dcf6d4840c3fdba5ea2ff05470cf6f8f25ad7c8 Author: Stanislav A Date: Thu Jan 12 12:59:05 2023 +0300 add 32767 to const and tweak failing test commit 39f1c2dc101f880b216141af4efa462a1c3fc3fa Author: Stanislav A Date: Thu Jan 12 12:23:50 2023 +0300 add testcases with string value commit bb1960e020517004d1cf665dd62621f4ad0ed5ac Author: Stanislav A Date: Wed Jan 11 21:40:48 2023 +0300 fix and improve description commit 68b112c5716c693db763ca7dd2653f13d1d31772 Author: Stanislav A Date: Wed Jan 11 19:37:30 2023 +0300 improve funcs descriptions and warning commit d62083387e10fddcd035cc632b5a24d550198014 Author: Stanislav A Date: Wed Jan 11 19:17:50 2023 +0300 improve value type inferred and remove shouldInfer argument commit 824e900af3499633d646ecadfe5ed8220696fa29 Author: Stanislav A Date: Wed Jan 11 17:39:17 2023 +0300 jsdoc set-constant helpers commit 71a5451cc2e1f1c7f1d5a6c15216fa1f9601284e Author: Stanislav A Date: Wed Jan 11 14:58:30 2023 +0300 fix typos commit b9bb8fe901e20e21f3d18cebee2118f51dfeccc1 Author: Stanislav A Date: Wed Jan 11 14:49:07 2023 +0300 swap 0x7FFF to 32767 everywhere commit 4fa3b37ee132d347dd51ce9172157beab4a42d7c Merge: 327216a7 96e65b4b Author: Stanislav A Date: Tue Jan 10 14:43:35 2023 +0300 Merge branch 'release/v1.8' into feature/AG-9480 commit 327216a7ee833bc0fbe41feb8da6a27b20db2536 Author: Stanislav A Date: Tue Jan 10 14:32:47 2023 +0300 update changelog commit 0af2569db8b5fad688b07e5d1547ebc399961c65 Author: Stanislav A Date: Tue Jan 10 12:55:01 2023 +0300 fix tests commit 726e63dc9cdd7b30f100782e4caafa230ee2de36 Author: Stanislav A Date: Mon Jan 9 21:16:26 2023 +0300 update description commit 105ea07b51b613ea91048390ce60ce897d234e7c Author: Stanislav A Date: Mon Jan 9 19:30:05 2023 +0300 fix helper and add scriptlet tests commit bcef888acf5bcec082ae8ddd3e1aa1791569fc14 Author: Stanislav A Date: Fri Dec 30 18:49:45 2022 +0300 draft inferValue helper commit e45a707220ea1319a525830757796ee7f769e30a Author: Stanislav A Date: Thu Dec 29 16:24:04 2022 +0300 draft trusted-set-constant commit 96e65b4b4ec899268f9a685bc54ed3fcd4fe88eb Author: Stanislav Atroschenko Date: Tue Jan 10 14:36:30 2023 +0300 AG-17246 fix code style to conform to guidelines Merge in ADGUARD-FILTERS/scriptlets from fix/AG-17246 to release/v1.8 Squashed commit of the following: commit 62ebabae021badccfa3bedfdf13ad8cda84a675a Author: Stanislav A Date: Mon Jan 9 21:20:40 2023 +0300 remove dashes after param docs commit 3e1ea2d02c0c2e75d3f6e618563f338928e9bc78 Author: Stanislav A Date: Mon Jan 9 21:18:22 2023 +0300 swap wildcard to 'any' for param types commit 9edacb068d328039ac5d0f67f215a43c0d69f7ae Author: Stanislav A Date: Fri Dec 30 14:52:40 2022 +0300 config and apply check-types commit 8a17e2d657e572d746c28ad19c021b023d890617 Author: Stanislav A Date: Fri Dec 30 14:10:50 2022 +0300 remove unsupported import syntax commit c49ebf47b79996efed88ea05c88ef455c838df40 Author: Stanislav A Date: Thu Dec 29 20:51:12 2022 +0300 enable rules for helpers p2 commit 279c58904a11c16473729bd382bc4fe9868925d7 Author: Stanislav A Date: Thu Dec 29 20:18:20 2022 +0300 enable rules for helpers p1 commit 6e3f5de3968035acff369747a8cd119913ebd1be Author: Stanislav A Date: Thu Dec 29 17:04:06 2022 +0300 split overrides into separate eslint configs commit bbffe492aa6f9f33385b4b20f8be1f4b0edc019a Merge: 8717f33b 0aeb1d5c Author: Stanislav A Date: Thu Dec 29 16:34:42 2022 +0300 merge master commit 8717f33bd9d4affd6f1aeeb4d43b97354e933b8c Author: Stanislav A Date: Wed Dec 28 20:39:28 2022 +0300 use rules for helpers commit 026785f4ce6b2dbb83e9e80f63a969b075790981 Author: Stanislav A Date: Wed Dec 28 20:03:59 2022 +0300 fix tag-lines p2 commit 9a4aa4d0e3e9cee4c812d98a8460a269388dc04e Merge: 048e32c8 89185d3e Author: Stanislav A Date: Wed Dec 28 18:48:44 2022 +0300 merge release/v1.8 commit 048e32c886cced586fe5f6b32cb95814072c0ef2 Author: Stanislav A Date: Wed Dec 28 15:09:30 2022 +0300 enable jsdoc/require-property-description commit c3d3d5d10dc48259be416e78d675ecce2c0f6501 Author: Stanislav A Date: Wed Dec 28 14:39:00 2022 +0300 enable jsdoc/tag-lines commit fe47c15f0fe1f537d860df1e05e84637d082ae6e Author: Stanislav A Date: Wed Dec 28 14:14:21 2022 +0300 enable jsdoc/require-returns commit f5d898e43ba49800707e16f97d7f5f29bf5d1dea Author: Stanislav A Date: Wed Dec 28 13:33:58 2022 +0300 enable jsdoc/newline-after-description commit 034db74d130feaad63622b9f78774b6e22cc89a1 Author: Stanislav A Date: Wed Dec 28 12:59:12 2022 +0300 enable jsdoc/check-tag-names commit 286558e0d6aeaf42f5941ef0c36d7a731d01a0b5 Author: Stanislav A Date: Tue Dec 27 21:11:37 2022 +0300 enable jsdoc/require-param-type commit b34878a2ca29ade2235927207c3584e46726da50 Author: Stanislav A Date: Tue Dec 27 20:59:30 2022 +0300 enable jsdoc/check-alignment commit fe206576731c70958e9c92724e8cad6d902bb347 Author: Stanislav A Date: Tue Dec 27 20:56:32 2022 +0300 enable jsdoc/check-types commit 4908c90f48e8a552f0600bfb50c30f3e0aa16b0c Author: Stanislav A Date: Tue Dec 27 20:48:19 2022 +0300 enable jsdoc/check-param-names ... and 4 more commits commit 0aeb1d5c53f3ed20d98f98e94974ca160a83112a Merge: 89185d3e 88c982d5 Author: Stanislav A Date: Thu Dec 29 13:55:35 2022 +0300 merge master ... and 52 more commits --- CHANGELOG.md | 9 + src/scriptlets/m3u-prune.js | 398 +++++++++++ src/scriptlets/scriptlets-list.js | 1 + tests/scriptlets/index.test.js | 1 + tests/scriptlets/m3u-prune.test.js | 663 ++++++++++++++++++ .../test-files/manifestM3U8-01.m3u8 | 96 +++ .../test-files/manifestM3U8-02.m3u8 | 79 +++ .../test-files/manifestM3U8-03.m3u8 | 249 +++++++ .../test-files/manifestM3U8-04.m3u8 | 86 +++ wiki/about-scriptlets.md | 34 + 10 files changed, 1616 insertions(+) create mode 100644 src/scriptlets/m3u-prune.js create mode 100644 tests/scriptlets/m3u-prune.test.js create mode 100644 tests/scriptlets/test-files/manifestM3U8-01.m3u8 create mode 100644 tests/scriptlets/test-files/manifestM3U8-02.m3u8 create mode 100644 tests/scriptlets/test-files/manifestM3U8-03.m3u8 create mode 100644 tests/scriptlets/test-files/manifestM3U8-04.m3u8 diff --git a/CHANGELOG.md b/CHANGELOG.md index eedf0b01..6416f05a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,17 @@ # Scriptlets and Redirect Resources Changelog + +## Unreleased + +### Added + +- new `m3u-prune` scriptlet [#137](https://github.com/AdguardTeam/Scriptlets/issues/277) + + ## v1.8.2 ### Added + - new `trusted-set-constant` scriptlet [#137](https://github.com/AdguardTeam/Scriptlets/issues/137) - new `inject-css-in-shadow-dom` scriptlet [#267](https://github.com/AdguardTeam/Scriptlets/issues/267) - `throwFunc` and `noopCallbackFunc` prop values for `set-constant` scriptlet diff --git a/src/scriptlets/m3u-prune.js b/src/scriptlets/m3u-prune.js new file mode 100644 index 00000000..f435a6de --- /dev/null +++ b/src/scriptlets/m3u-prune.js @@ -0,0 +1,398 @@ +import { + hit, + toRegExp, + logMessage, +} from '../helpers/index'; + +/* eslint-disable max-len */ +/** + * @scriptlet m3u-prune + * @description + * Removes content from the specified M3U file. + * + * + * **Syntax** + * ``` + * example.org#%#//scriptlet('m3u-prune'[, propsToRemove[, urlToMatch]]) + * ``` + * + * - `propsToRemove` - optional, string or regular expression to match the URL line (segment) which will be removed alongside with its tags + * - `urlToMatch` - optional, string or regular expression for matching the request's URL + * > Usage with no arguments will log response payload and URL to browser console; + * which is useful for debugging but prohibited for production filter lists. + * + * **Examples** + * 1. Removes a tag which contains `tvessaiprod.nbcuni.com/video/`, from all requests + * ``` + * example.org#%#//scriptlet('m3u-prune', 'tvessaiprod.nbcuni.com/video/') + * ``` + * + * 2. Removes a line which contains `tvessaiprod.nbcuni.com/video/`, only if request's URL contains `.m3u8` + * ``` + * example.org#%#//scriptlet('m3u-prune', 'tvessaiprod.nbcuni.com/video/', '.m3u8') + * ``` + * + * 3. Call with no arguments will log response payload and URL at the console + * ``` + * example.org#%#//scriptlet('m3u-prune') + * ``` + * + * 4. Call with only `urlToMatch` argument will log response payload and URL only for the matched URL + * ``` + * example.org#%#//scriptlet('m3u-prune', '', '.m3u8') + * ``` + */ +/* eslint-enable max-len */ + +export function m3uPrune(source, propsToRemove, urlToMatch) { + // do nothing if browser does not support fetch or Proxy (e.g. Internet Explorer) + // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect + if (typeof Reflect === 'undefined' + || typeof fetch === 'undefined' + || typeof Proxy === 'undefined' + || typeof Response === 'undefined') { + return; + } + + let shouldPruneResponse = false; + + const urlMatchRegexp = toRegExp(urlToMatch); + + const SEGMENT_MARKER = '#'; + + const AD_MARKER = { + ASSET: '#EXT-X-ASSET:', + CUE: '#EXT-X-CUE:', + CUE_IN: '#EXT-X-CUE-IN', + DISCONTINUITY: '#EXT-X-DISCONTINUITY', + EXTINF: '#EXTINF', + EXTM3U: '#EXTM3U', + SCTE35: '#EXT-X-SCTE35:', + }; + + const COMCAST_AD_MARKER = { + AD: '-AD-', + VAST: '-VAST-', + VMAP_AD: '-VMAP-AD-', + VMAP_AD_BREAK: '#EXT-X-VMAP-AD-BREAK:', + }; + + // List of tags which should not be removed + const TAGS_ALLOWLIST = [ + '#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-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', + ]; + + const isAllowedTag = (str) => { + return TAGS_ALLOWLIST.some((el) => str.startsWith(el)); + }; + + /** + * Sets an item in array to undefined, if it contains one of the + * AD_MARKER: AD_MARKER.EXTINF, AD_MARKER.DISCONTINUITY + * + * @param {Array} lines + * @param {number} i + * @returns {Object} { array, index } + */ + const pruneExtinfFromVmapBlock = (lines, i) => { + let array = lines.slice(); + let index = i; + if (array[index].includes(AD_MARKER.EXTINF)) { + array[index] = undefined; + index += 1; + if (array[index].includes(AD_MARKER.DISCONTINUITY)) { + array[index] = undefined; + index += 1; + const prunedExtinf = pruneExtinfFromVmapBlock(array, index); + array = prunedExtinf.array; + index = prunedExtinf.index; + } + } + return { array, index }; + }; + + /** + * Sets an item in array to undefined, if it contains one of the + * COMCAST_AD_MARKER: COMCAST_AD_MARKER.VMAP_AD, COMCAST_AD_MARKER.VAST, COMCAST_AD_MARKER.AD + * + * @param {Array} lines + * @returns {Array} + */ + const pruneVmapBlock = (lines) => { + let array = lines.slice(); + for (let i = 0; i < array.length - 1; i += 1) { + if (array[i].includes(COMCAST_AD_MARKER.VMAP_AD) + || array[i].includes(COMCAST_AD_MARKER.VAST) + || array[i].includes(COMCAST_AD_MARKER.AD)) { + array[i] = undefined; + if (array[i + 1].includes(AD_MARKER.EXTINF)) { + i += 1; + const prunedExtinf = pruneExtinfFromVmapBlock(array, i); + array = prunedExtinf.array; + // It's necessary to subtract 1 from "i", + // otherwise one line will be skipped + i = prunedExtinf.index - 1; + } + } + } + return array; + }; + + /** + * Sets an item in array to undefined, if it contains one of the + * AD_MARKER: AD_MARKER.CUE, AD_MARKER.ASSET, AD_MARKER.SCTE35, AD_MARKER.CUE_IN + * + * @param {string} line + * @param {number} index + * @param {Array} array + * @returns {string|undefined} + */ + + const pruneSpliceoutBlock = (line, index, array) => { + if (!line.startsWith(AD_MARKER.CUE)) { + return line; + } + line = undefined; + index += 1; + if (array[index].startsWith(AD_MARKER.ASSET)) { + array[index] = undefined; + index += 1; + } + if (array[index].startsWith(AD_MARKER.SCTE35)) { + array[index] = undefined; + index += 1; + } + if (array[index].startsWith(AD_MARKER.CUE_IN)) { + array[index] = undefined; + index += 1; + } + if (array[index].startsWith(AD_MARKER.SCTE35)) { + array[index] = undefined; + } + return line; + }; + + const removeM3ULineRegexp = toRegExp(propsToRemove); + + /** + * Sets an item in array to undefined, if it contains removeM3ULineRegexp and one of the + * AD_MARKER: AD_MARKER.EXTINF, AD_MARKER.DISCONTINUITY + * + * @param {string} line + * @param {number} index + * @param {Array} array + * @returns {string|undefined} + */ + + const pruneInfBlock = (line, index, array) => { + if (!line.startsWith(AD_MARKER.EXTINF)) { + return line; + } + if (!removeM3ULineRegexp.test(array[index + 1])) { + return line; + } + if (!isAllowedTag(array[index])) { + array[index] = undefined; + } + index += 1; + if (!isAllowedTag(array[index])) { + array[index] = undefined; + } + index += 1; + if (array[index].startsWith(AD_MARKER.DISCONTINUITY)) { + array[index] = undefined; + } + return line; + }; + + /** + * Removes block of segments (if it contains removeM3ULineRegexp) until another segment occurs + * + * @param {Array} lines + * @returns {Array} + */ + const pruneSegments = (lines) => { + for (let i = 0; i < lines.length - 1; i += 1) { + if (lines[i]?.startsWith(SEGMENT_MARKER) && removeM3ULineRegexp.test(lines[i])) { + const segmentName = lines[i].substring(0, lines[i].indexOf(':')); + if (!segmentName) { + return lines; + } + lines[i] = undefined; + i += 1; + for (let j = i; j < lines.length; j += 1) { + if (!lines[j].includes(segmentName) + && !isAllowedTag(lines[j])) { + lines[j] = undefined; + } else { + i = j - 1; + break; + } + } + } + } + return lines; + }; + + /** + * Determines if text contains "#EXTM3U" or "VMAP_AD_BREAK" + * + * @param {*} text + * @returns {boolean} + */ + const isM3U = (text) => { + if (typeof text === 'string') { + // Check if "text" starts with "#EXTM3U" or with "VMAP_AD_BREAK" + // If so, then it might be an M3U file and should be pruned or logged + const trimmedText = text.trim(); + return trimmedText.startsWith(AD_MARKER.EXTM3U) + || trimmedText.startsWith(COMCAST_AD_MARKER.VMAP_AD_BREAK); + } + return false; + }; + + /** + * Determines if pruning is needed + * + * @param {string} text + * @param {RegExp} regexp + * @returns {boolean} + */ + const isPruningNeeded = (text, regexp) => isM3U(text) && regexp.test(text); + + /** + * Prunes lines which contain removeM3ULineRegexp and specific AD_MARKER + * + * @param {string} text + * @returns {string} + */ + // TODO: make it compatible with $hls modifier + const pruneM3U = (text) => { + let lines = text.split(/\n\r|\n|\r/); + + if (text.includes(COMCAST_AD_MARKER.VMAP_AD_BREAK)) { + lines = pruneVmapBlock(lines); + return lines.filter((l) => !!l).join('\n'); + } + + lines = pruneSegments(lines); + + return lines + .map((line, index, array) => { + if (typeof line === 'undefined') { + return line; + } + line = pruneSpliceoutBlock(line, index, array); + if (typeof line !== 'undefined') { + line = pruneInfBlock(line, index, array); + } + return line; + }) + .filter((l) => !!l) + .join('\n'); + }; + + const xhrWrapper = (target, thisArg, args) => { + const xhrURL = args[1]; + if (typeof xhrURL !== 'string' || xhrURL.length === 0) { + return Reflect.apply(target, thisArg, args); + } + if (urlMatchRegexp.test(xhrURL)) { + thisArg.addEventListener('readystatechange', function pruneResponse() { + if (thisArg.readyState === 4) { + const { response } = thisArg; + thisArg.removeEventListener('readystatechange', pruneResponse); + // If "propsToRemove" is not defined, then response should be logged only + if (!propsToRemove) { + if (isM3U(response)) { + const message = `XMLHttpRequest.open() URL: ${xhrURL}\nresponse: ${response}`; + logMessage(source, message); + } + } else { + shouldPruneResponse = isPruningNeeded(response, removeM3ULineRegexp); + } + if (shouldPruneResponse) { + const prunedResponseContent = pruneM3U(response); + Object.defineProperty(thisArg, 'response', { + value: prunedResponseContent, + }); + Object.defineProperty(thisArg, 'responseText', { + value: prunedResponseContent, + }); + hit(source); + } + } + }); + } + return Reflect.apply(target, thisArg, args); + }; + + const xhrHandler = { + apply: xhrWrapper, + }; + // eslint-disable-next-line max-len + window.XMLHttpRequest.prototype.open = new Proxy(window.XMLHttpRequest.prototype.open, xhrHandler); + + const nativeFetch = window.fetch; + + const fetchWrapper = async (target, thisArg, args) => { + const fetchURL = args[0] instanceof Request ? args[0].url : args[0]; + if (typeof fetchURL !== 'string' || fetchURL.length === 0) { + return Reflect.apply(target, thisArg, args); + } + if (urlMatchRegexp.test(fetchURL)) { + const response = await nativeFetch(...args); + const responseText = await response.text(); + // If "propsToRemove" is not defined, then response should be logged only + if (!propsToRemove && isM3U(responseText)) { + const message = `fetch URL: ${fetchURL}\nresponse text: ${responseText}`; + logMessage(source, message); + return Reflect.apply(target, thisArg, args); + } + if (isPruningNeeded(responseText, removeM3ULineRegexp)) { + const prunedText = pruneM3U(responseText); + hit(source); + return new Response(prunedText, { + status: response.status, + statusText: response.statusText, + headers: response.headers, + }); + } + return Reflect.apply(target, thisArg, args); + } + return Reflect.apply(target, thisArg, args); + }; + + const fetchHandler = { + apply: fetchWrapper, + }; + window.fetch = new Proxy(window.fetch, fetchHandler); +} + +m3uPrune.names = [ + 'm3u-prune', + // aliases are needed for matching the related scriptlet converted into our syntax + 'm3u-prune.js', + 'ubo-m3u-prune.js', + 'ubo-m3u-prune', +]; + +m3uPrune.injections = [ + hit, + toRegExp, + logMessage, +]; diff --git a/src/scriptlets/scriptlets-list.js b/src/scriptlets/scriptlets-list.js index 6d5cb201..7f3d9e08 100644 --- a/src/scriptlets/scriptlets-list.js +++ b/src/scriptlets/scriptlets-list.js @@ -50,6 +50,7 @@ export * from './prevent-element-src-loading'; export * from './no-topics'; export * from './trusted-replace-xhr-response'; export * from './xml-prune'; +export * from './m3u-prune'; export * from './trusted-set-cookie'; export * from './trusted-set-cookie-reload'; export * from './trusted-replace-fetch-response'; diff --git a/tests/scriptlets/index.test.js b/tests/scriptlets/index.test.js index e27d0be9..22edd035 100644 --- a/tests/scriptlets/index.test.js +++ b/tests/scriptlets/index.test.js @@ -45,6 +45,7 @@ import './prevent-element-src-loading.test'; import './no-topics.test'; import './trusted-replace-xhr-response.test'; import './xml-prune.test'; +import './m3u-prune.test'; import './trusted-click-element.test'; import './trusted-set-cookie.test'; import './trusted-replace-fetch-response.test'; diff --git a/tests/scriptlets/m3u-prune.test.js b/tests/scriptlets/m3u-prune.test.js new file mode 100644 index 00000000..2d1fc9e6 --- /dev/null +++ b/tests/scriptlets/m3u-prune.test.js @@ -0,0 +1,663 @@ +/* eslint-disable no-underscore-dangle, no-console */ +import { runScriptlet, clearGlobalProps } from '../helpers'; + +const { test, module } = QUnit; +const name = 'm3u-prune'; + +// From nbc.com - https://github.com/AdguardTeam/AdguardFilters/issues/124745 +// https://regex101.com/r/Kup9IL/1 +const M3U8_OBJECTS_PATH_01 = './test-files/manifestM3U8-01.m3u8'; +// From nbc.com - https://github.com/AdguardTeam/AdguardFilters/issues/124745 +const M3U8_OBJECTS_PATH_02 = './test-files/manifestM3U8-02.m3u8'; +// From fox.com, discovery.com and related - https://github.com/AdguardTeam/AdguardFilters/issues/20290 +// https://regex101.com/r/ogqRZQ/1 - from https://www.fox.com/watch/1df49c86f927f5c840e8856c335e188b/ +const M3U8_OBJECTS_PATH_03 = './test-files/manifestM3U8-03.m3u8'; +// From sbs.com - https://github.com/AdguardTeam/AdguardFilters/issues/88692 +// https://regex101.com/r/Kxtnng/1 +const M3U8_OBJECTS_PATH_04 = './test-files/manifestM3U8-04.m3u8'; +const nativeFetch = fetch; +const nativeXhrOpen = XMLHttpRequest.prototype.open; +const nativeConsole = console.log; + +const beforeEach = () => { + window.__debug = () => { + window.hit = 'FIRED'; + }; +}; + +const afterEach = () => { + clearGlobalProps('hit', '__debug'); + fetch = nativeFetch; // eslint-disable-line no-global-assign + console.log = nativeConsole; + XMLHttpRequest.prototype.open = nativeXhrOpen; +}; + +module(name, { beforeEach, afterEach }); + +const isSupported = typeof fetch !== 'undefined' && typeof Proxy !== 'undefined' && typeof Response !== 'undefined'; + +if (!isSupported) { + test('unsupported', (assert) => { + assert.ok(true, 'Browser does not support it'); + }); +} else { + test('Checking if alias name works', (assert) => { + const adgParams = { + name, + engine: 'test', + verbose: true, + }; + const uboParams = { + name: 'm3u-prune.js', + engine: 'test', + verbose: true, + }; + + const codeByAdgParams = window.scriptlets.invoke(adgParams); + const codeByUboParams = window.scriptlets.invoke(uboParams); + + assert.strictEqual(codeByAdgParams, codeByUboParams, 'ubo name - ok'); + }); + + test('fetch - no prune 1', async (assert) => { + const M3U8_PATH = M3U8_OBJECTS_PATH_01; + const done = assert.async(); + + runScriptlet(name); + + const response = await fetch(M3U8_PATH); + const responseM3U8 = await response.text(); + + assert.ok(responseM3U8.includes('tvessaiprod.nbcuni.com/video/')); + assert.strictEqual(window.hit, undefined, 'should not hit'); + done(); + }); + + test('fetch - no prune 2', async (assert) => { + const M3U8_PATH = M3U8_OBJECTS_PATH_02; + const done = assert.async(); + + runScriptlet(name); + + const response = await fetch(M3U8_PATH); + const responseM3U8 = await response.text(); + + assert.ok(responseM3U8.includes('#EXT-X-VMAP-AD-BREAK')); + assert.strictEqual(window.hit, undefined, 'should not hit'); + done(); + }); + + test('fetch URL does not match - no prune 1', async (assert) => { + const M3U8_PATH = M3U8_OBJECTS_PATH_01; + const MATCH_DATA = 'tvessaiprod.nbcuni.com/video/'; + const MATCH_URL = 'noPrune'; + const scriptletArgs = [MATCH_DATA, MATCH_URL]; + + runScriptlet(name, scriptletArgs); + + const done = assert.async(); + + const response = await fetch(M3U8_PATH); + const responseM3U8 = await response.text(); + assert.ok(responseM3U8.includes('tvessaiprod.nbcuni.com/video/')); + assert.strictEqual(window.hit, undefined, 'should not hit'); + done(); + }); + + test('fetch URL does not match - no prune 2', async (assert) => { + const M3U8_PATH = M3U8_OBJECTS_PATH_02; + const MATCH_DATA = 'tvessaiprod.nbcuni.com/video/'; + const MATCH_URL = 'noPrune'; + const scriptletArgs = [MATCH_DATA, MATCH_URL]; + + runScriptlet(name, scriptletArgs); + + const done = assert.async(); + + const response = await fetch(M3U8_PATH); + const responseM3U8 = await response.text(); + + assert.ok(responseM3U8.includes('#EXT-X-VMAP-AD-BREAK')); + assert.strictEqual(window.hit, undefined, 'should not hit'); + done(); + }); + + test('fetch - remove ads 1', async (assert) => { + const M3U8_PATH = M3U8_OBJECTS_PATH_01; + const MATCH_DATA = 'tvessaiprod.nbcuni.com/video/'; + + runScriptlet(name, [MATCH_DATA]); + + const done = assert.async(); + + const response = await fetch(M3U8_PATH); + const responseM3U8 = await response.text(); + + assert.notOk( + responseM3U8.includes('tvessaiprod.nbcuni.com/video/'), + 'check if "tvessaiprod.nbcuni.com/video/" has been removed', + ); + assert.notOk( + responseM3U8.includes('#EXT-X-CUE:TYPE="SpliceOut"'), + 'check if "#EXT-X-CUE:TYPE="SpliceOut"" has been removed', + ); + assert.notOk( + responseM3U8.includes('#EXT-X-CUE-IN'), + 'check if "#EXT-X-CUE-IN" has been removed', + ); + assert.notOk( + responseM3U8.includes('#EXT-X-ASSET:CAID'), + 'check if "#EXT-X-ASSET:CAID" has been removed', + ); + assert.notOk( + responseM3U8.includes('#EXT-X-SCTE35:'), + 'check if "#EXT-X-SCTE35:" has been removed', + ); + assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); + done(); + }); + + test('fetch - remove ads 2 (COMCAST)', async (assert) => { + const M3U8_PATH = M3U8_OBJECTS_PATH_02; + const MATCH_DATA = 'VMAP-AD-BREAK'; + + runScriptlet(name, [MATCH_DATA]); + + const done = assert.async(); + + const response = await fetch(M3U8_PATH); + const responseM3U8 = await response.text(); + + assert.notOk( + responseM3U8.includes('#EXT-X-VMAP-AD-BREAK'), + 'check if "#EXT-X-VMAP-AD-BREAK" has been removed', + ); + assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); + done(); + }); + + test('fetch - remove ads 3 (UPLYNK)', async (assert) => { + const M3U8_PATH = M3U8_OBJECTS_PATH_03; + const MATCH_DATA = '/#UPLYNK-SEGMENT:.*,ad/'; + + runScriptlet(name, [MATCH_DATA]); + + const done = assert.async(); + + const response = await fetch(M3U8_PATH); + const responseM3U8 = await response.text(); + + assert.notOk( + responseM3U8.includes(',ad'), + 'check if "UPLYNK" ad segment has been removed', + ); + assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); + done(); + }); + + test('fetch - remove ads 4', async (assert) => { + const M3U8_PATH = M3U8_OBJECTS_PATH_04; + const MATCH_DATA = '/videoplayback.*&source=dclk_video_ads/'; + + runScriptlet(name, [MATCH_DATA]); + + const done = assert.async(); + + const response = await fetch(M3U8_PATH); + const responseM3U8 = await response.text(); + + assert.notOk( + responseM3U8.includes('dclk_video_ads'), + 'check if "dclk_video_ads" ad segment has been removed', + ); + assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); + done(); + }); + + test('fetch - new Request() - remove ads ', async (assert) => { + const M3U8_PATH = M3U8_OBJECTS_PATH_01; + const MATCH_DATA = 'tvessaiprod.nbcuni.com/video/'; + const REQUEST = new Request(M3U8_PATH); + + runScriptlet(name, [MATCH_DATA]); + + const done = assert.async(); + + const response = await fetch(REQUEST); + const responseM3U8 = await response.text(); + + assert.notOk( + responseM3U8.includes('tvessaiprod.nbcuni.com/video/'), + 'check if "tvessaiprod.nbcuni.com/video/" has been removed', + ); + assert.notOk( + responseM3U8.includes('#EXT-X-CUE:TYPE="SpliceOut"'), + 'check if "#EXT-X-CUE:TYPE="SpliceOut"" has been removed', + ); + assert.notOk( + responseM3U8.includes('#EXT-X-CUE-IN'), + 'check if "#EXT-X-CUE-IN" has been removed', + ); + assert.notOk( + responseM3U8.includes('#EXT-X-ASSET:CAID'), + 'check if "#EXT-X-ASSET:CAID" has been removed', + ); + assert.notOk( + responseM3U8.includes('#EXT-X-SCTE35:'), + 'check if "#EXT-X-SCTE35:" has been removed', + ); + assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); + done(); + }); + + test('fetch regexp propsToRemove - remove ads 1', async (assert) => { + const M3U8_PATH = M3U8_OBJECTS_PATH_01; + const MATCH_DATA = '/tvessaiprod\\.nbcuni\\.com/video//'; + + runScriptlet(name, [MATCH_DATA]); + + const done = assert.async(); + + const response = await fetch(M3U8_PATH); + const responseM3U8 = await response.text(); + assert.notOk( + responseM3U8.includes('tvessaiprod.nbcuni.com/video/'), + 'check if "tvessaiprod.nbcuni.com/video/" has been removed', + ); + assert.notOk( + responseM3U8.includes('#EXT-X-CUE:TYPE="SpliceOut"'), + 'check if "#EXT-X-CUE:TYPE="SpliceOut"" has been removed', + ); + assert.notOk( + responseM3U8.includes('#EXT-X-CUE-IN'), 'check if "#EXT-X-CUE-IN" has been removed', + ); + assert.notOk( + responseM3U8.includes('#EXT-X-ASSET:CAID'), 'check if "#EXT-X-ASSET:CAID" has been removed', + ); + assert.notOk( + responseM3U8.includes('#EXT-X-SCTE35:'), 'check if "#EXT-X-SCTE35:" has been removed', + ); + assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); + done(); + }); + + test('fetch regexp propsToRemove - remove ads 2', async (assert) => { + const M3U8_PATH = M3U8_OBJECTS_PATH_02; + const MATCH_DATA = '/VMAP.AD.BREAK/'; + + runScriptlet(name, [MATCH_DATA]); + + const done = assert.async(); + + const response = await fetch(M3U8_PATH); + const responseM3U8 = await response.text(); + assert.notOk( + responseM3U8.includes('#EXT-X-VMAP-AD-BREAK'), + 'check if "#EXT-X-VMAP-AD-BREAK" has been removed', + ); + assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); + done(); + }); + + test('fetch match URL - remove ads 1', async (assert) => { + const M3U8_PATH = M3U8_OBJECTS_PATH_01; + const MATCH_DATA = 'tvessaiprod.nbcuni.com/video/'; + const MATCH_URL = '.m3u8'; + const scriptletArgs = [MATCH_DATA, MATCH_URL]; + + runScriptlet(name, scriptletArgs); + + const done = assert.async(); + + const response = await fetch(M3U8_PATH); + const responseM3U8 = await response.text(); + assert.notOk( + responseM3U8.includes('tvessaiprod.nbcuni.com/video/'), + 'check if "tvessaiprod.nbcuni.com/video/" has been removed', + ); + assert.notOk( + responseM3U8.includes('#EXT-X-CUE:TYPE="SpliceOut"'), + 'check if "#EXT-X-CUE:TYPE="SpliceOut"" has been removed', + ); + assert.notOk( + responseM3U8.includes('#EXT-X-CUE-IN'), + 'check if "#EXT-X-CUE-IN" has been removed', + ); + assert.notOk( + responseM3U8.includes('#EXT-X-ASSET:CAID'), + 'check if "#EXT-X-ASSET:CAID" has been removed', + ); + assert.notOk( + responseM3U8.includes('#EXT-X-SCTE35:'), + 'check if "#EXT-X-SCTE35:" has been removed', + ); + assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); + done(); + }); + + test('fetch match URL - remove ads 2', async (assert) => { + const M3U8_PATH = M3U8_OBJECTS_PATH_02; + const MATCH_DATA = 'VMAP-AD-BREAK'; + const MATCH_URL = '.m3u8'; + const scriptletArgs = [MATCH_DATA, MATCH_URL]; + + runScriptlet(name, scriptletArgs); + + const done = assert.async(); + + const response = await fetch(M3U8_PATH); + const responseM3U8 = await response.text(); + assert.notOk( + responseM3U8.includes('#EXT-X-VMAP-AD-BREAK'), + 'check if "#EXT-X-VMAP-AD-BREAK" has been removed', + ); + assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); + done(); + }); + + test('xhr - no prune 1', async (assert) => { + const METHOD = 'GET'; + const M3U8_PATH = M3U8_OBJECTS_PATH_01; + const done = assert.async(); + + runScriptlet(name); + + const xhr = new XMLHttpRequest(); + xhr.open(METHOD, M3U8_PATH); + xhr.onload = () => { + assert.ok( + xhr.responseText.includes('tvessaiprod.nbcuni.com/video/'), + 'line with "tvessaiprod.nbcuni.com/video/" should not be removed', + ); + assert.strictEqual(window.hit, undefined, 'should not hit'); + done(); + }; + xhr.send(); + }); + + test('xhr - no prune 2', async (assert) => { + const METHOD = 'GET'; + const M3U8_PATH = M3U8_OBJECTS_PATH_02; + const done = assert.async(); + + runScriptlet(name); + + const xhr = new XMLHttpRequest(); + xhr.open(METHOD, M3U8_PATH); + xhr.onload = () => { + assert.ok(xhr.responseText.includes('#EXT-X-VMAP-AD-BREAK')); + assert.strictEqual(window.hit, undefined, 'should not hit'); + done(); + }; + xhr.send(); + }); + + test('xhr match URL but do not match element to remove - no prune 1', async (assert) => { + const METHOD = 'GET'; + const M3U8_PATH = M3U8_OBJECTS_PATH_01; + const MATCH_DATA = 'DO-NOT-MATCH'; + const MATCH_URL = '.m3u8'; + const scriptletArgs = [MATCH_DATA, MATCH_URL]; + + runScriptlet(name, scriptletArgs); + + const done = assert.async(); + + const xhr = new XMLHttpRequest(); + xhr.open(METHOD, M3U8_PATH); + xhr.onload = () => { + assert.ok( + xhr.responseText.includes('tvessaiprod.nbcuni.com/video/'), + 'line with "tvessaiprod.nbcuni.com/video/" should not be removed', + ); + assert.strictEqual(window.hit, undefined, 'should not hit'); + done(); + }; + xhr.send(); + }); + + test('xhr match URL but do not match element to remove - no prune 2', async (assert) => { + const METHOD = 'GET'; + const M3U8_PATH = M3U8_OBJECTS_PATH_02; + const MATCH_DATA = 'DO-NOT-MATCH'; + const MATCH_URL = '.m3u8'; + const scriptletArgs = [MATCH_DATA, MATCH_URL]; + + runScriptlet(name, scriptletArgs); + + const done = assert.async(); + + const xhr = new XMLHttpRequest(); + xhr.open(METHOD, M3U8_PATH); + xhr.onload = () => { + assert.ok( + xhr.responseText.includes('#EXT-X-VMAP-AD-BREAK'), + 'line with "#EXT-X-VMAP-AD-BREAK" should not be removed', + ); + assert.strictEqual(window.hit, undefined, 'should not hit'); + done(); + }; + xhr.send(); + }); + + test('xhr - remove ads 1', async (assert) => { + const METHOD = 'GET'; + const M3U8_PATH = M3U8_OBJECTS_PATH_01; + const MATCH_DATA = 'tvessaiprod.nbcuni.com/video/'; + + runScriptlet(name, [MATCH_DATA]); + + const done = assert.async(); + + const xhr = new XMLHttpRequest(); + xhr.open(METHOD, M3U8_PATH); + xhr.onload = () => { + assert.notOk( + xhr.responseText.includes('tvessaiprod.nbcuni.com/video/'), + 'check if "tvessaiprod.nbcuni.com/video/" has been removed', + ); + assert.notOk( + xhr.responseText.includes('#EXT-X-CUE:TYPE="SpliceOut"'), + 'check if "#EXT-X-CUE:TYPE="SpliceOut"" has been removed', + ); + assert.notOk( + xhr.responseText.includes('#EXT-X-CUE-IN'), + 'check if "#EXT-X-CUE-IN" has been removed', + ); + assert.notOk( + xhr.responseText.includes('#EXT-X-ASSET:CAID'), + 'check if "#EXT-X-ASSET:CAID" has been removed', + ); + assert.notOk( + xhr.responseText.includes('#EXT-X-SCTE35:'), + 'check if "#EXT-X-SCTE35:" has been removed', + ); + assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); + done(); + }; + xhr.send(); + }); + + test('xhr - remove ads 2 (COMCAST)', async (assert) => { + const METHOD = 'GET'; + const M3U8_PATH = M3U8_OBJECTS_PATH_02; + const MATCH_DATA = 'VMAP-AD-BREAK'; + + runScriptlet(name, [MATCH_DATA]); + + const done = assert.async(); + + const xhr = new XMLHttpRequest(); + xhr.open(METHOD, M3U8_PATH); + xhr.onload = () => { + assert.notOk( + xhr.responseText.includes('#EXT-X-VMAP-AD-BREAK'), + 'check if "#EXT-X-VMAP-AD-BREAK" has been removed', + ); + assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); + done(); + }; + xhr.send(); + }); + + test('xhr - remove ads 3 (UPLYNK)', async (assert) => { + const METHOD = 'GET'; + const M3U8_PATH = M3U8_OBJECTS_PATH_03; + const MATCH_DATA = '/#UPLYNK-SEGMENT:.*,ad/'; + + runScriptlet(name, [MATCH_DATA]); + + const done = assert.async(); + + const xhr = new XMLHttpRequest(); + xhr.open(METHOD, M3U8_PATH); + xhr.onload = () => { + assert.notOk(xhr.responseText.includes(',ad'), 'check if "UPLYNK" ad segment has been removed'); + assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); + done(); + }; + xhr.send(); + }); + + test('xhr regexp propsToRemove - remove ads 1', async (assert) => { + const METHOD = 'GET'; + const M3U8_PATH = M3U8_OBJECTS_PATH_01; + const MATCH_DATA = '/tvessaiprod\\.nbcuni\\.com/video//'; + + runScriptlet(name, [MATCH_DATA]); + + const done = assert.async(); + + const xhr = new XMLHttpRequest(); + xhr.open(METHOD, M3U8_PATH); + xhr.onload = () => { + assert.notOk( + xhr.responseText.includes('tvessaiprod.nbcuni.com/video/'), + 'check if "tvessaiprod.nbcuni.com/video/" has been removed', + ); + assert.notOk( + xhr.responseText.includes('#EXT-X-CUE:TYPE="SpliceOut"'), + 'check if "#EXT-X-CUE:TYPE="SpliceOut"" has been removed', + ); + assert.notOk( + xhr.responseText.includes('#EXT-X-CUE-IN'), + 'check if "#EXT-X-CUE-IN" has been removed', + ); + assert.notOk( + xhr.responseText.includes('#EXT-X-ASSET:CAID'), + 'check if "#EXT-X-ASSET:CAID" has been removed', + ); + assert.notOk( + xhr.responseText.includes('#EXT-X-SCTE35:'), + 'check if "#EXT-X-SCTE35:" has been removed', + ); + assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); + done(); + }; + xhr.send(); + }); + + test('xhr regexp propsToRemove - remove ads 2', async (assert) => { + const METHOD = 'GET'; + const M3U8_PATH = M3U8_OBJECTS_PATH_02; + const MATCH_DATA = '/VMAP.AD.BREAK/'; + + runScriptlet(name, [MATCH_DATA]); + + const done = assert.async(); + + const xhr = new XMLHttpRequest(); + xhr.open(METHOD, M3U8_PATH); + xhr.onload = () => { + assert.notOk( + xhr.responseText.includes('#EXT-X-VMAP-AD-BREAK'), + 'check if "#EXT-X-VMAP-AD-BREAK" has been removed', + ); + assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); + done(); + }; + xhr.send(); + }); + + test('xhr match URL - remove ads 1', async (assert) => { + const METHOD = 'GET'; + const M3U8_PATH = M3U8_OBJECTS_PATH_01; + const MATCH_DATA = 'tvessaiprod.nbcuni.com/video/'; + const MATCH_URL = '.m3u8'; + const scriptletArgs = [MATCH_DATA, MATCH_URL]; + + runScriptlet(name, scriptletArgs); + + const done = assert.async(); + + const xhr = new XMLHttpRequest(); + xhr.open(METHOD, M3U8_PATH); + xhr.onload = () => { + assert.notOk( + xhr.responseText.includes('tvessaiprod.nbcuni.com/video/'), + 'check if "tvessaiprod.nbcuni.com/video/" has been removed', + ); + assert.notOk( + xhr.responseText.includes('#EXT-X-CUE:TYPE="SpliceOut"'), + 'check if "#EXT-X-CUE:TYPE="SpliceOut"" has been removed', + ); + assert.notOk( + xhr.responseText.includes('#EXT-X-CUE-IN'), + 'check if "#EXT-X-CUE-IN" has been removed', + ); + assert.notOk( + xhr.responseText.includes('#EXT-X-ASSET:CAID'), + 'check if "#EXT-X-ASSET:CAID" has been removed', + ); + assert.notOk( + xhr.responseText.includes('#EXT-X-SCTE35:'), + 'check if "#EXT-X-SCTE35:" has been removed', + ); + assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); + done(); + }; + xhr.send(); + }); + + test('xhr match URL - remove ads 2', async (assert) => { + const METHOD = 'GET'; + const M3U8_PATH = M3U8_OBJECTS_PATH_02; + const MATCH_DATA = 'VMAP-AD-BREAK'; + const MATCH_URL = '.m3u8'; + const scriptletArgs = [MATCH_DATA, MATCH_URL]; + + runScriptlet(name, scriptletArgs); + + const done = assert.async(); + + const xhr = new XMLHttpRequest(); + xhr.open(METHOD, M3U8_PATH); + xhr.onload = () => { + assert.notOk( + xhr.responseText.includes('#EXT-X-VMAP-AD-BREAK'), + 'check if "#EXT-X-VMAP-AD-BREAK" has been removed', + ); + assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); + done(); + }; + xhr.send(); + }); + + test('xhr - do nothing if response type is not a string', async (assert) => { + const METHOD = 'GET'; + const M3U8_PATH = M3U8_OBJECTS_PATH_01; + const done = assert.async(); + + runScriptlet(name); + + const xhr = new XMLHttpRequest(); + xhr.open(METHOD, M3U8_PATH); + xhr.responseType = 'blob'; + xhr.onload = () => { + assert.ok(xhr.response instanceof Blob, 'Blob response'); + assert.strictEqual(window.hit, undefined, 'should not hit'); + done(); + }; + xhr.send(); + }); +} diff --git a/tests/scriptlets/test-files/manifestM3U8-01.m3u8 b/tests/scriptlets/test-files/manifestM3U8-01.m3u8 new file mode 100644 index 00000000..519d4bbf --- /dev/null +++ b/tests/scriptlets/test-files/manifestM3U8-01.m3u8 @@ -0,0 +1,96 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-TARGETDURATION:7 +#EXT-X-MEDIA-SEQUENCE:0 +#EXT-X-PLAYLIST-TYPE:VOD +#EXT-X-CUE:TYPE="SpliceOut",ID="6",TIME=0.0000,DURATION=0,CAID=eyJjdWVUeXBlIjoic3RhbmRhcmQiLCJrZXkiOiIiLCJ2YWx1ZSI6IiJ9 +#EXT-X-ASSET:CAID=eyJjdWVUeXBlIjoic3RhbmRhcmQiLCJrZXkiOiIiLCJ2YWx1ZSI6IiJ9 +#EXT-X-SCTE35:TYPE=0x22,UPID="0x0e:0x54454c455f564f445f39303030323438303435",DURATION=0,CUE="/DA/AAAAAAAAAP/wBQb+AAAAAAApAidDVUVJAAAABn//AAAAAAAOE1RFTEVfVk9EXzkwMDAyNDgwNDUiAQG2pQoJ",ID="6" +#EXT-X-CUE-IN +#EXT-X-SCTE35:TYPE=0x23,UPID="0x0e:0x54454c455f564f445f39303030323438303435",CUE="/DA6AAAAAAAAAP/wBQb+AAAAAAAkAiJDVUVJAAAABn+/DhNURUxFX1ZPRF85MDAwMjQ4MDQ1IwEBVUw7Vg==",ID="6" +#EXTINF:6.006, +https://tvessaiprod.nbcuni.com/video/870/823/CMSSPLITSCRE30H_ENT_MEZZ_HULU_5504752_578_2054980163978_2054983747549_m3u8_video_640x360_644000_primary_audio_und_4_x414d0bffe6ec438a8772cdf4dc4ab3a4_00001.ts +#EXTINF:6.006, +https://tvessaiprod.nbcuni.com/video/870/823/CMSSPLITSCRE30H_ENT_MEZZ_HULU_5504752_578_2054980163978_2054983747549_m3u8_video_640x360_644000_primary_audio_und_4_x414d0bffe6ec438a8772cdf4dc4ab3a4_00002.ts +#EXT-X-DISCONTINUITY +#EXTINF:6, +https://tvessaiprod.nbcuni.com/video/700/263/file_2070907459883_2070910531638_m3u8_video_960x540_1800000_primary_audio_eng_9_xf3b63a6e0b80457085d2c55a35324571_00001.ts +#EXTINF:6, +https://tvessaiprod.nbcuni.com/video/700/263/file_2070907459883_2070910531638_m3u8_video_960x540_1800000_primary_audio_eng_9_xf3b63a6e0b80457085d2c55a35324571_00002.ts +#EXT-X-DISCONTINUITY +#EXTINF:6.006,frame-rate=29.970 +https://vod-lf-oneapp-prd.akamaized.net/prod/video/eul/6x0/9000248045/1652385479635-GxrqB/1850k_540_hls/_2193980972-0_00000.ts +#EXTINF:6.006,frame-rate=29.970 +https://redirect.manifest.theplatform.com/r/HNK2IC/7U1nfYQgxtpI,aXJ1bbomVjiA,QhxSmV76ICse,SlDEe4V66Q_u,rIT2n_eK8ezB,65713guxxHrq/aHR0cHM6Ly92b2QtbGYtb25lYXBwLXByZC5ha2FtYWl6ZWQubmV0L3Byb2QvdmlkZW8vZXVsLzZ4MC85MDAwMjQ4MDQ1LzE2NTIzODU0Nzk2MzUtR3hycUIvMTg1MGtfNTQwX2hscy9fMjE5Mzk4MDk3Mi0wXzAwMDAxLnRz?sid=5667b295-cfa2-4d9d-a149-ac3466ffbd47&policy=189081519&date=1664449164142&ip=104.156.254.89&schema=1.0&cid=1f2655ba-0e40-4342-a93b-9452b2bdf3ea&aid=2304991196&dur=2604035&sig=df9088e46ba6999eeceedb3d94cf1210b6e0ca817ec61482bab7cc6673d2dfbc +#EXTINF:6.006,frame-rate=29.970 +https://vod-lf-oneapp-prd.akamaized.net/prod/video/eul/6x0/9000248045/1652385479635-GxrqB/1850k_540_hls/_2193980972-0_00002.ts +#EXTINF:6.006,frame-rate=29.970 +https://vod-lf-oneapp-prd.akamaized.net/prod/video/eul/6x0/9000248045/1652385479635-GxrqB/1850k_540_hls/_2193980972-0_00003.ts +#EXTINF:6.006,frame-rate=29.970 +https://vod-lf-oneapp-prd.akamaized.net/prod/video/eul/6x0/9000248045/1652385479635-GxrqB/1850k_540_hls/_2193980972-0_00004.ts +#EXTINF:6.006,frame-rate=29.970 +https://redirect.manifest.theplatform.com/r/HNK2IC/7U1nfYQgxtpI,aXJ1bbomVjiA,QhxSmV76ICse,SlDEe4V66Q_u,rIT2n_eK8ezB,65713guxxHrq/aHR0cHM6Ly92b2QtbGYtb25lYXBwLXByZC5ha2FtYWl6ZWQubmV0L3Byb2QvdmlkZW8vZXVsLzZ4MC85MDAwMjQ4MDQ1LzE2NTIzODU0Nzk2MzUtR3hycUIvMTg1MGtfNTQwX2hscy9fMjE5Mzk4MDk3Mi0wXzAwMDA1LnRz?sid=5667b295-cfa2-4d9d-a149-ac3466ffbd47&policy=189081519&date=1664449164142&ip=104.156.254.89&schema=1.0&cid=1f2655ba-0e40-4342-a93b-9452b2bdf3ea&aid=2304991196&dur=2604035&sig=d90ab0603f1ec3f9aab2a9f956970ed50219dd9a6bb3ca0373360d1357fd415a +#EXTINF:6.006,frame-rate=29.970 +https://vod-lf-oneapp-prd.akamaized.net/prod/video/eul/6x0/9000248045/1652385479635-GxrqB/1850k_540_hls/_2193980972-0_00006.ts +#EXTINF:6.006,frame-rate=29.970 +https://vod-lf-oneapp-prd.akamaized.net/prod/video/eul/6x0/9000248045/1652385479635-GxrqB/1850k_540_hls/_2193980972-0_00007.ts +#EXTINF:6.006,frame-rate=29.970 +https://vod-lf-oneapp-prd.akamaized.net/prod/video/eul/6x0/9000248045/1652385479635-GxrqB/1850k_540_hls/_2193980972-0_00008.ts +#EXTINF:6.006,frame-rate=29.970 +https://redirect.manifest.theplatform.com/r/HNK2IC/7U1nfYQgxtpI,aXJ1bbomVjiA,QhxSmV76ICse,SlDEe4V66Q_u,rIT2n_eK8ezB,65713guxxHrq/aHR0cHM6Ly92b2QtbGYtb25lYXBwLXByZC5ha2FtYWl6ZWQubmV0L3Byb2QvdmlkZW8vZXVsLzZ4MC85MDAwMjQ4MDQ1LzE2NTIzODU0Nzk2MzUtR3hycUIvMTg1MGtfNTQwX2hscy9fMjE5Mzk4MDk3Mi0wXzAwMDA5LnRz?sid=5667b295-cfa2-4d9d-a149-ac3466ffbd47&policy=189081519&date=1664449164142&ip=104.156.254.89&schema=1.0&cid=1f2655ba-0e40-4342-a93b-9452b2bdf3ea&aid=2304991196&dur=2604035&sig=f81f34df2b12bcd8ba65c240fcafa15b354343dcda23599215ad0abb763e9f54 +#EXTINF:6.006,frame-rate=29.970 +https://vod-lf-oneapp-prd.akamaized.net/prod/video/eul/6x0/9000248045/1652385479635-GxrqB/1850k_540_hls/_2193980972-0_00010.ts +#EXT-X-DISCONTINUITY +#EXTINF:6.006, +https://tvessaiprod.nbcuni.com/video/870/823/CMSSPLITSCRE30H_ENT_MEZZ_HULU_5504752_578_2054980163978_2054983747549_m3u8_video_640x360_644000_primary_audio_und_4_x414d0bffe6ec438a8772cdf4dc4ab3a4_00001.ts +#EXTINF:6.006, +https://tvessaiprod.nbcuni.com/video/870/823/CMSSPLITSCRE30H_ENT_MEZZ_HULU_5504752_578_2054980163978_2054983747549_m3u8_video_640x360_644000_primary_audio_und_4_x414d0bffe6ec438a8772cdf4dc4ab3a4_00002.ts +#EXT-X-DISCONTINUITY +#EXTINF:6, +https://tvessaiprod.nbcuni.com/video/371/734/file_2069489219538_2069488707564_m3u8_video_960x540_1800000_primary_audio_eng_9_x2ed90215fc63485caaedd10000dc0543_00001.ts +#EXTINF:6, +https://tvessaiprod.nbcuni.com/video/371/734/file_2069489219538_2069488707564_m3u8_video_960x540_1800000_primary_audio_eng_9_x2ed90215fc63485caaedd10000dc0543_00002.ts +#EXT-X-DISCONTINUITY +#EXTINF:6.006, +https://tvessaiprod.nbcuni.com/video/575/186/8364707a-8c98-4b03-b810-0a13f176236f_2071850051517_2071851587509_m3u8_video_960x540_1800000_primary_audio_eng_9_xf5f227bf7c554db29e7dfa914091f290_00001.ts +#EXTINF:6.006, +https://tvessaiprod.nbcuni.com/video/575/186/8364707a-8c98-4b03-b810-0a13f176236f_2071850051517_2071851587509_m3u8_video_960x540_1800000_primary_audio_eng_9_xf5f227bf7c554db29e7dfa914091f290_00002.ts +#EXTINF:3.003, +https://tvessaiprod.nbcuni.com/video/575/186/8364707a-8c98-4b03-b810-0a13f176236f_2071850051517_2071851587509_m3u8_video_960x540_1800000_primary_audio_eng_9_xf5f227bf7c554db29e7dfa914091f290_00003.ts +#EXT-X-DISCONTINUITY +#EXT-X-CUE:TYPE="SpliceOut",ID="7",TIME=512.9670,DURATION=0,CAID=eyJjdWVUeXBlIjoic3RhbmRhcmQiLCJrZXkiOiIiLCJ2YWx1ZSI6IiJ9 +#EXT-X-ASSET:CAID=eyJjdWVUeXBlIjoic3RhbmRhcmQiLCJrZXkiOiIiLCJ2YWx1ZSI6IiJ9 +#EXT-X-SCTE35:TYPE=0x22,UPID="0x0e:0x54454c455f564f445f39303030323438303435",DURATION=0,CUE="/DA/AAAAAAAAAP/wBQb+AsBz9gApAidDVUVJAAAAB3//AAAAAAAOE1RFTEVfVk9EXzkwMDAyNDgwNDUiAQFt1Zg+",ID="7" +#EXT-X-CUE-IN +#EXT-X-SCTE35:TYPE=0x23,UPID="0x0e:0x54454c455f564f445f39303030323438303435",CUE="/DA6AAAAAAAAAP/wBQb+AsBz9gAkAiJDVUVJAAAAB3+/DhNURUxFX1ZPRF85MDAwMjQ4MDQ1IwEB2igKmg==",ID="7" +#EXTINF:6.006,frame-rate=29.970 +https://vod-lf-oneapp-prd.akamaized.net/prod/video/eul/6x0/9000248045/1652385479635-GxrqB/1850k_540_hls/_2193980972-0_00086.ts +#EXTINF:6.006,frame-rate=29.970 +https://redirect.manifest.theplatform.com/r/HNK2IC/7U1nfYQgxtpI,aXJ1bbomVjiA,QhxSmV76ICse,SlDEe4V66Q_u,rIT2n_eK8ezB,65713guxxHrq/aHR0cHM6Ly92b2QtbGYtb25lYXBwLXByZC5ha2FtYWl6ZWQubmV0L3Byb2QvdmlkZW8vZXVsLzZ4MC85MDAwMjQ4MDQ1LzE2NTIzODU0Nzk2MzUtR3hycUIvMTg1MGtfNTQwX2hscy9fMjE5Mzk4MDk3Mi0wXzAwMDg3LnRz?sid=5667b295-cfa2-4d9d-a149-ac3466ffbd47&policy=189081519&date=1664449164142&ip=104.156.254.89&schema=1.0&cid=1f2655ba-0e40-4342-a93b-9452b2bdf3ea&aid=2304991196&dur=2604035&sig=be1a97e509cd4bba843436ca376c01a39e2c3fa3d50ee7b0f9439bac66ee6599 +#EXTINF:6.006,frame-rate=29.970 +https://vod-lf-oneapp-prd.akamaized.net/prod/video/eul/6x0/9000248045/1652385479635-GxrqB/1850k_540_hls/_2193980972-0_00088.ts +#EXTINF:6.006,frame-rate=29.970 +https://vod-lf-oneapp-prd.akamaized.net/prod/video/eul/6x0/9000248045/1652385479635-GxrqB/1850k_540_hls/_2193980972-0_00089.ts +#EXTINF:6.006,frame-rate=29.970 +https://vod-lf-oneapp-prd.akamaized.net/prod/video/eul/6x0/9000248045/1652385479635-GxrqB/1850k_540_hls/_2193980972-0_00090.ts +#EXTINF:6.006,frame-rate=29.970 +https://redirect.manifest.theplatform.com/r/HNK2IC/7U1nfYQgxtpI,aXJ1bbomVjiA,QhxSmV76ICse,SlDEe4V66Q_u,rIT2n_eK8ezB,65713guxxHrq/aHR0cHM6Ly92b2QtbGYtb25lYXBwLXByZC5ha2FtYWl6ZWQubmV0L3Byb2QvdmlkZW8vZXVsLzZ4MC85MDAwMjQ4MDQ1LzE2NTIzODU0Nzk2MzUtR3hycUIvMTg1MGtfNTQwX2hscy9fMjE5Mzk4MDk3Mi0wXzAwMDkxLnRz?sid=5667b295-cfa2-4d9d-a149-ac3466ffbd47&policy=189081519&date=1664449164142&ip=104.156.254.89&schema=1.0&cid=1f2655ba-0e40-4342-a93b-9452b2bdf3ea&aid=2304991196&dur=2604035&sig=1b1cba94f03b2a60d79275a5950613af7512a2c4eb0cdceef865d450b5ce8dfc +#EXTINF:6.006,frame-rate=29.970 +https://vod-lf-oneapp-prd.akamaized.net/prod/video/eul/6x0/9000248045/1652385479635-GxrqB/1850k_540_hls/_2193980972-0_00092.ts +#EXTINF:6.006,frame-rate=29.970 +https://vod-lf-oneapp-prd.akamaized.net/prod/video/eul/6x0/9000248045/1652385479635-GxrqB/1850k_540_hls/_2193980972-0_00093.ts +#EXTINF:6.006,frame-rate=29.970 +https://vod-lf-oneapp-prd.akamaized.net/prod/video/eul/6x0/9000248045/1652385479635-GxrqB/1850k_540_hls/_2193980972-0_00094.ts +#EXTINF:6.006,frame-rate=29.970 +https://redirect.manifest.theplatform.com/r/HNK2IC/7U1nfYQgxtpI,aXJ1bbomVjiA,QhxSmV76ICse,SlDEe4V66Q_u,rIT2n_eK8ezB,65713guxxHrq/aHR0cHM6Ly92b2QtbGYtb25lYXBwLXByZC5ha2FtYWl6ZWQubmV0L3Byb2QvdmlkZW8vZXVsLzZ4MC85MDAwMjQ4MDQ1LzE2NTIzODU0Nzk2MzUtR3hycUIvMTg1MGtfNTQwX2hscy9fMjE5Mzk4MDk3Mi0wXzAwMDk1LnRz?sid=5667b295-cfa2-4d9d-a149-ac3466ffbd47&policy=189081519&date=1664449164142&ip=104.156.254.89&schema=1.0&cid=1f2655ba-0e40-4342-a93b-9452b2bdf3ea&aid=2304991196&dur=2604035&sig=b7e8a6be09add560a892109e43ef15dcab49108defb4015d89d0a195cadd01e4 +#EXTINF:6.006,frame-rate=29.970 +https://vod-lf-oneapp-prd.akamaized.net/prod/video/eul/6x0/9000248045/1652385479635-GxrqB/1850k_540_hls/_2193980972-0_00096.ts +#EXTINF:6.006,frame-rate=29.970 +https://vod-lf-oneapp-prd.akamaized.net/prod/video/eul/6x0/9000248045/1652385479635-GxrqB/1850k_540_hls/_2193980972-0_00097.ts +#EXTINF:6.006,frame-rate=29.970 +https://vod-lf-oneapp-prd.akamaized.net/prod/video/eul/6x0/9000248045/1652385479635-GxrqB/1850k_540_hls/_2193980972-0_00098.ts +#EXTINF:6.006,frame-rate=29.970 +https://redirect.manifest.theplatform.com/r/HNK2IC/7U1nfYQgxtpI,aXJ1bbomVjiA,QhxSmV76ICse,SlDEe4V66Q_u,rIT2n_eK8ezB,65713guxxHrq/aHR0cHM6Ly92b2QtbGYtb25lYXBwLXByZC5ha2FtYWl6ZWQubmV0L3Byb2QvdmlkZW8vZXVsLzZ4MC85MDAwMjQ4MDQ1LzE2NTIzODU0Nzk2MzUtR3hycUIvMTg1MGtfNTQwX2hscy9fMjE5Mzk4MDk3Mi0wXzAwMDk5LnRz?sid=5667b295-cfa2-4d9d-a149-ac3466ffbd47&policy=189081519&date=1664449164142&ip=104.156.254.89&schema=1.0&cid=1f2655ba-0e40-4342-a93b-9452b2bdf3ea&aid=2304991196&dur=2604035&sig=7f4082c3799ee64e31c318fd760760032857fc4337173d73d11fa68564f4f3e2 +#EXTINF:6.006,frame-rate=29.970 +https://vod-lf-oneapp-prd.akamaized.net/prod/video/eul/6x0/9000248045/1652385479635-GxrqB/1850k_540_hls/_2193980972-0_00100.ts +#EXT-X-ENDLIST diff --git a/tests/scriptlets/test-files/manifestM3U8-02.m3u8 b/tests/scriptlets/test-files/manifestM3U8-02.m3u8 new file mode 100644 index 00000000..7105e50e --- /dev/null +++ b/tests/scriptlets/test-files/manifestM3U8-02.m3u8 @@ -0,0 +1,79 @@ +#EXT-X-VMAP-AD-BREAK:ID=0.0.0.873098057 +#EXT-X-VMAP-AD-BREAK-TRACKING:EVENT=breakStart,URL=https://example.org/ +#EXT-X-VMAP-AD-BREAK-TRACKING:EVENT=breakEnd,URL=https://example.org/ +#EXT-X-VMAP-AD-BREAK-TRACKING:EVENT=breakEnd,URL=https://example.org/ +#EXT-X-VAST-ID:517456313 +#EXT-X-VAST-TITLE:In-Stream Video +#EXT-X-VAST-IMPRESSION:https://example.org/ +#EXT-X-VAST-IMPRESSION:https://example.org/ +#EXT-X-VAST-ERROR:https://example.org/ +#EXT-X-VAST-ERROR:https://example.org/ +#EXT-X-VAST-VIDEO:ID=633721047-309,DURATION=30,CREATIVEID=29809423,CREATIVEADID=59365036 +#EXT-X-VAST-VIDEO-CLICK-THROUGH:https://example.org/ +#EXT-X-VAST-VIDEO-TRACKING:EVENT=start,URL=https://example.org/ +#EXT-X-VAST-VIDEO-TRACKING:EVENT=firstQuartile,URL=https://example.org/ +#EXT-X-VAST-VIDEO-TRACKING:EVENT=midpoint,URL=https://example.org/ +#EXT-X-VAST-EXTENSION:NAME=creativeApi_apiFramework,VALUE=None +#EXT-X-VAST-EXTENSION:NAME=fw_brand,VALUE=Progressive Insurance Corporation +#EXT-X-TP-AD-COUNT:1/1 +#EXT-X-VMAP-AD-BREAK-END +#EXTINF:30.03 +#EXT-X-DISCONTINUITY +#EXTINF:512.967 +#EXT-X-DISCONTINUITY +#EXT-X-VMAP-AD-BREAK:ID=mid_roll_2 +#EXT-X-VMAP-AD-BREAK-TRACKING:EVENT=breakStart,URL=https://example.org/ +#EXT-X-VAST-ID:66241055.139746730295040 +#EXT-X-VAST-TITLE:101358255-1_One Digital Video: Audience Targeted: [Crossix - Peyronie's Disease (NBCU 4INFO Segment ID: 4info_FW_A_4908)]: Video; Completes :60s - 3Q'22 +#EXT-X-VAST-IMPRESSION:https://example.org/ +#EXT-X-VAST-IMPRESSION:https://example.org/ +#EXT-X-VAST-IMPRESSION:https://example.org/ +#EXT-X-VAST-VIDEO:ID=275865940,DURATION=60,CREATIVEID=57873409,CREATIVEADID=66241055 +#EXT-X-VAST-VIDEO-CLICK-THROUGH:https://example.org/ +#EXT-X-VAST-VIDEO-CLICK-TRACKING:https://example.org/ +#EXT-X-VAST-EXTENSION:NAME=creativeApi_apiFramework,VALUE=null +#EXT-X-VAST-EXTENSION:NAME=fw_brand,VALUE=Endo Pharmaceuticals +#EXT-X-VAST-EXTENSION:NAME=hulu_ccr,VALUE=campaignName=5152958_Endo%20Pharmaceuticals%20UF%2722%20-%20Xiaflex%20PD%20-%20One%20Digital%20Video%20-%20Digital%20Media;campaignId=59022117; +#EXT-X-TP-AD-COUNT:1/2 +#EXTINF:60.186 +#EXT-X-DISCONTINUITY +#EXT-X-VAST-ID:160qnb +#EXT-X-VAST-TITLE:River-30-US-2022-05-06-30sec +#EXT-X-VAST-IMPRESSION:https://example.org/ +#EXT-X-VAST-IMPRESSION:https://example.org/ +#EXT-X-VAST-IMPRESSION:https://example.org/ +#EXT-X-VAST-IMPRESSION:https://example.org/ +#EXT-X-VAST-IMPRESSION:https://example.org/ +#EXT-X-VAST-IMPRESSION:https://example.org/ +#EXT-X-VAST-VERIFICATION:VENDOR=integralads.com,API=omid,BROWSEROPTIONAL=true,URL=https://example.org/ +#EXT-X-VAST-ERROR:https://example.org/ +#EXT-X-VAST-ERROR:https://example.org/ +#EXT-X-VAST-VIDEO:DURATION=30,CREATIVEID=44355185,CREATIVEADID=60568039 +#EXT-X-VAST-VIDEO-CLICK-THROUGH:https://example.org/ +#EXT-X-VAST-VIDEO-CLICK-TRACKING:https://example.org/ +#EXT-X-VAST-VIDEO-TRACKING:EVENT=start,URL=https://example.org/ +#EXT-X-VAST-VIDEO-TRACKING:EVENT=start,URL=https://example.org/ +#EXT-X-VAST-EXTENSION:NAME=creativeApi_apiFramework,VALUE=None +#EXT-X-VAST-EXTENSION:NAME=fw_brand,VALUE=Viking Cruises +#EXT-X-TP-AD-COUNT:2/2 +#EXTINF:30.03 +#EXT-X-DISCONTINUITY +#EXT-X-VAST-ID:536399375 +#EXT-X-VAST-TITLE:In-Stream Video +#EXT-X-VAST-IMPRESSION:https://example.org/ +#EXT-X-VAST-IMPRESSION:https://example.org/ +#EXT-X-VAST-IMPRESSION:https://example.org/ +#EXT-X-VAST-IMPRESSION:https://example.org/ +#EXT-X-VAST-IMPRESSION:https://example.org/ +#EXT-X-VAST-ERROR:https://example.org/ +#EXT-X-VAST-ERROR:https://example.org/ +#EXT-X-VAST-VIDEO-CLICK-THROUGH:https://example.org/ +#EXT-X-VAST-VIDEO-CLICK-TRACKING:https://example.org/ +#EXT-X-VAST-VIDEO-TRACKING:EVENT=start,URL=https://example.org/ +#EXT-X-VAST-EXTENSION:NAME=creativeApi_apiFramework,VALUE=None +#EXT-X-VAST-EXTENSION:NAME=fw_brand,VALUE=JAMRS +#EXT-X-VMAP-AD-BREAK-END +#EXTINF:30.03 +#EXT-X-DISCONTINUITY +#EXTINF:222.068 +#EXT-X-ENDLIST diff --git a/tests/scriptlets/test-files/manifestM3U8-03.m3u8 b/tests/scriptlets/test-files/manifestM3U8-03.m3u8 new file mode 100644 index 00000000..d50b537f --- /dev/null +++ b/tests/scriptlets/test-files/manifestM3U8-03.m3u8 @@ -0,0 +1,249 @@ +#EXTM3U +#EXT-X-VERSION:5 +#EXT-X-PLAYLIST-TYPE:VOD +#EXT-X-MEDIA-SEQUENCE:0 +#EXT-X-TARGETDURATION:8 +#UPLYNK-SEGMENT: af50c951671d43a0bb33e6681146cb44,00000000,ad +#UPLYNK-KEY:https://content-ause1-ur-fox1.uplynk.com/check?b=af50c951671d43a0bb33e6681146cb44&v=8210462c10584206871ca3e8ad14689b&pbs=71af8c28b48c41c2a98e03ff73366a73 +#EXT-X-PROGRAM-DATE-TIME:2022-01-31T20:51:57.065000+00:00 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=af50c951671d43a0bb33e6681146cb44&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000000 +#EXTINF:2.0480, +https://content-ause1-ur-fox1.uplynk.com/vodredir4/8210462c10584206871ca3e8ad14689b/K00000000.ts?seq=0&pbs=71af8c28b48c41c2a98e03ff73366a73&ptime=2.048&atomic=1&ohash=aHR0cHM6Ly94LWxpdmUtZm94LXN0Z2VjLnVwbHluay5jb20vYXVzdy9zbGljZXMvYWY1LzRmNTllYTY1ZGYxODRhMjU4MGFkOGZjODBkM2VhYTMyL2FmNTBjOTUxNjcxZDQzYTBiYjMzZTY2ODExNDZjYjQ0L0swMDAwMDAwMC50cz9wYnM9NzFhZjhjMjhiNDhjNDFjMmE5OGUwM2ZmNzMzNjZhNzMmY2xvdWQ9YXdzJmNkbj1lY2kmb2lkPWQ4ZTZlZWMyNmJmNTQ0ZjA4NGJhZDQ5YTdmYTJlYWM1JmlzX2FkPTEmc2k9MCZkPTIuMDQ4 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=af50c951671d43a0bb33e6681146cb44&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000001 +#EXTINF:2.0480, +https://x-live-fox-stgec.uplynk.com/ausw/slices/af5/4f59ea65df184a2580ad8fc80d3eaa32/af50c951671d43a0bb33e6681146cb44/K00000001.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&oid=d8e6eec26bf544f084bad49a7fa2eac5&is_ad=1&si=0&d=2.048 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=af50c951671d43a0bb33e6681146cb44&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000002 +#EXTINF:2.0480, +https://content-ause1-ur-fox1.uplynk.com/vodredir4/8210462c10584206871ca3e8ad14689b/K00000002.ts?seq=1&pbs=71af8c28b48c41c2a98e03ff73366a73&ptime=6.144&atomic=1&ohash=aHR0cHM6Ly94LWxpdmUtZm94LXN0Z2VjLnVwbHluay5jb20vYXVzdy9zbGljZXMvYWY1LzRmNTllYTY1ZGYxODRhMjU4MGFkOGZjODBkM2VhYTMyL2FmNTBjOTUxNjcxZDQzYTBiYjMzZTY2ODExNDZjYjQ0L0swMDAwMDAwMi50cz9wYnM9NzFhZjhjMjhiNDhjNDFjMmE5OGUwM2ZmNzMzNjZhNzMmY2xvdWQ9YXdzJmNkbj1lY2kmb2lkPWQ4ZTZlZWMyNmJmNTQ0ZjA4NGJhZDQ5YTdmYTJlYWM1JmlzX2FkPTEmc2k9MCZkPTIuMDQ4 +#UPLYNK-SEGMENT: 64e5d07ec4e14d83b86fc8cff12ec63d,00000000,ad +#UPLYNK-KEY:https://content-ause1-ur-fox1.uplynk.com/check?b=64e5d07ec4e14d83b86fc8cff12ec63d&v=8210462c10584206871ca3e8ad14689b&pbs=71af8c28b48c41c2a98e03ff73366a73 +#EXT-X-DISCONTINUITY +#EXT-X-PROGRAM-DATE-TIME:2022-01-31T20:52:12.041000+00:00 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=64e5d07ec4e14d83b86fc8cff12ec63d&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000000 +#EXTINF:2.0480, +https://content-ause1-ur-fox1.uplynk.com/vodredir4/8210462c10584206871ca3e8ad14689b/K00000000.ts?seq=5&pbs=71af8c28b48c41c2a98e03ff73366a73&ptime=17.024&atomic=1&ohash=aHR0cHM6Ly94LWxpdmUtZm94LXN0Z2VjLnVwbHluay5jb20vYXVzdy9zbGljZXMvNjRlLzRmNTllYTY1ZGYxODRhMjU4MGFkOGZjODBkM2VhYTMyLzY0ZTVkMDdlYzRlMTRkODNiODZmYzhjZmYxMmVjNjNkL0swMDAwMDAwMC50cz9wYnM9NzFhZjhjMjhiNDhjNDFjMmE5OGUwM2ZmNzMzNjZhNzMmY2xvdWQ9YXdzJmNkbj1lY2kmb2lkPWQ4ZTZlZWMyNmJmNTQ0ZjA4NGJhZDQ5YTdmYTJlYWM1JmlzX2FkPTEmc2k9MSZkPTIuMDQ4 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=64e5d07ec4e14d83b86fc8cff12ec63d&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000001 +#EXTINF:2.0480, +https://x-live-fox-stgec.uplynk.com/ausw/slices/64e/4f59ea65df184a2580ad8fc80d3eaa32/64e5d07ec4e14d83b86fc8cff12ec63d/K00000001.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&oid=d8e6eec26bf544f084bad49a7fa2eac5&is_ad=1&si=1&d=2.048 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=64e5d07ec4e14d83b86fc8cff12ec63d&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000002 +#EXTINF:2.0480, +https://content-ause1-ur-fox1.uplynk.com/vodredir4/8210462c10584206871ca3e8ad14689b/K00000002.ts?seq=6&pbs=71af8c28b48c41c2a98e03ff73366a73&ptime=21.120000000000005&atomic=1&ohash=aHR0cHM6Ly94LWxpdmUtZm94LXN0Z2VjLnVwbHluay5jb20vYXVzdy9zbGljZXMvNjRlLzRmNTllYTY1ZGYxODRhMjU4MGFkOGZjODBkM2VhYTMyLzY0ZTVkMDdlYzRlMTRkODNiODZmYzhjZmYxMmVjNjNkL0swMDAwMDAwMi50cz9wYnM9NzFhZjhjMjhiNDhjNDFjMmE5OGUwM2ZmNzMzNjZhNzMmY2xvdWQ9YXdzJmNkbj1lY2kmb2lkPWQ4ZTZlZWMyNmJmNTQ0ZjA4NGJhZDQ5YTdmYTJlYWM1JmlzX2FkPTEmc2k9MSZkPTIuMDQ4 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=64e5d07ec4e14d83b86fc8cff12ec63d&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000003 +#UPLYNK-SEGMENT: 8210462c10584206871ca3e8ad14689b,00000000,segment +#UPLYNK-KEY:https://content-ause1-ur-fox1.uplynk.com/check?b=8210462c10584206871ca3e8ad14689b&v=8210462c10584206871ca3e8ad14689b&pbs=71af8c28b48c41c2a98e03ff73366a73 +#EXT-X-DISCONTINUITY +#EXT-X-PROGRAM-DATE-TIME:2022-01-31T20:52:27.273000+00:00 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=8210462c10584206871ca3e8ad14689b&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000000 +#EXTINF:4.0960, +https://content-ause1-ur-fox1.uplynk.com/vodredir4/8210462c10584206871ca3e8ad14689b/K00000000.ts?seq=10&pbs=71af8c28b48c41c2a98e03ff73366a73&ptime=34.304000000000016&atomic=1&ohash=aHR0cHM6Ly94LWxpdmUtZm94LXN0Z2VjLnVwbHluay5jb20vYXVzZS9zbGljZXMvODIxL2Q4ZTZlZWMyNmJmNTQ0ZjA4NGJhZDQ5YTdmYTJlYWM1LzgyMTA0NjJjMTA1ODQyMDY4NzFjYTNlOGFkMTQ2ODliL0swMDAwMDAwMC50cz9wYnM9NzFhZjhjMjhiNDhjNDFjMmE5OGUwM2ZmNzMzNjZhNzMmY2xvdWQ9YXdzJmNkbj1lY2kmc2k9MiZkPTQuMDk2 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=8210462c10584206871ca3e8ad14689b&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000001 +#EXTINF:4.0960, +https://x-live-fox-stgec.uplynk.com/ause/slices/821/d8e6eec26bf544f084bad49a7fa2eac5/8210462c10584206871ca3e8ad14689b/K00000001.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&si=2&d=4.096 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=8210462c10584206871ca3e8ad14689b&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000002 +#EXTINF:4.0960, +https://x-live-fox-stgec.uplynk.com/ause/slices/821/d8e6eec26bf544f084bad49a7fa2eac5/8210462c10584206871ca3e8ad14689b/K00000002.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&si=2&d=4.096 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=8210462c10584206871ca3e8ad14689b&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000003 +#EXTINF:4.0960, +https://x-live-fox-stgec.uplynk.com/ause/slices/821/d8e6eec26bf544f084bad49a7fa2eac5/8210462c10584206871ca3e8ad14689b/K00000003.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&si=2&d=4.096 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=8210462c10584206871ca3e8ad14689b&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000004 +#EXTINF:4.0960, +https://x-live-fox-stgec.uplynk.com/ause/slices/821/d8e6eec26bf544f084bad49a7fa2eac5/8210462c10584206871ca3e8ad14689b/K00000004.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&si=2&d=4.096 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=8210462c10584206871ca3e8ad14689b&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000005 +#EXTINF:4.0960, +https://x-live-fox-stgec.uplynk.com/ause/slices/821/d8e6eec26bf544f084bad49a7fa2eac5/8210462c10584206871ca3e8ad14689b/K00000005.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&si=2&d=4.096 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=8210462c10584206871ca3e8ad14689b&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000006 +#UPLYNK-KEY:https://content-ause1-ur-fox1.uplynk.com/check?b=979c4855459b4040bae9888dddf4baa9&v=8210462c10584206871ca3e8ad14689b&pbs=71af8c28b48c41c2a98e03ff73366a73 +#EXT-X-DISCONTINUITY +#EXT-X-PROGRAM-DATE-TIME:2022-01-31T21:04:50.291667+00:00 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=979c4855459b4040bae9888dddf4baa9&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000000 +#EXTINF:2.0480, +https://content-ause1-ur-fox1.uplynk.com/vodredir4/8210462c10584206871ca3e8ad14689b/K00000000.ts?seq=11&pbs=71af8c28b48c41c2a98e03ff73366a73&ptime=775.2746666666673&atomic=1&ohash=aHR0cHM6Ly94LWxpdmUtZm94LXN0Z2VjLnVwbHluay5jb20vYXVzdy9zbGljZXMvOTc5LzRmNTllYTY1ZGYxODRhMjU4MGFkOGZjODBkM2VhYTMyLzk3OWM0ODU1NDU5YjQwNDBiYWU5ODg4ZGRkZjRiYWE5L0swMDAwMDAwMC50cz9wYnM9NzFhZjhjMjhiNDhjNDFjMmE5OGUwM2ZmNzMzNjZhNzMmY2xvdWQ9YXdzJmNkbj1lY2kmb2lkPWQ4ZTZlZWMyNmJmNTQ0ZjA4NGJhZDQ5YTdmYTJlYWM1JmlzX2FkPTEmc2k9MyZkPTIuMDQ4 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=979c4855459b4040bae9888dddf4baa9&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000001 +#EXTINF:2.0480, +https://x-live-fox-stgec.uplynk.com/ausw/slices/979/4f59ea65df184a2580ad8fc80d3eaa32/979c4855459b4040bae9888dddf4baa9/K00000001.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&oid=d8e6eec26bf544f084bad49a7fa2eac5&is_ad=1&si=3&d=2.048 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=979c4855459b4040bae9888dddf4baa9&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000002 +#EXTINF:2.0480, +https://content-ause1-ur-fox1.uplynk.com/vodredir4/8210462c10584206871ca3e8ad14689b/K00000002.ts?seq=12&pbs=71af8c28b48c41c2a98e03ff73366a73&ptime=779.3706666666673&atomic=1&ohash=aHR0cHM6Ly94LWxpdmUtZm94LXN0Z2VjLnVwbHluay5jb20vYXVzdy9zbGljZXMvOTc5LzRmNTllYTY1ZGYxODRhMjU4MGFkOGZjODBkM2VhYTMyLzk3OWM0ODU1NDU5YjQwNDBiYWU5ODg4ZGRkZjRiYWE5L0swMDAwMDAwMi50cz9wYnM9NzFhZjhjMjhiNDhjNDFjMmE5OGUwM2ZmNzMzNjZhNzMmY2xvdWQ9YXdzJmNkbj1lY2kmb2lkPWQ4ZTZlZWMyNmJmNTQ0ZjA4NGJhZDQ5YTdmYTJlYWM1JmlzX2FkPTEmc2k9MyZkPTIuMDQ4 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=979c4855459b4040bae9888dddf4baa9&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000003 +#EXTINF:2.0480, +https://x-live-fox-stgec.uplynk.com/ausw/slices/979/4f59ea65df184a2580ad8fc80d3eaa32/979c4855459b4040bae9888dddf4baa9/K00000003.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&oid=d8e6eec26bf544f084bad49a7fa2eac5&is_ad=1&si=3&d=2.048 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=979c4855459b4040bae9888dddf4baa9&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000004 +#EXTINF:2.0480, +https://content-ause1-ur-fox1.uplynk.com/vodredir4/8210462c10584206871ca3e8ad14689b/K00000004.ts?seq=13&pbs=71af8c28b48c41c2a98e03ff73366a73&ptime=783.4666666666673&atomic=1&ohash=aHR0cHM6Ly94LWxpdmUtZm94LXN0Z2VjLnVwbHluay5jb20vYXVzdy9zbGljZXMvOTc5LzRmNTllYTY1ZGYxODRhMjU4MGFkOGZjODBkM2VhYTMyLzk3OWM0ODU1NDU5YjQwNDBiYWU5ODg4ZGRkZjRiYWE5L0swMDAwMDAwNC50cz9wYnM9NzFhZjhjMjhiNDhjNDFjMmE5OGUwM2ZmNzMzNjZhNzMmY2xvdWQ9YXdzJmNkbj1lY2kmb2lkPWQ4ZTZlZWMyNmJmNTQ0ZjA4NGJhZDQ5YTdmYTJlYWM1JmlzX2FkPTEmc2k9MyZkPTIuMDQ4 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=979c4855459b4040bae9888dddf4baa9&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000005 +#EXTINF:2.0480, +https://x-live-fox-stgec.uplynk.com/ausw/slices/979/4f59ea65df184a2580ad8fc80d3eaa32/979c4855459b4040bae9888dddf4baa9/K00000005.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&oid=d8e6eec26bf544f084bad49a7fa2eac5&is_ad=1&si=3&d=2.048 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=979c4855459b4040bae9888dddf4baa9&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000006 +#UPLYNK-SEGMENT: 09ef3b84390a4a23b9223b97729b3f0a,00000000,ad +#UPLYNK-KEY:https://content-ause1-ur-fox1.uplynk.com/check?b=09ef3b84390a4a23b9223b97729b3f0a&v=8210462c10584206871ca3e8ad14689b&pbs=71af8c28b48c41c2a98e03ff73366a73 +#EXT-X-DISCONTINUITY +#EXT-X-PROGRAM-DATE-TIME:2022-01-31T21:05:21.011667+00:00 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=09ef3b84390a4a23b9223b97729b3f0a&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000000 +#EXTINF:2.0480, +https://x-live-fox-stgec.uplynk.com/ausw/slices/09e/4f59ea65df184a2580ad8fc80d3eaa32/09ef3b84390a4a23b9223b97729b3f0a/K00000000.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&oid=d8e6eec26bf544f084bad49a7fa2eac5&is_ad=1&si=4&d=2.048 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=09ef3b84390a4a23b9223b97729b3f0a&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000001 +#EXTINF:2.0480, +https://content-ause1-ur-fox1.uplynk.com/vodredir4/8210462c10584206871ca3e8ad14689b/K00000001.ts?seq=19&pbs=71af8c28b48c41c2a98e03ff73366a73&ptime=808.0426666666673&atomic=1&ohash=aHR0cHM6Ly94LWxpdmUtZm94LXN0Z2VjLnVwbHluay5jb20vYXVzdy9zbGljZXMvMDllLzRmNTllYTY1ZGYxODRhMjU4MGFkOGZjODBkM2VhYTMyLzA5ZWYzYjg0MzkwYTRhMjNiOTIyM2I5NzcyOWIzZjBhL0swMDAwMDAwMS50cz9wYnM9NzFhZjhjMjhiNDhjNDFjMmE5OGUwM2ZmNzMzNjZhNzMmY2xvdWQ9YXdzJmNkbj1lY2kmb2lkPWQ4ZTZlZWMyNmJmNTQ0ZjA4NGJhZDQ5YTdmYTJlYWM1JmlzX2FkPTEmc2k9NCZkPTIuMDQ4 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=09ef3b84390a4a23b9223b97729b3f0a&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000002 +#EXTINF:2.0480, +https://x-live-fox-stgec.uplynk.com/ausw/slices/09e/4f59ea65df184a2580ad8fc80d3eaa32/09ef3b84390a4a23b9223b97729b3f0a/K00000002.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&oid=d8e6eec26bf544f084bad49a7fa2eac5&is_ad=1&si=4&d=2.048 +#UPLYNK-SEGMENT: ccb4b41ccd9c4e1abf3744c5c5af3d3f,00000000,ad +#UPLYNK-KEY:https://content-ause1-ur-fox1.uplynk.com/check?b=ccb4b41ccd9c4e1abf3744c5c5af3d3f&v=8210462c10584206871ca3e8ad14689b&pbs=71af8c28b48c41c2a98e03ff73366a73 +#EXT-X-DISCONTINUITY +#EXT-X-PROGRAM-DATE-TIME:2022-01-31T21:05:36.243667+00:00 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=ccb4b41ccd9c4e1abf3744c5c5af3d3f&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000000 +#EXTINF:2.0480, +https://x-live-fox-stgec.uplynk.com/ausw/slices/ccb/4f59ea65df184a2580ad8fc80d3eaa32/ccb4b41ccd9c4e1abf3744c5c5af3d3f/K00000000.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&oid=d8e6eec26bf544f084bad49a7fa2eac5&is_ad=1&si=5&d=2.048 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=ccb4b41ccd9c4e1abf3744c5c5af3d3f&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000001 +#EXTINF:2.0480, +https://content-ause1-ur-fox1.uplynk.com/vodredir4/8210462c10584206871ca3e8ad14689b/K00000001.ts?seq=23&pbs=71af8c28b48c41c2a98e03ff73366a73&ptime=823.2746666666673&atomic=1&ohash=aHR0cHM6Ly94LWxpdmUtZm94LXN0Z2VjLnVwbHluay5jb20vYXVzdy9zbGljZXMvY2NiLzRmNTllYTY1ZGYxODRhMjU4MGFkOGZjODBkM2VhYTMyL2NjYjRiNDFjY2Q5YzRlMWFiZjM3NDRjNWM1YWYzZDNmL0swMDAwMDAwMS50cz9wYnM9NzFhZjhjMjhiNDhjNDFjMmE5OGUwM2ZmNzMzNjZhNzMmY2xvdWQ9YXdzJmNkbj1lY2kmb2lkPWQ4ZTZlZWMyNmJmNTQ0ZjA4NGJhZDQ5YTdmYTJlYWM1JmlzX2FkPTEmc2k9NSZkPTIuMDQ4 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=ccb4b41ccd9c4e1abf3744c5c5af3d3f&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000002 +#EXTINF:2.0480, +https://x-live-fox-stgec.uplynk.com/ausw/slices/ccb/4f59ea65df184a2580ad8fc80d3eaa32/ccb4b41ccd9c4e1abf3744c5c5af3d3f/K00000002.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&oid=d8e6eec26bf544f084bad49a7fa2eac5&is_ad=1&si=5&d=2.048 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=ccb4b41ccd9c4e1abf3744c5c5af3d3f&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000003 +#EXTINF:2.0480, +https://content-ause1-ur-fox1.uplynk.com/vodredir4/8210462c10584206871ca3e8ad14689b/K00000003.ts?seq=24&pbs=71af8c28b48c41c2a98e03ff73366a73&ptime=827.3706666666673&atomic=1&ohash=aHR0cHM6Ly94LWxpdmUtZm94LXN0Z2VjLnVwbHluay5jb20vYXVzdy9zbGljZXMvY2NiLzRmNTllYTY1ZGYxODRhMjU4MGFkOGZjODBkM2VhYTMyL2NjYjRiNDFjY2Q5YzRlMWFiZjM3NDRjNWM1YWYzZDNmL0swMDAwMDAwMy50cz9wYnM9NzFhZjhjMjhiNDhjNDFjMmE5OGUwM2ZmNzMzNjZhNzMmY2xvdWQ9YXdzJmNkbj1lY2kmb2lkPWQ4ZTZlZWMyNmJmNTQ0ZjA4NGJhZDQ5YTdmYTJlYWM1JmlzX2FkPTEmc2k9NSZkPTIuMDQ4 +#UPLYNK-SEGMENT: 2e7e9c39c6ab448bbef3681339692292,00000000,ad +#UPLYNK-KEY:https://content-ause1-ur-fox1.uplynk.com/check?b=2e7e9c39c6ab448bbef3681339692292&v=8210462c10584206871ca3e8ad14689b&pbs=71af8c28b48c41c2a98e03ff73366a73 +#EXT-X-DISCONTINUITY +#EXT-X-PROGRAM-DATE-TIME:2022-01-31T21:06:06.963667+00:00 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=2e7e9c39c6ab448bbef3681339692292&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000000 +#EXTINF:2.0480, +https://content-ause1-ur-fox1.uplynk.com/vodredir4/8210462c10584206871ca3e8ad14689b/K00000000.ts?seq=31&pbs=71af8c28b48c41c2a98e03ff73366a73&ptime=851.9466666666673&atomic=1&ohash=aHR0cHM6Ly94LWxpdmUtZm94LXN0Z2VjLnVwbHluay5jb20vYXVzdy9zbGljZXMvMmU3LzRmNTllYTY1ZGYxODRhMjU4MGFkOGZjODBkM2VhYTMyLzJlN2U5YzM5YzZhYjQ0OGJiZWYzNjgxMzM5NjkyMjkyL0swMDAwMDAwMC50cz9wYnM9NzFhZjhjMjhiNDhjNDFjMmE5OGUwM2ZmNzMzNjZhNzMmY2xvdWQ9YXdzJmNkbj1lY2kmb2lkPWQ4ZTZlZWMyNmJmNTQ0ZjA4NGJhZDQ5YTdmYTJlYWM1JmlzX2FkPTEmc2k9NiZkPTIuMDQ4 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=2e7e9c39c6ab448bbef3681339692292&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000001 +#EXTINF:2.0480, +https://x-live-fox-stgec.uplynk.com/ausw/slices/2e7/4f59ea65df184a2580ad8fc80d3eaa32/2e7e9c39c6ab448bbef3681339692292/K00000001.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&oid=d8e6eec26bf544f084bad49a7fa2eac5&is_ad=1&si=6&d=2.048 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=2e7e9c39c6ab448bbef3681339692292&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000002 +#EXTINF:2.0480, +https://content-ause1-ur-fox1.uplynk.com/vodredir4/8210462c10584206871ca3e8ad14689b/K00000002.ts?seq=32&pbs=71af8c28b48c41c2a98e03ff73366a73&ptime=856.0426666666673&atomic=1&ohash=aHR0cHM6Ly94LWxpdmUtZm94LXN0Z2VjLnVwbHluay5jb20vYXVzdy9zbGljZXMvMmU3LzRmNTllYTY1ZGYxODRhMjU4MGFkOGZjODBkM2VhYTMyLzJlN2U5YzM5YzZhYjQ0OGJiZWYzNjgxMzM5NjkyMjkyL0swMDAwMDAwMi50cz9wYnM9NzFhZjhjMjhiNDhjNDFjMmE5OGUwM2ZmNzMzNjZhNzMmY2xvdWQ9YXdzJmNkbj1lY2kmb2lkPWQ4ZTZlZWMyNmJmNTQ0ZjA4NGJhZDQ5YTdmYTJlYWM1JmlzX2FkPTEmc2k9NiZkPTIuMDQ4 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=2e7e9c39c6ab448bbef3681339692292&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000003 +#EXTINF:2.0480, +https://x-live-fox-stgec.uplynk.com/ausw/slices/2e7/4f59ea65df184a2580ad8fc80d3eaa32/2e7e9c39c6ab448bbef3681339692292/K00000003.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&oid=d8e6eec26bf544f084bad49a7fa2eac5&is_ad=1&si=6&d=2.048 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=2e7e9c39c6ab448bbef3681339692292&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000004 +#EXTINF:2.0480, +https://content-ause1-ur-fox1.uplynk.com/vodredir4/8210462c10584206871ca3e8ad14689b/K00000004.ts?seq=33&pbs=71af8c28b48c41c2a98e03ff73366a73&ptime=860.1386666666673&atomic=1&ohash=aHR0cHM6Ly94LWxpdmUtZm94LXN0Z2VjLnVwbHluay5jb20vYXVzdy9zbGljZXMvMmU3LzRmNTllYTY1ZGYxODRhMjU4MGFkOGZjODBkM2VhYTMyLzJlN2U5YzM5YzZhYjQ0OGJiZWYzNjgxMzM5NjkyMjkyL0swMDAwMDAwNC50cz9wYnM9NzFhZjhjMjhiNDhjNDFjMmE5OGUwM2ZmNzMzNjZhNzMmY2xvdWQ9YXdzJmNkbj1lY2kmb2lkPWQ4ZTZlZWMyNmJmNTQ0ZjA4NGJhZDQ5YTdmYTJlYWM1JmlzX2FkPTEmc2k9NiZkPTIuMDQ4 +#UPLYNK-SEGMENT: c85e20e9058948f0b3ad8fe8dfe06f04,00000000,ad +#UPLYNK-KEY:https://content-ause1-ur-fox1.uplynk.com/check?b=c85e20e9058948f0b3ad8fe8dfe06f04&v=8210462c10584206871ca3e8ad14689b&pbs=71af8c28b48c41c2a98e03ff73366a73 +#EXT-X-DISCONTINUITY +#EXT-X-PROGRAM-DATE-TIME:2022-01-31T21:06:37.427667+00:00 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=c85e20e9058948f0b3ad8fe8dfe06f04&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000000 +#EXTINF:2.0480, +https://x-live-fox-stgec.uplynk.com/ausw/slices/c85/4f59ea65df184a2580ad8fc80d3eaa32/c85e20e9058948f0b3ad8fe8dfe06f04/K00000000.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&oid=d8e6eec26bf544f084bad49a7fa2eac5&is_ad=1&si=7&d=2.048 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=c85e20e9058948f0b3ad8fe8dfe06f04&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000001 +#EXTINF:2.0480, +https://content-ause1-ur-fox1.uplynk.com/vodredir4/8210462c10584206871ca3e8ad14689b/K00000001.ts?seq=39&pbs=71af8c28b48c41c2a98e03ff73366a73&ptime=884.4586666666673&atomic=1&ohash=aHR0cHM6Ly94LWxpdmUtZm94LXN0Z2VjLnVwbHluay5jb20vYXVzdy9zbGljZXMvYzg1LzRmNTllYTY1ZGYxODRhMjU4MGFkOGZjODBkM2VhYTMyL2M4NWUyMGU5MDU4OTQ4ZjBiM2FkOGZlOGRmZTA2ZjA0L0swMDAwMDAwMS50cz9wYnM9NzFhZjhjMjhiNDhjNDFjMmE5OGUwM2ZmNzMzNjZhNzMmY2xvdWQ9YXdzJmNkbj1lY2kmb2lkPWQ4ZTZlZWMyNmJmNTQ0ZjA4NGJhZDQ5YTdmYTJlYWM1JmlzX2FkPTEmc2k9NyZkPTIuMDQ4 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=c85e20e9058948f0b3ad8fe8dfe06f04&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000002 +#EXTINF:2.0480, +https://x-live-fox-stgec.uplynk.com/ausw/slices/c85/4f59ea65df184a2580ad8fc80d3eaa32/c85e20e9058948f0b3ad8fe8dfe06f04/K00000002.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&oid=d8e6eec26bf544f084bad49a7fa2eac5&is_ad=1&si=7&d=2.048 +#UPLYNK-SEGMENT: 8210462c10584206871ca3e8ad14689b,000000B6,segment +#UPLYNK-KEY:https://content-ause1-ur-fox1.uplynk.com/check?b=8210462c10584206871ca3e8ad14689b&v=8210462c10584206871ca3e8ad14689b&pbs=71af8c28b48c41c2a98e03ff73366a73 +#EXT-X-DISCONTINUITY +#EXT-X-PROGRAM-DATE-TIME:2022-01-31T21:06:52.659667+00:00 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=8210462c10584206871ca3e8ad14689b&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x000000000000000000000000000000B6 +#EXTINF:4.0960, +https://content-ause1-ur-fox1.uplynk.com/vodredir4/8210462c10584206871ca3e8ad14689b/K000000B6.ts?seq=43&pbs=71af8c28b48c41c2a98e03ff73366a73&ptime=899.6906666666673&atomic=1&ohash=aHR0cHM6Ly94LWxpdmUtZm94LXN0Z2VjLnVwbHluay5jb20vYXVzZS9zbGljZXMvODIxL2Q4ZTZlZWMyNmJmNTQ0ZjA4NGJhZDQ5YTdmYTJlYWM1LzgyMTA0NjJjMTA1ODQyMDY4NzFjYTNlOGFkMTQ2ODliL0swMDAwMDBCNi50cz9wYnM9NzFhZjhjMjhiNDhjNDFjMmE5OGUwM2ZmNzMzNjZhNzMmY2xvdWQ9YXdzJmNkbj1lY2kmc2k9MiZkPTQuMDk2 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=8210462c10584206871ca3e8ad14689b&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x000000000000000000000000000000B7 +#EXTINF:4.0960, +https://x-live-fox-stgec.uplynk.com/ause/slices/821/d8e6eec26bf544f084bad49a7fa2eac5/8210462c10584206871ca3e8ad14689b/K000000B7.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&si=2&d=4.096 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=8210462c10584206871ca3e8ad14689b&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x000000000000000000000000000000B8 +#EXTINF:4.0960, +https://x-live-fox-stgec.uplynk.com/ause/slices/821/d8e6eec26bf544f084bad49a7fa2eac5/8210462c10584206871ca3e8ad14689b/K000000B8.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&si=2&d=4.096 +https://x-live-fox-stgec.uplynk.com/ause/slices/821/d8e6eec26bf544f084bad49a7fa2eac5/8210462c10584206871ca3e8ad14689b/K00000121.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&si=2&d=0.724 +#UPLYNK-SEGMENT: 01dcc16ff5754195ae442d922d31bd00,00000000,ad +#UPLYNK-KEY:https://content-ause1-ur-fox1.uplynk.com/check?b=01dcc16ff5754195ae442d922d31bd00&v=8210462c10584206871ca3e8ad14689b&pbs=71af8c28b48c41c2a98e03ff73366a73 +#EXT-X-DISCONTINUITY +#EXT-X-PROGRAM-DATE-TIME:2022-01-31T21:14:11.655167+00:00 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=01dcc16ff5754195ae442d922d31bd00&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000000 +#EXTINF:2.0480, +https://x-live-fox-stgec.uplynk.com/ausw/slices/01d/4f59ea65df184a2580ad8fc80d3eaa32/01dcc16ff5754195ae442d922d31bd00/K00000000.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&oid=d8e6eec26bf544f084bad49a7fa2eac5&is_ad=1&si=8&d=2.048 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=01dcc16ff5754195ae442d922d31bd00&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000001 +#EXTINF:2.0480, +https://content-ause1-ur-fox1.uplynk.com/vodredir4/8210462c10584206871ca3e8ad14689b/K00000001.ts?seq=44&pbs=71af8c28b48c41c2a98e03ff73366a73&ptime=1338.6861666666678&atomic=1&ohash=aHR0cHM6Ly94LWxpdmUtZm94LXN0Z2VjLnVwbHluay5jb20vYXVzdy9zbGljZXMvMDFkLzRmNTllYTY1ZGYxODRhMjU4MGFkOGZjODBkM2VhYTMyLzAxZGNjMTZmZjU3NTQxOTVhZTQ0MmQ5MjJkMzFiZDAwL0swMDAwMDAwMS50cz9wYnM9NzFhZjhjMjhiNDhjNDFjMmE5OGUwM2ZmNzMzNjZhNzMmY2xvdWQ9YXdzJmNkbj1lY2kmb2lkPWQ4ZTZlZWMyNmJmNTQ0ZjA4NGJhZDQ5YTdmYTJlYWM1JmlzX2FkPTEmc2k9OCZkPTIuMDQ4 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=01dcc16ff5754195ae442d922d31bd00&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000002 +#EXTINF:2.0480, +https://x-live-fox-stgec.uplynk.com/ausw/slices/01d/4f59ea65df184a2580ad8fc80d3eaa32/01dcc16ff5754195ae442d922d31bd00/K00000002.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&oid=d8e6eec26bf544f084bad49a7fa2eac5&is_ad=1&si=8&d=2.048 +#UPLYNK-SEGMENT: ed925a00daeb4ddb86352d4fc638745b,00000000,ad +#UPLYNK-KEY:https://content-ause1-ur-fox1.uplynk.com/check?b=ed925a00daeb4ddb86352d4fc638745b&v=8210462c10584206871ca3e8ad14689b&pbs=71af8c28b48c41c2a98e03ff73366a73 +#EXT-X-DISCONTINUITY +#EXT-X-PROGRAM-DATE-TIME:2022-01-31T21:14:26.887167+00:00 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=ed925a00daeb4ddb86352d4fc638745b&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000000 +#EXTINF:2.0480, +https://x-live-fox-stgec.uplynk.com/ausw/slices/ed9/4f59ea65df184a2580ad8fc80d3eaa32/ed925a00daeb4ddb86352d4fc638745b/K00000000.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&oid=d8e6eec26bf544f084bad49a7fa2eac5&is_ad=1&si=9&d=2.048 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=ed925a00daeb4ddb86352d4fc638745b&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000001 +#EXTINF:2.0480, +https://content-ause1-ur-fox1.uplynk.com/vodredir4/8210462c10584206871ca3e8ad14689b/K00000001.ts?seq=48&pbs=71af8c28b48c41c2a98e03ff73366a73&ptime=1353.9181666666677&atomic=1&ohash=aHR0cHM6Ly94LWxpdmUtZm94LXN0Z2VjLnVwbHluay5jb20vYXVzdy9zbGljZXMvZWQ5LzRmNTllYTY1ZGYxODRhMjU4MGFkOGZjODBkM2VhYTMyL2VkOTI1YTAwZGFlYjRkZGI4NjM1MmQ0ZmM2Mzg3NDViL0swMDAwMDAwMS50cz9wYnM9NzFhZjhjMjhiNDhjNDFjMmE5OGUwM2ZmNzMzNjZhNzMmY2xvdWQ9YXdzJmNkbj1lY2kmb2lkPWQ4ZTZlZWMyNmJmNTQ0ZjA4NGJhZDQ5YTdmYTJlYWM1JmlzX2FkPTEmc2k9OSZkPTIuMDQ4 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=ed925a00daeb4ddb86352d4fc638745b&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000002 +#EXTINF:2.0480, +https://x-live-fox-stgec.uplynk.com/ausw/slices/ed9/4f59ea65df184a2580ad8fc80d3eaa32/ed925a00daeb4ddb86352d4fc638745b/K00000002.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&oid=d8e6eec26bf544f084bad49a7fa2eac5&is_ad=1&si=9&d=2.048 +#UPLYNK-SEGMENT: 655874187b0b4d47a777921bccfabfae,00000000,ad +#UPLYNK-KEY:https://content-ause1-ur-fox1.uplynk.com/check?b=655874187b0b4d47a777921bccfabfae&v=8210462c10584206871ca3e8ad14689b&pbs=71af8c28b48c41c2a98e03ff73366a73 +#EXT-X-DISCONTINUITY +#EXT-X-PROGRAM-DATE-TIME:2022-01-31T21:47:33.485917+00:00 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=655874187b0b4d47a777921bccfabfae&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000000 +#EXTINF:2.0480, +https://x-live-fox-stgec.uplynk.com/ausw/slices/655/4f59ea65df184a2580ad8fc80d3eaa32/655874187b0b4d47a777921bccfabfae/K00000000.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&oid=d8e6eec26bf544f084bad49a7fa2eac5&is_ad=1&si=30&d=2.048 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=655874187b0b4d47a777921bccfabfae&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000001 +#EXTINF:2.0480, +https://content-ause1-ur-fox1.uplynk.com/vodredir4/8210462c10584206871ca3e8ad14689b/K00000001.ts?seq=208&pbs=71af8c28b48c41c2a98e03ff73366a73&ptime=3340.5169166666333&atomic=1&ohash=aHR0cHM6Ly94LWxpdmUtZm94LXN0Z2VjLnVwbHluay5jb20vYXVzdy9zbGljZXMvNjU1LzRmNTllYTY1ZGYxODRhMjU4MGFkOGZjODBkM2VhYTMyLzY1NTg3NDE4N2IwYjRkNDdhNzc3OTIxYmNjZmFiZmFlL0swMDAwMDAwMS50cz9wYnM9NzFhZjhjMjhiNDhjNDFjMmE5OGUwM2ZmNzMzNjZhNzMmY2xvdWQ9YXdzJmNkbj1lY2kmb2lkPWQ4ZTZlZWMyNmJmNTQ0ZjA4NGJhZDQ5YTdmYTJlYWM1JmlzX2FkPTEmc2k9MzAmZD0yLjA0OA== +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=655874187b0b4d47a777921bccfabfae&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000002 +#EXTINF:2.0480, +https://x-live-fox-stgec.uplynk.com/ausw/slices/655/4f59ea65df184a2580ad8fc80d3eaa32/655874187b0b4d47a777921bccfabfae/K00000002.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&oid=d8e6eec26bf544f084bad49a7fa2eac5&is_ad=1&si=30&d=2.048 +#UPLYNK-SEGMENT: 8210462c10584206871ca3e8ad14689b,0000027E,segment +#UPLYNK-KEY:https://content-ause1-ur-fox1.uplynk.com/check?b=8210462c10584206871ca3e8ad14689b&v=8210462c10584206871ca3e8ad14689b&pbs=71af8c28b48c41c2a98e03ff73366a73 +#EXT-X-DISCONTINUITY +#EXT-X-PROGRAM-DATE-TIME:2022-01-31T21:47:48.461917+00:00 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=8210462c10584206871ca3e8ad14689b&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x0000000000000000000000000000027E +#EXTINF:4.0960, +https://x-live-fox-stgec.uplynk.com/ause/slices/821/d8e6eec26bf544f084bad49a7fa2eac5/8210462c10584206871ca3e8ad14689b/K0000027E.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&si=2&d=4.096 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=8210462c10584206871ca3e8ad14689b&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x0000000000000000000000000000027F +#EXTINF:4.0960, +https://content-ause1-ur-fox1.uplynk.com/vodredir4/8210462c10584206871ca3e8ad14689b/K0000027F.ts?seq=212&pbs=71af8c28b48c41c2a98e03ff73366a73&ptime=3359.588916666632&atomic=1&ohash=aHR0cHM6Ly94LWxpdmUtZm94LXN0Z2VjLnVwbHluay5jb20vYXVzZS9zbGljZXMvODIxL2Q4ZTZlZWMyNmJmNTQ0ZjA4NGJhZDQ5YTdmYTJlYWM1LzgyMTA0NjJjMTA1ODQyMDY4NzFjYTNlOGFkMTQ2ODliL0swMDAwMDI3Ri50cz9wYnM9NzFhZjhjMjhiNDhjNDFjMmE5OGUwM2ZmNzMzNjZhNzMmY2xvdWQ9YXdzJmNkbj1lY2kmc2k9MiZkPTQuMDk2 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=8210462c10584206871ca3e8ad14689b&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000280 +#EXTINF:4.0960, +https://x-live-fox-stgec.uplynk.com/ause/slices/821/d8e6eec26bf544f084bad49a7fa2eac5/8210462c10584206871ca3e8ad14689b/K00000280.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&si=2&d=4.096 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=8210462c10584206871ca3e8ad14689b&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000281 +#EXTINF:4.0960, +https://x-live-fox-stgec.uplynk.com/ause/slices/821/d8e6eec26bf544f084bad49a7fa2eac5/8210462c10584206871ca3e8ad14689b/K00000281.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&si=2&d=4.096 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=8210462c10584206871ca3e8ad14689b&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000282 +#EXTINF:0.3312, +https://content-ause1-ur-fox1.uplynk.com/vodredir4/8210462c10584206871ca3e8ad14689b/K00000288.ts?seq=213&pbs=71af8c28b48c41c2a98e03ff73366a73&ptime=3392.6881666666322&atomic=1&ohash=aHR0cHM6Ly94LWxpdmUtZm94LXN0Z2VjLnVwbHluay5jb20vYXVzZS9zbGljZXMvODIxL2Q4ZTZlZWMyNmJmNTQ0ZjA4NGJhZDQ5YTdmYTJlYWM1LzgyMTA0NjJjMTA1ODQyMDY4NzFjYTNlOGFkMTQ2ODliL0swMDAwMDI4OC50cz9wYnM9NzFhZjhjMjhiNDhjNDFjMmE5OGUwM2ZmNzMzNjZhNzMmY2xvdWQ9YXdzJmNkbj1lY2kmc2k9MiZkPTAuMzMx +#UPLYNK-SEGMENT: 01dcc16ff5754195ae442d922d31bd00,00000000,ad +#UPLYNK-KEY:https://content-ause1-ur-fox1.uplynk.com/check?b=01dcc16ff5754195ae442d922d31bd00&v=8210462c10584206871ca3e8ad14689b&pbs=71af8c28b48c41c2a98e03ff73366a73 +#EXT-X-DISCONTINUITY +#EXT-X-PROGRAM-DATE-TIME:2022-01-31T21:14:11.655167+00:00 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=01dcc16ff5754195ae442d922d31bd00&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000000 +#EXTINF:2.0480, +https://x-live-fox-stgec.uplynk.com/ausw/slices/01d/4f59ea65df184a2580ad8fc80d3eaa32/01dcc16ff5754195ae442d922d31bd00/K00000000.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&oid=d8e6eec26bf544f084bad49a7fa2eac5&is_ad=1&si=8&d=2.048 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=01dcc16ff5754195ae442d922d31bd00&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000001 +#EXTINF:2.0480, +https://content-ause1-ur-fox1.uplynk.com/vodredir4/8210462c10584206871ca3e8ad14689b/K00000001.ts?seq=44&pbs=71af8c28b48c41c2a98e03ff73366a73&ptime=1338.6861666666678&atomic=1&ohash=aHR0cHM6Ly94LWxpdmUtZm94LXN0Z2VjLnVwbHluay5jb20vYXVzdy9zbGljZXMvMDFkLzRmNTllYTY1ZGYxODRhMjU4MGFkOGZjODBkM2VhYTMyLzAxZGNjMTZmZjU3NTQxOTVhZTQ0MmQ5MjJkMzFiZDAwL0swMDAwMDAwMS50cz9wYnM9NzFhZjhjMjhiNDhjNDFjMmE5OGUwM2ZmNzMzNjZhNzMmY2xvdWQ9YXdzJmNkbj1lY2kmb2lkPWQ4ZTZlZWMyNmJmNTQ0ZjA4NGJhZDQ5YTdmYTJlYWM1JmlzX2FkPTEmc2k9OCZkPTIuMDQ4 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=01dcc16ff5754195ae442d922d31bd00&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000002 +#EXTINF:2.0480, +https://x-live-fox-stgec.uplynk.com/ausw/slices/01d/4f59ea65df184a2580ad8fc80d3eaa32/01dcc16ff5754195ae442d922d31bd00/K00000002.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&oid=d8e6eec26bf544f084bad49a7fa2eac5&is_ad=1&si=8&d=2.048 +#UPLYNK-SEGMENT: ed925a00daeb4ddb86352d4fc638745b,00000000,ad +#UPLYNK-KEY:https://content-ause1-ur-fox1.uplynk.com/check?b=ed925a00daeb4ddb86352d4fc638745b&v=8210462c10584206871ca3e8ad14689b&pbs=71af8c28b48c41c2a98e03ff73366a73 +#EXT-X-DISCONTINUITY +#EXT-X-PROGRAM-DATE-TIME:2022-01-31T21:14:26.887167+00:00 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=ed925a00daeb4ddb86352d4fc638745b&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000000 +#EXTINF:2.0480, +https://x-live-fox-stgec.uplynk.com/ausw/slices/ed9/4f59ea65df184a2580ad8fc80d3eaa32/ed925a00daeb4ddb86352d4fc638745b/K00000000.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&oid=d8e6eec26bf544f084bad49a7fa2eac5&is_ad=1&si=9&d=2.048 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=ed925a00daeb4ddb86352d4fc638745b&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000001 +#EXTINF:2.0480, +https://content-ause1-ur-fox1.uplynk.com/vodredir4/8210462c10584206871ca3e8ad14689b/K00000001.ts?seq=48&pbs=71af8c28b48c41c2a98e03ff73366a73&ptime=1353.9181666666677&atomic=1&ohash=aHR0cHM6Ly94LWxpdmUtZm94LXN0Z2VjLnVwbHluay5jb20vYXVzdy9zbGljZXMvZWQ5LzRmNTllYTY1ZGYxODRhMjU4MGFkOGZjODBkM2VhYTMyL2VkOTI1YTAwZGFlYjRkZGI4NjM1MmQ0ZmM2Mzg3NDViL0swMDAwMDAwMS50cz9wYnM9NzFhZjhjMjhiNDhjNDFjMmE5OGUwM2ZmNzMzNjZhNzMmY2xvdWQ9YXdzJmNkbj1lY2kmb2lkPWQ4ZTZlZWMyNmJmNTQ0ZjA4NGJhZDQ5YTdmYTJlYWM1JmlzX2FkPTEmc2k9OSZkPTIuMDQ4 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=ed925a00daeb4ddb86352d4fc638745b&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000002 +#EXTINF:2.0480, +https://x-live-fox-stgec.uplynk.com/ausw/slices/ed9/4f59ea65df184a2580ad8fc80d3eaa32/ed925a00daeb4ddb86352d4fc638745b/K00000002.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&oid=d8e6eec26bf544f084bad49a7fa2eac5&is_ad=1&si=9&d=2.048 +#UPLYNK-SEGMENT: 655874187b0b4d47a777921bccfabfae,00000000,ad +#UPLYNK-KEY:https://content-ause1-ur-fox1.uplynk.com/check?b=655874187b0b4d47a777921bccfabfae&v=8210462c10584206871ca3e8ad14689b&pbs=71af8c28b48c41c2a98e03ff73366a73 +#EXT-X-DISCONTINUITY +#EXT-X-PROGRAM-DATE-TIME:2022-01-31T21:47:33.485917+00:00 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=655874187b0b4d47a777921bccfabfae&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000000 +#EXTINF:2.0480, +https://x-live-fox-stgec.uplynk.com/ausw/slices/655/4f59ea65df184a2580ad8fc80d3eaa32/655874187b0b4d47a777921bccfabfae/K00000000.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&oid=d8e6eec26bf544f084bad49a7fa2eac5&is_ad=1&si=30&d=2.048 +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=655874187b0b4d47a777921bccfabfae&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000001 +#EXTINF:2.0480, +https://content-ause1-ur-fox1.uplynk.com/vodredir4/8210462c10584206871ca3e8ad14689b/K00000001.ts?seq=208&pbs=71af8c28b48c41c2a98e03ff73366a73&ptime=3340.5169166666333&atomic=1&ohash=aHR0cHM6Ly94LWxpdmUtZm94LXN0Z2VjLnVwbHluay5jb20vYXVzdy9zbGljZXMvNjU1LzRmNTllYTY1ZGYxODRhMjU4MGFkOGZjODBkM2VhYTMyLzY1NTg3NDE4N2IwYjRkNDdhNzc3OTIxYmNjZmFiZmFlL0swMDAwMDAwMS50cz9wYnM9NzFhZjhjMjhiNDhjNDFjMmE5OGUwM2ZmNzMzNjZhNzMmY2xvdWQ9YXdzJmNkbj1lY2kmb2lkPWQ4ZTZlZWMyNmJmNTQ0ZjA4NGJhZDQ5YTdmYTJlYWM1JmlzX2FkPTEmc2k9MzAmZD0yLjA0OA== +#EXT-X-KEY:METHOD=AES-128,URI="https://content-ause1-ur-fox1.uplynk.com/check2?b=655874187b0b4d47a777921bccfabfae&v=8210462c10584206871ca3e8ad14689b&r=k&pbs=71af8c28b48c41c2a98e03ff73366a73",IV=0x00000000000000000000000000000002 +#EXTINF:2.0480, +https://x-live-fox-stgec.uplynk.com/ausw/slices/655/4f59ea65df184a2580ad8fc80d3eaa32/655874187b0b4d47a777921bccfabfae/K00000002.ts?pbs=71af8c28b48c41c2a98e03ff73366a73&cloud=aws&cdn=eci&oid=d8e6eec26bf544f084bad49a7fa2eac5&is_ad=1&si=30&d=2.048 +#EXT-X-ENDLIST diff --git a/tests/scriptlets/test-files/manifestM3U8-04.m3u8 b/tests/scriptlets/test-files/manifestM3U8-04.m3u8 new file mode 100644 index 00000000..c2a179d1 --- /dev/null +++ b/tests/scriptlets/test-files/manifestM3U8-04.m3u8 @@ -0,0 +1,86 @@ +#EXTM3U +#EXT-X-VERSION:4 +#EXT-X-TARGETDURATION:6 +#EXT-X-MEDIA-SEQUENCE:1 +#EXT-X-PLAYLIST-TYPE:VOD +#EXTINF:5.005, +https://redirector.googlevideo.com/videoplayback?expire=1627044592&ei=cGn5YKzgCJKcvQTnzK2wDA&ip=0.0.0.0&id=e48854bcd59fe2c0&gomt=100%2C1251%2C2252%2C3753%2C4004&mime=video/MP2T&sgoap=gir%3Dyes%3Bitag%3D340%3Bxtags%3Dac%3Daac%3Aaccf%3Dhe%3Aach%3D2%3Aasr%3D44100%3Aatbr%3D64%3Bclen%3D41279%3Bdur%3D5108%3Blmt%3D1624938592152582&acao=yes&ctier=L&sgovp=gir%3Dyes%3Bitag%3D340%3Bxtags%3Dvc%3Davc%3Avccf%3Dbaseline%3Avfr%3D23.976%3Avsz%3D640x360%3Avtbr%3D360%3Bclen%3D227685%3Bdur%3D5004%3Blmt%3D1624938593291156&requiressl=yes&nc=4117&faskm=110&fvskm=120&gomv=google_9025485844886241178%2Cgoogle_7654352997829901647%2Cgoogle_2368405206167566284%2Cgoogle_4625091603204883009%2Cgoogle_8412805150323037172&source=dclk_video_ads&itag=340&susc=dvc&sparams=expire,ei,ip,id,gomt,mime,sgoap,acao,ctier,sgovp,requiressl,faskm,fvskm,gomv,source,itag,susc&sig=AOq0QJ8wRgIhAJFHMfwiFMR30ban5HmjigJb1y3Fb0w7rUUtCeZMnkvPAiEA83mFFFp4O5CqPmgZUKhCN63CZ9GpuA-N1m0Wf0dnGBQ=&fvidshow=120&fvidskip=0&govp=slices%3D0-227684&faudshow=108&faudskip=0&goap=slices%3D0-41278 +#EXT-X-DISCONTINUITY +#EXT-X-KEY:METHOD=AES-128,URI="https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/crypt.key?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5",IV=0x00000000000000000000000000000001 +#EXTINF:6, +https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/segment1_2_av.ts?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5 +#EXT-X-KEY:METHOD=AES-128,URI="https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/crypt.key?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5",IV=0x00000000000000000000000000000002 +#EXTINF:6, +https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/segment2_2_av.ts?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5 +#EXT-X-KEY:METHOD=AES-128,URI="https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/crypt.key?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5",IV=0x00000000000000000000000000000003 +#EXTINF:6, +https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/segment3_2_av.ts?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5 +#EXT-X-KEY:METHOD=AES-128,URI="https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/crypt.key?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5",IV=0x00000000000000000000000000000004 +#EXTINF:6, +https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/segment4_2_av.ts?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5 +#EXT-X-KEY:METHOD=AES-128,URI="https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/crypt.key?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5",IV=0x00000000000000000000000000000005 +#EXTINF:6, +https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/segment5_2_av.ts?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5 +#EXT-X-KEY:METHOD=AES-128,URI="https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/crypt.key?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5",IV=0x00000000000000000000000000000006 +#EXT-X-DISCONTINUITY +#EXT-X-KEY:METHOD=NONE +#EXTINF:5, +https://redirector.googlevideo.com/videoplayback?expire=1627044592&ei=cGn5YOnmCPuuz7sPpMqiOA&ip=0.0.0.0&acao=yes&id=d783a133ebbddee9&mime=video/MP2T&sgovp=gir%3Dyes%3Bitag%3D340%3Bxtags%3Dvc%3Davc%3Avccf%3Dbaseline%3Avsz%3D640x360%3Avtbr%3D360%3Bclen%3D226456%3Bdur%3D5000%3Blmt%3D1612380865999079&ctier=L&gomv=google_7607342559296965796%2Cgoogle_0357317657557444163%2Cgoogle_1658906946834310386%2Cgoogle_2939719750904310636%2Cgoogle_0647059238983965179&nc=4117&sgoap=gir%3Dyes%3Bitag%3D340%3Bxtags%3Dac%3Daac%3Aaccf%3Dhe%3Aach%3D2%3Aasr%3D44100%3Aatbr%3D64%3Bclen%3D41279%3Bdur%3D5108%3Blmt%3D1612380862548126&fvskm=125&gomt=100%2C1250%2C2250%2C3750%2C4000&requiressl=yes&source=dclk_video_ads&itag=340&faskm=110&susc=dvc&sparams=expire,ei,ip,acao,id,mime,sgovp,ctier,gomv,sgoap,fvskm,gomt,requiressl,source,itag,faskm,susc&sig=AOq0QJ8wRAIgbpTEf7hefz2Vr14c0JebPDbHC_nfigVqYhCxEPT0x8MCIAgAVI4c-c3ARNHFuQABvYoGwBwzfWPmp8bMoEetHNU7&fvidshow=125&fvidskip=0&govp=slices%3D0-226455&faudshow=108&faudskip=0&goap=slices%3D0-41278 +#EXT-X-DISCONTINUITY +#EXT-X-KEY:METHOD=NONE +#EXTINF:5.005, +https://redirector.googlevideo.com/videoplayback?expire=1627044592&ei=cGn5YMfkCMqUvQTt34CgBQ&ip=0.0.0.0&itag=340&mime=video/MP2T&sgoap=gir%3Dyes%3Bitag%3D340%3Bxtags%3Dac%3Daac%3Aaccf%3Dhe%3Aach%3D2%3Aasr%3D44100%3Aatbr%3D64%3Bclen%3D41279%3Bdur%3D5108%3Blmt%3D1624938592152582&faskm=110&requiressl=yes&acao=yes&ctier=L&nc=4117&gomt=100%2C1251%2C2252%2C3753%2C4004&gomv=google_2724697003963527070%2Cgoogle_0472423319226812731%2Cgoogle_1644682399451390434%2Cgoogle_0671638451040340076%2Cgoogle_0359036032583490932&id=e48854bcd59fe2c0&sgovp=gir%3Dyes%3Bitag%3D340%3Bxtags%3Dvc%3Davc%3Avccf%3Dbaseline%3Avfr%3D23.976%3Avsz%3D640x360%3Avtbr%3D360%3Bclen%3D227685%3Bdur%3D5004%3Blmt%3D1624938593291156&source=dclk_video_ads&fvskm=120&susc=dvc&sparams=expire,ei,ip,itag,mime,sgoap,faskm,requiressl,acao,ctier,gomt,gomv,id,sgovp,source,fvskm,susc&sig=AOq0QJ8wRgIhAOLQ9QfTVE7uq9P3f6hTBx3O_cf01ytex88r_VjlGAPTAiEApbeKnyK93diXzR2AoMnrAfY2OdHJmwQC_FCrXphXM18=&fvidshow=120&fvidskip=0&govp=slices%3D0-227684&faudshow=108&faudskip=0&goap=slices%3D0-41278 +#EXT-X-DISCONTINUITY +#EXT-X-KEY:METHOD=NONE +#EXTINF:5, +https://redirector.googlevideo.com/videoplayback?expire=1627044592&ei=cGn5YIbfCM2PwgPc_7_ADw&ip=0.0.0.0&ctier=L&faskm=216&sgovp=gir%3Dyes%3Bitag%3D340%3Bxtags%3Dvc%3Davc%3Avccf%3Dbaseline%3Avsz%3D640x360%3Avtbr%3D360%3Bclen%3D681361%3Bdur%3D15000%3Blmt%3D1612834330673209&requiressl=yes&acao=yes&mime=video/MP2T&id=df8fb04afa435b98&gomv=google_1291395706121252395%2Cgoogle_8177722951416848776%2Cgoogle_6766009958328162424%2Cgoogle_3949364821622924827%2Cgoogle_6404861968093575076&sgoap=gir%3Dyes%3Bitag%3D340%3Bxtags%3Dac%3Daac%3Aaccf%3Dhe%3Aach%3D2%3Aasr%3D44100%3Aatbr%3D64%3Bclen%3D120995%3Bdur%3D15139%3Blmt%3D1612834323701192&fvskm=125&gomt=100%2C3750%2C7250%2C11250%2C14000&source=dclk_video_ads&itag=340&nc=4117&susc=dvc&sparams=expire,ei,ip,ctier,faskm,sgovp,requiressl,acao,mime,id,gomv,sgoap,fvskm,gomt,source,itag,susc&sig=AOq0QJ8wRQIhAMYDysRYefvMU6EHe61PX1_WvWjlYu17VJbrEzSIW6RjAiBMGShXtCCYvehBYZeXPuXGuU2lBrpEdQ7r7f7kdOhrTA==&fvidshow=125&fvidskip=0&govp=slices%3D0-227320&faudshow=108&faudskip=0&goap=slices%3D0-80854 +#EXTINF:5, +https://redirector.googlevideo.com/videoplayback?expire=1627044592&ei=cGn5YIbfCM2PwgPc_7_ADw&ip=0.0.0.0&ctier=L&faskm=216&sgovp=gir%3Dyes%3Bitag%3D340%3Bxtags%3Dvc%3Davc%3Avccf%3Dbaseline%3Avsz%3D640x360%3Avtbr%3D360%3Bclen%3D681361%3Bdur%3D15000%3Blmt%3D1612834330673209&requiressl=yes&acao=yes&mime=video/MP2T&id=df8fb04afa435b98&gomv=google_1291395706121252395%2Cgoogle_8177722951416848776%2Cgoogle_6766009958328162424%2Cgoogle_3949364821622924827%2Cgoogle_6404861968093575076&sgoap=gir%3Dyes%3Bitag%3D340%3Bxtags%3Dac%3Daac%3Aaccf%3Dhe%3Aach%3D2%3Aasr%3D44100%3Aatbr%3D64%3Bclen%3D120995%3Bdur%3D15139%3Blmt%3D1612834323701192&fvskm=125&gomt=100%2C3750%2C7250%2C11250%2C14000&source=dclk_video_ads&itag=340&nc=4117&susc=dvc&sparams=expire,ei,ip,ctier,faskm,sgovp,requiressl,acao,mime,id,gomv,sgoap,fvskm,gomt,source,itag,susc&sig=AOq0QJ8wRQIhAMYDysRYefvMU6EHe61PX1_WvWjlYu17VJbrEzSIW6RjAiBMGShXtCCYvehBYZeXPuXGuU2lBrpEdQ7r7f7kdOhrTA==&fvidshow=125&fvidskip=0&govp=slices%3D0-676%2C227321-455709&faudshow=107&faudskip=108&goap=slices%3D0-80854 +#EXT-X-DISCONTINUITY +#EXT-X-KEY:METHOD=AES-128,URI="https://sbslive.akamaized.net/3005937839/12ed200b/7/03/716160_128K1000K512K1500K.mp4.csmil/crypt.key",IV=0x00000000000000000000000000000061 +#EXTINF:5.96, +https://sbslive.akamaized.net/3005937839/12ed200b/7/03/716160_128K1000K512K1500K.mp4.csmil/segment97_2_av-A.ts +#EXT-X-KEY:METHOD=AES-128,URI="https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/crypt.key?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5",IV=0x00000000000000000000000000000062 +#EXTINF:6, +https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/segment98_2_av.ts?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5 +#EXT-X-KEY:METHOD=AES-128,URI="https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/crypt.key?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5",IV=0x00000000000000000000000000000063 +#EXTINF:6, +https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/segment99_2_av.ts?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5 +#EXT-X-KEY:METHOD=AES-128,URI="https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/crypt.key?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5",IV=0x00000000000000000000000000000064 +#EXTINF:6, +https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/segment100_2_av.ts?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5 +#EXT-X-KEY:METHOD=AES-128,URI="https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/crypt.key?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5",IV=0x00000000000000000000000000000065 +#EXTINF:4, +https://sbslive.akamaized.net/3005937839/12ed200b/7/03/716160_128K1000K512K1500K.mp4.csmil/segment176_2_av-A.ts +#EXT-X-DISCONTINUITY +#EXT-X-KEY:METHOD=NONE +#EXTINF:5, +https://redirector.googlevideo.com/videoplayback?expire=1627044592&ei=cGn5YLPiCJWB4t4Py46R8AQ&ip=0.0.0.0&gomt=100%2C1250%2C2250%2C3750%2C4000&gomv=google_4338158000788702375%2Cgoogle_3575501791091325535%2Cgoogle_3467992974551238861%2Cgoogle_7562722796293180561%2Cgoogle_1357107761345074757&requiressl=yes&nc=4117&mime=video/MP2T&ctier=L&id=6445e998ca76176e&sgoap=gir%3Dyes%3Bitag%3D340%3Bxtags%3Dac%3Daac%3Aaccf%3Dhe%3Aach%3D2%3Aasr%3D44100%3Aatbr%3D64%3Bclen%3D41279%3Bdur%3D5108%3Blmt%3D1612380491056984&itag=340&sgovp=gir%3Dyes%3Bitag%3D340%3Bxtags%3Dvc%3Davc%3Avccf%3Dbaseline%3Avsz%3D640x360%3Avtbr%3D360%3Bclen%3D227081%3Bdur%3D5000%3Blmt%3D1612380495439189&fvskm=125&acao=yes&source=dclk_video_ads&faskm=110&susc=dvc&sparams=expire,ei,ip,gomt,gomv,requiressl,mime,ctier,id,sgoap,itag,sgovp,fvskm,acao,source,faskm,susc&sig=AOq0QJ8wRQIgN2hZiUVLoLyboLPEE9NPVP7WOk3b-5KT3bTjpAo46B4CIQDw9GL8OXp_xigaaLax-WXtNgS0wGo7A5T9Ycvk3TZXSw==&fvidshow=125&fvidskip=0&govp=slices%3D0-227080&faudshow=108&faudskip=0&goap=slices%3D0-41278 +#EXT-X-DISCONTINUITY +#EXT-X-KEY:METHOD=NONE +#EXTINF:5, +https://redirector.googlevideo.com/videoplayback?expire=1627044592&ei=cGn5YKjoCPqO3LUP2_mv4A4&ip=0.0.0.0&acao=yes&id=7020cf8660adf946&itag=340&faskm=110&sgovp=gir%3Dyes%3Bitag%3D340%3Bxtags%3Dvc%3Davc%3Avccf%3Dbaseline%3Avsz%3D640x360%3Avtbr%3D360%3Bclen%3D227383%3Bdur%3D5000%3Blmt%3D1613009344243831&nc=4117&gomv=google_6332522403465561124%2Cgoogle_3868557187947590149%2Cgoogle_8617134340363699367%2Cgoogle_2631638994669027705%2Cgoogle_2478266829967091124&sgoap=gir%3Dyes%3Bitag%3D340%3Bxtags%3Dac%3Daac%3Aaccf%3Dhe%3Aach%3D2%3Aasr%3D44100%3Aatbr%3D64%3Bclen%3D41279%3Bdur%3D5108%3Blmt%3D1613009341178815&ctier=L&source=dclk_video_ads&gomt=100%2C1250%2C2250%2C3750%2C4000&mime=video/MP2T&requiressl=yes&fvskm=125&susc=dvc&sparams=expire,ei,ip,acao,id,itag,faskm,sgovp,gomv,sgoap,ctier,source,gomt,mime,requiressl,fvskm,susc&sig=AOq0QJ8wRQIhAJCp_BRQ9-fadHGI-vRoEp4fh58mo_eLZjrv7MXWhiRfAiBQRZubRS8wuEVsCfga332yJXeEOJz-qDF1RXL0FZo5qw==&fvidshow=125&fvidskip=0&govp=slices%3D0-227382&faudshow=108&faudskip=0&goap=slices%3D0-41278 +#EXT-X-DISCONTINUITY +#EXT-X-KEY:METHOD=NONE +#EXTINF:5, +https://redirector.googlevideo.com/videoplayback?expire=1627044592&ei=cGn5YPfgCITu4-EPk425uAk&ip=0.0.0.0&fvskm=125&gomt=100%2C3750%2C7250%2C11250%2C14000&nc=4117&mime=video/MP2T&gomv=google_2565007354346513799%2Cgoogle_6921795559934154530%2Cgoogle_8461947363481243721%2Cgoogle_6459983979841706463%2Cgoogle_7249237122084982590&acao=yes&ctier=L&source=dclk_video_ads&id=df8fb04afa435b98&sgovp=gir%3Dyes%3Bitag%3D340%3Bxtags%3Dvc%3Davc%3Avccf%3Dbaseline%3Avsz%3D640x360%3Avtbr%3D360%3Bclen%3D681361%3Bdur%3D15000%3Blmt%3D1612834330673209&requiressl=yes&itag=340&sgoap=gir%3Dyes%3Bitag%3D340%3Bxtags%3Dac%3Daac%3Aaccf%3Dhe%3Aach%3D2%3Aasr%3D44100%3Aatbr%3D64%3Bclen%3D120995%3Bdur%3D15139%3Blmt%3D1612834323701192&faskm=216&susc=dvc&sparams=expire,ei,ip,fvskm,gomt,mime,gomv,acao,ctier,source,id,sgovp,requiressl,itag,sgoap,faskm,susc&sig=AOq0QJ8wRQIgflQT6StiU9tTLx_-qrtNQwbLsPRZrmmq2ZTOsc-v7rwCIQC_nXmzS77FBrZ7ZtL20oV-KnfeB3l9Vfz1s-dtMQYiEw==&fvidshow=125&fvidskip=0&govp=slices%3D0-227320&faudshow=108&faudskip=0&goap=slices%3D0-80854 +#EXTINF:5, +https://redirector.googlevideo.com/videoplayback?expire=1627044592&ei=cGn5YPfgCITu4-EPk425uAk&ip=0.0.0.0&fvskm=125&gomt=100%2C3750%2C7250%2C11250%2C14000&nc=4117&mime=video/MP2T&gomv=google_2565007354346513799%2Cgoogle_6921795559934154530%2Cgoogle_8461947363481243721%2Cgoogle_6459983979841706463%2Cgoogle_7249237122084982590&acao=yes&ctier=L&source=dclk_video_ads&id=df8fb04afa435b98&sgovp=gir%3Dyes%3Bitag%3D340%3Bxtags%3Dvc%3Davc%3Avccf%3Dbaseline%3Avsz%3D640x360%3Avtbr%3D360%3Bclen%3D681361%3Bdur%3D15000%3Blmt%3D1612834330673209&requiressl=yes&itag=340&sgoap=gir%3Dyes%3Bitag%3D340%3Bxtags%3Dac%3Daac%3Aaccf%3Dhe%3Aach%3D2%3Aasr%3D44100%3Aatbr%3D64%3Bclen%3D120995%3Bdur%3D15139%3Blmt%3D1612834323701192&faskm=216&susc=dvc&sparams=expire,ei,ip,fvskm,gomt,mime,gomv,acao,ctier,source,id,sgovp,requiressl,itag,sgoap,faskm,susc&sig=AOq0QJ8wRQIgflQT6StiU9tTLx_-qrtNQwbLsPRZrmmq2ZTOsc-v7rwCIQC_nXmzS77FBrZ7ZtL20oV-KnfeB3l9Vfz1s-dtMQYiEw==&fvidshow=125&fvidskip=0&govp=slices%3D0-676%2C227321-455709&faudshow=107&faudskip=108&goap=slices%3D0-80854 +#EXT-X-DISCONTINUITY +#EXT-X-KEY:METHOD=AES-128,URI="https://sbslive.akamaized.net/3005937839/12ed200b/7/03/716160_128K1000K512K1500K.mp4.csmil/crypt.key",IV=0x000000000000000000000000000000b0 +#EXTINF:2, +https://sbslive.akamaized.net/3005937839/12ed200b/7/03/716160_128K1000K512K1500K.mp4.csmil/segment176_2_av-B.ts +#EXT-X-KEY:METHOD=AES-128,URI="https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/crypt.key?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5",IV=0x000000000000000000000000000000b1 +#EXTINF:6, +https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/segment177_2_av.ts?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5 +#EXT-X-KEY:METHOD=AES-128,URI="https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/crypt.key?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5",IV=0x000000000000000000000000000000b2 +#EXTINF:6, +https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/segment178_2_av.ts?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5 +#EXT-X-KEY:METHOD=AES-128,URI="https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/crypt.key?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5",IV=0x000000000000000000000000000000b3 +#EXTINF:6, +https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/segment179_2_av.ts?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5 +#EXT-X-KEY:METHOD=AES-128,URI="https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/crypt.key?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5",IV=0x000000000000000000000000000000b4 +#EXTINF:6, +https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/segment180_2_av.ts?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5 +#EXT-X-KEY:METHOD=AES-128,URI="https://sbsvoddai-vh.akamaihd.net/i/svod/SBS/managed/2021/07/03/716160_,128K,1000K,512K,1500K,.mp4.csmil/crypt.key?id=AgBA6a25F8ohDTJU+WC7OBGPS4lP7JKIPP15RrwSjzHO1pG+wse2UMy1Fih8H7oIyvGmbPhcB78sNA%3D%3D&set-akamai-hls-revision=5",IV=0x000000000000000000000000000000b5 +#EXT-X-ENDLIST diff --git a/wiki/about-scriptlets.md b/wiki/about-scriptlets.md index e70f1391..68631ccf 100644 --- a/wiki/about-scriptlets.md +++ b/wiki/about-scriptlets.md @@ -18,6 +18,7 @@ * [log-eval](#log-eval) * [log-on-stack-trace](#log-on-stack-trace) * [log](#log) +* [m3u-prune](#m3u-prune) * [no-topics](#no-topics) * [noeval](#noeval) * [nowebrtc](#nowebrtc) @@ -608,6 +609,39 @@ example.org#%#//scriptlet('log', 'arg1', 'arg2') [Scriptlet source](../src/scriptlets/log.js) * * * +### ⚡️ m3u-prune + +Removes content from the specified M3U file. + + +**Syntax** +``` +example.org#%#//scriptlet('m3u-prune'[, propsToRemove[, urlToMatch[, optionalRegExp]]]) +``` + +- `propsToRemove` - required, selector of elements which will be removed from M3U file +- `urlToMatch` - optional, string or regular expression for matching the request's URL +- `optionalRegExp` - optional, string or regular expression for matching a content which will be removed from response + +**Examples** +1. Removes a tag which contains `tvessaiprod.nbcuni.com/video/`, from all requests + ``` + example.org#%#//scriptlet('m3u-prune', 'tvessaiprod.nbcuni.com/video/') + ``` + +2. Removes a tag which contains `tvessaiprod.nbcuni.com/video/`, only if request's URL contains `.m3u8` + ``` + example.org#%#//scriptlet('m3u-prune', 'tvessaiprod.nbcuni.com/video/', '.m3u8') + ``` + +2. Removes everything from response what is matched by RegExp, only if request's URL contains `.m3u8` + ``` + example.org#%#//scriptlet('m3u-prune', 'VMAP-AD', '.m3u8', '/#EXTINF:.*\\n.*tvessaiprod\\.nbcuni\\.com\\/video\\/[\\s\\S]*?#EXT-X-DISCONTINUITY|#EXT-X-VMAP-AD-BREAK[\\s\\S]*?#EXT-X-ENDLIST/') + ``` + +[Scriptlet source](../src/scriptlets/m3u-prune.js) +* * * + ### ⚡️ no-topics Prevents using The Topics API