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.2.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.2.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 True
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 False
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, keep_spec=False):
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
- # We add a namespace to the video element to avoid conflicts with other videos
116
- html_code = f"""
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
- return HTML(data=html_code)
143
+ return HTML(data=html_code)
144
+ else:
145
+ return hls_player_url
141
146
 
142
- def save(self, server, pth, keep_spec=False, encoder=None, encoder_opts=None):
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 also a trick to get VS Code to forward the port
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
- assert _check_hls_link_exists(f"http://{self._domain}:{self._port}/")
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.name}.iloc[{self._idx}]"
374
+ return f"{self._source._name}.iloc[{self._idx}]"
362
375
  else:
363
- return f"{self._source.name}[{self._idx}]"
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
@@ -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,,