miue-ui
Version:
ali miniProgram UI components for vehicle.
250 lines (236 loc) • 6.16 kB
JavaScript
/**
* author:dansion@163.com
* version:1.0.0
* data:2022-05-28
* - 针对阿里车载小程序容器背景音对象,兼容/优化。
* - 优化 startTime设置在src前面的。
* - 添加针对直播音源部份异常兼容。
* - 添加错误提示数据兼容。
*
* 2023-04-25:
* - 处理 duration 可能是 -1 的情况;
* 2023-04-25
* - 优化src为空的情况;
*/
const _bgm = my.getBackgroundAudioManager()
let _live=false;
let _onTimeUpdateHandler=undefined;
let _prevHandler=false;
let _nextHandler=false;
let _onSeekingHandler=undefined;
let _onSeekedHandler=undefined;
let _seek=(s)=>{
if(!_live){
_bgm.seek(s);
}else{
//直播不支持seek();
}
}
let getDuration=()=>{
let _duration=_bgm.duration;
// 当获取的值是非数字时,重置为0
if(Number.isNaN(parseInt(_duration))){
_duration=0;
}
// 当获取的值小于0 时,重置为 0
if(_duration<0){
return 0;
}
return _duration;
/*
if(!_live){
return _bgm.duration;
}else{
//直播不支持duration;
}
*/
}
let getCurrentTime=()=>{
let _currentTime=_bgm.currentTime;
// 当获取的值是非数字时,重置为0
if(Number.isNaN(parseInt(_currentTime))){
_currentTime=0;
}
//if(!_live){
return _currentTime;
//}else{
//直播不支持currentTime;
//}
}
let getLive=()=>{
//console.log("getLive()");
console.log(_live);
return _live;
}
//针对开发者环境提醒
let _notice=(obj)=>{
if(my.isIDE){
if(!_prevHandler){
console.warn(`背景音模块:onPrev方法的回调函数,在车辆方向盘按健/系统媒体面板触发 <上一首> 的情况下无法响应。`);
}
if(!_nextHandler){
console.warn(`背景音模块:onNext方法的回调函数,在车辆方向盘按健/系统媒体面板触发 <下一首> 的情况下无法响应。`);
}
if(typeof(obj)=="string"){
console.warn(`BGM::直接赋值src的URL,如果是从头播放,建议先设置startTime=0,
推荐src={title:string,singer:string,img:string,startTime:0,src:string,live:true/false}`);
}
}
}
//是不是在直播状态
let _isLive=(url)=>{
if(url==true){
return true;
}else{
if(typeof(url)=='string'){
if(url.indexOf('m3u8')>0){
return true;
}else{
return false;
}
}else{
return false;
}
}
}
//判断网络是不是可用
const _isNetwork=()=>{
return new Promise(resolve=>{
my.getNetworkType({
success: (res) => {
//res.hasNetworkType
resolve(res.networkAvailable);
}
});
})
}
const _src= async(obj)=>{
//todo:判断网络状态
let isNet=await _isNetwork();
//console.log('_src async...');
//console.log(isNet);
//
let _newsrc='';
if(typeof(obj)=="string"){
_live=_isLive(obj);
_newsrc=obj;
}
if(typeof(obj)=="object"){
_bgm.title=obj.title;
_bgm.singer=obj.singer;
_bgm.coverImgUrl=obj.picture || obj.img;
_bgm.startTime=obj.startTime?obj.startTime:0;
_newsrc=obj.src;
_live=_isLive(obj.src);
}
//如果URL不变化的,需要重置一下SRC,激活重新播放。
if(_bgm.src==_newsrc){
_bgm.src='';
}
//当入参为src为空的情况;
//console.log(`bgm _newsrc : ${_newsrc} , and _bgm.src: ${_bgm.src}`);
if(_newsrc!=''){
_bgm.src=_newsrc;
//异步不会自动播放,需要再次调用。
_bgm.play();
}else{
_bgm.src=_newsrc;
// 兼容部份情况下,对src置空,并不生效的情况;
_bgm.stop();
}
//直播的资源,注册拖动回调函数。
if(_live){
if(_bgm.offSeeking){
_bgm.offSeeking();
}
if(_bgm.offSeeked){
_bgm.offSeeked();
}
}
_notice(obj);
}
//定义返回对象初始化函数
const intBGM=()=>{
return {
get duration(){return getDuration()},
get currentTime(){return getCurrentTime()},
get paused(){return _bgm.paused},
get buffered(){return _bgm.buffered},
get live(){return _live;},
//扩展 src 设置方法/提供obj入参方式/兼容因为src设置顺序带的BUG
set src(obj){_src(obj);},
get src(){
// 模拟器情况下初始背景音频的src为空,不是 undefined(真机的值)。
if(_bgm.src==''){
return undefined;
}else{
return _bgm.src;
}
},
set startTime(n){_bgm.startTime=n;},
get startTime(){return _bgm.startTime;},
set title(s){_bgm.title=s;},
get title(){return _bgm.title},
set singer(s){_bgm.singer=s;},
get singer(){return _bgm.singer;},
set coverImgUrl(s){_bgm.coverImgUrl=s;},
get coverImgUrl(){return _bgm.coverImgUrl; },
set webUrl(s){_bgm.webUrl=s;},
get webUrl(){return _bgm.webUrl;},
set playbackRate(s){ _bgm.playbackRate=s;},
get playbackRate(){return _bgm.playbackRate; },
//playbackRate
seek:(f)=>{_seek(f);},
play:()=>{_bgm.play();},
pause:()=>{_bgm.pause();},
stop:()=>{_bgm.stop();},
onWaiting:(f)=>{
_bgm.onWaiting(f);
console.warn(`注意::onWaiting是按顺序必定触发,谨慎使用`);
},
onCanplay:(f)=>{
_bgm.onCanplay(f);
},
onError:(f)=>{
_bgm.onError(f);
//todo:可能和支付宝抛出的错误不一致,需要对齐
},
onPlay:(f)=>{
_bgm.onPlay(f);
},
onPause:(f)=>{
_bgm.onPause(f);
},
onSeeking:(f)=>{
_bgm.onSeeking(f);
_onSeekingHandler=f;
},
onSeeked:(f)=>{
_bgm.onSeeked(f);
_onSeekedHandler=f;
},
onStop:(f)=>{
_bgm.onStop(f);
},
onTimeUpdate:(f)=>{
//将onTimeUpdate设置为单例模式,解决早期版本容器多页面注册带来内存溢出的问题。
if(_onTimeUpdateHandler!=undefined && _bgm.offTimeUpdate!=undefined){
_bgm.offTimeUpdate();
}
_onTimeUpdateHandler=f;
_bgm.onTimeUpdate(f);
},
onEnded:(f)=>{
_bgm.onEnded(f);
},
onNext:(f)=>{
_bgm.onNext(f);
_nextHandler=true;
},
onPrev:(f)=>{
_bgm.onPrev(f);
_prevHandler=true;
}
}
}
export default intBGM();