
Security News
The Nightmare Before Deployment
Season’s greetings from Socket, and here’s to a calm end of year: clean dependencies, boring pipelines, no surprises.
react-html5video
Advanced tools
A customizeable HoC (Higher Order Component) for HTML5 Video that allows custom and configurable controls with i18n and a11y.
V2 API has changed and is not backwards compatible. You can find the old documentation here.
View the demo.
npm install react-html5video --save
react@>=15.0.xreact-dom@>=15.0.xThe simplest way to use this component is to use the default player that is provided. It works the same way as a normal HTML5 video by taking all the supported HTML5 video attributes except for controls. This is now "controlled" and can be an array of supported component names in any order as below:
import { DefaultPlayer as Video } from 'react-html5video';
import 'react-html5video/dist/styles.css';
render() {
return (
<Video autoPlay loop muted
controls={['PlayPause', 'Seek', 'Time', 'Volume', 'Fullscreen']}
poster="http://sourceposter.jpg"
onCanPlayThrough={() => {
// Do stuff
}}>
<source src="http://sourcefile.webm" type="video/webm" />
<track label="English" kind="subtitles" srcLang="en" src="http://source.vtt" default />
</Video>
);
}
The custom controls provided are built using <button> and <input type="range"> which means basic keyboard controls are available when they are focused. For example, you can and hit the space bar on mute, play and fullscreen buttons as well as seek using the arrow keys when focused on the slider. aria-label attributes for screen readers have been used where user interaction is required. Try tabbing through the demo with Vox enabled.
You can change translate the aria-label values for all controls like so:
<Video copy={{ key: value }}>
The default english copy can be found in here.
*Disclaimer: Unfortuantely I don't much experience with a11y but I have tried to use some of the features from PayPal's accessible HTML5 player. If anyone has further input on this please raise an issue or a pull request.
If you want to get creative and create your own video player then you will need to use the higher order component. The HoC connects a React component to all the HTML5 video attributes and the HTMLMediaElement of the first video it finds in the component it is wrapping.
import videoConnect from 'react-html5video';
const MyVideoPlayer = ({ video, videoEl, children, ...restProps }) => (
<div>
<video {...restProps}>
{ children }
</video>
<p>
Here are the video properties for the above HTML5 video:
{ JSON.stringify(video) }
</p>
<a href="#" onClick={(e) => {
e.preventDefault();
// You can do what you like with the HTMLMediaElement DOM element also.
videoEl.pause();
}}>
Pause video
</a>
</div>
);
export default videoConnect(MyVideoPlayer)
The above will simply print out the properties of the HTML5 <video> within MyVideoPlayer. Now you have these properties and the HTMLMediaElement itself available in your component, it is up to you to create your new custom controls using them. See the default player as an example.
The API behaves much like the React Redux connect HoC but instead of using dispatch to change the state, we have access to the HTMLMediaElement.
videoConnect(ReactComponent, [mapStateToProps], [mapVideoElToProps], [mergeProps])mapStateToProps(videoState, ownProps) - Use this to return the HTML5 video attributes required for your component. The plain object returned here will be merged with what is returned from mapVideoElToProps using the mergeProps function. By Default this returns all video attributes so they are accessible on this.props.video in your wrapped component.
mapVideoElToProps(videoEl, videoState, ownProps) - Use this to return a plain object that uses videoEl to update the videos state. videoEl is the raw HTMLMediaElement. The object returned here will be merged with what is returned from mapStateToProps using the mergeProps function. By default the videoEl will be accessible on this.props.videoEl in your wrapped component.
mergeProps(stateProps, videoElProps, ownProps) - If specified, it is passed the result of mapStateToProps mapVideoElToProps and the parent props. The plain object you return will be passed to your wrapped component. By default this will do Object.assign({}, stateProps, videoElProps, ownProps).
To run a development server with HMR:
$ npm i
$ npm run i:demo
$ npm start
MIT
FAQs
A customizeable HTML5 Video
The npm package react-html5video receives a total of 7,963 weekly downloads. As such, react-html5video popularity was classified as popular.
We found that react-html5video demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Season’s greetings from Socket, and here’s to a calm end of year: clean dependencies, boring pipelines, no surprises.

Research
/Security News
Impostor NuGet package Tracer.Fody.NLog typosquats Tracer.Fody and its author, using homoglyph tricks, and exfiltrates Stratis wallet JSON/passwords to a Russian IP address.

Security News
Deno 2.6 introduces deno audit with a new --socket flag that plugs directly into Socket to bring supply chain security checks into the Deno CLI.