vidformer 0.2.0__py3-none-any.whl → 0.3.1__py3-none-any.whl

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.
@@ -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,,