Skip to main content
Pre-release

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 Hyperdeck client 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 Clip and Response dataclasses; protocol errors raise HyperdeckError with the deck's code and text.
  • Asynchronous 5xx notifications are filtered out of blocking requests and can be read explicitly.
  • upload_clip FTP helper with storage-volume auto-detection, anonymous-login fallback, progress callback and throughput reporting.
  • Pure standard library; a socket_factory hook and ftplib monkeypatching 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 caches model and protocol version from 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() sends play: speed: 0, which freezes on the current frame. stop also holds the last frame under the factory stop mode: lastframe setting; the transport reports stopped in both cases.
  • 213 deck rebooting is a success. A file format change may answer with 213 instead of 200 ok and 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). STOR at the root is refused with 550, so upload_clip lists the root, picks a volume (numeric first, then SD, SSD, USB, NAS) and changes into it. System Volume Information and .Trashes are never selected.
  • FTP login. Stock firmware accepts an empty anonymous login; some servers reject the bare USER form, so the helper retries as anonymous before failing.
  • The disk index updates live. A clip is visible to disk list immediately after its STOR completes; no rescan or slot reselect is needed.
  • Clip names contain spaces. disk list and clips get rows are tokenised from the right (duration, format fields) and everything left over is the name, which is why a name such as Intro Loop animation.mp4 round-trips.
  • Client limit. Beyond a small number of simultaneous 9993 clients the deck answers 120 connection failed and 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

hyperdeckwire-0.1.0.dev0.tar.gz (15.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

hyperdeckwire-0.1.0.dev0-py3-none-any.whl (15.1 kB view details)

Uploaded Python 3

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

Hashes for hyperdeckwire-0.1.0.dev0.tar.gz
Algorithm Hash digest
SHA256 c990e5add83e602418e6615de4d3359cf1b3a36becec0a9edb77007bbe39e133
MD5 a92779cde14736d21a27cc26cfc7c363
BLAKE2b-256 484e8af5ac3f51328c1a4c52c6bd991f1225345e4e7fbb894b94e07e8137c4a4

See more details on using hashes here.

Provenance

The following attestation bundles were made for hyperdeckwire-0.1.0.dev0.tar.gz:

Publisher: publish.yml on lucas-romanenko/hyperdeckwire

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file hyperdeckwire-0.1.0.dev0-py3-none-any.whl.

File metadata

File hashes

Hashes for hyperdeckwire-0.1.0.dev0-py3-none-any.whl
Algorithm Hash digest
SHA256 37235a267b21b808fa9027e5b105cbe27bcaf281bf912677e1ff0a34ec2c38de
MD5 659a290a26328315e18bf9a0019877c2
BLAKE2b-256 563a37a2e3730808a08b55b3ddbc2e7d0da5a032f50bf1ba00dbbad66329954a

See more details on using hashes here.

Provenance

The following attestation bundles were made for hyperdeckwire-0.1.0.dev0-py3-none-any.whl:

Publisher: publish.yml on lucas-romanenko/hyperdeckwire

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.1.0.dev0 This release

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page