TypeScript library for managing api.video assets urls, supporting both live and vod, including private content. It enables the generation of manifest URLs, retrieval of metadata, and is usable in both front-end and back-end environments.
npm install @api.video/media-descriptor!npm version
!build status
!license
api.video is the video infrastructure for product builders. Lightning fast video APIs for integrating, scaling, and managing on-demand & low latency live streaming features in your app.
- check if thumbnail exists
- check if mp4 exists
- TODO
- Table of contents
- Project description
- Getting started
- Documentation
- MediaDescriptorFactory
- fromManifestUrl(url: string, options?: Options): Promise
- fromVideoDescription(videoDescription: VideoDescription): Promise
- MediaDescriptor
- Basic Properties
- Domains Information
- Chapters Support
- Summaries Support
- Error Handling
- Example Usage
- Contributing
- License
This module provides a robust way to handle video media descriptions for both VOD (Video on Demand) and Live streams. It consists of two main components: a factory to create media descriptors and a descriptor class to access media information.
Installation:
``bash`
npm install media-descriptoror
yarn add media-descriptor
The factory provides two methods to create a MediaDescriptor instance:
#### fromManifestUrl(url: string, options?: Options): Promise
Creates a MediaDescriptor from a manifest URL (m3u8).
`typescript`
const descriptor = await MediaDescriptorFactory.fromManifestUrl(
"https://vod.api.video/vod/vi123456789/hls/manifest.m3u8"
);
Supported URL patterns:
- VOD public: domain.com/vod/videoId/hls/manifest.m3u8domain.com/vod/videoId/token/tokenValue/hls/manifest.m3u8
- VOD private: domain.com/videoId.m3u8
- Live public: domain.com/private/token/videoId.m3u8
- Live private:
Optional parameters:
- options.collectorDomain: Override the default analytics collector domain
#### fromVideoDescription(videoDescription: VideoDescription): Promise
Creates a MediaDescriptor from a video description object.
`typescript`
const descriptor = await MediaDescriptorFactory.fromVideoDescription({
mediaId: "vi123456789",
type: "vod",
deliveryDomain: "vod.api.video",
privateToken: "optional-token",
});
The MediaDescriptor class provides access to all video-related information:
#### Basic Properties
- title: Video titlemediaId
- : Unique video identifiermediaType
- : Either 'vod' or 'live'manifestUrl
- : HLS manifest URLmp4Url
- : Progressive download URL (VOD only)posterUrl
- : Thumbnail URL
#### Domains Information
`typescript`
const domains = descriptor.domains;
// {
// delivery: "vod.api.video",
// collector: "collector.api.video"
// }
#### Chapters Support
`typescript`
// List available chapter languages
const chapters = descriptor.chaptersEntries;
// Get chapter URL for a specific language
const chapterUrl = descriptor.getChapterUrl("en");
#### Summaries Support
`typescript
// List available summaries
const summaries = descriptor.summaryEntries;
// [{ lang: 'en', generated: false }, { lang: 'fr', generated: true }]
// Get summary content
const summary = await descriptor.getSummary({ lang: "en", generated: false });
// {
// title: string;
// abstract: string;
// takeaways: string[];
// }
`
The factory methods may throw:
- InvalidUrlError: When the manifest URL format is invalidVideoNotFoundError
- : When the video doesn't existMetadataFetchError
- : When metadata cannot be retrieved
`typescript
try {
const descriptor = await MediaDescriptorFactory.fromManifestUrl(manifestUrl);
// Access basic information
console.log(descriptor.title);
console.log(descriptor.manifestUrl);
// Get available chapters
const chapters = descriptor.chaptersEntries;
// Get summary if available
if (descriptor.summaryEntries.length > 0) {
const summary = await descriptor.getSummary(descriptor.summaryEntries[0]);
console.log(summary.abstract);
}
} catch (error) {
if (error instanceof VideoNotFoundError) {
console.error("Video not found");
}
}
``
Contributions are welcome! Please read the contributing guidelines first.
This project is licensed under the MIT License - see the LICENSE file for details.