4.11.4 • Published 4 years ago

react-jinke-music-player-no-mobile v4.11.4

Weekly downloads
-
License
MIT
Repository
github
Last release
4 years ago

:package: Installation

using yarn :

yarn add react-jinke-music-player

using npm :

npm install react-jinke-music-player --save

:framed_picture: Screenshots

mini mode

mini mode

Light Theme

light theme

Dark Theme

dark theme

mobile

mobile

:sparkles: Feature list

:eyes: Example

live example :

local example : http://localhost:8081/

Source Code

:memo: Usage

import React from "react";
import ReactDOM from "react-dom";
import ReactJkMusicPlayer from "react-jinke-music-player";
import "react-jinke-music-player/assets/index.css";

ReactDOM.render(
  <ReactJkMusicPlayer {...options} />,
  document.getElementById("root")
);

:clipboard: API

NameTypeDefaultDescription
classNamestring-Additional CSS class for the root DOM node
audioListsAudioListProps[]-Detail
themelight | darkdarkcolor of the music player theme darklight
localezh_CN | en_US | CustomLocaleen_USDetaillight
defaultPositionobject{top:0,left:0}audio controller initial position with left,top,right,and bottom
playModeShowTimenumber600play mode toggle show time (ms)
boundsobject,numberbodyspecifies movement boundaries. Accepted values: parent restricts movement within the node's offsetParent (nearest node with position relative or absolute), or a selector, restricts movement within the targeted node An object with left, top, right, and bottom properties. These indicate how far in each direction the draggable can be moved.
preloadboolean,stringfalseWhether to load audio immediately after the page loads. can be set to auto|metadata|none true|false if preload=true preload="auto"
rememberbooleanfalseThe next time you access the player, do you keep the last state
glassBgbooleanfalseWhether the player's background displays frosted glass effect
removebooleantrueThe Audio Can be deleted
defaultPlayIndexnumber0Default play index of the audio player
playIndexnumber0play index of the audio player
defaultPlayModestringorderdefault play mode of the audio player options can be set to order,orderLoop,singleLoop,shufflePlay or omitted
modestringminiaudio theme switch checkedText can be set to mini,full or omitted
oncebooleanfalseThe default audioPlay handle function will be played again after each pause, If you only want to trigger it once, you can set 'true'
autoPlaybooleantrueWhether the audio is played after loading is completed.
toggleModebooleantrueWhether you can switch between two modes, full => mini or mini => full
dragbooleantrueaudio controller is can be drag of the "mini" mode
seekedbooleantrueWhether you can drag or click the progress bar to play in the new progress.
showMiniModeCoverbooleantrueaudio cover is show of the "mini" mode
showMiniProcessBarbooleanfalseaudio progress circle bar is show of the "mini" mode
showProgressLoadBarbooleantrueDisplays the audio load progress bar.
showPlaybooleantrueplay button display of the audio player panel
showReloadbooleantruereload button display of the audio player panel
showDownloadbooleantruedownload button display of the audio player panel
showPlayModebooleantrueplay mode toggle button display of the audio player panel
showThemeSwitchbooleantruetheme toggle switch display of the audio player panel
showLyricbooleanfalseaudio lyric button display of the audio player panel
showMediaSessionbooleanfalsehttps://web.dev/media-session/
lyricClassNamestring-audio lyric class name
extendsContentarray \| ReactNode \| boolean \| string-Extensible custom content like <><button>button1</button> <button>button2</button></>
defaultVolumenumber1default volume of the audio player , range 0-1
loadAudioErrorPlayNextbooleantrueWhether to try playing the next audio when the current audio playback fails
onAudioDownloadfunction(audioInfo)-audio is downloaded handle
onAudioPlayfunction(audioInfo)-audio play handle
onAudioPausefunction(audioInfo)-audio pause handle
onAudioSeekedfunction(audioInfo)-When the user has moved/jumped to a new location in audio handle
onAudioVolumeChangefunction(volume)-When the volume has changed handle min = 0.0 max = 1.0
onAudioEndedfunction(currentPlayId,audioLists,audioInfo)-The single song is ended handle
onAudioAbortfunction(currentPlayId, audioLists, audioInfo)-audio load abort The target event like {...,audioName:xx,audioSrc:xx,playMode:xx}
onAudioProgressfunction(audioInfo)-audio play progress handle
onAudioLoadErrorfunction(errMsg,currentPlayId, audioLists, audioInfo)-audio load failed error handle
onAudioReloadfunction(audioInfo)-audio reload handle
onAudioListsChangefunction(currentPlayId,audioLists,audioInfo)-audio lists change handle
onAudioPlayTrackChangefunction(currentPlayId,audioLists,audioInfo)-audio current play track change handle
onAudioPlayModeChangefunction(playMode)-play mode change handle
onAudioListsPanelChangefunction(panelVisible)-audio lists panel change handle
onThemeChangefunction(theme)-theme change handle
onModeChangefunction(mode)-mode change handle
onAudioListsDragEndfunction(fromIndex,endIndex)-audio lists drag end handle
onAudioLyricChangefunction(lineNum, currentLyric)-audio lyric change handle
getContainer() => HTMLElement | Selectorsdocument.bodyReturn the mount node for Music player
getAudioInstance(instance: HTMLAudioElement) => void-get origin audio element instance , you can use it do everything
autoHiddenCoverbooleanfalseAuto hide the cover photo if no cover photo is available
onBeforeAudioDownload(audioInfo: ReactJkMusicPlayerAudioInfo) => Promise<TransformedDownloadAudioInfo>-transform download audio info before
clearPriorAudioListsbooleanfalseReplace a new playlist with the first loaded playlist,
autoPlayInitLoadPlayListbooleanfalsePlay your new play list right after your new play list is loaded turn false.
spaceBarbooleanfalsePlay and pause audio through space bar (Desktop effective).
showDestroybooleanfalseDestroy player button display
onBeforeDestroyfunction(currentPlayId,audioLists,audioInfo)-custom destroy handler before
onDestroyedfunction(currentPlayId,audioLists,audioInfo)-player destroyed handle
customDownloaderfunction(downloadInfo: TransformedDownloadAudioInfo)-custom download handle

