threefive 3.0.87__tar.gz → 3.0.89__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {threefive-3.0.87 → threefive-3.0.89}/PKG-INFO +315 -272
- {threefive-3.0.87 → threefive-3.0.89}/README.md +314 -271
- {threefive-3.0.87 → threefive-3.0.89}/pyproject.toml +1 -1
- {threefive-3.0.87 → threefive-3.0.89}/threefive/bump.py +3 -3
- {threefive-3.0.87 → threefive-3.0.89}/threefive/cli.py +17 -95
- {threefive-3.0.87 → threefive-3.0.89}/threefive/cue.py +0 -1
- {threefive-3.0.87 → threefive-3.0.89}/threefive/descriptors.py +67 -40
- {threefive-3.0.87 → threefive-3.0.89}/threefive/encode.py +1 -1
- {threefive-3.0.87 → threefive-3.0.89}/threefive/gums.py +2 -3
- {threefive-3.0.87 → threefive-3.0.89}/threefive/hls.py +7 -7
- {threefive-3.0.87 → threefive-3.0.89}/threefive/new_reader.py +8 -6
- {threefive-3.0.87 → threefive-3.0.89}/threefive/segment.py +3 -3
- {threefive-3.0.87 → threefive-3.0.89}/threefive/sixfix.py +11 -10
- {threefive-3.0.87 → threefive-3.0.89}/threefive/stream.py +81 -67
- {threefive-3.0.87 → threefive-3.0.89}/threefive/stuff.py +1 -1
- {threefive-3.0.87 → threefive-3.0.89}/threefive/superkabuki.py +3 -1
- {threefive-3.0.87 → threefive-3.0.89}/threefive/throttle.py +31 -11
- {threefive-3.0.87 → threefive-3.0.89}/threefive/upids.py +1 -1
- {threefive-3.0.87 → threefive-3.0.89}/threefive/version.py +1 -1
- {threefive-3.0.87 → threefive-3.0.89}/threefive.egg-info/PKG-INFO +315 -272
- {threefive-3.0.87 → threefive-3.0.89}/LICENSE +0 -0
- {threefive-3.0.87 → threefive-3.0.89}/setup.cfg +0 -0
- {threefive-3.0.87 → threefive-3.0.89}/threefive/__init__.py +0 -0
- {threefive-3.0.87 → threefive-3.0.89}/threefive/aac.py +0 -0
- {threefive-3.0.87 → threefive-3.0.89}/threefive/base.py +0 -0
- {threefive-3.0.87 → threefive-3.0.89}/threefive/bitn.py +0 -0
- {threefive-3.0.87 → threefive-3.0.89}/threefive/commands.py +0 -0
- {threefive-3.0.87 → threefive-3.0.89}/threefive/crc.py +0 -0
- {threefive-3.0.87 → threefive-3.0.89}/threefive/crctable.py +0 -0
- {threefive-3.0.87 → threefive-3.0.89}/threefive/hlsprofile.py +0 -0
- {threefive-3.0.87 → threefive-3.0.89}/threefive/hlstags.py +0 -0
- {threefive-3.0.87 → threefive-3.0.89}/threefive/iframes.py +0 -0
- {threefive-3.0.87 → threefive-3.0.89}/threefive/packetdata.py +0 -0
- {threefive-3.0.87 → threefive-3.0.89}/threefive/pmt.py +0 -0
- {threefive-3.0.87 → threefive-3.0.89}/threefive/section.py +0 -0
- {threefive-3.0.87 → threefive-3.0.89}/threefive/segmentation.py +0 -0
- {threefive-3.0.87 → threefive-3.0.89}/threefive/speedo.py +0 -0
- {threefive-3.0.87 → threefive-3.0.89}/threefive/streamtypes.py +0 -0
- {threefive-3.0.87 → threefive-3.0.89}/threefive/udp.py +0 -0
- {threefive-3.0.87 → threefive-3.0.89}/threefive/uxp.py +0 -0
- {threefive-3.0.87 → threefive-3.0.89}/threefive/xml.py +0 -0
- {threefive-3.0.87 → threefive-3.0.89}/threefive.egg-info/SOURCES.txt +0 -0
- {threefive-3.0.87 → threefive-3.0.89}/threefive.egg-info/dependency_links.txt +0 -0
- {threefive-3.0.87 → threefive-3.0.89}/threefive.egg-info/entry_points.txt +0 -0
- {threefive-3.0.87 → threefive-3.0.89}/threefive.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: threefive
|
|
3
|
-
Version: 3.0.
|
|
3
|
+
Version: 3.0.89
|
|
4
4
|
Summary: threefive is The #1 SCTE-35 Decoder and Encoder on the Planet.
|
|
5
5
|
Author-email: AdrianofDoom <spam@iodisco.com>
|
|
6
6
|
License-Expression: Sleepycat
|
|
@@ -19,95 +19,48 @@ Dynamic: license-file
|
|
|
19
19
|
|
|
20
20
|
# [ threefive ]
|
|
21
21
|
|
|
22
|
-
## https://github.com/superkabuki/threefive
|
|
23
|
-
### threefive is the industry leading SCTE-35 tool.
|
|
24
|
-
|
|
25
|
-
* In case you were wondering ....
|
|
26
|
-
|
|
27
|
-
<img width="672" height="586" alt="image" src="https://github.com/user-attachments/assets/0c327200-e1f0-4055-825f-349fe89c32d6" />
|
|
28
22
|
|
|
23
|
+
<img width="1000" height="748" alt="100_0033" src="https://github.com/user-attachments/assets/dc967211-35d4-4aa5-af75-ce6099207946" />
|
|
29
24
|
|
|
25
|
+
## https://github.com/superkabuki/threefive
|
|
30
26
|
|
|
31
|
-
|
|
27
|
+
## threefive is the only tool that supports SCTE-35-1 and SCTE-35-2
|
|
32
28
|
|
|
33
|
-
* __Decodes SCTE-35__ from `MPEGTS`✔ `Base64`✔ `Bytes`✔ `DASH`✔ `Hex` ✔ `HLS`✔ `Integers`✔ `JSON`✔ `XML`✔ `XML+Binary`✔
|
|
34
|
-
|
|
29
|
+
* __Decodes SCTE-35__ from `MPEGTS`✔ `Base64`✔ `Bytes`✔ `DASH`✔ `Hex` ✔ `HLS`✔ `Integers`✔ `JSON`✔ `XML`✔ `XML+Binary`✔
|
|
35
30
|
* __Encodes SCTE-35__ to `MPEGTS`✔ `Base64`✔ `Bytes`✔ `Hex`✔ `Integers`✔ `JSON`✔ `XML`✔ `XML+Binary`✔
|
|
36
31
|
___
|
|
37
32
|
|
|
38
|
-
|
|
39
33
|
## [ News ]
|
|
40
|
-
* __threefive.Stream.decode()__ now does __interpreter detection__ and uses __multiprocessing__ for __python3.11__ and __python3.14__ for a __serious speedup__.
|
|
41
|
-
* __Event Descriptors__ and __Property__ types from __the recently published 2026 SCTE-35 Specification part 2__ have been added.
|
|
42
|
-
* __threefive no longer uses setuptools for packaging__ and I know you don't care.
|
|
43
|
-
* __threefive now supports__ [__Secure Reliable Transport__](https://github.com/superkabuki/threefive_is_scte35/blob/main/README.md#threefive-now-supports-srt) (watch the cool video)
|
|
44
|
-
___
|
|
45
|
-
|
|
46
|
-
## [ Latest version is v3.0.87 ]
|
|
47
|
-
|
|
48
|
-
* threefive cyclomatic complexity score is 1.9337094499294782 _( that's better than the Python standard library)_ .
|
|
49
|
-
* __threefive now has NO External Dependencies__
|
|
50
|
-
* SRT and AES support is now optional
|
|
51
|
-
* __threefive is fully python v3.14 compliant__
|
|
52
|
-
* __No more setup tools!__ threefive now uses a __toml file and a Makefile__ to generate packages,
|
|
53
|
-
* I'm just trying to fit in with the cool python kids.
|
|
54
|
-
* __New__ the threefive cli tool has spun off several new cli tools. I had to split the cli up, the help was just way too long.
|
|
55
|
-
* In addition to the __threefive__ cli you also get:
|
|
56
|
-
* __scte35bump__ _adjust scte-35 pts in mpegts streams_
|
|
57
|
-
* __scte35fix__ _change bin data streams back to scte-35_
|
|
58
|
-
* __scte35hls__ _parse scte-35 from hls tags and segments_
|
|
59
|
-
* __scte35inject__ _inject scte-35 packets into mpegts streams_
|
|
60
|
-
* __gums__ _(the Grande Unified unicast and Multicast Server)_
|
|
61
|
-
___
|
|
62
|
-
|
|
63
|
-
### If you parse the output from the threefive cli....
|
|
64
|
-
* Comments, errors, and warnings, even printed comments, errors, and warnings, that are not the output, start with an octothorpe '#' and can be stripped, if needed, with sed.
|
|
65
|
-
```sed
|
|
66
|
-
threefive video.ts 2>&1 | sed -n '/^\#/!p' -
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
### [ Speed Test ]
|
|
70
|
-
#### pypy3 vs. python3.11 vs. python3.14 running threefive 3.0.0x840c (_pre-release_)
|
|
71
|
-
|
|
72
|
-
* Using multiprocessing cuts parsing time in half for python 3.11 even more for python3.14
|
|
73
|
-
|
|
74
|
-
* single process pypy3 is still faster though.
|
|
75
|
-
|
|
76
|
-
* The test is to parse a 3.7 GB file for 286 SCTE-35 Cues.
|
|
77
|
-
|
|
78
|
-
* Results
|
|
79
|
-
|
|
80
|
-
| interpreter| time |
|
|
81
|
-
|------------|----------|
|
|
82
|
-
|__pypy3__ |__3.532 secs__|
|
|
83
|
-
|python3.11 |5.520 secs|
|
|
84
|
-
|python3.14 |5.521 secs|
|
|
85
|
-
|
|
86
|
-
* When I did the same test for threefive v3.0.83, pypy3 was 4.1 seconds, python3.11 was 10 seconds, and python3.14 was over 14 secs
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
## [ Try these in your browser ]
|
|
90
|
-
#### Parse SCTE-35 in MPEGTS over HTTP, in your browser with[ Go, Wasm and Super Karate Death Car](https://bigcorp.ltd/gowasm)
|
|
91
|
-
|
|
92
|
-
#### Parse, edit, and convert SCTE-35 Cues in your browser with [fastcgi, python3, threefive, and nstuff](https://iodisco.com/scte35)
|
|
93
|
-
|
|
94
|
-
#### Parse SCTE-35 in MPEGTS over HTTP, in your browser with[ threefive.js,javascript, and a little sed](https://bigcorp.ltd/bread) just to keep things interesting.
|
|
95
|
-
|
|
96
|
-
#### Decode SCTE-35 data via Http request in a browser, with curl, or whatever with [Sassy](https://github.com/superkabuki/threefive_is_scte35/blob/main/sassy.md) , SCTE-35 as a Service.
|
|
97
34
|
|
|
35
|
+
* threefive now has support for SCTE-35-2. __Event Descriptors__ and __Property__ types from __the recently published 2026 SCTE-35 Specification can be decoded, modified, and encoded with threefive.
|
|
98
36
|
___
|
|
99
|
-
# [__[ Examples ]__](https://github.com/superkabuki/threefive/tree/main/examples)
|
|
100
37
|
|
|
38
|
+
## [ Latest version is v3.0.89 ]
|
|
39
|
+
___
|
|
40
|
+
## [ Examples ]
|
|
41
|
+
* [aac_id3header.py](aac_id3header.py) - use the __threefive.aac.AacParser__ class to parse __HLS AAC__ segments for __PTS__ in __ID3 header tags__. _(__Updated__ 01/07/2026)_
|
|
42
|
+
* [id3.aac](id3.aac) test file for __aac_id3header.py__ _(__New!__ 01/12/2026)_
|
|
43
|
+
* [base64toxmlbin.py](base64toxmlbin.py) - __convert__ __base64__ encoded __SCTE-35__ to __xml+binary__ encoded SCTE-35 and back.
|
|
44
|
+
* [cue2vtt.py](cue2vtt.py) - display __SCTE-35__ in __WebVTT__ subtitles to __verify__ __SCTE-35__ __splice points__.
|
|
45
|
+
* [decodenext.py](decodenext.py) - parse __MPEGTS__ streams for __SCTE-35__ using __Stream.decode_next()__. _(__Updated__ 01/12/2026)_
|
|
46
|
+
* [dtmf.py](dtmf.py) - parse __base64__ __SCTE-35__ with a __DTMF__ descriptor and __re-encode__ to __SCTE-35__ in __Hex__ format.
|
|
47
|
+
* [edit_break_duration.py](edit_break_duration.py) - change the __SCTE-35__ __break duration__ and __re-encode__ __SCTE-35__.
|
|
48
|
+
* [event_descriptors.py](event_descriptors.py) - The __Event Descriptor__ examples from the __2026 SCTE-35 part 2 specification__. _(__New!__ 05/10/2026)_
|
|
49
|
+
* [encode_time_signal.py](encode_time_signal.py) - __encode__ a __SCTE-35__ __Cue__ with a __TimeSignal__ from scratch.
|
|
50
|
+
* [parsehlstags.py](parsehlstags.py) - use the __TagParser__ class to parse __HLS tags__ from a __m3u8__ file and group the tags by segment.
|
|
51
|
+
* [proxy.py](proxy.py) - how to use the __Stream.proxy()__ method for parsing __SCTE-35__ and __piping__ video.
|
|
52
|
+
* [quickstream.py](quickstream.py) - how to __add SCTE-35 parsing__ for __MPEGTS__ streams to __your application__.
|
|
53
|
+
* [spliceinsert.py](spliceinsert.py) - a __SCTE-35__ __Splice Insert__ example.
|
|
54
|
+
* [upid_custom_output.py](upid_custom_output.py) - __customizing Upid data output__ for a variety of __Upids__. _(__New!__ 01/11/2026)_
|
|
55
|
+
* [custom_upid_handling.py](custom_upid_handling.py) - Custom __user defined UPID__ handling example. _(__New!__ 01/11/2026)_
|
|
56
|
+
___
|
|
101
57
|
|
|
102
58
|
|
|
103
59
|
# [ Documentation ]
|
|
104
|
-
|
|
105
|
-
*
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
* [SCTE-35 __As a Service__](sassy.md) _if you can make an http request, you can parse SCTE-35, no install needed._
|
|
109
|
-
|
|
110
|
-
* [__install__](#install)
|
|
60
|
+
#### Need to inject SCTE-35 into HLS? [X9k3.](https://github.com/superkabuki/x9k3)
|
|
61
|
+
* [__web based SCTE-35 tools__](#web) - threefive and friends over http.
|
|
62
|
+
* [__install__](#install)
|
|
63
|
+
* [__quick start__](https://github.com/superkabuki/threefive_is_scte35/blob/main/README.md#quick-start)
|
|
111
64
|
* __command line tools__
|
|
112
65
|
* [ __threefive__](#cli) _decode SCTE-35 on the command line_
|
|
113
66
|
* [__scte35bump__](#scte35bump) _adjust SCTE-35 PTS in MPEGTS streams_
|
|
@@ -121,7 +74,6 @@ ___
|
|
|
121
74
|
* * [threefive __Classes__](#classes) _threefive is OO, made to subclass_
|
|
122
75
|
* [__Cue__ Class](https://github.com/superkabuki/threefive/blob/main/cue.md) _this class you'll use often_
|
|
123
76
|
* [__Stream__ Class](https://github.com/superkabuki/threefive/blob/main/stream.md) _this is the class for parsing MPEGTS_
|
|
124
|
-
|
|
125
77
|
* [SCTE-35 __Sidecar Files__](https://github.com/superkabuki/SCTE-35_Sidecar_Files) _threefive supports SCTE-35 sidecar files_
|
|
126
78
|
* [SCTE-35 __HLS__](https://github.com/superkabuki/threefive/blob/main/hls.md) _parse SCTE-35 in HLS__
|
|
127
79
|
* [SCTE-35 __XML__ ](https://github.com/superkabuki/SCTE-35/blob/main/xml.md) and [More __XML__](node.md) _threefive can parse and encode SCTE-35 xml_
|
|
@@ -168,17 +120,230 @@ make install py3=python3.14
|
|
|
168
120
|
# works for any python in your path or use a full path if needed.
|
|
169
121
|
|
|
170
122
|
```
|
|
171
|
-
|
|
123
|
+
# [⇧](#-documentation-)
|
|
172
124
|
___
|
|
173
125
|
|
|
126
|
+
# [⇧](#-documentation-)
|
|
174
127
|
|
|
175
128
|
## [Quick Start]
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
129
|
+
<i>These examples show how to parse SCTE-35<BR>
|
|
130
|
+
from various SCTE-35 data formats, with both the cli and with the library.</i>
|
|
131
|
+
<details><summary>MPEGTS</summary>
|
|
132
|
+
|
|
133
|
+
* MPEGTS streams can be Files, Http(s), Multicast,SRT, UDP Unicast, or stdin.
|
|
134
|
+
* __cli__
|
|
135
|
+
|
|
136
|
+
```js
|
|
137
|
+
threefive https://example.com/video.ts
|
|
138
|
+
```
|
|
139
|
+
* wildcards work too.
|
|
140
|
+
```js
|
|
141
|
+
threefive /mpegts/*.ts
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
* __lib__
|
|
145
|
+
```py3
|
|
146
|
+
|
|
147
|
+
from threefive import Stream
|
|
148
|
+
stream = Stream('https://example.com/video.ts')
|
|
149
|
+
stream.decode()
|
|
150
|
+
|
|
151
|
+
```
|
|
152
|
+
</details>
|
|
153
|
+
<details><summary>Base64</summary>
|
|
154
|
+
|
|
155
|
+
* __cli__
|
|
156
|
+
```js
|
|
157
|
+
threefive '/DAsAAAAAyiYAP/wCgUAAAABf1+ZmQEBABECD0NVRUkAAAAAf4ABADUAAC2XQZU='
|
|
158
|
+
```
|
|
159
|
+
* __lib__
|
|
160
|
+
```py3
|
|
161
|
+
|
|
162
|
+
from threefive import Cue
|
|
163
|
+
data = '/DAsAAAAAyiYAP/wCgUAAAABf1+ZmQEBABECD0NVRUkAAAAAf4ABADUAAC2XQZU='
|
|
164
|
+
cue=Cue(data)
|
|
165
|
+
cue.show()
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
</details>
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
<details><summary>Bytes</summary>
|
|
172
|
+
|
|
173
|
+
* __cli__
|
|
174
|
+
* Bytes don't work on the cli
|
|
175
|
+
|
|
176
|
+
* __lib__
|
|
177
|
+
```py3
|
|
178
|
+
|
|
179
|
+
from threefive import Cue
|
|
180
|
+
data = b'\xfc0\x16\x00\x00\x00\x00\x00\x00\x00\xff\xf0\x05\x06\xfe\x00\xc0D\xa0\x00\x00\x00\xb5k\x88'
|
|
181
|
+
cue=Cue(data)
|
|
182
|
+
cue.show()
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
</details>
|
|
186
|
+
|
|
187
|
+
<details><summary>Hex</summary>
|
|
188
|
+
|
|
189
|
+
* Can be a hex literal or hex string or bytes.
|
|
190
|
+
|
|
191
|
+
* __cli__
|
|
192
|
+
```js
|
|
193
|
+
threefive 0xfc301600000000000000fff00506fed605225b0000b0b65f3b
|
|
194
|
+
```
|
|
195
|
+
* __lib__
|
|
196
|
+
```py3
|
|
197
|
+
|
|
198
|
+
from threefive import Cue
|
|
199
|
+
data = 0xfc301600000000000000fff00506fed605225b0000b0b65f3b
|
|
200
|
+
cue=Cue(data)
|
|
201
|
+
cue.show()
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
</details>
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
<details><summary>Int</summary>
|
|
208
|
+
|
|
209
|
+
* Can be a literal integer or string or bytes.
|
|
210
|
+
|
|
211
|
+
* __cli__
|
|
212
|
+
```js
|
|
213
|
+
threefive 1583008701074197245727019716796221243043855984942057168199483
|
|
214
|
+
```
|
|
215
|
+
* __lib__
|
|
216
|
+
```py3
|
|
217
|
+
|
|
218
|
+
from threefive import Cue
|
|
219
|
+
data = 1583008701074197245727019716796221243043855984942057168199483
|
|
220
|
+
cue=Cue(data)
|
|
221
|
+
cue.show()
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
</details>
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
<details><summary>JSON</summary>
|
|
229
|
+
|
|
230
|
+
* __cli__
|
|
231
|
+
* put JSON SCTE-35 in a file and redirect it into threefive
|
|
232
|
+
* cat files to threefive works too.
|
|
233
|
+
* echo JSON or type JSON on the command line.
|
|
234
|
+
|
|
235
|
+
```js
|
|
236
|
+
threefive < json.json
|
|
237
|
+
```
|
|
238
|
+
* __lib__
|
|
239
|
+
|
|
240
|
+
```py3
|
|
241
|
+
|
|
242
|
+
from threefive import Cue
|
|
243
|
+
data = '''{
|
|
244
|
+
"info_section": {
|
|
245
|
+
"table_id": "0xfc",
|
|
246
|
+
"section_syntax_indicator": false,
|
|
247
|
+
"private": false,
|
|
248
|
+
"sap_type": "0x03",
|
|
249
|
+
"sap_details": "No Sap Type",
|
|
250
|
+
"section_length": 22,
|
|
251
|
+
"protocol_version": 0,
|
|
252
|
+
"encrypted_packet": false,
|
|
253
|
+
"encryption_algorithm": 0,
|
|
254
|
+
"pts_adjustment": 0.0,
|
|
255
|
+
"cw_index": "0x00",
|
|
256
|
+
"tier": "0x0fff",
|
|
257
|
+
"splice_command_length": 5,
|
|
258
|
+
"splice_command_type": 6,
|
|
259
|
+
"descriptor_loop_length": 0,
|
|
260
|
+
"crc": "0xb56b88"
|
|
261
|
+
},
|
|
262
|
+
"command": {
|
|
263
|
+
"command_length": 5,
|
|
264
|
+
"command_type": 6,
|
|
265
|
+
"name": "Time Signal",
|
|
266
|
+
"time_specified_flag": true,
|
|
267
|
+
"pts_time": 140.005333
|
|
268
|
+
},
|
|
269
|
+
"descriptors": []
|
|
270
|
+
}
|
|
271
|
+
'''
|
|
272
|
+
cue=Cue(data)
|
|
273
|
+
cue.show()
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
</details>
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
<details><summary><u>Xml</u></summary>
|
|
280
|
+
|
|
281
|
+
* __cli__
|
|
282
|
+
* put xml SCTE-35 in a [file](xml.xml) and redirect it into threefive
|
|
283
|
+
* cat files to threefive works too.
|
|
284
|
+
* echo xml or type xml on the command line.
|
|
285
|
+
|
|
286
|
+
```js
|
|
287
|
+
threefive < xml.xml
|
|
288
|
+
```
|
|
289
|
+
* __lib__
|
|
290
|
+
```py3
|
|
291
|
+
from threefive import Cue
|
|
292
|
+
data = '''
|
|
293
|
+
<scte35:SpliceInfoSection xmlns:scte35="https://scte.org/schemas/35"
|
|
294
|
+
ptsAdjustment="0" protocolVersion="0" sapType="3" tier="4095">
|
|
295
|
+
<scte35:TimeSignal>
|
|
296
|
+
<scte35:SpliceTime ptsTime="12600480"/>
|
|
297
|
+
</scte35:TimeSignal>
|
|
298
|
+
</scte35:SpliceInfoSection>
|
|
299
|
+
'''
|
|
300
|
+
cue=Cue(data)
|
|
301
|
+
|
|
302
|
+
cue.show()
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
</details>
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
<details><summary>Xml+binary</summary>
|
|
311
|
+
|
|
312
|
+
* __cli__
|
|
313
|
+
* write xml+binary to a [file](xmlbin.xml) and redirect it to threefive
|
|
314
|
+
* cat files to threefive works too.
|
|
315
|
+
* echo xml+binary or type xml+binary on the command line.
|
|
316
|
+
```js
|
|
317
|
+
threefive < xmlbin.xml
|
|
318
|
+
```
|
|
319
|
+
* __lib__
|
|
320
|
+
```py3
|
|
321
|
+
|
|
322
|
+
from threefive import Cue
|
|
323
|
+
data = '''<scte35:Signal xmlns:scte35="https://scte.org/schemas/35">
|
|
324
|
+
<scte35:Binary>/DAWAAAAAAAAAP/wBQb+AMBEoAAAALVriA==</scte35:Binary>
|
|
325
|
+
</scte35:Signal>
|
|
326
|
+
'''
|
|
327
|
+
cue=Cue(data)
|
|
328
|
+
cue.show()
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
</details>
|
|
332
|
+
|
|
333
|
+
</samp>
|
|
334
|
+
|
|
335
|
+
___
|
|
336
|
+
|
|
337
|
+
# [⇧](#-documentation-)
|
|
179
338
|
|
|
180
|
-
|
|
181
|
-
|
|
339
|
+
### [CLI]
|
|
340
|
+
The threefive cli tool is able to parse SCTE-35 from MPEGTS Streams,Base64,Hex,Integers,JSON XML,and XMLBinary.
|
|
341
|
+
The format is auto-detected.
|
|
342
|
+
|
|
343
|
+
# [⇧](#-documentation-)
|
|
344
|
+
|
|
345
|
+
#### [ Parse SCTE-35 from MPEGTS ]
|
|
346
|
+
SCTE-35 can be parsed from MPEGTS over a variety of protocols.
|
|
182
347
|
* __SCTE-35 Input__: MPEGTS
|
|
183
348
|
* __Protocols__: pipes, files, stdin, http(s), multicast,SRT and UDP.
|
|
184
349
|
* __SCTE-35 Output__: JSON _(default)_ base64, bytes, hex, int, xml, and xmlbin.
|
|
@@ -192,8 +357,12 @@ ___
|
|
|
192
357
|
|__.__|UDP|__int__ | __threefive__ udp://10.10.10.10:1011 __int__ |
|
|
193
358
|
|__.__|Pipe|__xml__| cat video.ts \| __threefive__ __xml__ |
|
|
194
359
|
|__.__|stdin|__xml+bin__| __threefive__ __xmlbin__ < video.ts|
|
|
360
|
+
|
|
195
361
|
___
|
|
196
|
-
|
|
362
|
+
|
|
363
|
+
# [⇧](#-documentation-)
|
|
364
|
+
|
|
365
|
+
#### [ Parse SCTE-35 Cues ]
|
|
197
366
|
|
|
198
367
|
* The __default output__ is JSON
|
|
199
368
|
* __SCTE-35 Inputs:__ base64, hex, int, JSON,int,xml,and xmlbin.
|
|
@@ -221,8 +390,11 @@ ___
|
|
|
221
390
|
|__xml__ |__JSON__ | __threefive__ < xml.xml |
|
|
222
391
|
|__xmlbin__|__int__ | __threefive__ < xmlbin.xml __int__ |
|
|
223
392
|
|
|
224
|
-
|
|
225
|
-
|
|
393
|
+
___
|
|
394
|
+
|
|
395
|
+
# [⇧](#-documentation-)
|
|
396
|
+
|
|
397
|
+
#### [__Additional functionality__]
|
|
226
398
|
* threefive has several additional features, mostly related to MPEGTS streams.
|
|
227
399
|
* threefive has built in help, just type `threefive help`
|
|
228
400
|
* This table shows how to use them.
|
|
@@ -239,11 +411,15 @@ ___
|
|
|
239
411
|
|__Proxy__ the __mpegts__ stream to stdout |threefive __proxy__ https://wexample.com/video.ts |
|
|
240
412
|
| | |
|
|
241
413
|
| | |
|
|
242
|
-
---
|
|
243
414
|
|
|
244
|
-
|
|
415
|
+
___
|
|
416
|
+
|
|
417
|
+
# [⇧](#-documentation-)
|
|
418
|
+
|
|
419
|
+
|
|
420
|
+
### Other tools
|
|
245
421
|
threefive also comes with:
|
|
246
|
-
|
|
422
|
+
#### scte35bump
|
|
247
423
|
|
|
248
424
|
* bump adjusts SCTE-35 PTS in an MPEGTS stream
|
|
249
425
|
|
|
@@ -262,10 +438,11 @@ options:
|
|
|
262
438
|
|
|
263
439
|
scte35bump is part of threefive.
|
|
264
440
|
```
|
|
441
|
+
___
|
|
265
442
|
|
|
266
|
-
|
|
443
|
+
# [⇧](#-documentation-)
|
|
267
444
|
|
|
268
|
-
|
|
445
|
+
#### gums
|
|
269
446
|
* the Grande Udp Multicast Server
|
|
270
447
|
|
|
271
448
|
```js
|
|
@@ -284,7 +461,10 @@ options:
|
|
|
284
461
|
|
|
285
462
|
gums is part of threefive.
|
|
286
463
|
```
|
|
287
|
-
|
|
464
|
+
|
|
465
|
+
# [⇧](#-documentation-)
|
|
466
|
+
|
|
467
|
+
#### scte35hls
|
|
288
468
|
|
|
289
469
|
* parse HLS for SCTE-35. Supports all HLS SCTE-35 tags.
|
|
290
470
|
|
|
@@ -315,7 +495,9 @@ $ scte35hls -h
|
|
|
315
495
|
* mpeg2, aac, ac3, mp3
|
|
316
496
|
```
|
|
317
497
|
|
|
318
|
-
|
|
498
|
+
# [⇧](#-documentation-)
|
|
499
|
+
|
|
500
|
+
#### __scte35fix__
|
|
319
501
|
* when ffmpeg changes a SCTE-35 stream to bin data stream, scte35fix changes it back.
|
|
320
502
|
|
|
321
503
|
```js
|
|
@@ -338,66 +520,11 @@ $ scte35fix -h
|
|
|
338
520
|
scte35fix srt://10.10.10.13:4201
|
|
339
521
|
scte35fix is part of threefive.
|
|
340
522
|
```
|
|
341
|
-
|
|
342
|
-
## [XML]
|
|
343
|
-
* [XML](https://github.com/superkabuki/SCTE-35/blob/main/xml.md) __New__! _updated 05/01/2025_
|
|
344
|
-
|
|
345
|
-
## [HLS]
|
|
346
|
-
* [Advanced Parsing of SCTE-35 in HLS with threefive](https://github.com/superkabuki/threefive/blob/main/hls.md) All HLS SCTE-35 tags, Sidecar Files, AAC ID3 Header Timestamps, SCTE-35 filters... Who loves you baby?
|
|
347
|
-
## [SCTE-35 As a Service]
|
|
348
|
-
* Decode SCTE-35 without installing anything. If you can make an https request, you can use [__Sassy__](sassy.md) to decode SCTE-35. .
|
|
349
|
-
## [Classes]
|
|
350
|
-
* The python built in help is always the most up to date docs for the library.
|
|
351
|
-
|
|
352
|
-
```py3
|
|
353
|
-
|
|
354
|
-
a@fu:~/build7/threefive$ pypy3
|
|
355
|
-
|
|
356
|
-
>>>> from threefive import Stream
|
|
357
|
-
>>>> help(Stream)
|
|
358
|
-
|
|
359
|
-
```
|
|
360
|
-
|
|
361
|
-
* [Class Structure](https://github.com/superkabuki/threefive/blob/main/classes.md)
|
|
362
|
-
* [Cue Class](https://github.com/superkabuki/threefive/blob/main/cue.md) Cue is the main SCTE-35 class to use.
|
|
363
|
-
* [Stream Class](https://github.com/superkabuki/threefive/blob/main/stream.md) The Stream class handles MPEGTS SCTE-35 streams local, Http(s), UDP, and Multicast.
|
|
364
|
-
|
|
365
523
|
___
|
|
366
524
|
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
* _( You have to unmute the audio )_
|
|
370
|
-
|
|
371
|
-
https://github.com/user-attachments/assets/a323ea90-867f-480f-a55f-e9339263e511
|
|
372
|
-
|
|
373
|
-
<BR>
|
|
374
|
-
|
|
375
|
-
* [more SRT and threefive info](srt.md)
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
* _checkout [SRTfu](https://github.com/superkabuki/srtfu)_
|
|
379
|
-
|
|
380
|
-
___
|
|
381
|
-
|
|
382
|
-
## [more]
|
|
383
|
-
|
|
384
|
-
* [Online SCTE-35 Parser](https://iodisco.com/scte35) Supporte Base64, Bytes,Hex,Int, Json, Xml, and Xml+binary.
|
|
385
|
-
|
|
386
|
-
* [Encode SCTE-35](https://github.com/superkabuki/threefive/blob/main/encode.md) Some encoding code examples.
|
|
387
|
-
___
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
## __Python3 vs Pypy3 running threefive__
|
|
391
|
-
|
|
392
|
-
* __( You have to unmute the audio )__
|
|
393
|
-
|
|
394
|
-
https://github.com/user-attachments/assets/9e88fb38-6ad0-487a-a801-90faba9d72c6
|
|
395
|
-
|
|
525
|
+
# [⇧](#-documentation-)
|
|
396
526
|
|
|
397
|
-
|
|
398
|
-
___
|
|
399
|
-
|
|
400
|
-
# Using the library
|
|
527
|
+
### [Using the library]
|
|
401
528
|
* Let me show you how easy threefive is to use.
|
|
402
529
|
|
|
403
530
|
* reading SCTE-35 xml from a file
|
|
@@ -632,153 +759,69 @@ Type "help", "copyright", "credits" or "license" for more information.
|
|
|
632
759
|
<scte35:AvailDescriptor providerAvailId="16"/>
|
|
633
760
|
</scte35:SpliceInfoSection>
|
|
634
761
|
```
|
|
762
|
+
___
|
|
635
763
|
|
|
764
|
+
# [⇧](#-documentation-)
|
|
636
765
|
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
* [
|
|
642
|
-
* [
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
* [Display raw __SCTE-35 packets__ from __video streams__](#packets)
|
|
766
|
+
### [web]
|
|
767
|
+
* [threefive SCTE-35 __Online Parser__](https://iodisco.com/scte35) __hosted on my server iodisco.com__
|
|
768
|
+
* Parse SCTE-35 in MPEGTS over HTTP, in your browser with[ Go, Wasm and Super Karate Death Car](https://bigcorp.ltd/gowasm) __hosted om my server bigcorp.ltd__
|
|
769
|
+
* Parse SCTE-35 in MPEGTS over HTTP, in your browser with[ threefive.js,javascript, and a little sed](https://bigcorp.ltd/bread) just to keep things interesting. __hosted om my server bigcorp.ltd__
|
|
770
|
+
* [ SCTE-35 __Online Parser__ powered by threefive](http://www.domus1938.com/scte35parser) _another online parser powered by threefive_ not hosted on my servers.
|
|
771
|
+
* [SCTE-35 __As a Service__](sassy.md) _if you can make an http request, you can parse SCTE-35, no install needed._
|
|
772
|
+
__hosted on my server iodisco.com__
|
|
773
|
+
___
|
|
646
774
|
|
|
647
|
-
|
|
775
|
+
# [⇧](#-documentation-)
|
|
648
776
|
|
|
649
|
-
|
|
650
|
-
*
|
|
651
|
-
* __SCTE-35 data is printed to stderr__
|
|
652
|
-
* __stdout is used when piping video__
|
|
653
|
-
* mpegts can be specified by file name or URI.
|
|
654
|
-
```rebol
|
|
655
|
-
threefive udp://@235.2.5.35:3535
|
|
656
|
-
```
|
|
657
|
-
* If a file comtains a SCTE-35 cue as a string( base64,hex,int,json,or xml+bin), redirect the file contents.
|
|
658
|
-
```rebol
|
|
777
|
+
### [XML]
|
|
778
|
+
* [XML](https://github.com/superkabuki/SCTE-35/blob/main/xml.md) __New__! _updated 05/01/2025_
|
|
659
779
|
|
|
660
|
-
|
|
780
|
+
### [HLS]
|
|
781
|
+
* [Advanced Parsing of SCTE-35 in HLS with threefive](https://github.com/superkabuki/threefive/blob/main/hls.md) All HLS SCTE-35 tags, Sidecar Files, AAC ID3 Header Timestamps, SCTE-35 filters... Who loves you baby?
|
|
661
782
|
|
|
662
|
-
|
|
783
|
+
# [⇧](#-documentation-)
|
|
784
|
+
|
|
785
|
+
### [Classes]
|
|
786
|
+
* The python built in help is always the most up to date docs for the library.
|
|
663
787
|
|
|
664
|
-
|
|
788
|
+
```py3
|
|
665
789
|
|
|
666
|
-
|
|
790
|
+
a@fu:~/build7/threefive$ pypy3
|
|
667
791
|
|
|
668
|
-
threefive
|
|
792
|
+
>>>> from threefive import Stream
|
|
793
|
+
>>>> help(Stream)
|
|
669
794
|
|
|
670
795
|
```
|
|
671
796
|
|
|
797
|
+
* [Class Structure](https://github.com/superkabuki/threefive/blob/main/classes.md)
|
|
798
|
+
* [Cue Class](https://github.com/superkabuki/threefive/blob/main/cue.md) Cue is the main SCTE-35 class to use.
|
|
799
|
+
* [Stream Class](https://github.com/superkabuki/threefive/blob/main/stream.md) The Stream class handles MPEGTS SCTE-35 streams local, Http(s), UDP, and Multicast.
|
|
672
800
|
|
|
673
|
-
| Input Type | Cli Example |
|
|
674
|
-
|------------|-------------------------------------------------------------------------------------------------------------|
|
|
675
|
-
| __Base64__ | `threefive '/DAsAAAAAyiYAP/wCgUAAAABf1+ZmQEBABECD0NVRUkAAAAAf4ABADUAAC2XQZU='`
|
|
676
|
-
| __Hex__ |`threefive 0xfc301600000000000000fff00506fed605225b0000b0b65f3b`|
|
|
677
|
-
| __HLS__ |`threefive hls https://example.com/master.m3u8` |
|
|
678
|
-
| __JSON__ |`threefive < json.json` |
|
|
679
|
-
| __Xmlbin__ | `js threefive < xmlbin.xml` |
|
|
680
|
-
|
|
681
|
-
# `Streams`
|
|
682
|
-
|
|
683
|
-
|Protocol | Cli Example |
|
|
684
|
-
|---------------|----------------------------------------------------------------------------------------------------------------------------------------------------|
|
|
685
|
-
| __File__ | `threefive video.ts` |
|
|
686
|
-
| __Http(s)__ | `threefive https://example.com/video.ts` |
|
|
687
|
-
| __Stdin__ | `threefive < video.ts` |
|
|
688
|
-
| __UDP Multicast__| `threefive udp://@235.35.3.5:9999` |
|
|
689
|
-
| __UDP Unicast__ | `threefive udp://10.0.0.7:5555` |
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
#### Outputs
|
|
693
|
-
* output type is determined by the key words __base64, bytes, hex, int, json, and xmlbin__.
|
|
694
|
-
* __json is the default__.
|
|
695
|
-
* __Any input can be returned as any output__
|
|
696
|
-
* examples __Base64 to Hex__ etc...)
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
| Output Type | Cli Example |
|
|
700
|
-
|-------------|----------------------------------------------------------|
|
|
701
|
-
|__Base 64__ | `threefive 0xfc301600000000000000fff00506fed605225b0000b0b65f3b base64 ` |
|
|
702
|
-
| __Bytes__ | `threefive 0xfc301600000000000000fff00506fed605225b0000b0b65f3b bytes` |
|
|
703
|
-
| __Hex__ | `threefive '/DAsAAAAAyiYAP/wCgUAAAABf1+ZmQEBABECD0NVRUkAAAAAf4ABADUAAC2XQZU=' hex` |
|
|
704
|
-
| __Integer__ | `threefive '/DAsAAAAAyiYAP/wCgUAAAABf1+ZmQEBABECD0NVRUkAAAAAf4ABADUAAC2XQZU=' int` |
|
|
705
|
-
| __JSON__ | `threefive 0xfc301600000000000000fff00506fed605225b0000b0b65f3b json ` |
|
|
706
|
-
| __Xml+bin__ | `threefive 0xfc301600000000000000fff00506fed605225b0000b0b65f3b xmlbin ` |`
|
|
707
|
-
___
|
|
708
|
-
#### `Iframes`
|
|
709
|
-
* Show iframes PTS in an MPEGTS video
|
|
710
|
-
|
|
711
|
-
```smalltalk
|
|
712
|
-
threefive iframes https://example.com/video.ts
|
|
713
|
-
```
|
|
714
801
|
___
|
|
715
802
|
|
|
716
|
-
|
|
717
|
-
* Print raw SCTE-35 packets from multicast mpegts video
|
|
803
|
+
# [⇧](#-documentation-)
|
|
718
804
|
|
|
719
|
-
|
|
720
|
-
threefive packets udp://@235.35.3.5:3535
|
|
721
|
-
```
|
|
722
|
-
___
|
|
723
|
-
#### `proxy`
|
|
724
|
-
* Parse a https stream and write raw video to stdout
|
|
805
|
+
### [threefive now supports SRT]
|
|
725
806
|
|
|
726
|
-
|
|
727
|
-
threefive proxy video.ts
|
|
728
|
-
```
|
|
729
|
-
___
|
|
730
|
-
#### `pts`
|
|
731
|
-
* Print PTS from mpegts video
|
|
807
|
+
* _( You have to unmute the audio )_
|
|
732
808
|
|
|
733
|
-
|
|
734
|
-
threefive pts video.ts
|
|
735
|
-
```
|
|
736
|
-
___
|
|
737
|
-
#### `sidecar`
|
|
738
|
-
* Parse a stream, write pts,write SCTE-35 Cues to sidecar.txt
|
|
809
|
+
https://github.com/user-attachments/assets/a323ea90-867f-480f-a55f-e9339263e511
|
|
739
810
|
|
|
740
|
-
|
|
741
|
-
threefive sidecar video.ts
|
|
742
|
-
```
|
|
743
|
-
___
|
|
811
|
+
<BR>
|
|
744
812
|
|
|
745
|
-
|
|
813
|
+
* [more SRT and threefive info](srt.md)
|
|
746
814
|
|
|
747
|
-
* Probe mpegts video _( kind of like ffprobe )_
|
|
748
815
|
|
|
749
|
-
|
|
750
|
-
threefive show video.ts
|
|
751
|
-
```
|
|
752
|
-
___
|
|
753
|
-
#### `version`
|
|
754
|
-
* Show version
|
|
816
|
+
* _checkout [SRTfu](https://github.com/superkabuki/srtfu)_
|
|
755
817
|
|
|
756
|
-
```smalltalk
|
|
757
|
-
threefive version
|
|
758
|
-
```
|
|
759
|
-
___
|
|
760
|
-
#### `help`
|
|
761
|
-
* Help
|
|
762
|
-
```rebol
|
|
763
|
-
threefive help
|
|
764
|
-
```
|
|
765
818
|
___
|
|
766
819
|
|
|
820
|
+
# [⇧](#-documentation-)
|
|
767
821
|
|
|
822
|
+
### [more]
|
|
768
823
|
|
|
769
|
-
|
|
770
|
-
## [iodisco.com/scte35](https://iodisco.com/scte35)
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
<svg width="100" height="100">
|
|
777
|
-
<circle cx="50" cy="50" r="40" stroke="green" stroke-width="4" fill="yellow" />
|
|
778
|
-
</svg>
|
|
779
|
-
|
|
780
|
-
<img width="258" height="256" alt="image" src="https://github.com/user-attachments/assets/642cb803-9465-408e-bb6e-03549eb22d78" />
|
|
781
|
-
|
|
824
|
+
* [Encode SCTE-35](https://github.com/superkabuki/threefive/blob/main/encode.md) Some encoding code examples.
|
|
782
825
|
___
|
|
783
|
-
|
|
784
|
-
|
|
826
|
+
|
|
827
|
+
# [⇧](#-documentation-)
|