Site updated: 2022-11-11 11:19:09

This commit is contained in:
qinglong committed 2022-11-11 11:19:10 +08:00
1 parent 49cb9ee8a0
commit 8f3c69ab8d
108 files changed
+951 -106

No files matched your search

+3
View File
@@ -0,0 +1,3 @@
var e={version:"0.0.0",hostname:"https://blog.jingxiyuan.cn",root:"/",statics:"/",favicon:{normal:"images/favicon.ico",hidden:"images/failure.ico"},darkmode:false,auto_scroll:true,js:{valine:"gh/amehime/MiniValine@4.2.2-beta10/dist/MiniValine.min.js",chart:"npm/frappe-charts@1.5.0/dist/frappe-charts.min.iife.min.js",copy_tex:"npm/katex@0.12.0/dist/contrib/copy-tex.min.js",fancybox:"combine/npm/jquery@3.5.1/dist/jquery.min.js,npm/@fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.js,npm/justifiedGallery@3.8.1/dist/js/jquery.justifiedGallery.min.js"},css:{valine:"css/comment.css",katex:"npm/katex@0.12.0/dist/katex.min.css",mermaid:"css/mermaid.css",fancybox:"combine/npm/@fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.css,npm/justifiedGallery@3.8.1/dist/css/justifiedGallery.min.css"},loader:{start:true,"switch":true},search:{appID:"2NU6BAFQUF",apiKey:"47a93cc6d8d1e77bd82d36e8365788dc",indexName:"blog",hits:{per_page:10}},valine:{appId:"pFJTr97i45HCNkAPfurKR0rS-gzGzoHsz",appKey:"9LsEPqi4hHCtghqzc7qDLyNV",placeholder:"ヽ(○´∀`)ノ♪欢迎畅所欲言",avatar:"mp",pageSize:10,lang:"zh-CN",visitor:true,NoRecordIP:false,serverURLs:null,powerMode:true,tagMeta:{visitor:"新朋友",master:"博主",friend:"小伙伴",investor:"金主粑粑"},tagColor:{master:"var(--color-orange)",friend:"var(--color-aqua)",investor:"var(--color-pink)"},tagMember:{master:["d2d281bfc950fb3d79ff50c5e2c7bd89"],friend:null,investor:null}},quicklink:{timeout:3e3,priority:true},audio:[{title:"博主喜欢",list:[{name:"仙剑问情",url:"https://music.163.com/song/media/outer/url?id=1416747959",artist:"萧人凤",cover:"https://p2.music.126.net/gZlHY7Cc2MaD7UVhgv7rYw==/109951164626902666.jpg?param=130y130",lrc:"[00:00.000] 作词 : 贾卓伦[00:01.000] 作曲 : 骆集益[00:26.940]细雨飘 清风摇[00:29.330]凭借痴心般情长[00:31.810]皓雪落 黄河浊[00:34.210]任由他绝情心伤[00:36.740]放下吧 手中剑 我情愿[00:41.870]唤回了 心底情 宿命尽[00:46.800]为何要 孤独绕[00:49.240]你在世界另一边[00:51.770]对我的深情[00:54.620]怎能用只字片语写得尽[00:59.290]写得尽[01:01.874]不贪求一个愿[01:06.736]又想起 你的脸[01:09.587]朝朝暮暮 漫漫人生路[01:16.278]时时刻刻 看到你的眼眸里[01:23.298]柔情似水[01:26.298]今生缘 来世再续[01:31.168]情何物 生死相许[01:36.096]如有你相伴 不羡鸳鸯不羡仙[02:19.417]情天动 青山中[02:21.756]阵风瞬息万里云[02:24.298]寻佳人 情难真[02:26.787]御剑踏破乱红尘[02:29.275]翱翔那 苍穹中 心不尽[02:34.358]纵横在 千年间 轮回转[02:39.327]为何让 寂寞长[02:41.817]我在世界这一边[02:44.306]对你的思念[02:47.146]怎能用千言万语说得清[02:51.876]说得清[02:54.306]只奢望一次醉[02:59.317]又想起 你的脸[03:02.115]寻寻觅觅 相逢在梦里[03:08.485]时时刻刻 看到你的眼眸里[03:15.847]缱绻万千[03:18.537]今生缘 来世再续[03:23.567]情何物 生死相许[03:28.597]如有你相伴 不羡鸳鸯不羡仙"},{name:"大天蓬",url:"https://music.163.com/song/media/outer/url?id=1483488153",artist:"璐爷",cover:"https://p2.music.126.net/rn6L_xf1tlVAyHOz95mmMQ==/109951165354012465.jpg?param=130y130",lrc:"[00:00.000] 作词 : 宋雪苍/李袁杰[00:01.000] 作曲 : 李袁杰[00:02.000] 制作人 : 刘子睦[00:28.23]美人不是凡胎生[00:34.91]应是仙器灵长成[00:41.94]既然你是神兵[00:45.19]为何比我更多情[00:49.16]深深伤的却是你[00:55.78]六曜五星配红妆[01:02.23]此生虽短情意长[01:09.19]惹得天怒地也恼[01:12.63]人间再无红颜笑[01:16.48]留一半相思上大道 [01:22.49]怕什么天道轮回[01:26.20]什么魄散魂飞[01:30.23]若没有你那才叫可悲[01:36.12]怕什么西行无归[01:40.06]什么事与愿违[01:43.90]这一世换我护你一对[01:50.45][02:17.92]六曜五星配红妆[02:24.66]此生虽短情意长[02:31.44]惹得天怒地也恼[02:34.89]人间再无红颜笑[02:38.81]留一半相思上大道[02:44.53]怕什么天道轮回[02:48.56]什么魄散魂飞[02:52.94]若没有你那才叫可悲[02:58.55]怕什么西行无归[03:02.25]什么事与愿违[03:06.24]这一世换我护你一对[03:12.22]怕什么天道轮回[03:15.92]什么魄散魂飞[03:19.92]若没有你那才叫可悲[03:25.96]怕什么西行无归[03:29.70]什么事与愿违[03:33.62]这一世换我护你一对[03:40.41]这一世换我护你一对"},{name:"左手指月",url:"https://music.163.com/song/media/outer/url?id=536096151",artist:"萨顶顶",cover:"https://p1.music.126.net/gEia-o05FSas8uJos54Sug==/109951163456726954.jpg?param=130y130",lrc:"[00:00.000] 作词 : 喻江[00:01.000] 作曲 : 萨顶顶[00:02.000] 编曲 : 刘胡轶/常石磊[00:03.000] 制作人 : 常石磊[00:04.000] 弦乐编写 : 刘胡轶[00:05.000] 和声 : 萨顶顶[00:06.000] 人声录音 : 李杨/曹洋[00:07.000] 人声录音室 : 55Tec Studio/C-VOICE STUDIO[00:08.000] 人声编辑 : 曹洋[00:09.000] 混音师 : 赵靖[0Line truncated
},{name:"芒种",url:"https://pan.jingxiyuan.cn/d/音乐/音阙诗听赵方婧-芒种.mp3",artist:"赵方婧",cover:"http://p2.music.126.net/uUb-wh8KjjJk0dG3G_GFLQ==/109951167148117469.jpg?param=300x300",lrc:"[00:00.000] 作词 : 假寐[00:00.000] 作曲 : 殇小谨[00:00.00]音阙诗听、赵方婧 - 芒种[00:00.00]作词:假寐[00:00.00]作曲:殇小谨[00:00.00]编曲:Morri3on(乔凡三)[00:01.38]一想到你我就[00:04.24]Wu[00:04.85]空恨别梦久[00:07.31]Wu[00:09.70]烧去纸灰埋烟柳[00:33.75]于鲜活的枝丫[00:36.03]凋零下的无暇[00:38.44]是收获谜底的代价[00:42.37]余晖沾上[00:43.78]远行人的发[00:45.60]他洒下手中牵挂[00:49.54]于桥下[00:51.72]前世迟来者[00:53.38]擦肩而过[00:54.60]掌心刻[00:55.56]来生记得[00:57.09]你眼中烟波滴落一滴墨[00:59.96]Wo[01:01.99]若佛说[01:02.80]无牵无挂[01:04.00]放下执着[01:05.40]无相无色[01:06.58]我怎能[01:07.28]波澜不惊[01:08.43]去附和[01:10.90]一想到你我就[01:13.17]Wu[01:14.55]恨情不寿[01:15.35]总于苦海囚[01:16.81]Wu[01:19.18]新翠徒留[01:20.09]落花影中游[01:21.60]Wu[01:24.02]相思无用[01:24.88]才笑山盟旧[01:26.34]Wu[01:29.93]谓我何求[01:39.81]谓我何求[01:43.37]种一万朵莲花[01:45.58]在众生中发芽[01:48.00]等红尘一万种解答[01:51.88]念珠落进[01:53.39]时间的泥沙[01:55.40]待割舍诠释慈悲的读法[02:01.29]前世迟来者[02:02.65]擦肩而过[02:04.28]掌心刻[02:05.24]来生记得[02:06.65]你眼中烟波滴落一滴墨[02:09.58]Wo[02:11.46]若佛说[02:12.47]无牵无挂[02:13.77]放下执着[02:14.88]无相无色[02:16.13]我怎能[02:16.89]波澜不惊[02:18.13]去附和[02:22.95]一想到你我就[02:25.16]Wu[02:26.42]恨情不寿[02:27.35]总于苦海囚[02:28.76]Wu[02:31.17]新翠徒留[02:32.08]落花影中游[02:33.59]Wu[02:36.00]相思无用[02:36.91]才笑山盟旧[02:38.61]Wu[02:42.16]谓我何求[02:51.65]谓我何求"},{name:"凉凉",url:"https://pan.jingxiyuan.cn/d/音乐/杨宗纬、张碧晨 - 凉凉.mp3",artist:"杨宗纬、张碧晨",cover:"http://p1.music.126.net/mmyJBXc7xakVOmKSHeM8wg==/109951165336492651.jpg?param=300x300",lrc:"[00:00.000] 作词 : 刘畅[00:01.000] 作曲 : 谭旋[00:02.000] 编曲 : 尼克[00:03.000] Program : 尼克[00:07.220][00:40.620]女:[00:42.760]入夜渐微凉[00:45.040]繁花落地成霜[00:47.630]你在远方眺望[00:50.480]耗尽所有暮光[00:53.080]不思量自难相忘[01:00.330][01:02.540]男:[01:04.300]夭夭桃花凉[01:06.450]前世你怎舍下[01:08.990]这一海心茫茫[01:11.800]还故作不痛不痒不牵强[01:18.980]都是假象[01:22.840]女:[01:25.310]凉凉夜色为你思念成河[01:30.800]化作春泥呵护着我[01:34.960]男:[01:36.400]浅浅岁月拂满爱人袖[01:40.740]片片芳菲入水流[01:46.080]女:[01:47.030]凉凉天意潋滟一身花色[01:52.220]落入凡尘伤情着我[01:55.990]男:[01:57.490]生劫易渡情劫难了[02:00.490]折旧的心还有几分前生的恨[02:08.330]还有几分[02:10.750]合:[02:12.470]前生的恨[02:15.750][02:35.670]女:[02:37.740]也曾鬓微霜[02:39.870]也曾因你回光[02:42.370]悠悠岁月漫长[02:44.910]怎能浪费时光[02:47.660]去流浪[02:48.600]男:[02:49.130]去流浪[02:51.030]女:[02:52.440]去换成长[02:55.370][02:56.070]男:[02:58.490]灼灼桃花凉[03:01.230]今生愈渐滚烫[03:03.410]合:[03:03.820]一朵已放心上[03:06.320]足够三生三世背影成双[03:10.360]女:[03:11.150]背影成双[03:12.190][03:13.070]合:[03:13.650]在水一方[03:18.830]女:[03:20.330]凉凉夜色为你思念成河[03:25.590]化作春泥呵护着我[03:29.250]男:[03:30.940]浅浅岁月拂满爱人袖[03:35.290]片片芳菲入水流[03:40.980]女:[03:41.860]凉凉天意潋滟一身花色[03:46.780]落入凡尘伤情着我[03:50.850]男:[03:52.400]生劫易渡情劫难了[03:55.170]折旧的心还有[03:57.170]合:[03:57.770]几分前生的恨[04:03.190][04:12.760]女:[04:14.000]凉凉三生三世恍然如梦[04:18.950]须臾的年风干泪痕[04:22.700]男:[04:24.310]若是回忆不能再相认[04:28.040]合:[04:28.660]就让情分落九尘[04:34.410]女:[04:35.020]凉凉十里何时还会春盛[04:39.880]又见树下一盏风存[04:44.090]男:[04:45.710]落花有意流水无情[04:48.490]别让恩怨爱恨[04:50.550]合:[04:51.120]凉透那花的纯[04:57.570][05:00.040]吾生愿牵尘"},{name:"红昭愿",url:"https://pan.jingxiyuan.cn/d/音乐/音阙诗听-红昭愿.mp3",artist:"音阙诗听",cover:"http://p1.music.126.net/A7TUsw1K59EvGblIRnXxLQ==/109951167708802304.jpg?param=300x300",lrc:"[00:00.000] 作词 : 杨宇勋[00:00.153] 作曲 : 杨宇勋[00:00.306] 编曲 : 杨宇勋[00:00.459]混音:杨宇勋[00:01.001]母带:杨宇勋[00:18.765]手中雕刻生花,[00:20.919]刀锋千转蜿蜒成画,[00:22.994]盛名功德塔,[00:24.465]是桥畔某处人家,[00:27.166]春风绕过发梢红纱,[00:29.339]刺绣赠他Line truncated
const m=d+u+p;a.push([m,s])}}}a=a.filter(function(e){return e[1]});a.sort(function(e,t){return e[0]-t[0]});return a}else{return[]}},fetch:function(e,t){fetch(e).then(function(e){return e.text()}).then(function(e){t(e)}).catch(function(e){})}};var l={el:null,create:function(){var t=s.current();this.el.innerHTML='<div class="cover"><div class="disc"><img src="'+t.cover+'" class="blur" /></div></div>'+'<div class="info"><h4 class="title">'+t.name+"</h4><span>"+t.artist+"</span>"+'<div class="lrc"></div></div>';this.el.child(".cover").addEventListener("click",e.player.options.events["play-pause"]);o.create(this.el.child(".lrc"))}};var h={el:null,bar:null,create:function(){var e=s.current().el;if(e){if(this.el){this.el.parentNode.removeClass("current").removeEventListener(n.nameMap.dragStart,this.drag);this.el.remove()}this.el=e.createChild("div",{className:"progress"});this.el.attr("data-dtime",n.secondToTime(0));this.bar=this.el.createChild("div",{className:"bar"});e.addClass("current");e.addEventListener(n.nameMap.dragStart,this.drag);s.scroll()}},update:function(e){this.bar.width(Math.floor(e*100)+"%");this.el.attr("data-ptime",n.secondToTime(e*i.duration))},seeking:function(e){if(e)this.el.addClass("seeking");else this.el.removeClass("seeking")},percent:function(e,t){var a=((e.clientX||e.changedTouches[0].clientX)-t.left())/t.width();a=Math.max(a,0);return Math.min(a,1)},drag:function(t){t.preventDefault();var a=s.current().el;var r=function(e){e.preventDefault();var t=h.percent(e,a);h.update(t);o.update(t*i.duration)};var c=function(t){t.preventDefault();a.removeEventListener(n.nameMap.dragEnd,c);a.removeEventListener(n.nameMap.dragMove,r);var s=h.percent(t,a);h.update(s);e.player.seek(s*i.duration);i.disableTimeupdate=false;h.seeking(false)};i.disableTimeupdate=true;h.seeking(true);a.addEventListener(n.nameMap.dragMove,r);a.addEventListener(n.nameMap.dragEnd,c)}};var f={el:null,btns:{},step:"next",create:function(){if(!e.player.options.controls)return;var t=this;e.player.options.controls.forEach(function(a){if(t.btns[a])return;var r={onclick:function(n){t.events[a]?t.events[a](n):e.player.options.events[a](n)}};switch(a){case"volume":r.className=" "+(i.muted?"off":"on");r.innerHTML='<div class="bar"></div>';r["on"+n.nameMap.dragStart]=t.events["volume"];r.onclick=null;break;case"mode":r.className=" "+e.player.options.mode;break;default:r.className="";break}r.className=a+r.className+" btn";t.btns[a]=t.el.createChild("div",r)});t.btns["volume"].bar=t.btns["volume"].child(".bar")},events:{mode:function(t){switch(e.player.options.mode){case"loop":e.player.options.mode="random";break;case"random":e.player.options.mode="order";break;default:e.player.options.mode="loop"}f.btns["mode"].className="mode "+e.player.options.mode+" btn";d.set("_PlayerMode",e.player.options.mode)},volume:function(t){t.preventDefault();var a=t.currentTarget;var r=false;var s=function(t){t.preventDefault();e.player.volume(f.percent(t,a));r=true};var o=function(t){t.preventDefault();a.removeEventListener(n.nameMap.dragEnd,o);a.removeEventListener(n.nameMap.dragMove,s);if(r){e.player.muted();e.player.volume(f.percent(t,a))}else{if(i.muted){e.player.muted();e.player.volume(i.volume)}else{e.player.muted("muted");f.update(0)}}};a.addEventListener(n.nameMap.dragMove,s);a.addEventListener(n.nameMap.dragEnd,o)},backward:function(t){f.step="prev";e.player.mode()},forward:function(t){f.step="next";e.player.mode()}},update:function(e){f.btns["volume"].className="volume "+(!i.muted&&e>0?"on":"off")+" btn";f.btns["volume"].bar.width(Math.floor(e*100)+"%")},percent:function(e,t){var a=((e.clientX||e.changedTouches[0].clientX)-t.left())/t.width();a=Math.max(a,0);return Math.min(a,1)}};var v={onerror:function(){var t=s.current();if(!t.repair&&t.company&&t.company=="netease"){var a=t.url.substring(t.url.indexOf("id=")+3,t.url.indexOf("&auth="));t.url="https://music.163.com/song/media/outer/url?id="+a;t.pic="https://p3.music.126.net/Vji3PQJAZ2C7gS_6X51NFQ==/109951164723650033.jpg?param=200y200";t.cover=t.pic;t.repair=true;e.player.play()}else{s.error();e.player.mode()}},ondurationchange:function(){if(i.duration!==1){h.el.attr("data-dtime",n.secondToTime(i.duration))}},onloadedmetadata:function(){e.player.seek(0);h.el.attr("data-dtime",n.secondToTime(i.duration))},onplay:function(){e.parentNode.addClass("playing");U(this.attr("title"));p=e},onpause:function(){e.parentNode.removeClass("playing");p=null},ontimeupdate:function(){if(!this.disableTimeupdate){h.update(this.currentTime/this.duration);o.update(this.currentTime)}},onended:function(t){e.player.mode();e.player.play()}};var g={el:{},create:function(){if(!e.player.options.btns)return;var t=this;e.player.options.btns.forEach(function(a){if(t.el[a])return;t.el[a]=e.createChild("div",{className:a+" btn",onclick:function(t){e.player.fetch().then(function(){e.player.options.events[a](t)})}})})}};var w=function(t){if(e.player.created)return;e.player.options=Object.assign(a,t);e.player.options.mode=d.get("_PLine truncated
+842
View File
@@ -0,0 +1,842 @@
var NOWPLAYING = null
const isMobile = /mobile/i.test(window.navigator.userAgent);
const mediaPlayer = function(t, config) {
var option = {
type: 'audio',
mode: 'random',
btns: ['play-pause', 'music'],
controls: ['mode', 'backward', 'play-pause', 'forward', 'volume'],
events: {
"play-pause": function(event) {
if(source.paused) {
t.player.play()
} else {
t.player.pause()
}
},
"music": function(event) {
if(info.el.hasClass('show')) {
info.hide()
} else {
info.el.addClass('show');
playlist.scroll().title()
}
}
}
}, utils = {
random: function(len) {
return Math.floor((Math.random()*len))
},
parse: function(link) {
var result = [];
[
['music.163.com.*song.*id=(\\d+)', 'netease', 'song'],
['music.163.com.*album.*id=(\\d+)', 'netease', 'album'],
['music.163.com.*artist.*id=(\\d+)', 'netease', 'artist'],
['music.163.com.*playlist.*id=(\\d+)', 'netease', 'playlist'],
['music.163.com.*discover/toplist.*id=(\\d+)', 'netease', 'playlist'],
['y.qq.com.*song/(\\w+).html', 'tencent', 'song'],
['y.qq.com.*album/(\\w+).html', 'tencent', 'album'],
['y.qq.com.*singer/(\\w+).html', 'tencent', 'artist'],
['y.qq.com.*playsquare/(\\w+).html', 'tencent', 'playlist'],
['y.qq.com.*playlist/(\\w+).html', 'tencent', 'playlist'],
['xiami.com.*song/(\\w+)', 'xiami', 'song'],
['xiami.com.*album/(\\w+)', 'xiami', 'album'],
['xiami.com.*artist/(\\w+)', 'xiami', 'artist'],
['xiami.com.*collect/(\\w+)', 'xiami', 'playlist'],
].forEach(function(rule) {
var patt = new RegExp(rule[0])
var res = patt.exec(link)
if (res !== null) {
result = [rule[1], rule[2], res[1]]
}
})
return result
},
fetch: function(source) {
var list = []
return new Promise(function(resolve, reject) {
source.forEach(function(raw) {
var meta = utils.parse(raw)
if(meta[0]) {
var skey = JSON.stringify(meta)
var playlist = store.get(skey)
if(playlist) {
//自己修改-start
var audioInfos = JSON.parse(playlist);
var neteaseStartUrl = "https://music.163.com/song/media/outer/url?id=";
//如果api.i-meto.com接口不正常并且是网易音乐就自己构建url
if (!t.player.meto && meta[0] == "netease" && audioInfos && audioInfos.length>0 &&
!audioInfos[0].url.startsWith(neteaseStartUrl)) {
audioInfos.forEach(function(audioInfo) {
var id = audioInfo.url.substring(audioInfo.url.indexOf("id=")+3, audioInfo.url.indexOf("&auth="));
audioInfo.url = neteaseStartUrl + id;
audioInfo.pic = "https://p3.music.126.net/Vji3PQJAZ2C7gS_6X51NFQ==/109951164723650033.jpg?param=200y200";
})
} else {
list.push.apply(list, audioInfos);
resolve(list);
}
//自己修改-end
} else {
fetch('https://api.i-meto.com/meting/api?server='+meta[0]+'&type='+meta[1]+'&id='+meta[2]+'&r='+ Math.random())
.then(function(response) {
return response.json()
}).then(function(json) {
store.set(skey, JSON.stringify(json))
list.push.apply(list, json);
resolve(list);
}).catch(function(ex) {})
}
} else {
list.push(raw);
resolve(list);
}
})
})
},
secondToTime: function(second) {
var add0 = function(num) {
return isNaN(num) ? '00' : (num < 10 ? '0' + num : '' + num)
};
var hour = Math.floor(second / 3600);
var min = Math.floor((second - hour * 3600) / 60);
var sec = Math.floor(second - hour * 3600 - min * 60);
return (hour > 0 ? [hour, min, sec] : [min, sec]).map(add0).join(':');
},
nameMap: {
dragStart: isMobile ? 'touchstart' : 'mousedown',
dragMove: isMobile ? 'touchmove' : 'mousemove',
dragEnd: isMobile ? 'touchend' : 'mouseup',
}
}, source = null;
t.player = {
_id: utils.random(999999),
group: true,
// 加载播放列表
load: function(newList) {
var d = ""
var that = this
if(newList && newList.length > 0) {
if(this.options.rawList !== newList) {
this.options.rawList = newList;
playlist.clear()
// 获取新列表
//this.fetch()
}
} else {
// 没有列表时,隐藏按钮
d = "none"
this.pause()
}
for(var el in buttons.el) {
buttons.el[el].display(d)
}
return this
},
fetch: function () {
var that = this;
return new Promise(function(resolve, reject) {
if(playlist.data.length > 0) {
resolve()
} else {
if(that.options.rawList) {
var promises = [];
that.options.rawList.forEach(function(raw, index) {
promises.push(new Promise(function(resolve, reject) {
var group = index
var source
if(!raw.list) {
group = 0
that.group = false
source = [raw]
} else {
that.group = true
source = raw.list
}
utils.fetch(source).then(function(list) {
playlist.add(group, list)
resolve()
})
}))
})
Promise.all(promises).then(function() {
resolve(true)
})
}
}
}).then(function(c) {
if(c) {
playlist.create()
controller.create()
that.mode()
}
})
},
// 根据模式切换当前曲目index
mode: function() {
var total = playlist.data.length;
if(!total || playlist.errnum == total)
return;
var step = controller.step == 'next' ? 1 : -1
var next = function() {
var index = playlist.index + step
if(index > total || index < 0) {
index = controller.step == 'next' ? 0 : total-1;
}
playlist.index = index;
}
var random = function() {
var p = utils.random(total)
if(playlist.index !== p) {
playlist.index = p
} else {
next()
}
}
switch (this.options.mode) {
case 'random':
random()
break;
case 'order':
next()
break;
case 'loop':
if(controller.step)
next()
if(playlist.index == -1)
random()
break;
}
this.init()
},
// 直接设置当前曲目index
switch: function(index) {
if(typeof index == 'number'
&& index != playlist.index
&& playlist.current()
&& !playlist.current().error) {
playlist.index = index;
this.init()
}
},
// 更新source为当前曲目index
init: function() {
var item = playlist.current()
if(!item || item['error']) {
this.mode();
return;
}
var playing = false;
if(!source.paused) {
playing = true
this.stop()
}
source.attr('src', item.url);
source.attr('title', item.name + ' - ' + item.artist);
this.volume(store.get('_PlayerVolume') || '0.7')
this.muted(store.get('_PlayerMuted'))
progress.create()
if(this.options.type == 'audio')
preview.create()
if(playing == true) {
this.play()
}
},
play: function() {
NOWPLAYING && NOWPLAYING.player.pause()
if(playlist.current().error) {
this.mode();
return;
}
var that = this
source.play().then(function() {
playlist.scroll()
}).catch(function(e) {});
},
pause: function() {
source.pause()
document.title = originTitle
},
stop: function() {
source.pause();
source.currentTime = 0;
document.title = originTitle;
},
seek: function(time) {
time = Math.max(time, 0)
time = Math.min(time, source.duration)
if (isNaN(time)) {
time = 0;
}
source.currentTime = time;
progress.update(time / source.duration)
},
muted: function(status) {
if(status == 'muted') {
source.muted = status
store.set('_PlayerMuted', status)
controller.update(0)
} else {
store.del('_PlayerMuted')
source.muted = false
controller.update(source.volume)
}
},
volume: function(percentage) {
if (!isNaN(percentage)) {
controller.update(percentage)
store.set('_PlayerVolume', percentage)
source.volume = percentage
}
},
mini: function() {
info.hide()
}
};
var info = {
el: null,
create: function() {
if(this.el)
return;
this.el = t.createChild('div', {
className: 'player-info',
innerHTML: (t.player.options.type == 'audio' ? '<div class="preview"></div>' : '') + '<div class="controller"></div><div class="playlist"></div>'
}, 'after');
preview.el = this.el.child(".preview");
playlist.el = this.el.child(".playlist");
controller.el = this.el.child(".controller");
},
hide: function() {
var el = this.el
el.addClass('hide');
window.setTimeout(function() {
el.removeClass('show hide')
}, 300);
}
}
var playlist = {
el: null,
data: [],
index: -1,
errnum: 0,
add: function(group, list) {
var that = this
list.forEach(function(item, i) {
item.group = group;
item.name = item.name || item.title || 'Meida name';
item.artist = item.artist || item.author || 'Anonymous';
item.cover = item.cover || item.pic;
item.type = item.type || 'normal';
that.data.push(item);
});
},
clear: function() {
this.data = []
this.el.innerHTML = ""
if(this.index !== -1) {
this.index = -1
t.player.fetch()
}
},
create: function() {
var el = this.el
this.data.map(function(item, index) {
if(item.el)
return
var id = 'list-' + t.player._id + '-'+item.group
var tab = $('#' + id)
if(!tab) {
tab = el.createChild('div', {
id: id,
className: t.player.group ?'tab':'',
innerHTML: '<ol></ol>',
})
if(t.player.group) {
tab.attr('data-title', t.player.options.rawList[item.group]['title'])
.attr('data-id', t.player._id)
}
}
item.el = tab.child('ol').createChild('li', {
title: item.name + ' - ' + item.artist,
innerHTML: '<span class="info"><span>'+item.name+'</span><span>'+item.artist+'</span></span>',
onclick: function(event) {
var current = event.currentTarget;
if(playlist.index === index && progress.el) {
if(source.paused) {
t.player.play();
} else {
t.player.seek(source.duration * progress.percent(event, current))
}
return;
}
t.player.switch(index);
t.player.play();
}
})
return item
})
tabFormat()
},
current: function() {
return this.data[this.index]
},
scroll: function() {
var item = this.current()
var li = this.el.child('li.active')
li && li.removeClass('active')
var tab = this.el.child('.tab.active')
tab && tab.removeClass('active')
li = this.el.find('.nav li')[item.group]
li && li.addClass('active')
tab = this.el.find('.tab')[item.group]
tab && tab.addClass('active')
pageScroll(item.el, item.el.offsetTop)
return this
},
title: function() {
if(source.paused)
return
var current = this.current()
document.title = 'Now Playing...' + current['name'] + ' - ' + current['artist'] + ' | ' + originTitle;
},
error: function() {
var current = this.current()
current.el.removeClass('current').addClass('error')
current.error = true
this.errnum++
}
}
var lyrics = {
el: null,
data: null,
index: 0,
create: function(box) {
var current = playlist.index
var that = this
var raw = playlist.current().lrc
var callback = function(body) {
if(current !== playlist.index)
return;
that.data = that.parse(body)
var lrc = ''
that.data.forEach(function(line, index) {
lrc += '<p'+(index===0?' class="current"':'')+'>'+line[1]+'</p>';
})
that.el = box.createChild('div', {
className: 'inner',
innerHTML: lrc
}, 'replace')
that.index = 0;
}
if(raw && raw.startsWith('http'))
this.fetch(raw, callback)
else
callback(raw)
},
update: function(currentTime) {
if(!this.data)
return
if (this.index > this.data.length - 1 || currentTime < this.data[this.index][0] || (!this.data[this.index + 1] || currentTime >= this.data[this.index + 1][0])) {
for (var i = 0; i < this.data.length; i++) {
if (currentTime >= this.data[i][0] && (!this.data[i + 1] || currentTime < this.data[i + 1][0])) {
this.index = i;
var y = -(this.index-1);
this.el.style.transform = 'translateY('+y+'rem)';
this.el.style.webkitTransform = 'translateY('+y+'rem)';
this.el.getElementsByClassName('current')[0].removeClass('current');
this.el.getElementsByTagName('p')[i].addClass('current');
}
}
}
},
parse: function(lrc_s) {
if (lrc_s) {
lrc_s = lrc_s.replace(/([^\]^\n])\[/g, function(match, p1){return p1 + '\n['});
const lyric = lrc_s.split('\n');
var lrc = [];
const lyricLen = lyric.length;
for (var i = 0; i < lyricLen; i++) {
// match lrc time
const lrcTimes = lyric[i].match(/\[(\d{2}):(\d{2})(\.(\d{2,3}))?]/g);
// match lrc text
const lrcText = lyric[i]
.replace(/.*\[(\d{2}):(\d{2})(\.(\d{2,3}))?]/g, '')
.replace(/<(\d{2}):(\d{2})(\.(\d{2,3}))?>/g, '')
.replace(/^\s+|\s+$/g, '');
if (lrcTimes) {
// handle multiple time tag
const timeLen = lrcTimes.length;
for (var j = 0; j < timeLen; j++) {
const oneTime = /\[(\d{2}):(\d{2})(\.(\d{2,3}))?]/.exec(lrcTimes[j]);
const min2sec = oneTime[1] * 60;
const sec2sec = parseInt(oneTime[2]);
const msec2sec = oneTime[4] ? parseInt(oneTime[4]) / ((oneTime[4] + '').length === 2 ? 100 : 1000) : 0;
const lrcTime = min2sec + sec2sec + msec2sec;
lrc.push([lrcTime, lrcText]);
}
}
}
// sort by time
lrc = lrc.filter(function(item){return item[1]});
lrc.sort(function(a, b){return a[0] - b[0]});
return lrc;
} else {
return [];
}
},
fetch: function(url, callback) {
fetch(url)
.then(function(response) {
return response.text()
}).then(function(body) {
callback(body)
}).catch(function(ex) {})
}
}
var preview = {
el: null,
create: function () {
var current = playlist.current()
this.el.innerHTML = '<div class="cover"><div class="disc"><img src="'+(current.cover)+'" class="blur" /></div></div>'
+ '<div class="info"><h4 class="title">'+current.name+'</h4><span>'+current.artist+'</span>'
+ '<div class="lrc"></div></div>'
this.el.child('.cover').addEventListener('click', t.player.options.events['play-pause'])
lyrics.create(this.el.child('.lrc'))
}
}
var progress = {
el: null,
bar: null,
create: function() {
var current = playlist.current().el
if(current) {
if(this.el) {
this.el.parentNode.removeClass('current')
.removeEventListener(utils.nameMap.dragStart, this.drag)
this.el.remove()
}
this.el = current.createChild('div', {
className: 'progress'
})
this.el.attr('data-dtime', utils.secondToTime(0))
this.bar = this.el.createChild('div', {
className: 'bar',
})
current.addClass('current')
current.addEventListener(utils.nameMap.dragStart, this.drag);
playlist.scroll()
}
},
update: function(percent) {
this.bar.width(Math.floor(percent * 100) + '%')
this.el.attr('data-ptime', utils.secondToTime(percent * source.duration))
},
seeking: function(type) {
if(type)
this.el.addClass('seeking')
else
this.el.removeClass('seeking')
},
percent: function(e, el) {
var percentage = ((e.clientX || e.changedTouches[0].clientX) - el.left()) / el.width();
percentage = Math.max(percentage, 0);
return Math.min(percentage, 1)
},
drag: function(e) {
e.preventDefault()
var current = playlist.current().el
var thumbMove = function(e) {
e.preventDefault()
var percentage = progress.percent(e, current)
progress.update(percentage)
lyrics.update(percentage * source.duration);
};
var thumbUp = function(e) {
e.preventDefault()
current.removeEventListener(utils.nameMap.dragEnd, thumbUp)
current.removeEventListener(utils.nameMap.dragMove, thumbMove)
var percentage = progress.percent(e, current)
progress.update(percentage)
t.player.seek(percentage * source.duration)
source.disableTimeupdate = false
progress.seeking(false)
};
source.disableTimeupdate = true
progress.seeking(true)
current.addEventListener(utils.nameMap.dragMove, thumbMove)
current.addEventListener(utils.nameMap.dragEnd, thumbUp)
}
}
var controller = {
el: null,
btns: {},
step: 'next',
create: function () {
if(!t.player.options.controls)
return
var that = this
t.player.options.controls.forEach(function(item) {
if(that.btns[item])
return;
var opt = {
onclick: function(event){
that.events[item] ? that.events[item](event) : t.player.options.events[item](event)
}
}
switch(item) {
case 'volume':
opt.className = ' ' + (source.muted ? 'off' : 'on')
opt.innerHTML = '<div class="bar"></div>'
opt['on'+utils.nameMap.dragStart] = that.events['volume']
opt.onclick = null
break;
case 'mode':
opt.className = ' ' + t.player.options.mode
break;
default:
opt.className = ''
break;
}
opt.className = item + opt.className + ' btn'
that.btns[item] = that.el.createChild('div', opt)
})
that.btns['volume'].bar = that.btns['volume'].child('.bar')
},
events: {
mode: function(e) {
switch(t.player.options.mode) {
case 'loop':
t.player.options.mode = 'random'
break;
case 'random':
t.player.options.mode = 'order'
break;
default:
t.player.options.mode = 'loop'
}
controller.btns['mode'].className = 'mode ' + t.player.options.mode + ' btn'
store.set('_PlayerMode', t.player.options.mode)
},
volume: function(e) {
e.preventDefault()
var current = e.currentTarget
var drag = false
var thumbMove = function(e) {
e.preventDefault()
t.player.volume(controller.percent(e, current))
drag = true
};
var thumbUp = function(e) {
e.preventDefault()
current.removeEventListener(utils.nameMap.dragEnd, thumbUp)
current.removeEventListener(utils.nameMap.dragMove, thumbMove)
if(drag) {
t.player.muted()
t.player.volume(controller.percent(e, current))
} else {
if (source.muted) {
t.player.muted()
t.player.volume(source.volume)
} else {
t.player.muted('muted')
controller.update(0)
}
}
};
current.addEventListener(utils.nameMap.dragMove, thumbMove)
current.addEventListener(utils.nameMap.dragEnd, thumbUp)
},
backward: function(e) {
controller.step = 'prev'
t.player.mode()
},
forward: function(e) {
controller.step = 'next'
t.player.mode()
},
},
update: function(percent) {
controller.btns['volume'].className = 'volume '+ (!source.muted && percent > 0? 'on' :'off') +' btn'
controller.btns['volume'].bar.width(Math.floor(percent * 100) + '%')
},
percent: function(e, el) {
var percentage = ((e.clientX || e.changedTouches[0].clientX) - el.left()) / el.width();
percentage = Math.max(percentage, 0);
return Math.min(percentage, 1);
}
}
var events = {
onerror: function() {
playlist.error()
t.player.mode()
},
ondurationchange: function() {
if (source.duration !== 1) {
progress.el.attr('data-dtime', utils.secondToTime(source.duration))
}
},
onloadedmetadata: function() {
t.player.seek(0)
progress.el.attr('data-dtime', utils.secondToTime(source.duration))
},
onplay: function() {
t.parentNode.addClass('playing')
showtip(this.attr('title'))
NOWPLAYING = t
},
onpause: function() {
t.parentNode.removeClass('playing')
NOWPLAYING = null
},
ontimeupdate: function() {
if(!this.disableTimeupdate) {
progress.update(this.currentTime / this.duration)
lyrics.update(this.currentTime)
}
},
onended: function(argument) {
t.player.mode()
t.player.play()
}
}
var buttons = {
el: {},
create: function() {
if(!t.player.options.btns)
return
var that = this
t.player.options.btns.forEach(function(item) {
if(that.el[item])
return;
that.el[item] = t.createChild('div', {
className: item + ' btn',
onclick: function(event){
t.player.fetch().then(function() {
t.player.options.events[item](event)
})
}
});
});
}
}
var init = function(config) {
if(t.player.created)
return;
t.player.options = Object.assign(option, config);
t.player.options.mode = store.get('_PlayerMode') || t.player.options.mode
// 初始化button、controls以及click事件
buttons.create()
// 初始化audio or video
source = t.createChild(t.player.options.type, events);
// 初始化播放列表、预览、控件按钮等
info.create();
t.parentNode.addClass(t.player.options.type)
t.player.created = true;
}
init(config)
//自己修改-start
//检查api.i-meto.com接口是否正常
t.player.meto = true;
vendorJs('fancybox', function() {
jQuery.ajax({
url: 'https://api.i-meto.com/meting/api',
type: 'get',
async: true,
timeout: 5000,
complete : function(XMLHttpRequest, status){
if (XMLHttpRequest.status != 200) {
t.player.meto = false;
}
}
});
}, window.jQuery); //加载jquery
//自己修改-end
return t;
}