What is it?

A npm package that makes audio handling easier for React and Svelte could be a useful tool for developers looking to incorporate audio functionality into their web applications. This package could provide a set of simple and intuitive APIs for controlling audio playback, as well as handling common tasks such as downloading stats, adjusting volume, and synchronizing audio with other elements on the page. Able to customize the look and feel of the audio player. Overall, this package would aim to make it quick and easy for developers to add rich audio experiences to their React and Svelte applications, without the need for complex code.

Installation

Choose your favorite package manager

pnpm install headless-audioplayer-react
npm install headless-audioplayer-react
yarn add headless-audioplayer-react

Getting started

Headless audio player is a unstyled wrapper to handle all the stuff related to progress, downloadProgress, change current time of playing etc… You can make the player as you want, with your own styles.

Basic example

import { PlayerProvider, Player } from "headless-audioplayer-react";

export default function Web() {
  return (
    <PlayerProvider src="your audio media or audio url">
      <Player>
        {(context) => (
          <div className="w-full max-w-lg mt-10">
            <button onClick={context.togglePlay}>
              {context.isPlaying ? "Pause" : "Play"}
            </button>
            <p>{context.timestamp.current}</p>
            <p>{context.timestamp.total}</p>
          </div>
        )}
      </Player>
    </PlayerProvider>
  );
}

Slider to change the time

To change the time, there’s a built in component that you can use, however you can build your own.

Example

import {
  PlayerProvider,
  Player,
  PlayerSlider,
} from "headless-audioplayer-react";

// Slider styles are required
import "headless-audioplayer-react/dist/cjs/css/slider.css"; // If your using nextjs 12, you have to import this in the _app component

export default function Web() {
  return (
    <div className="w-full flex items-center flex-col">
      <PlayerProvider src="your audio media">
        <Player>
          {(context) => (
            <div className="w-full max-w-lg mt-10">
              <PlayerSlider
                downloadProgress={context.downloadProgress}
                onChange={context.onSliderChange}
                progress={context.progress}
              />
              <div className="flex justify-between">
                <p>{context.timestamp.current}</p>
                <p>{context.timestamp.total}</p>
              </div>
              <button onClick={context.increaseVolume}>+1</button>
              <button onClick={context.decreaseVolume}>-1</button>
              <VolumeSlider
                onChange={context.onSliderVolumeChange}
                volume={context.volume}
              />
              <button onClick={context.toggleMute}>
                {context.mute.state == "muted" ? (
                  <AiOutlineSound className="w-5 h-5" />
                ) : (
                  <AiFillSound className="w-5 h-5" />
                )}
              </button>
            </div>
          )}
        </Player>
      </PlayerProvider>
    </div>
  );
}

Building your own range slider

You can use onSliderChange and progress props to build your own slider and style that, the following example shows how to do it.

import { PlayerProvider, Player } from "headless-audioplayer-react";

export default function Web() {
  return (
    <div className="w-full flex items-center flex-col">
      <PlayerProvider src="https://ljinlovesongs.onrender.com/songs/639d2ccd6453443d963f4050">
        <Player>
          {(context) => (
            <div className="w-full max-w-lg mt-10">
              <input
                type="range"
                onChange={context.onSliderChange}
                value={context.progress}
                step="0.01"
                className="w-full"
              />
              <button onClick={context.togglePlay}>
                {context.isPlaying ? "Pause" : "Play"}
              </button>
              <div className="flex justify-between">
                <p>{context.timestamp.current}</p>
                <p>{context.timestamp.total}</p>
              </div>
            </div>
          )}
        </Player>
      </PlayerProvider>
    </div>
  );
}