{"id":18630788,"url":"https://github.com/futzu/threefive","last_synced_at":"2025-05-12T14:38:30.247Z","repository":{"id":38206740,"uuid":"220651237","full_name":"futzu/threefive","owner":"futzu","description":"threefive is SCTE-35. threefive Parses SCTE-35 in every available format. MPEGTS, HLS, DASH. Yes. ","archived":false,"fork":false,"pushed_at":"2024-11-27T07:47:57.000Z","size":7156,"stargazers_count":145,"open_issues_count":4,"forks_count":28,"subscribers_count":14,"default_branch":"master","last_synced_at":"2025-05-12T14:38:17.951Z","etag":null,"topics":["ad-insertion","ad-splicing","adbreak","adrian","adrianofdoom","best","best-scte-35","best-scte35-parser","mpegts","python3","scte","scte-214","scte-35","scte-67","scte35","scte35-2022","scte35-decoder","scte35-encoder","scte35-parser","threefive"],"latest_commit_sha":null,"homepage":"https://git.futzu.com","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/futzu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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,"zenodo":null}},"created_at":"2019-11-09T14:07:36.000Z","updated_at":"2025-04-10T04:51:47.000Z","dependencies_parsed_at":"2023-10-04T03:07:20.211Z","dependency_job_id":"e5e2fcc2-533a-4951-b09a-6d9b45ed8e19","html_url":"https://github.com/futzu/threefive","commit_stats":null,"previous_names":["futzu/threefive","futzu/scte35-parser-threefive","futzu/scte35parser","futzu/scte35-threefive","futzu/scte35parser-threefive","futzu/scte-35_threefive","futzu/scte-35","futzu/scte35_threefive"],"tags_count":57,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/futzu%2Fthreefive","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/futzu%2Fthreefive/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/futzu%2Fthreefive/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/futzu%2Fthreefive/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/futzu","download_url":"https://codeload.github.com/futzu/threefive/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253755891,"owners_count":21959107,"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","ad-splicing","adbreak","adrian","adrianofdoom","best","best-scte-35","best-scte35-parser","mpegts","python3","scte","scte-214","scte-35","scte-67","scte35","scte35-2022","scte35-decoder","scte35-encoder","scte35-parser","threefive"],"created_at":"2024-11-07T05:02:06.633Z","updated_at":"2025-05-12T14:38:30.181Z","avatar_url":"https://github.com/futzu.png","language":"Python","funding_links":[],"categories":["HarmonyOS","Media Tools"],"sub_categories":["Windows Manager","Independent \u0026 Hobbyist Projects"],"readme":" | [cli](#cli) | [lib](#lib) | [examples](#examples) | [hls](https://github.com/futzu/threefive/blob/master/hlsparse.md) | [encoding](#encoding) | [sixfix](https://github.com/futzu/SCTE35_threefive/blob/master/cli.md#sixfix) | [sidecar files](https://github.com/futzu/SCTE35_threefive/blob/master/sidecar.md) | [xml](https://github.com/futzu/SCTE35_threefive/blob/master/xml.md) | [iodisco.com/scte35 ](https://iodisco.com/cgi-bin/scte35parser) | \n\n# threefive is SCTE-35.\n##### SCTE-35 Parser. SCTE-35 Decoder. SCTE-35 Encoder. MPEGTS SCTE-35 Packet Injection. HLS Manifest and Segment SCTE-35 Parser. HLS SCTE-35 Injection. SCTE-35 Xml and Xml+bin Decoder/ Encoder for DASH.\n\n## Latest version is v2.4.97\n* Updated to latest version of new_reader for Zero packet loss Multicast _(tested on OpenBSD and Debian)_.   \n* [The cli has been Upgraded and tuned.]((https://github.com/futzu/threefive/blob/master/latest-cli.md))\n* Xml Node Namespaces and attribute namespaces are now configurable.\n* Turned SegmentationDescriptor.segmentation_message back on.\n* Fix UMID upid encoding \n* Added a  [__Super Amazing__ HLS SCTE-35 Parser](https://github.com/futzu/threefive/blob/master/hlsparse.md)  to the __threefive cli.__. \n* Added a HLS SCTE-35 Encoder to the __threefive cli.__.\n* MPEGTS Packet Injection added to the __threefive cli.__.\n    * [Sidecar files explained](https://github.com/futzu/SCTE35_threefive/blob/master/sidecar.md)\n* [sixfix](https://github.com/futzu/SCTE35_threefive/blob/master/newcli.md) : __ffmpeg__ turns SCTE-35 streams to __bin data (0x06)__, sixfix switches them back to SCTE-35 (0x86).\n* [Xml](https://github.com/futzu/SCTE35-threefive/blob/master/latest-cli.md): Experimental support for [SCTE-35 xml as an input and output](https://github.com/futzu/SCTE35_threefive/blob/master/xml.md) ( DASH SCTE-214)\n\n\n# Documentation\n#### \n* _threefive is developed and tested on OpenBSD and Debian Sid._ \n    \n#### Latest docs are always available in the python shell\n```py3\n\n\u003e\u003e\u003e\u003e from threefive import TimeSignal\n\u003e\u003e\u003e\u003e help(TimeSignal)\n```\n\n### install\n* python3\n```py3\npython3 -mpip install threefive\n```\n* pypy3\n```py3\npypy3 -mpip install threefive\n```\n\n  \n* [super cool examples](https://github.com/futzu/SCTE35-threefive/blob/master/examples/README.md)\n\n* New! [threefive: more OO than you know](https://github.com/futzu/threefive/blob/master/oo.md)\n   \n* [answers to some common problems with ffmpeg and SCTE-35](https://github.com/futzu/SCTE35-threefive/blob/master/ffmpegscte35.md)\n\n\u003cdetails\u003e\u003csummary\u003eVersions and Releases\u003c/summary\u003e\n\nEvery time I fix a bug or add a feature, I do a new release. \u003cbr\u003e\nThis makes tracking down bugs and stuff much easier. \u003cbr\u003e\nKeep up, I do releases for reasons.\n```lua\na@slow:~/threefive$ threefive version\n2.4.81\na@slow:~/threefive$ \n\n```\n\n* __Release__ versions are  __odd__.\n* __Unstable__ testing versions are __even__.\n---\n![image](https://github.com/user-attachments/assets/caac5f33-204e-47c7-bcdb-1e2d05fdaefb)\n\n\u003c/details\u003e\n\n## cli\n\n* [The New Cli](https://github.com/futzu/threefive/blob/master/latest-cli.md)\n\n*  [Decode SCTE-35 HLS](https://github.com/futzu/threefive/blob/master/newcli.md#hls-decode-scte-35)\n*  [Encode SCTE-35 HLS](https://github.com/futzu/threefive/blob/master/newcli.md#hls-encode-scte-35)\n*  [MPEGTS](https://github.com/futzu/threefive/blob/master/newcli.md#mpegts) (proy,pts,sidecar,sixfix,show,xml)\n\n## lib\n* New! [threefive: more OO than you know](https://github.com/futzu/threefive/blob/master/oo.md)\n* [Parse SCTE-35 programmatically](https://github.com/futzu/scte35parser-threefive/blob/master/prog.md) with __threefive__ \u003c/i\u003e(write some code)\u003c/i\u003e\n* [How to Use __threefive.Cue__](https://github.com/futzu/SCTE35_threefive/blob/master/basic.md)\n* [Trigger on SCTE-35 __Events__](https://github.com/futzu/scte35parser-threefive/blob/master/trigger.md) using __threefive.Stream__\n\n## online parser\n* [iodisco.com/scte35 ](https://iodisco.com/cgi-bin/scte35parser) the only accurate online SCTE-35 parser (__powered by threefive__).\n\n## examples\n* SCTE-35 code [Examples](https://github.com/futzu/SCTE35-threefive/blob/master/examples/README.md)\n  \n## decryption\n* Automatic __AES decryption__ with [threefive.Segment](https://github.com/futzu/SCTE35_threefive/blob/master/segment.md)\n\n## webvtt\n* Display SCTE-35 Data as [__WebVTT__ subtitles in Video](https://github.com/futzu/SCTE35_threefive/blob/master/examples/stream/cue2vtt.py)\n      \n## dash\n* [A minimal Dash SCTE-35 mpd parser](https://github.com/futzu/SCTE35-threefive/blob/master/mpd_parser.md)\n* [Experimental Dash SCTE-214 Support Now available in threefive 2.4.81 ](https://github.com/futzu/SCTE35-threefive/blob/master/dash.md) (_updated 10/15/2024_)\n\n## encoding\n*  [Encoding](https://github.com/futzu/scte35parser-threefive/blob/master/Encoding.md)\n*  [Encoding | more_](https://github.com/futzu/scte35parser-threefive/blob/master/EncodingPipeMore.md)\n*  [JSON to SCTE-35 Encoding](https://github.com/futzu/SCTE35_threefive/blob/master/cliencde.md)\n\n\n\u003c/details\u003e\n \n \u003cdetails\u003e\u003csummary\u003eCue Class\u003c/summary\u003e\n\n   *  src [cue.py](https://github.com/futzu/SCTE35-threefive/blob/master/threefive/cue.py)\n   *  The __threefive.Cue__ class decodes a SCTE35 binary, base64, or hex encoded string.\n\n ![image](https://github.com/futzu/scte35-threefive/assets/52701496/5b8dbea3-1d39-48c4-8fbe-de03a53cc1dd)\n\n\n```py3\n\nclass Cue(threefive.base.SCTE35Base)\n |  Cue(data=None, packet_data=None)\n\n```\n```js\n |  __init__(self, data=None, packet_data=None)\n |      data may be packet bites or encoded string\n |      packet_data is a instance passed from a Stream instance\n```\n* `Cue.decode()`\n```js\n |  decode(self)\n |      Cue.decode() parses for SCTE35 data\n```\n* After Calling cue.decode() the __instance variables can be accessed via dot notation__.\n```python3\n\n    \u003e\u003e\u003e\u003e cue.command\n    {'calculated_length': 5, 'name': 'Time Signal', 'time_specified_flag': True, 'pts_time': 21695.740089}\n\n    \u003e\u003e\u003e\u003e cue.command.pts_time\n    21695.740089\n\n    \u003e\u003e\u003e\u003e cue.info_section.table_id\n\n    '0xfc'\n```\n\n* `Cue.get()`\n```js\n |  get(self)\n |      Cue.get returns the SCTE-35 Cue\n |      data as a dict of dicts.\n```\n\u003e `Cue.get() Example`\n```python3\n\u003e\u003e\u003e from threefive import Cue\n\u003e\u003e\u003e cue = Cue('0XFC301100000000000000FFFFFF0000004F253396')\n\u003e\u003e\u003e cue.decode()\nTrue\n\u003e\u003e\u003e cue\n{'bites': b'\\xfc0\\x11\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\x00\\x00\\x00O%3\\x96',\n'info_section': {'table_id': '0xfc', 'section_syntax_indicator': False, 'private': False, 'sap_type': '0x3',\n'sap_details': 'No Sap Type', 'section_length': 17, 'protocol_version': 0, 'encrypted_packet': False,\n'encryption_algorithm': 0, 'pts_adjustment_ticks': 0, 'pts_adjustment': 0.0, 'cw_index': '0x0', 'tier': '0xfff',\n'splice_command_length': 4095, 'splice_command_type': 0, 'descriptor_loop_length': 0, 'crc': '0x4f253396'},\n'command': {'command_length': None, 'command_type': 0, 'name': 'Splice Null'},\n'descriptors': [], 'packet_data': None}\n```\n* Cue.get() omits cue.bites and empty values\n```\n\u003e\u003e\u003e cue.get()\n{'info_section': {'table_id': '0xfc', 'section_syntax_indicator': False,'private': False, 'sap_type': '0x3',\n'sap_details': 'No Sap Type', 'section_length': 17, 'protocol_version': 0, 'encrypted_packet': False,\n'encryption_algorithm': 0, 'pts_adjustment_ticks': 0, 'pts_adjustment': 0.0, 'cw_index': '0x0', 'tier': '0xfff',\n'splice_command_length': 4095, 'splice_command_type': 0, 'descriptor_loop_length': 0, 'crc': '0x4f253396'},\n'command': {'command_type': 0, 'name': 'Splice Null'},\n'descriptors': []}\n```\n\n* `Cue.get_descriptors()`\n\n```js\n |  get_descriptors(self)\n |      Cue.get_descriptors returns a list of\n |      SCTE 35 splice descriptors as dicts.\n```\n* `Cue.get_json()`\n```js\n |  get_json(self)\n |      Cue.get_json returns the Cue instance\n |      data in json.\n```\n* `Cue.show()`\n```js\n |  show(self)\n |      Cue.show prints the Cue as JSON\n```\n* `Cue.to_stderr()`\n```js\n |  to_stderr(self)\n |      Cue.to_stderr prints the Cue\n```\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\u003csummary\u003eStream Class\u003c/summary\u003e\n\n\n\n\n  * src [stream.py](https://github.com/futzu/SCTE35-threefive/blob/master/threefive/stream.py)\n  * The threefive.__Stream__ class parses __SCTE35__ from __Mpegts__.\n  * Supports:\n     *  __File__ and __Http(s)__ and __Udp__ and __Multicast__ protocols.\n  \t * __Multiple Programs__.\n  \t * __Multi-Packet PAT, PMT, and SCTE35 tables__.\n\n* threefive tries to include __pid__, __program__, anf  __pts__ of the SCTE-35 packet.\n\n```js\nclass Stream(builtins.object)\n |  Stream(tsdata, show_null=True)\n |\n |  Stream class for parsing MPEG-TS data.\n ```\n ```py3\n |  __init__(self, tsdata, show_null=True)\n |\n |      tsdata is a file or http, https,\n |       udp or multicast url.\n |\n |      set show_null=False to exclude Splice Nulls\n\n ```\n\n* `Stream.decode(func=show_cue)`\n ```py3\n |  decode(self, func=show_cue)\n |      Stream.decode reads self.tsdata to find SCTE35 packets.\n |      func can be set to a custom function that accepts\n |      a threefive.Cue instance as it's only argument.\n ```\n \u003e `Stream.decode Example`\n\n ```python3\n import sys\n from threefive import Stream\n \u003e\u003e\u003e\u003e Stream('plp0.ts').decode()\n\n```\n\n   *   Pass in custom function\n\n   *  __func__ should match the interface\n  ``` func(cue)```\n\n \u003e `Stream.decode with custom function Example`\n```python3\nimport sys\nimport threefive\n\ndef display(cue):\n   print(f'\\033[92m{cue.packet_data}\\033[00m')\n   print(f'{cue.command.name}')\n\ndef do():\n   sp = threefive.Stream(tsdata)\n   sp.decode(func = display)\n\nif __name__ == '__main__':\n    do()\n```\n\n___\n\n* `Stream.decode_next()`\n\n ```js\n |  decode_next(self)\n |      Stream.decode_next returns the next\n |      SCTE35 cue as a threefive.Cue instance.\n ```\n\n\u003e `Stream.decode_next Example`\n```python3\n\"\"\"\nStream.decode_next example.\ndecode_next returns the Cue every time a Cue is found.\n\nThis uses a while loop to pull the Cues from a mpegts stream.\nWhen a Cue is found, if it's a Time Signal,\ncue.command.command_type=6, print Cue.command.\nYou can filter on any var in the SCTE-35 Cue.\n\"\"\"\n\nimport sys\nimport threefive\nfrom new_reader import reader\n\ndef do():\n    arg = sys.argv[1]\n    with reader(arg) as tsdata:\n        st = threefive.Stream(tsdata)\n        while True:\n            cue = st.decode_next()\n            if not cue:\n                return False\n            if cue:\n                if cue.command.command_type ==6:\n                    print(cue.command)\n\n\nif __name__ == \"__main__\":\n    do()\n\n```\n\n* `Stream.proxy(func = show_cue)`\n\n  *  Writes all packets to sys.stdout.\n\n  *  Writes scte35 data to sys.stderr.\n\n ```js\n |  decode(self, func=show_cue_stderr)\n |      Stream.decode_proxy writes all ts packets are written to stdout\n |      for piping into another program like mplayer.\n |      SCTE-35 cues are printed to stderr.\n ```\n\u003e `Stream.proxy Example`\n```python3\n\nimport threefive\nsp = threefive.Stream('https://futzu.com/xaa.ts')\nsp.decode_proxy()\n```\n\n* Pipe to mplayer\n```bash\n$ python3 proxy.py | mplayer -\n```\n___\n\n* `Stream.show()`\n\n```js\n|  show(self)\n|   List programs and streams and info for MPEGTS\n```\n\u003e `Stream.show() Example`\n```python3\n\u003e\u003e\u003e\u003e from threefive import Stream\n\u003e\u003e\u003e\u003e Stream('https://slo.me/plp0.ts').show()\n```\n\n```js\n    Service:    fancy ˹\n    Provider:   fu-corp\n    Pcr Pid:    1051[0x41b]\n    Streams:\n                Pid: 1051[0x41b]        Type: 0x1b AVC Video\n                Pid: 1052[0x41c]        Type: 0x3 MP2 Audio\n                Pid: 1054[0x41e]        Type: 0x6 PES Packets/Private Data\n                Pid: 1055[0x41f]        Type: 0x86 SCTE35 Data\n\n```\n\u003c/details\u003e\n\n\n\n\u003cdetails\u003e\u003csummary\u003e Need to verify your splice points? \u003c/summary\u003e \n \n\n ![image](https://github.com/user-attachments/assets/2581053a-e373-434e-9e06-32ace453aa02)\n\n \n* Try [cue2vtt.py](https://github.com/futzu/scte35-threefive/blob/master/examples/stream/cue2vtt.py) in the examples.\n\n   * cue2vtt.py creates webvtt subtitles out of SCTE-35 Cue data\n \n* use it like this \n\n ```rebol\n pypy3 cue2vtt.py video.ts | mplayer video.ts -sub -\n```\n\n\n\n\n---\n\n\u003c/details\u003e \n\n\n\n\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003ethreefive\u003c/b\u003e is now \u003cb\u003eaddressable TV\u003c/b\u003e compatible\u003c/summary\u003e\n\n\n  ```smalltalk\n             \"tag\": 2,\n            \"descriptor_length\": 31,\n            \"name\": \"Segmentation Descriptor\",\n            \"identifier\": \"CUEI\",\n            \"components\": [],\n            \"segmentation_event_id\": \"0x065eff\",\n            \"segmentation_event_cancel_indicator\": false,\n            \"segmentation_event_id_compliance_indicator\": true,\n            \"program_segmentation_flag\": true,\n            \"segmentation_duration_flag\": false,\n            \"delivery_not_restricted_flag\": true,\n            \"segmentation_message\": \"Call Ad Server\",   \u003c --- Boom\n            \"segmentation_upid_type\": 12,\n            \"segmentation_upid_type_name\": \"MPU\",\n            \"segmentation_upid_length\": 16,\n            \"segmentation_upid\": {\n                \"format_identifier\": \"ADFR\",\t\u003c--- Boom\n                \"private_data\": \"0x0133f10134b04f065e060220\",\n                \"version\": 1,                            \u003c---- Boom\n                \"channel_identifier\": \"0x33f1\",                  \u003c---- Boom\n                \"date\": 20230223,                         \u003c---- Boom\n                \"break_code\": 1630,                       \u003c---- Boom\n                \"duration\": \"0x602\"                \u003c---- Boom\n            },\n            \"segmentation_type_id\": 2,         \u003c----  Boom\n            \"segment_num\": 0,\n            \"segments_expected\": 0\n        },\n\n  ```\n\n---\n\n\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\u003csummary\u003eCustom charsets for UPIDS aka upids.charset\u003c/summary\u003e\n\n\n`Specify a charset for Upid data by setting threefive.upids.charset` [`issue #55`](https://github.com/futzu/scte35-threefive/issues/55)\n\n* default charset is ascii\n* python charsets info [Here](https://docs.python.org/3/library/codecs.html)\n* setting charset to None will return raw bytes.\n\n\n#### Example Usage:\n\n```lua\n\u003e\u003e\u003e from threefive import Cue,upids\n\u003e\u003e\u003e i=\"/DBKAAAAAAAAAP/wBQb+YtC8/AA0AiZDVUVJAAAD6X/CAAD3W3ACEmJibG5kcHBobkQCAsGDpQIAAAAAAAEKQ1VFSRSAIyowMljRk9c=\"\n\n\u003e\u003e\u003e upids.charset\n'ascii'\n\u003e\u003e\u003e cue=Cue(i)\n\u003e\u003e\u003e cue.decode()\nascii\nTrue\n\u003e\u003e\u003e cue.descriptors[0].segmentation_upid\n'bblndpphnD\\x02\\x02���\\x02\\x00\\x00'\n\n\u003e\u003e\u003e upids.charset=\"utf16\"\n\u003e\u003e\u003e cue.decode()\nutf16\nTrue\n\u003e\u003e\u003e cue.descriptors[0].segmentation_upid\n'扢湬灤桰䑮Ȃ菁ʥ\\x00'\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e \u003csummary\u003e Custom Private Splice Descriptors ( new! )\u003c/summary\u003e\n\n\n### threefive now supports custom private splice descriptors, right out the box. \n*  The first byte of the descriptor is read as an int for the Descriptor tag\n* The second byte is read as an int for  the desciptor length\n* The next four bytes are read as ASCII for the Identifier\n* remanining bytes are returned as private data\n\n```js\nfrom threefive import Cue, TimeSignal\nfrom threefive.descriptors import SpliceDescriptor\n```\n* make a Cue\n```smalltalk\nc = Cue()\n```\n* add a Time Signal\n```smalltalk\nc.command = TimeSignal()\nc.command.time_specified_flag=True\nc.command.pts_time=1234.567890\n```\n* add Splice Descriptor\n\n```smalltalk\nsd = SpliceDescriptor()\nsd.tag = 47\nsd.identifier ='fufu'\nsd.private_data = b'threefive kicks ass'\nc.descriptors.append(sd)\n```\n* encode\n```smalltalk\nc.encode()\n'/DAvAAAAAAAAAP/wBQb+Bp9rxgAZLxdmdWZ1dGhyZWVmaXZlIGtpY2tzIGFzc1m+EsU='\n```\n* show\n\n```smalltalk\n\nc.show()\n{\n    \"info_section\": {\n        \"table_id\": \"0xfc\",\n        \"section_syntax_indicator\": false,\n        \"private\": false,\n        \"sap_type\": \"0x03\",\n        \"sap_details\": \"No Sap Type\",\n        \"section_length\": 47,\n        \"protocol_version\": 0,\n        \"encrypted_packet\": false,\n        \"encryption_algorithm\": 0,\n        \"pts_adjustment_ticks\": 0,\n        \"cw_index\": \"0x0\",\n        \"tier\": \"0xfff\",\n        \"splice_command_length\": 5,\n        \"splice_command_type\": 6,\n        \"descriptor_loop_length\": 25,\n        \"crc\": \"0x59be12c5\"\n    },\n    \"command\": {\n        \"command_length\": 5,\n        \"command_type\": 6,\n        \"name\": \"Time Signal\",\n        \"time_specified_flag\": true,\n        \"pts_time\": 1234.56789,\n        \"pts_time_ticks\": 111111110\n    },\n    \"descriptors\": [\n        {\n            \"tag\": 47,\n            \"descriptor_length\": 23,\n            \"identifier\": \"fufu\",\n            \"private_data\": [\n                116,\n                104,\n                114,\n                101,\n                101,\n                102,\n                105,\n                118,\n                101,\n                32,\n                107,\n                105,\n                99,\n                107,\n                115,\n                32,\n                97,\n                115,\n                115\n            ]\n        }\n    ]\n}\n```\n*  the custom Splice Descriptor\n```js\nc.descriptors[0]\n\n{'tag': 47, 'descriptor_length': 23, 'name': None, 'identifier': 'fufu', 'bites': None, 'provider_avail_id': None, 'components': None, 'private_data': b'threefive kicks ass'}\n```\n* Cool dictionaary comprehension to print the Splice Descriptor with only relevant values\n \n```js\n{print(f'{k} = {v}') for k,v in vars(c.descriptors[0]).items() if v is not None}\n\ntag = 47\ndescriptor_length = 23\nidentifier = fufu\nprivate_data = b'threefive kicks ass'\n\n\n```\n\n\n\u003c/details\u003e\n\n\n\n Powered by threefive\n---\n\n \n\u003cbr\u003e⚡ [x9k3](https://github.com/futzu/x9k3): SCTE-35 HLS Segmenter and Cue Inserter.\n\u003cbr\u003e⚡ [m3ufu](https://github.com/futzu/m3ufu): SCTE-35 m3u8 Parser.\n\u003cbr\u003e⚡ [adbreak2](https://github.com/futzu/adbreak2) a cli tool that quickly and easily generates SCTE-35 Cues for HLS and stuff.\n\u003cbr\u003e⚡ [Ultra Mega Zoom Zoom](https://github.com/futzu/umzz) ABR HLS segmenter and SCTE-35 inserter. \n\u003cbr\u003e⚡ [POIS Server](https://github.com/scunning1987/pois_reference_server) is Super Cool.\n\u003cbr\u003e⚡ [bpkio-cli](https://pypi.org/project/bpkio-cli/): A command line interface to the broadpeak.io APIs. \n\u003cbr\u003e⚡ [amt-play ](https://github.com/vivoh-inc/amt-play) uses x9k3.\n\n\n threefive | more\n ---\n \n\u003cbr\u003e⚡ [Diagram](https://github.com/futzu/threefive/blob/master/cue.md) of a threefive SCTE-35 Cue.\n\u003cbr\u003e⚡ [ffmpeg and threefive](https://github.com/futzu/SCTE35-threefive/blob/master/threefive-ffmpeg.md) and SCTE35 and Stream Type 0x6 bin data.\n\u003cbr\u003e⚡ [Issues and Bugs and Feature Requests](https://github.com/futzu/scte35-threefive/issues) will be considered. Please don't make me regret it. \n\u003cbr\u003e⚡ `NEW!` __threefive__ now has experimental DVB DAS Support `ETSI TS 103 752-1` \u003cbr\u003e\u003cbr\u003e\n\n [![image](https://github.com/user-attachments/assets/ec5192f3-8484-4f85-87ab-f9d72374c666)](https://iodisco.com/scte35)\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffutzu%2Fthreefive","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffutzu%2Fthreefive","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffutzu%2Fthreefive/lists"}