efront 4.19.6 → 4.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/kugou/singer/keywords.less +5 -1
- package/apps/kugou/song/list.jsp +14 -0
- package/apps/kugou/song//347/233/227/345/260/206/350/241/214 - /350/212/261/347/262/245,/351/251/254/351/233/250/351/230/263.krc +0 -0
- package/coms/basic/Table.js +4 -3
- package/coms/basic/data.js +19 -7
- package/coms/basic/isSubpath.js +33 -0
- package/coms/basic/mark.js +47 -14
- package/coms/basic/mark_test.js +8 -0
- package/coms/basic/spaces.js +8 -0
- package/coms/compile/Html.js +32 -1
- package/coms/compile/Html_test.js +3 -1
- package/coms/compile/common.js +8 -3
- package/coms/explorer/edit.js +1 -1
- package/coms/kugou/bg.less +2 -2
- package/coms/kugou/dance.js +1 -1
- package/coms/kugou/krc.js +61 -34
- package/coms/kugou/krc.less +1 -0
- package/coms/kugou/krc_parse.js +56 -0
- package/coms/kugou/krc_stringify.js +16 -0
- package/coms/kugou/musicList.js +1 -1
- package/coms/kugou/parseSongsList.js +1 -1
- package/coms/kugou/playList.html +3 -2
- package/coms/kugou/playList.less +5 -0
- package/coms/kugou/player.html +1 -0
- package/coms/kugou/player.js +40 -32
- package/coms/kugou/player.less +125 -34
- package/coms/kugou/song.html +4 -4
- package/coms/kugou/song.js +1 -0
- package/coms/kugou/song.less +77 -26
- package/coms/kugou/titlebar.less +3 -0
- package/coms/kugou//346/255/214/350/257/215/347/274/226/350/276/221/345/231/250.xht +153 -0
- package/coms/zimoli/button.js +3 -76
- package/coms/zimoli/button.less +1 -3
- package/coms/zimoli/confirm.js +4 -3
- package/coms/zimoli/img.less +1 -0
- package/coms/zimoli/menu.less +0 -4
- package/coms/zimoli/menuItem.html +1 -1
- package/coms/zimoli/on.js +18 -0
- package/coms/zimoli/once.js +7 -1
- package/coms/zimoli/onmounted.js +1 -13
- package/coms/zimoli/patchHover.js +74 -0
- package/coms/zimoli/popup.js +16 -0
- package/coms/zimoli/prompt.js +8 -2
- package/coms/zimoli/render.js +6 -2
- package/coms/zimoli/slider.js +1 -0
- package/coms/zimoli/textarea.less +1 -0
- package/coms/zimoli/touchList.js +1 -0
- package/coms/zimoli/view.js +0 -6
- package/coms/zimoli/vscroll.js +2 -1
- package/coms/zimoli/zimoli.js +11 -10
- package/package.json +2 -2
- package/public/efront.js +1 -1
- package/readme.md +1 -1
package/apps/kugou/song/list.jsp
CHANGED
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
<script serverside>
|
|
2
2
|
var fs = require("fs").promises;
|
|
3
3
|
var names = await fs.readdir(__dirname);
|
|
4
|
+
var namesMap = Object.create(null);
|
|
5
|
+
names.filter(a => /\.[gkl]rc$/i.test(a)).forEach(a => {
|
|
6
|
+
var k = a.replace(/\.\w+$/, '');
|
|
7
|
+
if (k in namesMap) {
|
|
8
|
+
if (!/^lrc$/i.test(namesMap[k])) return;
|
|
9
|
+
}
|
|
10
|
+
namesMap[k] = a.slice(k.length + 1);
|
|
11
|
+
});
|
|
4
12
|
names = names.filter(a => /\.(flac|mp3|wav)$/i.test(a));
|
|
13
|
+
names = names.map(n => {
|
|
14
|
+
var k = n.replace(/\.\w+$/i, '');
|
|
15
|
+
var m = namesMap[k];
|
|
16
|
+
if (m) n += '#' + m;
|
|
17
|
+
return n;
|
|
18
|
+
});
|
|
5
19
|
return JSON.stringify(names);
|
|
6
20
|
</script>
|
|
Binary file
|
package/coms/basic/Table.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
Promise.resolve(init("pinyin")).then(py =>mark.setPinyin(py));
|
|
1
|
+
Promise.resolve(init("pinyin")).then(py => mark.setPinyin(py));
|
|
2
2
|
|
|
3
3
|
function minusPower(a, b) {
|
|
4
4
|
return a.$power - b.$power >= 0;
|
|
@@ -122,12 +122,13 @@ class Table extends Array {
|
|
|
122
122
|
if (name === searchtext) this.hasFullmatch = true;
|
|
123
123
|
var [p, m] = mark.power(name, searchtext);
|
|
124
124
|
if (p > power) power = p;
|
|
125
|
-
if (p >= searchtext.length) this.coverCount++;
|
|
126
125
|
if (!isEmpty(f.key) && !isFunction(f.key)) o[f.key] = m;
|
|
127
126
|
else o.name = m, o.toString = returnName, o.valueOf = returnName;
|
|
128
127
|
}
|
|
128
|
+
if (power >= searchtext.length) this.coverCount++;
|
|
129
129
|
o.$power = power;
|
|
130
|
-
|
|
130
|
+
var cp = searchtext.length;
|
|
131
|
+
if (o.$power > cp * .6) {
|
|
131
132
|
var summary = this.$summaryData;
|
|
132
133
|
if (!summary.length) saveToOrderedArray(this, o, minusPower);
|
|
133
134
|
else this.summary(o);
|
package/coms/basic/data.js
CHANGED
|
@@ -98,19 +98,31 @@ var seekFromSource = function (obj, base) {
|
|
|
98
98
|
}
|
|
99
99
|
return obj;
|
|
100
100
|
};
|
|
101
|
+
var getkey = [
|
|
102
|
+
a => a.toUpperCase(),
|
|
103
|
+
a => a.charAt(0).toUpperCase() + a.slice(1),
|
|
104
|
+
a => a,
|
|
105
|
+
]
|
|
101
106
|
function getErrorMessage(error = this) {
|
|
102
107
|
if (!isObject(error)) return String(error);
|
|
103
108
|
if (error instanceof Error) return String(error);
|
|
104
109
|
var words = "reason,message,desc,descption,msg,err,error,detail,data".split(',');
|
|
105
|
-
while (words.length) {
|
|
110
|
+
w: while (words.length) {
|
|
106
111
|
var a = words.shift();
|
|
107
|
-
|
|
108
|
-
|
|
112
|
+
var keys = getkey.slice();
|
|
113
|
+
while (keys.length) {
|
|
114
|
+
a = keys.pop()(a);
|
|
115
|
+
var e = error[a];
|
|
116
|
+
if (typeof e === 'string') {
|
|
117
|
+
return e;
|
|
118
|
+
}
|
|
119
|
+
if (isObject(e)) {
|
|
120
|
+
var s = String(e);
|
|
121
|
+
if (!/^\[object\s/i.test(s)) return s;
|
|
122
|
+
error = e;
|
|
123
|
+
continue w;
|
|
124
|
+
}
|
|
109
125
|
}
|
|
110
|
-
a = a.charAt(0).toUpperCase() + a.slice(1);
|
|
111
|
-
if (error[a]) return String(error[a]);
|
|
112
|
-
a = a.toUpperCase();
|
|
113
|
-
if (error[a]) return String(error[a]);
|
|
114
126
|
}
|
|
115
127
|
return Object.keys(error).map(k => `${k}: ${error[k]}`).join(',\r\n');
|
|
116
128
|
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
var normalize = function (url) {
|
|
2
|
+
var normal = [];
|
|
3
|
+
var protocol = /^\w+\:/.exec(url);
|
|
4
|
+
if (protocol) {
|
|
5
|
+
url = url.slice(protocol[0].length).replace(/^[\\\/]+/, '');
|
|
6
|
+
}
|
|
7
|
+
url = url.split(/[\/\\]+/);
|
|
8
|
+
while (url.length) {
|
|
9
|
+
var u = url.pop();
|
|
10
|
+
switch (u) {
|
|
11
|
+
case ".":
|
|
12
|
+
break;
|
|
13
|
+
case "..":
|
|
14
|
+
normal.pop();
|
|
15
|
+
break;
|
|
16
|
+
default:
|
|
17
|
+
normal.push(u);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
if (protocol) {
|
|
21
|
+
normal.unshift(protocol[0].toUpperCase());
|
|
22
|
+
}
|
|
23
|
+
return normal;
|
|
24
|
+
}
|
|
25
|
+
function isSubpath(path, root) {
|
|
26
|
+
path = normalize(path);
|
|
27
|
+
root = normalize(root);
|
|
28
|
+
if (path.length <= root.length) return false;
|
|
29
|
+
for (var cx = 0, dx = root.length; cx < dx; cx++) {
|
|
30
|
+
if (root[cx] !== path[cx]) return false;
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
33
|
+
}
|
package/coms/basic/mark.js
CHANGED
|
@@ -28,14 +28,12 @@ var couple = function (source, marker, pinyin) {
|
|
|
28
28
|
var begin1 = len1, begin2 = len2;
|
|
29
29
|
var end1 = begin1;
|
|
30
30
|
var end2 = begin2;
|
|
31
|
-
|
|
32
|
-
var c1 = cx >= 0 ? 0 : -cx;
|
|
33
|
-
var c2 = cx >= 0 ? cx : 0;
|
|
31
|
+
var run = function () {
|
|
34
32
|
var cc = c2;
|
|
35
33
|
var start = 0, end = 0;
|
|
36
|
-
for (
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
for (ct = 0, dt = setDt(); ct < dt; ct++) {
|
|
35
|
+
s = source[c1 + ct];
|
|
36
|
+
m = marker[c2 + ct];
|
|
39
37
|
if (s === m || pinyin && isLike()) {
|
|
40
38
|
end = ct + 1;
|
|
41
39
|
if (end === dt && c2 + end - cc - start > end2 - begin2) {
|
|
@@ -55,7 +53,10 @@ var couple = function (source, marker, pinyin) {
|
|
|
55
53
|
start = ct + 1;
|
|
56
54
|
}
|
|
57
55
|
}
|
|
58
|
-
}
|
|
56
|
+
};
|
|
57
|
+
var s, m, ct, dt;
|
|
58
|
+
for (var c1 = 0, c2 = 0; c1 < len1; c1++) run();
|
|
59
|
+
for (var c1 = 0, c2 = 1; c2 < len2; c2++) run();
|
|
59
60
|
return [source.slice(begin1, end1), begin1, begin2, end2];
|
|
60
61
|
};
|
|
61
62
|
var MARK_PRE1, MARK_PRE2, _PRE1, _PRE2 = _PRE1 = "<b>";
|
|
@@ -78,28 +79,60 @@ var pair = function (source, search, t1, t2, t3, t4) {
|
|
|
78
79
|
}
|
|
79
80
|
return power2(source, search);
|
|
80
81
|
}
|
|
82
|
+
var searchText = '';
|
|
81
83
|
var power = function (source, search) {
|
|
84
|
+
searchText = search;
|
|
85
|
+
var res = power_(source, search);
|
|
86
|
+
searchText = '';
|
|
87
|
+
return res;
|
|
88
|
+
};
|
|
89
|
+
var power_p = function () { };
|
|
90
|
+
var power_f = function () { };
|
|
91
|
+
var power_ = function (source, search, func, mp) {
|
|
82
92
|
if (!search || !source) {
|
|
83
93
|
return [0, source];
|
|
84
94
|
}
|
|
85
95
|
var matchers = couple(source, search, _pinyin);
|
|
86
96
|
var match_text = matchers[0];
|
|
87
97
|
var match_start = matchers[1];
|
|
88
|
-
var
|
|
98
|
+
var search_start = matchers[2];
|
|
99
|
+
var search_end = matchers[3];
|
|
100
|
+
var match_length = search_end - search_start;
|
|
89
101
|
if (match_length >= 1) {
|
|
90
102
|
var match_text_pre = source.slice(0, match_start);
|
|
91
103
|
var match_text_aft = source.slice(match_start + match_text.length);
|
|
92
104
|
var pp = 0, ap = 0;
|
|
93
105
|
var p = match_length !== match_text.length ? match_length - .1 : match_length;
|
|
94
|
-
if (match_start) p += .1 / match_start - .
|
|
95
|
-
if (
|
|
96
|
-
|
|
106
|
+
if (match_start) p += .1 / (1 + match_start) - .1;
|
|
107
|
+
if (match_text_aft.length) p += .01 / (match_text_aft.length + 1) - .01;
|
|
108
|
+
if (!mp) mp = p;
|
|
109
|
+
var pw = null;
|
|
110
|
+
if (match_text_pre.length > 1 && !(func === power_f && search_start === 0)) {
|
|
111
|
+
pw = power_(match_text_pre, search_start > 0 ? search.slice(0, search_start) : searchText, search_start > 0 ? power_p : null, p);
|
|
112
|
+
pp = pw[0];
|
|
113
|
+
if (search_start !== 0) match_text_pre = pw[1];
|
|
114
|
+
else {
|
|
115
|
+
if (pp >= mp - .6) {
|
|
116
|
+
match_text_pre = pw[1];
|
|
117
|
+
}
|
|
118
|
+
pp = 0;
|
|
119
|
+
}
|
|
97
120
|
}
|
|
98
|
-
|
|
99
|
-
|
|
121
|
+
|
|
122
|
+
var isend = search_end === search.length;
|
|
123
|
+
if (match_text_aft.length > 1 && !(func === power_p && isend)) {
|
|
124
|
+
pw = power_(match_text_aft, isend ? searchText : search.slice(search_end), isend ? null : power_f, p);
|
|
125
|
+
var ap = pw[0];
|
|
126
|
+
if (search_end !== search.length) match_text_aft = pw[1];
|
|
127
|
+
else {
|
|
128
|
+
if (ap >= mp - .6) {
|
|
129
|
+
match_text_aft = pw[1];
|
|
130
|
+
}
|
|
131
|
+
ap = 0;
|
|
132
|
+
}
|
|
100
133
|
}
|
|
101
134
|
if (match_length !== search.length) {
|
|
102
|
-
p += (pp + ap)
|
|
135
|
+
p += (pp + ap) * .86;
|
|
103
136
|
}
|
|
104
137
|
else if (pp >= p) {
|
|
105
138
|
p += pp / source.length / search.length * .01 - .2;
|
package/coms/basic/mark_test.js
CHANGED
|
@@ -2,8 +2,16 @@ var test = function (t1, t2) {
|
|
|
2
2
|
var a = mark.power(t1, t2)
|
|
3
3
|
console.log(t1, t2, a);
|
|
4
4
|
}
|
|
5
|
+
test("live", 'lvie');
|
|
6
|
+
test("listenv", 'lvie');
|
|
7
|
+
test("simple", 'il');
|
|
8
|
+
test("build", 'il');
|
|
5
9
|
test("11234", '1234');
|
|
6
10
|
test("1234", '1234');
|
|
11
|
+
test('kugou', 'kug');
|
|
12
|
+
test('kuugou', 'kug');
|
|
13
|
+
test('kugoukuugou', 'kug');
|
|
14
|
+
test('kugoukugou', 'kugu');
|
|
7
15
|
mark.setPinyin(await init('pinyin'));
|
|
8
16
|
test('我们', 'women');
|
|
9
17
|
test('我们', 'wm');
|
package/coms/basic/spaces.js
CHANGED
|
@@ -28,6 +28,8 @@ spaceDefined.avoid = function (extra_tokens) {
|
|
|
28
28
|
var reg = new RegExp(`(?:[${spaceDefined.join('')}]|${unicode.join('|')})+`);
|
|
29
29
|
var is_reg = new RegExp(`^${reg.source}$`);
|
|
30
30
|
var trim_reg = new RegExp(`^${reg.source}|${reg.source}$`, 'g');
|
|
31
|
+
var trim_start_reg = new RegExp(`^${reg.source}`);
|
|
32
|
+
var trim_end_reg = new RegExp(`${reg.source}$`);
|
|
31
33
|
var format_reg = new RegExp(reg.source, 'g');
|
|
32
34
|
spaceDefined.reg = reg;
|
|
33
35
|
spaceDefined.is_reg = is_reg;
|
|
@@ -40,6 +42,12 @@ spaceDefined.exec = function (a) {
|
|
|
40
42
|
spaceDefined.trim = function (a) {
|
|
41
43
|
return a.replace(trim_reg, '');
|
|
42
44
|
};
|
|
45
|
+
spaceDefined.trimStart = function (a) {
|
|
46
|
+
return a.replace(trim_start_reg, '');
|
|
47
|
+
};
|
|
48
|
+
spaceDefined.trimEnd = function (a) {
|
|
49
|
+
return a.replace(trim_end_reg, '');
|
|
50
|
+
};
|
|
43
51
|
var formatter = function (a) {
|
|
44
52
|
if (/[ \u2002\u00a0\u3000]/.test(a)) return ' ';
|
|
45
53
|
return '';
|
package/coms/compile/Html.js
CHANGED
|
@@ -30,6 +30,33 @@ var parseProperty = function (a) {
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
var fixElement = function (o) {
|
|
33
|
+
if (o.length) {
|
|
34
|
+
var o0 = o[0];
|
|
35
|
+
if (o0.type & (PIECE | SPACE)) {
|
|
36
|
+
var text = spaces.trimStart(o0.text);
|
|
37
|
+
if (!text) {
|
|
38
|
+
o.shift();
|
|
39
|
+
o0 = o[0];
|
|
40
|
+
o.first = o0;
|
|
41
|
+
if (o0) o0.prev = null;
|
|
42
|
+
}
|
|
43
|
+
else o0.text = text;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (o.length) {
|
|
47
|
+
var o1 = o[o.length - 1];
|
|
48
|
+
if (o1.type & (PIECE | SPACE)) {
|
|
49
|
+
var text = spaces.trimEnd(o1.text);
|
|
50
|
+
if (!text) {
|
|
51
|
+
o.pop();
|
|
52
|
+
o1 = o[o.length - 1];
|
|
53
|
+
o.last = o1;
|
|
54
|
+
if (o1) o1.next = null;
|
|
55
|
+
}
|
|
56
|
+
else o1.text = text;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
33
60
|
if (!o.attributes) return;
|
|
34
61
|
var attributes = [];
|
|
35
62
|
var needValue = false;
|
|
@@ -114,7 +141,7 @@ Html.prototype.createScoped = function (code) {
|
|
|
114
141
|
case ELEMENT:
|
|
115
142
|
var v = toCamelCase(c.tag);
|
|
116
143
|
c.tagName = c.tag.toUpperCase();
|
|
117
|
-
if (!/^(script|style
|
|
144
|
+
if (!/^(script|style)$/i.test(c.tagName)) {
|
|
118
145
|
fixElement(c);
|
|
119
146
|
noTag = false;
|
|
120
147
|
if (c.attributes) c.attributes.forEach(run);
|
|
@@ -153,6 +180,10 @@ Html.prototype.createScoped = function (code) {
|
|
|
153
180
|
var id = c.text.slice(1);
|
|
154
181
|
vars[toCamelCase(id)] = true;
|
|
155
182
|
}
|
|
183
|
+
else if (/\#$/.test(c.text)) {
|
|
184
|
+
var id = c.text.slice(0, c.text.length - 1);
|
|
185
|
+
vars[toCamelCase(id)] = true;
|
|
186
|
+
}
|
|
156
187
|
}
|
|
157
188
|
break;
|
|
158
189
|
case QUOTED:
|
|
@@ -15,8 +15,10 @@ var test2 = function (source) {
|
|
|
15
15
|
var s = scanner2(source, 'html');
|
|
16
16
|
assert(s.toString(), source);
|
|
17
17
|
}
|
|
18
|
-
test("<h><a #c>b</a><c b=x>d</c><d/><e>2px</e></h>");
|
|
18
|
+
test("<h><a #c>b</a><c b=x>d</c><d/><e>2px</e></h>", "<h><a #c>b</a><c b=x>d</c><d></d><e>2px</e></h>");
|
|
19
19
|
test("<a>Let's Encrypt</a>");
|
|
20
|
+
test("<a> </a>", 'scoped.outerHTML', "<a></a>");
|
|
21
|
+
test("<a> Let's Encrypt</a>", 'scoped.outerHTML', "<a>Let's Encrypt</a>");
|
|
20
22
|
test("<style>{a-b:2}</style>");
|
|
21
23
|
assert(scanner2("<a>Let's Encrypt</a>", Html).length, 1);
|
|
22
24
|
test('<a href="${i18n``}">Let\'s Encrypt</a>');
|
package/coms/compile/common.js
CHANGED
|
@@ -1403,10 +1403,15 @@ var createString = function (parsed) {
|
|
|
1403
1403
|
if (o.length) {
|
|
1404
1404
|
o.forEach(run);
|
|
1405
1405
|
}
|
|
1406
|
-
result.push(o.tag_entry);
|
|
1407
|
-
result.push(o.tag);
|
|
1406
|
+
result.push(o.tag_entry, o.tag, o.leave);
|
|
1408
1407
|
}
|
|
1409
|
-
|
|
1408
|
+
else if (o.tag && o.leave === '/>') {
|
|
1409
|
+
if (/^(input|img|meta|br|hr|link|area|base|basefont|param|col|frame|embed|keygen)$/i.test(o.tag)) {
|
|
1410
|
+
result.push('/>');
|
|
1411
|
+
}
|
|
1412
|
+
else result.push(`></`, o.tag, '>');
|
|
1413
|
+
}
|
|
1414
|
+
else result.push(o.leave);
|
|
1410
1415
|
}
|
|
1411
1416
|
else {
|
|
1412
1417
|
if (o.tag_leave) result.push(o.tag_leave);
|
package/coms/explorer/edit.js
CHANGED
|
@@ -33,7 +33,7 @@ function main({ path: root, rename, isfolder, add, name, hasName }) {
|
|
|
33
33
|
var path = root + "/" + a.$scope.data.name;
|
|
34
34
|
if (origin) {
|
|
35
35
|
var to = path;
|
|
36
|
-
path = origin;
|
|
36
|
+
path = root + '/' + origin;
|
|
37
37
|
}
|
|
38
38
|
if (origin) await rename(path, to);
|
|
39
39
|
else await add(path)
|
package/coms/kugou/bg.less
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
.active>& {
|
|
2
2
|
&:after {
|
|
3
3
|
width: 300px;
|
|
4
4
|
height: 140px;
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
&:after,
|
|
43
43
|
&:before {
|
|
44
44
|
content: "";
|
|
45
|
-
background-color: #
|
|
45
|
+
background-color: #9cb1;
|
|
46
46
|
position: absolute;
|
|
47
47
|
border-radius: 50%;
|
|
48
48
|
// backdrop-filter: invert(1);
|
package/coms/kugou/dance.js
CHANGED
package/coms/kugou/krc.js
CHANGED
|
@@ -2,7 +2,8 @@ var secret = [64, 71, 97, 119, 94, 50, 116, 71, 81, 54, 49, 45, 206, 210, 110, 1
|
|
|
2
2
|
var isTrident = /Trident/i.test(navigator.userAgent);
|
|
3
3
|
function krc(list = div()) {
|
|
4
4
|
care(list, function (info) {
|
|
5
|
-
|
|
5
|
+
list.info = info;
|
|
6
|
+
if (!info.grc && !info.krc) {
|
|
6
7
|
remove(list.children);
|
|
7
8
|
if (info.lrc) {
|
|
8
9
|
var children = createLRC(info.lrc);
|
|
@@ -15,14 +16,61 @@ function krc(list = div()) {
|
|
|
15
16
|
}
|
|
16
17
|
return;
|
|
17
18
|
}
|
|
18
|
-
var
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
var krc = info.grc || info.krc_text;
|
|
20
|
+
if (!krc) {
|
|
21
|
+
var content = info.krc.slice(4).map((a, i) => a ^ secret[i % 16]);
|
|
22
|
+
var bufff = thirdParty$inflate(content.slice(2));
|
|
23
|
+
krc = decodeUTF8(bufff);
|
|
24
|
+
info.krc_text = krc;
|
|
25
|
+
}
|
|
21
26
|
remove(list.children);
|
|
22
27
|
var children = createKRC(krc);
|
|
28
|
+
list.extra = children.extra;
|
|
23
29
|
appendChild(list, children);
|
|
24
30
|
list.process = children.process;
|
|
25
|
-
})
|
|
31
|
+
});
|
|
32
|
+
contextmenu(list, [
|
|
33
|
+
{
|
|
34
|
+
name: "编辑歌词",
|
|
35
|
+
hidden: true,
|
|
36
|
+
do() {
|
|
37
|
+
popup('歌词编辑器', list.info, true);
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: "调整时间",
|
|
42
|
+
async do() {
|
|
43
|
+
var delta = await prompt('输入时间差值(毫秒)以调整整首歌词', a => +a === (a | 0));
|
|
44
|
+
delta = +delta;
|
|
45
|
+
var extra = list.extra;
|
|
46
|
+
if (extra.offset) extra.offset += +delta;
|
|
47
|
+
else extra.offset = +delta;
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: '保存歌词',
|
|
52
|
+
do() {
|
|
53
|
+
if (!list.info) return;
|
|
54
|
+
var a = document.createElement('a');
|
|
55
|
+
if (!("download" in a)) {
|
|
56
|
+
alert('当前浏览器无法保存', 'warn');
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
var { grc, krc_text = grc, lrc, songname, songName, singername, singerName } = list.info;
|
|
60
|
+
if (krc_text) {
|
|
61
|
+
var kp = krc_parse(krc_text);
|
|
62
|
+
kp.extra.offset = list.extra.offset;
|
|
63
|
+
var grc = krc_stringify(kp);
|
|
64
|
+
}
|
|
65
|
+
if (!grc && !lrc) {
|
|
66
|
+
alert('当前歌曲没有可保存的歌词!', 'warn');
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
a.href = 'data:application/octet-stream;base64,' + toBase64(encodeUTF8(grc || lrc));
|
|
70
|
+
a.download = `${songname || songName}-${singername || singerName}.${krc_text ? 'grc' : 'lrc'}`;
|
|
71
|
+
a.click();
|
|
72
|
+
}
|
|
73
|
+
}])
|
|
26
74
|
return list;
|
|
27
75
|
}
|
|
28
76
|
function createLRC(lrc) {
|
|
@@ -78,6 +126,7 @@ function createLRC(lrc) {
|
|
|
78
126
|
}
|
|
79
127
|
}
|
|
80
128
|
};
|
|
129
|
+
krcList.rows = saved_rows;
|
|
81
130
|
return krcList;
|
|
82
131
|
}
|
|
83
132
|
|
|
@@ -97,39 +146,16 @@ function setClass(krcList, index) {
|
|
|
97
146
|
});
|
|
98
147
|
if (index + 2 < krcList.length) addClass(krcList[index + 1], 'after-active');
|
|
99
148
|
}
|
|
149
|
+
|
|
100
150
|
function createKRC(krc) {
|
|
101
|
-
var saved_rows =
|
|
102
|
-
|
|
103
|
-
var data = /^\s*\[(.*?),(.*?)\](.*?)$/.exec(row);
|
|
104
|
-
if (data) {
|
|
105
|
-
var [, startTime, schedule, words] = data;
|
|
106
|
-
var wordReg = /<(.*?),(.*?),.*?>([^<]*)/g;
|
|
107
|
-
var saved_words = [];
|
|
108
|
-
do {
|
|
109
|
-
var word = wordReg.exec(words);
|
|
110
|
-
if (word) {
|
|
111
|
-
var [, timeBegin, timeLength, label] = word;
|
|
112
|
-
saveToOrderedArray(saved_words, {
|
|
113
|
-
value: +timeBegin,
|
|
114
|
-
timeBegin: +timeBegin,
|
|
115
|
-
timeLength: +timeLength,
|
|
116
|
-
label
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
} while (word);
|
|
120
|
-
saveToOrderedArray(saved_rows, {
|
|
121
|
-
value: +startTime,
|
|
122
|
-
startTime: +startTime,
|
|
123
|
-
schedule: +schedule,
|
|
124
|
-
words: saved_words
|
|
125
|
-
});
|
|
126
|
-
} else {
|
|
127
|
-
if (!isProduction) console.info("%c未解析%c", "color:#c28", "color:#333", row, data);
|
|
128
|
-
}
|
|
129
|
-
});
|
|
151
|
+
var saved_rows = krc_parse(krc);
|
|
152
|
+
var extra = saved_rows.extra;
|
|
130
153
|
var krcList = saved_rows.map(createRow);
|
|
131
154
|
krcList.process = function (offset, length) {
|
|
132
155
|
var offsetMTime = offset * 1000 | 0;
|
|
156
|
+
if (extra.offset) {
|
|
157
|
+
offsetMTime -= extra.offset;
|
|
158
|
+
}
|
|
133
159
|
var index = getIndexFromOrderedArray(saved_rows, offsetMTime);
|
|
134
160
|
var current_row = saved_rows[index];
|
|
135
161
|
if (current_row) {
|
|
@@ -170,6 +196,7 @@ function createKRC(krc) {
|
|
|
170
196
|
}
|
|
171
197
|
};
|
|
172
198
|
var markerLabel = document.createElement("div");
|
|
199
|
+
krcList.extra = extra;
|
|
173
200
|
return krcList;
|
|
174
201
|
}
|
|
175
202
|
function createCell(word) {
|
package/coms/kugou/krc.less
CHANGED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
var extra_func = {
|
|
2
|
+
total(a) {
|
|
3
|
+
return +a
|
|
4
|
+
},
|
|
5
|
+
offset(a) {
|
|
6
|
+
return +a
|
|
7
|
+
},
|
|
8
|
+
language(a) {
|
|
9
|
+
a = atob(a);
|
|
10
|
+
a = JSON.parse(a);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
var krc_parse = function (krc_text) {
|
|
14
|
+
var saved_rows = [];
|
|
15
|
+
var extra = {};
|
|
16
|
+
krc_text = krc_text.trim();
|
|
17
|
+
krc_text.split(/[\r\n]+/).map(function (row) {
|
|
18
|
+
var data = /^\s*\[(.*?),(.*?)\](.*?)$/.exec(row);
|
|
19
|
+
if (data) {
|
|
20
|
+
var [, startTime, schedule, words] = data;
|
|
21
|
+
var wordReg = /<(.*?),(.*?)(?:,.*?)?>([^<]*)/g;
|
|
22
|
+
var saved_words = [];
|
|
23
|
+
do {
|
|
24
|
+
var word = wordReg.exec(words);
|
|
25
|
+
if (word) {
|
|
26
|
+
var [, timeBegin, timeLength, label] = word;
|
|
27
|
+
saveToOrderedArray(saved_words, {
|
|
28
|
+
value: +timeBegin,
|
|
29
|
+
timeBegin: +timeBegin,
|
|
30
|
+
timeLength: +timeLength,
|
|
31
|
+
label
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
} while (word);
|
|
35
|
+
saveToOrderedArray(saved_rows, {
|
|
36
|
+
value: +startTime,
|
|
37
|
+
startTime: +startTime,
|
|
38
|
+
schedule: +schedule,
|
|
39
|
+
words: saved_words
|
|
40
|
+
});
|
|
41
|
+
} else {
|
|
42
|
+
var data = /^\[([^\]\:,]+)[\:,]([^,\:\]]*)\]$/.exec(row);
|
|
43
|
+
if (data) {
|
|
44
|
+
var [, key, value] = data;
|
|
45
|
+
if (!value) value = null;
|
|
46
|
+
else if (extra_func.hasOwnProperty(key)) {
|
|
47
|
+
value = extra_func[key](value);
|
|
48
|
+
}
|
|
49
|
+
extra[key] = value;
|
|
50
|
+
}
|
|
51
|
+
else if (!isProduction) console.info("%c未解析%c", "color:#c28", "color:#333", row, data);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
saved_rows.extra = extra;
|
|
55
|
+
return saved_rows;
|
|
56
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
function krc_stringify(krc_rows) {
|
|
2
|
+
var extra = krc_rows.extra;
|
|
3
|
+
var e = Object.keys(extra).map(k => {
|
|
4
|
+
if (k === 'id') return;
|
|
5
|
+
if (k === 'hash') return;
|
|
6
|
+
var a = extra[k];
|
|
7
|
+
if (!isHandled(a)) return;
|
|
8
|
+
if (typeof a === 'object') return;
|
|
9
|
+
return `[${k}:${a}]`;
|
|
10
|
+
}).filter(a => !!a).join('\r\n');
|
|
11
|
+
var a = krc_rows.map(r => {
|
|
12
|
+
var w = r.words.map(w => `<${w.timeBegin},${w.timeLength}>${w.label}`).join('');
|
|
13
|
+
return `[${r.startTime},${r.schedule}]${w}`;
|
|
14
|
+
}).join('\r\n');
|
|
15
|
+
return e + "\r\n\r\n" + a;
|
|
16
|
+
}
|
package/coms/kugou/musicList.js
CHANGED
|
@@ -13,7 +13,7 @@ var isSameSong = function (m1, m2) {
|
|
|
13
13
|
m1.id && m1.id === m2.id || // 网易云 千千静听
|
|
14
14
|
m1.rid && m1.rid === m2.rid || // 酷我
|
|
15
15
|
m1.mid && m1.mid === m2.mid ||// 酷我
|
|
16
|
-
m1.url && m1.url === m2.url;
|
|
16
|
+
m1.url && String(m1.url).replace(/#[\s\S]*$/, '') === String(m2.url).replace(/#[\s\S]*$/, '');
|
|
17
17
|
};
|
|
18
18
|
|
|
19
19
|
function addMethod(name, func) {
|
|
@@ -6,7 +6,7 @@ await data.from("efront-singer", function (a) {
|
|
|
6
6
|
})
|
|
7
7
|
});
|
|
8
8
|
var parseFileName = function (b) {
|
|
9
|
-
var [name, singer] = String(b).replace(
|
|
9
|
+
var [name, singer] = String(b).replace(/\.[\w#]+$/, '')
|
|
10
10
|
.replace(/^\s*\d+[\s\.,\-]+(\S+)($|\W\s*\-)/, "$1$2")
|
|
11
11
|
.replace(/^\s*\d+[\.]+\s*([\s\S]+)/, "$1")
|
|
12
12
|
.replace(/^\s*\d+\s+(\W+)/, "$1")
|
package/coms/kugou/playList.html
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
<div class="head">
|
|
2
|
-
播放列表(<span ng-bind="musicList.length"></span>)
|
|
3
|
-
<a ng-click="switchMode()"><span ng-bind="mode.name"></span></a>
|
|
4
2
|
</div>
|
|
5
3
|
<list class="body" ng-src="(p,i) in musicList" min-width=480>
|
|
6
4
|
<padding ng-delete="remove(i)">
|
|
7
5
|
<song ng-click="play(i)" ng-class="{activate:musicList.isActived(p)}" ng-src=p></song>
|
|
8
6
|
</padding>
|
|
9
7
|
</list>
|
|
8
|
+
<div class="foot">
|
|
9
|
+
<a ng-click="switchMode()"><span ng-bind="mode.name"></span></a>
|
|
10
|
+
</div>
|
package/coms/kugou/playList.less
CHANGED