0.1.4 • Published 4 years ago

suono v0.1.4

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

Suono

Suono 是一个业务型音频库,比如音乐 app,付费音频 app 等业务场景,兼容至安卓浏览器原生浏览器。实际上线产品参考 Screenshot 一节。

保留了一定的拓展性,有任何场景需要欢迎 PR & Issues。

npm node typescript xo prslicenses]licenses-url

Installation

npm i suono

# or using yarn

yarn add suono

实例化

import { Suono, SingleTonSuono } from 'suono'

var suono = new Suono({
  autoplay: false,
  controls: false,
  preload: 'metadata',
  fallback: 'Your browser doesn\'t support HTML5 audio.',
  autoSkip: true,
  volume: 1,
  mode: 'order',
  debug: false,
  crossorigin: 'anonymous'
})

Feature

  • 支持单例模式,全局实例共享
  • 支持发布订阅模式,监听所有音频事件并回调实例
  • 内置了四种播放模式,顺序播放、列表循环、单曲循环、随机播放
  • 支持自定义播放模式
  • 支持多种类型的音频文件并根据文件后缀匹配类型,同时支持降级提示

Example

单例模式

<script type="module">
  import { SingleTonSuono } from '../dist/index.esm.js'
  var suono = new SingleTonSuono()
  var suono1 = new SingleTonSuono()
  console.log(suono1 === suono) // true
</script>

非单例模式

<script type="module">
  import { Suono } from '../dist/index.esm.js'
  var suono = new Suono()
</script>

四种播放模式

支持自定义播放模式,例如心动模式。

<script type="module">
  import { Suono } from '../dist/index.esm.js'
  var suono = new Suono({
    mode: 'order' // 默认
  })
</script>

支持多种文件类型和降级提示

// result
<audio controls>
  <source src="myAudio.mp3" type="audio/mpeg">
  <source src="myAudio.ogg" type="audio/ogg">
  <p>Your browser doesn\'t support HTML5 audio. Here is a <a href="myAudio.mp3">link to the audio</a> instead.</p>
</audio>

Options

Audio 使用

src: string | string[]

当前音频 src

debug: boolean

调试模式

autoplay: boolean

是否自动播放,需要遵循浏览器的自动播放策略

preload: string

预加载类型,none, metadata, auto,默认为 metadata

loop: boolean

是否循环播放

controls: boolean

是否展示音频控件

volume: number

音量大小,范围 0, 1

crossorigin: string

跨域加载类型, anonymous 或者 use-credentials

播放逻辑使用

name: string

音频名称

duration: number

音频播放时长

fallback: string

降级提示

loading: boolean

是否处在加载资源状态

playList: ListItem[]

播放列表

currentIndex: number

当前播放列表项目索引

mode: string

四种内置的播放类型,'order', 'singleLoop', 'random', 'listLoop'

playType: PlayType

四种内置的播放策略,支持自定义播放类型

autoSkip: boolean

遇到播放错误等情况时是否自动进入下一首

timestamp: number

根据生成的时间戳用于生成唯一的 audio id

suonoEvent: SuonoEvent

发布订阅监管所有的 audio 事件触发

API

通用

init({ src, name }: ListItem)

初始化播放,在内存中创建 audio 标签,注册订阅发布事件提供钩子,调用加载资源的方法

updateAudio(src: string | string[])

用于更新节点,同时添加降级提示

  • src 是单个字符串:直接更新 audio 标签的 src
  • src 是字符串数组:在 audio 标签内部挂载 source 标签并自动根据文件后缀设置 type

通过 this.fallback 的值设置降级提示

load()

加载资源,将媒体元素重置为其初始状态,并开始选择媒体源并加载媒体,以准备从头开始播放

play()

音频播放

pause()

音频暂停

seek(target: number)

快进到某个位置

skipTo(listItem: ListItem)

跳转到某一个列表项并播放

prev() && next()

上/下一个播放项目,根据不同的播放模式有不同的行为

switch({ name, src }: ListItem)

切换到对应的项目并播放

DOM 挂载

appendChild()

将当前音频 DOM 挂载到页面上

removeChild()

将音频 DOM 从页面中移除

destroy()

销毁音频实例,需要重新调用 init

播放模式

order()

顺序播放模式,到列表最后一项会停止播放

singleLoop()

单曲循环,使用 audio.loop 属性

random()

随机播放,上/下一首会根据此计算下一首的索引

listLoop()

列表循环,区别在于到列表最后一项的行为,列表循环为重新回到第一首

获取实例信息

getName(): string

获取当前播放项的名称

getSrc(): string

获取当前播放项的 src

getCurrentSrc(): string

获取当前播放项的实际播放 src ,对于有多个资源的项目

getCurrentTime(): number

获取当前播放项的进度时间

getList(): ListItem[]

获取当前的播放列表

更新数据

updateLoop(status: boolean)

更新 audio 标签的 loop 属性

updateName(name: string, src: string)

更新 Suono 实例的名称

updateLoading(status: boolean)

更新 Suono 实例的加载状态

updateDuration(duration: number)

更新 Suono 实例的播放时长

updateMode(mode: string)

更换播放模式

updateList(list: ListItem[])

更新播放列表

错误 & 调试

debugConsole(string: string)

调试模式下输出调试信息

handleEvent()

处理音频播放中所有触发的事件,通过 suonoEvent 发布事件并回调当前实例

handleLoadError({ code }: MediaError)

进行错误处理

Develop

"scripts": {
  "prebuild": "del-cli dist",
  "esm": "tsc --module esnext && cpy dist/index.js dist --rename index.esm.js",
  "cjs": "tsc --module commonjs",
  "build": "npm run esm && npm run cjs",
  "test": "ava",
  "dev": "npm run build --watch",
  "lint": "xo --fix"
}

TestTODO

使用 ava.js 作为测试工具库,测试用例待完善。

  • 自动化测试用例为 test/test.js
  • 手动测试用例为 test/index.html

Screenshot

付费音频

当然,实现一个音乐app 的播放逻辑也是可以的。此库的逻辑原型来源于网易云音乐。

网易云音乐

License

MIT