:bulb: Custom operation ui

Support feature:

  • play
  • pause
  • reload
  • change play time
  • change playbackRate
  • change volume
  • destroy audio player
class App extends React.Component{
  constructor() {
    this.audioInstance = null
  }
  render() {
    return (
      <>
        <ReactJkMusicPlayer getAudioInstance={instance => this.audioInstance = instance}/>
        <button onClick={() => this.audioInstance.play()}>play</button>
        <button onClick={() => this.audioInstance.pause()}>pause</button>
        <button onClick={() => this.audioInstance.load()}>reload</button>
        <button onClick={() => (this.audioInstance.currentTime = 40)}>
          change current play time
        </button>
        <button onClick={() => (this.audioInstance.playbackRate = 2)}>
          change play back rate
        </button>
        <button onClick={() => (this.audioInstance.volume = 0.2)}>change volume</button>
        <button onClick={() => this.audioInstance.destroy()}>destroy player</button>
      </>
    )
  }
}

:bulb: Glass bg

<ReactJkMusicPlayer glassBg/>

:bulb: Custom downloader

eg. https://www.npmjs.com/package/file-saver

const customDownloader = (downloadInfo) => {
  const link = document.createElement('a')
  link.href = downloadInfo.src // a.mp3
  link.download = downloadInfo.filename || 'test'
  document.body.appendChild(link)
  link.click()
}
<ReactJkMusicPlayer audioLists={[{src: "a.mp3"}]} customDownloader={customDownloader}/>

// use onBeforeAudioDownload
const onBeforeAudioDownload = () => {
  return Promise.resolve({
    src: '1.mp3',
  })
}

const customDownloader = (downloadInfo) => {
  console.log(downloadInfo.src) // 1.mp3
}

<ReactJkMusicPlayer
  customDownloader={customDownloader}
  onBeforeAudioDownload={onBeforeAudioDownload}
/>

:bulb: Destroy player

const onBeforeDestroy = (currentPlayId, audioLists, audioInfo) => {
  return new Promise((resolve, reject) => {
    // your custom validate
    if (window.confirm('Are you confirm destroy the player?')) {
      // if resolve, player destroyed
      resolve()
    } else {
      // if reject, skip.
      reject()
    }
  })
}

const onDestroyed = (currentPlayId, audioLists, audioInfo) => {
  console.log('onDestroyed:', currentPlayId, audioLists, audioInfo)
}

