279 lines
6.5 KiB
JavaScript
279 lines
6.5 KiB
JavaScript
import Vue from 'vue'
|
|
import Store from './store.js'
|
|
import {
|
|
playModeConfig
|
|
} from './config.js';
|
|
import {
|
|
storage,
|
|
storage_constants
|
|
} from "./StorageUtil.js"
|
|
import * as util from "./BaseUtil.js"
|
|
export default {
|
|
extends: Store,
|
|
data() {},
|
|
methods: {
|
|
initMusic() {
|
|
let audioPlayer = null;
|
|
/* #ifdef H5 */
|
|
audioPlayer = uni.createInnerAudioContext();
|
|
/* #endif */
|
|
/* #ifdef APP-PLUS */
|
|
audioPlayer = uni.getBackgroundAudioManager();
|
|
/* #endif */
|
|
audioPlayer.autoplay = false;
|
|
|
|
audioPlayer.onTimeUpdate((e) => {
|
|
this.setPlaySeconds(audioPlayer.currentTime);
|
|
let progress = (audioPlayer.currentTime / audioPlayer.duration) * 100;
|
|
if (progress) {
|
|
this.setProgress(progress);
|
|
}
|
|
this.updateLrc(false);
|
|
});
|
|
|
|
audioPlayer.onCanplay(() => {
|
|
this.setMusicIsReady(true);
|
|
})
|
|
audioPlayer.onError(()=>{
|
|
util.showToast('播放错误,即将播放下一首');
|
|
this.next();
|
|
})
|
|
|
|
audioPlayer.onEnded(() => {
|
|
if (playModeConfig.single.id == this.playMode.id) {
|
|
this.setMusic(this.playIndex, null, () => {
|
|
this.play();
|
|
this.setPlayState(true);
|
|
});
|
|
} else if (playModeConfig.random.id == this.playMode.id) {
|
|
const index = parseInt((this.playList.length - 1) * Math.random())
|
|
this.setMusic(index, null, () => {
|
|
this.play();
|
|
this.setPlayState(true);
|
|
});
|
|
} else {
|
|
this.next();
|
|
}
|
|
})
|
|
Vue.prototype.audioPlayer = audioPlayer;
|
|
Vue.prototype.prev = this.prev;
|
|
Vue.prototype.next = this.next;
|
|
Vue.prototype.stop = this.stop;
|
|
Vue.prototype.pause = this.pause;
|
|
Vue.prototype.play = this.play;
|
|
Vue.prototype.loadLrc = this.loadLrc;
|
|
Vue.prototype.setMusic = this.setMusic;
|
|
// Vue.prototype.getMusicPlayUrl = this.musicApi.getPlayUrl;
|
|
// Vue.prototype.getLrc = this.musicApi.getLrc;
|
|
// Vue.prototype.getMusicOtherInfo = this.musicApi.getMusicOtherInfo
|
|
const playMode = storage.get(storage_constants.playMode);
|
|
if (!playMode) {
|
|
this.setPlayMode(playModeConfig.list);
|
|
}
|
|
const mySongList = storage.getArrayDefault(storage_constants.mySongList, []);
|
|
/**
|
|
* 初始化歌词
|
|
*/
|
|
if (this.playList && this.playIndex >= 0) {
|
|
let music = this.playList[this.playIndex];
|
|
if (music) {
|
|
this.loadLrc(music, () => {
|
|
this.updateLrc(true);
|
|
});
|
|
}
|
|
}
|
|
},
|
|
/**
|
|
* 设置音乐
|
|
* @param {Object} index
|
|
* @param {type} progress
|
|
* @param {Object} call
|
|
*/
|
|
setMusic(index, progress, call) {
|
|
if (this.playList && this.playList.length > 0) {
|
|
if (index == null) {
|
|
index = 0
|
|
}
|
|
// 停止播放
|
|
this.audioPlayer.stop();
|
|
// 更新播放状态
|
|
this.setPlayState(false);
|
|
if (progress) {
|
|
// 重置进度条
|
|
this.setProgress(progress.progress || 0)
|
|
// 重置播放秒数
|
|
this.setPlaySeconds(progress.playSeconds || 0)
|
|
} else {
|
|
// 重置进度条
|
|
this.setProgress(0)
|
|
// 重置播放秒数
|
|
this.setPlaySeconds(0)
|
|
}
|
|
// 重置总秒数
|
|
this.setTotalSeconds(0)
|
|
|
|
// 音乐状态为未准备
|
|
this.setMusicIsReady(false)
|
|
let music = this.playList[index];
|
|
/* this.getMusicOtherInfo(music,(musicOtherInfo)=>{
|
|
music = musicOtherInfo;
|
|
|
|
}) */
|
|
|
|
const oldPlayMusic = this.playList[this.playIndex];
|
|
if (!util.objEquals(oldPlayMusic, music)) {
|
|
// 重置歌词
|
|
this.setLrcs([{
|
|
time: '[00:00.00]',
|
|
content: '歌词加载中'
|
|
}]);
|
|
this.setLrc({
|
|
time: '[00:00.00]',
|
|
content: '歌词加载中'
|
|
})
|
|
}
|
|
this.setPlayIndex(index);
|
|
// 加载歌词
|
|
this.loadLrc(music);
|
|
// 获取播放地址
|
|
Vue.prototype.getMusicPlayUrl && Vue.prototype.getMusicPlayUrl(music).then(playUrl => {
|
|
console.log(`播放地址:${playUrl}`)
|
|
this.audioPlayer.src = playUrl;
|
|
this.audioPlayer.title = music.name;
|
|
this.audioPlayer.singer = music.singer;
|
|
this.audioPlayer.coverImgUrl = music.coverImg;
|
|
let timer = setInterval(() => {
|
|
if (this.musicIsReady) {
|
|
this.setTotalSeconds(this.audioPlayer.duration)
|
|
if (this.playSeconds > 0) {
|
|
this.audioPlayer.seek(this.playSeconds)
|
|
}
|
|
this.setMusicIsReady(false)
|
|
clearInterval(timer);
|
|
if (call) {
|
|
call();
|
|
}
|
|
}
|
|
}, 200);
|
|
})
|
|
}
|
|
},
|
|
getMusicOtherInfo(music, call) {
|
|
if (music.loadOtherInfo) {
|
|
Vue.prototype.getMusicOtherInfo && Vue.prototype.getMusicOtherInfo(music).then(musicResult => {
|
|
call(musicResult)
|
|
})
|
|
}
|
|
},
|
|
/**
|
|
* 加载歌词
|
|
*/
|
|
loadLrc(music, call) {
|
|
Vue.prototype.getLrc && Vue.prototype.getLrc(music).then(lrcStr => {
|
|
if (lrcStr) {
|
|
this.setLrcStr(lrcStr)
|
|
if (call) {
|
|
call();
|
|
}
|
|
} else {
|
|
this.setLrcStr('[00:00.00]无歌词')
|
|
}
|
|
})
|
|
},
|
|
/**
|
|
* 更新当前歌词
|
|
* @param {Object} isInit
|
|
*/
|
|
updateLrc(isInit) {
|
|
if (this.lrcs) {
|
|
const sec = parseInt(this.playSeconds);
|
|
let index = sec + 1;
|
|
let line = this.lrcs[index];
|
|
if (line) {
|
|
this.setLrc(line);
|
|
} else {
|
|
if (isInit) {
|
|
for (var i = index; i >= 0; i--) {
|
|
let initLine = this.lrcs[i];
|
|
if (initLine) {
|
|
this.setLrc(initLine);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
/**
|
|
* 播放
|
|
*/
|
|
play() {
|
|
this.audioPlayer.play();
|
|
this.setPlayState(true);
|
|
const music = this.playList[this.playIndex];
|
|
this.pushRecentlyPlayList(music);
|
|
},
|
|
/**
|
|
* 暂停
|
|
*/
|
|
pause() {
|
|
this.audioPlayer.pause();
|
|
this.setPlayState(false);
|
|
},
|
|
/**
|
|
* 停止
|
|
*/
|
|
stop() {
|
|
this.audioPlayer.stop();
|
|
this.setPlayState(false);
|
|
this.setProgress(0);
|
|
this.setPlaySeconds(0)
|
|
},
|
|
/**
|
|
* 下一曲
|
|
*/
|
|
next() {
|
|
const length = this.playList.length;
|
|
let index = -1;
|
|
if (this.playIndex == length - 1) {
|
|
index = 0;
|
|
} else {
|
|
index = this.playIndex + 1;
|
|
}
|
|
this.setMusic(index, null, () => {
|
|
this.play();
|
|
this.setPlayState(true);
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 上一曲
|
|
*/
|
|
prev() {
|
|
const length = this.playList.length;
|
|
let index = this.playIndex;
|
|
if (index == 0) {
|
|
index = length - 1;
|
|
} else {
|
|
index = index - 1;
|
|
}
|
|
this.setMusic(index, null, () => {
|
|
this.play();
|
|
this.setPlayState(true);
|
|
});
|
|
},
|
|
pushRecentlyPlayList(music){
|
|
let recentlyPlayList = storage.getArrayDefault(storage_constants.recentlyPlayList, []);
|
|
let index = util.findIndex(recentlyPlayList,music);
|
|
if(index >= 0){
|
|
recentlyPlayList.splice(index,1)
|
|
}
|
|
recentlyPlayList.splice(0,0,music)
|
|
this.setRecentlyPlayList(recentlyPlayList);
|
|
this.$forceUpdate()
|
|
}
|
|
}
|
|
}
|