Python client for the Stegawave media pipeline API
Project description
Stegawave Python Client
stegawave is an unofficial Python SDK for the Stegawave forensic watermarking platform. It wraps the public REST API and helps you validate /create-pipeline payloads, manage pipeline lifecycle, and trigger watermark decode jobs without hand-writing HTTP calls.
Installation
pip install stegawave
Quick start
from stegawave import StegawaveClient, models
client = StegawaveClient(api_key="your-api-key")
create_request = models.CreatePipelineRequest(
name="launch-stream",
description="Product launch livestream",
segmentDuration=4,
input=models.InputConfig(
Type="SRT_LISTENER",
whitelist=["0.0.0.0/0"],
SrtListenerSettings=models.SrtListenerSettings(
IngestPort=5000,
MinLatency=2000,
PassphraseEnabled=True,
# Passphrase will be auto-generated if not provided
),
),
encoder=models.EncoderConfig(
vodArchive=False,
Outputs=[
models.OutputConfig(
OutputName="cmaf-1080p",
resolution="1920x1080",
FramerateNumerator=30,
FramerateDenominator=1,
VideoBitrate=7_500_000,
AudioBitrate=128_000,
)
],
),
packager=models.PackagerConfig(
originEndpoints=[
models.OriginEndpoint(
name="cmaf-hybrid",
ContainerType="CMAF",
HlsManifests=[models.HlsManifest(ManifestName="index")],
)
]
),
)
session = client.create_pipeline_session(create_request, wait=True)
print(session.event_id)
# Access input endpoints and passphrase
status = session.status
if status.input.endpoints:
print("Input endpoints:", status.input.endpoints)
if status.input.passphraseEnabled:
print("Passphrase:", status.input.passphrase)
print("Manifests:")
for url in session.signed_manifest_uris("john_doe"):
print(" ", url)
Input types
The SDK supports the following input types:
SRT_LISTENER- SRT listener endpoint (recommended for most use cases)SRT_CALLER- SRT caller that connects to remote endpointsRTP- RTP/UDP inputRTP_FEC- RTP with Forward Error CorrectionRIST- Reliable Internet Stream TransportZIXI_PUSH- Zixi push input
Note: RTMP and file-based inputs (HLS, MP4, TS) have been deprecated in favor of the above streaming protocols.
SRT Listener (Recommended)
The SRT_LISTENER input type creates an SRT listener endpoint where you can push your stream. This is the most common input type.
Requirements:
SrtListenerSettingswithIngestPort- Exactly one CIDR in
whitelistarray - Optional passphrase encryption
Example:
models.InputConfig(
Type="SRT_LISTENER",
whitelist=["0.0.0.0/0"],
SrtListenerSettings=models.SrtListenerSettings(
IngestPort=5000,
MinLatency=2000,
MaxLatency=10000,
PassphraseEnabled=True,
Passphrase="my-32-character-passphrase!!!!" # Optional - auto-generated if omitted
)
)
After creation, retrieve the generated passphrase from the pipeline status:
status = client.get_pipeline(event_id)
if status.input.passphraseEnabled:
print(f"Generated passphrase: {status.input.passphrase}")
SRT Caller
The SRT_CALLER input type enables MediaLive to initiate outbound SRT connections to remote SRT listener endpoints. This is useful for connecting to external encoders or CDN origins that expose SRT listener ports.
Requirements:
- Provide 1 or 2
SrtCallerSources(for redundancy) - Each source requires
SrtListenerAddress(IP or hostname) andSrtListenerPort - MediaLive channel class is automatically selected: 1 source →
SINGLE_PIPELINE, 2 sources →STANDARD
Example with single source:
models.InputConfig(
Type="SRT_CALLER",
SrtCallerSources=[
models.SrtCallerSource(
SrtListenerAddress="encoder.example.com",
SrtListenerPort=9000,
StreamId="primary-feed" # Optional
)
]
)
Example with redundant sources:
models.InputConfig(
Type="SRT_CALLER",
SrtCallerSources=[
models.SrtCallerSource(
SrtListenerAddress="encoder1.example.com",
SrtListenerPort=9000,
SrtCallerDecryption=models.SrtCallerDecryption(
Algorithm="AES256",
Passphrase="16-char-minimum!"
)
),
models.SrtCallerSource(
SrtListenerAddress="encoder2.example.com",
SrtListenerPort=9000,
SrtCallerDecryption=models.SrtCallerDecryption(
Algorithm="AES256",
Passphrase="16-char-minimum!"
)
)
]
)
Notes:
- No whitelist needed (MediaLive initiates outbound connections)
- Optional
StreamIdfor stream routing at the remote endpoint - Optional
SrtCallerDecryptionfor encrypted streams - Passphrase must match the remote listener's encryption passphrase (16-64 characters)
RTP, RIST, and ZIXI
For other professional streaming protocols:
# RTP input
models.InputConfig(Type="RTP")
# RTP with FEC
models.InputConfig(Type="RTP_FEC")
# RIST input
models.InputConfig(Type="RIST")
# Zixi push
models.InputConfig(Type="ZIXI_PUSH")
Refer to the API documentation for protocol-specific configuration options.
Features
- Strongly-typed request and response models for
/create-pipeline,/get-pipeline,/pipeline-state,/delete,/token,/decode,/iptv - High-level
PipelineSessionworkflow helper to provision, poll, and sign manifests in a few lines - Support for modern streaming protocols: SRT, RTP, RIST, ZIXI
- Automatic passphrase generation for SRT listener inputs
- Convenience helpers for ABR ladders and asynchronous provisioning workflows
- Configurable retries, timeouts, and polling intervals
- First-class error types for authentication, validation, rate limiting, and server-side failures
API Endpoints
The client provides methods for all major API endpoints:
create_pipeline(request)- Create a new pipeline (POST/create-pipeline)get_pipeline(event_id)- Get pipeline details (GET/get-pipeline?eventID=...)list_pipelines()- List all pipelines (GET/get-pipeline)get_state(event_id)- Get pipeline state (POST/pipeline-statewithaction=status)start_pipeline(event_id)- Start a pipeline (POST/pipeline-statewithaction=start)stop_pipeline(event_id)- Stop a pipeline (POST/pipeline-statewithaction=stop)delete_pipeline(event_id)- Delete a pipeline (DELETE/delete?eventID=...)fetch_token(user_key, exp_hours)- Generate CDN tokens (POST/token)decode_stream(event_id, stream_url)- Trigger watermark decode job (POST/decode)query_iptv(...)- Search IPTV streams (POST/iptv)
Watermark Detection Results
When watermarks are detected in a pipeline stream, the results are available via the detected_users field:
status = client.get_pipeline(event_id)
if status.detected_users:
print(f"Found {len(status.detected_users)} detected watermarks:")
for detection in status.detected_users:
# Each detection is a DetectedUser object with:
# - user: Human-readable user identifier
# - user_key: Unique watermark key
# - similarity: Confidence score (0-1)
# - detected_at: ISO timestamp of detection
print(f" User: {detection.user}")
print(f" Key: {detection.user_key}")
print(f" Similarity: {detection.similarity}")
print(f" Detected at: {detection.detected_at}")
Migration from 0.1.x
If upgrading from version 0.1.x, please note these breaking changes:
Removed endpoints:
get_passphrase()androtate_passphrase()- Passphrase management is now integrated into pipeline creation viaSrtListenerSettings
Removed input types:
RTMP_PUSH,RTMP_PULL- UseSRT_LISTENERinsteadHLS,MP4_FILE,TS_FILE- Use streaming protocols (SRT, RTP, RIST, ZIXI)
Response format changes:
- Input endpoints are now an array:
status.input.endpoints(wasstatus.input.endpoint) - CDN endpoints include protocol info:
CdnEndpointobjects withprotocolandurlfields - Manifests include type info:
ManifestInfoobjects withtypeandnamefields
See CHANGELOG.md for complete migration guide.
See CHANGELOG.md for complete migration guide.
Configuration
Set your base URL or API key explicitly, or rely on environment variables.
client = StegawaveClient()
| Environment variable | Description |
|---|---|
STEGAWAVE_API_KEY |
API key provided by Stegawave |
STEGAWAVE_API_BASE_URL |
Override the default https://api.stegawave.com |
The SDK automatically injects your API key, validates payload structure using Pydantic models, and surfaces HTTP issues as rich exceptions.
Status
This client is v0.2.0 targeting the November 2025 API schema. Version 0.2.0 introduces breaking changes - see migration guide above. Contributions and issue reports are welcome.
Development
pip install -e .[dev]
pytest
Refer to CHANGELOG.md for planned enhancements and release history.
Project details
Release history Release notifications | RSS feed
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 stegawave-0.2.8.tar.gz.
File metadata
- Download URL: stegawave-0.2.8.tar.gz
- Upload date:
- Size: 15.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7bbd33dee259a4f8acbd4e2910a3c76ad09fd842c5ad8b07f7a52db353b3920a
|
|
| MD5 |
a6a4a691a471e4947dfcecd7914687c9
|
|
| BLAKE2b-256 |
2920530b0d30debd0c83a0914c60d97bde4bea98cdfd6b255537c518aa4eae8e
|
File details
Details for the file stegawave-0.2.8-py3-none-any.whl.
File metadata
- Download URL: stegawave-0.2.8-py3-none-any.whl
- Upload date:
- Size: 17.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a786f5962fd82f1a18bc3e5d5427c969a875264e8842e1a174e71289b493e86e
|
|
| MD5 |
c51f12ff48273c6d7c2cce813a93fa02
|
|
| BLAKE2b-256 |
98f8c57a6f670d3526a17ab60de07753b34b984e10a7d37759f6c9eabba2ae4b
|