vidformer 0.2.0__py3-none-any.whl → 0.3.1__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: vidformer
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.3.1
|
4
4
|
Summary: A Python library for creating and viewing videos with vidformer.
|
5
5
|
Author-email: Dominik Winecki <dominikwinecki@gmail.com>
|
6
6
|
Requires-Python: >=3.8
|
@@ -10,6 +10,8 @@ Classifier: Operating System :: OS Independent
|
|
10
10
|
Requires-Dist: requests
|
11
11
|
Requires-Dist: msgpack
|
12
12
|
Requires-Dist: numpy
|
13
|
+
Project-URL: Homepage, https://ixlab.github.io/vidformer/
|
14
|
+
Project-URL: Issues, https://ixlab.github.io/vidformer/issues
|
13
15
|
|
14
16
|
# vidformer-py
|
15
17
|
|
@@ -0,0 +1,4 @@
|
|
1
|
+
vidformer.py,sha256=2o3jxO5Ce4-aLHXQ0DNfjZsfwC77x4BvTWjObhvbB_4,24520
|
2
|
+
vidformer-0.3.1.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
|
3
|
+
vidformer-0.3.1.dist-info/METADATA,sha256=ttaoMZ8Xg4pTZp1siqPg_QcGwS4FlD45ilBIan2rsv4,643
|
4
|
+
vidformer-0.3.1.dist-info/RECORD,,
|
vidformer.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
"""A Python library for creating and viewing videos with vidformer."""
|
2
2
|
|
3
|
-
__version__ = "0.
|
3
|
+
__version__ = "0.3.1"
|
4
4
|
|
5
5
|
import subprocess
|
6
6
|
from fractions import Fraction
|
@@ -35,12 +35,12 @@ def _check_hls_link_exists(url, max_attempts=150, delay=0.1):
|
|
35
35
|
try:
|
36
36
|
response = requests.get(url)
|
37
37
|
if response.status_code == 200:
|
38
|
-
return
|
38
|
+
return response.text.strip()
|
39
39
|
else:
|
40
40
|
time.sleep(delay)
|
41
41
|
except requests.exceptions.RequestException as e:
|
42
42
|
time.sleep(delay)
|
43
|
-
return
|
43
|
+
return None
|
44
44
|
|
45
45
|
|
46
46
|
class Spec:
|
@@ -77,10 +77,10 @@ class Spec:
|
|
77
77
|
frames.append(frame)
|
78
78
|
return {"frames": frames}, s, f
|
79
79
|
|
80
|
-
def play(self, server,
|
80
|
+
def play(self, server, method="html"):
|
81
81
|
"""Play the video live in the notebook."""
|
82
82
|
|
83
|
-
from IPython.display import HTML
|
83
|
+
from IPython.display import IFrame, HTML
|
84
84
|
|
85
85
|
spec, sources, filters = self._to_json_spec()
|
86
86
|
spec_json_bytes = json.dumps(spec).encode("utf-8")
|
@@ -108,12 +108,15 @@ class Spec:
|
|
108
108
|
print(f"Sending to server. Spec is {len(spec_obj_json_gzip_b64)} bytes")
|
109
109
|
resp = server._new(spec_obj_json_gzip_b64, sources, filters, arrays, self._fmt)
|
110
110
|
hls_video_url = resp["stream_url"]
|
111
|
+
hls_player_url = resp["player_url"]
|
111
112
|
namespace = resp["namespace"]
|
112
|
-
|
113
113
|
hls_js_url = server.hls_js_url()
|
114
114
|
|
115
|
-
|
116
|
-
|
115
|
+
if method == "iframe":
|
116
|
+
return IFrame(hls_player_url, width=1280, height=720)
|
117
|
+
if method == "html":
|
118
|
+
# We add a namespace to the video element to avoid conflicts with other videos
|
119
|
+
html_code = f"""
|
117
120
|
<!DOCTYPE html>
|
118
121
|
<html>
|
119
122
|
<head>
|
@@ -137,9 +140,11 @@ class Spec:
|
|
137
140
|
</body>
|
138
141
|
</html>
|
139
142
|
"""
|
140
|
-
|
143
|
+
return HTML(data=html_code)
|
144
|
+
else:
|
145
|
+
return hls_player_url
|
141
146
|
|
142
|
-
def save(self, server, pth,
|
147
|
+
def save(self, server, pth, encoder=None, encoder_opts=None):
|
143
148
|
"""Save the video to a file."""
|
144
149
|
|
145
150
|
assert encoder is None or type(encoder) == str
|
@@ -281,11 +286,19 @@ class YrdenServer:
|
|
281
286
|
cmd = [bin, "yrden", "--port", str(self._port)]
|
282
287
|
if _in_notebook:
|
283
288
|
# We need to print the URL in the notebook
|
284
|
-
# This is
|
289
|
+
# This is a trick to get VS Code to forward the port
|
285
290
|
cmd += ["--print-url"]
|
286
291
|
self._proc = subprocess.Popen(cmd)
|
287
292
|
|
288
|
-
|
293
|
+
version = _check_hls_link_exists(f"http://{self._domain}:{self._port}/")
|
294
|
+
if version is None:
|
295
|
+
raise Exception("Failed to connect to server")
|
296
|
+
|
297
|
+
expected_version = f"vidformer-yrden v{__version__}"
|
298
|
+
if version != expected_version:
|
299
|
+
print(
|
300
|
+
f"Warning: Expected version `{expected_version}`, got `{version}`. API may not be compatible!"
|
301
|
+
)
|
289
302
|
|
290
303
|
def _source(self, name: str, path: str, stream: int, service):
|
291
304
|
r = requests.post(
|
@@ -358,9 +371,9 @@ class SourceExpr:
|
|
358
371
|
|
359
372
|
def __repr__(self):
|
360
373
|
if self._is_iloc:
|
361
|
-
return f"{self._source.
|
374
|
+
return f"{self._source._name}.iloc[{self._idx}]"
|
362
375
|
else:
|
363
|
-
return f"{self._source.
|
376
|
+
return f"{self._source._name}[{self._idx}]"
|
364
377
|
|
365
378
|
def _to_json_spec(self):
|
366
379
|
if self._is_iloc:
|
@@ -524,6 +537,8 @@ class FilterExpr:
|
|
524
537
|
|
525
538
|
|
526
539
|
class UDF:
|
540
|
+
"""User-defined filter superclass"""
|
541
|
+
|
527
542
|
def __init__(self, name: str):
|
528
543
|
self._name = name
|
529
544
|
self._socket_path = None
|
vidformer-0.2.0.dist-info/RECORD
DELETED
@@ -1,4 +0,0 @@
|
|
1
|
-
vidformer.py,sha256=KcSMT_q66O-r0xtGujhHl0e6YMAyAovhzpsnR_ftgwY,23911
|
2
|
-
vidformer-0.2.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
|
3
|
-
vidformer-0.2.0.dist-info/METADATA,sha256=QJ8XqcazkCcn_ufPkTQzX3rQ9yTzb4_SOf_npWpnjHQ,523
|
4
|
-
vidformer-0.2.0.dist-info/RECORD,,
|
File without changes
|