npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@collaborne/media-player

v3.0.1

Published

Customizable React media player that uses @mui design system and own functionality

Downloads

667

Readme

Media Player

GitHub package.json version Node version GitHub Workflow Status (with event) GitHub deployments GitHub top language Code Coverage

A media player build in React on top of CookPete/react-player.It supports the MUI theming and components and own functionality of the Picture-in-Picture and Fullscreen API. And yes, it is updated to React v18 :balloon:!

You can play both: audio and video files.

Note: At the moment we support video and audio files URL. Youtube, twitch and other media streaming services URL's are not supported yet.

Live demo

Introduction

@collaborne/media-player provides a set of: "draft" player that has own PIP and Fullscreen implementation, UI Controls, a high flexibility for composing different player's UI Controls, hooks for accessing media store/data and event listeners, a ready to go media player solution (with our own customized MUI Themed Components) and many other features.

Installation

  1. Add as a dependency @collaborne/media-player
npm install --save @collaborne/media-player
  1. Install our peer dependencies. As an example we use mui for theming and UI Components, react-transition-group for animation, lodash for throttling, etc.
    You can check peer dependencies in package.json. What is a peer dependency you can check here.

How to use

The Players

  • Out of the box

You can just use a component that contains all the futures. See in CodeSandbox.
NOTE: Wait the sandbox until installs all dependencies and refresh it in case if it got "staled"

import { MediaPlayer } from '@collaborne/media-player';

export const MyComponent: React.FC = () => {
 return (
   <MediaPlayer url="some-video-url" />
 );
};
  • Compose own UI Controls

This comes handy when you want to customize controls for the player. CodeSandbox
NOTE: Wait the sandbox until installs all dependencies and refresh it in case if it got "staled"

import { CorePlayer, Controls, BottomControls } from "@collaborne/media-player";
import { PlayArrow } from "@mui/icons-material";
import { IconButton } from "@mui/material";

const PlayButton = () => {
  return (
    <IconButton>
      <PlayArrow />
    </IconButton>
  );
};

export default function App() {
  return (
    <>
      <CorePlayer url="some-url">
        <Controls>
          <BottomControls>
            <PlayButton />
          </BottomControls>
        </Controls>
      </CorePlayer>
    </>
  );
}

Recipes

  • Using Media Store for the children

We use zustand for storing media state(current time, isPlaying, isMuted...). That's why we can get the state using zustand approach.

import { useMediaStore } from "@collaborne/media-player";
import { PlayArrow } from "@mui/icons-material";
import { IconButton } from "@mui/material";

const PlayButton = () => {
  const play = useMediaStore((state) => state.play);
  return (
    <IconButton onClick={play}>
      <PlayArrow />
    </IconButton>
  );
};
  • Using MediaStore outside of the player All players state is connected to an event emitter. Triggering play, pause, mute, etc will trigger an event, that you can connect too. So, subscribing to an event can boost your app and save performance. Code example in CodeSandbox.
    NOTE: Wait the sandbox until installs all dependencies and refresh it in case if it got "staled"
import {
  MediaPlayer,
  usePlayerContext,
  useMediaListener
} from "@collaborne/media-player";

// `<App />` can control MediaStore not being a children of MediaPlayer
export default function App() {
  // mediaContext is a ref value. Use only setters and media listener
  const { mediaContext, setMediaContext } = usePlayerContext();
  const listener = mediaContext?.getListener();
  // useMediaListener - custom hooks that improves usability of emitted events
  useMediaListener("play", () => alert("Play event was triggered"), listener);

  return (
      <MediaPlayer
        url="some-url"
        onStoreUpdate={setMediaContext}
      />
  );
}

Documentation

@collaborne/media-player categorizes its functionality as follows:

Note: Functions may belong to multiple categories. For example, the <VolumeButton /> is both a React Component and a UI Control.

  • React Component
  • UI Controls: Components used to build player UI elements
  • Players: Ready-to-use player implementations
  • Custom Icons: Icons used for player controls
  • React Context
  • Context Providers
  • Hooks: React hooks that simplify package usage
  • MediaStore: Internal player storage
  • Events: Events triggered by player activity, many of which are similar to standard video/audio web events (see Mozilla Developer Network).

Latest changes, types and interfaces here.

Debugging

We use debug package for logging events. As you can see in our live demo, player provides you logs for native <video> play and pause events, and also when state is changed. To use it in any your environment(we used in our storybook environment) you need to add to yours process.env a parameter of DEBUG=*, that will print all these logs in browser's DevTools.

FAQ

  • Q: How to use player in a performant way? How to avoid rerenders?
    A: Subscribe to events. We emit events for almost all use cases(play, pause, timeupdate, durationchange, ...etc).
  • Q: Do you support Youtube, vimeo sources?
    A: At the moment, no. We support only files.

License

Apache-2.0 © Collaborne