From d741391484d449af802c9e8a5a179ff10d8debf0 Mon Sep 17 00:00:00 2001
From: gejiuyuan <2507188687@qq.com>
Date: Sat, 5 Nov 2022 14:17:45 +0800
Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=96=B0=E8=B0=83=E6=95=B4prettier?=
=?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.eslintrc.js | 82 +-
README.md | 19 +-
docs/howler.md | 280 ++----
global.d.ts | 82 +-
index.html | 66 +-
postcss.config.js | 14 +-
prettier.config.js | 68 +-
public/pwa/site.webmanifest | 34 +-
scripts/lint-staged.mjs | 42 +-
scripts/vite/constant.ts | 22 +-
scripts/vite/manualChunk.ts | 34 +-
scripts/vite/proxy.ts | 15 +-
scripts/vite/pwa.ts | 70 +-
scripts/vite/vite.config.ts | 391 ++++----
scripts/vite/viteConf.d.ts | 28 +-
src/App.scss | 44 +-
src/App.tsx | 349 +++----
src/api/auth.ts | 155 ++-
src/api/broadcast.ts | 321 +++---
src/api/homeInfo.ts | 39 +-
src/api/music.ts | 221 ++---
src/api/mv.ts | 192 ++--
src/api/other.ts | 122 +--
src/api/playlist.ts | 396 ++++----
src/api/search.ts | 110 ++-
src/api/singer.ts | 237 +++--
src/api/user.ts | 327 +++----
src/api/video.ts | 241 +++--
src/assets/icons/iconfont.css | 163 +--
src/assets/js/colorthief.js | 417 +++++++-
src/components/album/index.scss | 1 +
src/components/album/index.tsx | 25 +-
src/components/artist/album/index.scss | 82 +-
src/components/artist/album/index.tsx | 116 ++-
src/components/artist/allSongs/index.scss | 12 +-
src/components/artist/allSongs/index.tsx | 216 ++--
src/components/artist/description/index.scss | 39 +-
src/components/artist/description/index.tsx | 98 +-
src/components/artist/featured/index.scss | 7 +-
src/components/artist/featured/index.tsx | 62 +-
src/components/artist/index.scss | 108 +-
src/components/artist/index.tsx | 401 ++++----
src/components/artist/mv/index.scss | 5 +-
src/components/artist/mv/index.tsx | 106 +-
.../artist/similarSinger/index.scss | 4 +-
src/components/artist/similarSinger/index.tsx | 77 +-
src/components/home-header/index.scss | 120 ++-
src/components/home-header/index.tsx | 152 +--
src/components/home-left/index.scss | 56 +-
src/components/home-left/index.tsx | 192 ++--
src/components/lyric/index.scss | 329 +++----
src/components/lyric/index.tsx | 925 +++++++++---------
src/components/music-hall/artist/index.scss | 8 +-
src/components/music-hall/artist/index.tsx | 380 ++++---
.../music-hall/featured/banner/index.scss | 141 +--
.../music-hall/featured/banner/index.tsx | 187 ++--
src/components/music-hall/featured/index.scss | 114 +--
src/components/music-hall/featured/index.tsx | 180 ++--
src/components/music-hall/index.scss | 16 +-
src/components/music-hall/index.tsx | 58 +-
.../music-hall/newestdisc/index.scss | 24 +-
.../music-hall/newestdisc/index.tsx | 399 ++++----
.../music-hall/newestmusic/index.scss | 12 +-
.../music-hall/newestmusic/index.tsx | 167 ++--
src/components/music-hall/songlist/index.scss | 78 +-
src/components/music-hall/songlist/index.tsx | 331 +++----
src/components/music-hall/top/index.scss | 234 +++--
src/components/music-hall/top/index.tsx | 242 +++--
src/components/music-radio/index.scss | 4 +-
src/components/music-radio/index.tsx | 18 +-
src/components/mv/index.scss | 1 +
src/components/mv/index.tsx | 24 +-
src/components/my-page/index.scss | 116 ++-
src/components/my-page/index.tsx | 211 ++--
src/components/online-video/all/index.scss | 18 +-
src/components/online-video/all/index.tsx | 151 +--
.../online-video/category/index.scss | 12 +-
.../online-video/category/index.tsx | 264 ++---
src/components/online-video/index.scss | 17 +-
src/components/online-video/index.tsx | 47 +-
src/components/personal-recommend/index.scss | 175 ++--
src/components/personal-recommend/index.tsx | 356 +++----
src/components/player-controller/index.scss | 279 +++---
src/components/player-controller/index.tsx | 262 ++---
src/components/player-queue/index.scss | 272 +++--
src/components/player-queue/index.tsx | 217 ++--
src/components/search/album/index.scss | 8 +-
src/components/search/album/index.tsx | 73 +-
src/components/search/index.scss | 94 +-
src/components/search/index.tsx | 562 ++++++-----
src/components/search/lyric/index.scss | 102 +-
src/components/search/lyric/index.tsx | 299 +++---
src/components/search/mv/index.scss | 1 +
src/components/search/mv/index.tsx | 90 +-
src/components/search/radio/index.scss | 4 +-
src/components/search/radio/index.tsx | 20 +-
src/components/search/singer/index.scss | 54 +-
src/components/search/singer/index.tsx | 44 +-
src/components/search/songlist/index.scss | 108 +-
src/components/search/songlist/index.tsx | 171 ++--
src/components/search/songs/index.scss | 4 +-
src/components/search/songs/index.tsx | 79 +-
src/components/search/user/index.scss | 54 +-
src/components/search/user/index.tsx | 149 ++-
src/components/search/video/index.scss | 7 +-
src/components/search/video/index.tsx | 154 ++-
src/components/setting/general/index.scss | 14 +-
src/components/setting/general/index.tsx | 191 ++--
src/components/setting/index.scss | 96 +-
src/components/setting/index.tsx | 65 +-
src/components/song-page/comment/index.scss | 203 ++--
src/components/song-page/comment/index.tsx | 254 ++---
src/components/song-page/detail/index.scss | 31 +-
src/components/song-page/detail/index.tsx | 55 +-
src/components/song-page/index.scss | 71 +-
src/components/song-page/index.tsx | 286 +++---
src/components/song-page/util.ts | 60 +-
src/components/songlist/comment/index.scss | 4 +-
src/components/songlist/comment/index.tsx | 30 +-
src/components/songlist/index.scss | 219 +++--
src/components/songlist/index.tsx | 551 +++++------
src/components/songlist/music/index.scss | 4 +-
src/components/songlist/music/index.tsx | 26 +-
src/components/songlist/subscriber/index.scss | 4 +-
src/components/songlist/subscriber/index.tsx | 168 ++--
src/components/user/collection/index.scss | 5 +-
src/components/user/collection/index.tsx | 75 +-
src/components/user/config.ts | 12 +-
src/components/user/index.scss | 90 +-
src/components/user/index.tsx | 379 ++++---
src/components/user/play-record/index.scss | 46 +-
src/components/user/play-record/index.tsx | 164 ++--
src/components/user/songlist/index.scss | 3 +-
src/components/user/songlist/index.tsx | 71 +-
src/components/video/index.scss | 159 ++-
src/components/video/index.tsx | 569 ++++++-----
src/database/audio.ts | 4 +-
src/database/database.d.ts | 8 +-
src/database/index.ts | 4 +-
src/database/player.ts | 81 +-
src/dependency/enum.ts | 54 +-
src/hooks/index.ts | 8 +-
src/hooks/onBeforeInstallPrompt.ts | 45 +-
src/hooks/onRouteHook.ts | 89 +-
src/hooks/useBetterFullscreen.ts | 93 +-
src/hooks/useChildren.ts | 163 +--
src/hooks/useHowler.ts | 327 +++----
src/hooks/useParent.ts | 69 +-
src/hooks/useTimeSlice.ts | 54 +-
src/main.ts | 64 +-
src/request/index.ts | 103 +-
src/router/index.ts | 70 +-
src/router/routes.ts | 549 ++++++-----
src/scss/common.scss | 237 ++---
src/scss/main.scss | 9 +-
src/scss/variable.scss | 91 +-
src/shim.d.ts | 62 +-
src/stores/audio.ts | 519 +++++-----
src/stores/index.ts | 4 +-
src/stores/initStore.ts | 11 +-
src/stores/player.ts | 447 ++++-----
src/stores/user.ts | 180 ++--
src/sw.ts | 9 +-
src/types/album.d.ts | 36 +-
src/types/auth.d.ts | 120 +--
src/types/lyric.d.ts | 86 +-
src/types/mv.d.ts | 58 +-
src/types/singer.d.ts | 40 +-
src/types/song.ts | 310 +++---
src/types/songlist.d.ts | 324 +++---
src/types/user.d.ts | 206 ++--
src/types/video.d.ts | 313 +++---
src/utils/apiSpecial.ts | 234 +++--
src/utils/auth.ts | 62 +-
src/utils/battery.ts | 128 ++-
src/utils/browser.ts | 239 +++--
src/utils/calc.ts | 57 +-
src/utils/common.ts | 348 ++++---
src/utils/constants.ts | 28 +-
src/utils/event/event.ts | 140 +--
src/utils/event/register.ts | 4 +-
src/utils/index.ts | 18 +-
src/utils/lyricParser.ts | 148 +--
src/utils/preference.ts | 189 ++--
src/utils/time.ts | 196 ++--
src/utils/timeSlice.ts | 109 +--
src/views/home/index.scss | 64 +-
src/views/home/index.tsx | 111 ++-
src/views/lyric-page/index.scss | 209 ++--
src/views/lyric-page/index.tsx | 214 ++--
src/webComponents/index.ts | 4 +-
src/webComponents/textarea/index.tsx | 266 ++---
src/widgets/album-list/index.scss | 84 +-
src/widgets/album-list/index.tsx | 394 ++++----
src/widgets/artist-list/index.scss | 39 +-
src/widgets/artist-list/index.tsx | 143 ++-
src/widgets/aside-route-list/index.scss | 58 +-
src/widgets/aside-route-list/index.tsx | 146 +--
src/widgets/battery/index.scss | 14 +-
src/widgets/battery/index.tsx | 99 +-
src/widgets/common-renderer/index.scss | 10 +-
src/widgets/common-renderer/index.tsx | 55 +-
src/widgets/common-router-list/index.scss | 76 +-
src/widgets/common-router-list/index.tsx | 96 +-
src/widgets/follow-button/index.scss | 20 +-
src/widgets/follow-button/index.tsx | 145 +--
src/widgets/header-setting/index.scss | 111 +--
src/widgets/header-setting/index.tsx | 158 +--
src/widgets/infinity-scroll/index.ts | 278 +++---
.../infinity-scroll/infinity-scroll.tsx | 160 ++-
src/widgets/music-list/index.scss | 251 +++--
src/widgets/music-list/index.tsx | 472 +++++----
src/widgets/music-tiny-comp/index.scss | 247 +++--
src/widgets/music-tiny-comp/index.tsx | 639 ++++++------
src/widgets/mv-list/index.scss | 112 +--
src/widgets/mv-list/index.tsx | 309 +++---
src/widgets/progress-bar/index.scss | 122 +--
src/widgets/progress-bar/index.tsx | 478 ++++-----
src/widgets/reply-textarea/index.scss | 21 +-
src/widgets/reply-textarea/index.tsx | 73 +-
src/widgets/route-pagination/index.scss | 16 +-
src/widgets/route-pagination/index.tsx | 228 +++--
src/widgets/song-list/index.scss | 140 ++-
src/widgets/song-list/index.tsx | 409 ++++----
src/widgets/song-table/index.scss | 119 ++-
src/widgets/song-table/index.tsx | 311 +++---
src/widgets/song-table/yuan-table/index.scss | 56 +-
src/widgets/song-table/yuan-table/index.tsx | 265 +++--
src/widgets/subscriber-list/index.scss | 28 +-
src/widgets/subscriber-list/index.tsx | 222 ++---
src/widgets/user-login/index.scss | 301 +++---
src/widgets/user-login/index.tsx | 912 +++++++++--------
src/widgets/video-list/index.scss | 54 +-
src/widgets/video-list/index.tsx | 194 ++--
src/widgets/yuan-button/index.scss | 56 +-
src/widgets/yuan-button/index.tsx | 146 +--
tsconfig.json | 105 +-
vercel.json | 12 +-
238 files changed, 17621 insertions(+), 17089 deletions(-)
diff --git a/.eslintrc.js b/.eslintrc.js
index 8171168..0753493 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -1,46 +1,46 @@
/**
- * @introduction 详见:
- * eslint rules: https://eslint.bootcss.com/docs/rules/
+ * eslint rules: https://eslint.bootcss.com/docs/rules/
* eslint typescript rules: https://www.npmjs.com/package/@typescript-eslint/eslint-plugin
+ *
+ * @format
+ * @introduction 详见:
*/
+
module.exports = {
- "env": {
- "browser": true,
- "es2021": true
- },
- "extends": [
- "eslint:recommended",
- "plugin:vue/essential",
- "plugin:@typescript-eslint/recommended"
- ],
- "parserOptions": {
- "ecmaVersion": 12,
- "parser": "@typescript-eslint/parser",
- "sourceType": "module"
- },
- "plugins": [
- "vue",
- "@typescript-eslint"
- ],
- "rules": {
- "no-alert": "off",
- "no-unsafe-finally": "off",
- "no-empty": "off",
- "no-extra-boolean-cast": "off",
- //是否禁用不必要的\转义字符
- "no-useless-escape": "off",
- "@typescript-eslint/no-var-requires": "off",
- "@typescript-eslint/no-empty-function": "off",
- "@typescript-eslint/no-unused-vars": "off",
- //允许!非空断言
- "@typescript-eslint/no-non-null-assertion": "off",
- //允许声明any类型
- "@typescript-eslint/no-explicit-any": "off",
- //导出函数和类的公共类方法是否需要显式返回和参数类型
- "@typescript-eslint/explicit-module-boundary-types": "off",
- //是否允许空接口(interface)
- "@typescript-eslint/no-empty-interface": ["off"],
- //是否允许有额外的分号(;),如{}块级作用域后就不需要;
- "@typescript-eslint/no-extra-semi": ["warn"]
- }
+ env: {
+ browser: true,
+ es2021: true,
+ },
+ extends: [
+ 'eslint:recommended',
+ 'plugin:vue/essential',
+ 'plugin:@typescript-eslint/recommended',
+ ],
+ parserOptions: {
+ ecmaVersion: 12,
+ parser: '@typescript-eslint/parser',
+ sourceType: 'module',
+ },
+ plugins: ['vue', '@typescript-eslint'],
+ rules: {
+ 'no-alert': 'off',
+ 'no-unsafe-finally': 'off',
+ 'no-empty': 'off',
+ 'no-extra-boolean-cast': 'off',
+ //是否禁用不必要的\转义字符
+ 'no-useless-escape': 'off',
+ '@typescript-eslint/no-var-requires': 'off',
+ '@typescript-eslint/no-empty-function': 'off',
+ '@typescript-eslint/no-unused-vars': 'off',
+ //允许!非空断言
+ '@typescript-eslint/no-non-null-assertion': 'off',
+ //允许声明any类型
+ '@typescript-eslint/no-explicit-any': 'off',
+ //导出函数和类的公共类方法是否需要显式返回和参数类型
+ '@typescript-eslint/explicit-module-boundary-types': 'off',
+ //是否允许空接口(interface)
+ '@typescript-eslint/no-empty-interface': ['off'],
+ //是否允许有额外的分号(;),如{}块级作用域后就不需要;
+ '@typescript-eslint/no-extra-semi': ['warn'],
+ },
};
diff --git a/README.md b/README.md
index 740afc9..9067087 100644
--- a/README.md
+++ b/README.md
@@ -1,32 +1,21 @@
-捣鼓的一个biu涕仸音乐网站~~ 🤗🤗🤗🤗🤗
-
-后端接口使用:[`Binaryify`](https://binaryify.github.io/NeteaseCloudMusicApi)
+
+捣鼓的一个 biu 涕仸音乐网站~~ 🤗🤗🤗🤗🤗
+后端接口使用:[`Binaryify`](https://binaryify.github.io/NeteaseCloudMusicApi)
目前还在开发中~~
-还是先看看几张app界面😊:
+还是先看看几张 app 界面 😊:

-
-

-
-

-
-

-
-

-
-

-
diff --git a/docs/howler.md b/docs/howler.md
index c3f67d7..27cd587 100644
--- a/docs/howler.md
+++ b/docs/howler.md
@@ -1,40 +1,38 @@
+
+
### 一、描述
-------
+---
-howler.js(吼叫)是一个现代web音频库。它默认使用Web Audio技术,同时兼容HTML5 Audio方案。这使得JavaScript更容易处理音频,并且运行在所有浏览器平台上。
+howler.js(吼叫)是一个现代 web 音频库。它默认使用 Web Audio 技术,同时兼容 HTML5 Audio 方案。这使得 JavaScript 更容易处理音频,并且运行在所有浏览器平台上。
可在[howlerjs.com](`howlerjs.com`)上获取更多信息、在线延时和用户展示。
-关注howler.js的推特账号,并参与相关发展讨论:[@GoldFireStudios](https://twitter.com/goldfirestudios)
-
-
+关注 howler.js 的推特账号,并参与相关发展讨论:[@GoldFireStudios](https://twitter.com/goldfirestudios)
### 二、特性
-------
+---
-- 满足所有音频需求的单一API
-- 默认使用Web Audio API,并使用HTML5 Audio向后兼容
-- 处理跨环境(平台)的边缘情况和错误
+- 满足所有音频需求的单一 API
+- 默认使用 Web Audio API,并使用 HTML5 Audio 向后兼容
+- 处理跨环境(平台)的边缘情况和错误
- 支持所有编解码器,实现全面跨浏览器支持
- 自动缓存,以提升性能
- 单独、分组或全局控制声音
- 一次播放多种声音
- 简单的声音精灵定义和播放
- 完全控制衰弱、速率、搜索、音量等
-- 轻松添加3D空间音效或立体声平移
+- 轻松添加 3D 空间音效或立体声平移
- 模块化 - 随心所以、易于扩展
-- 没有外部依赖,只有纯JavaScript
-- 压缩后只有7Kb
-
-
+- 没有外部依赖,只有纯 JavaScript
+- 压缩后只有 7Kb
### 三、浏览器兼容性
-------
+---
-- 谷歌Chrome 7.0+
+- 谷歌 Chrome 7.0+
- IE 9.0+
- FireFox 4.0+
- Safari 5.1.4+
@@ -42,11 +40,9 @@ howler.js(吼叫)是一个现代web音频库。它默认使用Web Audio技
- Opera 12.0+
- Microsoft Edge
-
-
### 四、在线演示
-------
+---
- [Audio Player](https://howlerjs.com/#player)
@@ -54,11 +50,9 @@ howler.js(吼叫)是一个现代web音频库。它默认使用Web Audio技
- [Spatial Audio](https://howlerjs.com/#spatial)
- [Audio Sprites](https://howlerjs.com/#sprite)
-
-
### 五、使用文档
-------
+---
#### 目录
@@ -76,21 +70,19 @@ howler.js(吼叫)是一个现代web音频库。它默认使用Web Audio技
- 组合播放(Group Playback)
- 移动端播放
- 杜比音效播放
-- Facebook即时游戏
+- Facebook 即时游戏
- 格式推荐
- 许可证
-
-
### 六、快速开始
获取运行的几种方式:
- 拷贝仓库:[`git clone https://github.com/goldfire/howler.js.git`](git clone https://github.com/goldfire/howler.js.git)
-- npm安装:npm install howler
-- yarn安装:yarn add howler
-- bower安装:bower install howler
-- 使用CDN:[`cdnjs`](https://cdnjs.com/libraries/howler) [`jsDelivr`](https://www.jsdelivr.com/projects/howler.js)
+- npm 安装:npm install howler
+- yarn 安装:yarn add howler
+- bower 安装:bower install howler
+- 使用 CDN:[`cdnjs`](https://cdnjs.com/libraries/howler) [`jsDelivr`](https://www.jsdelivr.com/projects/howler.js)
在浏览器中:
@@ -105,7 +97,7 @@ howler.js(吼叫)是一个现代web音频库。它默认使用Web Audio技
作为项目依赖:
-```
+```
import { Howl, Howler } from 'howler';
```
@@ -115,15 +107,13 @@ const { Howl, Howler } = require('howler');
包含的分发文件:
-- howler:这是默认的、完全捆绑的源,包括howler.core和howler.spatial,这包含了howler附带的所有功能。
-- howler.core:这只包括旨在在Web AUdio和HTML Audio之间创建奇偶校验的核心功能,但它不包含任何空间/立体声音频功能。
-- howler.spatial:这是一个添加空间/立体声音频功能的插件。他需要howler.core才能运行,因为它只是howler.core的扩展组件。
-
-
+- howler:这是默认的、完全捆绑的源,包括 howler.core 和 howler.spatial,这包含了 howler 附带的所有功能。
+- howler.core:这只包括旨在在 Web AUdio 和 HTML Audio 之间创建奇偶校验的核心功能,但它不包含任何空间/立体声音频功能。
+- howler.spatial:这是一个添加空间/立体声音频功能的插件。他需要 howler.core 才能运行,因为它只是 howler.core 的扩展组件。
### 七、案例
-最基本的,播放一个MP3:
+最基本的,播放一个 MP3:
```
var sound = new Howl({
@@ -224,83 +214,79 @@ sound.play();
Howler.volume(0.5);
```
-可以在示例目录中找到更深入的示例(含有[`在线演示`]([examples directory](https://github.com/goldfire/howler.js/tree/master/examples).))。
-
-
+可以在示例目录中找到更深入的示例(含有[`在线演示`]([examples directory](https://github.com/goldfire/howler.js/tree/master/examples).))。
### 八、核心
-------
+---
#### 配置选项
-| 属性 | 类型 | 默认值 | 含义 |
-| ----------- | -------------- | ------ | ------------------------------------------------------------ |
-| src | Array/String | [] | 加载的音频轨道来源(URL或base64)。这应该是按照优先顺序排列的,howler.js会自动加载第一个与当前浏览器兼容的。如果没有文件扩展名,则需使用format属性明确指定扩展名 |
-| volume | Number | 1.0 | 指定音频轨道的声音,从0.0到1.0 |
-| html5 | Boolean | false | 设置true强制使用HTML5 Audio。这应该用于大型音频文件,这样你就不必再播放之前等待完整文件下载和解码 |
-| loop | Boolean | false | 设置true让声音自动从头自动播放 |
-| preload | Boolean/String | true | 定义Howl时,自动下载音频文件。如果使用HTML5音频,你可以将其设置为'metadata',表示仅加载文件的元数据。(例如,无需下载整个文件,即可获取其duration值) |
-| autoplay | Boolean | false | 设置true,音频加载好时,开始自动播放 |
-| mute | Boolean | false | 设置true,让音频静音 |
-| sprite | Object | {} | 定义一个音频片段。偏移量和持续时间以毫秒为单位。第三个可选参数可用于将片段设置为循环。生成兼容声音片段的一种简单方法是[audiosprite](https://github.com/tonistiigi/audiosprite) |
-| rate | Number | 1.0 | 播放速率,范围:0.5-4.0 |
-| pool | Number | 5 | 非活动声音池的大小。一旦声音停止或播放完毕,它们会被标记为结束并准备好清理。我们保留了一个池来回收利用,以提升性能。一般不需要修改。但要记住,当声音暂停时,它不会从池中删除,仍会被认为是活动的,以便后续恢复 |
-| format | Array | [] | howler.js会自动从扩展(extension)中检测你的文件格式,但你也可以在提取无效的情况下手动指定格式(例如使用分隔SoundCloud声云流时) |
-| xhr | Object | null | 当使用Web Audio时,howler.js使用一个XHR请求去加载音频文件。如果你需要发送自定义请求头,就可以设置HTTP方法或启用withCredentials,请将它们与此参数一起包含。每个都是可选的,method默认为GET,headers默认为null,withCredentials默认为false |
-| onload | Function | | 当音频数据加载完时触发 |
-| onloaderror | Function | | 当音频数据加载失败时触发。其第一个参数是音频的ID(如果存在的话),第二个则是错误消息(message)或代码(code)。错误代码在HTML规范总定义如下:
1表示资源请求过程中被用户代理终止;
2表示网络错误;
3表示资源解码错误;
4表示src提供的资源不支持 |
-| onplayerror | Function | | 当音频不能播放时触发。第一个参数是音频的ID,第二个是错误消息/代码 |
-| onplay | Function | | 当音频开始播放时触发。第一个参数是音频的ID |
-| onend | Function | | 当音频播放结束时触发。第一个参数是音频的ID。
注意:如果是loop模式,那么每次播放完后都会触发。 |
-| onpause | Function | | 当音频暂停时触发。第一个参数是音频的ID |
-| onstop | Function | | 当音频被停止时触发。第一个参数是音频的ID |
-| onmute | Function | | 当音频被静音或取消静音时触发。第一个参数是音频的ID |
-| onvolume | Function | | 当音频音量变化时触发。第一个参数是音频的ID |
-| onrate | Function | | 当音频播放速率变化时触发。第一个参数是音频的ID |
-| onseek | Function | | 当音频跳转播放时触发。第一个参数是音频的ID |
-| onfade | Function | | 当当前音频完成fading in/out时触发。第一个参数是音频的ID |
-| onunlock | Function | | 当音频通过触摸/点击事件自动解锁时触发。 |
-
-
+| 属性 | 类型 | 默认值 | 含义 |
+| ----------- | -------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| src | Array/String | [] | 加载的音频轨道来源(URL 或 base64)。这应该是按照优先顺序排列的,howler.js 会自动加载第一个与当前浏览器兼容的。如果没有文件扩展名,则需使用 format 属性明确指定扩展名 |
+| volume | Number | 1.0 | 指定音频轨道的声音,从 0.0 到 1.0 |
+| html5 | Boolean | false | 设置 true 强制使用 HTML5 Audio。这应该用于大型音频文件,这样你就不必再播放之前等待完整文件下载和解码 |
+| loop | Boolean | false | 设置 true 让声音自动从头自动播放 |
+| preload | Boolean/String | true | 定义 Howl 时,自动下载音频文件。如果使用 HTML5 音频,你可以将其设置为'metadata',表示仅加载文件的元数据。(例如,无需下载整个文件,即可获取其 duration 值) |
+| autoplay | Boolean | false | 设置 true,音频加载好时,开始自动播放 |
+| mute | Boolean | false | 设置 true,让音频静音 |
+| sprite | Object | {} | 定义一个音频片段。偏移量和持续时间以毫秒为单位。第三个可选参数可用于将片段设置为循环。生成兼容声音片段的一种简单方法是[audiosprite](https://github.com/tonistiigi/audiosprite) |
+| rate | Number | 1.0 | 播放速率,范围:0.5-4.0 |
+| pool | Number | 5 | 非活动声音池的大小。一旦声音停止或播放完毕,它们会被标记为结束并准备好清理。我们保留了一个池来回收利用,以提升性能。一般不需要修改。但要记住,当声音暂停时,它不会从池中删除,仍会被认为是活动的,以便后续恢复 |
+| format | Array | [] | howler.js 会自动从扩展(extension)中检测你的文件格式,但你也可以在提取无效的情况下手动指定格式(例如使用分隔 SoundCloud 声云流时) |
+| xhr | Object | null | 当使用 Web Audio 时,howler.js 使用一个 XHR 请求去加载音频文件。如果你需要发送自定义请求头,就可以设置 HTTP 方法或启用 withCredentials,请将它们与此参数一起包含。每个都是可选的,method 默认为 GET,headers 默认为 null,withCredentials 默认为 false |
+| onload | Function | | 当音频数据加载完时触发 |
+| onloaderror | Function | | 当音频数据加载失败时触发。其第一个参数是音频的 ID(如果存在的话),第二个则是错误消息(message)或代码(code)。错误代码在 HTML 规范总定义如下:
1 表示资源请求过程中被用户代理终止;
2 表示网络错误;
3 表示资源解码错误;
4 表示 src 提供的资源不支持 |
+| onplayerror | Function | | 当音频不能播放时触发。第一个参数是音频的 ID,第二个是错误消息/代码 |
+| onplay | Function | | 当音频开始播放时触发。第一个参数是音频的 ID |
+| onend | Function | | 当音频播放结束时触发。第一个参数是音频的 ID。
注意:如果是 loop 模式,那么每次播放完后都会触发。 |
+| onpause | Function | | 当音频暂停时触发。第一个参数是音频的 ID |
+| onstop | Function | | 当音频被停止时触发。第一个参数是音频的 ID |
+| onmute | Function | | 当音频被静音或取消静音时触发。第一个参数是音频的 ID |
+| onvolume | Function | | 当音频音量变化时触发。第一个参数是音频的 ID |
+| onrate | Function | | 当音频播放速率变化时触发。第一个参数是音频的 ID |
+| onseek | Function | | 当音频跳转播放时触发。第一个参数是音频的 ID |
+| onfade | Function | | 当当前音频完成 fading in/out 时触发。第一个参数是音频的 ID |
+| onunlock | Function | | 当音频通过触摸/点击事件自动解锁时触发。 |
#### 方法
##### 1、play:
-开始播放音频。返回要与其它方法结合使用的音频ID。唯一不能链接的方法。
+开始播放音频。返回要与其它方法结合使用的音频 ID。唯一不能链接的方法。
-- sprite/id:字符串或数字,可选。接受一个可以是sprite或音频ID的参数。
- - 如果为sprite,则根据sprite的定义播放新声音。
- - 如果为音频ID,则将播放之前的声音(例如暂停后的)。但若为已从pool中去除的音频ID,则不生效。
+- sprite/id:字符串或数字,可选。接受一个可以是 sprite 或音频 ID 的参数。
+ - 如果为 sprite,则根据 sprite 的定义播放新声音。
+ - 如果为音频 ID,则将播放之前的声音(例如暂停后的)。但若为已从 pool 中去除的音频 ID,则不生效。
##### 2、pause:
-暂停音频或保存着播放seek的组。
+暂停音频或保存着播放 seek 的组。
-- id:数字类型,可选。音频ID。如果没传,所有音频组都将被暂停
+- id:数字类型,可选。音频 ID。如果没传,所有音频组都将被暂停
##### 3、stop:
-停止音频播放,并重置seek播放时间位置到0。
+停止音频播放,并重置 seek 播放时间位置到 0。
-- id:数字类型,可选。音频ID。如果没传,所有音频组都将被停止
+- id:数字类型,可选。音频 ID。如果没传,所有音频组都将被停止
-**注意:此时只是暂停播放,期间可修改seek、volume等,再次触发play方法即可播放。**
+**注意:此时只是暂停播放,期间可修改 seek、volume 等,再次触发 play 方法即可播放。**
##### 4、mute:
让音频静音,但不暂停播放
-- volume:数字类型,可选。声音范围0-1
-- id:数字类型,可选。音频ID。如果没传,组中所有声音都将静音了
+- volume:数字类型,可选。声音范围 0-1
+- id:数字类型,可选。音频 ID。如果没传,组中所有声音都将静音了
##### 5、volume:
获取或设置音频或整组音频的音量。这个方法的两个参数都是可选的。
- volume:数字类型。音量范围:0.0-1.0
-- id:数字类型。音频ID。如果没传,组中所有声音的音量都相对于它们自己的音量发生了变化
+- id:数字类型。音频 ID。如果没传,组中所有声音的音量都相对于它们自己的音量发生了变化
##### 6、fade:
@@ -309,47 +295,46 @@ Howler.volume(0.5);
- from:数字类型。淡出开始音量
- to:数字类型。淡出结束音量
- duration:数字类型。淡出持续时间(毫秒单位)
-- id:数字类型。音频ID。如果没传,所有音频组都将被fade
+- id:数字类型。音频 ID。如果没传,所有音频组都将被 fade
##### 7、rate:
获取或设置音频播放速率。这个方法的两个参数都是可选的。
-- rate:数字类型。值范围:0.5-4.0,正常值为1
-- id:数字类型。音频ID。如果没传,所有音频组的播放速率都将被修改
+- rate:数字类型。值范围:0.5-4.0,正常值为 1
+- id:数字类型。音频 ID。如果没传,所有音频组的播放速率都将被修改
##### 8、seek:
获取或设置音频播放的位置(多少毫秒)。这个方法的两个参数都是可选的。
- seek:数字类型。要播放的时间
-- id:数字类型。音频ID,如果没传,音频组的第一个音频将被修改
+- id:数字类型。音频 ID,如果没传,音频组的第一个音频将被修改
-**注意:必须在onload触发后,设置才有效**
+**注意:必须在 onload 触发后,设置才有效**
##### 9、loop:
获取或设置是否让音频或音频组循环播放。这个方法的两个参数都是可选的。
- loop:布尔类型。设置循环还是不循环,这是一个问题
-- id:数字类型。音频ID。 如果没传,音频组所有音频都将设为更新后的loop值
+- id:数字类型。音频 ID。 如果没传,音频组所有音频都将设为更新后的 loop 值
##### 10、state:
-检查Howl的加载状态,返回值:unloaded、loading和loaded三者之一。
+检查 Howl 的加载状态,返回值:unloaded、loading 和 loaded 三者之一。
##### 11、playing:
-检测一个音频是否正在播放。如果没有一个音频ID传入,请检查Howl组中是否有任何音频正在播放。
-
-- id:数字类型,可选。要检测的音频ID。
+检测一个音频是否正在播放。如果没有一个音频 ID 传入,请检查 Howl 组中是否有任何音频正在播放。
+- id:数字类型,可选。要检测的音频 ID。
##### 12、duration:
-获取音频源的总时长。会返回0,直到load事件触发后。
+获取音频源的总时长。会返回 0,直到 load 事件触发后。
-- id:数字类型,可选。要检测的音频ID。传入一个ID将返回在此实例上播放的精灵的持续时间。否则返回完整的音频媒体总时长。
+- id:数字类型,可选。要检测的音频 ID。传入一个 ID 将返回在此实例上播放的精灵的持续时间。否则返回完整的音频媒体总时长。
##### 13、on:
@@ -361,51 +346,47 @@ Howler.volume(0.5);
##### 14、once:
-和on一样,只会触发一次。
+和 on 一样,只会触发一次。
##### 15、load:
-这是默认调用的,但如果将preload设为false,则必须调用此load方法,然后才能播放音频。
+这是默认调用的,但如果将 preload 设为 false,则必须调用此 load 方法,然后才能播放音频。
##### 16、unload:
-卸载并销毁Howl对象。这将立即停止附加的所有音频,并从缓存中删除它们。**同时触发onstop事件,后销毁所有事件**
-
-
+卸载并销毁 Howl 对象。这将立即停止附加的所有音频,并从缓存中删除它们。**同时触发 onstop 事件,后销毁所有事件**
#### 全局配置
-| 属性 | 类型 | 默认值 | 含义 |
-| ------------- | ------- | ----------------- | ------------------------------------------------------------ |
-| usingWebAudio | Boolean | | 如果Web Audio可用,该值为true |
-| noAudio | Boolean | | 如果没有音频可用,该值为true |
-| autoUnlock | Boolean | true | 自动尝试在移动设备和桌面端启用音频 |
-| html5PoolSize | Number | 10 | 每个HTML5 Audio对象都必须单独解锁,因此我们保留一个全局解锁节点池,以便在所有Howl实例之间共享。该池在对此用户交互时创建,并设置该属性值为它的大小 |
-| autoSuspend | Boolean | true | 在30秒不活动后自动暂停Web Audio AudioContext,以减少资源占用。新播放时自动恢复。设置此属性为false,以禁用这一行为。 |
-| ctx | Boolean | Web Audio Only | 暴露Web Audio API的AudioContext上下文对象 |
-| masterMain | Boolean | Web Audio Only | 暴露Web Audio的master GainNode。这对于编写插件或高级用法很有用 |
-
-
+| 属性 | 类型 | 默认值 | 含义 |
+| ------------- | ------- | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
+| usingWebAudio | Boolean | | 如果 Web Audio 可用,该值为 true |
+| noAudio | Boolean | | 如果没有音频可用,该值为 true |
+| autoUnlock | Boolean | true | 自动尝试在移动设备和桌面端启用音频 |
+| html5PoolSize | Number | 10 | 每个 HTML5 Audio 对象都必须单独解锁,因此我们保留一个全局解锁节点池,以便在所有 Howl 实例之间共享。该池在对此用户交互时创建,并设置该属性值为它的大小 |
+| autoSuspend | Boolean | true | 在 30 秒不活动后自动暂停 Web Audio AudioContext,以减少资源占用。新播放时自动恢复。设置此属性为 false,以禁用这一行为。 |
+| ctx | Boolean | Web Audio Only | 暴露 Web Audio API 的 AudioContext 上下文对象 |
+| masterMain | Boolean | Web Audio Only | 暴露 Web Audio 的 master GainNode。这对于编写插件或高级用法很有用 |
#### 全局方法
-以下方法用于全局修改所有音频,并从Howler对象上调用。
+以下方法用于全局修改所有音频,并从 Howler 对象上调用。
##### 1、mute:
-- muted:true表示静音,false不静音。
+- muted:true 表示静音,false 不静音。
##### 2、stop:
-停止所有音频播放,并重置播放时间为0。
+停止所有音频播放,并重置播放时间为 0。
##### 3、volume:
-获取或设置volume音量。
+获取或设置 volume 音量。
##### 4、codecs:
-检测支持的音频编解码器。如果编解码器支持当前浏览器,返回true。
+检测支持的音频编解码器。如果编解码器支持当前浏览器,返回 true。
- ext:字符串类型文件拓展名。可选值:mp3、mpeg、opus、ogg、oga、wav、aac、caf、m4a、m4b、mp4、weba、webm、dolby、flac。
@@ -413,8 +394,6 @@ Howler.volume(0.5);
前文已述。
-
-
### 九、插件:Spatial
#### 配置选项
@@ -429,47 +408,29 @@ Howler.volume(0.5);
| onpos | Function | | |
| onorientation | Function | | |
-
-
#### 方法
##### 1、stereo:
-
-
##### 2、pos:
-
-
##### 3、orientation:
-
-
##### 4、pannerAttr:
-
-
-#### 全局方法
+#### 全局方法
##### 1、stereo:
-
-
##### 2、pos:
-
-
##### 3、orientation:
-
-
##### 4、pannerAttr:
-
-
### 十、组播放
-每个新的Howl实例也是一个组。你可以播放来自Howl的多个声音,并单独作为一组控制它们。例如,下面播放来自一个精灵(片段)的两个声音,一起改变它们的声音,然后同时暂停它们。
+每个新的 Howl 实例也是一个组。你可以播放来自 Howl 的多个声音,并单独作为一组控制它们。例如,下面播放来自一个精灵(片段)的两个声音,一起改变它们的声音,然后同时暂停它们。
```
var sound = new Howl({
@@ -490,17 +451,15 @@ sound.volume(0.5)
sound.pause();
```
+### 十一、移动端/Chrome 播放
-
-### 十一、移动端/Chrome播放
-
-默认情况下,移动端浏览器和Chrome/Safari上的音频被锁定,直到用户交互才会播放音频,然后页面会话的其它部分正常播放(Apple文档)。howler.js的默认行为是尝试通过在第一个touchend事件上播放空缓冲区来静默解锁音频播放。可以通过如下代码禁用此行为。
+默认情况下,移动端浏览器和 Chrome/Safari 上的音频被锁定,直到用户交互才会播放音频,然后页面会话的其它部分正常播放(Apple 文档)。howler.js 的默认行为是尝试通过在第一个 touchend 事件上播放空缓冲区来静默解锁音频播放。可以通过如下代码禁用此行为。
```
Howler.autoUnlock = false; //不自动解锁
```
-如果你尝试在页面加载后自动播放音频,你可以监听playerror事件,然后等待unlock事件触发,并尝试再次播放这段音频。
+如果你尝试在页面加载后自动播放音频,你可以监听 playerror 事件,然后等待 unlock 事件触发,并尝试再次播放这段音频。
```
var sound = new Howl({
@@ -513,11 +472,9 @@ var sound = new Howl({
})
```
-
-
### 十二、杜比音频播放
-全面支持杜比音频格式的播放(目前支持Edge和Safari)。但是,你必须指定要加载的文件时杜比音频文件,因为它位于mp4容器中。
+全面支持杜比音频格式的播放(目前支持 Edge 和 Safari)。但是,你必须指定要加载的文件时杜比音频文件,因为它位于 mp4 容器中。
```
var dolbySound = new Howl({
@@ -526,43 +483,14 @@ var dolbySound = new Howl({
})
```
-
-
### 十三、格式推荐
-Howler.js支持各种具有不同浏览器支持的音频编解码器(mp3、opus、ogg、wav、aac、m4a、m4b、mp4、webm等),但如果你想要完整的浏览器覆盖,你仍然需要至少使用其中两个。如果您的目标是在小文件大小和高质量之间取得最佳平衡,根据广泛的生产测试,你最好的选择是默认使用webm,并回退到mp3。webm具有几乎完整的浏览器覆盖范围,具有压缩和质量的完美结合。你好需要IE的mp3回退。
+Howler.js 支持各种具有不同浏览器支持的音频编解码器(mp3、opus、ogg、wav、aac、m4a、m4b、mp4、webm 等),但如果你想要完整的浏览器覆盖,你仍然需要至少使用其中两个。如果您的目标是在小文件大小和高质量之间取得最佳平衡,根据广泛的生产测试,你最好的选择是默认使用 webm,并回退到 mp3。webm 具有几乎完整的浏览器覆盖范围,具有压缩和质量的完美结合。你好需要 IE 的 mp3 回退。
-请务必记住,howler.js从你的源数组中选择第一个兼容的音频。因此,如果你希望在mp3之前使用webm,则需要按此顺序放置源。
+请务必记住,howler.js 从你的源数组中选择第一个兼容的音频。因此,如果你希望在 mp3 之前使用 webm,则需要按此顺序放置源。
-如果你希望您的webm文件可以再FireFox中查找,请务必使用提示元素对它们进行编码。一种方法是在ffmpeg中使用破折号标志:
+如果你希望您的 webm 文件可以再 FireFox 中查找,请务必使用提示元素对它们进行编码。一种方法是在 ffmpeg 中使用破折号标志:
```
ffmpeg -i sound1.wav -dash 1 sound1.webm
```
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/global.d.ts b/global.d.ts
index edc6ea4..18a40fe 100644
--- a/global.d.ts
+++ b/global.d.ts
@@ -1,36 +1,38 @@
+/** @format */
+
interface document {
- documentMode: number;
+ documentMode: number;
}
interface BeforeInstallPromptEvent extends Event {
- platforms: string[];
- timeStamp: number;
- type: "beforeinstallprompt";
- prompt: () => void;
- userChoice: Promise<{
- outcome: 'dismissed' | 'accepted' | string;
- platform: string;
- }>
+ platforms: string[];
+ timeStamp: number;
+ type: 'beforeinstallprompt';
+ prompt: () => void;
+ userChoice: Promise<{
+ outcome: 'dismissed' | 'accepted' | string;
+ platform: string;
+ }>;
}
interface WindowEventMap {
- beforeinstallprompt: BeforeInstallPromptEvent
+ beforeinstallprompt: BeforeInstallPromptEvent;
}
interface Event {
- detail: any;
+ detail: any;
}
interface Navigator {
- getBattery: () => Promise;
- battery: PlainObject;
- mozBattery: PlainObject;
- webkitBattery: PlainObject;
+ getBattery: () => Promise;
+ battery: PlainObject;
+ mozBattery: PlainObject;
+ webkitBattery: PlainObject;
}
interface window {
- webkitAudioContext: AudioContext;
- requestIdleCallback: (cb: CommonFunction, options?: { timeout: number }) => void;
+ webkitAudioContext: AudioContext;
+ requestIdleCallback: (cb: CommonFunction, options?: { timeout: number }) => void;
}
declare type CommonFunction = (...args: any[]) => any;
@@ -38,55 +40,53 @@ declare type CommonFunction = (...args: any[]) => any;
declare type PlainObject = Record;
//让数组也继承纯对象特性
-interface Array extends PlainObject { }
+interface Array extends PlainObject {}
declare type Writeable = {
- -readonly [K in keyof T]: T[K];
+ -readonly [K in keyof T]: T[K];
};
declare type FuncParamsType any> = T extends (
- ...args: infer P
+ ...args: infer P
) => any
- ? P
- : T;
+ ? P
+ : T;
declare type CtorParamsType any> =
- T extends new (...args: infer P) => any ? P : never;
+ T extends new (...args: infer P) => any ? P : never;
/**
* UnionToIntersection<{ a: string } | { b: string }> = { a: string } & { b: string }
*/
declare type UnionToIntersection = (T extends any ? (x: T) => any : never) extends (
- x: infer U
+ x: infer U,
) => any
- ? U
- : never;
+ ? U
+ : never;
/**
* LastUnion<'a' | 'b'> = 'b'
*/
declare type LastUnion = UnionToIntersection<
- T extends any
- ? (x: T) => any
- : never
+ T extends any ? (x: T) => any : never
> extends (x: infer L) => any
- ? L
- : never;
+ ? L
+ : never;
/**
* UnionToTuple<'a' | 'b'> = ['a', 'b']
*/
declare type UnionToTuple> = [T] extends [never]
- ? []
- : [...UnionToTuple>, Last];
-
-declare module "*.css";
-declare module "*.scss";
-declare module "*.json";
-declare module "*.png";
-declare module "*.jpg";
-declare module "*.webp";
-declare module "*.svg";
+ ? []
+ : [...UnionToTuple>, Last];
+
+declare module '*.css';
+declare module '*.scss';
+declare module '*.json';
+declare module '*.png';
+declare module '*.jpg';
+declare module '*.webp';
+declare module '*.svg';
// declare module "colorthief" {
// class ColorThief {
diff --git a/index.html b/index.html
index 3efd3a2..a05137a 100644
--- a/index.html
+++ b/index.html
@@ -1,31 +1,39 @@
+
+
-
-
-
-
-
-
- RefrainMusic
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
+ RefrainMusic
+
+
+
+
+
+
+
+
+
+
+
+
+
+