This release is a pre-release and may not be stable for production use.
hyperdeckwire
hyperdeckwire is a small, dependency-free Python library for driving
Blackmagic HyperDeck Studio recorders over the network. It speaks the
HyperDeck Ethernet Protocol (line-oriented text over TCP 9993) for transport
control, clip listing and timeline editing, and uses the deck's built-in FTP
server (port 21) to push new clips onto its storage. It targets the
9993 + FTP combination on purpose: the HTTP REST API that arrived in
firmware 8.x is only available on the Plus/Pro/HDR/Shuttle models, while every
networked HyperDeck, including the Studio HD Mini, offers these two.
Features
- Blocking, single-socket
Hyperdeckclient with an explicit connect/close lifecycle and context-manager support. - Read commands:
device_info,remote_info,slot_info,transport_info,configuration,disk_list,clips_get,clips_count. - Write commands:
play(loop, single clip, speed, clip id),pause,stop,goto_clip,clips_add,clips_remove,clips_clear,slot_select,remote_enable,set_configuration,ping. - Typed
ClipandResponsedataclasses; protocol errors raiseHyperdeckErrorwith the deck's code and text. - Asynchronous 5xx notifications are filtered out of blocking requests and can be read explicitly.
upload_clipFTP helper with storage-volume auto-detection, anonymous-login fallback, progress callback and throughput reporting.- Pure standard library; a
socket_factoryhook andftplibmonkeypatching make the whole suite runnable without hardware.
Install
pip install "git+https://github.com/lucas-romanenko/hyperdeckwire.git@v0.1.0.dev0"
Python 3.10 or newer. To run the tests from a checkout:
pip install ".[test]"
python -m pytest
Usage
from hyperdeckwire import Hyperdeck, HyperdeckError, upload_clip
# Push a clip onto the deck's active storage volume.
result = upload_clip('192.0.2.11', '/local/path/intro.mp4')
print(f'{result.name}: {result.throughput_mb_s:.1f} MB/s into slot {result.slot_dir}')
# Cue it and loop it.
with Hyperdeck('192.0.2.11') as hd:
print(hd.model, hd.protocol_version)
for clip in hd.disk_list():
print(clip.clip_id, clip.name, clip.duration)
hd.stop()
hd.clips_clear()
try:
hd.clips_add('intro.mp4')
except HyperdeckError as e:
raise SystemExit(f'deck refused the clip: {e}')
hd.play(loop=True, single_clip=True)
The full command reference, dataclass fields and error-code table are in docs/API.md.
Protocol notes
The Ethernet Protocol itself is documented by Blackmagic in
HyperDeckEthernetProtocol.pdf (December 2024 revision). The points below
are behaviour the library relies on that the document does not spell out, or
that was established on hardware.
- No REST API on the Studio HD Mini. Port 80 is closed on firmware 8.1.1, so the library never depends on HTTP.
- The greeting is a 5xx. On connect the deck sends
500 connection info:as a multi-line block. It shares the code range of asynchronous notifications but is synchronous and arrives once; the client reads it eagerly and cachesmodelandprotocol versionfrom it. - Multi-line framing. A response is multi-line if and only if its head line ends with a colon; the body is then read until a blank line. Async notifications can interleave with a pending response and are skipped inside
request()by default. - There is no pause verb.
pause()sendsplay: speed: 0, which freezes on the current frame.stopalso holds the last frame under the factorystop mode: lastframesetting; the transport reportsstoppedin both cases. 213 deck rebootingis a success. Afile formatchange may answer with 213 instead of200 okand drop the connection. The client treats both as success and leaves reconnecting to the caller.- FTP volume layout. Storage volumes are top-level directories. The Studio HD Mini names them by slot number (
/1/,/2/); other models name them by medium (sd1,ssd1,usb,nas).STORat the root is refused with550, soupload_cliplists the root, picks a volume (numeric first, then SD, SSD, USB, NAS) and changes into it.System Volume Informationand.Trashesare never selected. - FTP login. Stock firmware accepts an empty anonymous login; some servers reject the bare
USERform, so the helper retries asanonymousbefore failing. - The disk index updates live. A clip is visible to
disk listimmediately after itsSTORcompletes; no rescan or slot reselect is needed. - Clip names contain spaces.
disk listandclips getrows are tokenised from the right (duration, format fields) and everything left over is the name, which is why a name such asIntro Loop animation.mp4round-trips. - Client limit. Beyond a small number of simultaneous 9993 clients the deck answers
120 connection failedand closes the socket. - Verified hardware. HyperDeck Studio HD Mini, firmware 8.1.1, full probe / clear / upload / cue-and-loop cycle. Other Studio HD models speak the same protocol but were not on the bench.
License
MIT. See LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hyperdeckwire-0.1.0.dev0.tar.gz.
File metadata
- Download URL: hyperdeckwire-0.1.0.dev0.tar.gz
- Upload date:
- Size: 15.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c990e5add83e602418e6615de4d3359cf1b3a36becec0a9edb77007bbe39e133
|
|
| MD5 |
a92779cde14736d21a27cc26cfc7c363
|
|
| BLAKE2b-256 |
484e8af5ac3f51328c1a4c52c6bd991f1225345e4e7fbb894b94e07e8137c4a4
|
Provenance
The following attestation bundles were made for hyperdeckwire-0.1.0.dev0.tar.gz:
Publisher:
publish.yml on lucas-romanenko/hyperdeckwire
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hyperdeckwire-0.1.0.dev0.tar.gz -
Subject digest:
c990e5add83e602418e6615de4d3359cf1b3a36becec0a9edb77007bbe39e133 - Sigstore transparency entry: 2796279704
- Sigstore integration time:
-
Permalink:
lucas-romanenko/hyperdeckwire@6271e2b7cbfcf819be32d4c09cf7a2202ccfb66b -
Branch / Tag:
refs/heads/main - Owner: https://github.com/lucas-romanenko
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@6271e2b7cbfcf819be32d4c09cf7a2202ccfb66b -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file hyperdeckwire-0.1.0.dev0-py3-none-any.whl.
File metadata
- Download URL: hyperdeckwire-0.1.0.dev0-py3-none-any.whl
- Upload date:
- Size: 15.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
37235a267b21b808fa9027e5b105cbe27bcaf281bf912677e1ff0a34ec2c38de
|
|
| MD5 |
659a290a26328315e18bf9a0019877c2
|
|
| BLAKE2b-256 |
563a37a2e3730808a08b55b3ddbc2e7d0da5a032f50bf1ba00dbbad66329954a
|
Provenance
The following attestation bundles were made for hyperdeckwire-0.1.0.dev0-py3-none-any.whl:
Publisher:
publish.yml on lucas-romanenko/hyperdeckwire
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hyperdeckwire-0.1.0.dev0-py3-none-any.whl -
Subject digest:
37235a267b21b808fa9027e5b105cbe27bcaf281bf912677e1ff0a34ec2c38de - Sigstore transparency entry: 2796279842
- Sigstore integration time:
-
Permalink:
lucas-romanenko/hyperdeckwire@6271e2b7cbfcf819be32d4c09cf7a2202ccfb66b -
Branch / Tag:
refs/heads/main - Owner: https://github.com/lucas-romanenko
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@6271e2b7cbfcf819be32d4c09cf7a2202ccfb66b -
Trigger Event:
workflow_dispatch
-
Statement type: