better workflow

This commit is contained in:
DIYgod 2018-01-12 11:53:25 +08:00
parent 29a462487c
commit 4d1cdb3341
No known key found for this signature in database
GPG Key ID: EC0B76A252D3EF67
21 changed files with 3504 additions and 1566 deletions

61
.eslintrc Normal file
View File

@ -0,0 +1,61 @@
{
"extends": "eslint:recommended",
"parserOptions": {
"ecmaVersion": 6,
"sourceType": "module"
},
"env": {
"browser": true
},
"rules": {
"no-console": 0,
"no-extra-parens": 1,
"block-scoped-var": 1,
"curly": 1,
"eqeqeq": 1,
"no-global-assign": 1,
"no-implicit-globals": 1,
"no-labels": 1,
"no-multi-str": 1,
"comma-spacing": 1,
"comma-style": 1,
"func-call-spacing": 1,
"indent": 1,
"keyword-spacing": 1,
"linebreak-style": 1,
"lines-around-comment": 1,
"no-multiple-empty-lines": 1,
"space-infix-ops": 1,
"arrow-spacing": 1,
"no-var": 1,
"prefer-const": 1,
"no-unsafe-negation": 1,
"array-callback-return": 1,
"dot-location": 1,
"dot-notation": 1,
"no-eval": 1,
"no-extend-native": 1,
"no-extra-label": 1,
"semi": 1,
"space-before-blocks": 1,
"space-before-function-paren": 1,
"space-in-parens": 1,
"space-unary-ops": 1,
"spaced-comment": 1,
"arrow-body-style": 1,
"arrow-parens": 1,
"no-restricted-imports": 1,
"no-duplicate-imports": 1,
"no-useless-computed-key": 1,
"no-useless-rename": 1,
"rest-spread-spacing": 1,
"no-trailing-spaces": 1
},
"globals": {
"require": false,
"module": false,
"Hls": false,
"flvjs": false,
"dashjs": false
}
}

View File

@ -1,3 +1,9 @@
language: node_js
node_js:
- "6.1"
- "node"
cache:
yarn: true
directories:
- node_modules

View File

