var bricks = window.bricks || {}; bricks.formatMs=function(ms,all){ var ss=ms%1000;ms=(ms-ss)/1000; var s=ms%60;ms=(ms-s)/60; var m=ms%60;ms=(ms-m)/60; var h=ms; var t=(h?h+":":"") +(all||h+m?("0"+m).substr(-2)+":":"") +(all||h+m+s?("0"+s).substr(-2)+"″":"") +("00"+ss).substr(-3); return t; }; bricks.AudioPlayer = class extends bricks.JsWidget { /* { url: autoplay: } */ constructor(options){ super(options); this.url = options.url; this.audio = this._create('audio'); this.audio.controls = true; if (this.opts.autoplay){ this.audio.addEventListener('canplay', this.play.bind(this)); } this.audio.addEventListener('ended', this.playended.bind(this)); this.audio.style.width = "100%" this.dom_element.appendChild(this.audio); if ( this.url ){ this.set_source(this.url); } this.playlist = []; } get_status() { var audio = this.audio; if (audio.error) { return "error"; } if (audio.ended) { return "ended"; } if (audio.paused) { return "paused"; } if (audio.readyState < 3) { return "loading"; // 数据不足,可能在缓冲 } return "playing"; } add_url(url){ var status = this.get_status(); switch(status){ case 'error': case 'ended': this.set_source(url); break; default: this.playlist.push(url); break; } } playended(e){ if (this.playlist.length > 0) { var url = this.playlist.shift(); this.set_source(url); } else { this.dispatch('ended'); } } set_stream_urls(response){ async function* dyn_urls(response) { const reader = response.body.getReader(); var value; var done; while (true){ done, value = await reader.read(); if (value.done){ console.log('done=', done, 'value=', value); break; } let result = ''; for (let i = 0; i < value.value.length; i++) { result += String.fromCharCode(value.value[i]); } console.log('audio set url=', result); yield result; } } this.url_generator = dyn_urls(response); this.srcList = []; this.notBegin = true; schedule_once(this.load_queue_url.bind(this), 0.1); } async load_queue_url(){ while (true){ var d = await this.url_generator.next(); if (d.done){ return; } this.srcList.push({played:false, url:d.value}); if (this.srcList.length < 2 ){ await this.play_srclist(); this.audio.addEventListener('ended', this.play_srclist.bind(this)); } } } async play_srclist(evnet){ if (event && ! this.audio.ended){ return; } for (var i=0;i