<ReactJkMusicPlayer
  showDestroy
  onBeforeDestroy={onBeforeDestroy}
  onDestroyed={onDestroyed}
/>

:bulb: Media session

https://web.dev/media-session/

// so cool, so easy !!!
<ReactJkMusicPlayer showMediaSession />

:bulb: Internationalization

Version: 4.11.0

Source

import Locale from 'react-jinke-music-player/lib/config/locale'
// Two languages are provided by default
// one of zh_CN | en_US
<ReactJkMusicPlayer locale={Locale.zh_CN}/>
// <ReactJkMusicPlayer locale={'en_US'}/>

// Custom override
const customLocale = {
  playModeText: {
    order: '',
    orderLoop: '',
    singleLoop: '',
    shufflePlay: ''
  },
  openText: '',
  closeText: '',
  notContentText: '',
  clickToPlayText: '',
  clickToPauseText: '',
  nextTrackText: '',
  previousTrackText: '',
  reloadText: '',
  volumeText: '',
  playListsText: '',
  toggleLyricText: '',
  toggleMiniModeText: '',
  destroyText: '',
  downloadText: '',
  lightThemeText: '',
  darkThemeText: '',
  switchThemeText: '',
  removeAudioListsText: '',
  controllerTitle: '',
  emptyLyricText: '',
  clickToDeleteText: (name) => ``,
  audioTitle: ''
  // audioTitle: (audioInfo) => ``
}

<ReactJkMusicPlayer locale={customLocale}/>

// Support partial override, auto merge

<ReactJkMusicPlayer locale={{ audioTitle: "xxx" }}/>

:bulb: Customize Theme

import ReactJkMusicPlayer from "react-jinke-music-player";
import "react-jinke-music-player/lib/styles/index.less";
@primary-color: #31c27c;
@default-color: #d9d9d9;
@bg-color: #f7f8fa;
@border-color: #d9d9d9;
@light-theme-panel-bg: #fff;
@light-theme-controller-bg: #fff;
@music-player-panel-height: 80px;
@lists-panel-width: 480px;
@lists-panel-height: 410px;
@lists-panel-item-bg: #40444b;
@lists-panel-item-bg-light: #fff;
@panel-header-height: 50px;
@panel-bg: rgba(0, 0, 0, 0.7);
@font-color: #444;
@player-width: 80px;
@player-height: @player-width;
@base-color: rgba(255, 255, 255, 0.6);
@progress-load-bar-bg-color: rgba(0, 0, 0, 0.06);
@common-animate-type: cubic-bezier(0.43, -0.1, 0.16, 1.1);
@common-animate-time: 350ms @common-animate-type;
@progress-bar-bg-color-light: rgba(0, 0, 0, 0.09);
@progress-bar-bg-color-dark: #fff;
@player-lyric-color: @primary-color;
@player-lyric-font-size: 36px;
@player-lyric-font-size-mobile: 16px;
@player-lyric-z-index: 999;

Customize in webpack

// webpack.config.js

module.exports = {
  rules: [{
    test: /\.less$/,
    use: [
      ...
      {
      loader: 'less-loader',
+     options: {
+       modifyVars: {
+         'primary-color': '#444',
+         // or
+         'hack': `true; @import "your-less-file-path.less";`, // Override with less file
+       },
+       javascriptEnabled: true,
+     },
    }],
  }],
}

Customize in less file

@import 'react-jinke-music-player/lib/styles/index.less';
@import 'your-theme-file.less';

:pencil: Development

git clone https://github.com/lijinke666/react-music-player.git
yarn | npm install
yarn start | npm start
open `http://localhost:8081/`

:hourglass: Test case

npm run test

:bulb: AudioListProps

Like This

interface ReactJkMusicPlayerAudioListProps {
  name: string | React.ReactNode,
  singer?: string | React.ReactNode,
  cover: string,
  musicSrc: string | () => Promise<string>,
  lyric?: string,
  [key: string]: any
}>

:bulb: AudioInfo

Like This

interface ReactJkMusicPlayerAudioInfo {
  cover: string,
  currentTime: number,
  duration: number,
  ended: boolean,
  musicSrc: string,
  muted: boolean,
  name: string,
  networkState: number,
  paused: boolean,
  played: any,
  readyState: number,
  startDate: any
  volume: number,
  lyric: string,
  [key: string]: any
}

:page_facing_up: License

MIT