@ -1,4 +1,4 @@
var ap1 = new APlayer({
const ap1 = new APlayer({
element: document.getElementById('player1'),
narrow: false,
autoplay: true,
@ -10,8 +10,8 @@ var ap1 = new APlayer({
music: {
title: 'Preparation',
author: 'Hans Zimmer/Richard Harvey',
url: 'http://devtest.qiniudn.com/Preparation.mp3',
pic: 'http://devtest.qiniudn.com/Preparation.jpg'
url: 'https://moeplayer.b0.upaiyun.com/aplayer/preparation.mp3',
pic: 'https://moeplayer.b0.upaiyun.com/aplayer/preparation.jpg'
}
});
ap1.on('play', function () {
@ -36,7 +36,7 @@ ap1.on('error', function () {
console.log('error');
});
var ap2 = new APlayer({
const ap2 = new APlayer({
element: document.getElementById('player2'),
narrow: true,
autoplay: false,
@ -47,12 +47,12 @@ var ap2 = new APlayer({
music: {
title: 'Preparation',
author: 'Hans Zimmer/Richard Harvey',
url: 'http://devtest.qiniudn.com/Preparation.mp3',
pic: 'http://devtest.qiniudn.com/Preparation.jpg'
url: 'https://moeplayer.b0.upaiyun.com/aplayer/preparation.mp3',
pic: 'https://moeplayer.b0.upaiyun.com/aplayer/preparation.jpg'
}
});
var ap3 = new APlayer({
const ap3 = new APlayer({
element: document.getElementById('player3'),
narrow: false,
autoplay: false,
@ -63,13 +63,13 @@ var ap3 = new APlayer({
music: {
title: '回レ!雪月花',
author: '小倉唯',
url: 'http://devtest.qiniudn.com/回レ!雪月花.mp3',
pic: 'http://devtest.qiniudn.com/回レ!雪月花.jpg',
lrc: "回レ!雪月花.lrc"
url: 'https://moeplayer.b0.upaiyun.com/aplayer/snowmoonflowers.mp3',
pic: 'https://moeplayer.b0.upaiyun.com/aplayer/snowmoonflowers.jpg',
lrc: "https://moeplayer.b0.upaiyun.com/aplayer/snowmoonflowers.lrc"
}
});
var ap4 = new APlayer({
const ap4 = new APlayer({
element: document.getElementById('player4'),
narrow: false,
autoplay: false,
@ -81,25 +81,25 @@ var ap4 = new APlayer({
{
title: 'あっちゅ~ま青春!',
author: '七森中☆ごらく部',
url: 'http://devtest.qiniudn.com/あっちゅ~ま青春!.mp3',
pic: 'http://devtest.qiniudn.com/あっちゅ~ま青春!.jpg'
url: 'https://moeplayer.b0.upaiyun.com/aplayer/yuruyuri.mp3',
pic: 'https://moeplayer.b0.upaiyun.com/aplayer/yuruyuri.jpg'
},
{
title: 'secret base~君がくれたもの~',
author: '茅野愛衣',
url: 'http://devtest.qiniudn.com/secret base~.mp3',
pic: 'http://devtest.qiniudn.com/secret base~.jpg'
url: 'https://moeplayer.b0.upaiyun.com/aplayer/secretbase.mp3',
pic: 'https://moeplayer.b0.upaiyun.com/aplayer/secretbase.jpg'
},
{
title: '回レ!雪月花',
author: '小倉唯',
url: 'http://devtest.qiniudn.com/回レ!雪月花.mp3',
pic: 'http://devtest.qiniudn.com/回レ!雪月花.jpg'
url: 'https://moeplayer.b0.upaiyun.com/aplayer/snowmoonflowers.mp3',
pic: 'https://moeplayer.b0.upaiyun.com/aplayer/snowmoonflowers.jpg'
}
]
});
var ap5 = new APlayer({
const ap5 = new APlayer({
element: document.getElementById('player5'),
narrow: false,
autoplay: false,
@ -112,23 +112,23 @@ var ap5 = new APlayer({
{
title: 'あっちゅ~ま青春!',
author: '七森中☆ごらく部',
url: 'http://devtest.qiniudn.com/あっちゅ~ま青春!.mp3',
pic: 'http://devtest.qiniudn.com/あっちゅ~ま青春!.jpg',
lrc: 'あっちゅ~ま青春!.lrc'
url: 'https://moeplayer.b0.upaiyun.com/aplayer/yuruyuri.mp3',
pic: 'https://moeplayer.b0.upaiyun.com/aplayer/yuruyuri.jpg',
lrc: 'https://moeplayer.b0.upaiyun.com/aplayer/yuruyuri.lrc'
},
{
title: 'secret base~君がくれたもの~',
author: '茅野愛衣',
url: 'http://devtest.qiniudn.com/secret base~.mp3',
pic: 'http://devtest.qiniudn.com/secret base~.jpg',
lrc: 'secret base~君がくれたもの~.lrc'
url: 'https://moeplayer.b0.upaiyun.com/aplayer/secretbase.mp3',
pic: 'https://moeplayer.b0.upaiyun.com/aplayer/secretbase.jpg',
lrc: 'https://moeplayer.b0.upaiyun.com/aplayer/secretbase.lrc'
},
{
title: '回レ!雪月花',
author: '小倉唯',
url: 'http://devtest.qiniudn.com/回レ!雪月花.mp3',
pic: 'http://devtest.qiniudn.com/回レ!雪月花.jpg',
lrc: '回レ!雪月花.lrc'
url: 'https://moeplayer.b0.upaiyun.com/aplayer/snowmoonflowers.mp3',
pic: 'https://moeplayer.b0.upaiyun.com/aplayer/snowmoonflowers.jpg',
lrc: 'https://moeplayer.b0.upaiyun.com/aplayer/snowmoonflowers.lrc'
}
]
});

View File

@ -43,6 +43,7 @@
font-size: 18px;
}
</style>
<script src="APlayer.js"></script>
</head>
<body>
<div class="container">
@ -93,8 +94,6 @@
<h3>Narrow</h3>
<div id="player2" class="aplayer"></div>
</div>
<script src="../dist/APlayer.min.js"></script>
<script src="demo.js"></script>
<a href="https://github.com/DIYgod/APlayer" target="_blank" class="github-corner"><svg width="80" height="80" viewBox="0 0 250 250" style="fill:#151513; color:#fff; position: absolute; top: 0; border: 0; right: 0;"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg></a><style>.github-corner:hover .octo-arm{animation:octocat-wave 560ms ease-in-out}@keyframes octocat-wave{0%,100%{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@media (max-width:500px){.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:octocat-wave 560ms ease-in-out}}</style>
</body>
</html>

View File

@ -1,43 +0,0 @@
[00:00.230]君と夏の終わり 将来の夢(与你在夏末约定 将来的梦想)
[00:04.170]大きな希望 忘れない(远大的希望 不要忘记了)
[00:07.170]10年後の8月我相信 十年後的八月
[00:09.700]また出会えるのを 信じて(我们还能再相遇)
[00:14.360]最高の思い出を…(共划美好的回忆)
[00:39.960]出会いは ふっとした 瞬間 帰り道の交差点で(相识 是那麼不经意的瞬间 我在回家途中的十字路口)
[00:47.050]声をかけてくれたね 「一緒に帰ろう」(听见你的一声〞一起回家吧〞)
[00:54.310]僕は 照れくさそうに カバンで顔を隠しながら(我当时有点尴尬 还拿书包遮著脸)
[01:01.470]本当は とても とても 嬉しかったよ(其实我 心里好高兴 真的好高兴)
[01:08.590]あぁ 花火が夜空 きれいに咲いて ちょっとセツナク(啊!烟火在夜空中 灿烂盛开 几许伤感)
[01:15.770]あぁ 風が時間とともに 流れる(啊!风随着时光流逝)
[01:22.580]嬉しくって 楽しくって 冒険も いろいろしたね(满心欢喜地 兴致冲冲地 我们四处探险)
[01:29.760]二人の 秘密の 基地の中(就在我们的 秘密基地中)
[01:36.740]君と夏の終わり 将来の夢 大きな希望 忘れない(与你在夏末约定 将来的梦想 远大的希望 不要忘记了)
[01:43.920]10年後の8月 また出会えるのを 信じて(我相信 十年後的八月 我们还能再相遇)
[01:51.010]君が最後まで 心から 「ありがとう」叫んでいたこと(我知道 一直到最後)
[01:56.930]知っていたよ(你仍在心底呼喊著〞谢谢你〞)
[01:58.200]涙をこらえて 笑顔でさようなら せつないよね(强忍著泪水 笑著说再见 无限感叹涌现)
[02:05.420]最高の思い出を…(那一段最美好的回忆…)
[02:13.070]あぁ 夏休みも あと少しで 終っちゃうから(啊!暑假就快要过完了)
[02:20.310]あぁ 太陽と月 仲良くして(啊!太阳和月亮 默契十足)
[02:27.080]悲しくって 寂しくって 喧嘩も いろいろしたね(想到令人悲伤 或许有些寂寥 我们也多有争吵)
[02:34.160]二人の 秘密の 基地の中(就在我们的 秘密基地中)
[02:41.140]君が最後まで 心から 「ありがとう」叫んでいたこと(我知道 一直到最後)
[02:47.000]知っていたよ(你仍在心底呼喊著〞谢谢你)
[02:48.340]涙をこらえて 笑顔でさようなら せつないよね(强忍著泪水 笑著说再见 无限感叹涌现)
[02:55.630]最高の思い出を…(那一段最美好的回忆)
[03:03.320]突然の 転校で どうしようもなく(你突然要转学 你我都可奈何)
[03:24.190]手紙 書くよ 電話もするよ 忘れないでね 僕のことを(我会写信给你 也会打电话给你 千万不要忘记我)
[03:31.420]いつまでも 二人の 基地の中(永远别忘记 那段在秘密基地中的日子)
[03:38.520]君と夏の終わり ずっと話して(与你在夏末 聊了这麼多)
[03:42.530]夕日を見てから星を眺め(从黄昏到繁星点点)
[03:45.670]君の頬を 流れた涙は ずっと忘れない(流过你双颊的泪水 我永远不会忘记)
[03:52.820]君が最後まで 大きく手を振ってくれたこと(直到最後 你紧紧握住我的手 这感觉也将长在我心中)
[03:58.540]きっと忘れない(於是就这样)
[03:59.930]だから こうして 夢の中で ずっと永遠に…(让我们在梦中相会吧 永远的…)
[04:07.110]君と夏の終わり 将来の夢 大きな希望 忘れない(与你在夏末约定 将来的梦想 远大的希望 不要忘记了)
[04:14.270]10年後の8月 また出会えるのを 信じて(我相信 十年後的八月 我们还能再相遇)
[04:21.400]君が最後まで 心から 「ありがとう」叫んでいたこと(我知道 一直到最後)
[04:27.260]知っていたよ(你仍在心底呼喊著〞谢谢你〞)
[04:28.640]涙をこらえて 笑顔でさようなら せつないよね(强忍著泪水 笑著说再见 无限感叹涌现)
[04:35.910]最高の思い出を…(那一段最美好的回忆…)
[04:43.160]最高の思い出を…(那一段最美好的回忆…)

View File

@ -1,51 +0,0 @@
[ti:あっちゅ~ま青春!]
[ar:七森中☆ごらく部]
[al:あっちゅ~ま青春!]
[00:00.76]青春オーライ 青春オーエス 青春謳歌 はりきって行くぞ(青春 All right 青春 Oh Hisse 青春讴歌 鼓足干劲上吧!)
[00:05.96]青春ドンマイ 青春ファイト 青春最高(青春 Don't Mind 青春 Fight 青春最棒了!)
[00:09.67]Yeah!! Yeah!! Yeah!! Yeah!!
[00:12.21]青春はじめよう 1・2・さん☆ハイ让青春起步吧 1·2·三☆OK
[00:14.78]ひとまず走るぞ 1・2・さん☆ハイ不管如何先跑起来吧 1·2·三☆OK
[00:17.32]みんなが笑顔で 1・2・さん☆ハイ大家都露出笑脸 1·2·三☆OK
[00:19.95]これが青春だ 1・2・さん☆ハイ这就是青春 1·2·三☆OK
[00:22.71]春! 桜もちを食べよう 夏! かき氷で決まり(春天! 来吃樱叶饼吧 夏天! 就决定是刨冰啦)
[00:27.89]秋! 焼きいもを頬張り 冬! 雪でまたかき氷(秋天! 把烤白薯大口塞进嘴里 冬天! 在雪里面又是刨冰)
[00:32.57]もういっちょ☆(再来☆)
[00:33.16]春! 教室を間違えて 夏! 宿題を忘れて(春天! 进错了教室 夏天! 把作业忘掉了)
[00:38.37]秋! マラソンでビリケツ 冬! こたつに長期滞在(秋天! 马拉松最后一名 冬天! 长期居住在暖炉里)
[00:43.61]1年365日 ときどき366日一年中的365天 有时候是366天
[00:48.69]色々あるけど 全力!全開! 全身全霊! 楽しもうよ よーよよよよ(虽然会发生很多事情,但是一起尽力尽兴!全心全意!享受每一天吧!吧~吧吧吧吧)
[00:55.23]「えんじょい!えんじょい!じょじょじょじょじょい!」(「享受吧!享受吧! 吧吧吧吧吧!」)
[00:57.83]あっちゅ~ま青春! まぶし~いよ青春!(转瞬即逝的青春! 灿烂无比的青春!)
[01:03.17]眠気さよなら ココロの瞳をぱっちりあけよう(向困意说拜拜 把心灵的眼睛睁得大大的吧)
[01:08.42]あっちゅ~ま青春! 猛スピード青春!(转瞬即逝的青春! 飞速前进的青春!)
[01:13.64]まばたきしてちゃ おいしいところ見逃しちゃうよ 注意!(要是乱眨眼睛的话 就会把美味的时光错过了的啦! 要注意哦!)
[01:18.87]青春オーライ 青春オーエス 青春謳歌 はりきって行くぞ(青春 All right 青春 Oh Hisse 青春讴歌 鼓足干劲上吧!)
[01:24.17]青春ドンマイ 青春ファイト 青春最高(青春 Don't Mind别在意 青春 Fight奋斗 青春最棒了!)
[01:27.85]Yeah!! Yeah!! Yeah!! Yeah!!
[01:30.44]朝! ニワトリに追いかけられ 昼! まさかのテスト0点早上被鸡到处追着跑 中午! 考试没想到竟然零分!)
[01:35.72]放課後! みんなに励まされて 夜! 今日は寝て忘れましょう(放学后! 大家给我加油 晚上!今天就睡觉把烦恼忘掉吧!)
[01:40.35]次の日~っ☆(第二天~☆)
[01:40.84]朝! ぎりぎり社長出勤 昼! 給食をおかわり(早上!差点就迟到了 中午!食堂的饭再来一份)
[01:46.10]放課後! 部室でダラダララ~ 夜! 長電話止まらない(放学后! 在部团教室懒散度过 晚上! 煲电话粥停不下来)
[01:51.32]1日いつでも24時間 巻くこと押すことどちらもできない一天永远都是24小时 既不会提前也不会延后)
[01:56.52]やりたいことなら貪欲強欲 別腹パッパラやり尽そうよ よーよよよよ(如果是想做的事情的话 就要贪婪地去追求 开启第二个胃 去把所有想干的事情都做了吧!)
[02:02.95]「わっしょい!わっしょい!しょしょしょしょしょい!」(「欧耶! 欧耶! 耶耶耶耶耶!」)
[02:05.58]あっちゅ~ま青春! 楽し~いよ青春!(转瞬即逝的青春! 快乐无比的青春!)
[02:11.06]春に始まり春に向かってく 思い出つくろう(开始在春天的青春 为了这个春天 一起创造回忆吧)
[02:16.23]あっちゅ~ま青春! 青い春だ青春!(转瞬即逝的青春! 青色的春天就是……青春!)
[02:21.40]ブルーなキモチ みんなといるとカラフルになる 不思議!(那些忧郁的心情 只要和大家在一起就会变得色彩缤纷 真是不可思议!)
[02:26.82]青春オーライ 青春オーエス 青春謳歌 はりきって行くぞ(青春 All right 青春 Oh Hisse 青春讴歌 鼓足干劲上吧!)
[02:31.99]青春ドンマイ 青春ファイト 青春最高(青春 Don't Mind 青春 Fight 青春最棒了!)
[02:35.68]Yeah!! Yeah!! Yeah!! Yeah!!
[02:47.61]あっちゅ~ま青春! まぶし~いよ青春!(转瞬即逝的青春! 灿烂无比的青春!)
[02:52.67]眠気さよなら ココロの瞳をぱっちりあけよう(向困意说拜拜 把心灵的眼睛睁得大大的吧)
[02:58.01]あっちゅ~ま青春! 猛スピード青春!(转瞬即逝的青春! 飞速前进的青春!)
[03:03.22]まばたきしてちゃ おいしいところ見逃しちゃうよ 注意!(要是乱眨眼睛的话 就会把美味的时光错过了的啦! 要注意哦!)
[03:08.56]あっちゅ~ま青春! にぎや~かな青春!(转瞬即逝的青春! 热热闹闹的青春!)
[03:13.68]今が青春 感じられた日はステキな日だよ(现在就是能感受到青春的 最棒的日子哦)
[03:18.86]あっちゅ~ま青春! 二度と来ない青春!(转瞬即逝的青春! 一去不复返的青春!)
[03:24.07]気付けばいつも私の青春 キミがいるんだ キ・セ・キ(回过神来 在我的青春中都有你在身边 真・是・奇・迹)
[03:29.41]青春オーライ 青春オーエス 青春謳歌 はりきって行くぞ(青春 All right 青春 Oh Hisse 青春讴歌 鼓足干劲上吧!)
[03:34.56]青春ドンマイ 青春ファイト 青春最高(青春 Don't Mind 青春 Fight 青春最棒了!)
[03:38.23]Yeah!! Yeah!! Yeah!! Yeah!!

View File

@ -1,91 +0,0 @@
[by:京兆万年]
[ti:回レ!雪月花 小紫ver.]
[ar:小倉唯]
[lr:ヒゲドライバー]
[co:ヒゲドライバー]
[ag:ヒゲドライバー]
[00:00.00]せ〜の いちにっさんはい!(预~备 一 二 三 嗨!)
[00:04.68]ほい! いよーーーーっ ぽん!(嘿 咿哟 嘭)
[00:07.66]ハッハッハッハッハッハッハィヤ(哈 哈 哈 哈 哈 哈 嗨呀)
[00:11.12]ハッハッハッハッハッハッ う~(哈 哈 哈 哈 哈 哈 呜~
[00:13.36]さぁさぁさぁ(来 来 来)
[00:14.08]これよりご覧いただきますは(接下来诸位将欣赏到的是)
[00:15.65]カブキ者たちの栄枯盛衰(歌舞伎演员们的荣辱盛衰)
[00:17.14]時代常に日進月歩(时代总是在日新月异)
[00:18.24]聞いてってよ老若男女(且听我一一道来 男女老少)
[00:20.14]一見は勧善懲悪(乍一看是惩恶扬善)
[00:21.49]悪者どもを一刀両断(将坏人们一刀两断)
[00:22.85]「でもホンドにそれだけで楽しいの?」(“但是你真的会因此而觉得扬眉吐气吗?”)
[00:25.63]もうなんだって蒟蒻問答(无论问什么 都是牛头马嘴)
[00:27.58]ハッハッハッハッハッハッハィヤ(哈哈哈哈哈哈 咿呀)
[00:30.57]ハッハッハッハッ(哈哈哈哈)
[00:31.97]いよーーーーっ ぽん!(咿哟 嘭)
[00:33.61]どこからともなく現れて(自何处出现委实难料)
[00:34.96]すぐどこかへ行っちゃって神出鬼沒(眼又遁隐他处总是神出鬼没)
[00:36.35]チャンスを待ったら一日千秋(若是静候机会 便是一日千秋)
[00:38.03]追いかければ東奔西走(追上前去的话又要东奔西走)
[00:39.68]時代常に千変万化(时代总是千变万化)
[00:40.95]人の心は複雑怪奇(世人之心复杂怪奇)
[00:42.31]「でも本気でそんなこ言ってんの?」(“但是说着这些话的你岂不也是难免戏谑?”)
[00:45.02]もうどうにも満身創痍(也罢 无论怎样都将满身疮痍)
[00:46.98]嗚呼、巡り巡って夜の町(呜呼 绕来绕去相会在这夜色下的街)
[00:53.27]キミは合図出し踊りだす((由)你发出信号 (让)我们一同起舞转)
[00:58.12]はぁ~(哈呜~
[00:58.88]回レ回レ回レ回レ回レ回レ回レ回レ回レ!(旋转吧旋转吧旋转吧旋转吧旋转吧旋转吧旋转吧旋转吧旋转吧!)
[01:02.12]華麗に花弁 散らすように(在散落的美丽花瓣中)
[01:04.97]回レ回レ回レ回レ回レ回レ回レ回レ回レ!(旋转吧旋转吧旋转吧旋转吧旋转吧旋转吧旋转吧旋转吧旋转吧!)
[01:08.13]髪も振り乱して(头发凌乱又怎样?)
[01:10.23]一昨日、昨日、今日と、明日と、明後日と(前日、昨日、今日、明日、后日)
[01:14.13]この宴は続く(这场宴会亦不息)
[01:16.31]踊レ、歌エ、一心不乱に回レ!(舞动吧 歌唱吧 一心不乱的旋转吧于)
[01:20.19]今宵は雪月花(今夜的雪月花)
[01:25.43]ほい! いよーーーーっ ぽん!(哈~!~哟ーーーー~嘣~!
[01:29.14]ハッハッハッハッハッハッハィヤ(哈 哈 哈 哈 哈 哈 嗨呀)
[01:32.16]ハッハッハッハッハッハッ う~(哈 哈 哈 哈 哈 哈 呜)
[01:34.39]ねぇねぇねぇ(呐~呐~呐~)
[01:35.12]この世に平安訪れるの?(平安已经访问此世了吗?
[01:36.50]のべつ幕無し丁丁発止(不会闭幕的丁当争斗)
[01:38.09]兵ども千客万来(官兵们接踵而来)
[01:39.50]ひしめき合群雄割拠(相互吵吵嚷嚷群雄割据)
[01:41.00]伸るか反るか一攫千金(成败在于敢否一举千金)
[01:42.47]気が付いたら絶体絶命(回过头来却已穷途末路)
[01:43.50]「でも本音のとこ、どうなってんの?」(「不过真心的所在、到底是什么样呢?」)
[01:46.62]もうまったく奇想天外(真是的总这么异想天开)
[01:48.51]嗚呼、辿り辿って夜の町(呜呼、追溯于夜晚小镇上)
[01:54.83]迷い一つなく踊りだす(心无杂念的就此起舞吧)
[01:59.68]はぁ~(哈阿~)
[02:00.44]回レ回レ回レ回レ回レ 回レ回レ回レ回レ!(转啊转啊转啊转啊转啊转啊转啊转啊转啊!
[02:03.64]華麗に花弁 散らすように(犹如花瓣华丽的散落一般)
[02:06.49]回レ回レ回レ回レ回レ 回レ回レ回レ回レ!(转啊转啊转啊转啊转啊转啊转啊转啊转啊!
[02:09.66]髪も振り乱して(长发也随风飘散)
[02:11.72]一昨日、昨日、今日と、明日と、明後日と(无论前天、昨天、还是今天、明天、与后天)
[02:15.63]この宴は続く(这宴会还会持续)
[02:17.67]踊レ、歌エ、一心不乱に回レ!(跳吧、唱吧、一心一意的转吧!
[02:21.60]今宵は雪月花(因为今宵乃是雪月花)
[02:36.74]ハッハッハッハッハッハッハィヤ(哈 哈 哈 哈 哈 哈 嗨呀)
[02:39.72]ハッハッハッハッハッハッ さぁさぁさぁ(哈 哈 哈 哈 哈 哈 来~来~来~)
[02:42.45]ハッハッハッハッハッハッハィヤ(哈 哈 哈 哈 哈 哈 嗨呀)
[02:45.49]ハッハッハッハッハッハッ(哈 哈 哈 哈 哈 哈)
[02:47.66]花で一つ、鳥で二つ(花就是一、鸟就是二)
[02:51.31]手打ち鳴らす(拍着手轻声唱)
[02:54.12]風で三つ、嗚呼、月出て四つ(风就是三、呜呼、月出就有四)
[02:58.76]鳴らす鳴らす……(轻声唱轻轻唱……)
[03:00.09]花で一つ、鳥で二つ(花就是一、鸟就是二)
[03:03.34]手打ち鳴らす(拍着手轻声唱)
[03:06.25]風で三つ、嗚呼、月出て四つ(风就是三、呜呼、月出就有四)
[03:10.78]鳴らす鳴らす……(轻轻唱轻声唱……)
[03:13.28]今は(在此)
[03:15.35]回レ回レ回レ回レ回レ 回レ回レ回レ回レ!(转啊转啊转啊转啊转啊转啊转啊转啊转啊!
[03:18.63]華麗に花弁 散らすように(犹如花瓣华丽的散落一般)
[03:21.35]回レ回レ回レ回レ回レ 回レ回レ回レ回レ!(转啊转啊转啊转啊转啊转啊转啊转啊转啊!
[03:24.60]髪も振り乱して(长发也随风飘散)
[03:26.72]一昨日、昨日、今日と、明日と、明後日と(无论前天、昨天、还是今天、明天、与后天)
[03:30.67]この宴は続く(这宴会不会结束)
[03:32.75]踊レ、歌エ、一心不乱に回レ!(跳吧、唱吧、一心一意的转吧!
[03:36.63]今宵は何曜日か?(今宵是星期几呢?
[03:39.02]水木金?(三四五?
[03:40.56]土日月火?(六七一二?
[03:44.11]ハッハッハッハッハッハッハィヤ(哈 哈 哈 哈 哈 哈 嗨呀)
[03:47.00]ハッハッハッハッ(哈 哈 哈 哈 哈 哈)
[03:48.57]いよーーーーっ ぽん!(~哟ーーーー~嘣~!
[03:50.43]-終わり--End-

2
dist/APlayer.min.css vendored Normal file

File diff suppressed because one or more lines are too long

1
dist/APlayer.min.css.map vendored Normal file

File diff suppressed because one or more lines are too long

2
dist/APlayer.min.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,12 +1,14 @@
{
"name": "aplayer",
"version": "1.6.1",
"version": "1.7.0",
"description": "Wow, such a beautiful html5 music player",
"main": "dist/APlayer.min.js",
"style": "dist/APlayer.min.css",
"scripts": {
"test": "webpack",
"build": "webpack",
"dev": "WEBPACK_ENV=dev webpack-dev-server --hot --progress --inline --host 0.0.0.0"
"start": "npm run dev",
"build": "cross-env NODE_ENV=production webpack --config webpack/prod.config.js --progress --display-error-details --colors",
"dev": "cross-env NODE_ENV=development webpack-dev-server --config webpack/dev.config.js --watch --colors",
"test": "eslint src webpack"
},
"repository": {
"url": "git+https://github.com/DIYgod/APlayer.git",
@ -24,19 +26,26 @@
},
"homepage": "https://github.com/DIYgod/APlayer#readme",
"devDependencies": {
"autoprefixer": "^7.1.1",
"babel-core": "^6.22.1",
"babel-loader": "^7.0.0",
"babel-preset-es2015": "^6.22.0",
"css-loader": "^0.28.4",
"exports-loader": "^0.6.3",
"file-loader": "^0.11.2",
"node-sass": "^4.5.0",
"postcss-loader": "^2.0.5",
"sass-loader": "^6.0.3",
"style-loader": "^0.18.2",
"url-loader": "^0.5.7",
"webpack": "^2.6.1",
"webpack-dev-server": "^2.4.5"
"autoprefixer": "^7.1.6",
"babel-core": "^6.26.0",
"babel-loader": "^7.1.2",
"babel-preset-env": "^1.6.1",
"cross-env": "^5.1.1",
"css-loader": "^0.28.7",
"eslint": "^4.12.1",
"eslint-loader": "^1.9.0",
"exports-loader": "^0.6.4",
"extract-text-webpack-plugin": "^3.0.2",
"file-loader": "^1.1.5",
"git-revision-webpack-plugin": "^2.5.1",
"node-sass": "^4.7.2",
"postcss-loader": "^2.0.9",
"sass-loader": "^6.0.6",
"strip-loader": "^0.1.2",
"style-loader": "^0.19.0",
"template-string-optimize-loader": "^2.2.3",
"url-loader": "^0.6.2",
"webpack": "^3.8.1",
"webpack-dev-server": "^2.9.5"
}
}

View File

@ -1,5 +0,0 @@
module.exports = {
plugins: [
require('autoprefixer')
]
}

View File

@ -91,7 +91,7 @@ $aplayer-height-lrc: $aplayer-height + $lrc-height - 6;
float: left;
height: $aplayer-height;
width: $aplayer-height;
background-image: url(./default.jpg);
background-image: url(data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAeAAD/4QMfaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzA2NyA3OS4xNTc3NDcsIDIwMTUvMDMvMzAtMjM6NDA6NDIgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjE2NjQ3NUZBM0Y4RDExRTY4NzJCRDdCNkZCQTQ0MjNBIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjE2NjQ3NUY5M0Y4RDExRTY4NzJCRDdCNkZCQTQ0MjNBIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSI5OENEMEFFRjM0NTI1NjE0NEREQkU4RjkxRjAwNjM3NiIgc3RSZWY6ZG9jdW1lbnRJRD0iOThDRDBBRUYzNDUyNTYxNDREREJFOEY5MUYwMDYzNzYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAQCwsLDAsQDAwQFw8NDxcbFBAQFBsfFxcXFxcfHhca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);
background-size: cover;
transition: all 0.3s ease;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -1,17 +1,18 @@
console.log("\n %c APlayer 1.6.1 %c http://aplayer.js.org \n\n","color: #fadfa3; background: #030307; padding:5px 0;","background: #fadfa3; padding:5px 0;");
console.log("\n %c APlayer 1.6.1 %c http://aplayer.js.org \n\n", "color: #fadfa3; background: #030307; padding:5px 0;", "background: #fadfa3; padding:5px 0;");
require('./APlayer.scss');
import '../css/index.scss';
let instances = [];
const instances = [];
class APlayer {
/**
* APlayer constructor function
*
* @param {Object} option - See README
* @constructor
*/
constructor(option) {
constructor (option) {
const svg = {
'play': ['0 0 16 31', 'M15.552 15.168q0.448 0.32 0.448 0.832 0 0.448-0.448 0.768l-13.696 8.512q-0.768 0.512-1.312 0.192t-0.544-1.28v-16.448q0-0.96 0.544-1.28t1.312 0.192z'],
'pause': ['0 0 17 32', 'M14.080 4.8q2.88 0 2.88 2.048v18.24q0 2.112-2.88 2.112t-2.88-2.112v-18.24q0-2.048 2.88-2.048zM2.88 4.8q2.88 0 2.88 2.048v18.24q0 2.112-2.88 2.112t-2.88-2.112v-18.24q0-2.048 2.88-2.048z'],
@ -24,14 +25,12 @@ class APlayer {
'single': ['0 0 38 32', 'M2.072 21.577c0.71-0.197 1.125-0.932 0.928-1.641-0.221-0.796-0.333-1.622-0.333-2.457 0-5.049 4.108-9.158 9.158-9.158h5.428c0.056-0.922 0.221-1.816 0.482-2.667h-5.911c-3.158 0-6.128 1.23-8.361 3.463s-3.463 5.203-3.463 8.361c0 1.076 0.145 2.143 0.431 3.171 0.164 0.59 0.7 0.976 1.284 0.976 0.117 0 0.238-0.016 0.357-0.049zM21.394 25.613h-12.409v-2.362c0-0.758-0.528-1.052-1.172-0.652l-5.685 3.522c-0.644 0.4-0.651 1.063-0.014 1.474l5.712 3.69c0.637 0.411 1.158 0.127 1.158-0.63v-2.374h12.409c3.158 0 6.128-1.23 8.361-3.463 1.424-1.424 2.44-3.148 2.99-5.029-0.985 0.368-2.033 0.606-3.125 0.691-1.492 3.038-4.619 5.135-8.226 5.135zM28.718 0c-4.985 0-9.026 4.041-9.026 9.026s4.041 9.026 9.026 9.026 9.026-4.041 9.026-9.026-4.041-9.026-9.026-9.026zM30.392 13.827h-1.728v-6.822c-0.635 0.576-1.433 1.004-2.407 1.285v-1.713c0.473-0.118 0.975-0.325 1.506-0.62 0.532-0.325 0.975-0.665 1.329-1.034h1.3v8.904z'],
'menu': ['0 0 22 32', 'M20.8 14.4q0.704 0 1.152 0.48t0.448 1.12-0.48 1.12-1.12 0.48h-19.2q-0.64 0-1.12-0.48t-0.48-1.12 0.448-1.12 1.152-0.48h19.2zM1.6 11.2q-0.64 0-1.12-0.48t-0.48-1.12 0.448-1.12 1.152-0.48h19.2q0.704 0 1.152 0.48t0.448 1.12-0.48 1.12-1.12 0.48h-19.2zM20.8 20.8q0.704 0 1.152 0.48t0.448 1.12-0.48 1.12-1.12 0.48h-19.2q-0.64 0-1.12-0.48t-0.48-1.12 0.448-1.12 1.152-0.48h19.2z']
};
this.getSVG = (type) => {
return `
this.getSVG = (type) => `
<svg xmlns:xlink="http://www.w3.org/1999/xlink" height="100%" version="1.1" viewBox="${svg[type][0]}" width="100%">
<use xlink:href="#aplayer-${type}"></use>
<path class="aplayer-fill" d="${svg[type][1]}" id="aplayer-${type}"></path>
</svg>
`;
};
this.isMobile = /mobile/i.test(window.navigator.userAgent);
// compatibility: some mobile browsers don't suppose autoplay
@ -49,7 +48,7 @@ class APlayer {
theme: '#b7daff',
mode: 'circulation'
};
for (let defaultKey in defaultOption) {
for (const defaultKey in defaultOption) {
if (defaultOption.hasOwnProperty(defaultKey) && !option.hasOwnProperty(defaultKey)) {
option[defaultKey] = defaultOption[defaultKey];
}
@ -69,13 +68,11 @@ class APlayer {
if (isNaN(second)) {
return '00:00';
}
const add0 = (num) => {
return num < 10 ? '0' + num : '' + num;
};
const add0 = (num) => num < 10 ? '0' + num : '' + num;
const min = parseInt(second / 60);
const sec = parseInt(second - min * 60);
const hours = parseInt(min / 60);
const minAdjust = parseInt((second / 60) - (60 * parseInt((second / 60) / 60)));
const minAdjust = parseInt(second / 60 - 60 * parseInt(second / 60 / 60));
return second >= 3600 ? add0(hours) + ':' + add0(minAdjust) + ':' + add0(sec) : add0(min) + ':' + add0(sec);
};
@ -156,7 +153,7 @@ class APlayer {
// fill in HTML
let eleHTML = `
<div class="aplayer-pic" ${(this.music.pic ? (`style="background-image: url('${this.music.pic}');"`) : ``)}>
<div class="aplayer-pic" ${(this.music.pic ? `style="background-image: url('${this.music.pic}');"` : ``)}>
<div class="aplayer-button aplayer-play">
<button type="button" class="aplayer-icon aplayer-icon-play">
${this.getSVG('play')}
@ -205,18 +202,18 @@ class APlayer {
</div>
<div class="aplayer-list" ${this.option.listmaxheight ? `style="max-height: ${this.option.listmaxheight}"` : ``}>
<ol>`;
for (let i = 0; i < this.option.music.length; i++) {
eleHTML += `
for (let i = 0; i < this.option.music.length; i++) {
eleHTML += `
<li>
<span class="aplayer-list-cur" style="background: ${this.option.theme};"></span>
<span class="aplayer-list-index">${(i + 1)}</span>
<span class="aplayer-list-title">${this.option.music[i].title}</span>
<span class="aplayer-list-author">${this.option.music[i].author}</span>
</li>`
}
eleHTML += `
</li>`;
}
eleHTML += `
</ol>
</div>`
</div>`;
this.element.innerHTML = eleHTML;
// hide mode button in arrow container
@ -230,7 +227,7 @@ class APlayer {
this.element.getElementsByClassName('aplayer-time')[0].classList.add('aplayer-time-narrow');
}
// fix the width of aplayer bar
let bar = {};
const bar = {};
bar.barWrap = this.element.getElementsByClassName('aplayer-bar-wrap')[0];
// switch to narrow style
@ -240,7 +237,7 @@ class APlayer {
// play and pause button
this.button = this.element.getElementsByClassName('aplayer-button')[0];
this.button.addEventListener('click', (e) => {
this.button.addEventListener('click', () => {
this.toggle();
});
@ -363,10 +360,10 @@ class APlayer {
});
// get element's view position
function getElementViewLeft(element) {
function getElementViewLeft (element) {
let actualLeft = element.offsetLeft;
let current = element.offsetParent;
let elementScrollLeft;
let elementScrollLeft = 0;
while (current !== null) {
actualLeft += current.offsetLeft;
current = current.offsetParent;
@ -375,10 +372,10 @@ class APlayer {
return actualLeft - elementScrollLeft;
}
function getElementViewTop(element) {
function getElementViewTop (element) {
let actualTop = element.offsetTop;
let current = element.offsetParent;
let elementScrollTop;
let elementScrollTop = 0;
while (current !== null) {
actualTop += current.offsetTop;
current = current.offsetParent;
@ -445,9 +442,9 @@ class APlayer {
/**
* Set music
*/
setMusic(index) {
setMusic (index) {
// get this.music
if (typeof(index) !== 'undefined') {
if (typeof index !== 'undefined') {
this.playIndex = index;
}
const indexMusic = this.playIndex;
@ -505,7 +502,7 @@ class APlayer {
// pause other players (Thanks @Aprikyblue)
if (this.option.mutex) {
for (let i = 0; i < instances.length; i++) {
if (this != instances[i]) {
if (this !== instances[i]) {
instances[i].pause();
}
}
@ -631,7 +628,7 @@ class APlayer {
*/
const parseLrc = (lrc_s) => {
const lyric = lrc_s.split('\n');
let lrc = [];
const lrc = [];
const lyricLen = lyric.length;
for (let i = 0; i < lyricLen; i++) {
// match lrc time
@ -639,12 +636,12 @@ class APlayer {
// match lrc text
const lrcText = lyric[i].replace(/\[(\d{2}):(\d{2})\.(\d{2,3})]/g, '').replace(/^\s+|\s+$/g, '');
if (lrcTimes != null) {
if (lrcTimes) {
// handle multiple time tag
const timeLen = lrcTimes.length;
for (let j = 0; j < timeLen; j++) {
const oneTime = /\[(\d{2}):(\d{2})\.(\d{2,3})]/.exec(lrcTimes[j]);
const lrcTime = (oneTime[1]) * 60 + parseInt(oneTime[2]) + parseInt(oneTime[3]) / ((oneTime[3] + '').length === 2 ? 100 : 1000);
const lrcTime = oneTime[1] * 60 + parseInt(oneTime[2]) + parseInt(oneTime[3]) / ((oneTime[3] + '').length === 2 ? 100 : 1000);
lrc.push([lrcTime, lrcText]);
}
}
@ -693,8 +690,7 @@ class APlayer {
this.lrcContents.style.webkitTransform = 'translateY(0px)';
}
};
let apiurl;
apiurl = this.option.music[index].lrc;
const apiurl = this.option.music[index].lrc;
xhr.open('get', apiurl, true);
xhr.send(null);
}
@ -735,7 +731,7 @@ class APlayer {
/**
* Play music
*/
play(time) {
play (time) {
if (Object.prototype.toString.call(time) === '[object Number]') {
this.audio.currentTime = time;
}
@ -747,7 +743,7 @@ class APlayer {
/**
* Pause music
*/
pause() {
pause () {
if (!this.audio.paused) {
this.audio.pause();
}
@ -756,7 +752,7 @@ class APlayer {
/**
* Set volume
*/
volume(percentage) {
volume (percentage) {
this.updateBar('volume', percentage, 'height');
this.audio.volume = percentage;
if (this.audio.muted) {
@ -775,7 +771,7 @@ class APlayer {
/**
* attach event
*/
on(name, func) {
on (name, func) {
if (typeof func === 'function') {
this.event[name].push(func);
}
@ -784,7 +780,7 @@ class APlayer {
/**
* toggle between play and pause
*/
toggle() {
toggle () {
if (this.button.classList.contains('aplayer-play')) {
this.play();
}
@ -796,33 +792,33 @@ class APlayer {
/**
* get whether multiple music definitions are loaded
*/
isMultiple() {
isMultiple () {
return this.option.music.length > 1;
}
/**
* get random order, using FisherYates shuffle
*/
getRandomOrder() {
function random(min, max) {
if (max == null) {
getRandomOrder () {
function random (min, max) {
if (max) {
max = min;
min = 0;
}
return min + Math.floor(Math.random() * (max - min + 1));
}
function shuffle(arr) {
var length = arr.length,
function shuffle (arr) {
const length = arr.length,
shuffled = new Array(length);
for (var index = 0, rand; index < length; index++) {
for (let index = 0, rand; index < length; index++) {
rand = random(0, index);
if (rand !== index) shuffled[index] = shuffled[rand];
if (rand !== index) {shuffled[index] = shuffled[rand];}
shuffled[rand] = arr[index];
}
return shuffled;
}
if (this.isMultiple()) {
this.randomOrder = shuffle([...Array(this.option.music.length)].map(function(item, i) {
this.randomOrder = shuffle([...Array(this.option.music.length)].map(function (item, i) {
return i;
}));
}
@ -831,9 +827,9 @@ class APlayer {
/**
* get next random number
*/
nextRandomNum() {
nextRandomNum () {
if (this.isMultiple()) {
let index = this.randomOrder.indexOf(this.playIndex);
const index = this.randomOrder.indexOf(this.playIndex);
if (index === this.randomOrder.length - 1) {
return this.randomOrder[0];
}
@ -847,36 +843,36 @@ class APlayer {
}
/**
* Remove song from playlist
* Remove song from playlist
*/
removeSong(indexOfSong) {
if (this.option.music[indexOfSong] != null) { // Check if song exists
removeSong (indexOfSong) {
if (this.option.music[indexOfSong]) { // Check if song exists
const list = this.element.getElementsByClassName('aplayer-list')[0];
var oList = list.getElementsByTagName('ol')[0];
var liList = oList.getElementsByTagName('li');
if (this.option.music[indexOfSong + 1] != null || this.option.music[indexOfSong - 1] != null) {
if (indexOfSong == this.playIndex) {
if (this.option.music[indexOfSong + 1] != null) { // Play next song if it exists.
const oList = list.getElementsByTagName('ol')[0];
const liList = oList.getElementsByTagName('li');
if (this.option.music[indexOfSong + 1] || this.option.music[indexOfSong - 1]) {
if (indexOfSong === this.playIndex) {
if (this.option.music[indexOfSong + 1]) { // Play next song if it exists.
this.setMusic(indexOfSong + 1);
this.playIndex = this.playIndex - 1; // Adjust play index for removed song
}
else if (this.option.music[indexOfSong + 1] == null) { // Play previous song if it exists.
this.setMusic(indexOfSong - 1);
}
else if (!this.option.music[indexOfSong + 1]) { // Play previous song if it exists.
this.setMusic(indexOfSong - 1);
}
}
else {
else {
if (indexOfSong < this.playIndex) {
this.playIndex = this.playIndex - 1;
this.playIndex = this.playIndex - 1;
}
}
if (liList[indexOfSong + 1] == null) {
var targetSong = liList[indexOfSong - 1];
if (liList[indexOfSong + 1]) {
const targetSong = liList[indexOfSong - 1];
targetSong.getElementsByClassName('aplayer-list-index')[0].textContent = indexOfSong;
}
}
else {
for (let i = 1; i < liList.length; i++) {
if (liList[indexOfSong + i] != null) {
var targetSong = liList[indexOfSong + i];
if (liList[indexOfSong + i]) {
const targetSong = liList[indexOfSong + i];
targetSong.getElementsByClassName('aplayer-list-index')[0].textContent = indexOfSong + i;
}
}
@ -884,28 +880,28 @@ class APlayer {
this.option.music.splice(indexOfSong, 1); // Delete song from music array
this.audios.splice(indexOfSong, 1); // Delete song from audios array
liList[indexOfSong].remove();
if (this.option.music[0] != null && this.option.music[1] == null) {
if (this.option.music[0] && this.option.music[1]) {
this.multiple = false;
this.element.classList.remove('aplayer-withlist');
}
}
var listHeight = parseInt(list.style.height, 10);
list.style.height = (listHeight - 33) + "px";
}
const listHeight = parseInt(list.style.height, 10);
list.style.height = listHeight - 33 + "px";
}
else {
console.error("ERROR: Song does not exist");
}
}
}
/**
* destroy this player
*/
destroy() {
destroy () {
instances.splice(instances.indexOf(this), 1);
this.pause();
this.element.innerHTML = '';
clearInterval(this.playedTime);
for (let key in this) {
for (const key in this) {
if (this.hasOwnProperty(key)) {
delete this[key];
}
@ -917,7 +913,7 @@ class APlayer {
*
* @param {Array} newMusic
*/
addMusic(newMusic) {
addMusic (newMusic) {
const wasSingle = !this.isMultiple();
this.option.music = this.option.music.concat(newMusic);
@ -932,7 +928,7 @@ class APlayer {
<span class="aplayer-list-index">${this.option.music.length - newMusic.length + i + 1}</span>
<span class="aplayer-list-title">${newMusic[i].title}</span>
<span class="aplayer-list-author">${newMusic[i].author}</span>
</li>`
</li>`;
}
listEle.innerHTML += newItemHTML;
@ -940,11 +936,11 @@ class APlayer {
this.element.classList.add('aplayer-withlist');
this.audio.loop = false;
}
var songListLength = listEle.getElementsByTagName('li').length;
list.style.height = (songListLength * 33) + 'px';
const songListLength = listEle.getElementsByTagName('li').length;
list.style.height = songListLength * 33 + 'px';
this.getRandomOrder();
}
}
module.exports = APlayer;
export default APlayer;

View File

@ -1,65 +0,0 @@
var webpack = require('webpack');
var path = require('path');
var autoprefixer = require('autoprefixer');
var libraryName = 'APlayer';
var env = process.env.WEBPACK_ENV;
var ROOT_PATH = path.resolve(__dirname);
var APP_PATH = path.resolve(ROOT_PATH, 'src');
var BUILD_PATH = path.resolve(ROOT_PATH, 'dist');
var plugins = [];
if (env !== 'dev') {
plugins.push(
new webpack.optimize.UglifyJsPlugin({
sourceMap: true
})
);
}
module.exports = {
entry: './src/' + libraryName + '.js',
output: {
path: BUILD_PATH,
filename: libraryName + '.min.js',
library: libraryName,
libraryTarget: 'umd',
umdNamedDefine: true
},
devtool: 'source-map',
devServer: {
publicPath: "/dist/",
},
module: {
rules: [
{
test: /\.js$/,
loader: 'babel-loader',
include: APP_PATH,
options: {
presets: ['es2015']
}
},
{
test: /\.scss$/,
use: [
'style-loader',
'css-loader',
'postcss-loader',
'sass-loader'
],
include: APP_PATH
},
{
test: /\.(png|jpg)$/,
loader: 'url-loader?limit=40000'
}
]
},
plugins: plugins
};

115
webpack/dev.config.js Normal file
View File

@ -0,0 +1,115 @@
/* eslint-disable no-undef */
const path = require('path');
const webpack = require('webpack');
const GitRevisionPlugin = require('git-revision-webpack-plugin');
const gitRevisionPlugin = new GitRevisionPlugin();
module.exports = {
devtool: 'cheap-module-source-map',
entry: {
'APlayer': './src/js/index.js'
},
output: {
path: path.resolve(__dirname, '..', 'dist'),
filename: '[name].js',
library: '[name]',
libraryTarget: 'umd',
libraryExport: 'default',
umdNamedDefine: true,
publicPath: '/'
},
resolve: {
modules: ['node_modules'],
extensions: ['.js', '.scss']
},
module: {
strictExportPresence: true,
rules: [
{
test: /\.js$/,
enforce: 'pre',
loader: require.resolve('eslint-loader'),
include: path.resolve(__dirname, '../src/js'),
},
{
test: /\.js$/,
use: [
{
loader: require.resolve('babel-loader'),
options: {
cacheDirectory: true,
presets: ['env']
}
}
]
},
{
test: /\.scss$/,
use: [
require.resolve('style-loader'),
{
loader: require.resolve('css-loader'),
options: {
importLoaders: 1
}
},
{
loader: require.resolve('postcss-loader'),
options: {
config: {
path: path.join(__dirname, 'postcss.config.js')
}
}
},
require.resolve('sass-loader')
]
},
{
test: /\.(png|jpg)$/,
loader: require.resolve('url-loader'),
options: {
'limit': 40000
}
}
]
},
devServer: {
compress: true,
contentBase: path.resolve(__dirname, '..', 'demo'),
clientLogLevel: 'none',
quiet: false,
open: true,
historyApiFallback: {
disableDotRule: true
},
watchOptions: {
ignored: /node_modules/
}
},
plugins: [
new webpack.NamedModulesPlugin(),
new webpack.DefinePlugin({
APLAYER_VERSION: `"${require('../package.json').version}"`,
GIT_HASH: JSON.stringify(gitRevisionPlugin.version())
})
],
node: {
dgram: 'empty',
fs: 'empty',
net: 'empty',
tls: 'empty'
},
performance: {
hints: false
}
};

View File

@ -0,0 +1,5 @@
module.exports = {
plugins: {
'autoprefixer': {}
}
};

117
webpack/prod.config.js Normal file
View File

@ -0,0 +1,117 @@
/* eslint-disable no-undef */
const path = require('path');
const webpack = require('webpack');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const GitRevisionPlugin = require('git-revision-webpack-plugin');
const gitRevisionPlugin = new GitRevisionPlugin();
module.exports = {
bail: true,
devtool: 'source-map',
entry: {
'APlayer': './src/js/index.js'
},
output: {
path: path.resolve(__dirname, '..', 'dist'),
filename: '[name].min.js',
library: '[name]',
libraryTarget: 'umd',
libraryExport: 'default',
umdNamedDefine: true,
publicPath: '/'
},
resolve: {
modules: ['node_modules'],
extensions: ['.js', '.scss']
},
module: {
strictExportPresence: true,
rules: [
{
test: /\.js$/,
enforce: 'pre',
loader: require.resolve('eslint-loader'),
include: path.resolve(__dirname, '../src/js'),
},
{
test: /\.js$/,
use: [
require.resolve('template-string-optimize-loader'),
{
loader: require.resolve('babel-loader'),
options: {
compact: true,
presets: ['env']
}
}
]
},
{
test: /\.scss$/,
use: ExtractTextPlugin.extract({
fallback: require.resolve('style-loader'),
use: [
{
loader: require.resolve('css-loader'),
options: {
importLoaders: 1,
minimize: true,
sourceMap: true
}
},
{
loader: require.resolve('postcss-loader'),
options: {
config: {
path: path.join(__dirname, 'postcss.config.js')
}
}
},
require.resolve('sass-loader')
]
})
},
{
test: /\.(png|jpg)$/,
loader: require.resolve('url-loader'),
options: {
'limit': 40000
}
}
]
},
plugins: [
new webpack.DefinePlugin({
APLAYER_VERSION: `"${require('../package.json').version}"`,
GIT_HASH: JSON.stringify(gitRevisionPlugin.version())
}),
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
},
output: {
comments: false,
ascii_only: true
},
sourceMap: true
}),
new ExtractTextPlugin({
filename: '[name].min.css'
})
],
node: {
dgram: 'empty',
fs: 'empty',
net: 'empty',
tls: 'empty',
}
};

4242
yarn.lock

File diff suppressed because it is too large Load Diff