Files
im/util/music/core.js
T
2026-02-15 19:41:13 +08:00

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()
}
}
}