efront 4.18.4 → 4.19.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.
@@ -1,3 +1,48 @@
1
+ - zh-CN: 数据标识不能是纯数字
2
+ en: The data identifier cannot be a pure number
3
+
4
+ - zh-CN: "数据标识不能有“@”符号"
5
+ en: "Data identification cannot have the \"@\" symbol"
6
+
7
+ - zh-CN: 数据标识不能有特殊符号“$1”
8
+ en: "Data identification cannot have special symbol '$1'"
9
+
10
+ - zh-CN: 数据中不能有$1字段
11
+ en: There cannot be a $1 field in the data
12
+
13
+ - zh-CN: 您不能修改其他用户的数据
14
+ en: You cannot modify the data of other users
15
+
16
+ - zh-CN: 请不要冒充其他用户!
17
+ en: Please do not impersonate other users!
18
+
19
+ - zh-CN: 数据标识不可更改!
20
+ en: The data identifier cannot be changed!
21
+
22
+ - zh-CN: 请设置用户名
23
+ en: Please set a username
24
+
25
+ - zh-CN: 请登录后重试
26
+ en: Please log in and try again
27
+
28
+ - zh-CN: 参数异常
29
+ en: Parameter exception
30
+
31
+ - zh-CN: 您不能删除别人的数据
32
+ en: "You cannot delete someone else's data"
33
+
34
+ - zh-CN: 用户不存在!
35
+ en: The user does not exist!
36
+
37
+ - zh-CN: $1 被 $2 覆盖
38
+ en: $1 is covered by $2
39
+
40
+ - zh-CN: 是否公开
41
+ en: Is it publicly available
42
+
43
+ - zh-CN: 确定要删除标识为“$1”的$2“$3”吗?
44
+ en: "Are you sure you want to delete the $2 \"$3\" marked as \"$1\"?"
45
+
1
46
  - zh-CN: $1已存在
2
47
  en: $1 already exists
3
48
 
@@ -6,4 +6,20 @@ data.getApi("kuwo-token").then(function (api) {
6
6
  zimoli.switch("", null, "/home");
7
7
  zimoli.enableTouchBack();
8
8
  css("body", "background-color:#323336;");
9
- zimoli();
9
+ zimoli();
10
+ document.addEventListener('dragover', function (e) {
11
+ e.preventDefault();
12
+ })
13
+ var parseSongsList = await init('parseSongsList');
14
+ document.addEventListener('drop', function (e) {
15
+ e.preventDefault();
16
+ var { files } = e.dataTransfer;
17
+ var objs = [];
18
+ for (var f of files) {
19
+ var url = URL.createObjectURL(f);
20
+ objs.push({ url, name: f.name });
21
+ }
22
+ objs = parseSongsList(objs);
23
+ musicList.push(...objs);
24
+ player.play(objs[0]);
25
+ })
@@ -1 +1 @@
1
- buildList(['song/list.jsp', 'songs-list']);
1
+ buildList(['efront-song', 'songs-list']);
@@ -19,7 +19,9 @@
19
19
  daadd: put /:dbid/
20
20
  dbfind: get /:dbid/:last,:size
21
21
  dbadd: put /:id
22
+ dbset: post /:id
22
23
  dbdel: delete /:id
24
+ dadel: delete /:dbid/:id
23
25
  count: options ::count
24
26
  bootlog: options ::similar
25
27
  link: options ::link
@@ -4,7 +4,7 @@
4
4
  height: 100%;
5
5
  display: block;
6
6
  position: relative;
7
- padding-right: 0!important;
7
+ padding-right: 0 !important;
8
8
  overflow: hidden;
9
9
  }
10
10
 
@@ -23,15 +23,20 @@
23
23
  </style>
24
24
 
25
25
  <div head>
26
- <span -bind="db.name"></span>
26
+ 数据配置 - <span -bind="db.name"></span>
27
27
  </div>
28
28
  <div body>
29
- <div>权限</div>
30
- <div>是否公开<swap -model="db.open"></swap></div>
29
+ <field -repeat="f in fields" -src="[f,db]"></field>
31
30
  </div>
32
31
  <div foot>
33
- <button>保存</button>
32
+ <button @click="save">保存</button>
34
33
  </div>
35
34
  <script>
35
+ var fields = refilm`
36
+ 是否公开/open swap`;
36
37
  var [db] = arguments;
38
+ var save = async function () {
39
+ await data.from('dbset', db);
40
+ };
41
+ console.log(db)
37
42
  </script>
@@ -1,47 +1,101 @@
1
- <div>
1
+ <style>
2
+ [item] {
3
+ position: relative;
4
+
5
+ drop {
6
+ display: none;
7
+ }
8
+
9
+ &:hover {
10
+ outline: 1px solid #333;
11
+ outline-offset: -2px;
12
+
13
+ drop {
14
+ display: block;
15
+ }
16
+ }
17
+
18
+ }
19
+
20
+ [m-id] {
21
+ font-size: 10px;
22
+ color: #999;
23
+ }
24
+
25
+ & {
26
+ width: 100%;
27
+ border-top: 28px solid transparent;
28
+ height: 100%;
29
+ }
30
+
31
+ [head] {
32
+ line-height: 28px;
33
+ margin-top: -32px;
34
+ }
35
+ </style>
36
+ <div head>
2
37
  编辑数据 - <span -bind="db.name"></span>
3
38
  <a @click="add">添加</a>
4
39
  </div>
5
40
 
6
- <div>
7
- <lattice -src="m in items">
8
- <div -bind="m.id"></div>
9
- <div -bind="m.name"></div>
10
- </lattice>
11
- </div>
41
+ <lattice body -src="m in items">
42
+ <padding item>
43
+ <drop @click="rm(m)"></drop>
44
+ <div m.id?></div>
45
+ <div m.name?></div>
46
+ </padding>
47
+ </lattice>
12
48
  <script>
13
49
  var [db] = arguments;
14
50
  var a = button;
15
- var add = function () {
51
+ var items = null;
52
+ var load = function (params) {
53
+ items = data.from('dbfind', { dbid: db.id, size: 60 });
54
+ return items;
55
+ };
56
+ var rm = async function (m) {
57
+ var res = await confirm(i18n`确定要删除标识为“${`<span style=color:red >${m.id}</span>`}”的${db.name}“${`<span style='color:red'>${m.name}</span>`}”吗?`, [i18n`确定`, i18n`取消`]);
58
+ if (!res) return;
59
+ await data.from('dadel', { dbid: db.id, id: m.id });
60
+ return load();
61
+ };
62
+ var add =async function () {
16
63
  var elem = document.createElement('jsoncode');
17
64
  elem.type = 'json';
18
65
  elem.contentEditable = true;
19
- return prompt(茨菰$编辑框(elem), '输入JSON格式的数据', function (text) {
66
+ await prompt(茨菰$编辑框(elem), '输入JSON格式的数据', function (text) {
20
67
  try {
21
68
  JSON.parse(text);
22
69
  return true;
23
70
  } catch (e) {
24
- console.log(text, e)
25
71
  return false;
26
72
  }
27
73
  }, {
28
74
  wrap: true,
29
75
  async submit(text) {
30
76
  var d = JSON.parse(text);
31
- if (db.id === '用户') {
32
- if (!d.id && !d.password) {
33
- return alert("缺少密码!");
77
+ var upload = async function (d) {
78
+ if (!isObject(d)) return;
79
+ if (db.id === '用户') {
80
+ if (!d.id && !d.password) {
81
+ return alert("缺少密码!");
82
+ }
83
+ if (d.password) {
84
+ delete d.password;
85
+ d.a = encode62.geta(d.password);
86
+ }
34
87
  }
35
- if (d.password) {
36
- delete d.password;
37
- d.a = encode62.geta(d.password);
88
+ await data.from('daadd', { dbid: db.id, ...d })
89
+ }
90
+ if (Array.isArray(d)) {
91
+ while (d.length) {
92
+ await upload(d.pop());
38
93
  }
39
94
  }
40
- data.from('daadd', { dbid: db.id, ...d })
95
+ else await upload(d);
41
96
  }
42
97
  });
98
+ load();
43
99
  };
44
- var items = await data.from('dbfind', { dbid: db.id, size: 20 });
45
-
46
- console.log(arguments)
100
+ await load();
47
101
  </script>
@@ -7,8 +7,8 @@
7
7
  }
8
8
 
9
9
  [db] {
10
- display: block;
11
- border: 1px solid #000;
10
+ outline: 1px solid #000;
11
+ outline-offset: -6px;
12
12
  padding: 10px 6px;
13
13
 
14
14
  h2 {
@@ -2,6 +2,7 @@
2
2
  WEB:
3
3
  路径映射: /proxy/list
4
4
  文件管理: /wow/root
5
+ 数据管理: /db/list
5
6
  长连接管理: /link/index
6
7
  字典: /dict/list
7
8
  证书管理: /cert/main
@@ -38,17 +38,20 @@ function isChildPath(relative, path) {
38
38
  var getCrossUrl = function (domain, headers, encrypt) {
39
39
  if (notCross(domain, encrypt)) return domain;
40
40
  var basehost = parseURL(base).host || parseURL(location_href).host;
41
+ var ishttps = /^(https\:|s\/\/)/i.test(domain);
42
+ var _headers = serialize(headers);
43
+ if (_headers) _headers = "," + _headers;
41
44
  if (parseURL(domain).host === basehost) {
42
45
  if (!encrypt) return domain;
43
46
  domain = domain.replace(domainReg, "/$3$4");
47
+ if (_headers) domain = _headers + domain;
48
+ }
49
+ else {
50
+ domain = domain
51
+ .replace(/^(s?)(\/\/)/i, "http$1:$2")
52
+ .replace(domainReg, `$2${_headers}/$3$4`)
44
53
  }
45
- var _headers = serialize(headers);
46
- if (_headers) _headers = "," + _headers;
47
54
  var b = encrypt ? "!" : `*`;
48
- var ishttps = /^(https\:|s\/\/)/i.test(domain);
49
- domain = domain
50
- .replace(/^(s?)(\/\/)/i, "http$1:$2")
51
- .replace(domainReg, `$2${_headers}/$3$4`)
52
55
  if (ishttps) domain = b + domain;
53
56
  if (encrypt) domain = encode62.timeencode(encode62.safeencode(domain, encrypt));
54
57
  return base + b + domain;
@@ -431,8 +431,8 @@ function createApiMap(data) {
431
431
  fixApi(api, href);
432
432
  if (hasOwnProperty.call(apiMap, api.id)) {
433
433
  const lastApi = apiMap[api.id];
434
- console.warn(i18n`多次设置的id相同的api:%c${api.id}`, 'color:red');
435
- console.log(`[${api.name}](${lastApi.method} ${api.url})\r\n [${api.name}](${lastApi.method} ${lastApi.url}) 覆盖`);
434
+ var fmat = api => `[${api.name}](${api.method} ${api.url})`;
435
+ console.warn(i18n`多次设置的id相同的api:%c${api.id + '%c, ' + i18n`${fmat(lastApi)} 被 ${fmat(api)} 覆盖`}`, 'color:red', 'color:');
436
436
  }
437
437
  apiMap[api.id] = api;
438
438
  api.headers = _headers;
@@ -4,7 +4,7 @@ var test = function (t1, t2) {
4
4
  }
5
5
  test("11234", '1234');
6
6
  test("1234", '1234');
7
- await init('pinyin')
7
+ mark.setPinyin(await init('pinyin'));
8
8
  test('我们', 'women');
9
9
  test('我们', 'wm');
10
10
  test('盛', 'cheng');
@@ -4,7 +4,7 @@ class join {
4
4
  }
5
5
  }
6
6
  var seek = function (object, seeker) {
7
- if (seeker === null || seeker === undefined || isEmpty(object)) return;
7
+ if (seeker === null || seeker === undefined || !isHandled(object)) return;
8
8
  if (seeker instanceof Function) {
9
9
  return seeker(object);
10
10
  }
@@ -0,0 +1,50 @@
1
+ var spaceDefined = [
2
+ "\\u0002",
3
+ "\\b-\\r",// "\\b"/*8*/, "\\t"/*9*/, "\\n"/*10*/, "\\v"/*11*/, "\\f"/*12*/, "\\r"/*13*/,
4
+ " "/*32*/,
5
+ "\\u007f", "\\u00a0", "\\u00ad", "\\u034f", "\\u061c",
6
+ "\\u115f", "\\u1160",
7
+ "\\u17b4", "\\u17b5",
8
+ "\\u180b-\\u180e",
9
+ "\\u1cbb", "\\u1cbc",
10
+ "\\u2000-\\u200f",
11
+ "\\u2028-\\u202f",
12
+ "\\u205f-\\u206f",
13
+ "\\u2800", "\\u3000", "\\u3164",
14
+ "\\ufe00-\\ufe0f",
15
+ "\\ufeff", "\\uffa0",
16
+ "\\ufff0-\\ufff8",
17
+ ];
18
+ var unicode = [
19
+ "\\ud80c\\udffc",// "\\u{133fc}",
20
+ "\\ud834[\\udd73-\\udd7a]"// "\\u{1d173}-\\u{1d17a}"
21
+ ];
22
+
23
+ spaceDefined.avoid = function (extra_tokens) {
24
+ var u0 = "[^\\ud80c][\\udc00-\\udfff]|\\ud80c[^\\udffc]";
25
+ var u1 = "[^\\ud834][\\udc00-\\udfff]|\\ud834[^\\udd73-\\udd7a]";
26
+ return `[^${extra_tokens || ''}${spaceDefined.join('')}]|${u0}|${u1}`;
27
+ }
28
+ var reg = new RegExp(`(?:[${spaceDefined.join('')}]|${unicode.join('|')})+`);
29
+ var is_reg = new RegExp(`^${reg.source}$`);
30
+ var trim_reg = new RegExp(`^${reg.source}|${reg.source}$`, 'g');
31
+ var format_reg = new RegExp(reg.source, 'g');
32
+ spaceDefined.reg = reg;
33
+ spaceDefined.is_reg = is_reg;
34
+ spaceDefined.is = function (a) {
35
+ return is_reg.test(a);
36
+ };
37
+ spaceDefined.exec = function (a) {
38
+ return reg.exec(a);
39
+ };
40
+ spaceDefined.trim = function (a) {
41
+ return a.replace(trim_reg, '');
42
+ };
43
+ var formatter = function (a) {
44
+ if (/[ \u2002\u00a0\u3000]/.test(a)) return ' ';
45
+ return '';
46
+ };
47
+ spaceDefined.format = function (a) {
48
+ return a.replace(trim_reg, '').replace(format_reg, formatter);
49
+ };
50
+ module.exports = spaceDefined;
@@ -14,7 +14,7 @@ function submit_() {
14
14
  else Object.assign(data, arg);
15
15
  }
16
16
  for (var fields of fieldsList) for (var f of fields) {
17
- if (!check(data, field.needs)) continue;
17
+ if (!check(data, f.needs)) continue;
18
18
  var error = valid(f, data);
19
19
  if (error === "empty") {
20
20
  if (f.options instanceof Array || /date|time|range|switch|swap|radio/i.test(f.type)) {
@@ -53,33 +53,8 @@ var stringsFromRegExp = function (reg) {
53
53
  var res = combine(...queue).map(a => a.join(""));
54
54
  return res;
55
55
  }
56
- var supportUnicodeRegExp = false;
57
- var spaceDefined = [
58
- "\\u0002",
59
- "\\b-\\r",// "\\b"/*8*/, "\\t"/*9*/, "\\n"/*10*/, "\\v"/*11*/, "\\f"/*12*/, "\\r"/*13*/,
60
- " "/*32*/,
61
- "\\u007f", "\\u00a0", "\\u00ad", "\\u034f", "\\u061c",
62
- "\\u115f", "\\u1160",
63
- "\\u17b4", "\\u17b5",
64
- "\\u180b-\\u180e",
65
- "\\u1cbb", "\\u1cbc",
66
- "\\u2000-\\u200f",
67
- "\\u2028-\\u202f",
68
- "\\u205f-\\u206f",
69
- "\\u2800", "\\u3000", "\\u3164",
70
- "\\ufe00-\\ufe0f",
71
- "\\ufeff", "\\uffa0",
72
- "\\ufff0-\\ufff8",
73
- "\\u{133fc}",
74
- "\\u{1d173}-\\u{1d17a}"
75
- ]
76
- try {
77
- new RegExp('.', 'u');
78
- supportUnicodeRegExp = true;
79
- } catch (e) {
80
- spaceDefined.pop();
81
- spaceDefined.pop();
82
- }
56
+ var spaceDefined = require("../basic/spaces");
57
+
83
58
  var powermap = require("./powermap");
84
59
  class Program {
85
60
  quotes = [
@@ -118,7 +93,6 @@ class Program {
118
93
  structstrap_reg = /^(class|interface|struct|enum)$/;
119
94
  control_reg = /^(if|else|switch|case|do|while|for|loop|break|continue|default|import|from|as|export|try|catch|finally|throw|await|yield|return)$/;
120
95
  type_reg = /^(var|let|const|function|fn|func|class|interface|type|struct|enum|impl)$/;
121
- spaces = spaceDefined;
122
96
  nocase = false
123
97
  keepspace = false;
124
98
  lastIndex = 0
@@ -1010,14 +984,12 @@ class Program {
1010
984
  });
1011
985
  var scopes = this.scopes.map(a => a.join("")).join("");
1012
986
  scopes = this.compile(scopes);
1013
- var spaces = this.spaces.join("");
1014
987
  tokens = Object.keys(tokens).join("");
1015
- tokens = this.compile(tokens) + spaces;
1016
- var express = `(?:\\\\u\\{[^\\}]+\\}|[^${tokens}])+`;
1017
- var flagUnicode = supportUnicodeRegExp ? 'u' : '';
1018
- this.express_reg = new RegExp(`^${express}$`, flagUnicode);
1019
- this.space_reg = new RegExp(`^[${spaces}]+$`, flagUnicode);
1020
- this.space_exp = new RegExp(`[${spaces}]+`, flagUnicode);
988
+ tokens = this.compile(tokens);
989
+ var express = `(?:\\\\u\\{[^\\}]+\\}|${spaceDefined.avoid(tokens)})+`;
990
+ this.express_reg = new RegExp(`^${express}$`);
991
+ this.space_reg = spaceDefined.is_reg;
992
+ this.space_exp = spaceDefined.reg;
1021
993
  var quotes_entries = this.createRegExp(this.comments.concat(this.quotes).map(q => q[0]), true).source;
1022
994
  var powers = Object.keys(this.powermap).filter(k => k.length > 1 && stamp_reg.test(k));
1023
995
  var powers_entries = this.createRegExp(this.tags.map(t => t[0]).concat(powers), true).source;
@@ -1026,7 +998,7 @@ class Program {
1026
998
  var number_reg = this.number_reg;
1027
999
  var numbers = number_reg.source.replace(/^\^|\$$/g, "");
1028
1000
  this.digit_reg = new RegExp(/^[+\-]?/.source + numbers, number_reg.flags);
1029
- this.entry_reg = new RegExp([`[${spaces}]+|${quotes_entries}|[${scopes}]|${numbers}[^${tokens}]*|${express}|${powers_entries}|[${stamps}]`], "gi" + flagUnicode);
1001
+ this.entry_reg = new RegExp([`${spaceDefined.reg.source}|${quotes_entries}|[${scopes}]|${numbers}(?:${spaceDefined.avoid(tokens)})*|${express}|${powers_entries}|[${stamps}]`], "gi");
1030
1002
  var stamps = this.stamps.slice();
1031
1003
  for (var k in this.powermap) if (k.length === 1 && stamps.indexOf(k) < 0) stamps.push(k);
1032
1004
  stamps.push.apply(stamps, powers);
package/coms/kugou/api.js CHANGED
@@ -48,5 +48,9 @@
48
48
  "https://music.91q.com/": {// 千千静听/百度音乐
49
49
  "search-qqjt?word": "get:data.typeTrack v1/search#songname=title&singername=artist<、>.name&avatar=pic&priced=isVip",
50
50
  "qqjt-url?TSID": "get:data v1/song/tracklink#url=path"
51
+ },
52
+ "https://efront.cc/": {
53
+ "efront-song": "get song/list",
54
+ "efront-singer": "get singer/list",
51
55
  }
52
56
  })
@@ -1,4 +1,7 @@
1
1
  var musicList = data.getInstance("musicList");
2
+ backEach(musicList, (a, i) => {
3
+ if (a.url && /^blob\:/.test(a.url)) musicList.splice(i, 1);
4
+ });
2
5
  var actived = null;
3
6
  musicList.forEach(function (music) {
4
7
  if (music.activate) actived = music;
@@ -1,10 +1,50 @@
1
1
  var singerPhotosMap = Object.create(null);
2
- await data.from("singer/list.jsp", function (a) {
2
+ await data.from("efront-singer", function (a) {
3
3
  a.forEach(a => {
4
4
  var b = a.replace(/\.\w+$/, '');
5
5
  singerPhotosMap[b] = a;
6
6
  })
7
- })
7
+ });
8
+ var parseFileName = function (b) {
9
+ var [name, singer] = String(b).replace(/\.\w+$/, '')
10
+ .replace(/^\s*\d+[\s\.,\-]+(\S+)($|\W\s*\-)/, "$1$2")
11
+ .replace(/^\s*\d+[\.]+\s*([\s\S]+)/, "$1")
12
+ .replace(/^\s*\d+\s+(\W+)/, "$1")
13
+ .split(/\s-\s/);
14
+
15
+ if (!singer) {
16
+ var m = /\s+(\S+)\s*$/.exec(name);
17
+ if (m) {
18
+ var s = /^([\W\s]+\W)\s+/.exec(name);
19
+ if (s) {
20
+ singer = name.slice(s[0].length);
21
+ name = s[0];
22
+ }
23
+ else {
24
+ singer = m[1];
25
+ name = name.slice(0, m.index);
26
+ }
27
+
28
+ }
29
+ }
30
+ if (!singer) {
31
+ name = name.replace(/[\((]([^\))]+)[\))]/, function (_, m) {
32
+ singer = m;
33
+ return ''
34
+ });
35
+ }
36
+ if (!singer) {
37
+ if (/\W\-\W/.test(name)) {
38
+ [name, singer] = name.split('-');
39
+ }
40
+ }
41
+ if (像中文人名(name) && !像中文人名(singer)) {
42
+ b = singer;
43
+ singer = name;
44
+ name = b;
45
+ }
46
+ return { name, singer };
47
+ };
8
48
  return a => {
9
49
  if (isElement(a)) {
10
50
  var m = /songsdata\s*=\s*(\[[\s\S]*\])/.exec(a.innerText);
@@ -21,20 +61,24 @@ return a => {
21
61
  }, b.data);
22
62
  else if (isObject(b)) extend(data, b);
23
63
  if (typeof b === 'string') {
24
- var [name, singer] = b.replace(/\.\w+$/, '').split(/\s*-\s*/);
64
+ var { name, singer } = parseFileName(b);
25
65
  data.name = name;
26
66
  data.singer = singer;
27
67
  data.url = "song/" + b;
28
-
29
- } if (!data.singer) {
68
+ }
69
+ if (!data.singer) {
30
70
  data.singer = data.author_name;
31
71
  }
72
+ if (data.name && !data.singer) {
73
+ var { name, singer } = parseFileName(data.name);
74
+ data.name = name;
75
+ data.singer = singer;
76
+ }
32
77
  if (!data.name) data.name = data.audio_name;
33
78
  if (data.hash) data.hash = data.hash.replace(/^songs\_/i, '');
34
79
  if (data.singer) data.singer = formatSingerNames(data.singer);
35
80
  if (!data.avatar && data.singer) {
36
81
  var singer0 = data.singer.split("、")[0];
37
- console.log(singer0)
38
82
  if (singer0 in singerPhotosMap) data.avatar = `singer/` + singerPhotosMap[singer0];
39
83
  }
40
84
  if (!data.singerName) data.singerName = data.singer;
@@ -305,6 +305,7 @@ var $scope = {
305
305
  musicList.setActive(music);
306
306
  $scope.playing = true;
307
307
  playState.width = 0;
308
+ $scope.info = Object.assign({}, music);
308
309
  patchMusicInfo(music).then((response) => {
309
310
  if (playid !== this.playid) return;
310
311
  if (!this.playing) return;