threefive 3.0.91__tar.gz → 3.0.93__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.91 → threefive-3.0.93}/PKG-INFO +19 -240
- {threefive-3.0.91 → threefive-3.0.93}/README.md +18 -239
- {threefive-3.0.91 → threefive-3.0.93}/pyproject.toml +1 -2
- {threefive-3.0.91 → threefive-3.0.93}/threefive/cli.py +18 -1
- {threefive-3.0.91 → threefive-3.0.93}/threefive/descriptors.py +4 -4
- {threefive-3.0.91 → threefive-3.0.93}/threefive/hls.py +4 -2
- {threefive-3.0.91 → threefive-3.0.93}/threefive/new_reader.py +2 -2
- {threefive-3.0.91 → threefive-3.0.93}/threefive/segment.py +3 -10
- {threefive-3.0.91 → threefive-3.0.93}/threefive/stream.py +52 -126
- {threefive-3.0.91 → threefive-3.0.93}/threefive/version.py +1 -1
- {threefive-3.0.91 → threefive-3.0.93}/threefive.egg-info/PKG-INFO +19 -240
- {threefive-3.0.91 → threefive-3.0.93}/threefive.egg-info/entry_points.txt +0 -1
- {threefive-3.0.91 → threefive-3.0.93}/LICENSE +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/setup.cfg +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/__init__.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/aac.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/base.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/bitn.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/bump.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/commands.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/crc.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/crctable.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/cue.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/encode.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/gums.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/hlsprofile.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/hlstags.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/iframes.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/packetdata.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/pmt.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/section.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/segmentation.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/sixfix.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/speedo.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/streamtypes.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/stuff.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/superkabuki.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/throttle.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/udp.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/upids.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/uxp.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive/xml.py +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive.egg-info/SOURCES.txt +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/threefive.egg-info/dependency_links.txt +0 -0
- {threefive-3.0.91 → threefive-3.0.93}/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.93
|
|
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
|
|
@@ -17,42 +17,35 @@ Description-Content-Type: text/markdown
|
|
|
17
17
|
License-File: LICENSE
|
|
18
18
|
Dynamic: license-file
|
|
19
19
|
|
|
20
|
-
#
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
<img width="1000" height="748" alt="100_0033" src="https://github.com/user-attachments/assets/dc967211-35d4-4aa5-af75-ce6099207946" />
|
|
24
|
-
|
|
25
|
-
## https://github.com/superkabuki/threefive
|
|
26
|
-
|
|
27
|
-
## threefive is the only tool that supports SCTE-35-1 and SCTE-35-2
|
|
28
|
-
|
|
20
|
+
# threefive is the highest rated SCTE-35 tool. Ever.
|
|
29
21
|
* __Decodes SCTE-35__ from `MPEGTS`✔ `Base64`✔ `Bytes`✔ `DASH`✔ `Hex` ✔ `HLS`✔ `Integers`✔ `JSON`✔ `XML`✔ `XML+Binary`✔
|
|
30
22
|
* __Encodes SCTE-35__ to `MPEGTS`✔ `Base64`✔ `Bytes`✔ `Hex`✔ `Integers`✔ `JSON`✔ `XML`✔ `XML+Binary`✔
|
|
31
23
|
___
|
|
32
24
|
|
|
33
25
|
## [ News ]
|
|
34
|
-
|
|
35
|
-
*
|
|
26
|
+
* __threefive__ now has support for __SCTE-35-2. Event Descriptors__ and __Property types__ from the recently published __2026 SCTE-35-2 Specification__.
|
|
27
|
+
* __threefive v3.0.93__ now supports HLS autodetection in the cli.
|
|
36
28
|
___
|
|
37
29
|
|
|
38
|
-
## [ Latest version is v3.0.
|
|
30
|
+
## [ Latest threefive version is v3.0.93 ] _Released 06/11/2026_
|
|
31
|
+
___
|
|
32
|
+
## [[ Examples ]](https://github.com/superkabuki/threefive_is_scte35/blob/main/examples)
|
|
33
|
+
___
|
|
34
|
+
## [ [ Tip of the Week ] ](totw.md)
|
|
39
35
|
___
|
|
40
|
-
|
|
41
|
-
|
|
42
36
|
# [ Documentation ]
|
|
43
37
|
#### Need to inject SCTE-35 into HLS? [X9k3.](https://github.com/superkabuki/x9k3)
|
|
44
38
|
* [__web based SCTE-35 tools__](#web) - threefive and friends over http.
|
|
45
39
|
* [__install__](#install)
|
|
46
|
-
* [__quick start__](
|
|
40
|
+
* [__quick start__](quickstart.md)
|
|
47
41
|
* __command line tools__
|
|
48
42
|
* [ __threefive__](#cli) _decode SCTE-35 on the command line_
|
|
49
43
|
* [__scte35bump__](#scte35bump) _adjust SCTE-35 PTS in MPEGTS streams_
|
|
50
44
|
* [__scte35fix__](#scte35fix) _ffmpeg changes scte-35 streams into bin data, scte35fix changes them back._
|
|
51
|
-
* [__scte35hls__](#scte35hls) _scte35hls parses hls and ABR hls for scte-35. All hls scte-35 tags are supported__
|
|
52
45
|
* [__scte35inject__](scte35inject.md) _scte35inject inject scte-35 into mpegts._
|
|
53
46
|
* [__gums__](#gums) _gums is a multicast sender(server) for video_
|
|
54
47
|
* __library__
|
|
55
|
-
* [__Using the threefive.Cue class__](
|
|
48
|
+
* [__Using the threefive.Cue class__](lib.md)
|
|
56
49
|
* [__Using the threefive library__](#using-the-library) _decode SCTE-35 with less than ten lines of code_
|
|
57
50
|
* * [threefive __Classes__](#classes) _threefive is OO, made to subclass_
|
|
58
51
|
* [__Cue__ Class](https://github.com/superkabuki/threefive/blob/main/cue.md) _this class you'll use often_
|
|
@@ -106,225 +99,17 @@ make install py3=python3.14
|
|
|
106
99
|
# [⇧](#-documentation-)
|
|
107
100
|
___
|
|
108
101
|
|
|
109
|
-
# [⇧](#-documentation-)
|
|
110
|
-
|
|
111
|
-
## [Quick Start]
|
|
112
|
-
<i>These examples show how to parse SCTE-35<BR>
|
|
113
|
-
from various SCTE-35 data formats, with both the cli and with the library.</i>
|
|
114
|
-
<details><summary>MPEGTS</summary>
|
|
115
|
-
|
|
116
|
-
* MPEGTS streams can be Files, Http(s), Multicast,SRT, UDP Unicast, or stdin.
|
|
117
|
-
* __cli__
|
|
118
|
-
|
|
119
|
-
```js
|
|
120
|
-
threefive https://example.com/video.ts
|
|
121
|
-
```
|
|
122
|
-
* wildcards work too.
|
|
123
|
-
```js
|
|
124
|
-
threefive /mpegts/*.ts
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
* __lib__
|
|
128
|
-
```py3
|
|
129
|
-
|
|
130
|
-
from threefive import Stream
|
|
131
|
-
stream = Stream('https://example.com/video.ts')
|
|
132
|
-
stream.decode()
|
|
133
|
-
|
|
134
|
-
```
|
|
135
|
-
</details>
|
|
136
|
-
<details><summary>Base64</summary>
|
|
137
|
-
|
|
138
|
-
* __cli__
|
|
139
|
-
```js
|
|
140
|
-
threefive '/DAsAAAAAyiYAP/wCgUAAAABf1+ZmQEBABECD0NVRUkAAAAAf4ABADUAAC2XQZU='
|
|
141
|
-
```
|
|
142
|
-
* __lib__
|
|
143
|
-
```py3
|
|
144
|
-
|
|
145
|
-
from threefive import Cue
|
|
146
|
-
data = '/DAsAAAAAyiYAP/wCgUAAAABf1+ZmQEBABECD0NVRUkAAAAAf4ABADUAAC2XQZU='
|
|
147
|
-
cue=Cue(data)
|
|
148
|
-
cue.show()
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
</details>
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
<details><summary>Bytes</summary>
|
|
155
|
-
|
|
156
|
-
* __cli__
|
|
157
|
-
* Bytes don't work on the cli
|
|
158
|
-
|
|
159
|
-
* __lib__
|
|
160
|
-
```py3
|
|
161
|
-
|
|
162
|
-
from threefive import Cue
|
|
163
|
-
data = b'\xfc0\x16\x00\x00\x00\x00\x00\x00\x00\xff\xf0\x05\x06\xfe\x00\xc0D\xa0\x00\x00\x00\xb5k\x88'
|
|
164
|
-
cue=Cue(data)
|
|
165
|
-
cue.show()
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
</details>
|
|
169
|
-
|
|
170
|
-
<details><summary>Hex</summary>
|
|
171
|
-
|
|
172
|
-
* Can be a hex literal or hex string or bytes.
|
|
173
|
-
|
|
174
|
-
* __cli__
|
|
175
|
-
```js
|
|
176
|
-
threefive 0xfc301600000000000000fff00506fed605225b0000b0b65f3b
|
|
177
|
-
```
|
|
178
|
-
* __lib__
|
|
179
|
-
```py3
|
|
180
|
-
|
|
181
|
-
from threefive import Cue
|
|
182
|
-
data = 0xfc301600000000000000fff00506fed605225b0000b0b65f3b
|
|
183
|
-
cue=Cue(data)
|
|
184
|
-
cue.show()
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
</details>
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
<details><summary>Int</summary>
|
|
191
|
-
|
|
192
|
-
* Can be a literal integer or string or bytes.
|
|
193
|
-
|
|
194
|
-
* __cli__
|
|
195
|
-
```js
|
|
196
|
-
threefive 1583008701074197245727019716796221243043855984942057168199483
|
|
197
|
-
```
|
|
198
|
-
* __lib__
|
|
199
|
-
```py3
|
|
200
|
-
|
|
201
|
-
from threefive import Cue
|
|
202
|
-
data = 1583008701074197245727019716796221243043855984942057168199483
|
|
203
|
-
cue=Cue(data)
|
|
204
|
-
cue.show()
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
</details>
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
<details><summary>JSON</summary>
|
|
212
|
-
|
|
213
|
-
* __cli__
|
|
214
|
-
* put JSON SCTE-35 in a file and redirect it into threefive
|
|
215
|
-
* cat files to threefive works too.
|
|
216
|
-
* echo JSON or type JSON on the command line.
|
|
217
|
-
|
|
218
|
-
```js
|
|
219
|
-
threefive < json.json
|
|
220
|
-
```
|
|
221
|
-
* __lib__
|
|
222
|
-
|
|
223
|
-
```py3
|
|
224
|
-
|
|
225
|
-
from threefive import Cue
|
|
226
|
-
data = '''{
|
|
227
|
-
"info_section": {
|
|
228
|
-
"table_id": "0xfc",
|
|
229
|
-
"section_syntax_indicator": false,
|
|
230
|
-
"private": false,
|
|
231
|
-
"sap_type": "0x03",
|
|
232
|
-
"sap_details": "No Sap Type",
|
|
233
|
-
"section_length": 22,
|
|
234
|
-
"protocol_version": 0,
|
|
235
|
-
"encrypted_packet": false,
|
|
236
|
-
"encryption_algorithm": 0,
|
|
237
|
-
"pts_adjustment": 0.0,
|
|
238
|
-
"cw_index": "0x00",
|
|
239
|
-
"tier": "0x0fff",
|
|
240
|
-
"splice_command_length": 5,
|
|
241
|
-
"splice_command_type": 6,
|
|
242
|
-
"descriptor_loop_length": 0,
|
|
243
|
-
"crc": "0xb56b88"
|
|
244
|
-
},
|
|
245
|
-
"command": {
|
|
246
|
-
"command_length": 5,
|
|
247
|
-
"command_type": 6,
|
|
248
|
-
"name": "Time Signal",
|
|
249
|
-
"time_specified_flag": true,
|
|
250
|
-
"pts_time": 140.005333
|
|
251
|
-
},
|
|
252
|
-
"descriptors": []
|
|
253
|
-
}
|
|
254
|
-
'''
|
|
255
|
-
cue=Cue(data)
|
|
256
|
-
cue.show()
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
</details>
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
<details><summary><u>Xml</u></summary>
|
|
263
|
-
|
|
264
|
-
* __cli__
|
|
265
|
-
* put xml SCTE-35 in a [file](xml.xml) and redirect it into threefive
|
|
266
|
-
* cat files to threefive works too.
|
|
267
|
-
* echo xml or type xml on the command line.
|
|
268
|
-
|
|
269
|
-
```js
|
|
270
|
-
threefive < xml.xml
|
|
271
|
-
```
|
|
272
|
-
* __lib__
|
|
273
|
-
```py3
|
|
274
|
-
from threefive import Cue
|
|
275
|
-
data = '''
|
|
276
|
-
<scte35:SpliceInfoSection xmlns:scte35="https://scte.org/schemas/35"
|
|
277
|
-
ptsAdjustment="0" protocolVersion="0" sapType="3" tier="4095">
|
|
278
|
-
<scte35:TimeSignal>
|
|
279
|
-
<scte35:SpliceTime ptsTime="12600480"/>
|
|
280
|
-
</scte35:TimeSignal>
|
|
281
|
-
</scte35:SpliceInfoSection>
|
|
282
|
-
'''
|
|
283
|
-
cue=Cue(data)
|
|
284
|
-
|
|
285
|
-
cue.show()
|
|
286
|
-
```
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
</details>
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
<details><summary>Xml+binary</summary>
|
|
294
|
-
|
|
295
|
-
* __cli__
|
|
296
|
-
* write xml+binary to a [file](xmlbin.xml) and redirect it to threefive
|
|
297
|
-
* cat files to threefive works too.
|
|
298
|
-
* echo xml+binary or type xml+binary on the command line.
|
|
299
|
-
```js
|
|
300
|
-
threefive < xmlbin.xml
|
|
301
|
-
```
|
|
302
|
-
* __lib__
|
|
303
|
-
```py3
|
|
304
|
-
|
|
305
|
-
from threefive import Cue
|
|
306
|
-
data = '''<scte35:Signal xmlns:scte35="https://scte.org/schemas/35">
|
|
307
|
-
<scte35:Binary>/DAWAAAAAAAAAP/wBQb+AMBEoAAAALVriA==</scte35:Binary>
|
|
308
|
-
</scte35:Signal>
|
|
309
|
-
'''
|
|
310
|
-
cue=Cue(data)
|
|
311
|
-
cue.show()
|
|
312
|
-
```
|
|
313
|
-
|
|
314
|
-
</details>
|
|
315
|
-
|
|
316
|
-
</samp>
|
|
317
|
-
|
|
318
|
-
___
|
|
319
|
-
|
|
320
|
-
# [⇧](#-documentation-)
|
|
321
|
-
|
|
322
102
|
### [CLI]
|
|
323
103
|
The threefive cli tool is able to parse SCTE-35 from MPEGTS Streams,Base64,Hex,Integers,JSON XML,and XMLBinary.
|
|
324
104
|
The format is auto-detected.
|
|
325
105
|
|
|
326
106
|
# [⇧](#-documentation-)
|
|
327
107
|
|
|
108
|
+
#### [ Parse SCTE-35 from HLS with threefive ]
|
|
109
|
+
```js
|
|
110
|
+
threefive https://example.com/master.m3u8
|
|
111
|
+
```
|
|
112
|
+
|
|
328
113
|
#### [ Parse SCTE-35 from MPEGTS ]
|
|
329
114
|
SCTE-35 can be parsed from MPEGTS over a variety of protocols.
|
|
330
115
|
* __SCTE-35 Input__: MPEGTS
|
|
@@ -447,19 +232,13 @@ gums is part of threefive.
|
|
|
447
232
|
|
|
448
233
|
# [⇧](#-documentation-)
|
|
449
234
|
|
|
450
|
-
####
|
|
235
|
+
#### HLS
|
|
451
236
|
|
|
452
237
|
* parse HLS for SCTE-35. Supports all HLS SCTE-35 tags.
|
|
453
238
|
|
|
454
239
|
```js
|
|
455
|
-
$
|
|
456
|
-
|
|
457
|
-
[ threefive hls ]
|
|
458
|
-
|
|
459
|
-
[ Help ]
|
|
460
|
-
|
|
461
|
-
To display this help:
|
|
462
|
-
scte35hls help
|
|
240
|
+
$ threefive hls help
|
|
241
|
+
```
|
|
463
242
|
|
|
464
243
|
[ Input ]
|
|
465
244
|
threefive hls takes an m3u8 URI as input.
|
|
@@ -1,39 +1,32 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
<img width="1000" height="748" alt="100_0033" src="https://github.com/user-attachments/assets/dc967211-35d4-4aa5-af75-ce6099207946" />
|
|
5
|
-
|
|
6
|
-
## https://github.com/superkabuki/threefive
|
|
7
|
-
|
|
8
|
-
## threefive is the only tool that supports SCTE-35-1 and SCTE-35-2
|
|
9
|
-
|
|
1
|
+
# threefive is the highest rated SCTE-35 tool. Ever.
|
|
10
2
|
* __Decodes SCTE-35__ from `MPEGTS`✔ `Base64`✔ `Bytes`✔ `DASH`✔ `Hex` ✔ `HLS`✔ `Integers`✔ `JSON`✔ `XML`✔ `XML+Binary`✔
|
|
11
3
|
* __Encodes SCTE-35__ to `MPEGTS`✔ `Base64`✔ `Bytes`✔ `Hex`✔ `Integers`✔ `JSON`✔ `XML`✔ `XML+Binary`✔
|
|
12
4
|
___
|
|
13
5
|
|
|
14
6
|
## [ News ]
|
|
15
|
-
|
|
16
|
-
*
|
|
7
|
+
* __threefive__ now has support for __SCTE-35-2. Event Descriptors__ and __Property types__ from the recently published __2026 SCTE-35-2 Specification__.
|
|
8
|
+
* __threefive v3.0.93__ now supports HLS autodetection in the cli.
|
|
17
9
|
___
|
|
18
10
|
|
|
19
|
-
## [ Latest version is v3.0.
|
|
11
|
+
## [ Latest threefive version is v3.0.93 ] _Released 06/11/2026_
|
|
12
|
+
___
|
|
13
|
+
## [[ Examples ]](https://github.com/superkabuki/threefive_is_scte35/blob/main/examples)
|
|
14
|
+
___
|
|
15
|
+
## [ [ Tip of the Week ] ](totw.md)
|
|
20
16
|
___
|
|
21
|
-
|
|
22
|
-
|
|
23
17
|
# [ Documentation ]
|
|
24
18
|
#### Need to inject SCTE-35 into HLS? [X9k3.](https://github.com/superkabuki/x9k3)
|
|
25
19
|
* [__web based SCTE-35 tools__](#web) - threefive and friends over http.
|
|
26
20
|
* [__install__](#install)
|
|
27
|
-
* [__quick start__](
|
|
21
|
+
* [__quick start__](quickstart.md)
|
|
28
22
|
* __command line tools__
|
|
29
23
|
* [ __threefive__](#cli) _decode SCTE-35 on the command line_
|
|
30
24
|
* [__scte35bump__](#scte35bump) _adjust SCTE-35 PTS in MPEGTS streams_
|
|
31
25
|
* [__scte35fix__](#scte35fix) _ffmpeg changes scte-35 streams into bin data, scte35fix changes them back._
|
|
32
|
-
* [__scte35hls__](#scte35hls) _scte35hls parses hls and ABR hls for scte-35. All hls scte-35 tags are supported__
|
|
33
26
|
* [__scte35inject__](scte35inject.md) _scte35inject inject scte-35 into mpegts._
|
|
34
27
|
* [__gums__](#gums) _gums is a multicast sender(server) for video_
|
|
35
28
|
* __library__
|
|
36
|
-
* [__Using the threefive.Cue class__](
|
|
29
|
+
* [__Using the threefive.Cue class__](lib.md)
|
|
37
30
|
* [__Using the threefive library__](#using-the-library) _decode SCTE-35 with less than ten lines of code_
|
|
38
31
|
* * [threefive __Classes__](#classes) _threefive is OO, made to subclass_
|
|
39
32
|
* [__Cue__ Class](https://github.com/superkabuki/threefive/blob/main/cue.md) _this class you'll use often_
|
|
@@ -87,225 +80,17 @@ make install py3=python3.14
|
|
|
87
80
|
# [⇧](#-documentation-)
|
|
88
81
|
___
|
|
89
82
|
|
|
90
|
-
# [⇧](#-documentation-)
|
|
91
|
-
|
|
92
|
-
## [Quick Start]
|
|
93
|
-
<i>These examples show how to parse SCTE-35<BR>
|
|
94
|
-
from various SCTE-35 data formats, with both the cli and with the library.</i>
|
|
95
|
-
<details><summary>MPEGTS</summary>
|
|
96
|
-
|
|
97
|
-
* MPEGTS streams can be Files, Http(s), Multicast,SRT, UDP Unicast, or stdin.
|
|
98
|
-
* __cli__
|
|
99
|
-
|
|
100
|
-
```js
|
|
101
|
-
threefive https://example.com/video.ts
|
|
102
|
-
```
|
|
103
|
-
* wildcards work too.
|
|
104
|
-
```js
|
|
105
|
-
threefive /mpegts/*.ts
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
* __lib__
|
|
109
|
-
```py3
|
|
110
|
-
|
|
111
|
-
from threefive import Stream
|
|
112
|
-
stream = Stream('https://example.com/video.ts')
|
|
113
|
-
stream.decode()
|
|
114
|
-
|
|
115
|
-
```
|
|
116
|
-
</details>
|
|
117
|
-
<details><summary>Base64</summary>
|
|
118
|
-
|
|
119
|
-
* __cli__
|
|
120
|
-
```js
|
|
121
|
-
threefive '/DAsAAAAAyiYAP/wCgUAAAABf1+ZmQEBABECD0NVRUkAAAAAf4ABADUAAC2XQZU='
|
|
122
|
-
```
|
|
123
|
-
* __lib__
|
|
124
|
-
```py3
|
|
125
|
-
|
|
126
|
-
from threefive import Cue
|
|
127
|
-
data = '/DAsAAAAAyiYAP/wCgUAAAABf1+ZmQEBABECD0NVRUkAAAAAf4ABADUAAC2XQZU='
|
|
128
|
-
cue=Cue(data)
|
|
129
|
-
cue.show()
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
</details>
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
<details><summary>Bytes</summary>
|
|
136
|
-
|
|
137
|
-
* __cli__
|
|
138
|
-
* Bytes don't work on the cli
|
|
139
|
-
|
|
140
|
-
* __lib__
|
|
141
|
-
```py3
|
|
142
|
-
|
|
143
|
-
from threefive import Cue
|
|
144
|
-
data = b'\xfc0\x16\x00\x00\x00\x00\x00\x00\x00\xff\xf0\x05\x06\xfe\x00\xc0D\xa0\x00\x00\x00\xb5k\x88'
|
|
145
|
-
cue=Cue(data)
|
|
146
|
-
cue.show()
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
</details>
|
|
150
|
-
|
|
151
|
-
<details><summary>Hex</summary>
|
|
152
|
-
|
|
153
|
-
* Can be a hex literal or hex string or bytes.
|
|
154
|
-
|
|
155
|
-
* __cli__
|
|
156
|
-
```js
|
|
157
|
-
threefive 0xfc301600000000000000fff00506fed605225b0000b0b65f3b
|
|
158
|
-
```
|
|
159
|
-
* __lib__
|
|
160
|
-
```py3
|
|
161
|
-
|
|
162
|
-
from threefive import Cue
|
|
163
|
-
data = 0xfc301600000000000000fff00506fed605225b0000b0b65f3b
|
|
164
|
-
cue=Cue(data)
|
|
165
|
-
cue.show()
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
</details>
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
<details><summary>Int</summary>
|
|
172
|
-
|
|
173
|
-
* Can be a literal integer or string or bytes.
|
|
174
|
-
|
|
175
|
-
* __cli__
|
|
176
|
-
```js
|
|
177
|
-
threefive 1583008701074197245727019716796221243043855984942057168199483
|
|
178
|
-
```
|
|
179
|
-
* __lib__
|
|
180
|
-
```py3
|
|
181
|
-
|
|
182
|
-
from threefive import Cue
|
|
183
|
-
data = 1583008701074197245727019716796221243043855984942057168199483
|
|
184
|
-
cue=Cue(data)
|
|
185
|
-
cue.show()
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
</details>
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
<details><summary>JSON</summary>
|
|
193
|
-
|
|
194
|
-
* __cli__
|
|
195
|
-
* put JSON SCTE-35 in a file and redirect it into threefive
|
|
196
|
-
* cat files to threefive works too.
|
|
197
|
-
* echo JSON or type JSON on the command line.
|
|
198
|
-
|
|
199
|
-
```js
|
|
200
|
-
threefive < json.json
|
|
201
|
-
```
|
|
202
|
-
* __lib__
|
|
203
|
-
|
|
204
|
-
```py3
|
|
205
|
-
|
|
206
|
-
from threefive import Cue
|
|
207
|
-
data = '''{
|
|
208
|
-
"info_section": {
|
|
209
|
-
"table_id": "0xfc",
|
|
210
|
-
"section_syntax_indicator": false,
|
|
211
|
-
"private": false,
|
|
212
|
-
"sap_type": "0x03",
|
|
213
|
-
"sap_details": "No Sap Type",
|
|
214
|
-
"section_length": 22,
|
|
215
|
-
"protocol_version": 0,
|
|
216
|
-
"encrypted_packet": false,
|
|
217
|
-
"encryption_algorithm": 0,
|
|
218
|
-
"pts_adjustment": 0.0,
|
|
219
|
-
"cw_index": "0x00",
|
|
220
|
-
"tier": "0x0fff",
|
|
221
|
-
"splice_command_length": 5,
|
|
222
|
-
"splice_command_type": 6,
|
|
223
|
-
"descriptor_loop_length": 0,
|
|
224
|
-
"crc": "0xb56b88"
|
|
225
|
-
},
|
|
226
|
-
"command": {
|
|
227
|
-
"command_length": 5,
|
|
228
|
-
"command_type": 6,
|
|
229
|
-
"name": "Time Signal",
|
|
230
|
-
"time_specified_flag": true,
|
|
231
|
-
"pts_time": 140.005333
|
|
232
|
-
},
|
|
233
|
-
"descriptors": []
|
|
234
|
-
}
|
|
235
|
-
'''
|
|
236
|
-
cue=Cue(data)
|
|
237
|
-
cue.show()
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
</details>
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
<details><summary><u>Xml</u></summary>
|
|
244
|
-
|
|
245
|
-
* __cli__
|
|
246
|
-
* put xml SCTE-35 in a [file](xml.xml) and redirect it into threefive
|
|
247
|
-
* cat files to threefive works too.
|
|
248
|
-
* echo xml or type xml on the command line.
|
|
249
|
-
|
|
250
|
-
```js
|
|
251
|
-
threefive < xml.xml
|
|
252
|
-
```
|
|
253
|
-
* __lib__
|
|
254
|
-
```py3
|
|
255
|
-
from threefive import Cue
|
|
256
|
-
data = '''
|
|
257
|
-
<scte35:SpliceInfoSection xmlns:scte35="https://scte.org/schemas/35"
|
|
258
|
-
ptsAdjustment="0" protocolVersion="0" sapType="3" tier="4095">
|
|
259
|
-
<scte35:TimeSignal>
|
|
260
|
-
<scte35:SpliceTime ptsTime="12600480"/>
|
|
261
|
-
</scte35:TimeSignal>
|
|
262
|
-
</scte35:SpliceInfoSection>
|
|
263
|
-
'''
|
|
264
|
-
cue=Cue(data)
|
|
265
|
-
|
|
266
|
-
cue.show()
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
</details>
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
<details><summary>Xml+binary</summary>
|
|
275
|
-
|
|
276
|
-
* __cli__
|
|
277
|
-
* write xml+binary to a [file](xmlbin.xml) and redirect it to threefive
|
|
278
|
-
* cat files to threefive works too.
|
|
279
|
-
* echo xml+binary or type xml+binary on the command line.
|
|
280
|
-
```js
|
|
281
|
-
threefive < xmlbin.xml
|
|
282
|
-
```
|
|
283
|
-
* __lib__
|
|
284
|
-
```py3
|
|
285
|
-
|
|
286
|
-
from threefive import Cue
|
|
287
|
-
data = '''<scte35:Signal xmlns:scte35="https://scte.org/schemas/35">
|
|
288
|
-
<scte35:Binary>/DAWAAAAAAAAAP/wBQb+AMBEoAAAALVriA==</scte35:Binary>
|
|
289
|
-
</scte35:Signal>
|
|
290
|
-
'''
|
|
291
|
-
cue=Cue(data)
|
|
292
|
-
cue.show()
|
|
293
|
-
```
|
|
294
|
-
|
|
295
|
-
</details>
|
|
296
|
-
|
|
297
|
-
</samp>
|
|
298
|
-
|
|
299
|
-
___
|
|
300
|
-
|
|
301
|
-
# [⇧](#-documentation-)
|
|
302
|
-
|
|
303
83
|
### [CLI]
|
|
304
84
|
The threefive cli tool is able to parse SCTE-35 from MPEGTS Streams,Base64,Hex,Integers,JSON XML,and XMLBinary.
|
|
305
85
|
The format is auto-detected.
|
|
306
86
|
|
|
307
87
|
# [⇧](#-documentation-)
|
|
308
88
|
|
|
89
|
+
#### [ Parse SCTE-35 from HLS with threefive ]
|
|
90
|
+
```js
|
|
91
|
+
threefive https://example.com/master.m3u8
|
|
92
|
+
```
|
|
93
|
+
|
|
309
94
|
#### [ Parse SCTE-35 from MPEGTS ]
|
|
310
95
|
SCTE-35 can be parsed from MPEGTS over a variety of protocols.
|
|
311
96
|
* __SCTE-35 Input__: MPEGTS
|
|
@@ -428,19 +213,13 @@ gums is part of threefive.
|
|
|
428
213
|
|
|
429
214
|
# [⇧](#-documentation-)
|
|
430
215
|
|
|
431
|
-
####
|
|
216
|
+
#### HLS
|
|
432
217
|
|
|
433
218
|
* parse HLS for SCTE-35. Supports all HLS SCTE-35 tags.
|
|
434
219
|
|
|
435
220
|
```js
|
|
436
|
-
$
|
|
437
|
-
|
|
438
|
-
[ threefive hls ]
|
|
439
|
-
|
|
440
|
-
[ Help ]
|
|
441
|
-
|
|
442
|
-
To display this help:
|
|
443
|
-
scte35hls help
|
|
221
|
+
$ threefive hls help
|
|
222
|
+
```
|
|
444
223
|
|
|
445
224
|
[ Input ]
|
|
446
225
|
threefive hls takes an m3u8 URI as input.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
|
|
2
2
|
[project]
|
|
3
3
|
name = "threefive"
|
|
4
|
-
version = "3.0.
|
|
4
|
+
version = "3.0.93"
|
|
5
5
|
authors = [
|
|
6
6
|
{ name="AdrianofDoom", email="spam@iodisco.com" },
|
|
7
7
|
]
|
|
@@ -31,7 +31,6 @@ Issues = "https://github.com/superkabuki/threefive/issues"
|
|
|
31
31
|
[project.scripts]
|
|
32
32
|
scte35bump = "threefive.bump:cli"
|
|
33
33
|
gums = "threefive.gums:cli"
|
|
34
|
-
scte35hls = "threefive.hls:cli"
|
|
35
34
|
scte35fix = "threefive.sixfix:cli"
|
|
36
35
|
scte35inject = "threefive.superkabuki:cli"
|
|
37
36
|
threefive = "threefive.cli:threefivecli"
|
|
@@ -82,7 +82,7 @@ def done():
|
|
|
82
82
|
done prints the threefive version, interpreter version,
|
|
83
83
|
and calls sys.exit()
|
|
84
84
|
"""
|
|
85
|
-
|
|
85
|
+
print2(f"# threefive: {version} on python: {sys.version}")
|
|
86
86
|
sys.exit()
|
|
87
87
|
|
|
88
88
|
|
|
@@ -441,6 +441,22 @@ def dashdashhelp():
|
|
|
441
441
|
sys.argv[idx] = "--help"
|
|
442
442
|
|
|
443
443
|
|
|
444
|
+
def chk_hls():
|
|
445
|
+
"""
|
|
446
|
+
chk_hls check if an m3u8 has
|
|
447
|
+
been passed on the command line
|
|
448
|
+
and call the hlscli if it is an m3u8
|
|
449
|
+
"""
|
|
450
|
+
try:
|
|
451
|
+
this = sys.argv[1]
|
|
452
|
+
packet = reader(this).read(188)
|
|
453
|
+
if b"#EXTM3U" in packet :
|
|
454
|
+
hlscli()
|
|
455
|
+
done()
|
|
456
|
+
except:
|
|
457
|
+
pass
|
|
458
|
+
|
|
459
|
+
|
|
444
460
|
def threefivecli():
|
|
445
461
|
"""
|
|
446
462
|
threefivecli check all the maps
|
|
@@ -453,6 +469,7 @@ def threefivecli():
|
|
|
453
469
|
|
|
454
470
|
"""
|
|
455
471
|
dashdashhelp()
|
|
472
|
+
chk_hls()
|
|
456
473
|
chk_print_map()
|
|
457
474
|
chk_mpegts_map()
|
|
458
475
|
chk_funk_map()
|
|
@@ -626,7 +626,7 @@ class EventDescriptor(SpliceDescriptor):
|
|
|
626
626
|
self.elapsed = None
|
|
627
627
|
self.remain = None
|
|
628
628
|
self.property_count = 0
|
|
629
|
-
self.
|
|
629
|
+
self.properties = []
|
|
630
630
|
|
|
631
631
|
def decode(self, bitbin=None):
|
|
632
632
|
"""
|
|
@@ -646,7 +646,7 @@ class EventDescriptor(SpliceDescriptor):
|
|
|
646
646
|
while pc:
|
|
647
647
|
prop = Property()
|
|
648
648
|
prop.decode(bitbin)
|
|
649
|
-
self.
|
|
649
|
+
self.properties.append(prop)
|
|
650
650
|
pc -= 1
|
|
651
651
|
|
|
652
652
|
def encode(self, nbin=None):
|
|
@@ -664,7 +664,7 @@ class EventDescriptor(SpliceDescriptor):
|
|
|
664
664
|
nbin.add_int(elapsed, 40)
|
|
665
665
|
nbin.add_int(remain, 40)
|
|
666
666
|
nbin.add_int(len(self.properties), 8)
|
|
667
|
-
for prop in self.
|
|
667
|
+
for prop in self.properties:
|
|
668
668
|
prop.encode(nbin)
|
|
669
669
|
return nbin.bites
|
|
670
670
|
|
|
@@ -683,7 +683,7 @@ class EventDescriptor(SpliceDescriptor):
|
|
|
683
683
|
"remain": int(self.remain * 10000),
|
|
684
684
|
}
|
|
685
685
|
ed = Node("EventDescriptor", attrs=attrs, ns=ns)
|
|
686
|
-
for prop in self.
|
|
686
|
+
for prop in self.properties:
|
|
687
687
|
ed.addchild(prop.xml())
|
|
688
688
|
return ed
|
|
689
689
|
|