1var folderupload_input = document.getElementById('folderupload_input'); 2var musictable = document.querySelector("#musiclist tbody"); 3folderupload_input.onchange = function () { 4 if (this.files) { 5 document.getElementById('folderuploader').style.display = 'none'; 6 document.querySelector("#musiclist").style.display = 'block'; 7 document.querySelector("#lrc_frame").style.display = 'block'; 8 for (var i = 0; i < this.files.length; i++) { 9 if (this.files[i].type.indexOf('audio/') != -1) { 10 function a(i) { 11 var url = URL.createObjectURL(this.files[i]); 12 var filename = this.files[i].name; 13 var tr = document.createElement('tr'); 14 tr.innerHTML = '<td>' + filename + '</td><td></td><td></td><td></td><td></td><td></td>'; 15 musictable.append(tr); 16 tr.onclick = function () { 17 alert('æ£å¨è¯å«...'); 18 } 19 ID3.loadTags(filename, function () { 20 var tags = ID3.getAllTags(filename); 21 tr.innerHTML = '<td>' + filename + '</td><td>' + (tags.track || '') + '</td><td>' + (tags.album || '') + '</td><td>' + (tags.artist || '') + '</td><td>' + (tags.title || '') + '</td><td>' + (tags.year || '') + '</td>'; 22 tr.querySelectorAll('td').forEach(function(td){ 23 td.title=td.innerText; 24 }) 25 tr.onclick = function () { 26 var src=''; 27 if(tags.picture){ 28 var image = tags.picture; 29 var base64String = ""; 30 for (var i = 0; i < image.data.length; i++) { 31 base64String += String.fromCharCode(image.data[i]); 32 } 33 src = "data:" + image.format + ";base64," + window.btoa(base64String); 34 } 35 if (document.querySelector("tr.act")) { document.querySelector("tr.act").classList.remove('act') }; 36 play(url, src, tags.artist, tags.title, tags.album, filename, tags.lyrics?tags.lyrics.U:'', tr); 37 } 38 }, { 39 tags: ['picture', 'title', 'artist', 'album', 'lyrics', 'comment', 'track', 'year', 'school'], 40 dataReader: ID3.FileAPIReader(this.files[i]) 41 }) 42 } 43 a.call(this, i); 44 } 45 } 46 } 47} 48 49 50var mimg = document.getElementById("music_img"); 51var mp = document.getElementById("music_play"); 52var mtitle = document.getElementById("music_title"); 53var malbum = document.getElementById("music_album"); 54var mname = document.getElementById("music_name"); 55var mrange = document.getElementById("music_range"); 56 57var lastbtn = document.getElementById("lastbtn"); 58var playbtn = document.getElementById("playbtn"); 59var nextbtn = document.getElementById("nextbtn"); 60var nowplaytr = null; 61function play(musicurl, imgurl, artist, title, album, filename, lrc, tr) { 62 mimg.src = imgurl; 63 mp.src = musicurl; 64 mtitle.innerHTML = artist + ' - ' + title; 65 malbum.innerHTML = album; 66 mname.innerHTML = filename; 67 nowplaytr = tr; 68 tr.classList.add('act'); 69 xrlrc(lrc); 70} 71 72mp.oncanplay = function () { 73 mrange.max = mp.duration; 74 try { mp.play() } catch (e) { }; 75} 76mp.onended = function () { 77 if (nextrule == 'repeat-1') { 78 mp.play(); 79 } else { 80 nextbtn.click(); 81 } 82} 83var _up = true; 84mp.ontimeupdate = function () { 85 if (_up) { 86 mrange.value = mp.currentTime; 87 } 88 if(oLRC.ms.length>0){ 89 var q = 0; 90 for (var i = 0; i < oLRC.ms.length; i++) { 91 if ((oLRC.ms[i].t - 0) > mp.currentTime) { 92 lrcf.style.marginTop = (window.innerHeight - 70) / 2 - getLiH(i) + 'px'; 93 if (lrcf.querySelector('li.act')) { 94 lrcf.querySelector('li.act').classList.remove('act'); 95 } 96 lrcf.querySelectorAll('li')[i - 1].classList.add('act'); 97 q = 1; 98 break; 99 } 100 } 101 if (!q) { 102 lrcf.style.marginTop = (window.innerHeight - 70) / 2 - getLiH(oLRC.ms.length - 1) + 'px'; 103 if (lrcf.querySelector('li.act')) { 104 lrcf.querySelector('li.act').classList.remove('act'); 105 } 106 lrcf.querySelectorAll('li')[oLRC.ms.length - 1].classList.add('act'); 107 } 108 } 109 110 function getLiH(i) { 111 var h = 0; 112 for (var i2 = 0; i2 < i; i2++) { 113 var element = lrcf.querySelectorAll('li')[i2]; 114 h += element.offsetHeight; 115 } 116 return h; 117 } 118} 119 120mrange.onmousedown = function () {
121 _up = false; 122 document.onmouseup = function () { 123 document.onmouseup = null; 124 _up = true; 125 mp.currentTime = mrange.value - 0; 126 } 127} 128 129mp.onplay = function () { 130 playbtn.className = 'bi bi-pause'; 131} 132 133mp.onpause = function () { 134 playbtn.className = 'bi bi-play-fill'; 135} 136 137document.getElementById("webqd").onclick=function(){ 138 searchTags(mname.innerText.substring(0,mname.innerText.lastIndexOf('.')),function(a){ 139 mimg.src = a.img; 140 mtitle.innerHTML = a.audio_name; 141 malbum.innerHTML = a.album_name; 142 xrlrc(a.lyrics); 143 }); 144} 145 146playbtn.onclick = function () { 147 if (mp.paused) { 148 mp.play(); 149 } else { 150 mp.pause(); 151 } 152} 153 154lastbtn.onclick = function () { 155 if (nextrule != 'shuffle') { 156 157 if (nowplaytr) { 158 if (nowplaytr.previousSibling) { 159 nowplaytr.previousSibling.click(); 160 } else { 161 var a = document.querySelectorAll("#musiclist tr"); 162 a[a.length - 1].click(); 163 } 164 } else { 165 var a = document.querySelectorAll("#musiclist tr"); 166 if (a.length <= 1) return; 167 a[a.length - 1].click(); 168 } 169 } else { 170 var a = document.querySelectorAll("#musiclist tr"); 171 a[parseInt(Math.random() * a.length)].click(); 172 } 173} 174 175nextbtn.onclick = function () { 176 if (nextrule != 'shuffle') { 177 if (nowplaytr) { 178 if (nowplaytr.nextSibling) { 179 nowplaytr.nextSibling.click(); 180 } else { 181 var a = document.querySelectorAll("#musiclist tr"); 182 a[1].click(); 183 } 184 } else { 185 var a = document.querySelectorAll("#musiclist tr"); 186 if (a.length <= 1) return; 187 a[1].click(); 188 } 189 } else { 190 var a = document.querySelectorAll("#musiclist tr"); 191 a[parseInt(Math.random() * a.length)].click(); 192 } 193 194} 195var oLRC = {}; 196 197function createLrcObj(lrc) { 198 if (lrc.length == 0) return; 199 var lrcs = lrc.split('\n');//ç¨å车æåææ°ç» 200 for (var i in lrcs) {//éåæè¯æ°ç» 201 lrcs[i] = lrcs[i].replace(/(^\s*)|(\s*$)/g, ""); //å»é¤ååç©ºæ ¼ 202 var t = lrcs[i].substring(lrcs[i].indexOf("[") + 1, lrcs[i].indexOf("]"));//å[]é´çå 容 203 var s = t.split(":");//å离:ååæå 204 if (isNaN(parseInt(s[0]))) { //䏿¯æ°å¼ 205 for (var i in oLRC) { 206 if (i != "ms" && i == s[0].toLowerCase()) { 207 oLRC[i] = s[1]; 208 } 209 } 210 } else { //æ¯æ°å¼ 211 var arr = lrcs[i].match(/\[(\d+:.+?)\]/g);//æåæ¶é´å段ï¼å¯è½æå¤ä¸ª 212 var start = 0; 213 for (var k in arr) { 214 start += arr[k].length; //è®¡ç®æè¯ä½ç½® 215 } 216 var content = lrcs[i].substring(start);//è·åæè¯å 容 217 for (var k in arr) { 218 var t = arr[k].substring(1, arr[k].length - 1);//å[]é´çå 容 219 var s = t.split(":");//å离:ååæå 220 oLRC.ms.push({//对象{t:æ¶é´,c:æè¯}å å ¥msæ°ç» 221 t: (parseFloat(s[0]) * 60 + parseFloat(s[1])).toFixed(3), 222 c: content 223 }); 224 } 225 } 226 } 227 oLRC.ms.sort(function (a, b) {//ææ¶é´é¡ºåºæåº 228 return a.t - b.t; 229 }); 230 /* 231 for(var i in oLRC){ //æ¥çè§£æç»æ 232 console.log(i,":",oLRC[i]); 233 }*/ 234} 235var lrcf = document.querySelector("#lrc_frame ul"); 236function xrlrc(lrc) { 237 oLRC = { 238 ti: "", //ææ²å 239 ar: "", //æ¼å±è 240 al: "", //ä¸è¾å 241 by: "", //æè¯å¶ä½äºº 242 offset: 0, //æ¶é´è¡¥å¿å¼ï¼å使¯«ç§ï¼ç¨äºè°æ´æè¯æ´ä½ä½ç½® 243 ms: [] //æè¯æ°ç»{t:æ¶é´,c:æè¯} 244 }; 245 createLrcObj(lrc); 246 var s = ""; 247 for (var i in oLRC.ms) {//éåmsæ°ç»ï¼ææè¯å å ¥å表 248 s += '<li>' + oLRC.ms[i].c + '</li>'; 249 } 250 lrcf.innerHTML = s; 251} 252 253var nextrule = 'repeat'; 254 255document.querySelector("#nextrule").onclick = function () { 256 var list = ['repeat', 'repeat-1', 'shuffle']; 257 nextrule = list[(list.indexOf(nextrule) + 1) > 2 ? 0 : (list.indexOf(nextrule) + 1)]; 258 this.className = 'bi bi-' + nextrule; 259} 260 261function searchTags(name,callback){ 262 jsonp('https://mobiles.kugou.com/api/v3/search/song?format=jsonp&keyword=' + name + '&page=1&pagesize=2&showtype=1',function(res){ 263 var hash=res.data.info[0].hash; 264 var albumid=res.data.info[0].album_id; 265 jsonp("https://wwwapi.kugou.com/yy/index.php?r=play/getdata&hash=" + hash + 266 "&dfid=2mScsJ16ucV81qLdzD238ELf&appid=1014&mid=1b211caf58cd1e1fdfea5a4657cc21f5&platid=4&album_id=" + albumid + 267 "&_=" + Date.now(),function(a){ 268 callback(a.data); 269 }) 270 }) 271} 272function jsonp(src,callback){ 273 var cbn='a'+Math.random().toString(16).slice(2)+Date.now().toString(16); 274 var s=document.createElement('script'); 275 s.src=src+'&callback='+cbn; 276 document.body.append(s); 277 window[cbn]=function(r){ 278 delete window[cbn]; 279 s.remove(); 280 callback(r); 281 } 282}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.