mediac 1.5.0 → 1.5.1

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.
@@ -102,7 +102,7 @@ const handler = async function cmdCompress(argv) {
102
102
  const purgeSource = argv.purge || false;
103
103
  log.show(`${logTag} input:`, root);
104
104
 
105
- const RE_THUMB = /Z4K|M4K|feature|web|thumb$/i;
105
+ const RE_THUMB = /Z4K|P4K|M4K|feature|web|thumb$/i;
106
106
  const walkOpts = {
107
107
  needStats: true,
108
108
  entryFilter: (f) =>
@@ -12,6 +12,7 @@ import inquirer from "inquirer";
12
12
  import { cpus } from "os";
13
13
  import pMap from 'p-map';
14
14
  import path from "path";
15
+ import * as core from '../lib/core.js';
15
16
  import { asyncFilter } from '../lib/core.js';
16
17
  import * as log from '../lib/debug.js';
17
18
  import * as enc from '../lib/encoding.js';
@@ -43,6 +44,13 @@ const builder = function addOptions(ya, helpOrVersionSet) {
43
44
  type: "boolean",
44
45
  description: "remove special chars in filename",
45
46
  })
47
+ // 使用正则表达式替换文件名中的特定字符,比如问号
48
+ // 如果数组只有一项,就是替换这一项为空白,即删除模式字符串
49
+ // 如果有两项,就是替换第一项匹配的字符串为第二项指定的字符
50
+ .option("replace", {
51
+ type: "array",
52
+ description: "replace regex pattern in filename [from,to]",
53
+ })
46
54
  // 修复文件名乱码
47
55
  .option("encoding", {
48
56
  alias: "e",
@@ -78,9 +86,9 @@ const handler = async function cmdFixName(argv) {
78
86
  }
79
87
  const startMs = Date.now();
80
88
  log.show(logTag, `Input: ${root}`);
81
- if (!(argv.clean || argv.encoding || argv.tcsc)) {
82
- log.error(`Error: clean|encoding|tcsc,at least one is required`);
83
- throw new Error(`clean|encoding|tcsc,at least one is required`);
89
+ if (!(argv.clean || argv.encoding || argv.tcsc || argv.remove)) {
90
+ log.error(`Error: replace|clean|encoding|tcsc,at least one is required`);
91
+ throw new Error(`replace|clean|encoding|tcsc,at least one is required`);
84
92
  }
85
93
  let files = await mf.walk(root, {
86
94
  needStats: true,
@@ -167,6 +175,15 @@ async function fixFileName(f) {
167
175
  const strPath = path.resolve(f.path).split(path.sep).join(' ')
168
176
  let oldBase = base;
169
177
  let newDir = oldDir;
178
+ if (argv.replace?.[0]?.length > 0) {
179
+ const rFrom = argv.replace[0];
180
+ const rTo = argv.replace[1] || "";
181
+ // 执行文件名字符替换操作
182
+ // 按照正则表达式替换指定字符
183
+ // 如果rTo为空则等于删除字符
184
+ oldBase = oldBase.replaceAll(rFrom, rTo);
185
+ oldBase = oldBase.replaceAll(new RegExp(rFrom, "gu"), rTo);
186
+ }
170
187
  if (argv.encoding) {
171
188
  // 执行文件路径乱码修复操作
172
189
  // 对路径进行中日韩文字编码修复
@@ -179,10 +196,13 @@ async function fixFileName(f) {
179
196
  });
180
197
  // 重新组合修复后的目录路径
181
198
  newDir = path.join(...dirNamesFixed);
199
+ if (core.isUNCPath(oldDir)) {
200
+ newDir = "\\\\" + newDir;
201
+ }
182
202
  // 显示有乱码的文件路径
183
203
  if (enc.hasBadUnicode(strPath)) {
184
- // log.showGray(logTag, `BadEnc:${++badCount}`, oldPath)
185
- // log.fileLog(`BadEnc: ${ipx} <${oldPath}>`, logTag);
204
+ log.showGray(logTag, `BadEnc:${++badCount}`, oldPath)
205
+ log.fileLog(`BadEnc: ${ipx} <${oldPath}>`, logTag);
186
206
  }
187
207
  }
188
208
  if (argv.clean) {
@@ -197,15 +217,15 @@ async function fixFileName(f) {
197
217
  const newName = `${oldBase}${ext}`
198
218
  const newPath = path.join(newDir, newName);
199
219
  if (newPath === oldPath) {
200
- log.info(logTag, `Same: ${ipx} ${helper.pathShort(newPath)}`);
220
+ log.info(logTag, `Ignore Same: ${ipx} ${helper.pathShort(newPath)}`);
201
221
  f.skipped = true;
202
222
  }
203
223
  else if (await fs.pathExists(newPath)) {
204
- log.info(logTag, `Exists: ${ipx} ${helper.pathShort(newPath)}`);
224
+ log.info(logTag, `Ignore Exists: ${ipx} ${helper.pathShort(newPath)}`);
205
225
  f.skipped = true;
206
226
  }
207
227
  else if (nameDuplicateSet.has(newPath)) {
208
- log.info(logTag, `Dup: ${ipx} ${helper.pathShort(newPath)}`);
228
+ log.info(logTag, `Ignore Dup: ${ipx} ${helper.pathShort(newPath)}`);
209
229
  f.skipped = true;
210
230
  }
211
231
 
package/cmd/cmd_shared.js CHANGED
@@ -29,6 +29,7 @@ async function renameOneFile(f) {
29
29
  log.showYellow("Rename", "ignore", f.path);
30
30
  return;
31
31
  }
32
+ log.showGray(`Source: ${f.path}`);
32
33
  try {
33
34
  // 确保输出目录已存在,如果不存在则创建
34
35
  const outDir = path.dirname(outPath);
package/lib/core.js CHANGED
@@ -84,3 +84,8 @@ export const compareSmart = (a, b) => {
84
84
  export function compareSmartBy(k) {
85
85
  return (a, b) => compareSmart(a[k], b[k]);
86
86
  }
87
+
88
+ export function isUNCPath(strPath) {
89
+ const re = /^[\\\/]{2,}[^\\\/]+[\\\/]+[^\\\/]+/
90
+ return re.test(strPath);
91
+ }
package/lib/encoding.js CHANGED
@@ -37,7 +37,7 @@ export const REGEX_MESSY_CJK_EXT = /[\u8701-\u883f\u9200-\u9484]/u //生僻字:
37
37
  export const REGEX_MESSY_UNICODE = /[\u007f-\u00a0\u00c0-\u017f\u0400-\u1cff\u2070-\u24ff\u0e00-\u0e7f\u3400-\u4dbf\uac00-\uf8ff\ufe30-\ufe4f\ufff0-\uffff]/u
38
38
 
39
39
  // 正则:只包含中文常用汉字,日文平假名片假名和ASCII字符
40
- export const RE_CHARS_MOST_USED = new RegExp(`^[${CHINESE_CHARS_3500}\\u3000-\\u303f\\uff66-\\uff9dA-Za-z0-9\\-_]+$`, 'ui')
40
+ export const RE_CHARS_MOST_USED = new RegExp(`^[${CHINESE_CHARS_3500}\\u3000-\\u303f\\uff66-\\uff9dA-Za-z0-9\\-_ ]+$`, 'ui')
41
41
 
42
42
  export function charUnique(str) {
43
43
  return String.prototype.concat.call(...new Set(str));
@@ -52,7 +52,7 @@ export function checkBadUnicode(str) {
52
52
  // 乱码标志 问号和黑问号
53
53
  results.push([true, 0, `非法字符`])
54
54
  }
55
- if (/[\u00c0-\u024f\u3100-\u312f\ua720-\ua7ff\uab30-\uabff]/u.test(str)) {
55
+ if (/[\u00c0-\u00d6\u00d8-\u024f\u3100-\u312f\ua720-\ua7ff\uab30-\uabff]/u.test(str)) {
56
56
  // 乱码标志 拉丁字母扩展 注音符号
57
57
  results.push([true, 2, `拉丁字母扩展`])
58
58
  }
@@ -90,11 +90,11 @@ export function hasBadCJKChar(str) {
90
90
  export function fixCJKEnc(str) {
91
91
  let results = fixCJKEncImpl(str)
92
92
  results = results.filter(r => r[2] >= 0).sort((a, b) => b[2] - a[2])
93
- log.info('==================================')
94
- log.info(str)
93
+ log.debug('==================================')
94
+ log.debug(str)
95
95
  if (results?.length > 0) {
96
96
  for (const r of results) {
97
- log.info(r[0], '\t\t', r.slice(1))
97
+ log.debug(r[0], '\t\t', r.slice(1))
98
98
  }
99
99
  }
100
100
  return results[0] || [str, false, 0, 'fallback'];
@@ -128,7 +128,7 @@ export function fixCJKEncImpl(str,
128
128
  }
129
129
  else {
130
130
  // fs.appendFileSync(tempfile, str + '\n')
131
- // return [[str, false, 0, '忽略0', ''],]
131
+ return [[str, false, 0, '忽略0', ''],]
132
132
  }
133
133
  } else {
134
134
  if (strOnlyChinese(str) && !REGEX_MESSY_CJK_EXT.test(str)) {
@@ -178,9 +178,9 @@ export function fixCJKEncImpl(str,
178
178
  results.push([strDecoded, true, 99, `常用汉字`, `${enc1}=>${enc2}`])
179
179
  break
180
180
  }
181
- log.info(strDecoded, onlyCN, onlyJP, messyUnicode, messyCJK)
181
+ log.debug(strDecoded, onlyCN, onlyJP, messyUnicode, messyCJK)
182
182
 
183
- if (onlyJP) {
183
+ if (onlyJP && strHasHiraKana(strDecoded)) {
184
184
  results.push([strDecoded, true, 78, `日文字符`, `${enc1}=>${enc2}`])
185
185
  }
186
186
  else if (onlyCN) {
@@ -208,6 +208,6 @@ export function fixCJKEncImpl(str,
208
208
  }
209
209
  results.push([str, false, 70, '原始字符串'])
210
210
  results = results.filter(r => r[2] >= threhold).sort((a, b) => b[2] - a[2])
211
- log.info(results.slice(3))
211
+ log.debug(results.slice(3))
212
212
  return results;
213
213
  }
package/lib/file.js CHANGED
@@ -123,7 +123,7 @@ export async function walk(root, options = {}) {
123
123
  }
124
124
  }
125
125
  startMs = Date.now();
126
- files = (await pMap(files, entryMapper, { concurrency: cpus().length * 2 }));
126
+ files = (await pMap(files, entryMapper, { concurrency: cpus().length * 4 }));
127
127
  // files = files.sort(compareSmartBy('path'))
128
128
  needBar && bar1.update(files.length);
129
129
  needBar && bar1.stop();
package/lib/helper.js CHANGED
@@ -24,6 +24,7 @@ const ARCHIVE_FORMATS = [
24
24
 
25
25
  const IMAGE_FORMATS = [
26
26
  ".jpg",
27
+ ".jpe",
27
28
  ".jpeg",
28
29
  ".png",
29
30
  ".avif",
@@ -1 +1 @@
1
- 娾僾壒鑀葊蓭儑垵貋嶅摮謷謸慠巼弝垻跁贁斒螌褩闆螁捠邫艕闁怉堢賲藵菢袌虣儤揹藣郥偝偹僃蛽翉楍倴桳撪輽埲偪楅螕聛貏邲苾袐弻煏蓽蜌廦覍徧艑脿幖儦藨謤贆諘虌彆邠儐虨臏抦昞棅偋傡剝袚缽僠瓟葧艊攃婇傪朁摻儏謲傖賶嶆蓸敇蓛箣憡偛艖詧祡袃訍蠆幨攙僝儃剷嵼幝閳譂讇锠僘謿巐仦蛼諃迧茞軙樄曟趻贂棦偁僜罉脭庱彨彲翄懘趩翀憃蹖揰搊菗椆摴貙幮藸傗滀蓫儊諔臅暷輲僢菙堾輴滣偆賰娕偨蠀嬨皉茦莿螆茐棇蓯聦婃欉謥脨趗憱顣鑹櫕缞嶉磪脺膬臎乼竴虘蟽軑軚艜蹛聸僤蓞贉簹艡欓讜儅趤壔翢艔軇瓙脦艠櫈袛藡拞菧聜偙僀嶳傎嵮蹎奌婰蜔訋蓧恎昳绖戜惵褋艓帄倲埬菄徚蕫迵戙枓脰嬻讟螙偳褍塅嵟逇敪埵軃尮偔崿詻僫讍奀峏栭厼趰誀茷傠蕟忛勫柉羳鐢蠜奿訉軓婏蕜杮鐨翂訜岎幩蕡羵僨膹偑僼鎽霻摓艂覂賵覅缹缻邞紨岪翇虙葍粰呒蜅撨峊袝偩覄褔蕧祴忋槩忓尷仠堈掆罁焹戅菒藳犵鎶輵挭拲羾莻袧褠茩苽箛唃傦脵崓僱詿柺覌輨泴悺罆茪僙椝槼螝膭蛫嶡蓘輥謴濄彍聝惈螒譀迒貥茠椃諕蠔悎傐抲蠚峆楁詥貈螛礉垎袔熇詪悙脝噷叿渹輷鍧纮垬娂翃粠葒綋翝晎闂闀葔虖軤膴謼螜虝嫮熩鍙婲搳撶螖諙諣褢褱貛寏藧巟偟葟熿艎趪詤愰婎幑褘撝蜖詯僡藱儶孈梡佸旤艧僟銈賷鐖覉忣揤偮庴塉檝螏鍓艥妀茍茤紒惎葪諅乫貑鎵忦蛺幏惤葌椷椾蕳熸瀐鐧虃弿謭蠒鐗葥諓翞螀傋弶謽茮虠嶕膲儌憿敿訆漖趭菨堦脻謯迼偼媫楬蜐蓵蠞蠘悈蛶褯兓惍巹蓳僸濅賮葏聙蟼曔僒褧奺欍崌跔艍諊僪蹫聥乬邭袓埾虡寠勮懅貗脧鎸埍菤臇覐趹傕蕝臄觼貜覠鍕晙懏擖欬偘埳惂邟囥犺鈧趷揢翗愙艐摼埪涳郀跍趶廤褲姱儈旝邼狅軖軠岲聧楏虁蹞聭蕢樻聵熴閫閸睏翋菈搚藞攋蠟婡崍賴葻懢攔讕襽郞艆蜋鎯蓢樃崀僗鐒蔂儽壨虆欙傫藟蠝鑸銇攂倰菞棃艃褵謧邌孋邐涖脷厤棙蛠蝷曆儮曞蠇壢藶觻欐讈梿覝聫褳聮螊謰蹥羷僆墚輬脼嶛膫屪廫賿蹘藔尦尞茢迾脟巤儠冧晽粦亃癛旈藰嬼翏廇蕯壠慺艛謱塿蓾艣鐪菉趢蹗鯥虂藘捛屢儢曫虊惀菕錀埨覙鏍儸攞欏曪洜嬤螞杩傌屘鏋槾澷庬莾茻貓軞乮蓩覒愗嚜脢槑徾嵄媺跊菛虋夣詸擟攠葞覔覛榓偭覕搣懱僶慜蠠姳慏詺謩擵懡眿蛨暯銆藦鏌怽畞莯幙艒鎿袦軜摨嬭褦螚暔擃儾怓巎抐脮埿聣抳儗儞聻伲迡堄嫟愵跈蹍蹨艌褭揑惗菍巕讘钀脌甯儜蕽挊羺鐞傉搙蹃藲鏂掱輫渒溿嗙褜奅斾蓜嶏葐梈旇翍壀脴擗鷿楄覑僄蠙聠呯帲幈缾蓱蛢輧敀娝擈菐贌巭迉桼蛣僛諆亝旂帺掑軝愭懠艩蠐邔婍忔湇罊蟿缼婜孯諐偂軡脥嗛傔儙輤蹡廧羻趬菬癄藮趫帩僺聺蛪鍥嶔菦嫀慬懄蠄笉梫菣撳埥夝剠殑葝檾掅儬宆儝藭丠媝蓲趥訅蛷菃翑葋鑺蝺迲奍峑婘葲烇虇崅夋衻袇袡媣儴讱屻岃訒軔梕茙峵媶搑褣螎嬫巆傇輮鍒蕠曘嗕偄輭膶虄僿褬濏譅桬儍翜翣邖挻脠軕搧羴晱訕傓僐敾樿蟺謪绱蕱袑蛥蠂屾葠訷蓡詵邥谉渖諗曋脤蜄瘮苼曻鉎鍟偗渻賸邿褷鍦乭姼枾媞煶諟鏉杸掓軗虪慡脽虒恖蕬螄柶蕼愯廀摉叜傁擻梀傃藗葰嵗鐩蕵傞摍溑褨鏁褟枱炲菭儓嬯忲惔墰墵燂罈藫貚傝僋蹚傏漟偒幍轁貣膯幐邆虅偍蕛趧蹏鍗悐揥趯屇庣蓨宨嬥覜聼邒閮聤娗脡蓪峝晍詷膧媮妵庩悇捈梌鍎迌貒剸鏄褖蓷藬尵蹪俀僓蹆軘臋讬袥脫沲迱袉跅媧嗗邷夞帵貦埦脕贃暀蛧迋葨詴嶶蓶鍏闈愇撱諉儰苿叞菋媦藯讏塭輼轀螡閺脗妏顐璺螉聬攚罋涹偓楃擭臒弙箼螐祦儛屼忢悞嵍邜傒翖嶲橀熻螇貕觽觿椺謵鎴蹝呬忥恄蕮虩傄翈敮蕸僲憸蹮妶蛝輱藖獮鍌幰攇峴晛缐僩僴壏膷鑲蠁缿宯虓翛膮虈郩涍詨斅峫翓讗藛缷偞偰僁褉嶰邤杺軐脪蛵曐侀讻詾賯诇脙鏅潃褎褏螑晇訏虗谞虛蕦諝譃呴偦詡怴欰藚吅弲梋鋗蕿蠉蜁嫙檈晅袨眴鏇袕壆瀥焄壎臐壦攳迿訙吖笌漄蕥偣綖詽虤壛巗椼褗覎葕傿椻暥嬊觾讞輰鍚岟炴傟懩傜摿暚邎宎抭偠袎覞艞讑僷曅歋擛悘毉侇迻宧巸弬栘袘訑貤蛦箷彛螔謻讉庡逘偯敼螘帠袣埶幆晹蛡跇嫕蓺槸艗貖賹藙贀虉讛訔訚崯朄讔憗懚粌偀愥绬嫈罃褮僌巊彮逌偤輶栯脜蜏哊迶邘扵乻堬旕艅褕嬩鍝偊貐忬茟喐棫艈銉蓹薁繘軉澚惌邧貟酛茒媴嫄邍妴傆褑褤軏跀缊奫蝹鄖愪賱傊藴偺菑賳傤儎鐟趲蹔蹧艁趮幘樍諎謮賾蠌庂崱蠈熷譄吒偧鍘夈惉邅讝嶃偡虥虦傽慞蔁墇枛旐罀嫬袩悊詟謺讋乽桭葴嫃樼轃纼栚瑱掙衼嗭膱軄藢迣庢袟乿偫翐袠傂崻寘覟儨劕妐幒螤蹱茽偅诪荮粙葤詶僽噣笁曯斸迬殶跓膼跩塼僎壵漴娷諈迍棳斲諑斀斵謶灂蠗茊葘趦輺蓻惾葼鍐菆棷崒踿鎺栬晬鋷罇僔袏䐠
1
+ 娾僾壒鑀葊蓭儑垵貋嶅摮謷謸慠巼弝垻跁贁斒螌褩闆螁捠邫艕闁怉堢賲藵菢袌虣儤揹藣郥偝偹僃蛽翉楍倴桳撪輽埲偪楅螕聛貏邲苾袐弻煏蓽蜌廦覍徧艑脿幖儦藨謤贆諘虌彆邠儐虨臏抦昞棅偋傡剝袚缽僠瓟葧艊攃婇傪朁摻儏謲傖賶嶆蓸敇蓛箣憡偛艖詧祡袃訍蠆幨攙僝儃剷嵼幝閳譂讇锠僘謿巐仦蛼諃迧茞軙樄曟趻贂棦偁僜罉脭庱彨彲翄懘趩翀憃蹖揰搊菗椆摴貙幮藸傗滀蓫儊諔臅暷輲僢菙堾輴滣偆賰娕偨蠀嬨皉茦莿螆茐棇蓯聦婃欉謥脨趗憱顣鑹櫕缞嶉磪脺膬臎乼竴虘蟽軑軚艜蹛聸僤蓞贉簹艡欓讜儅趤壔翢艔軇瓙脦艠櫈袛藡拞菧聜偙僀嶳傎嵮蹎奌婰蜔訋蓧恎昳绖戜惵褋艓帄倲埬菄徚蕫迵戙枓脰嬻讟螙偳褍塅嵟逇敪埵軃尮偔崿詻僫讍奀峏栭厼趰誀茷傠蕟忛勫柉羳鐢蠜奿訉軓婏蕜杮鐨翂訜岎幩蕡羵僨膹偑僼鎽霻摓艂覂賵覅缹缻邞紨岪翇虙葍粰呒蜅撨峊袝偩覄褔蕧祴忋槩忓尷仠堈掆罁焹戅菒藳犵鎶輵挭拲羾莻袧褠茩苽箛唃傦脵崓僱詿柺覌輨泴悺罆茪僙椝槼螝膭蛫嶡蓘輥謴濄彍聝惈螒譀迒貥茠椃諕蠔悎傐抲蠚峆楁詥貈螛礉垎袔熇詪悙脝噷叿渹輷鍧纮垬娂翃粠葒綋翝晎闂闀葔虖軤膴謼螜虝嫮熩鍙婲搳撶螖諙諣褢褱貛寏藧巟偟葟熿艎趪詤愰婎幑褘撝蜖詯僡藱儶孈梡佸旤艧僟銈賷鐖覉忣揤偮庴塉檝螏鍓艥妀茍茤紒惎葪諅乫貑鎵忦蛺幏惤葌椷椾蕳熸瀐鐧虃弿謭蠒鐗葥諓翞螀傋弶謽茮虠嶕膲儌憿敿訆漖趭菨堦脻謯迼偼媫楬蜐蓵蠞蠘悈蛶褯兓惍巹蓳僸濅賮葏聙蟼曔僒褧奺欍崌跔艍諊僪蹫聥乬邭袓埾虡寠勮懅貗脧鎸埍菤臇覐趹傕蕝臄觼貜覠鍕晙懏擖欬偘埳惂邟囥犺鈧趷揢翗愙艐摼埪涳郀跍趶廤褲姱儈旝邼狅軖軠岲聧楏虁蹞聭蕢樻聵熴閫閸睏翋搚藞攋蠟婡崍賴葻懢攔讕襽郞艆蜋鎯蓢樃崀僗鐒蔂儽壨虆欙傫藟蠝鑸銇攂倰菞棃艃褵謧邌孋邐涖脷厤棙蛠蝷曆儮曞蠇壢藶觻欐讈梿覝聫褳聮螊謰蹥羷僆墚輬脼嶛膫屪廫賿蹘藔尦尞茢迾脟巤儠冧晽粦亃癛旈藰嬼翏廇蕯壠慺艛謱塿蓾艣鐪菉趢蹗鯥虂藘捛屢儢曫虊惀菕錀埨覙鏍儸攞欏曪洜嬤螞杩傌屘鏋槾澷庬莾茻貓軞乮蓩覒愗嚜脢槑徾嵄媺跊菛虋夣詸擟攠葞覔覛榓偭覕搣懱僶慜蠠姳慏詺謩擵懡眿蛨暯銆藦鏌怽畞莯幙艒鎿袦軜摨嬭褦螚暔擃儾怓巎抐脮埿聣抳儗儞聻伲迡堄嫟愵跈蹍蹨艌褭揑惗菍巕讘钀脌甯儜蕽挊羺鐞傉搙蹃藲鏂掱輫渒溿嗙褜奅斾蓜嶏葐梈旇翍壀脴擗鷿楄覑僄蠙聠呯帲幈缾蓱蛢輧敀娝擈菐贌巭迉桼蛣僛諆亝旂帺掑軝愭懠艩蠐邔婍忔湇罊蟿缼婜孯諐偂軡脥嗛傔儙輤蹡廧羻趬菬癄藮趫帩僺聺蛪鍥嶔菦嫀慬懄蠄笉梫菣撳埥夝剠殑葝檾掅儬宆儝藭丠媝蓲趥訅蛷菃翑葋鑺蝺迲奍峑婘葲烇虇崅夋衻袇袡媣儴讱屻岃訒軔梕茙峵媶搑褣螎嬫巆傇輮鍒蕠曘嗕偄輭膶虄僿褬濏譅桬儍翜翣邖挻脠軕搧羴晱訕傓僐敾樿蟺謪绱蕱袑蛥蠂屾葠訷蓡詵邥谉渖諗曋脤蜄瘮苼曻鉎鍟偗渻賸邿褷鍦乭姼枾媞煶諟鏉杸掓軗虪慡脽虒恖蕬螄柶蕼愯廀摉叜傁擻梀傃藗葰嵗鐩蕵傞摍溑褨鏁褟枱炲菭儓嬯忲惔墰墵燂罈藫貚傝僋蹚傏漟偒幍轁貣膯幐邆虅偍蕛趧蹏鍗悐揥趯屇庣蓨宨嬥覜聼邒閮聤娗脡蓪峝晍詷膧媮妵庩悇捈梌鍎迌貒剸鏄褖蓷藬尵蹪俀僓蹆軘臋讬袥脫沲迱袉跅媧嗗邷夞帵貦埦脕贃暀蛧迋葨詴嶶蓶鍏闈愇撱諉儰苿叞菋媦藯讏塭輼轀螡閺脗妏顐璺螉聬攚罋涹偓楃擭臒弙箼螐祦儛屼忢悞嵍邜傒翖嶲橀熻螇貕觽觿椺謵鎴蹝呬忥恄蕮虩傄翈敮蕸僲憸蹮妶蛝輱藖獮鍌幰攇峴晛缐僩僴壏膷鑲蠁缿宯虓翛膮虈郩涍詨斅峫翓讗藛缷偞偰僁褉嶰邤杺軐脪蛵曐侀讻詾賯诇脙鏅潃褎褏螑晇訏虗谞虛蕦諝譃呴偦詡怴欰藚吅弲梋鋗蕿蠉蜁嫙檈晅袨眴鏇袕壆瀥焄壎臐壦攳迿訙吖笌漄蕥偣綖詽虤壛巗椼褗覎葕傿椻暥嬊觾讞輰鍚岟炴傟懩傜摿暚邎宎抭偠袎覞艞讑僷曅歋擛悘毉侇迻宧巸弬栘袘訑貤蛦箷彛螔謻讉庡逘偯敼螘帠袣埶幆晹蛡跇嫕蓺槸艗貖賹藙贀虉讛訔訚崯朄讔憗懚粌偀愥绬嫈罃褮僌巊彮逌偤輶栯脜蜏哊迶邘扵乻堬旕艅褕嬩鍝偊貐忬茟喐棫艈銉蓹薁繘軉澚惌邧貟酛茒媴嫄邍妴傆褑褤軏跀缊奫蝹鄖愪賱傊藴偺菑賳傤儎鐟趲蹔蹧艁趮幘樍諎謮賾蠌庂崱蠈熷譄吒偧鍘夈惉邅讝嶃偡虥虦傽慞蔁墇枛旐罀嫬袩悊詟謺讋乽桭葴嫃樼轃纼栚瑱掙衼嗭膱軄藢迣庢袟乿偫翐袠傂崻寘覟儨劕妐幒螤蹱茽偅诪荮粙葤詶僽噣笁曯斸迬殶跓膼跩塼僎壵漴娷諈迍棳斲諑斀斵謶灂蠗茊葘趦輺蓻惾葼鍐菆棷崒踿鎺栬晬鋷罇僔袏䐠
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mediac",
3
- "version": "1.5.0",
3
+ "version": "1.5.1",
4
4
  "type": "module",
5
5
  "description": "MediaCli is a multimedia file processing tool that utilizes ffmpeg and exiftool, among others, to compress/convert/rename/delete/organize media files, including images, videos, and audio.",
6
6
  "main": "index.js",
@@ -75,6 +75,7 @@
75
75
  "sanitize-filename": "^1.6.3",
76
76
  "sharp": "^0.33.2",
77
77
  "throat": "^6.0.2",
78
+ "upath": "^2.0.1",
78
79
  "which": "^4.0.0",
79
80
  "yargs": "^17.7.2"
80
81
  },
@@ -1,9 +1,21 @@
1
1
 
2
2
  import path from 'path';
3
- import { REGEX_MESSY_CJK, REGEX_MESSY_CJK_EXT, REGEX_MESSY_UNICODE, checkBadUnicode, fixCJKEncImpl, hasBadUnicode } from '../lib/encoding.js';
3
+ import { REGEX_MESSY_CJK, REGEX_MESSY_CJK_EXT, REGEX_MESSY_UNICODE, RE_CHARS_MOST_USED, checkBadUnicode, fixCJKEncImpl, hasBadUnicode } from '../lib/encoding.js';
4
4
  import { strOnlyChinese, strOnlyJapanese } from '../lib/unicode.js';
5
5
 
6
-
6
+ import assert from "assert";
7
+ import chalk from 'chalk';
8
+ import * as cliProgress from "cli-progress";
9
+ import dayjs from "dayjs";
10
+ import exif from 'exif-reader';
11
+ import fs from 'fs-extra';
12
+ import inquirer from "inquirer";
13
+ import { cpus } from "os";
14
+ import pMap from 'p-map';
15
+ import sharp from "sharp";
16
+ import * as log from '../lib/debug.js';
17
+ import * as mf from '../lib/file.js';
18
+ import * as helper from '../lib/helper.js';
7
19
 
8
20
 
9
21
  import { fileURLToPath } from 'url';
@@ -42,6 +54,7 @@ function showStatus(str, title = '') {
42
54
  print('REGEX_MESSY_CJK', REGEX_MESSY_CJK.test(str))
43
55
  print('REGEX_MESSY_CJK_EXT', REGEX_MESSY_CJK_EXT.test(str))
44
56
  print('REGEX_MESSY_UNICODE', REGEX_MESSY_UNICODE.test(str))
57
+ print('RE_CHARS_MOST_USED', RE_CHARS_MOST_USED.test(str))
45
58
  }
46
59
 
47
60
  let fromStr = process.argv[2]
@@ -56,4 +69,16 @@ console.log()
56
69
  console.log('INPUT:', [fromStr])
57
70
  console.log('OUPUT:', results.pop())
58
71
  showStatus(fromStr, 'fromStr')
59
- showStatus(toStr, 'toStr')
72
+ showStatus(toStr, 'toStr')
73
+
74
+ const data = await fs.readFile(process.argv[2], { encoding: 'utf8' })
75
+ const lines = data.split('\r\n')
76
+ for (const textLine of lines) {
77
+ if (textLine.startsWith('├─')) {
78
+ console.log(textLine)
79
+ }
80
+ if (hasBadUnicode(textLine) && !textLine.includes('?')) {
81
+ console.log(textLine)
82
+ console.log(checkBadUnicode(textLine))
83
+ }
84
+ }
@@ -0,0 +1,14 @@
1
+ import upath from 'upath';
2
+ import * as mf from '../lib/file.js';
3
+
4
+
5
+ let files = await mf.walk(process.argv[2], {
6
+ needStats: true,
7
+ });
8
+ for (const f of files) {
9
+ console.log('\n-----------------\n')
10
+ console.log(f.path)
11
+ console.log(upath.normalize(f.path))
12
+ console.log(upath.normalizeSafe(f.path))
13
+ console.log(upath.normalizeTrim(f.path))
14
+ }
@@ -32,7 +32,7 @@ function normalizeChars(filename = 'messy_hanzi.txt') {
32
32
  const dataDir = path.join(path.dirname(__dirname), 'data')
33
33
  const libDir = path.join(path.dirname(__dirname), 'lib')
34
34
  // const fileChars = fs.readFileSync(path.join(dataDir, 'messy_sample.txt'), 'utf8')
35
- const chars = enc.REGEX_MESSY_CJK + ''
35
+ const chars = enc.REGEX_MESSY_CJK + '僟僽儖'
36
36
  const valid = []
37
37
  // 排除1 汉字属于中国常用汉字7000字的范围
38
38
  // 排除2 汉字属于日本常用汉字2100字的范围
@@ -85,10 +85,10 @@ function fixEnc(str) {
85
85
 
86
86
  let fromStr = ''
87
87
  // 这个特殊,解码出来有emoji JS转换会乱码
88
- // 2024-01-10 06-00大鳳背面座位
88
+ // 2024-01-10 06-00大鳳背面座位
89
89
  // 2024-01-10 06-00螟ァ魑ウ閭碁擇蠎ァ菴郊生
90
90
  // messyStr = '2024-01-10 06-00螟ァ魑ウ閭碁擇蠎ァ菴郊生'
91
- fromStr = '2021-12-06 02-30 宸濆唴楂樼敾璩増'
91
+ fromStr = '│ │ DOT_像度画像です(PNG ×PX)-_49_Z4K'
92
92
  const toStr = process.argv.length > 2 ? fixEnc(process.argv[2]) : fixEnc(fromStr)
93
93
  showStatus(fromStr, 'BEFORE FIX')
94
94
  showStatus(toStr, 'AFTER FIX')
@@ -5,7 +5,6 @@ import { sify } from 'chinese-conv';
5
5
  import fs from 'fs-extra';
6
6
  import iconv from 'iconv-lite';
7
7
  import inquirer from "inquirer";
8
- import JSZip from 'jszip';
9
8
  import { cpus } from "os";
10
9
  import pMap from 'p-map';
11
10
  import path from "path";