This is the multi-page printable view of this section. Click here to print.
Network Personal Video Recorder (esb3035)
- 1: Introduction
- 2: Installation
- 2.1: Upgrades
- 3: Configuration
- 4: Logging
- 5: How-To Guides
- 6: API Reference
- 7: Releases
- 7.1: Release 1.0.0
1 - Introduction
ew-npvrOverview
The service ew-npvr is a Network Personal Video Recorder (NPVR) solution that enables
the management and streaming of recorded content. It provides a complete system for handling
personal video recordings with reduced storage usage by reusing duplicated segments.
ew-npvr is designed to integrate with AgileTV Origin’s live ingest channels and provides
capabilities for recording, storing, and streaming content to repackager.
Key Features
- Content Management: RESTful API for managing NPVR recordings with CRUD operations
- Streaming Service: Provides media streaming capabilities for recorded content
- Channel Integration: Integrates with live ingest channels (ESB3003) for recording management
- Thumbnail Generation: Automatic thumbnail generation for recorded content using OpenCV
- Flexible Storage: Configurable storage locations with support for copy or hard-link behavior
- Optional Database: PostgreSQL-backed metadata storage (optional - media streaming works without database)
- Cursor-based Pagination: Efficient pagination for listing large numbers of recordings
- Swagger Documentation: Interactive API documentation available at
/swagger/ - Rate Limiting: Configurable write rate limiting for file copy operations
- Graceful Degradation: Media API continues to function even if database is unavailable
Architecture
ew-npvr consists of several key components:
- Management API: RESTful administrative interface for managing recordings (default port: 8099)
- CRUD operations for NPVR entries
- Health check endpoint
- Swagger UI for API documentation
- Media API: Streaming interface for delivering recorded content (default: Unix socket)
- Segment delivery
- Content information retrieval
- Segment timing information
- Job Controller: Manages recording jobs and channel synchronization
- Content Info Cache: High-performance in-memory caching layer for content metadata
- Database Layer: Optional PostgreSQL storage for recording metadata and state
- Channel Manager: Handles communication with live ingest channels via Unix socket
Recording States
NPVR entries progress through various states:
- pending: Recording request created, waiting to start
- ongoing: Recording is actively in progress
- done: Recording completed successfully
- error: Recording encountered an error
- deleting: Entry is being deleted
- updating: Entry metadata is being updated
- update-ongoing: Update is in progress
Use Cases
- Recording live channels for time-shifted viewing
- Personal video library management
- Catch-up TV services
- Content archival and replay
- Cloud DVR services
2 - Installation
ew-npvrInstallation
The ew-npvr service is distributed as a CentOS/Red Hat RPM and is available
as ew-npvr.service when installed. It works on Red Hat 8 and compatible versions.
To install version x.y.z, the rpm command can be used as follows:
dnf install ./ew-npvr-x.y.z-1.el8.x86_64.rpm
The service can be controlled with the standard systemctl commands:
systemctl start ew-npvr
systemctl stop ew-npvr
systemctl status ew-npvr
Logs from the service can be seen using journalctl -u ew-npvr.
The unit file is available in /usr/lib/systemd/system/ew-npvr.service.
When run as a service, ew-npvr reads its initial configuration from the AgileTV Origin configuration system.
To uninstall the service, do:
dnf remove ew-npvr
When uninstalling it is recommended to first stop the service.
Prerequisites
Before installing ew-npvr, ensure the following prerequisites are met:
- Database (Optional): PostgreSQL database server accessible from the ew-npvr host
- Required for management API functionality
- Not required if only using media streaming API
- Storage: Sufficient disk space for NPVR recordings at configured storage locations
- Live Ingest: AgileTV Origin live ingest service (ESB3003) if recording live channels
- Network: Network connectivity to database and channel sources
Note: The service operates in degraded mode if the database is unavailable - the media API will continue to function for streaming existing content, but the management API will not be available for creating or managing recordings.
Directory Structure
After installation, the following directories are created:
/var/log/edgeware/ew-npvr/: Log files directoryew-npvr.log: General service logsew-npvr-streaming.log: Media streaming logsew-npvr-admin.log: Administration API logs
/var/run/edgeware/ew-npvr/: Runtime files (Unix sockets)/etc/edgeware/ew-npvr/: Configuration files
Initial Setup
- Configure the database connection in the AgileTV Origin configuration
- Set up NPVR storage locations
- Configure live ingest channels for NPVR integration
- Start the service:
systemctl start ew-npvr - Verify the service is running:
systemctl status ew-npvr
Command Line Options
The ew-npvr service supports the following command-line options:
--print-schema: Print the embedded JSON schema for configuration and exit--management-address <address>: Address for management API server (default: 0.0.0.0:8099)--media-address <address>: Address for media API server (default: unix:///var/run/edgeware/ew-npvr/sock.sock)- Supports both TCP addresses (e.g.,
0.0.0.0:8080) and Unix sockets (e.g.,unix:///var/run/edgeware/ew-npvr/sock.sock)
- Supports both TCP addresses (e.g.,
--content-info-cache-size <size>: Maximum number of entries in content info cache (default: 1000, range: 1-65536)--write-rate-limit <bytes>: Write rate limit in bytes per second when copying files (default: 0 = no limit)- Use this to prevent storage I/O saturation during recording operations
- Example:
--write-rate-limit 104857600limits writes to 100 MB/s
These options can be configured in the systemd service file at /usr/lib/systemd/system/ew-npvr.service.
Accessing API Documentation
Once the service is running, Swagger API documentation is available at:
http://<management-address>/swagger/
For example, with default settings:
http://localhost:8099/swagger/
2.1 - Upgrades
ew-npvr to newer versionsUpgrade Process
Standard Upgrade
To upgrade ew-npvr to a new version, follow these steps:
Stop the service:
systemctl stop ew-npvrInstall the new version:
dnf upgrade ./ew-npvr-x.y.z-1.el8.x86_64.rpmReview configuration changes:
Start the service:
systemctl start ew-npvrVerify the upgrade:
systemctl status ew-npvr journalctl -u ew-npvr -n 50
Database Schema Upgrades
Database schema migrations are handled automatically by the service on startup. When upgrading:
- Ensure database connection is configured and accessible
- The service will apply any necessary schema migrations on first start
- Monitor logs for migration status:
journalctl -u ew-npvr -f
Backup Recommendation: Before upgrading, backup your PostgreSQL database:
pg_dump -h localhost -U npvr_user npvr_db > npvr_backup_$(date +%Y%m%d).sql
Rolling Back
If you need to roll back to a previous version:
Stop the service:
systemctl stop ew-npvrDowngrade the package:
dnf downgrade ew-npvr-<previous-version>Restore database if needed:
# Only if database schema changed psql -h localhost -U npvr_user npvr_db < npvr_backup_YYYYMMDD.sqlStart the service:
systemctl start ew-npvr
Compatibility Notes
- Database: Schema changes are forward-compatible but not backward-compatible. Always backup before upgrading.
- Configuration: New configuration options have default values, so existing configurations remain valid.
- API: The Management API maintains backward compatibility within major versions.
- Storage: Recording storage format is backward-compatible.
Testing the Upgrade
After upgrading, verify functionality:
Check service health:
curl http://localhost:8099/List existing recordings:
curl http://localhost:8099/api/v1/content?limit=10Create a test recording:
curl -X POST http://localhost:8099/api/v1/content \ -H "Content-Type: application/json" \ -d '{ "channelName": "test-channel", "title": "Upgrade Test", "startTime": '$(date +%s)', "stopTime": '$(( $(date +%s) + 3600 ))' }'Verify logs:
journalctl -u ew-npvr -n 100 --no-pager
Common Upgrade Issues
Service fails to start:
- Check logs:
journalctl -u ew-npvr -n 50 - Verify configuration syntax
- Check file permissions
- Ensure database is accessible
Database migration fails:
- Check PostgreSQL connectivity
- Verify user has schema modification permissions
- Review migration logs in service output
- Consider restoring backup and retrying
Recordings not accessible:
- Verify storage paths haven’t changed
- Check file permissions on storage locations
- Review configuration for storage location names
- Ensure media API is properly configured
Performance degradation:
- Check content info cache size setting
- Review write rate limit if enabled
- Monitor database query performance
- Verify disk I/O isn’t saturated
Version-Specific Notes
Check the release notes for version-specific upgrade instructions and breaking changes.
3 - Configuration
ew-npvrConfiguration Overview
ew-npvr is configured through the AgileTV Origin configuration system using a JSON schema, aka confd.
The service monitors for configuration changes and adapts dynamically when possible.
Configuration Structure
The configuration is divided into two main sections:
- Services Configuration: Channel-level NPVR settings
- Storage Configuration: NPVR storage backend and database settings
Services Configuration
Live Ingest Channels
To enable NPVR recording for a live ingest channel, add the npvrLocation property to the channel configuration:
{
"services": {
"liveIngest": {
"channels": [
{
"name": "channel-1",
"state": "enabled",
"npvrLocation": "storage-location-1"
}
]
}
}
}
Parameters:
npvrLocation(string): Identifier for the NPVR storage location to use for this channel’s recordings. Must match a configured storage location name.name(string): Channel namestate(string): Channel state (must be configured in live ingest)
Note: The channel must already be configured in the live ingest service (ESB3003) before NPVR can record from it.
Storage Configuration
NPVR Storage Locations
Configure one or more storage locations for NPVR recordings:
{
"storage": {
"npvr": {
"locations": [
{
"name": "storage-location-1",
"basePath": "/var/storage/npvr",
"copyBehavior": "copy"
}
]
}
}
}
Parameters:
name(string, required): Unique identifier for this storage locationbasePath(string, required): Base path for NPVR storage on the filesystem- This directory must exist and be writable by the ew-npvr service
- Ensure sufficient disk space for recordings
copyBehavior(string): File copy behavior for NPVR storagecopy: Copy files (default) - safer option, works across filesystemshard-link: Create hard links instead of copying - more efficient but requires source and destination on same logical partition
Storage Layout:
Recordings are stored with the following directory structure:
<basePath>/<channelName>/<date>/<hour>/<minute>/...
Metadata is stored in:
<basePath>/<channelName>/metadata/<startTime>-<endTime>/...
Database Configuration
Configure the PostgreSQL database connection:
{
"storage": {
"npvr": {
"database": {
"address": "postgres://localhost:5432",
"user": "npvr_user",
"password": "secure_password",
"databaseIndex": "npvr_db"
}
}
}
}
Parameters:
address(string): Database address including port (default: “localhost”)user(string): Username for database authenticationpassword(string): Password for database authenticationdatabaseIndex(string): Database name to use for NPVR
Important Notes:
External database configuration is optional
If database connection fails, the service will log a warning but continue running
Without database:
- Management API will not be available
- Media API will still function for streaming existing content
- No ability to create, update, or delete recordings via API
PostgreSQL and MySQL are supported. To use MySQL, specify the scheme
mysqlfor database address, for example:
confcli storage.npvr.database.address mysql://db.example.com:3306
Similarly, with PostgreSQL:
confcli storage.npvr.database.address postgres://db.example.com:5432
Log Level Configuration
Configure the logging verbosity:
{
"storage": {
"npvr": {
"logLevel": "info"
}
}
}
Log Levels:
trace: Most verbose, includes all debug informationdebug: Debug-level messagesinfo: Informational messages (default, recommended for production)warn: Warning messages onlyerror: Error messages onlyfatal: Fatal errors onlypanic: Panic-level errors
Important: The log level can be changed dynamically and will take effect immediately without restarting the service.
Complete Configuration Example
{
"services": {
"liveIngest": {
"channels": [
{
"name": "channel-1",
"state": "enabled",
"npvrLocation": "primary-storage"
},
{
"name": "channel-2",
"state": "enabled",
"npvrLocation": "primary-storage"
},
{
"name": "premium-channel",
"state": "enabled",
"npvrLocation": "backup-storage"
}
]
}
},
"storage": {
"npvr": {
"logLevel": "info",
"locations": [
{
"name": "primary-storage",
"basePath": "/mnt/npvr/storage1",
"copyBehavior": "copy"
},
{
"name": "backup-storage",
"basePath": "/mnt/npvr/storage2",
"copyBehavior": "hard-link"
}
],
"database": {
"address": "postgresql://db.example.com:5432",
"user": "npvr_service",
"password": "secret_password",
"databaseIndex": "npvr_production"
}
}
}
}
Dynamic Configuration Updates
The service monitors configuration changes and applies them dynamically when possible:
- Log Level: Applied immediately without restart
- Storage Locations: Applied immediately without restart
- Database Settings: Requires restart to take effect
- Channel NPVR Locations: Applied immediately when channels are updated
Troubleshooting Configuration
Common configuration issues:
- Database connection fails: Service will continue in degraded mode - check logs for connection errors
- Storage path not writable: Check file permissions and disk space
- Hard-link fails: Verify source and destination are on same filesystem, or use
copyinstead
4 - Logging
ew-npvrLog Files
ew-npvr maintains separate log files for different operational areas to facilitate troubleshooting and monitoring:
General Service Log
Location: /var/log/edgeware/ew-npvr/ew-npvr.log
Contains general service operational logs including:
- Service startup and shutdown
- Configuration changes
- Database connection status
- Job controller operations
- Channel manager events
- General errors and warnings
Streaming Log
Location: /var/log/edgeware/ew-npvr/ew-npvr-streaming.log
Contains logs specific to media streaming operations:
- Media API requests
- Content delivery events
- Streaming errors
- Cache operations
- Thumbnail generation
Administration Log
Location: /var/log/edgeware/ew-npvr/ew-npvr-admin.log
Contains logs related to administrative operations:
- Management API requests
- Recording management operations
- Channel configuration changes
- Administrative actions
Log Rotation
Log files are rotated automatically using logrotate. The configuration is installed at:
/etc/logrotate.d/ew-npvr
The default rotation policy is:
- Daily rotation
- Keep 7 days of logs
- Compress rotated logs
- Create new log files with appropriate permissions
To manually rotate logs:
logrotate -f /etc/logrotate.d/ew-npvr
Viewing Logs
Using journalctl
View all service logs in real-time:
journalctl -u ew-npvr -f
View logs from the last hour:
journalctl -u ew-npvr --since "1 hour ago"
View logs with specific priority (error and above):
journalctl -u ew-npvr -p err
Using tail
Monitor the general log file:
tail -f /var/log/edgeware/ew-npvr/ew-npvr.log
Monitor the streaming log:
tail -f /var/log/edgeware/ew-npvr/ew-npvr-streaming.log
Monitor the administration log:
tail -f /var/log/edgeware/ew-npvr/ew-npvr-admin.log
Log Levels
The log level can be configured in the service configuration. Available levels:
trace: Most verbose, includes all debug informationdebug: Detailed debugging informationinfo: Informational messages (default)warn: Warning messageserror: Error messagesfatal: Fatal errors that cause service failurepanic: Panic-level errors
To change the log level, update the storage.npvr.logLevel configuration parameter.
The change takes effect immediately without requiring a service restart.
Log Format
Logs are formatted as JSON for easy parsing and analysis. Each log entry contains:
time: Timestamp in RFC3339 formatlevel: Log level (trace, debug, info, warn, error, fatal, panic)topic: Log topic (general, streaming, admin)message: Log message- Additional contextual fields depending on the log entry
Example log entry:
{
"time": "2026-04-16T10:30:45Z",
"level": "info",
"topic": "streaming",
"message": "Media request processed",
"channel": "channel-1",
"duration_ms": 125
}
Troubleshooting
Common Log Locations to Check
- Service won’t start: Check general log and journalctl
- Streaming issues: Check streaming log
- API errors: Check administration log
- Database problems: Check general log for connection errors
- Configuration issues: Check general log for validation errors
5 - How-To Guides
ew-npvr tasksCommon Tasks
This section provides practical guides for common NPVR operations.
Creating a Recording
To create a new NPVR recording, send a POST request to the management API:
curl -X POST http://localhost:8099/api/v1/content \
-H "Content-Type: application/json" \
-d '{
"channelName": "channel-1",
"title": "Evening News",
"startTime": 1713268800,
"stopTime": 1713272400,
"refID": "news-2026-04-16"
}'
Response:
{
"id": "01HP2Q3R4S5T6U7V8W9X0Y1Z2"
}
Save the returned id for future operations on this recording.
Listing Recordings
List all recordings:
curl http://localhost:8099/api/v1/content
List recordings for a specific channel:
curl "http://localhost:8099/api/v1/content?channel=channel-1"
List recordings in a time range:
curl "http://localhost:8099/api/v1/content?channel=channel-1&startTime=1713268800&stopTime=1713355200"
List with pagination:
# First page
curl "http://localhost:8099/api/v1/content?channel=channel-1&limit=100"
# Next page (use cursor from response)
curl "http://localhost:8099/api/v1/content?cursor=eyJjaGFubmVs..."
Getting Recording Details
By database ID:
curl "http://localhost:8099/api/v1/content/01HP2Q3R4S5T6U7V8W9X0Y1Z2"
By reference ID:
curl "http://localhost:8099/api/v1/content?id=news-2026-04-16"
Updating a Recording
To extend or shorten a recording, update its start and end times:
curl -X PUT http://localhost:8099/api/v1/content/01HP2Q3R4S5T6U7V8W9X0Y1Z2 \
-H "Content-Type: application/json" \
-d '{
"id": "01HP2Q3R4S5T6U7V8W9X0Y1Z2",
"startTime": 1713268800,
"stopTime": 1713276000
}'
Note: Recording can only be updated if it’s in an allowed state (pending, done, or error).
Deleting a Recording
curl -X DELETE "http://localhost:8099/api/v1/content/01HP2Q3R4S5T6U7V8W9X0Y1Z2"
The entry will be marked with state deleting and removed asynchronously.
Checking Recording State
After creating a recording, check its state periodically:
# Get recording details
curl "http://localhost:8099/api/v1/content/01HP2Q3R4S5T6U7V8W9X0Y1Z2" | jq '.entries[0].state'
Possible states:
pending: Waiting to startongoing: Recording in progressdone: Completed successfullyerror: Failed with errorupdating: Being updateddeleting: Being deleted
Working with Reference IDs
Reference IDs allow you to use your own identifiers instead of database-generated UUIDs.
Create with reference ID:
curl -X POST http://localhost:8099/api/v1/content \
-H "Content-Type: application/json" \
-d '{
"channelName": "channel-1",
"title": "My Show",
"startTime": 1713268800,
"stopTime": 1713272400,
"refID": "show-s01e05"
}'
Retrieve using reference ID:
curl "http://localhost:8099/api/v1/content?id=show-s01e05"
Note: Reference IDs must be unique across all recordings.
Monitoring Service Health
Check management API health:
curl http://localhost:8099/
Check media API health (if using TCP):
curl http://localhost:8080/
View service logs:
# General logs
tail -f /var/log/edgeware/ew-npvr/ew-npvr.log
# Streaming logs
tail -f /var/log/edgeware/ew-npvr/ew-npvr-streaming.log
# Admin logs
tail -f /var/log/edgeware/ew-npvr/ew-npvr-admin.log
# System journal
journalctl -u ew-npvr -f
Using the Swagger UI
Interactive API documentation is available at:
http://localhost:8099/swagger/
This provides:
- Complete API reference
- Try-it-out functionality
- Request/response examples
- Schema definitions
Configuring Storage Locations
Add a new storage location in the configuration:
{
"storage": {
"npvr": {
"locations": [
{
"name": "fast-storage",
"basePath": "/mnt/ssd/npvr",
"copyBehavior": "copy"
},
{
"name": "archive-storage",
"basePath": "/mnt/hdd/npvr",
"copyBehavior": "hard-link"
}
]
}
}
}
Then assign channels to storage locations:
{
"services": {
"liveIngest": {
"channels": [
{
"name": "news-channel",
"npvrLocation": "fast-storage"
},
{
"name": "movies-channel",
"npvrLocation": "archive-storage"
}
]
}
}
}
Troubleshooting
Recording stays in “pending” state:
- Check that the channel exists and is running in live ingest
- Verify the start time hasn’t already passed
- Check channel configuration and NPVR location assignment
- Review logs:
journalctl -u ew-npvr -n 100
Recording in “error” state:
- Check available disk space on storage location
- Verify source segments are available from live ingest
- Review logs for specific error messages
- Check file permissions on storage path
Cannot create recording (424 error):
- Verify channel is producing segments
- Check that requested time range has available segments
- Ensure live ingest is running and accessible
Database connection fails:
- Service continues in degraded mode
- Management API will not be available
- Media API still works for existing content
- Check PostgreSQL connectivity and credentials
Playable remains false:
- Recording may still be processing
- Check storage path for actual files
- Wait for state to change to “done”
- Review logs for processing errors
6 - API Reference
ew-npvrOverview
ew-npvr provides two separate APIs:
- Management API: RESTful HTTP API for managing NPVR entries (port 8099)
- Media API: Streaming API for content delivery (Unix socket by default)
Management API
The Management API provides CRUD operations for NPVR recordings. Interactive documentation is available via Swagger UI at http://<management-address>/swagger/.
Base URL
http://<management-address>/api/v1
Default: http://localhost:8099/api/v1
Endpoints
Health Check
GET /
Returns service health status.
Response: 200 OK with body "OK"
Create NPVR Entry
POST /content
Creates a new NPVR recording entry.
Request Body:
{
"channelName": "channel-1",
"title": "My Recording",
"startTime": 1713254400,
"stopTime": 1713258000,
"refID": "optional-reference-id"
}
Parameters:
channelName(string, required): Name of the channel to recordtitle(string, required): Title of the recordingstartTime(integer, required): Start time in epoch secondsstopTime(integer, required): End time in epoch secondsrefID(string, optional): Optional reference ID for external systems
Response: 200 OK
{
"id": "01HP2Q3R4S5T6U7V8W9X0Y1Z2"
}
Error Responses:
400 Bad Request: Invalid request parameters409 Conflict: Entry with same refID already exists424 Failed Dependency: Unable to verify segment availability500 Internal Server Error: Server error
Get NPVR Entries
GET /content
GET /content/{id}
Retrieves NPVR entries by ID or by search criteria.
Query Parameters:
id(string): Specific entry ID or refIDchannel(string): Filter by channel namestartTime(integer): Filter entries starting after this epoch timestopTime(integer): Filter entries ending before this epoch timecursor(string): Pagination cursor for next pagelimit(integer): Maximum entries to return (1-10000, default: 10000)
Response: 200 OK
{
"cursor": {
"nextCursor": "base64-encoded-cursor",
"limit": 100
},
"entries": [
{
"id": "01HP2Q3R4S5T6U7V8W9X0Y1Z2",
"refID": "optional-reference-id",
"timeCreated": 1713254000,
"timeModified": 1713254100,
"channelName": "channel-1",
"title": "My Recording",
"startTime": 1713254400,
"endTime": 1713258000,
"state": "done",
"playable": true
}
]
}
NPVR Entry Fields:
id(string): Unique time-ordered UUIDrefID(string): Optional user-provided reference IDtimeCreated(integer): Creation timestamp (epoch seconds)timeModified(integer): Last modification timestamp (epoch seconds)channelName(string): Channel nametitle(string): Recording titlestartTime(integer): Recording start time (epoch seconds)endTime(integer): Recording end time (epoch seconds)state(string): Current state (pending, ongoing, done, error, deleting, updating, update-ongoing)playable(boolean): Whether the content is ready for playback
Error Responses:
400 Bad Request: Invalid parameters404 Not Found: Entry not found500 Internal Server Error: Server error
Update NPVR Entry
PUT /content
PUT /content/{id}
Updates the start and end times of an existing NPVR entry.
Request Body:
{
"id": "01HP2Q3R4S5T6U7V8W9X0Y1Z2",
"startTime": 1713254400,
"stopTime": 1713260000
}
Parameters:
id(string, required): Entry ID (can be in URL path or request body)startTime(integer, required): New start timestopTime(integer, required): New end time
Response: 200 OK
Error Responses:
400 Bad Request: Invalid parameters404 Not Found: Entry not found423 Locked: Entry cannot be updated in its current state424 Failed Dependency: Unable to verify new segment availability500 Internal Server Error: Server error
Delete NPVR Entry
DELETE /content?id={id}
DELETE /content/{id}
Marks an NPVR entry for deletion.
Parameters:
id(string, required): Entry ID (in URL path or query parameter)
Response: 200 OK or 204 No Content
Error Responses:
400 Bad Request: Missing ID parameter423 Locked: Entry cannot be deleted in its current state500 Internal Server Error: Server error
Media API
The Media API provides access to recorded content segments and metadata for streaming.
Endpoints
Get Segment Times
GET /{channel}/segment_times.json?startTime={startTime}&stopTime={stopTime}
Returns segment timing information for a recording.
Parameters:
channel(string): Channel namestartTime(integer): Recording start time (epoch seconds)stopTime(integer): Recording end time (epoch seconds)
Response: JSON file containing segment timing metadata
Get Content Info
GET /{channel}/{configId}/content_info.json
Returns content information for a specific channel configuration.
Parameters:
channel(string): Channel nameconfigId(integer): Configuration ID
Response: JSON containing content metadata (codec information, track details, etc.)
Get Segment
GET /{channel}/{configId}/{track}/{segment}
Retrieves a media segment file.
Parameters:
channel(string): Channel nameconfigId(integer): Configuration IDtrack(string): Track identifiersegment(string): Segment filename (e.g., `12345.cmfv)
Response: Binary media segment data
Special Features:
- Supports thumbnail generation with
thumbnailquery parameter - Returns appropriate Content-Type headers
- Includes
Edgeware-CBM: 1.44.4header for compatibility
Pagination
The Management API uses cursor-based pagination for efficient handling of large result sets.
First Request:
GET /api/v1/content?channel=channel-1&limit=100
Response:
{
"cursor": {
"nextCursor": "eyJjaGFubmVsIjoiY2hhbm5lbC0xIiwic3RhcnRUaW1lIjoxNzEzMjU4MDAwfQ==",
"limit": 100
},
"entries": [ ... ]
}
Next Page:
GET /api/v1/content?cursor=eyJjaGFubmVsIjoiY2hhbm5lbC0xIiwic3RhcnRUaW1lIjoxNzEzMjU4MDAwfQ==
Error Handling
All APIs use standard HTTP status codes:
200 OK: Successful request204 No Content: Successful request with no response body400 Bad Request: Invalid request parameters404 Not Found: Resource not found409 Conflict: Resource conflict (e.g., duplicate refID)423 Locked: Resource locked (cannot perform operation in current state)424 Failed Dependency: Dependent operation failed500 Internal Server Error: Server error
Error responses include descriptive text in the response body.
7 - Releases
ESB3035 - ew-npvr releases
7.1 - Release 1.0.0
Change log
Initial release
Compatibility has been verified with the following products:
- Sw Repackager: 1.58.1
- Sw Live Ingest: 1.48.3
Release information
- Date: 2026-04-17
- Type: Production release