You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
5.1 KiB
170 lines
5.1 KiB
2 years ago
|
module.exports = (option) => {
|
||
|
option = option || {};
|
||
|
const app = option.app;
|
||
|
|
||
|
class Audio {
|
||
|
constructor(option) {
|
||
|
const _ts = this;
|
||
|
|
||
|
_ts.option = option.option;
|
||
|
_ts.playerId = option.playerId;
|
||
|
_ts.dataId = option.dataId;
|
||
|
|
||
|
this.player = this.createPlayer();
|
||
|
this.status = 'init';
|
||
|
}
|
||
|
|
||
|
// 播放
|
||
|
play() {
|
||
|
const _ts = this;
|
||
|
_ts.player.play();
|
||
|
}
|
||
|
|
||
|
// 暂停
|
||
|
pause() {
|
||
|
const _ts = this;
|
||
|
_ts.player.pause();
|
||
|
}
|
||
|
|
||
|
// 获取需要更新的数据键名
|
||
|
getAppDataKey(id){
|
||
|
for(let key in app.data){
|
||
|
let item = app.data[key];
|
||
|
|
||
|
if(item.id === id){
|
||
|
return key;
|
||
|
};
|
||
|
};
|
||
|
}
|
||
|
|
||
|
updateView(data){
|
||
|
data = data || {};
|
||
|
const _ts = this,
|
||
|
option = _ts.option;
|
||
|
|
||
|
_ts.updateKey = _ts.updateKey || _ts.getAppDataKey(_ts.dataId)
|
||
|
|
||
|
let articleData = global.__towxmldata__[_ts.dataId].article,
|
||
|
playerData = global.__towxmldata__[_ts.dataId].audio[_ts.playerId];
|
||
|
|
||
|
// 检查如果数据没有被应用到页面上则中止操作
|
||
|
if(!_ts.updateKey){
|
||
|
return;
|
||
|
};
|
||
|
|
||
|
// 将选项和新传入的数据组合到viewData,后续更新使用
|
||
|
for(let key in data){
|
||
|
option[key] = data[key];
|
||
|
};
|
||
|
|
||
|
// 设置默认进的播放进度
|
||
|
option.duration = _ts.duration || 0.001;
|
||
|
option.currentTime = _ts.currentTime || 0;
|
||
|
option.class = option.class || 'audioForH2w';
|
||
|
|
||
|
// 设置播放器样式
|
||
|
playerData.attr.class = option.class;
|
||
|
|
||
|
// 设置封面图片
|
||
|
playerData.child[1].child[0].attr.src = option.poster;
|
||
|
|
||
|
// 设置进度条
|
||
|
playerData.child[2].child[0].attr.style = `width:${option.currentTime / option.duration * 100}%`;
|
||
|
|
||
|
// 设置title、歌手、播放时间
|
||
|
playerData.child[2].child[1].child[0].text = option.name;
|
||
|
playerData.child[2].child[2].child[0].text = option.author;
|
||
|
playerData.child[2].child[3].child[0].text = `${_ts.formatTime(option.duration)} / ${_ts.formatTime(option.currentTime)}`;
|
||
|
|
||
|
// 更新数据
|
||
|
let updateData = {};
|
||
|
updateData[_ts.updateKey] = articleData;
|
||
|
|
||
|
app.setData(updateData);
|
||
|
}
|
||
|
|
||
|
// 创建播放器
|
||
|
createPlayer(){
|
||
|
const _ts = this;
|
||
|
|
||
|
let option = _ts.option,
|
||
|
|
||
|
autoplay = option.autoplay === 'true' ? true :
|
||
|
option.autoplay === 'false' ? false :
|
||
|
!!option.autoplay,
|
||
|
loop = option.loop === 'true' ? true :
|
||
|
option.loop === 'false' ? false :
|
||
|
!!option.loop,
|
||
|
src = option.src,
|
||
|
audio = wx.createInnerAudioContext();
|
||
|
audio.src = src;
|
||
|
audio.loop = loop;
|
||
|
audio.autoplay = autoplay;
|
||
|
|
||
|
// 进入可播放状态时更新视图
|
||
|
audio.onCanplay(() =>{
|
||
|
_ts.updateView({
|
||
|
class:'audioForH2w'
|
||
|
});
|
||
|
});
|
||
|
|
||
|
// 播放
|
||
|
audio.onPlay(() => {
|
||
|
_ts.status = 'start';
|
||
|
_ts.updateView({
|
||
|
class:'audioForH2w audioForH2w--play'
|
||
|
});
|
||
|
});
|
||
|
|
||
|
// 播放过程中
|
||
|
let temp = 0;
|
||
|
audio.onTimeUpdate(function (obj) {
|
||
|
_ts.status = 'update';
|
||
|
_ts.duration = audio.duration;
|
||
|
_ts.currentTime = audio.currentTime;
|
||
|
|
||
|
// 每5秒更新一次(否则内容过多会导致性能低下)
|
||
|
if(_ts.currentTime - temp > 5){
|
||
|
temp = _ts.currentTime;
|
||
|
_ts.updateView({
|
||
|
class:'audioForH2w audioForH2w--play'
|
||
|
});
|
||
|
};
|
||
|
});
|
||
|
|
||
|
// 暂停
|
||
|
audio.onPause(obj => {
|
||
|
_ts.status = 'pause';
|
||
|
|
||
|
_ts.updateView({
|
||
|
class:'audioForH2w'
|
||
|
});
|
||
|
});
|
||
|
|
||
|
// 停止
|
||
|
audio.onEnded(obj => {
|
||
|
_ts.status = 'end';
|
||
|
|
||
|
_ts.updateView({
|
||
|
class:'audioForH2w audioForH2w--end'
|
||
|
});
|
||
|
});
|
||
|
return audio;
|
||
|
}
|
||
|
|
||
|
// 数字补位
|
||
|
fillIn(val) {
|
||
|
return `${val < 10 ? '0' : ''}${val}`;
|
||
|
}
|
||
|
|
||
|
// 格式化时间
|
||
|
formatTime(time){
|
||
|
let fillIn = this.fillIn,
|
||
|
second = Math.floor(time % 60),
|
||
|
minute = Math.floor(time / 60 % 60),
|
||
|
hour = Math.floor(time / 60 / 60);
|
||
|
return `${fillIn(hour)}:${fillIn(minute)}:${fillIn(second)}`;
|
||
|
}
|
||
|
};
|
||
|
return new Audio(option);
|
||
|
};
|