{"id":9765505,"url":"https://github.com/futzu/SCTE-35_HLS_x9k3","last_synced_at":"2025-08-27T09:32:28.445Z","repository":{"id":37394053,"uuid":"473360140","full_name":"futzu/SCTE-35_HLS_x9k3","owner":"futzu","description":"HLS and SCTE-35   x9k3 is a HLS Segmenter with SCTE 35, and  Live Streaming from Non-Live Soures and Looping.","archived":false,"fork":false,"pushed_at":"2024-07-10T14:06:01.000Z","size":549,"stargazers_count":63,"open_issues_count":1,"forks_count":17,"subscribers_count":13,"default_branch":"main","last_synced_at":"2024-08-08T18:58:18.094Z","etag":null,"topics":["ad-insertion","boobs","h264","h265","hls","hls-scte35","m3u8","mpegts","python3","scte35","sexy","threefive","video"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/futzu.png","metadata":{"files":{"readme":"README.html","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-03-23T21:12:59.000Z","updated_at":"2024-08-08T15:55:18.000Z","dependencies_parsed_at":"2023-11-20T07:57:26.550Z","dependency_job_id":"a57d68e9-8f99-4d36-ac8f-b0bd5cbcecfa","html_url":"https://github.com/futzu/SCTE-35_HLS_x9k3","commit_stats":{"total_commits":380,"total_committers":1,"mean_commits":380.0,"dds":0.0,"last_synced_commit":"9b4a0d8933cab914908830302260e6493d64d3c6"},"previous_names":["futzu/scte-35_hls_x9k3","futzu/x9k3"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/futzu%2FSCTE-35_HLS_x9k3","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/futzu%2FSCTE-35_HLS_x9k3/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/futzu%2FSCTE-35_HLS_x9k3/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/futzu%2FSCTE-35_HLS_x9k3/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/futzu","download_url":"https://codeload.github.com/futzu/SCTE-35_HLS_x9k3/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":217590726,"owners_count":16201392,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ad-insertion","boobs","h264","h265","hls","hls-scte35","m3u8","mpegts","python3","scte35","sexy","threefive","video"],"created_at":"2024-05-16T22:21:27.695Z","updated_at":"2024-08-31T19:30:55.623Z","avatar_url":"https://github.com/futzu.png","language":"Python","funding_links":[],"categories":["HarmonyOS"],"sub_categories":["Windows Manager"],"readme":"\u003c!doctype html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\u003cmeta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\"\u003e\n\u003cstyle type=\"text/css\"\u003e\ntd, th { border: 1px solid #c3c3c3; padding: 0 3px 0 3px; }\ntable { border-collapse: collapse; }\nimg { max-width: 100%; }\n\u003c/style\u003e\n\u003cmeta name=\"generator\" content=\"ReText 8.0.1\"\u003e\n\u003ctitle\u003eREADME\u003c/title\u003e\n\u003cstyle type=\"text/css\"\u003e\n\u003c/style\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003cp\u003e\u003ca href=\"#install\"\u003eInstall\u003c/a\u003e |\n \u003ca href=\"#how-to-use\"\u003eUse\u003c/a\u003e |\n \u003ca href=\"#cue-out\"\u003eCUE-OUT\u003c/a\u003e |\n \u003ca href=\"#cue-in\"\u003eCUE-IN\u003c/a\u003e   |\n \u003ca href=\"#hls--tags\"\u003eSCTE-35 Tags\u003c/a\u003e |\n \u003ca href=\"#sidecar-files\"\u003eSidecar SCTE35\u003c/a\u003e |\n \u003ca href=\"#live\"\u003eLive\u003c/a\u003e  |\n \u003ca href=\"https://github.com/futzu/scte35-hls-segmenter-x9k3/issues\"\u003eBugs\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch3\u003eHLS + SCTE35 = x9k3\u003c/h3\u003e\n\u003ch3\u003e\u003ccode\u003ex9k3\u003c/code\u003e is a HLS segmenter with SCTE-35 injection and parsing, powered by threefive.\u003c/h3\u003e\n\u003chr\u003e\n\u003ch4\u003e\u003ccode\u003eHeads Up\u003c/code\u003e\u003c/h4\u003e\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003e Segment duration is open to interpretation... wait, let me explain.\u003c/b\u003e\u003c/summary\u003e\n\n\n\u003cdiv\u003e\n \u003cbr\u003e\n        threefive and ffmpeg may report different durations for segments.\u003cbr\u003e\nthreefive use absolute PTS values and always start on an iframe.\n \u003cbr\u003e\nIn the tables below, four segments are compared.\u003cbr\u003e \nReported start and reported duration are values returned from the tool.\u003cbr\u003e\nCalculate duration is (next segment start - this segment start)\n \u003cbr\u003e\u003cbr\u003e\n\n\u003c/div\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n* \u003cb\u003ethreefive\u003c/b\u003e (what x9k3 uses)\n\n| segment| reported start|  reported duration|calculated duration|\n|--------|---------------|-------------------|-------------------|\n| seg0.ts|  3164.376089  |     2.0           |     2.0           |\n| seg1.ts|  3166.376089  |     2.0           |     2.0           |\n| seg2.ts|  3168.376089  |     2.0           |     2.0           |\n| seg3.ts|  3170.376089  |     2.0           |     2.0           |\n\n\n* \u003cb\u003effmpeg\u003c/b\u003e\n\n| segment| reported start|  reported duration|calculated duration|\n|--------|---------------|-------------------|-------------------|\n| seg0.ts|   3164.376089 |   2.0             |    0.361333       |\n| seg1.ts|   3164.737422 |   3.64            |    2.047999       |\n| seg2.ts|   3166.785422 |   3.59            |    3.59           |\n| seg3.ts|   3170.376089 |   2.0             |    0.356000       |\n\n\n#### What does it all mean? \n\u003e I don't know.\n\u003e  \n___\n\n\n\u003c/details\u003e\n\n\u003ch4\u003e\u003ccode\u003eCurrent Version\u003c/code\u003e:\u003c/h4\u003e\n\u003ch1\u003ev.0.2.35\u003c/h1\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003etest\u003c/th\u003e\n\u003cth\u003ecommand\u003c/th\u003e\n\u003cth\u003escore\u003c/th\u003e\n\u003cth\u003eprevious\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003ecyclomatic complexity\u003c/td\u003e\n\u003ctd\u003eradon cc -s -a  x9k3.py\u003c/td\u003e\n\u003ctd\u003eA (2.769230)\u003c/td\u003e\n\u003ctd\u003eA (2.818181)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003epylint\u003c/td\u003e\n\u003ctd\u003epylint  x9k3.py\u003c/td\u003e\n\u003ctd\u003e9.97 / 10\u003c/td\u003e\n\u003ctd\u003e9.94 / 10\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eSome of the new stuff\u003c/strong\u003e:\u003c/li\u003e\n\u003cli\u003em3u8 files as input. Resegment and add SCTE-35 to an existing m3u8. \u003ccode\u003e-i INPUT\u003c/code\u003e, \u003ccode\u003e--input INPUT\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003esegments may be added to an existing m3u8, VOD or live. \u003ccode\u003e-c\u003c/code\u003e, \u003ccode\u003e--continue_m3u8\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ediscontinuity tags may now be omitted. \u003ccode\u003e-n\u003c/code\u003e, \u003ccode\u003e--no_discontinuity\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eauto \u003ccode\u003eCUE-IN\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e\u003ccode\u003eFeatures\u003c/code\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eSCTE-35 Cues\u003c/strong\u003e in \u003cstrong\u003eMpegts Streams\u003c/strong\u003e are Translated into \u003cstrong\u003eHLS tags\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSCTE-35 Cues can be added from a \u003ca href=\"#sidecar-files\"\u003eSidecar File\u003c/a\u003e\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003eSegments are \u003cstrong\u003eSplit on SCTE-35 Cues\u003c/strong\u003e as needed.\u003c/li\u003e\n\u003cli\u003eSegments \u003cstrong\u003eStart on iframes\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003eSupports \u003cstrong\u003eh264\u003c/strong\u003e and \u003cstrong\u003eh265\u003c/strong\u003e .\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMulti-protocol.\u003c/strong\u003e Input sources may be \u003cstrong\u003eFiles, Http(s), Multicast, and Unicast UDP streams\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003eSupports \u003ca href=\"https://github.com/futzu/scte35-hls-x9k3#live\"\u003e\u003cstrong\u003eLive\u003c/strong\u003e\u003c/a\u003e \u003cstrong\u003eStreaming\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/vivoh-inc/amt-play\"\u003e\u003cstrong\u003eamt-play\u003c/strong\u003e \u003c/a\u003euses x9k3.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2\u003e\u003ccode\u003eRequires\u003c/code\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003epython 3.6+ or pypy3\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/futzu/scte35-threefive\"\u003ethreefive\u003c/a\u003e  \u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/futzu/new_reader\"\u003enew_reader\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/futzu/iframes\"\u003eiframes\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e\u003ccode\u003eInstall\u003c/code\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUse pip to install the the x9k3 lib and  executable script x9k3 (\u003cem\u003ewill install threefive, new_reader and iframes too\u003c/em\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode class=\"language-lua\"\u003e# python3\n\npython3 -mpip install x9k3\n\n# pypy3 \n\npypy3 -mpip install x9k3\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2\u003e\u003ccode\u003eDetails\u003c/code\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eX-SCTE35\u003c/strong\u003e, \u003cstrong\u003eX-CUE\u003c/strong\u003e, \u003cstrong\u003eX-DATERANGE\u003c/strong\u003e, or \u003cstrong\u003eX-SPLICEPOINT\u003c/strong\u003e HLS tags can be generated. set with the \u003ccode\u003e--hls_tag\u003c/code\u003e switch.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ereading from stdin now available\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003eSegments are cut on iframes.\u003c/li\u003e\n\u003cli\u003eSegment time is 2 seconds or more, determined by GOP size. Can be set with the \u003ccode\u003e-t\u003c/code\u003e switch or by setting \u003ccode\u003eX9K3.args.time\u003c/code\u003e \u003c/li\u003e\n\u003cli\u003eSegments are named seg1.ts seg2.ts etc...\u003c/li\u003e\n\u003cli\u003eFor SCTE-35, Video segments are cut at the the first iframe \u0026gt;=  the splice point pts.\u003c/li\u003e\n\u003cli\u003eIf no pts time is present in the SCTE-35 cue, the segment is cut at the next iframe. \u003c/li\u003e\n\u003cli\u003eSCTE-35 cues with a preroll are inserted at the splice point.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e\u003ccode\u003eHow to Use\u003c/code\u003e\u003c/h2\u003e\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eAll x9k3 options\u003c/b\u003e\u003c/summary\u003e\n\n\n| switch| description|\n|-------|------------|\n  | `-h`, `--help` |          show this help message and exit |\n  |` -i INPUT`, `--input INPUT`| Input source, like /home/a/vid.ts or udp://@235.35.3.5:3535 or https://futzu.com/xaa.ts or https://example.com/not_a_master.m3u8 [default: stdin] |\n | `-c`, `--continue_m3u8` | Resume writing index.m3u8 [default:False]  |\n |` -d`, `--delete`   |   delete segments (enables --live) [default:False] |\n | `-l`, ` --live `      |   Flag for a live event (enables sliding window m3u8) [default:False] |\n | `-n`, `--no_discontinuity`  | Flag to disable adding #EXT-X-DISCONTINUITY tags at splice points [default:False] |\n | `-N`, `--no-throttle`|   disable live throttling [default:False]   |\n | `-o OUTPUT_DIR`, `--output_dir OUTPUT_DIR`  |  Directory for segments and index.m3u8(created if needed) [default:'.'] |\n | `-p`, `--program_date_time` | Flag to add Program Date Time tags to index.m3u8 (enables --live) [default:False]  |\n | `-r`, `--replay`   | Flag for replay aka looping (enables --live,--delete) [default:False]|\n | `-s SIDECAR_FILE`, `--sidecar_file SIDECAR_FILE`| Sidecar file of SCTE-35 (pts,cue) pairs. [default:None]  |\n | `-S`, `--shulga`|         Flag to enable Shulga iframe detection mode [default:False] |\n | `-t TIME`, `--time TIME`|  Segment time in seconds [default:2]   |\n | `-T HLS_TAG`, `--hls_tag HLS_TAG`| x_scte35, x_cue, x_daterange, or x_splicepoint [default:x_cue] |\n |`-w WINDOW_SIZE`, `--window_size WINDOW_SIZE`| sliding window size (enables --live) [default:5]    |\n | `-v`, `--version`|       Show version|\n\n\n\n\u003cpre\u003e\u003ccode class=\"language-smalltalk\"\u003ea@fu:~/x9k3-repo$ x9k3 -h\n\nusage: x9k3 [-h] [-i INPUT] [-c] [-d] [-l] [-n] [-o OUTPUT_DIR] [-p] [-r]\n            [-s SIDECAR_FILE] [-S] [-t TIME] [-T HLS_TAG] [-w WINDOW_SIZE]\n            [-v]\n\n\noptions:\n\n  -h, --help            show this help message and exit\n\n  -i INPUT, --input INPUT\n                        Input source, like /home/a/vid.ts or\n                        udp://@235.35.3.5:3535 or https://futzu.com/xaa.ts or\n                        https://example.com/not_a_master.m3u8 [default: stdin]\n\n  -c, --continue_m3u8   Resume writing index.m3u8 [default:False]\n\n  -d, --delete          delete segments (enables --live) [default:False]\n\n  -l, --live            Flag for a live event (enables sliding window m3u8)\n                        [default:False]\n\n  -n, --no_discontinuity\n                        Flag to disable adding #EXT-X-DISCONTINUITY tags at\n                        splice points [default:False]\n\n  -o OUTPUT_DIR, --output_dir OUTPUT_DIR\n                        Directory for segments and index.m3u8 (created if\n                        needed) [default:'.']\n\n  -p, --program_date_time\n                        Flag to add Program Date Time tags to index.m3u8 (\n                        enables --live) [default:False]\n\n  -r, --replay          Flag for replay aka looping (enables --live,--delete)\n                        [default:False]\n\n  -s SIDECAR_FILE, --sidecar_file SIDECAR_FILE\n                        Sidecar file of SCTE-35 (pts,cue) pairs.[default:None]\n\n  -S, --shulga          Flag to enable Shulga iframe detection mode\n                        [default:False]\n\n  -t TIME, --time TIME  Segment time in seconds [default:2]\n\n  -T HLS_TAG, --hls_tag HLS_TAG\n                        x_scte35, x_cue, x_daterange, or x_splicepoint\n                        [default:x_cue]\n\n  -w WINDOW_SIZE, --window_size WINDOW_SIZE\n                        sliding window size (enables --live) [default:5]\n\n  -v, --version         Show version\n\u003c/code\u003e\u003c/pre\u003e\n\n\n\n\n\n\n\n\n\n\u003c/details\u003e\n\n\u003ch3\u003eExample Usage\u003c/h3\u003e\n\u003cp\u003e#### \u003ccode\u003elocal file as input\u003c/code\u003e\n \u003ccode\u003esmalltalk\n    x9k3 -i video.mpegts\u003c/code\u003e\n #### \u003ccode\u003emulticast stream as input with a live sliding window\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003esmalltalk\n   x9k3 --live -i udp://@235.35.3.5:3535\u003c/code\u003e\n  #### Live mode works with a live source or static files.\n  *  x9k3 will throttle segment creation to mimic a live stream.\n   \u003ccode\u003ejs\n   x9k3 --live -i /some/video.ts\u003c/code\u003e\n #### \u003ccode\u003elive sliding window and deleting expired segments\u003c/code\u003e\n   \u003ccode\u003esmalltalk\n   x9k3  -i udp://@235.35.3.5:3535 --delete\u003c/code\u003e\u003c/p\u003e\n\u003ch4\u003e\u003ccode\u003ehttps stream for input, and writing segments to an output directory\u003c/code\u003e\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003edirectory will be created if it does not exist.\n \u003ccode\u003esmalltalk\n   x9k3 -i https://so.slo.me/longb.ts --output_dir /home/a/variant0\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4\u003e\u003ccode\u003ehttps hls m3u8 for input, and inserting SCTE-35 from a sidecar file, and continuing from a previously create index.m3u8 in the output dir\u003c/code\u003e\u003c/h4\u003e\n\u003cp\u003e\u003ccode\u003esmalltalk\n   x9k3 -i https://slow.golf/longb.m3u8 --output_dir /home/a/variant0 -continue_m3u8 -s sidecar.txt\u003c/code\u003e  \u003c/p\u003e\n\u003ch4\u003e\u003ccode\u003eusing stdin as input\u003c/code\u003e\u003c/h4\u003e\n\u003cp\u003e\u003ccode\u003esmalltalk\n   cat video.ts | x9k3\u003c/code\u003e\u003c/p\u003e\n\u003ch4\u003e\u003ccode\u003elive m3u8 file as input, add SCTE-35 from a sidecar file, change segment duration to 3 and output as live stream\u003c/code\u003e\u003c/h4\u003e\n\u003cpre\u003e\u003ccode class=\"language-smalltalk\"\u003ex9k3 -i https://example.com/rendition.m3u8 -s sidecar.txt -t 3 -l\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch1\u003e\u003ccode\u003eCli tool\u003c/code\u003e\u003c/h1\u003e\n\u003ch4\u003eNew Option, \u003ccode\u003e-c\u003c/code\u003e or  \u003ccode\u003e--continue_m3u8\u003c/code\u003e Continue an existing index.m3u8. \u003cem\u003e(Only works with x9k3 generated m3u8 files)\u003c/em\u003e\u003c/h4\u003e\n\u003cpre\u003e\u003ccode class=\"language-smalltalk\"\u003ea@fu:~/x9k3-repo$ x9k3 -h\n\nusage: x9k3 [-h] [-i INPUT] [-c] [-d] [-l] [-n] [-o OUTPUT_DIR] [-p] [-r]\n            [-s SIDECAR_FILE] [-S] [-t TIME] [-T HLS_TAG] [-w WINDOW_SIZE]\n            [-v]\n\n\noptions:\n\n  -h, --help            show this help message and exit\n\n  -i INPUT, --input INPUT\n                        Input source, like /home/a/vid.ts or\n                        udp://@235.35.3.5:3535 or https://futzu.com/xaa.ts or\n                        https://example.com/not_a_master.m3u8 [default: stdin]\n\n  -c, --continue_m3u8   Resume writing index.m3u8 [default:False]\n\n  -d, --delete          delete segments (enables --live) [default:False]\n\n  -l, --live            Flag for a live event (enables sliding window m3u8)\n                        [default:False]\n\n  -n, --no_discontinuity\n                        Flag to disable adding #EXT-X-DISCONTINUITY tags at\n                        splice points [default:False]\n\n  -o OUTPUT_DIR, --output_dir OUTPUT_DIR\n                        Directory for segments and index.m3u8 (created if\n                        needed) [default:'.']\n\n  -p, --program_date_time\n                        Flag to add Program Date Time tags to index.m3u8 (\n                        enables --live) [default:False]\n\n  -r, --replay          Flag for replay aka looping (enables --live,--delete)\n                        [default:False]\n\n  -s SIDECAR_FILE, --sidecar_file SIDECAR_FILE\n                        Sidecar file of SCTE-35 (pts,cue) pairs.[default:None]\n\n  -S, --shulga          Flag to enable Shulga iframe detection mode\n                        [default:False]\n\n  -t TIME, --time TIME  Segment time in seconds [default:2]\n\n  -T HLS_TAG, --hls_tag HLS_TAG\n                        x_scte35, x_cue, x_daterange, or x_splicepoint\n                        [default:x_cue]\n\n  -w WINDOW_SIZE, --window_size WINDOW_SIZE\n                        sliding window size (enables --live) [default:5]\n\n  -v, --version         Show version\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch4\u003eProgrammatically (writing code with x9k3)\u003c/h4\u003e\n\u003cpre\u003e\u003ccode class=\"language-js\"\u003ex9 = X9K3(\u0026quot;https://iodisco.com/fu.ts\u0026quot;)\nx9.decode()\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSetting  parameters\n* create an instance.\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-js\"\u003ex9 = X9K3()\n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003einput source\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode class=\"language-js\"\u003ex9.args.input = \u0026quot;https://futzu.com/xaa.ts\u0026quot;   \n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003ehls_tag can be x_scte35, x_cue, x_daterange, or x_splicepoint\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode class=\"language-js\"\u003ex9.args.hls tag = x_cue \n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003eoutput directory default is \".\"\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode class=\"language-js\"\u003ex9.args.output_dir=\u0026quot;/home/a/stuff\u0026quot;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003elive\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode class=\"language-js\"\u003ex9.args.live = True\n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003ereplay (loop video) ( also sets live )\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode class=\"language-js\"\u003ex9.args.replay = True\n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003edelete segments when they expire ( also sets live )\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode class=\"language-js\"\u003ex9.args.delete = True\n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003eadd program date time tags ( also sets live )\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode class=\"language-js\"\u003eself.args.program_date_time= True\n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003eset window size for live mode ( requires live ) \u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode class=\"language-js\"\u003ex9.args.window_size = 5 \n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003erun \u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode class=\"language-js\"\u003ex9.run()\n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003eyou can get a complete set of args and the defaults like this\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode class=\"language-js\"\u003efrom x9k3 import X9K3\nx9 = X9K3()\nprint(x9.args)\n\nNamespace(input=\u0026lt;_io.BufferedReader name='\u0026lt;stdin\u0026gt;'\u0026gt;, continue_m3u8=False, delete=False, live=False, no_discontinuity=False, output_dir='.', program_date_time=False, replay=False, sidecar_file=None, shulga=False, time=2, hls_tag='x_cue', window_size=5, version=False)\n\n\n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003eargue can also be called to get the defaults\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode class=\"language-js\"\u003e\u0026gt;\u0026gt;\u0026gt;\u0026gt; from x9k3 import X9K3, argue\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; args = argue()\n\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; args\nNamespace(input=\u0026lt;_io.BufferedReader name='\u0026lt;stdin\u0026gt;'\u0026gt;, continue_m3u8=False, delete=False, live=False, no_discontinuity=False, output_dir='.', program_date_time=False, replay=False, sidecar_file=None, shulga=False, time=2, hls_tag='x_cue', window_size=5, version=False)\n\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; args.replay =True\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; args.live = True\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; args.time = 6\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; args.window_size = 10\n\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; args\nNamespace(input=\u0026lt;_io.BufferedReader name='\u0026lt;stdin\u0026gt;'\u0026gt;, continue_m3u8=False, delete=False, live=True, no_discontinuity=False, output_dir='.', program_date_time=False, replay=True, sidecar_file=None, shulga=False, time=6, hls_tag='x_cue', window_size=10, version=False)\n\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; x9 = X9K3()\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; x9.args = args\n\n\u0026gt;\u0026gt;\u0026gt;\u0026gt; x9.args\nNamespace(input=\u0026lt;_io.BufferedReader name='\u0026lt;stdin\u0026gt;'\u0026gt;, continue_m3u8=False, delete=False, live=True, no_discontinuity=False, output_dir='.', program_date_time=False, replay=True, sidecar_file=None, shulga=False, time=6, hls_tag='x_cue', window_size=10, version=False)\n\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3\u003e\u003ccode\u003eSidecar Files\u003c/code\u003e\u003c/h3\u003e\n\u003ch4\u003eload scte35 cues from a Sidecar file\u003c/h4\u003e\n\u003cp\u003eSidecar Cues will be handled the same as SCTE35 cues from a video stream. \u003cbr\u003e\nline format for text file  \u003ccode\u003einsert_pts, cue\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003epts is the insert time for the cue, A four second preroll is standard. \ncue can be base64,hex, int, or bytes\u003c/p\u003e\n\u003cp\u003e```smalltalk\n  a@debian:~/x9k3$ cat sidecar.txt\u003c/p\u003e\n\u003cp\u003e38103.868589, /DAxAAAAAAAAAP/wFAUAAABdf+/+zHRtOn4Ae6DOAAAAAAAMAQpDVUVJsZ8xMjEqLYemJQ== \n  38199.918911, /DAsAAAAAAAAAP/wDwUAAABef0/+zPACTQAAAAAADAEKQ1VFSbGfMTIxIxGolm0= \u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e  ```smalltalk\n  x9k3 -i  noscte35.ts  -s sidecar.txt \n  ```\n####   In Live Mode you can do dynamic cue injection with a `Sidecar file`\n   ```js\n   touch sidecar.txt\n\n   x9k3 -i vid.ts -s sidecar.txt -l \n\n   # Open another terminal and printf cues into sidecar.txt\n\n   printf '38103.868589, /DAxAAAAAAAAAP/wFAUAAABdf+/+zHRtOn4Ae6DOAAAAAAAMAQpDVUVJsZ8xMjEqLYemJQ==\\n' \u0026gt; sidecar.txt\n\n   ```\n#### `Sidecar files` can now accept 0 as the PTS insert time for Splice Immediate. \n\n\n\n Specify 0 as the insert time,  the cue will be insert at the start of the next segment.\n __Using 0 only works in live mode__\n\n ```js\n printf '0,/DAhAAAAAAAAAP/wEAUAAAAJf78A/gASZvAACQAAAACokv3z\\n' \u0026gt; sidecar.txt\n\n ```\n\n ####  A CUE-OUT can be terminated early using a `sidecar file`.\n\n\n In the middle of a CUE-OUT send a splice insert with the out_of_network_indicator flag not set and the splice immediate flag set.\n Do the steps above ,\n and then do this\n ```js\n printf '0,/DAcAAAAAAAAAP/wCwUAAAABfx8AAAEAAAAA3r8DiQ==\\n' \u0026gt; sidecar.txt\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eIt will cause the CUE-OUT to end at the next segment start.\n ```js\u003c/p\u003e\n\u003ch1\u003eEXT-X-CUE-OUT 13.4\u003c/h1\u003e\n\u003cp\u003e./seg5.ts:  start:112.966667    end:114.966667  duration:2.233334\u003c/p\u003e\n\u003ch1\u003eEXT-X-CUE-OUT-CONT 2.233334/13.4\u003c/h1\u003e\n\u003cp\u003e./seg6.ts:  start:114.966667    end:116.966667  duration:2.1\u003c/p\u003e\n\u003ch1\u003eEXT-X-CUE-OUT-CONT 4.333334/13.4\u003c/h1\u003e\n\u003cp\u003e./seg7.ts:  start:116.966667    end:118.966667  duration:2.0\u003c/p\u003e\n\u003ch1\u003eEXT-X-CUE-OUT-CONT 6.333334/13.4\u003c/h1\u003e\n\u003cp\u003e./seg8.ts:  start:117.0         end:119.0   duration:0.033333\u003c/p\u003e\n\u003ch1\u003eEXT-X-CUE-IN None\u003c/h1\u003e\n\u003cp\u003e./seg9.ts:  start:119.3         end:121.3   duration:2.3\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e __Using 0 only works in live mode__\n\n   ---\n## CUES   \n\n##   `CUE-OUT`\n#### A CUE-OUT is defined as:\n\n* `A Splice Insert Command` with:\n   *  the `out_of_network_indicator` set to `True` \n   *  a `break_duration`.\n\n* `A Time Signal Command` and a Segmentation Descriptor with:\n   *  a `segmentation_duration` \n   *  a `segmentation_type_id` of:\n      * 0x22: \u0026quot;Break Start\u0026quot;,\n      * 0x30: \u0026quot;Provider Advertisement Start\u0026quot;,\n      * 0x32: \u0026quot;Distributor Advertisement Start\u0026quot;,\n      * 0x34: \u0026quot;Provider Placement Opportunity Start\u0026quot;,\n      * 0x36: \u0026quot;Distributor Placement Opportunity Start\u0026quot;,\n      * 0x44: \u0026quot;Provider Ad Block Start\u0026quot;,\n      * 0x46: \u0026quot;Distributor Ad Block Start\u0026quot;,\n\n\n## `CUE-IN`\n#### A CUE-IN is defined as:\n* `A Splice Insert Command`\n  *  with the `out_of_network_indicator` set to `False`\n\n* `A Time Signal Command` and a Segmentation Descriptor with:\n   *  a `segmentation_type_id` of:\n\n      * 0x23: \u0026quot;Break End\u0026quot;,\n      * 0x31: \u0026quot;Provider Advertisement End\u0026quot;,\n      * 0x33: \u0026quot;Distributor Advertisement End\u0026quot;,\n      * 0x35: \u0026quot;Provider Placement Opportunity End\u0026quot;,\n      * 0x37: \u0026quot;Distributor Placement Opportunity End\u0026quot;,\n      * 0x45: \u0026quot;Provider Ad Block End\u0026quot;,\n      * 0x47: \u0026quot;Distributor Ad Block End\u0026quot;,\n\n* For CUE-OUT and CUE-IN, `only the first Segmentation Descriptor will be used`\n---\n\n## `Supported HLS  Tags`\n* #EXT-X-CUE \n* #EXT-X-DATERANGE \n* #EXT-X-SCTE35 \n* #EXT-X-SPLICEPOINT \n\n###  `x_cue`\n* CUE-OUT\n```lua\n#EXT-X-DISCONTINUITY\n#EXT-X-CUE-OUT:242.0\n#EXTINF:4.796145,\nseg32.ts\n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003eCUE-OUT-CONT\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode class=\"language-lua\"\u003e#EXT-X-CUE-OUT-CONT:4.796145/242.0\n#EXTINF:2.12,\n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003eCUE-IN\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode class=\"language-lua\"\u003e#EXT-X-DISCONTINUITY\n#EXT-X-CUE-IN\n#EXTINF:5.020145,\nseg145.ts\n\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3\u003e\u003ccode\u003ex_scte35\u003c/code\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eCUE-OUT\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode class=\"language-lua\"\u003e#EXT-X-DISCONTINUITY\n#EXT-X-SCTE35:CUE=\u0026quot;/DAvAAAAAAAAAP/wFAUAAAKWf+//4WoauH4BTFYgAAEAAAAKAAhDVUVJAAAAAOv1oqc=\u0026quot; ,CUE-OUT=YES \n#EXTINF:4.796145,\nseg32.ts\n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003eCUE-OUT-CONT\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode class=\"language-lua\"\u003e#EXT-X-SCTE35:CUE=\u0026quot;/DAvAAAAAAAAAP/wFAUAAAKWf+//4WoauH4BTFYgAAEAAAAKAAhDVUVJAAAAAOv1oqc=\u0026quot; ,CUE-OUT=CONT\n#EXTINF:2.12,\nseg33.ts\n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003eCUE-IN\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode class=\"language-lua\"\u003e#EXT-X-DISCONTINUITY\n#EXT-X-SCTE35:CUE=\u0026quot;/DAqAAAAAAAAAP/wDwUAAAKWf0//4rZw2AABAAAACgAIQ1VFSQAAAAAtegE5\u0026quot; ,CUE-IN=YES \n#EXTINF:5.020145,\nseg145.ts\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3\u003e\u003ccode\u003ex_daterange\u003c/code\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eCUE-OUT\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode class=\"language-lua\"\u003e#EXT-X-DISCONTINUITY\n#EXT-X-DATERANGE:ID=\u0026quot;1\u0026quot;,START-DATE=\u0026quot;2022-10-14T17:36:58.321731Z\u0026quot;,PLANNED-DURATION=242.0,SCTE35-OUT=0xfc302f00000000000000fff01405000002967fefffe16a1ab87e014c562000010000000a00084355454900000000ebf5a2a7\n#EXTINF:4.796145,\nseg32.ts\n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003eCUE-IN\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode class=\"language-lua\"\u003e#EXT-X-DISCONTINUITY\n#EXT-X-DATERANGE:ID=\u0026quot;2\u0026quot;,END-DATE=\u0026quot;2022-10-14T17:36:58.666073Z\u0026quot;,SCTE35-IN=0xfc302a00000000000000fff00f05000002967f4fffe2b670d800010000000a000\n843554549000000002d7a0139\n#EXTINF:5.020145,\nseg145.ts\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3\u003e\u003ccode\u003ex_splicepoint\u003c/code\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eCUE-OUT\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode class=\"language-lua\"\u003e#EXT-X-DISCONTINUITY\n#EXT-X-SPLICEPOINT-SCTE35:/DAvAAAAAAAAAP/wFAUAAAKWf+//4WoauH4BTFYgAAEAAAAKAAhDVUVJAAAAAOv1oqc=\n#EXTINF:4.796145,\nseg32.ts\n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003eCUE-IN\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre\u003e\u003ccode class=\"language-lua\"\u003e#EXT-X-DISCONTINUITY\n#EXT-X-SPLICEPOINT-SCTE35:/DAqAAAAAAAAAP/wDwUAAAKWf0//4rZw2AABAAAACgAIQ1VFSQAAAAAtegE5\n#EXTINF:5.020145,\nseg145.ts\n\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2\u003e\u003ccode\u003eVOD\u003c/code\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ex9k3 defaults to VOD style playlist generation.\u003c/li\u003e\n\u003cli\u003eAll segment are listed in the m3u8 file. \u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e\u003ccode\u003eLive\u003c/code\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eActivated by the \u003ccode\u003e--live\u003c/code\u003e, \u003ccode\u003e--delete\u003c/code\u003e, or \u003ccode\u003e--replay\u003c/code\u003e switch or by setting \u003ccode\u003eX9K3.live=True\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e\u003ccode\u003e--live\u003c/code\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLike VOD except:\u003cul\u003e\n\u003cli\u003eM3u8 manifests are regenerated every time a segment is written\u003c/li\u003e\n\u003cli\u003eSegment creation is throttled when using non-live sources to simulate live streaming. ( like ffmpeg's \"-re\" )\u003c/li\u003e\n\u003cli\u003edefault Sliding Window size is 5, it can be changed with the \u003ccode\u003e-w\u003c/code\u003e switch or by setting \u003ccode\u003eX9k3.window.size\u003c/code\u003e \u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e\u003ccode\u003e--delete\u003c/code\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eimplies \u003ccode\u003e--live\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003edeletes segments when they move out of the sliding window of the m3u8.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e\u003ccode\u003e--replay\u003c/code\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eimplies \u003ccode\u003e--live\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eimplies \u003ccode\u003e--delete\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eloops a video file and throttles segment creation to fake a live stream.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cimg alt=\"image\" src=\"https://github.com/futzu/x9k3/assets/52701496/65d915f9-8721-4386-9353-2e32911c6a64\"\u003e\u003c/p\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffutzu%2FSCTE-35_HLS_x9k3","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffutzu%2FSCTE-35_HLS_x9k3","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffutzu%2FSCTE-35_HLS_x9k3/lists"}