@music-lyric-kit/plugin-transform-pure 0.1.0 → 0.2.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,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("@music-lyric-kit/utils"),h=require("@music-lyric-kit/core"),d=require("@music-lyric-kit/lyric"),p={mode:"fuzzy",fuzzy:{},exact:{check:50},rule:{useDefault:!0,custom:[]}},R=["版权所有","版权","授权","Copyright","License","All rights reserved","翻唱","改编","致敬","Cover","Adaptation","Tribute","Remake"];class f{options;stringRules=[];regexRules=[];defaultRules=[];combinedRegex=null;constructor(e,t){this.options=e,this.defaultRules=t,this.init()}init(){const e=this.options.rule.useDefault?[...this.defaultRules,...this.options.rule.custom||[]]:[...this.options.rule.custom||[]];for(const t of e)typeof t=="string"?this.stringRules.push(t):t instanceof RegExp&&this.regexRules.push(t);if(this.options.mode==="fuzzy"&&this.stringRules.length>0){const t=this.stringRules.sort((n,r)=>r.length-n.length).map(n=>n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"));this.combinedRegex=new RegExp(`(${t.join("|")})`)}}update(e){this.options=e,this.init()}match(e){if(!e)return!1;const t=e.trim();return t.length?this.options.mode==="fuzzy"?this.withFuzzy(t):this.withExact(t):!1}withFuzzy(e){if(this.combinedRegex&&this.combinedRegex.test(e))return!0;for(let t=0;t<this.regexRules.length;t++)if(this.regexRules[t].test(e))return!0;return!1}withExact(e){const t=Math.max(this.options.exact.check,0),n=Math.ceil(t/100*e.length);if(n===0)return!0;const r=new Uint8Array(e.length);let i=0;for(let c=0;c<this.stringRules.length;c++){const s=this.stringRules[c],l=s.length;if(l===0)continue;let u=e.indexOf(s);for(;u!==-1;){for(let o=0;o<l;o++)r[u+o]===0&&(r[u+o]=1,i++);if(i>=n)return!0;u=e.indexOf(s,u+l)}}for(let c=0;c<this.regexRules.length;c++){const s=e.match(this.regexRules[c]);if(s&&s[0]&&s.index!==void 0){const u=s[0].length,o=s.index;for(let g=0;g<u;g++)r[o+g]===0&&(r[o+g]=1,i++);if(i>=n)return!0}}return!1}}class C extends h.ParserPlugin{matcher;config=new m.ConfigManager(p);get id(){return"TRANSFORM-CLEAN"}get name(){return"TRANSFORM-CLEAN"}get stage(){return h.ParserStage.Transform}constructor(){super(),this.matcher=new f(this.config.current,R),this.config.on(e=>{this.matcher.update(e)})}check(e){return!0}exec(e){const t=e.result.lines;if(!t.length)return;const n=[];for(const r of t)r.type==d.LineType.Normal&&this.matcher.match(r.content.original)||n.push(r);e.result.lines=n}}const x={match:{mode:"exact",fuzzy:{},exact:{check:50},rule:{useDefault:!0,custom:[]}},split:"/",replace:!0},E=["演唱","主唱","原唱","翻唱","唱","Vocal","Vocals","Lead Vocal","Singer","Original Singer","Cover","客串","特邀","Featuring","Feat","Ft","和声","和音","伴唱","合声","合音","Backing Vocals","Background Vocals","Chorus","Harmony","BGs","Bvox","BV","童声","男声","女声","人声","腔","Voice","Children Voice","Male Voice","Female Voice","配音","念白","旁白","CV","Voice Actor","Recitation","Rap","Rapper","说唱","演奏者","乐手","乐师","Session Musician","Musician","Performer","Player","现场乐队","乐队","Live Band","Band","作词","填词","词","Lyricist","Lyrics","Words","Lyr","作曲","谱曲","曲","Composer","Compose","Music","Comp","编曲","编","Arranger","Arrangement","Arrange","Arr","制作人","制作","单曲制作","Producer","Produce","Prod","执行制作人","执制","Executive Producer","Exec Producer","ExProd","协力制作人","共同制作","协力","Co-Producer","CoProd","Associate Producer","节拍制作","节拍","Beatmaker","Beat Maker","Beat","编调","编程","Programming","Programmer","Prog","配器","管弦乐编排","Orchestrator","Orchestration","Orch","和声编写","和音编写","Backing Vocals Arranger","Vocal Arranger","BV Arranger","工程师","工程","Engineer","Eng","录音师","录音","Recording Engineer","Recordist","Recording","Rec","混音师","混音","分轨","贴混","混","Mixing Engineer","Mixer","Mixing","Mixed","Mix","母带工程师","母带后期","母带","后期","Mastering Engineer","Mastering","Master","Mst","修音师","修音","调校","调教","Vocal Editing","Vocal Tuning","Pitch Editing","Tuning","人声编辑","音频编辑","剪辑","Audio Editor","Vocal Editor","Vocal Edit","Edit","Editor","重混音师","Remixer","Remix","Remixed by","声音设计师","音效设计","音效","Sound Designer","Sound Effects","SFX Designer","SFX","拟音师","拟音","Foley Artist","Foley","监制","音乐总监","监","Supervisor","Music Director","MD","指挥","Conductor","Cond","A&R","艺人与产品","艺人统筹","Artists and Repertoire","录音室经理","录音室","录音棚","Studio Manager","Studio","助理工程师","助工","助理","Assistant Engineer","Assistant","Asst Eng","抄谱员","抄谱","Copyist","扒谱员","扒谱","Transcriber","Trans","乐谱管理员","Librarian","乐器技师","吉他技师","鼓技师","Guitar Tech","Drum Tech","Instrument Tech","音控师","调音师","前台工程师","FOH Engineer","Front of House","Live Sound Engineer","Sound Mixer","监听工程师","监听","Monitor Engineer","舞台监督","Stage Manager","灯光师","Lighting Designer","Light Tech","企划","策划","项目统筹","统筹","项目","Planner","Project Coordinator","Coordinator","出品","发行","发布","Publisher","Produced","Release","宣传","推广","宣发","宣推","营销","Marketing","Publicity","Promotion","版权","Copyright","OP","SP","视觉设计","视觉","设计","Visual Design","Visual","Design","封面","海报","插画","曲绘","图绘","映像","封","Cover","Illustration","Image","Artwork","美工","美术","Graphic Design","Fine Arts","Art","视频","分镜","脚本","导演","Video","PV","MV","CG","Director","艺术顾问","艺术","顾问","Art Consultant","Consultant","题字","文案","Inscription","Copywriting","支持","鸣谢","特约嘉宾","指导","承办单位","承办","单位","业务","Special Thanks","Acknowledgments"],S=["键盘","Keyboard","Kybd","Keys","Key","钢琴","Piano","Pno","电钢琴","Electric Piano","Wurlitzer","Rhodes","EP","风琴","Organ","Org","大键琴","Harpsichord","Hpschd","合成器","Synthesizer","Synths","Synth","采样器","Sampler","序列器","Sequencer","电吉他","木吉他","箱琴","吉他","Electric Guitar","Acoustic Guitar","Guitar","E.Gtr","A.Gtr","Gtr","电贝斯","低音吉他","贝斯","Electric Bass","Bass Guitar","Bass","Bss","乌德琴","Oud","班卓琴","Banjo","西塔琴","Sitar","鲁特琴","Lute","曼陀林","Mandolin","弦乐","Strings","Str","小提琴","提琴","Violin","Vln","中提琴","Viola","Vla","大提琴","Cello","Vc","低音提琴","Double Bass","Contrabass","Cb","竖琴","Harp","Hrp","管乐","铜管","木管","Brass","Woodwinds","Winds","笛子","长笛","Flute","Fl","短笛","Piccolo","Picc","哨笛","Flageolet","Flt","单簧管","竖笛","Clarinet","Cl","低音单簧管","Bass Clarinet","B.Cl","双簧管","Oboe","Ob","英国管","English Horn","E.Hn","巴松","大管","Bassoon","Bsn","萨克斯","Saxophone","Alto Sax","Tenor Sax","Baritone Sax","A.Sax","T.Sax","B.Sax","Sax","小号","Trumpet","Tpt","短号","Cornet","Cnt","长号","Trombone","Tbn","大号","Tuba","Tba","圆号","French Horn","Horn","Hn","次中音号","Euphonium","Euph","富鲁格号","Flugelhorn","打击乐","Percussion","Perc","架子鼓","鼓","Drum Set","Drums","Drum","Dr","定音鼓","Timpani","Timp","铃鼓","Tambourine","Tamb","康加鼓","Conga","邦戈鼓","Bongo","钹","镲","Cymbal","锣","Gong","沙锤","Shaker","木琴","Xylophone","Xylo","马林巴","Marimba","颤音琴","Vibraphone","Vibes","Vib","古琴","瑶琴","玉琴","Guqin","古筝","Guzheng","琵琶","Pipa","二胡","Erhu","扬琴","Yangqin","阮","中阮","Ruan","箫","笛萧","洞萧","Xiao","笙","Sheng","唢呐","Suona","巴乌","Bawu","葫芦丝","Hulusi","手风琴","Accordion","口琴","Harmonica","特雷门琴","Theremin"],A=[...E,...S,"PGM"],P=a=>{if(!a)return null;const e=a.indexOf(":"),t=a.indexOf(":");if(e===-1&&t===-1)return null;let n=-1;e!==-1&&t!==-1?n=Math.min(e,t):n=e!==-1?e:t;const r=a.substring(0,n).trim(),i=a.substring(n+1).trim();return r?[r,i]:null},T=(a,e)=>a.split(e).map(t=>t.trim()).filter(t=>!!t);class y extends h.ParserPlugin{matcher;config=new m.ConfigManager(x);get id(){return"TRANSFORM-EXTRACT"}get name(){return"TRANSFORM-EXTRACT"}get stage(){return h.ParserStage.Transform}constructor(){super(),this.matcher=new f(this.config.current.match,A),this.config.on(e=>{this.matcher.update(e.match)})}check(e){return!0}exec(e){const t=e.result.lines;if(!t.length)return;const n=[...e.result.metas],r=[];for(const i of t){if(i.type!=d.LineType.Normal){r.push(i);continue}const c=P(i.content.original);if(!c){r.push(i);continue}const[s,l]=c;if(!this.matcher.match(m.removeTextSpaceAll(s))){r.push(i);continue}const o=new d.MetaCreator;o.content.role=s,o.content.name=T(l,this.config.current.split),this.config.current.replace||r.push(i),n.push(o)}e.result.lines=r,e.result.metas=n}}exports.CleanPlugin=C;exports.ExtractCreatorPlugin=y;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("@music-lyric-kit/utils"),p=require("@music-lyric-kit/core"),y=require("@music-lyric-kit/lyric"),C={mode:"fuzzy",fuzzy:{},exact:{check:50},rule:{useDefault:!0,custom:[]},firstLineWithMusicInfo:!0},A=["版权所有","版权","授权","Copyright","License","All rights reserved","翻唱","改编","致敬","Cover","Adaptation","Tribute","Remake"];class b{options;stringRules=[];regexRules=[];defaultRules=[];combinedRegex=null;constructor(e,t){this.options=e,this.defaultRules=t,this.init()}init(){const e=this.options.rule.useDefault?[...this.defaultRules,...this.options.rule.custom||[]]:[...this.options.rule.custom||[]];for(const t of e)typeof t=="string"?this.stringRules.push(t):t instanceof RegExp&&this.regexRules.push(t);if(this.options.mode==="fuzzy"&&this.stringRules.length>0){const t=this.stringRules.sort((r,n)=>n.length-r.length).map(r=>r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"));this.combinedRegex=new RegExp(`(${t.join("|")})`)}}update(e){this.options=e,this.init()}match(e,t){if(!e)return!1;const r=e.trim();return r.length?this.options.mode==="fuzzy"?this.withFuzzy(r,t):this.withExact(r,t):!1}withFuzzy(e,t){if(this.combinedRegex&&this.combinedRegex.test(e))return!0;for(let r=0;r<this.regexRules.length;r++)if(this.regexRules[r].test(e))return!0;if(t&&t.length>0){for(let r=0;r<t.length;r++)if(e.includes(t[r]))return!0}return!1}withExact(e,t){const r=Math.max(this.options.exact.check,0),n=Math.ceil(r/100*e.length);if(n===0)return!0;const i=new Uint8Array(e.length);let a=0;const g=[...this.stringRules,...t||[]];for(let o=0;o<g.length;o++){const c=g[o],h=c.length;if(h===0)continue;let u=e.indexOf(c);for(;u!==-1;){for(let l=0;l<h;l++)i[u+l]===0&&(i[u+l]=1,a++);if(a>=n)return!0;u=e.indexOf(c,u+h)}}for(let o=0;o<this.regexRules.length;o++){const c=e.match(this.regexRules[o]);if(c&&c[0]&&c.index!==void 0){const u=c[0].length,l=c.index;for(let d=0;d<u;d++)i[l+d]===0&&(i[l+d]=1,a++);if(a>=n)return!0}}return!1}}const S=/[^\u4E00-\u9FFF\u3400-\u4DBF\u3040-\u309F\u30A0-\u30FF\uAC00-\uD7AFa-zA-Z0-9\s]/g,f=s=>s.trim()?m.removeTextSpaceAll(s.replace(S,"")):"";class R extends p.ParserPlugin{matcher;config=new m.ConfigManager(C);get priority(){return 50}get id(){return"TRANSFORM-CLEAN"}get name(){return"TRANSFORM-CLEAN"}get stage(){return p.ParserStage.Transform}constructor(){super(),this.matcher=new b(this.config.current,A),this.config.on(e=>{this.matcher.update(e)})}check(e){return!0}exec(e){const t=e.result.lines,r=t.length;if(!r)return;const n=[];for(let i=0;i<r;i++){const a=t[i];if(a.type!==y.LineType.Normal){n.push(a);continue}const g=e.params.musicInfo,o=[];if(i===0&&g&&this.config.current.firstLineWithMusicInfo){const u=f(g.name||"");u&&o.push(u);const l=g.singer?.map(d=>f(d));l&&o.push(...l)}const c=o.length?f(a.content.original):a.content.original;this.matcher.match(c,o)||n.push(a)}e.result.lines=n}}const E={match:{mode:"exact",fuzzy:{},exact:{check:50},rule:{useDefault:!0,custom:[]}},split:"/",replace:!0},P=["演唱","主唱","原唱","翻唱","唱","Vocal","Vocals","Lead Vocal","Lead Vocals","Singer","Original Singer","Cover","Sung by","Performed by","Performed","客串","特邀","Featuring","Feat","Ft","Guest","和声","和音","伴唱","合声","合音","Backing Vocals","Backing Vocal","Background Vocals","Background Vocal","Chorus","Harmony","Harmonies","BGs","Bvox","BV","童声","男声","女声","人声","腔","Voice","Children Voice","Male Voice","Female Voice","配音","念白","旁白","CV","Voice Actor","Voice Actress","Narrator","Narration","Recitation","Rap","Rapper","说唱","演奏者","乐手","乐师","Session Musician","Musician","Performer","Player","现场乐队","乐队","Live Band","Band","作词","填词","词","Lyricist","Lyrics","Lyrics by","Words","Words by","Lyr","Written","Written by","Writer","Songwriter","Songwriting","作曲","谱曲","曲","Composer","Composed","Composed by","Compose","Composition","Music","Music by","Comp","词曲","词曲创作","Song by","Song","编曲","编","Arranger","Arranged","Arranged by","Arrangement","Arrange","Arr","制作人","制作","单曲制作","Producer","Produced","Produced by","Produce","Prod","Prod by","执行制作人","执制","Executive Producer","Exec Producer","ExProd","协力制作人","共同制作","协力","Co-Producer","Co-Produced by","CoProd","Associate Producer","Additional Production","Additional Producer","节拍制作","节拍","Beatmaker","Beat Maker","Beat","Beat by","Beats","编调","编程","Programming","Programmed by","Programmer","Prog","配器","管弦乐编排","Orchestrator","Orchestrated by","Orchestration","Orch","和声编写","和音编写","Backing Vocals Arranger","Vocal Arranger","Vocal Arrangement","Vocal Arranged by","BV Arranger","工程师","工程","Engineer","Engineered by","Eng","录音师","录音","Recording Engineer","Recorded by","Recorded at","Recordist","Recording","Rec","混音师","混音","分轨","贴混","混","Mixing Engineer","Mixer","Mixing","Mixed","Mixed by","Mixed at","Mix","母带工程师","母带后期","母带","后期","Mastering Engineer","Mastering","Mastered","Mastered by","Mastered at","Master","Mst","修音师","修音","调校","调教","Vocal Editing","Vocal Tuning","Pitch Editing","Pitch Correction","Tuning","Tuned by","Auto-Tune","人声编辑","音频编辑","剪辑","Audio Editor","Audio Editing","Vocal Editor","Vocal Edit","Edit","Edited by","Editor","重混音师","Remixer","Remix","Remixed by","声音设计师","音效设计","音效","Sound Designer","Sound Design","Sound Effects","SFX Designer","SFX","拟音师","拟音","Foley Artist","Foley","监制","音乐总监","监","Supervisor","Supervised by","Music Director","Music Supervisor","MD","指挥","Conductor","Conducted by","Cond","A&R","艺人与产品","艺人统筹","Artists and Repertoire","录音室经理","录音室","录音棚","Studio Manager","Studio","助理工程师","助工","助理","Assistant Engineer","Assistant","Asst Eng","抄谱员","抄谱","Copyist","扒谱员","扒谱","Transcriber","Transcription","Trans","乐谱管理员","Librarian","乐器技师","吉他技师","鼓技师","Guitar Tech","Drum Tech","Instrument Tech","Tech","音控师","调音师","前台工程师","FOH Engineer","Front of House","Live Sound Engineer","Sound Mixer","Sound Engineer","监听工程师","监听","Monitor Engineer","舞台监督","Stage Manager","灯光师","Lighting Designer","Light Tech","企划","策划","项目统筹","统筹","项目","Planner","Project Coordinator","Coordinator","出品","出品人","发行","发布","厂牌","Publisher","Published by","Produced","Release","Label","Distributed by","Distribution","宣传","推广","宣发","宣推","营销","Marketing","Publicity","Promotion","版权","Copyright","OP","SP","视觉设计","视觉","设计","Visual Design","Visual","Design","Designed by","封面","海报","插画","曲绘","图绘","映像","封","Cover","Cover Art","Cover Design","Illustration","Illustrated by","Image","Artwork","Album Art","美工","美术","Graphic Design","Graphics","Fine Arts","Art","Art Direction","Art Director","摄影","摄像","Photography","Photographer","Photo","Photo by","视频","分镜","脚本","导演","Video","Video by","PV","MV","CG","Director","Directed by","Film","Filmed by","Animation","Animator","Animated by","艺术顾问","艺术","顾问","Art Consultant","Consultant","Creative Director","Creative Direction","题字","文案","Inscription","Copywriting","Copywriter","翻译","译","Translator","Translation","Translated by","支持","鸣谢","特约嘉宾","指导","承办单位","承办","单位","业务","Special Thanks","Thanks to","Acknowledgments","Credits"],T=["键盘","Keyboard","Keyboards","Kybd","Keys","Key","钢琴","Piano","Pno","电钢琴","Electric Piano","Wurlitzer","Rhodes","EP","风琴","Organ","Org","大键琴","Harpsichord","Hpschd","合成器","Synthesizer","Synths","Synth","采样器","Sampler","序列器","Sequencer","电吉他","木吉他","箱琴","吉他","Electric Guitar","Acoustic Guitar","Classical Guitar","Guitar","Guitars","E.Gtr","A.Gtr","Gtr","尤克里里","Ukulele","Uke","电贝斯","低音吉他","贝斯","Electric Bass","Bass Guitar","Bass","Bss","乌德琴","Oud","班卓琴","Banjo","西塔琴","Sitar","鲁特琴","Lute","曼陀林","Mandolin","弦乐","Strings","Str","小提琴","提琴","Violin","Vln","中提琴","Viola","Vla","大提琴","Cello","Vc","低音提琴","Double Bass","Contrabass","Cb","竖琴","Harp","Hrp","管乐","铜管","木管","Brass","Woodwinds","Winds","Horns","笛子","长笛","Flute","Fl","短笛","Piccolo","Picc","哨笛","Flageolet","Flt","Tin Whistle","Whistle","单簧管","竖笛","Clarinet","Cl","低音单簧管","Bass Clarinet","B.Cl","双簧管","Oboe","Ob","英国管","English Horn","E.Hn","巴松","大管","Bassoon","Bsn","萨克斯","Saxophone","Alto Sax","Tenor Sax","Soprano Sax","Baritone Sax","A.Sax","T.Sax","S.Sax","B.Sax","Sax","小号","Trumpet","Tpt","短号","Cornet","Cnt","长号","Trombone","Tbn","大号","Tuba","Tba","圆号","French Horn","Horn","Hn","次中音号","Euphonium","Euph","富鲁格号","Flugelhorn","打击乐","Percussion","Perc","架子鼓","鼓","Drum Set","Drums","Drum","Dr","电子鼓","Drum Machine","Drum Programming","定音鼓","Timpani","Timp","铃鼓","Tambourine","Tamb","康加鼓","Conga","邦戈鼓","Bongo","钹","镲","Cymbal","Cymbals","锣","Gong","沙锤","Shaker","三角铁","Triangle","响板","Castanets","钟琴","Glockenspiel","木琴","Xylophone","Xylo","马林巴","Marimba","颤音琴","Vibraphone","Vibes","Vib","古琴","瑶琴","玉琴","Guqin","古筝","Guzheng","琵琶","Pipa","二胡","Erhu","扬琴","Yangqin","阮","中阮","Ruan","箫","笛萧","洞萧","Xiao","笙","Sheng","唢呐","Suona","巴乌","Bawu","葫芦丝","Hulusi","手风琴","Accordion","口琴","Harmonica","特雷门琴","Theremin","拇指琴","Kalimba","Mbira","钢片琴","Celesta","电子琴","Electronic Keyboard","转盘","Turntable","Turntables","DJ","Scratching"],x=[...P,...T,"PGM"],M=s=>{if(!s)return null;const e=s.indexOf(":"),t=s.indexOf(":");if(e===-1&&t===-1)return null;let r=-1;e!==-1&&t!==-1?r=Math.min(e,t):r=e!==-1?e:t;const n=s.substring(0,r).trim(),i=s.substring(r+1).trim();return n?[n,i]:null},F=(s,e)=>s.split(e).map(t=>t.trim()).filter(t=>!!t);class V extends p.ParserPlugin{matcher;config=new m.ConfigManager(E);get priority(){return 40}get id(){return"TRANSFORM-EXTRACT"}get name(){return"TRANSFORM-EXTRACT"}get stage(){return p.ParserStage.Transform}constructor(){super(),this.matcher=new b(this.config.current.match,x),this.config.on(e=>{this.matcher.update(e.match)})}check(e){return!0}exec(e){const t=e.result.lines;if(!t.length)return;const r=[...e.result.metas],n=[];for(const i of t){if(i.type!=y.LineType.Normal){n.push(i);continue}const a=M(i.content.original);if(!a){n.push(i);continue}const[g,o]=a;if(!this.matcher.match(m.removeTextSpaceAll(g))){n.push(i);continue}const h=new y.MetaCreator;h.content.role=g,h.content.name=F(o,this.config.current.split),this.config.current.replace||n.push(i),r.push(h)}e.result.lines=n,e.result.metas=r}}exports.CleanPlugin=R;exports.ExtractCreatorPlugin=V;
2
2
  //# sourceMappingURL=index.comm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.comm.js","sources":["../src/clean/config.ts","../src/clean/constants.ts","../src/utils/match.ts","../src/clean/index.ts","../src/extract/config.ts","../src/extract/constants.ts","../src/extract/utils.ts","../src/extract/index.ts"],"sourcesContent":["import type { MatchOptions } from '@root/utils/match'\n\nexport interface CleanConfig extends MatchOptions {}\n\nexport const DEFAULT_CONFIG: CleanConfig = {\n mode: 'fuzzy',\n fuzzy: {},\n exact: {\n check: 50,\n },\n rule: {\n useDefault: true,\n custom: [],\n },\n}\n","import type { MatchRule } from '@root/utils/match'\n\nexport const DEFAULT_RULES: MatchRule[] = [\n '版权所有',\n '版权',\n '授权',\n 'Copyright',\n 'License',\n 'All rights reserved',\n\n '翻唱',\n '改编',\n '致敬',\n 'Cover',\n 'Adaptation',\n 'Tribute',\n 'Remake',\n]\n","export type MatchRule = string | RegExp\n\nexport interface MatchOptions {\n /**\n * match mode\n * @default fuzzy\n */\n mode: 'fuzzy' | 'exact'\n /** fuzzy mode options */\n fuzzy: {}\n /** exact mode options */\n exact: {\n /**\n * need more than this percentage\n * @default 50\n */\n check: number\n }\n /** match rules */\n rule: {\n /**\n * is use default rule\n * @default true\n */\n useDefault: boolean\n /**\n * custom rule, it will be merge with default when useDefault is enable\n * @default []\n */\n custom: MatchRule[]\n }\n}\n\nexport class Matcher {\n private options: MatchOptions\n\n private stringRules: string[] = []\n private regexRules: RegExp[] = []\n\n private defaultRules: MatchRule[] = []\n private combinedRegex: RegExp | null = null\n\n constructor(options: MatchOptions, defaultRules: MatchRule[]) {\n this.options = options\n this.defaultRules = defaultRules\n this.init()\n }\n\n private init() {\n const raw = this.options.rule.useDefault ? [...this.defaultRules, ...(this.options.rule.custom || [])] : [...(this.options.rule.custom || [])]\n\n for (const rule of raw) {\n if (typeof rule === 'string') {\n this.stringRules.push(rule)\n } else if (rule instanceof RegExp) {\n this.regexRules.push(rule)\n }\n }\n\n if (this.options.mode === 'fuzzy' && this.stringRules.length > 0) {\n const target = this.stringRules.sort((a, b) => b.length - a.length).map((str) => str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n this.combinedRegex = new RegExp(`(${target.join('|')})`)\n }\n }\n\n update(options: MatchOptions) {\n this.options = options\n this.init()\n }\n\n match(line: string): boolean {\n if (!line) {\n return false\n }\n\n const targetLine = line.trim()\n if (!targetLine.length) {\n return false\n }\n\n return this.options.mode === 'fuzzy' ? this.withFuzzy(targetLine) : this.withExact(targetLine)\n }\n\n private withFuzzy(line: string): boolean {\n if (this.combinedRegex && this.combinedRegex.test(line)) {\n return true\n }\n\n for (let i = 0; i < this.regexRules.length; i++) {\n if (this.regexRules[i].test(line)) return true\n }\n\n return false\n }\n\n private withExact(line: string): boolean {\n const thresholdPercent = Math.max(this.options.exact.check, 0)\n\n const targetMatchCount = Math.ceil((thresholdPercent / 100) * line.length)\n if (targetMatchCount === 0) {\n return true\n }\n\n const matchedChars = new Uint8Array(line.length)\n let matchedCount = 0\n\n for (let i = 0; i < this.stringRules.length; i++) {\n const rule = this.stringRules[i]\n const ruleLen = rule.length\n if (ruleLen === 0) continue\n\n let postion = line.indexOf(rule)\n while (postion !== -1) {\n for (let j = 0; j < ruleLen; j++) {\n if (matchedChars[postion + j] === 0) {\n matchedChars[postion + j] = 1\n matchedCount++\n }\n }\n\n if (matchedCount >= targetMatchCount) {\n return true\n }\n\n postion = line.indexOf(rule, postion + ruleLen)\n }\n }\n\n for (let i = 0; i < this.regexRules.length; i++) {\n const matchResult = line.match(this.regexRules[i])\n if (matchResult && matchResult[0] && matchResult.index !== undefined) {\n const matchStr = matchResult[0]\n const matchLen = matchStr.length\n const pos = matchResult.index\n\n for (let j = 0; j < matchLen; j++) {\n if (matchedChars[pos + j] === 0) {\n matchedChars[pos + j] = 1\n matchedCount++\n }\n }\n\n if (matchedCount >= targetMatchCount) {\n return true\n }\n }\n }\n\n return false\n }\n}\n","import type { DeepPartial } from '@music-lyric-kit/utils'\nimport type { Line } from '@music-lyric-kit/lyric'\nimport type { CleanConfig } from './config'\n\nimport { DEFAULT_CONFIG } from './config'\nimport { DEFAULT_RULES } from './constants'\n\nimport { ConfigManager } from '@music-lyric-kit/utils'\nimport { Matcher } from '@root/utils/match'\n\nimport { ParserPlugin, ParserStage, ParserContext } from '@music-lyric-kit/core'\nimport { LineType } from '@music-lyric-kit/lyric'\n\nexport class CleanPlugin extends ParserPlugin {\n private matcher: Matcher\n\n override config = new ConfigManager<CleanConfig, DeepPartial<CleanConfig>>(DEFAULT_CONFIG)\n\n override get id() {\n return 'TRANSFORM-CLEAN'\n }\n\n override get name() {\n return 'TRANSFORM-CLEAN'\n }\n\n override get stage() {\n return ParserStage.Transform\n }\n\n constructor() {\n super()\n this.matcher = new Matcher(this.config.current, DEFAULT_RULES)\n this.config.on((opt) => {\n this.matcher.update(opt)\n })\n }\n\n override check(ctx: ParserContext) {\n return true\n }\n\n override exec(ctx: ParserContext) {\n const lines = ctx.result.lines\n if (!lines.length) {\n return\n }\n\n const newLines: Line[] = []\n\n for (const line of lines) {\n if (line.type == LineType.Normal) {\n const result = this.matcher.match(line.content.original)\n if (result) {\n continue\n }\n }\n newLines.push(line)\n }\n\n ctx.result.lines = newLines\n }\n}\n\nexport type { CleanConfig }\n","import type { MatchOptions } from '@root/utils/match'\n\nexport interface ExtractCreatorConfig {\n match: MatchOptions\n /**\n * split name\n */\n split: string | RegExp\n /**\n * is replace this line when matched\n * @default true\n */\n replace: boolean\n}\n\nexport const DEFAULT_CREATOR_CONFIG: ExtractCreatorConfig = {\n match: {\n mode: 'exact',\n fuzzy: {},\n exact: {\n check: 50,\n },\n rule: {\n useDefault: true,\n custom: [],\n },\n },\n split: '/',\n replace: true,\n}\n","import type { MatchRule } from '@root/utils/match'\n\nconst CREATOR_RULES_ROLE: MatchRule[] = [\n '演唱',\n '主唱',\n '原唱',\n '翻唱',\n '唱',\n\n 'Vocal',\n 'Vocals',\n 'Lead Vocal',\n 'Singer',\n 'Original Singer',\n 'Cover',\n\n '客串',\n '特邀',\n 'Featuring',\n 'Feat',\n 'Ft',\n\n '和声',\n '和音',\n '伴唱',\n '合声',\n '合音',\n 'Backing Vocals',\n 'Background Vocals',\n 'Chorus',\n 'Harmony',\n 'BGs',\n 'Bvox',\n 'BV',\n\n '童声',\n '男声',\n '女声',\n '人声',\n '腔',\n 'Voice',\n 'Children Voice',\n 'Male Voice',\n 'Female Voice',\n\n '配音',\n '念白',\n '旁白',\n 'CV',\n 'Voice Actor',\n 'Recitation',\n 'Rap',\n 'Rapper',\n\n '说唱',\n '演奏者',\n '乐手',\n '乐师',\n 'Session Musician',\n 'Musician',\n 'Performer',\n 'Player',\n\n '现场乐队',\n '乐队',\n 'Live Band',\n 'Band',\n\n '作词',\n '填词',\n '词',\n 'Lyricist',\n 'Lyrics',\n 'Words',\n 'Lyr',\n\n '作曲',\n '谱曲',\n '曲',\n 'Composer',\n 'Compose',\n 'Music',\n 'Comp',\n\n '编曲',\n '编',\n 'Arranger',\n 'Arrangement',\n 'Arrange',\n 'Arr',\n\n '制作人',\n '制作',\n '单曲制作',\n 'Producer',\n 'Produce',\n 'Prod',\n\n '执行制作人',\n '执制',\n 'Executive Producer',\n 'Exec Producer',\n 'ExProd',\n\n '协力制作人',\n '共同制作',\n '协力',\n 'Co-Producer',\n 'CoProd',\n 'Associate Producer',\n\n '节拍制作',\n '节拍',\n 'Beatmaker',\n 'Beat Maker',\n 'Beat',\n\n '编调',\n '编程',\n 'Programming',\n 'Programmer',\n 'Prog',\n\n '配器',\n '管弦乐编排',\n 'Orchestrator',\n 'Orchestration',\n 'Orch',\n\n '和声编写',\n '和音编写',\n 'Backing Vocals Arranger',\n 'Vocal Arranger',\n 'BV Arranger',\n\n '工程师',\n '工程',\n 'Engineer',\n 'Eng',\n\n '录音师',\n '录音',\n 'Recording Engineer',\n 'Recordist',\n 'Recording',\n 'Rec',\n\n '混音师',\n '混音',\n '分轨',\n '贴混',\n '混',\n 'Mixing Engineer',\n 'Mixer',\n 'Mixing',\n 'Mixed',\n 'Mix',\n\n '母带工程师',\n '母带后期',\n '母带',\n '后期',\n 'Mastering Engineer',\n 'Mastering',\n 'Master',\n 'Mst',\n\n '修音师',\n '修音',\n '调校',\n '调教',\n 'Vocal Editing',\n 'Vocal Tuning',\n 'Pitch Editing',\n 'Tuning',\n\n '人声编辑',\n '音频编辑',\n '剪辑',\n 'Audio Editor',\n 'Vocal Editor',\n 'Vocal Edit',\n 'Edit',\n 'Editor',\n\n '重混音师',\n 'Remixer',\n 'Remix',\n 'Remixed by',\n\n '声音设计师',\n '音效设计',\n '音效',\n 'Sound Designer',\n 'Sound Effects',\n 'SFX Designer',\n 'SFX',\n\n '拟音师',\n '拟音',\n 'Foley Artist',\n 'Foley',\n\n '监制',\n '音乐总监',\n '监',\n 'Supervisor',\n 'Music Director',\n 'MD',\n\n '指挥',\n 'Conductor',\n 'Cond',\n 'A&R',\n\n '艺人与产品',\n '艺人统筹',\n 'Artists and Repertoire',\n\n '录音室经理',\n '录音室',\n '录音棚',\n 'Studio Manager',\n 'Studio',\n\n '助理工程师',\n '助工',\n '助理',\n 'Assistant Engineer',\n 'Assistant',\n 'Asst Eng',\n\n '抄谱员',\n '抄谱',\n 'Copyist',\n\n '扒谱员',\n '扒谱',\n 'Transcriber',\n 'Trans',\n\n '乐谱管理员',\n 'Librarian',\n\n '乐器技师',\n '吉他技师',\n '鼓技师',\n 'Guitar Tech',\n 'Drum Tech',\n 'Instrument Tech',\n\n '音控师',\n '调音师',\n '前台工程师',\n 'FOH Engineer',\n 'Front of House',\n 'Live Sound Engineer',\n 'Sound Mixer',\n\n '监听工程师',\n '监听',\n 'Monitor Engineer',\n\n '舞台监督',\n 'Stage Manager',\n\n '灯光师',\n 'Lighting Designer',\n 'Light Tech',\n\n '企划',\n '策划',\n '项目统筹',\n '统筹',\n '项目',\n 'Planner',\n 'Project Coordinator',\n 'Coordinator',\n\n '出品',\n '发行',\n '发布',\n 'Publisher',\n 'Produced',\n 'Release',\n\n '宣传',\n '推广',\n '宣发',\n '宣推',\n '营销',\n 'Marketing',\n 'Publicity',\n 'Promotion',\n\n '版权',\n 'Copyright',\n 'OP',\n 'SP',\n\n '视觉设计',\n '视觉',\n '设计',\n 'Visual Design',\n 'Visual',\n 'Design',\n\n '封面',\n '海报',\n '插画',\n '曲绘',\n '图绘',\n '映像',\n '封',\n 'Cover',\n 'Illustration',\n 'Image',\n 'Artwork',\n\n '美工',\n '美术',\n 'Graphic Design',\n 'Fine Arts',\n 'Art',\n\n '视频',\n '分镜',\n '脚本',\n '导演',\n 'Video',\n 'PV',\n 'MV',\n 'CG',\n 'Director',\n\n '艺术顾问',\n '艺术',\n '顾问',\n 'Art Consultant',\n 'Consultant',\n\n '题字',\n '文案',\n 'Inscription',\n 'Copywriting',\n\n '支持',\n '鸣谢',\n '特约嘉宾',\n '指导',\n '承办单位',\n '承办',\n '单位',\n '业务',\n 'Special Thanks',\n 'Acknowledgments',\n]\n\nconst CREATOR_RULES_INST: MatchRule[] = [\n '键盘',\n 'Keyboard',\n 'Kybd',\n 'Keys',\n 'Key',\n\n '钢琴',\n 'Piano',\n 'Pno',\n\n '电钢琴',\n 'Electric Piano',\n 'Wurlitzer',\n 'Rhodes',\n 'EP',\n\n '风琴',\n 'Organ',\n 'Org',\n\n '大键琴',\n 'Harpsichord',\n 'Hpschd',\n\n '合成器',\n 'Synthesizer',\n 'Synths',\n 'Synth',\n\n '采样器',\n 'Sampler',\n\n '序列器',\n 'Sequencer',\n\n '电吉他',\n '木吉他',\n '箱琴',\n '吉他',\n 'Electric Guitar',\n 'Acoustic Guitar',\n 'Guitar',\n 'E.Gtr',\n 'A.Gtr',\n 'Gtr',\n\n '电贝斯',\n '低音吉他',\n '贝斯',\n 'Electric Bass',\n 'Bass Guitar',\n 'Bass',\n 'Bss',\n\n '乌德琴',\n 'Oud',\n\n '班卓琴',\n 'Banjo',\n\n '西塔琴',\n 'Sitar',\n\n '鲁特琴',\n 'Lute',\n\n '曼陀林',\n 'Mandolin',\n\n '弦乐',\n 'Strings',\n 'Str',\n\n '小提琴',\n '提琴',\n 'Violin',\n 'Vln',\n\n '中提琴',\n 'Viola',\n 'Vla',\n\n '大提琴',\n 'Cello',\n 'Vc',\n\n '低音提琴',\n 'Double Bass',\n 'Contrabass',\n 'Cb',\n\n '竖琴',\n 'Harp',\n 'Hrp',\n\n '管乐',\n '铜管',\n '木管',\n 'Brass',\n 'Woodwinds',\n 'Winds',\n\n '笛子',\n '长笛',\n 'Flute',\n 'Fl',\n\n '短笛',\n 'Piccolo',\n 'Picc',\n\n '哨笛',\n 'Flageolet',\n 'Flt',\n\n '单簧管',\n '竖笛',\n 'Clarinet',\n 'Cl',\n\n '低音单簧管',\n 'Bass Clarinet',\n 'B.Cl',\n\n '双簧管',\n 'Oboe',\n 'Ob',\n\n '英国管',\n 'English Horn',\n 'E.Hn',\n\n '巴松',\n '大管',\n 'Bassoon',\n 'Bsn',\n\n '萨克斯',\n 'Saxophone',\n 'Alto Sax',\n 'Tenor Sax',\n 'Baritone Sax',\n 'A.Sax',\n 'T.Sax',\n 'B.Sax',\n 'Sax',\n\n '小号',\n 'Trumpet',\n 'Tpt',\n\n '短号',\n 'Cornet',\n 'Cnt',\n\n '长号',\n 'Trombone',\n 'Tbn',\n\n '大号',\n 'Tuba',\n 'Tba',\n\n '圆号',\n 'French Horn',\n 'Horn',\n 'Hn',\n\n '次中音号',\n 'Euphonium',\n 'Euph',\n\n '富鲁格号',\n 'Flugelhorn',\n\n '打击乐',\n 'Percussion',\n 'Perc',\n\n '架子鼓',\n '鼓',\n 'Drum Set',\n 'Drums',\n 'Drum',\n 'Dr',\n\n '定音鼓',\n 'Timpani',\n 'Timp',\n\n '铃鼓',\n 'Tambourine',\n 'Tamb',\n\n '康加鼓',\n 'Conga',\n\n '邦戈鼓',\n 'Bongo',\n\n '钹',\n '镲',\n 'Cymbal',\n\n '锣',\n 'Gong',\n\n '沙锤',\n 'Shaker',\n\n '木琴',\n 'Xylophone',\n 'Xylo',\n\n '马林巴',\n 'Marimba',\n\n '颤音琴',\n 'Vibraphone',\n 'Vibes',\n 'Vib',\n\n '古琴',\n '瑶琴',\n '玉琴',\n 'Guqin',\n\n '古筝',\n 'Guzheng',\n\n '琵琶',\n 'Pipa',\n\n '二胡',\n 'Erhu',\n\n '扬琴',\n 'Yangqin',\n\n '阮',\n '中阮',\n 'Ruan',\n\n '箫',\n '笛萧',\n '洞萧',\n 'Xiao',\n\n '笙',\n 'Sheng',\n\n '唢呐',\n 'Suona',\n\n '巴乌',\n 'Bawu',\n\n '葫芦丝',\n 'Hulusi',\n\n '手风琴',\n 'Accordion',\n\n '口琴',\n 'Harmonica',\n\n '特雷门琴',\n 'Theremin',\n]\n\nexport const DEFAULT_CREATOR_RULES: MatchRule[] = [...CREATOR_RULES_ROLE, ...CREATOR_RULES_INST, 'PGM']\n","export const extractCreator = (line: string): [string, string] | null => {\n if (!line) {\n return null\n }\n\n const enColonIdx = line.indexOf(':')\n const cnColonIdx = line.indexOf(':')\n\n if (enColonIdx === -1 && cnColonIdx === -1) {\n return null\n }\n\n let splitIdx = -1\n if (enColonIdx !== -1 && cnColonIdx !== -1) {\n splitIdx = Math.min(enColonIdx, cnColonIdx)\n } else {\n splitIdx = enColonIdx !== -1 ? enColonIdx : cnColonIdx\n }\n\n const role = line.substring(0, splitIdx).trim()\n const name = line.substring(splitIdx + 1).trim()\n\n if (!role) {\n return null\n }\n\n return [role, name]\n}\n\nexport const splitNameWithRule = (name: string, rule: string | RegExp) => {\n return name\n .split(rule)\n .map((item) => item.trim())\n .filter((item) => !!item)\n}\n","import type { DeepPartial } from '@music-lyric-kit/utils'\nimport type { Line, Meta } from '@music-lyric-kit/lyric'\nimport type { ExtractCreatorConfig } from './config'\n\nimport { DEFAULT_CREATOR_CONFIG } from './config'\nimport { DEFAULT_CREATOR_RULES } from './constants'\n\nimport { ConfigManager, removeTextSpaceAll } from '@music-lyric-kit/utils'\nimport { Matcher } from '@root/utils/match'\n\nimport { ParserPlugin, ParserStage, ParserContext } from '@music-lyric-kit/core'\nimport { LineType, MetaCreator } from '@music-lyric-kit/lyric'\nimport { extractCreator, splitNameWithRule } from './utils'\n\nexport class ExtractCreatorPlugin extends ParserPlugin {\n private matcher: Matcher\n\n override config = new ConfigManager<ExtractCreatorConfig, DeepPartial<ExtractCreatorConfig>>(DEFAULT_CREATOR_CONFIG)\n\n override get id() {\n return 'TRANSFORM-EXTRACT'\n }\n\n override get name() {\n return 'TRANSFORM-EXTRACT'\n }\n\n override get stage() {\n return ParserStage.Transform\n }\n\n constructor() {\n super()\n this.matcher = new Matcher(this.config.current.match, DEFAULT_CREATOR_RULES)\n this.config.on((opt) => {\n this.matcher.update(opt.match)\n })\n }\n\n override check(ctx: ParserContext) {\n return true\n }\n\n override exec(ctx: ParserContext) {\n const lines = ctx.result.lines\n if (!lines.length) {\n return\n }\n\n const newMetas: Meta[] = [...ctx.result.metas]\n const newLines: Line[] = []\n\n for (const line of lines) {\n if (line.type != LineType.Normal) {\n newLines.push(line)\n continue\n }\n\n const target = extractCreator(line.content.original)\n if (!target) {\n newLines.push(line)\n continue\n }\n\n const [role, name] = target\n const result = this.matcher.match(removeTextSpaceAll(role))\n if (!result) {\n newLines.push(line)\n continue\n }\n\n const meta = new MetaCreator()\n meta.content.role = role\n meta.content.name = splitNameWithRule(name, this.config.current.split)\n\n if (!this.config.current.replace) {\n newLines.push(line)\n }\n newMetas.push(meta)\n }\n\n ctx.result.lines = newLines\n ctx.result.metas = newMetas\n }\n}\n\nexport type { ExtractCreatorConfig }\n"],"names":["DEFAULT_CONFIG","DEFAULT_RULES","Matcher","options","defaultRules","raw","rule","target","a","b","str","line","targetLine","i","thresholdPercent","targetMatchCount","matchedChars","matchedCount","ruleLen","postion","j","matchResult","matchLen","pos","CleanPlugin","ParserPlugin","ConfigManager","ParserStage","opt","ctx","lines","newLines","LineType","DEFAULT_CREATOR_CONFIG","CREATOR_RULES_ROLE","CREATOR_RULES_INST","DEFAULT_CREATOR_RULES","extractCreator","enColonIdx","cnColonIdx","splitIdx","role","name","splitNameWithRule","item","ExtractCreatorPlugin","newMetas","removeTextSpaceAll","meta","MetaCreator"],"mappings":"iMAIaA,EAA8B,CACzC,KAAM,QACN,MAAO,CAAA,EACP,MAAO,CACL,MAAO,EAAA,EAET,KAAM,CACJ,WAAY,GACZ,OAAQ,CAAA,CAAC,CAEb,ECZaC,EAA6B,CACxC,OACA,KACA,KACA,YACA,UACA,sBAEA,KACA,KACA,KACA,QACA,aACA,UACA,QACF,ECgBO,MAAMC,CAAQ,CACX,QAEA,YAAwB,CAAA,EACxB,WAAuB,CAAA,EAEvB,aAA4B,CAAA,EAC5B,cAA+B,KAEvC,YAAYC,EAAuBC,EAA2B,CAC5D,KAAK,QAAUD,EACf,KAAK,aAAeC,EACpB,KAAK,KAAA,CACP,CAEQ,MAAO,CACb,MAAMC,EAAM,KAAK,QAAQ,KAAK,WAAa,CAAC,GAAG,KAAK,aAAc,GAAI,KAAK,QAAQ,KAAK,QAAU,CAAA,CAAG,EAAI,CAAC,GAAI,KAAK,QAAQ,KAAK,QAAU,EAAG,EAE7I,UAAWC,KAAQD,EACb,OAAOC,GAAS,SAClB,KAAK,YAAY,KAAKA,CAAI,EACjBA,aAAgB,QACzB,KAAK,WAAW,KAAKA,CAAI,EAI7B,GAAI,KAAK,QAAQ,OAAS,SAAW,KAAK,YAAY,OAAS,EAAG,CAChE,MAAMC,EAAS,KAAK,YAAY,KAAK,CAACC,EAAGC,IAAMA,EAAE,OAASD,EAAE,MAAM,EAAE,IAAKE,GAAQA,EAAI,QAAQ,sBAAuB,MAAM,CAAC,EAC3H,KAAK,cAAgB,IAAI,OAAO,IAAIH,EAAO,KAAK,GAAG,CAAC,GAAG,CACzD,CACF,CAEA,OAAOJ,EAAuB,CAC5B,KAAK,QAAUA,EACf,KAAK,KAAA,CACP,CAEA,MAAMQ,EAAuB,CAC3B,GAAI,CAACA,EACH,MAAO,GAGT,MAAMC,EAAaD,EAAK,KAAA,EACxB,OAAKC,EAAW,OAIT,KAAK,QAAQ,OAAS,QAAU,KAAK,UAAUA,CAAU,EAAI,KAAK,UAAUA,CAAU,EAHpF,EAIX,CAEQ,UAAUD,EAAuB,CACvC,GAAI,KAAK,eAAiB,KAAK,cAAc,KAAKA,CAAI,EACpD,MAAO,GAGT,QAASE,EAAI,EAAGA,EAAI,KAAK,WAAW,OAAQA,IAC1C,GAAI,KAAK,WAAWA,CAAC,EAAE,KAAKF,CAAI,EAAG,MAAO,GAG5C,MAAO,EACT,CAEQ,UAAUA,EAAuB,CACvC,MAAMG,EAAmB,KAAK,IAAI,KAAK,QAAQ,MAAM,MAAO,CAAC,EAEvDC,EAAmB,KAAK,KAAMD,EAAmB,IAAOH,EAAK,MAAM,EACzE,GAAII,IAAqB,EACvB,MAAO,GAGT,MAAMC,EAAe,IAAI,WAAWL,EAAK,MAAM,EAC/C,IAAIM,EAAe,EAEnB,QAASJ,EAAI,EAAGA,EAAI,KAAK,YAAY,OAAQA,IAAK,CAChD,MAAMP,EAAO,KAAK,YAAYO,CAAC,EACzBK,EAAUZ,EAAK,OACrB,GAAIY,IAAY,EAAG,SAEnB,IAAIC,EAAUR,EAAK,QAAQL,CAAI,EAC/B,KAAOa,IAAY,IAAI,CACrB,QAASC,EAAI,EAAGA,EAAIF,EAASE,IACvBJ,EAAaG,EAAUC,CAAC,IAAM,IAChCJ,EAAaG,EAAUC,CAAC,EAAI,EAC5BH,KAIJ,GAAIA,GAAgBF,EAClB,MAAO,GAGTI,EAAUR,EAAK,QAAQL,EAAMa,EAAUD,CAAO,CAChD,CACF,CAEA,QAASL,EAAI,EAAGA,EAAI,KAAK,WAAW,OAAQA,IAAK,CAC/C,MAAMQ,EAAcV,EAAK,MAAM,KAAK,WAAWE,CAAC,CAAC,EACjD,GAAIQ,GAAeA,EAAY,CAAC,GAAKA,EAAY,QAAU,OAAW,CAEpE,MAAMC,EADWD,EAAY,CAAC,EACJ,OACpBE,EAAMF,EAAY,MAExB,QAASD,EAAI,EAAGA,EAAIE,EAAUF,IACxBJ,EAAaO,EAAMH,CAAC,IAAM,IAC5BJ,EAAaO,EAAMH,CAAC,EAAI,EACxBH,KAIJ,GAAIA,GAAgBF,EAClB,MAAO,EAEX,CACF,CAEA,MAAO,EACT,CACF,CCzIO,MAAMS,UAAoBC,EAAAA,YAAa,CACpC,QAEC,OAAS,IAAIC,EAAAA,cAAqD1B,CAAc,EAEzF,IAAa,IAAK,CAChB,MAAO,iBACT,CAEA,IAAa,MAAO,CAClB,MAAO,iBACT,CAEA,IAAa,OAAQ,CACnB,OAAO2B,EAAAA,YAAY,SACrB,CAEA,aAAc,CACZ,MAAA,EACA,KAAK,QAAU,IAAIzB,EAAQ,KAAK,OAAO,QAASD,CAAa,EAC7D,KAAK,OAAO,GAAI2B,GAAQ,CACtB,KAAK,QAAQ,OAAOA,CAAG,CACzB,CAAC,CACH,CAES,MAAMC,EAAoB,CACjC,MAAO,EACT,CAES,KAAKA,EAAoB,CAChC,MAAMC,EAAQD,EAAI,OAAO,MACzB,GAAI,CAACC,EAAM,OACT,OAGF,MAAMC,EAAmB,CAAA,EAEzB,UAAWpB,KAAQmB,EACbnB,EAAK,MAAQqB,EAAAA,SAAS,QACT,KAAK,QAAQ,MAAMrB,EAAK,QAAQ,QAAQ,GAKzDoB,EAAS,KAAKpB,CAAI,EAGpBkB,EAAI,OAAO,MAAQE,CACrB,CACF,CC/CO,MAAME,EAA+C,CAC1D,MAAO,CACL,KAAM,QACN,MAAO,CAAA,EACP,MAAO,CACL,MAAO,EAAA,EAET,KAAM,CACJ,WAAY,GACZ,OAAQ,CAAA,CAAC,CACX,EAEF,MAAO,IACP,QAAS,EACX,EC3BMC,EAAkC,CACtC,KACA,KACA,KACA,KACA,IAEA,QACA,SACA,aACA,SACA,kBACA,QAEA,KACA,KACA,YACA,OACA,KAEA,KACA,KACA,KACA,KACA,KACA,iBACA,oBACA,SACA,UACA,MACA,OACA,KAEA,KACA,KACA,KACA,KACA,IACA,QACA,iBACA,aACA,eAEA,KACA,KACA,KACA,KACA,cACA,aACA,MACA,SAEA,KACA,MACA,KACA,KACA,mBACA,WACA,YACA,SAEA,OACA,KACA,YACA,OAEA,KACA,KACA,IACA,WACA,SACA,QACA,MAEA,KACA,KACA,IACA,WACA,UACA,QACA,OAEA,KACA,IACA,WACA,cACA,UACA,MAEA,MACA,KACA,OACA,WACA,UACA,OAEA,QACA,KACA,qBACA,gBACA,SAEA,QACA,OACA,KACA,cACA,SACA,qBAEA,OACA,KACA,YACA,aACA,OAEA,KACA,KACA,cACA,aACA,OAEA,KACA,QACA,eACA,gBACA,OAEA,OACA,OACA,0BACA,iBACA,cAEA,MACA,KACA,WACA,MAEA,MACA,KACA,qBACA,YACA,YACA,MAEA,MACA,KACA,KACA,KACA,IACA,kBACA,QACA,SACA,QACA,MAEA,QACA,OACA,KACA,KACA,qBACA,YACA,SACA,MAEA,MACA,KACA,KACA,KACA,gBACA,eACA,gBACA,SAEA,OACA,OACA,KACA,eACA,eACA,aACA,OACA,SAEA,OACA,UACA,QACA,aAEA,QACA,OACA,KACA,iBACA,gBACA,eACA,MAEA,MACA,KACA,eACA,QAEA,KACA,OACA,IACA,aACA,iBACA,KAEA,KACA,YACA,OACA,MAEA,QACA,OACA,yBAEA,QACA,MACA,MACA,iBACA,SAEA,QACA,KACA,KACA,qBACA,YACA,WAEA,MACA,KACA,UAEA,MACA,KACA,cACA,QAEA,QACA,YAEA,OACA,OACA,MACA,cACA,YACA,kBAEA,MACA,MACA,QACA,eACA,iBACA,sBACA,cAEA,QACA,KACA,mBAEA,OACA,gBAEA,MACA,oBACA,aAEA,KACA,KACA,OACA,KACA,KACA,UACA,sBACA,cAEA,KACA,KACA,KACA,YACA,WACA,UAEA,KACA,KACA,KACA,KACA,KACA,YACA,YACA,YAEA,KACA,YACA,KACA,KAEA,OACA,KACA,KACA,gBACA,SACA,SAEA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,QACA,eACA,QACA,UAEA,KACA,KACA,iBACA,YACA,MAEA,KACA,KACA,KACA,KACA,QACA,KACA,KACA,KACA,WAEA,OACA,KACA,KACA,iBACA,aAEA,KACA,KACA,cACA,cAEA,KACA,KACA,OACA,KACA,OACA,KACA,KACA,KACA,iBACA,iBACF,EAEMC,EAAkC,CACtC,KACA,WACA,OACA,OACA,MAEA,KACA,QACA,MAEA,MACA,iBACA,YACA,SACA,KAEA,KACA,QACA,MAEA,MACA,cACA,SAEA,MACA,cACA,SACA,QAEA,MACA,UAEA,MACA,YAEA,MACA,MACA,KACA,KACA,kBACA,kBACA,SACA,QACA,QACA,MAEA,MACA,OACA,KACA,gBACA,cACA,OACA,MAEA,MACA,MAEA,MACA,QAEA,MACA,QAEA,MACA,OAEA,MACA,WAEA,KACA,UACA,MAEA,MACA,KACA,SACA,MAEA,MACA,QACA,MAEA,MAC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"}
1
+ {"version":3,"file":"index.comm.js","sources":["../src/clean/config.ts","../src/clean/constants.ts","../src/utils/match.ts","../src/clean/utils.ts","../src/clean/index.ts","../src/extract/config.ts","../src/extract/constants.ts","../src/extract/utils.ts","../src/extract/index.ts"],"sourcesContent":["import type { MatchOptions } from '@root/utils/match'\n\nexport interface CleanConfig extends MatchOptions {\n /**\n * use music info when clean first line\n * @example song name - song singer -> will be remove\n * @example song lyric -> skip\n * @default true\n */\n firstLineWithMusicInfo: boolean\n}\n\nexport const DEFAULT_CONFIG: CleanConfig = {\n mode: 'fuzzy',\n fuzzy: {},\n exact: {\n check: 50,\n },\n rule: {\n useDefault: true,\n custom: [],\n },\n firstLineWithMusicInfo: true,\n}\n","import type { MatchRule } from '@root/utils/match'\n\nexport const DEFAULT_RULES: MatchRule[] = [\n '版权所有',\n '版权',\n '授权',\n 'Copyright',\n 'License',\n 'All rights reserved',\n\n '翻唱',\n '改编',\n '致敬',\n 'Cover',\n 'Adaptation',\n 'Tribute',\n 'Remake',\n]\n","export type MatchRule = string | RegExp\n\nexport interface MatchOptions {\n /**\n * match mode\n * @default fuzzy\n */\n mode: 'fuzzy' | 'exact'\n /** fuzzy mode options */\n fuzzy: {}\n /** exact mode options */\n exact: {\n /**\n * need more than this percentage\n * @default 50\n */\n check: number\n }\n /** match rules */\n rule: {\n /**\n * is use default rule\n * @default true\n */\n useDefault: boolean\n /**\n * custom rule, it will be merge with default when useDefault is enable\n * @default []\n */\n custom: MatchRule[]\n }\n}\n\nexport class Matcher {\n private options: MatchOptions\n\n private stringRules: string[] = []\n private regexRules: RegExp[] = []\n\n private defaultRules: MatchRule[] = []\n private combinedRegex: RegExp | null = null\n\n constructor(options: MatchOptions, defaultRules: MatchRule[]) {\n this.options = options\n this.defaultRules = defaultRules\n this.init()\n }\n\n private init() {\n const raw = this.options.rule.useDefault ? [...this.defaultRules, ...(this.options.rule.custom || [])] : [...(this.options.rule.custom || [])]\n\n for (const rule of raw) {\n if (typeof rule === 'string') {\n this.stringRules.push(rule)\n } else if (rule instanceof RegExp) {\n this.regexRules.push(rule)\n }\n }\n\n if (this.options.mode === 'fuzzy' && this.stringRules.length > 0) {\n const target = this.stringRules.sort((a, b) => b.length - a.length).map((str) => str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n this.combinedRegex = new RegExp(`(${target.join('|')})`)\n }\n }\n\n update(options: MatchOptions) {\n this.options = options\n this.init()\n }\n\n match(line: string, extra?: string[]): boolean {\n if (!line) {\n return false\n }\n\n const targetLine = line.trim()\n if (!targetLine.length) {\n return false\n }\n\n return this.options.mode === 'fuzzy' ? this.withFuzzy(targetLine, extra) : this.withExact(targetLine, extra)\n }\n\n private withFuzzy(line: string, extra?: string[]): boolean {\n if (this.combinedRegex && this.combinedRegex.test(line)) {\n return true\n }\n\n for (let i = 0; i < this.regexRules.length; i++) {\n if (this.regexRules[i].test(line)) return true\n }\n\n if (extra && extra.length > 0) {\n for (let i = 0; i < extra.length; i++) {\n if (line.includes(extra[i])) return true\n }\n }\n\n return false\n }\n\n private withExact(line: string, extra?: string[]): boolean {\n const thresholdPercent = Math.max(this.options.exact.check, 0)\n\n const targetMatchCount = Math.ceil((thresholdPercent / 100) * line.length)\n if (targetMatchCount === 0) {\n return true\n }\n\n const matchedChars = new Uint8Array(line.length)\n let matchedCount = 0\n\n const stringRules = [...this.stringRules, ...(extra || [])]\n for (let i = 0; i < stringRules.length; i++) {\n const rule = stringRules[i]\n const ruleLen = rule.length\n if (ruleLen === 0) {\n continue\n }\n\n let postion = line.indexOf(rule)\n while (postion !== -1) {\n for (let j = 0; j < ruleLen; j++) {\n if (matchedChars[postion + j] === 0) {\n matchedChars[postion + j] = 1\n matchedCount++\n }\n }\n\n if (matchedCount >= targetMatchCount) {\n return true\n }\n\n postion = line.indexOf(rule, postion + ruleLen)\n }\n }\n\n for (let i = 0; i < this.regexRules.length; i++) {\n const matchResult = line.match(this.regexRules[i])\n if (matchResult && matchResult[0] && matchResult.index !== undefined) {\n const matchStr = matchResult[0]\n const matchLen = matchStr.length\n const pos = matchResult.index\n\n for (let j = 0; j < matchLen; j++) {\n if (matchedChars[pos + j] === 0) {\n matchedChars[pos + j] = 1\n matchedCount++\n }\n }\n\n if (matchedCount >= targetMatchCount) {\n return true\n }\n }\n }\n\n return false\n }\n}\n","import { removeTextSpaceAll } from '@music-lyric-kit/utils'\n\nconst CLEAN_REGEXP = /[^\\u4E00-\\u9FFF\\u3400-\\u4DBF\\u3040-\\u309F\\u30A0-\\u30FF\\uAC00-\\uD7AFa-zA-Z0-9\\s]/g\n\nexport const cleanText = (text: string) => {\n if (!text.trim()) {\n return ''\n }\n return removeTextSpaceAll(text.replace(CLEAN_REGEXP, ''))\n}\n","import type { DeepPartial } from '@music-lyric-kit/utils'\nimport type { Line } from '@music-lyric-kit/lyric'\nimport type { CleanConfig } from './config'\n\nimport { DEFAULT_CONFIG } from './config'\nimport { DEFAULT_RULES } from './constants'\n\nimport { ConfigManager } from '@music-lyric-kit/utils'\nimport { Matcher } from '@root/utils/match'\n\nimport { ParserPlugin, ParserStage, ParserContext } from '@music-lyric-kit/core'\nimport { LineType } from '@music-lyric-kit/lyric'\n\nimport { cleanText } from './utils'\n\nexport class CleanPlugin extends ParserPlugin {\n private matcher: Matcher\n\n override config = new ConfigManager<CleanConfig, DeepPartial<CleanConfig>>(DEFAULT_CONFIG)\n\n override get priority() {\n return 50\n }\n\n override get id() {\n return 'TRANSFORM-CLEAN'\n }\n\n override get name() {\n return 'TRANSFORM-CLEAN'\n }\n\n override get stage() {\n return ParserStage.Transform\n }\n\n constructor() {\n super()\n this.matcher = new Matcher(this.config.current, DEFAULT_RULES)\n this.config.on((opt) => {\n this.matcher.update(opt)\n })\n }\n\n override check(ctx: ParserContext) {\n return true\n }\n\n override exec(ctx: ParserContext) {\n const lines = ctx.result.lines\n const linesLength = lines.length\n if (!linesLength) {\n return\n }\n\n const newLines: Line[] = []\n\n for (let i = 0; i < linesLength; i++) {\n const line = lines[i]\n if (line.type !== LineType.Normal) {\n newLines.push(line)\n continue\n }\n\n const musicInfo = ctx.params.musicInfo\n const extra = []\n\n if (i === 0 && musicInfo && this.config.current.firstLineWithMusicInfo) {\n const name = cleanText(musicInfo.name || '')\n if (name) {\n extra.push(name)\n }\n const singer = musicInfo.singer?.map((item) => cleanText(item))\n if (singer) {\n extra.push(...singer)\n }\n }\n\n const clean = extra.length ? cleanText(line.content.original) : line.content.original\n const result = this.matcher.match(clean, extra)\n if (!result) {\n newLines.push(line)\n }\n }\n\n ctx.result.lines = newLines\n }\n}\n\nexport type { CleanConfig }\n","import type { MatchOptions } from '@root/utils/match'\n\nexport interface ExtractCreatorConfig {\n match: MatchOptions\n /**\n * split name\n */\n split: string | RegExp\n /**\n * is replace this line when matched\n * @default true\n */\n replace: boolean\n}\n\nexport const DEFAULT_CREATOR_CONFIG: ExtractCreatorConfig = {\n match: {\n mode: 'exact',\n fuzzy: {},\n exact: {\n check: 50,\n },\n rule: {\n useDefault: true,\n custom: [],\n },\n },\n split: '/',\n replace: true,\n}\n","import type { MatchRule } from '@root/utils/match'\n\nconst CREATOR_RULES_ROLE: MatchRule[] = [\n '演唱',\n '主唱',\n '原唱',\n '翻唱',\n '唱',\n\n 'Vocal',\n 'Vocals',\n 'Lead Vocal',\n 'Lead Vocals',\n 'Singer',\n 'Original Singer',\n 'Cover',\n 'Sung by',\n 'Performed by',\n 'Performed',\n\n '客串',\n '特邀',\n 'Featuring',\n 'Feat',\n 'Ft',\n 'Guest',\n\n '和声',\n '和音',\n '伴唱',\n '合声',\n '合音',\n 'Backing Vocals',\n 'Backing Vocal',\n 'Background Vocals',\n 'Background Vocal',\n 'Chorus',\n 'Harmony',\n 'Harmonies',\n 'BGs',\n 'Bvox',\n 'BV',\n\n '童声',\n '男声',\n '女声',\n '人声',\n '腔',\n 'Voice',\n 'Children Voice',\n 'Male Voice',\n 'Female Voice',\n\n '配音',\n '念白',\n '旁白',\n 'CV',\n 'Voice Actor',\n 'Voice Actress',\n 'Narrator',\n 'Narration',\n 'Recitation',\n 'Rap',\n 'Rapper',\n\n '说唱',\n '演奏者',\n '乐手',\n '乐师',\n 'Session Musician',\n 'Musician',\n 'Performer',\n 'Player',\n\n '现场乐队',\n '乐队',\n 'Live Band',\n 'Band',\n\n '作词',\n '填词',\n '词',\n 'Lyricist',\n 'Lyrics',\n 'Lyrics by',\n 'Words',\n 'Words by',\n 'Lyr',\n 'Written',\n 'Written by',\n 'Writer',\n 'Songwriter',\n 'Songwriting',\n\n '作曲',\n '谱曲',\n '曲',\n 'Composer',\n 'Composed',\n 'Composed by',\n 'Compose',\n 'Composition',\n 'Music',\n 'Music by',\n 'Comp',\n\n '词曲',\n '词曲创作',\n 'Song by',\n 'Song',\n\n '编曲',\n '编',\n 'Arranger',\n 'Arranged',\n 'Arranged by',\n 'Arrangement',\n 'Arrange',\n 'Arr',\n\n '制作人',\n '制作',\n '单曲制作',\n 'Producer',\n 'Produced',\n 'Produced by',\n 'Produce',\n 'Prod',\n 'Prod by',\n\n '执行制作人',\n '执制',\n 'Executive Producer',\n 'Exec Producer',\n 'ExProd',\n\n '协力制作人',\n '共同制作',\n '协力',\n 'Co-Producer',\n 'Co-Produced by',\n 'CoProd',\n 'Associate Producer',\n 'Additional Production',\n 'Additional Producer',\n\n '节拍制作',\n '节拍',\n 'Beatmaker',\n 'Beat Maker',\n 'Beat',\n 'Beat by',\n 'Beats',\n\n '编调',\n '编程',\n 'Programming',\n 'Programmed by',\n 'Programmer',\n 'Prog',\n\n '配器',\n '管弦乐编排',\n 'Orchestrator',\n 'Orchestrated by',\n 'Orchestration',\n 'Orch',\n\n '和声编写',\n '和音编写',\n 'Backing Vocals Arranger',\n 'Vocal Arranger',\n 'Vocal Arrangement',\n 'Vocal Arranged by',\n 'BV Arranger',\n\n '工程师',\n '工程',\n 'Engineer',\n 'Engineered by',\n 'Eng',\n\n '录音师',\n '录音',\n 'Recording Engineer',\n 'Recorded by',\n 'Recorded at',\n 'Recordist',\n 'Recording',\n 'Rec',\n\n '混音师',\n '混音',\n '分轨',\n '贴混',\n '混',\n 'Mixing Engineer',\n 'Mixer',\n 'Mixing',\n 'Mixed',\n 'Mixed by',\n 'Mixed at',\n 'Mix',\n\n '母带工程师',\n '母带后期',\n '母带',\n '后期',\n 'Mastering Engineer',\n 'Mastering',\n 'Mastered',\n 'Mastered by',\n 'Mastered at',\n 'Master',\n 'Mst',\n\n '修音师',\n '修音',\n '调校',\n '调教',\n 'Vocal Editing',\n 'Vocal Tuning',\n 'Pitch Editing',\n 'Pitch Correction',\n 'Tuning',\n 'Tuned by',\n 'Auto-Tune',\n\n '人声编辑',\n '音频编辑',\n '剪辑',\n 'Audio Editor',\n 'Audio Editing',\n 'Vocal Editor',\n 'Vocal Edit',\n 'Edit',\n 'Edited by',\n 'Editor',\n\n '重混音师',\n 'Remixer',\n 'Remix',\n 'Remixed by',\n\n '声音设计师',\n '音效设计',\n '音效',\n 'Sound Designer',\n 'Sound Design',\n 'Sound Effects',\n 'SFX Designer',\n 'SFX',\n\n '拟音师',\n '拟音',\n 'Foley Artist',\n 'Foley',\n\n '监制',\n '音乐总监',\n '监',\n 'Supervisor',\n 'Supervised by',\n 'Music Director',\n 'Music Supervisor',\n 'MD',\n\n '指挥',\n 'Conductor',\n 'Conducted by',\n 'Cond',\n 'A&R',\n\n '艺人与产品',\n '艺人统筹',\n 'Artists and Repertoire',\n\n '录音室经理',\n '录音室',\n '录音棚',\n 'Studio Manager',\n 'Studio',\n\n '助理工程师',\n '助工',\n '助理',\n 'Assistant Engineer',\n 'Assistant',\n 'Asst Eng',\n\n '抄谱员',\n '抄谱',\n 'Copyist',\n\n '扒谱员',\n '扒谱',\n 'Transcriber',\n 'Transcription',\n 'Trans',\n\n '乐谱管理员',\n 'Librarian',\n\n '乐器技师',\n '吉他技师',\n '鼓技师',\n 'Guitar Tech',\n 'Drum Tech',\n 'Instrument Tech',\n 'Tech',\n\n '音控师',\n '调音师',\n '前台工程师',\n 'FOH Engineer',\n 'Front of House',\n 'Live Sound Engineer',\n 'Sound Mixer',\n 'Sound Engineer',\n\n '监听工程师',\n '监听',\n 'Monitor Engineer',\n\n '舞台监督',\n 'Stage Manager',\n\n '灯光师',\n 'Lighting Designer',\n 'Light Tech',\n\n '企划',\n '策划',\n '项目统筹',\n '统筹',\n '项目',\n 'Planner',\n 'Project Coordinator',\n 'Coordinator',\n\n '出品',\n '出品人',\n '发行',\n '发布',\n '厂牌',\n 'Publisher',\n 'Published by',\n 'Produced',\n 'Release',\n 'Label',\n 'Distributed by',\n 'Distribution',\n\n '宣传',\n '推广',\n '宣发',\n '宣推',\n '营销',\n 'Marketing',\n 'Publicity',\n 'Promotion',\n\n '版权',\n 'Copyright',\n 'OP',\n 'SP',\n\n '视觉设计',\n '视觉',\n '设计',\n 'Visual Design',\n 'Visual',\n 'Design',\n 'Designed by',\n\n '封面',\n '海报',\n '插画',\n '曲绘',\n '图绘',\n '映像',\n '封',\n 'Cover',\n 'Cover Art',\n 'Cover Design',\n 'Illustration',\n 'Illustrated by',\n 'Image',\n 'Artwork',\n 'Album Art',\n\n '美工',\n '美术',\n 'Graphic Design',\n 'Graphics',\n 'Fine Arts',\n 'Art',\n 'Art Direction',\n 'Art Director',\n\n '摄影',\n '摄像',\n 'Photography',\n 'Photographer',\n 'Photo',\n 'Photo by',\n\n '视频',\n '分镜',\n '脚本',\n '导演',\n 'Video',\n 'Video by',\n 'PV',\n 'MV',\n 'CG',\n 'Director',\n 'Directed by',\n 'Film',\n 'Filmed by',\n 'Animation',\n 'Animator',\n 'Animated by',\n\n '艺术顾问',\n '艺术',\n '顾问',\n 'Art Consultant',\n 'Consultant',\n 'Creative Director',\n 'Creative Direction',\n\n '题字',\n '文案',\n 'Inscription',\n 'Copywriting',\n 'Copywriter',\n\n '翻译',\n '译',\n 'Translator',\n 'Translation',\n 'Translated by',\n\n '支持',\n '鸣谢',\n '特约嘉宾',\n '指导',\n '承办单位',\n '承办',\n '单位',\n '业务',\n 'Special Thanks',\n 'Thanks to',\n 'Acknowledgments',\n 'Credits',\n]\n\nconst CREATOR_RULES_INST: MatchRule[] = [\n '键盘',\n 'Keyboard',\n 'Keyboards',\n 'Kybd',\n 'Keys',\n 'Key',\n\n '钢琴',\n 'Piano',\n 'Pno',\n\n '电钢琴',\n 'Electric Piano',\n 'Wurlitzer',\n 'Rhodes',\n 'EP',\n\n '风琴',\n 'Organ',\n 'Org',\n\n '大键琴',\n 'Harpsichord',\n 'Hpschd',\n\n '合成器',\n 'Synthesizer',\n 'Synths',\n 'Synth',\n\n '采样器',\n 'Sampler',\n\n '序列器',\n 'Sequencer',\n\n '电吉他',\n '木吉他',\n '箱琴',\n '吉他',\n 'Electric Guitar',\n 'Acoustic Guitar',\n 'Classical Guitar',\n 'Guitar',\n 'Guitars',\n 'E.Gtr',\n 'A.Gtr',\n 'Gtr',\n\n '尤克里里',\n 'Ukulele',\n 'Uke',\n\n '电贝斯',\n '低音吉他',\n '贝斯',\n 'Electric Bass',\n 'Bass Guitar',\n 'Bass',\n 'Bss',\n\n '乌德琴',\n 'Oud',\n\n '班卓琴',\n 'Banjo',\n\n '西塔琴',\n 'Sitar',\n\n '鲁特琴',\n 'Lute',\n\n '曼陀林',\n 'Mandolin',\n\n '弦乐',\n 'Strings',\n 'Str',\n\n '小提琴',\n '提琴',\n 'Violin',\n 'Vln',\n\n '中提琴',\n 'Viola',\n 'Vla',\n\n '大提琴',\n 'Cello',\n 'Vc',\n\n '低音提琴',\n 'Double Bass',\n 'Contrabass',\n 'Cb',\n\n '竖琴',\n 'Harp',\n 'Hrp',\n\n '管乐',\n '铜管',\n '木管',\n 'Brass',\n 'Woodwinds',\n 'Winds',\n 'Horns',\n\n '笛子',\n '长笛',\n 'Flute',\n 'Fl',\n\n '短笛',\n 'Piccolo',\n 'Picc',\n\n '哨笛',\n 'Flageolet',\n 'Flt',\n 'Tin Whistle',\n 'Whistle',\n\n '单簧管',\n '竖笛',\n 'Clarinet',\n 'Cl',\n\n '低音单簧管',\n 'Bass Clarinet',\n 'B.Cl',\n\n '双簧管',\n 'Oboe',\n 'Ob',\n\n '英国管',\n 'English Horn',\n 'E.Hn',\n\n '巴松',\n '大管',\n 'Bassoon',\n 'Bsn',\n\n '萨克斯',\n 'Saxophone',\n 'Alto Sax',\n 'Tenor Sax',\n 'Soprano Sax',\n 'Baritone Sax',\n 'A.Sax',\n 'T.Sax',\n 'S.Sax',\n 'B.Sax',\n 'Sax',\n\n '小号',\n 'Trumpet',\n 'Tpt',\n\n '短号',\n 'Cornet',\n 'Cnt',\n\n '长号',\n 'Trombone',\n 'Tbn',\n\n '大号',\n 'Tuba',\n 'Tba',\n\n '圆号',\n 'French Horn',\n 'Horn',\n 'Hn',\n\n '次中音号',\n 'Euphonium',\n 'Euph',\n\n '富鲁格号',\n 'Flugelhorn',\n\n '打击乐',\n 'Percussion',\n 'Perc',\n\n '架子鼓',\n '鼓',\n 'Drum Set',\n 'Drums',\n 'Drum',\n 'Dr',\n\n '电子鼓',\n 'Drum Machine',\n 'Drum Programming',\n\n '定音鼓',\n 'Timpani',\n 'Timp',\n\n '铃鼓',\n 'Tambourine',\n 'Tamb',\n\n '康加鼓',\n 'Conga',\n\n '邦戈鼓',\n 'Bongo',\n\n '钹',\n '镲',\n 'Cymbal',\n 'Cymbals',\n\n '锣',\n 'Gong',\n\n '沙锤',\n 'Shaker',\n\n '三角铁',\n 'Triangle',\n\n '响板',\n 'Castanets',\n\n '钟琴',\n 'Glockenspiel',\n\n '木琴',\n 'Xylophone',\n 'Xylo',\n\n '马林巴',\n 'Marimba',\n\n '颤音琴',\n 'Vibraphone',\n 'Vibes',\n 'Vib',\n\n '古琴',\n '瑶琴',\n '玉琴',\n 'Guqin',\n\n '古筝',\n 'Guzheng',\n\n '琵琶',\n 'Pipa',\n\n '二胡',\n 'Erhu',\n\n '扬琴',\n 'Yangqin',\n\n '阮',\n '中阮',\n 'Ruan',\n\n '箫',\n '笛萧',\n '洞萧',\n 'Xiao',\n\n '笙',\n 'Sheng',\n\n '唢呐',\n 'Suona',\n\n '巴乌',\n 'Bawu',\n\n '葫芦丝',\n 'Hulusi',\n\n '手风琴',\n 'Accordion',\n\n '口琴',\n 'Harmonica',\n\n '特雷门琴',\n 'Theremin',\n\n '拇指琴',\n 'Kalimba',\n 'Mbira',\n\n '钢片琴',\n 'Celesta',\n\n '电子琴',\n 'Electronic Keyboard',\n\n '转盘',\n 'Turntable',\n 'Turntables',\n 'DJ',\n 'Scratching',\n]\n\nexport const DEFAULT_CREATOR_RULES: MatchRule[] = [...CREATOR_RULES_ROLE, ...CREATOR_RULES_INST, 'PGM']\n","export const extractCreator = (line: string): [string, string] | null => {\n if (!line) {\n return null\n }\n\n const enColonIdx = line.indexOf(':')\n const cnColonIdx = line.indexOf(':')\n\n if (enColonIdx === -1 && cnColonIdx === -1) {\n return null\n }\n\n let splitIdx = -1\n if (enColonIdx !== -1 && cnColonIdx !== -1) {\n splitIdx = Math.min(enColonIdx, cnColonIdx)\n } else {\n splitIdx = enColonIdx !== -1 ? enColonIdx : cnColonIdx\n }\n\n const role = line.substring(0, splitIdx).trim()\n const name = line.substring(splitIdx + 1).trim()\n\n if (!role) {\n return null\n }\n\n return [role, name]\n}\n\nexport const splitNameWithRule = (name: string, rule: string | RegExp) => {\n return name\n .split(rule)\n .map((item) => item.trim())\n .filter((item) => !!item)\n}\n","import type { DeepPartial } from '@music-lyric-kit/utils'\nimport type { Line, Meta } from '@music-lyric-kit/lyric'\nimport type { ExtractCreatorConfig } from './config'\n\nimport { DEFAULT_CREATOR_CONFIG } from './config'\nimport { DEFAULT_CREATOR_RULES } from './constants'\n\nimport { ConfigManager, removeTextSpaceAll } from '@music-lyric-kit/utils'\nimport { Matcher } from '@root/utils/match'\n\nimport { ParserPlugin, ParserStage, ParserContext } from '@music-lyric-kit/core'\nimport { LineType, MetaCreator } from '@music-lyric-kit/lyric'\nimport { extractCreator, splitNameWithRule } from './utils'\n\nexport class ExtractCreatorPlugin extends ParserPlugin {\n private matcher: Matcher\n\n override config = new ConfigManager<ExtractCreatorConfig, DeepPartial<ExtractCreatorConfig>>(DEFAULT_CREATOR_CONFIG)\n\n override get priority() {\n return 40\n }\n\n override get id() {\n return 'TRANSFORM-EXTRACT'\n }\n\n override get name() {\n return 'TRANSFORM-EXTRACT'\n }\n\n override get stage() {\n return ParserStage.Transform\n }\n\n constructor() {\n super()\n this.matcher = new Matcher(this.config.current.match, DEFAULT_CREATOR_RULES)\n this.config.on((opt) => {\n this.matcher.update(opt.match)\n })\n }\n\n override check(ctx: ParserContext) {\n return true\n }\n\n override exec(ctx: ParserContext) {\n const lines = ctx.result.lines\n if (!lines.length) {\n return\n }\n\n const newMetas: Meta[] = [...ctx.result.metas]\n const newLines: Line[] = []\n\n for (const line of lines) {\n if (line.type != LineType.Normal) {\n newLines.push(line)\n continue\n }\n\n const target = extractCreator(line.content.original)\n if (!target) {\n newLines.push(line)\n continue\n }\n\n const [role, name] = target\n const result = this.matcher.match(removeTextSpaceAll(role))\n if (!result) {\n newLines.push(line)\n continue\n }\n\n const meta = new MetaCreator()\n meta.content.role = role\n meta.content.name = splitNameWithRule(name, this.config.current.split)\n\n if (!this.config.current.replace) {\n newLines.push(line)\n }\n newMetas.push(meta)\n }\n\n ctx.result.lines = newLines\n ctx.result.metas = newMetas\n }\n}\n\nexport type { ExtractCreatorConfig }\n"],"names":["DEFAULT_CONFIG","DEFAULT_RULES","Matcher","options","defaultRules","raw","rule","target","a","b","str","line","extra","targetLine","i","thresholdPercent","targetMatchCount","matchedChars","matchedCount","stringRules","ruleLen","postion","j","matchResult","matchLen","pos","CLEAN_REGEXP","cleanText","text","removeTextSpaceAll","CleanPlugin","ParserPlugin","ConfigManager","ParserStage","opt","ctx","lines","linesLength","newLines","LineType","musicInfo","name","singer","item","clean","DEFAULT_CREATOR_CONFIG","CREATOR_RULES_ROLE","CREATOR_RULES_INST","DEFAULT_CREATOR_RULES","extractCreator","enColonIdx","cnColonIdx","splitIdx","role","splitNameWithRule","ExtractCreatorPlugin","newMetas","meta","MetaCreator"],"mappings":"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J,WAAY,GACZ,OAAQ,CAAA,CAAC,CACX,EAEF,MAAO,IACP,QAAS,EACX,EC3BMC,EAAkC,CACtC,KACA,KACA,KACA,KACA,IAEA,QACA,SACA,aACA,cACA,SACA,kBACA,QACA,UACA,eACA,YAEA,KACA,KACA,YACA,OACA,KACA,QAEA,KACA,KACA,KACA,KACA,KACA,iBACA,gBACA,oBACA,mBACA,SACA,UACA,YACA,MACA,OACA,KAEA,KACA,KACA,KACA,KACA,IACA,QACA,iBACA,aACA,eAEA,KACA,KACA,KACA,KACA,cACA,gBACA,WACA,YACA,aACA,MACA,SAEA,KACA,MACA,KACA,KACA,mBACA,WACA,YACA,SAEA,OACA,KACA,YACA,OAEA,KACA,KACA,IACA,WACA,SACA,YACA,QACA,WACA,MACA,UACA,aACA,SACA,aACA,cAEA,KACA,KACA,IACA,WACA,WACA,cACA,UACA,cACA,QACA,WACA,OAEA,KACA,OACA,UACA,OAEA,KACA,IACA,WACA,WACA,cACA,cACA,UACA,MAEA,MACA,KACA,OACA,WACA,WACA,cACA,UACA,OACA,UAEA,QACA,KACA,qBACA,gBACA,SAEA,QACA,OACA,KACA,cACA,iBACA,SACA,qBACA,wBACA,sBAEA,OACA,KACA,YACA,aACA,OACA,UACA,QAEA,KACA,KACA,cACA,gBACA,aACA,OAEA,KACA,QACA,eACA,kBACA,gBACA,OAEA,OACA,OACA,0BACA,iBACA,oBACA,oBACA,cAEA,MACA,KACA,WACA,gBACA,MAEA,MACA,KACA,qBACA,cACA,cACA,YACA,YACA,MAEA,MACA,KACA,KACA,KACA,IACA,kBACA,QACA,SACA,QACA,WACA,WACA,MAEA,QACA,OACA,KACA,KACA,qBACA,YACA,WACA,cACA,cACA,SACA,MAEA,MACA,KACA,KACA,KACA,gBACA,eACA,gBACA,mBACA,SACA,WACA,YAEA,OACA,OACA,KACA,eACA,gBACA,eACA,aACA,OACA,YACA,SAEA,OACA,UACA,QACA,aAEA,QACA,OACA,KACA,iBACA,eACA,gBACA,eACA,MAEA,MACA,KACA,eACA,QAEA,KACA,OACA,IACA,aACA,gBACA,iBACA,mBACA,KAEA,KACA,YACA,eACA,OACA,MAEA,QACA,OACA,yBAEA,QACA,MACA,MACA,iBACA,SAEA,QACA,KACA,KACA,qBACA,YACA,WAEA,MACA,KACA,UAEA,MACA,KACA,cACA,gBACA,QAEA,QACA,YAEA,OACA,OACA,MACA,cACA,YACA,kBACA,OAEA,MACA,MACA,QACA,eACA,iBACA,sBACA,cACA,iBAEA,QACA,KACA,mBAEA,OACA,gBAEA,MACA,oBACA,aAEA,KACA,KACA,OACA,KACA,KACA,UACA,sBACA,cAEA,KACA,MACA,KACA,KACA,KACA,YACA,eACA,WACA,UACA,QACA,iBACA,eAEA,KACA,KACA,KACA,KACA,KACA,YACA,YACA,YAEA,KACA,YACA,KACA,KAEA,OACA,KACA,KACA,gBACA,SACA,SACA,cAEA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,QACA,YACA,eACA,eACA,iBACA,QACA,UACA,YAEA,KACA,KACA,iBACA,WACA,YACA,MACA,gBACA,eAEA,KACA,KACA,cACA,eACA,QACA,WAEA,KACA,KACA,KACA,KACA,QACA,WACA,KACA,KACA,KACA,WACA,cACA,OACA,YACA,YACA,WACA,cAEA,OACA,KACA,KACA,iBACA,aACA,oBACA,qBAEA,KACA,KACA,cACA,cACA,aAEA,KACA,IACA,aACA,cACA,gBAEA,KACA,KACA,OACA,KACA,OACA,KACA,KACA,KACA,iBACA,YACA,kBACA,SACF,EAEMC,EAAkC,CACtC,KACA,WACA,YACA,OACA,OACA,MAEA,KACA,QACA,MAEA,MACA,iBACA,YACA,SACA,KAEA,KACA,QACA,MAEA,MACA,cACA,SAEA,MACA,cACA,SACA,QAEA,MACA,UAEA,MACA,YAEA,MACA,MACA,KACA,KACA,kBACA,kBACA,mBACA,SACA,UACA,QACA,QACA,MAEA,OACA,UACA,MAEA,MACA,OACA,KACA,gBACA,cACA,OACA,MAEA,MACA,MAEA,MACA,QAEA,MACA,QAEA,MACA,OAEA,MACA,WAEA,KACA,UACA,MAEA,MACA,KACA,SACA,MAEA,MACA,QACA,MAEA,MACA,QACA,KAEA,OACA,cACA,aACA,KAEA,KACA,OACA,MAEA,KACA,KACA,KACA,QACA,YACA,QACA,QAEA,KACA,KACA,QACA,KAEA,KACA,UACA,OAEA,KACA,YACA,MACA,cACA,UAEA,MACA,KACA,WACA,KAEA,QACA,gBACA,OAEA,MACA,OACA,KAEA,MACA,eACA,OAEA,KACA,KACA,UACA,MAEA,MACA,YACA,WACA,YACA,cACA,eACA,QACA,QACA,QACA,QACA,MAEA,KACA,UACA,MAEA,KACA,SACA,MAEA,KACA,WACA,MAEA,KACA,OACA,MAEA,KACA,cACA,OACA,KAEA,OACA,YACA,OAEA,OACA,aAEA,MACA,aACA,OAEA,MACA,IACA,WACA,QACA,OACA,KAEA,MACA,eACA,mBAEA,MACA,UACA,OAEA,KACA,aACA,OAEA,MACA,QAEA,MACA,QAEA,IACA,IACA,SACA,UAEA,IACA,OAEA,KACA,SAEA,MACA,WAEA,KACA,YAEA,KACA,eAEA,KACA,YACA,OAEA,MACA,UAEA,MACA,aACA,QACA,MAEA,KACA,KACA,KACA,QAEA,KACA,UAEA,KACA,OAEA,KACA,OAEA,KACA,UAEA,IACA,KACA,OAEA,IACA,KACA,KACA,OAEA,IACA,QAEA,KACA,QAEA,KACA,OAEA,MACA,SAEA,MACA,YAEA,KACA,YAEA,OACA,WAEA,MACA,UACA,QAEA,MACA,UAEA,MACA,sBAEA,KACA,YACA,aACA,KACA,YACF,EAEaC,EAAqC,CAAC,GAAGF,EAAoB,GAAGC,EAAoB,KAAK,ECnwBzFE,EAAkBtC,GAA0C,CACvE,GAAI,CAACA,EACH,OAAO,KAGT,MAAMuC,EAAavC,EAAK,QAAQ,GAAG,EAC7BwC,EAAaxC,EAAK,QAAQ,GAAG,EAEnC,GAAIuC,IAAe,IAAMC,IAAe,GACtC,OAAO,KAGT,IAAIC,EAAW,GACXF,IAAe,IAAMC,IAAe,GACtCC,EAAW,KAAK,IAAIF,EAAYC,CAAU,EAE1CC,EAAWF,IAAe,GAAKA,EAAaC,EAG9C,MAAME,EAAO1C,EAAK,UAAU,EAAGyC,CAAQ,EAAE,KAAA,EACnCX,EAAO9B,EAAK,UAAUyC,EAAW,CAAC,EAAE,KAAA,EAE1C,OAAKC,EAIE,CAACA,EAAMZ,CAAI,EAHT,IAIX,EAEaa,EAAoB,CAACb,EAAcnC,IACvCmC,EACJ,MAAMnC,CAAI,EACV,IAAKqC,GAASA,EAAK,KAAA,CAAM,EACzB,OAAQA,GAAS,CAAC,CAACA,CAAI,ECnBrB,MAAMY,UAA6BxB,EAAAA,YAAa,CAC7C,QAEC,OAAS,IAAIC,EAAAA,cAAuEa,CAAsB,EAEnH,IAAa,UAAW,CACtB,MAAO,GACT,CAEA,IAAa,IAAK,CAChB,MAAO,mBACT,CAEA,IAAa,MAAO,CAClB,MAAO,mBACT,CAEA,IAAa,OAAQ,CACnB,OAAOZ,EAAAA,YAAY,SACrB,CAEA,aAAc,CACZ,MAAA,EACA,KAAK,QAAU,IAAI/B,EAAQ,KAAK,OAAO,QAAQ,MAAO8C,CAAqB,EAC3E,KAAK,OAAO,GAAId,GAAQ,CACtB,KAAK,QAAQ,OAAOA,EAAI,KAAK,CAC/B,CAAC,CACH,CAES,MAAMC,EAAoB,CACjC,MAAO,EACT,CAES,KAAKA,EAAoB,CAChC,MAAMC,EAAQD,EAAI,OAAO,MACzB,GAAI,CAACC,EAAM,OACT,OAGF,MAAMoB,EAAmB,CAAC,GAAGrB,EAAI,OAAO,KAAK,EACvCG,EAAmB,CAAA,EAEzB,UAAW3B,KAAQyB,EAAO,CACxB,GAAIzB,EAAK,MAAQ4B,EAAAA,SAAS,OAAQ,CAChCD,EAAS,KAAK3B,CAAI,EAClB,QACF,CAEA,MAAMJ,EAAS0C,EAAetC,EAAK,QAAQ,QAAQ,EACnD,GAAI,CAACJ,EAAQ,CACX+B,EAAS,KAAK3B,CAAI,EAClB,QACF,CAEA,KAAM,CAAC0C,EAAMZ,CAAI,EAAIlC,EAErB,GAAI,CADW,KAAK,QAAQ,MAAMsB,EAAAA,mBAAmBwB,CAAI,CAAC,EAC7C,CACXf,EAAS,KAAK3B,CAAI,EAClB,QACF,CAEA,MAAM8C,EAAO,IAAIC,cACjBD,EAAK,QAAQ,KAAOJ,EACpBI,EAAK,QAAQ,KAAOH,EAAkBb,EAAM,KAAK,OAAO,QAAQ,KAAK,EAEhE,KAAK,OAAO,QAAQ,SACvBH,EAAS,KAAK3B,CAAI,EAEpB6C,EAAS,KAAKC,CAAI,CACpB,CAEAtB,EAAI,OAAO,MAAQG,EACnBH,EAAI,OAAO,MAAQqB,CACrB,CACF"}
@@ -4,11 +4,19 @@ import { ParserPlugin } from '@music-lyric-kit/core';
4
4
  import { ParserStage } from '@music-lyric-kit/core';
5
5
 
6
6
  export declare interface CleanConfig extends MatchOptions {
7
+ /**
8
+ * use music info when clean first line
9
+ * @example song name - song singer -> will be remove
10
+ * @example song lyric -> skip
11
+ * @default true
12
+ */
13
+ firstLineWithMusicInfo: boolean;
7
14
  }
8
15
 
9
16
  export declare class CleanPlugin extends ParserPlugin {
10
17
  private matcher;
11
18
  config: ConfigManager<CleanConfig, {
19
+ firstLineWithMusicInfo?: boolean | undefined;
12
20
  mode?: "fuzzy" | "exact" | undefined;
13
21
  fuzzy?: {} | undefined;
14
22
  exact?: {
@@ -42,6 +50,7 @@ export declare class CleanPlugin extends ParserPlugin {
42
50
  } | undefined)[] | undefined;
43
51
  } | undefined;
44
52
  }>;
53
+ get priority(): number;
45
54
  get id(): string;
46
55
  get name(): string;
47
56
  get stage(): ParserStage;
@@ -126,6 +135,7 @@ export declare class ExtractCreatorPlugin extends ParserPlugin {
126
135
  } | undefined;
127
136
  replace?: boolean | undefined;
128
137
  }>;
138
+ get priority(): number;
129
139
  get id(): string;
130
140
  get name(): string;
131
141
  get stage(): ParserStage;
@@ -1,7 +1,7 @@
1
- import { ConfigManager as g, removeTextSpaceAll as R } from "@music-lyric-kit/utils";
2
- import { ParserPlugin as m, ParserStage as d } from "@music-lyric-kit/core";
3
- import { LineType as f, MetaCreator as x } from "@music-lyric-kit/lyric";
4
- const C = {
1
+ import { removeTextSpaceAll as p, ConfigManager as f } from "@music-lyric-kit/utils";
2
+ import { ParserPlugin as y, ParserStage as b } from "@music-lyric-kit/core";
3
+ import { LineType as C, MetaCreator as R } from "@music-lyric-kit/lyric";
4
+ const E = {
5
5
  mode: "fuzzy",
6
6
  fuzzy: {},
7
7
  exact: {
@@ -10,8 +10,9 @@ const C = {
10
10
  rule: {
11
11
  useDefault: !0,
12
12
  custom: []
13
- }
14
- }, E = [
13
+ },
14
+ firstLineWithMusicInfo: !0
15
+ }, S = [
15
16
  "版权所有",
16
17
  "版权",
17
18
  "授权",
@@ -26,7 +27,7 @@ const C = {
26
27
  "Tribute",
27
28
  "Remake"
28
29
  ];
29
- class p {
30
+ class A {
30
31
  options;
31
32
  stringRules = [];
32
33
  regexRules = [];
@@ -40,60 +41,70 @@ class p {
40
41
  for (const t of e)
41
42
  typeof t == "string" ? this.stringRules.push(t) : t instanceof RegExp && this.regexRules.push(t);
42
43
  if (this.options.mode === "fuzzy" && this.stringRules.length > 0) {
43
- const t = this.stringRules.sort((n, r) => r.length - n.length).map((n) => n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
44
+ const t = this.stringRules.sort((r, n) => n.length - r.length).map((r) => r.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
44
45
  this.combinedRegex = new RegExp(`(${t.join("|")})`);
45
46
  }
46
47
  }
47
48
  update(e) {
48
49
  this.options = e, this.init();
49
50
  }
50
- match(e) {
51
+ match(e, t) {
51
52
  if (!e)
52
53
  return !1;
53
- const t = e.trim();
54
- return t.length ? this.options.mode === "fuzzy" ? this.withFuzzy(t) : this.withExact(t) : !1;
54
+ const r = e.trim();
55
+ return r.length ? this.options.mode === "fuzzy" ? this.withFuzzy(r, t) : this.withExact(r, t) : !1;
55
56
  }
56
- withFuzzy(e) {
57
+ withFuzzy(e, t) {
57
58
  if (this.combinedRegex && this.combinedRegex.test(e))
58
59
  return !0;
59
- for (let t = 0; t < this.regexRules.length; t++)
60
- if (this.regexRules[t].test(e)) return !0;
60
+ for (let r = 0; r < this.regexRules.length; r++)
61
+ if (this.regexRules[r].test(e)) return !0;
62
+ if (t && t.length > 0) {
63
+ for (let r = 0; r < t.length; r++)
64
+ if (e.includes(t[r])) return !0;
65
+ }
61
66
  return !1;
62
67
  }
63
- withExact(e) {
64
- const t = Math.max(this.options.exact.check, 0), n = Math.ceil(t / 100 * e.length);
68
+ withExact(e, t) {
69
+ const r = Math.max(this.options.exact.check, 0), n = Math.ceil(r / 100 * e.length);
65
70
  if (n === 0)
66
71
  return !0;
67
- const r = new Uint8Array(e.length);
68
- let i = 0;
69
- for (let c = 0; c < this.stringRules.length; c++) {
70
- const o = this.stringRules[c], l = o.length;
71
- if (l === 0) continue;
72
- let u = e.indexOf(o);
72
+ const i = new Uint8Array(e.length);
73
+ let a = 0;
74
+ const g = [...this.stringRules, ...t || []];
75
+ for (let o = 0; o < g.length; o++) {
76
+ const c = g[o], h = c.length;
77
+ if (h === 0)
78
+ continue;
79
+ let u = e.indexOf(c);
73
80
  for (; u !== -1; ) {
74
- for (let s = 0; s < l; s++)
75
- r[u + s] === 0 && (r[u + s] = 1, i++);
76
- if (i >= n)
81
+ for (let l = 0; l < h; l++)
82
+ i[u + l] === 0 && (i[u + l] = 1, a++);
83
+ if (a >= n)
77
84
  return !0;
78
- u = e.indexOf(o, u + l);
85
+ u = e.indexOf(c, u + h);
79
86
  }
80
87
  }
81
- for (let c = 0; c < this.regexRules.length; c++) {
82
- const o = e.match(this.regexRules[c]);
83
- if (o && o[0] && o.index !== void 0) {
84
- const u = o[0].length, s = o.index;
85
- for (let h = 0; h < u; h++)
86
- r[s + h] === 0 && (r[s + h] = 1, i++);
87
- if (i >= n)
88
+ for (let o = 0; o < this.regexRules.length; o++) {
89
+ const c = e.match(this.regexRules[o]);
90
+ if (c && c[0] && c.index !== void 0) {
91
+ const u = c[0].length, l = c.index;
92
+ for (let d = 0; d < u; d++)
93
+ i[l + d] === 0 && (i[l + d] = 1, a++);
94
+ if (a >= n)
88
95
  return !0;
89
96
  }
90
97
  }
91
98
  return !1;
92
99
  }
93
100
  }
94
- class L extends m {
101
+ const P = /[^\u4E00-\u9FFF\u3400-\u4DBF\u3040-\u309F\u30A0-\u30FF\uAC00-\uD7AFa-zA-Z0-9\s]/g, m = (s) => s.trim() ? p(s.replace(P, "")) : "";
102
+ class w extends y {
95
103
  matcher;
96
- config = new g(C);
104
+ config = new f(E);
105
+ get priority() {
106
+ return 50;
107
+ }
97
108
  get id() {
98
109
  return "TRANSFORM-CLEAN";
99
110
  }
@@ -101,10 +112,10 @@ class L extends m {
101
112
  return "TRANSFORM-CLEAN";
102
113
  }
103
114
  get stage() {
104
- return d.Transform;
115
+ return b.Transform;
105
116
  }
106
117
  constructor() {
107
- super(), this.matcher = new p(this.config.current, E), this.config.on((e) => {
118
+ super(), this.matcher = new A(this.config.current, S), this.config.on((e) => {
108
119
  this.matcher.update(e);
109
120
  });
110
121
  }
@@ -112,16 +123,30 @@ class L extends m {
112
123
  return !0;
113
124
  }
114
125
  exec(e) {
115
- const t = e.result.lines;
116
- if (!t.length)
126
+ const t = e.result.lines, r = t.length;
127
+ if (!r)
117
128
  return;
118
129
  const n = [];
119
- for (const r of t)
120
- r.type == f.Normal && this.matcher.match(r.content.original) || n.push(r);
130
+ for (let i = 0; i < r; i++) {
131
+ const a = t[i];
132
+ if (a.type !== C.Normal) {
133
+ n.push(a);
134
+ continue;
135
+ }
136
+ const g = e.params.musicInfo, o = [];
137
+ if (i === 0 && g && this.config.current.firstLineWithMusicInfo) {
138
+ const u = m(g.name || "");
139
+ u && o.push(u);
140
+ const l = g.singer?.map((d) => m(d));
141
+ l && o.push(...l);
142
+ }
143
+ const c = o.length ? m(a.content.original) : a.content.original;
144
+ this.matcher.match(c, o) || n.push(a);
145
+ }
121
146
  e.result.lines = n;
122
147
  }
123
148
  }
124
- const S = {
149
+ const T = {
125
150
  match: {
126
151
  mode: "exact",
127
152
  fuzzy: {},
@@ -135,7 +160,7 @@ const S = {
135
160
  },
136
161
  split: "/",
137
162
  replace: !0
138
- }, A = [
163
+ }, x = [
139
164
  "演唱",
140
165
  "主唱",
141
166
  "原唱",
@@ -144,23 +169,31 @@ const S = {
144
169
  "Vocal",
145
170
  "Vocals",
146
171
  "Lead Vocal",
172
+ "Lead Vocals",
147
173
  "Singer",
148
174
  "Original Singer",
149
175
  "Cover",
176
+ "Sung by",
177
+ "Performed by",
178
+ "Performed",
150
179
  "客串",
151
180
  "特邀",
152
181
  "Featuring",
153
182
  "Feat",
154
183
  "Ft",
184
+ "Guest",
155
185
  "和声",
156
186
  "和音",
157
187
  "伴唱",
158
188
  "合声",
159
189
  "合音",
160
190
  "Backing Vocals",
191
+ "Backing Vocal",
161
192
  "Background Vocals",
193
+ "Background Vocal",
162
194
  "Chorus",
163
195
  "Harmony",
196
+ "Harmonies",
164
197
  "BGs",
165
198
  "Bvox",
166
199
  "BV",
@@ -178,6 +211,9 @@ const S = {
178
211
  "旁白",
179
212
  "CV",
180
213
  "Voice Actor",
214
+ "Voice Actress",
215
+ "Narrator",
216
+ "Narration",
181
217
  "Recitation",
182
218
  "Rap",
183
219
  "Rapper",
@@ -198,18 +234,35 @@ const S = {
198
234
  "词",
199
235
  "Lyricist",
200
236
  "Lyrics",
237
+ "Lyrics by",
201
238
  "Words",
239
+ "Words by",
202
240
  "Lyr",
241
+ "Written",
242
+ "Written by",
243
+ "Writer",
244
+ "Songwriter",
245
+ "Songwriting",
203
246
  "作曲",
204
247
  "谱曲",
205
248
  "曲",
206
249
  "Composer",
250
+ "Composed",
251
+ "Composed by",
207
252
  "Compose",
253
+ "Composition",
208
254
  "Music",
255
+ "Music by",
209
256
  "Comp",
257
+ "词曲",
258
+ "词曲创作",
259
+ "Song by",
260
+ "Song",
210
261
  "编曲",
211
262
  "编",
212
263
  "Arranger",
264
+ "Arranged",
265
+ "Arranged by",
213
266
  "Arrangement",
214
267
  "Arrange",
215
268
  "Arr",
@@ -217,8 +270,11 @@ const S = {
217
270
  "制作",
218
271
  "单曲制作",
219
272
  "Producer",
273
+ "Produced",
274
+ "Produced by",
220
275
  "Produce",
221
276
  "Prod",
277
+ "Prod by",
222
278
  "执行制作人",
223
279
  "执制",
224
280
  "Executive Producer",
@@ -228,35 +284,47 @@ const S = {
228
284
  "共同制作",
229
285
  "协力",
230
286
  "Co-Producer",
287
+ "Co-Produced by",
231
288
  "CoProd",
232
289
  "Associate Producer",
290
+ "Additional Production",
291
+ "Additional Producer",
233
292
  "节拍制作",
234
293
  "节拍",
235
294
  "Beatmaker",
236
295
  "Beat Maker",
237
296
  "Beat",
297
+ "Beat by",
298
+ "Beats",
238
299
  "编调",
239
300
  "编程",
240
301
  "Programming",
302
+ "Programmed by",
241
303
  "Programmer",
242
304
  "Prog",
243
305
  "配器",
244
306
  "管弦乐编排",
245
307
  "Orchestrator",
308
+ "Orchestrated by",
246
309
  "Orchestration",
247
310
  "Orch",
248
311
  "和声编写",
249
312
  "和音编写",
250
313
  "Backing Vocals Arranger",
251
314
  "Vocal Arranger",
315
+ "Vocal Arrangement",
316
+ "Vocal Arranged by",
252
317
  "BV Arranger",
253
318
  "工程师",
254
319
  "工程",
255
320
  "Engineer",
321
+ "Engineered by",
256
322
  "Eng",
257
323
  "录音师",
258
324
  "录音",
259
325
  "Recording Engineer",
326
+ "Recorded by",
327
+ "Recorded at",
260
328
  "Recordist",
261
329
  "Recording",
262
330
  "Rec",
@@ -269,6 +337,8 @@ const S = {
269
337
  "Mixer",
270
338
  "Mixing",
271
339
  "Mixed",
340
+ "Mixed by",
341
+ "Mixed at",
272
342
  "Mix",
273
343
  "母带工程师",
274
344
  "母带后期",
@@ -276,6 +346,9 @@ const S = {
276
346
  "后期",
277
347
  "Mastering Engineer",
278
348
  "Mastering",
349
+ "Mastered",
350
+ "Mastered by",
351
+ "Mastered at",
279
352
  "Master",
280
353
  "Mst",
281
354
  "修音师",
@@ -285,14 +358,19 @@ const S = {
285
358
  "Vocal Editing",
286
359
  "Vocal Tuning",
287
360
  "Pitch Editing",
361
+ "Pitch Correction",
288
362
  "Tuning",
363
+ "Tuned by",
364
+ "Auto-Tune",
289
365
  "人声编辑",
290
366
  "音频编辑",
291
367
  "剪辑",
292
368
  "Audio Editor",
369
+ "Audio Editing",
293
370
  "Vocal Editor",
294
371
  "Vocal Edit",
295
372
  "Edit",
373
+ "Edited by",
296
374
  "Editor",
297
375
  "重混音师",
298
376
  "Remixer",
@@ -302,6 +380,7 @@ const S = {
302
380
  "音效设计",
303
381
  "音效",
304
382
  "Sound Designer",
383
+ "Sound Design",
305
384
  "Sound Effects",
306
385
  "SFX Designer",
307
386
  "SFX",
@@ -313,10 +392,13 @@ const S = {
313
392
  "音乐总监",
314
393
  "监",
315
394
  "Supervisor",
395
+ "Supervised by",
316
396
  "Music Director",
397
+ "Music Supervisor",
317
398
  "MD",
318
399
  "指挥",
319
400
  "Conductor",
401
+ "Conducted by",
320
402
  "Cond",
321
403
  "A&R",
322
404
  "艺人与产品",
@@ -339,6 +421,7 @@ const S = {
339
421
  "扒谱员",
340
422
  "扒谱",
341
423
  "Transcriber",
424
+ "Transcription",
342
425
  "Trans",
343
426
  "乐谱管理员",
344
427
  "Librarian",
@@ -348,6 +431,7 @@ const S = {
348
431
  "Guitar Tech",
349
432
  "Drum Tech",
350
433
  "Instrument Tech",
434
+ "Tech",
351
435
  "音控师",
352
436
  "调音师",
353
437
  "前台工程师",
@@ -355,6 +439,7 @@ const S = {
355
439
  "Front of House",
356
440
  "Live Sound Engineer",
357
441
  "Sound Mixer",
442
+ "Sound Engineer",
358
443
  "监听工程师",
359
444
  "监听",
360
445
  "Monitor Engineer",
@@ -372,11 +457,17 @@ const S = {
372
457
  "Project Coordinator",
373
458
  "Coordinator",
374
459
  "出品",
460
+ "出品人",
375
461
  "发行",
376
462
  "发布",
463
+ "厂牌",
377
464
  "Publisher",
465
+ "Published by",
378
466
  "Produced",
379
467
  "Release",
468
+ "Label",
469
+ "Distributed by",
470
+ "Distribution",
380
471
  "宣传",
381
472
  "推广",
382
473
  "宣发",
@@ -395,6 +486,7 @@ const S = {
395
486
  "Visual Design",
396
487
  "Visual",
397
488
  "Design",
489
+ "Designed by",
398
490
  "封面",
399
491
  "海报",
400
492
  "插画",
@@ -403,32 +495,60 @@ const S = {
403
495
  "映像",
404
496
  "封",
405
497
  "Cover",
498
+ "Cover Art",
499
+ "Cover Design",
406
500
  "Illustration",
501
+ "Illustrated by",
407
502
  "Image",
408
503
  "Artwork",
504
+ "Album Art",
409
505
  "美工",
410
506
  "美术",
411
507
  "Graphic Design",
508
+ "Graphics",
412
509
  "Fine Arts",
413
510
  "Art",
511
+ "Art Direction",
512
+ "Art Director",
513
+ "摄影",
514
+ "摄像",
515
+ "Photography",
516
+ "Photographer",
517
+ "Photo",
518
+ "Photo by",
414
519
  "视频",
415
520
  "分镜",
416
521
  "脚本",
417
522
  "导演",
418
523
  "Video",
524
+ "Video by",
419
525
  "PV",
420
526
  "MV",
421
527
  "CG",
422
528
  "Director",
529
+ "Directed by",
530
+ "Film",
531
+ "Filmed by",
532
+ "Animation",
533
+ "Animator",
534
+ "Animated by",
423
535
  "艺术顾问",
424
536
  "艺术",
425
537
  "顾问",
426
538
  "Art Consultant",
427
539
  "Consultant",
540
+ "Creative Director",
541
+ "Creative Direction",
428
542
  "题字",
429
543
  "文案",
430
544
  "Inscription",
431
545
  "Copywriting",
546
+ "Copywriter",
547
+ "翻译",
548
+ "译",
549
+ "Translator",
550
+ "Translation",
551
+ "Translated by",
432
552
  "支持",
433
553
  "鸣谢",
434
554
  "特约嘉宾",
@@ -438,10 +558,13 @@ const S = {
438
558
  "单位",
439
559
  "业务",
440
560
  "Special Thanks",
441
- "Acknowledgments"
442
- ], T = [
561
+ "Thanks to",
562
+ "Acknowledgments",
563
+ "Credits"
564
+ ], M = [
443
565
  "键盘",
444
566
  "Keyboard",
567
+ "Keyboards",
445
568
  "Kybd",
446
569
  "Keys",
447
570
  "Key",
@@ -473,10 +596,15 @@ const S = {
473
596
  "吉他",
474
597
  "Electric Guitar",
475
598
  "Acoustic Guitar",
599
+ "Classical Guitar",
476
600
  "Guitar",
601
+ "Guitars",
477
602
  "E.Gtr",
478
603
  "A.Gtr",
479
604
  "Gtr",
605
+ "尤克里里",
606
+ "Ukulele",
607
+ "Uke",
480
608
  "电贝斯",
481
609
  "低音吉他",
482
610
  "贝斯",
@@ -520,6 +648,7 @@ const S = {
520
648
  "Brass",
521
649
  "Woodwinds",
522
650
  "Winds",
651
+ "Horns",
523
652
  "笛子",
524
653
  "长笛",
525
654
  "Flute",
@@ -530,6 +659,8 @@ const S = {
530
659
  "哨笛",
531
660
  "Flageolet",
532
661
  "Flt",
662
+ "Tin Whistle",
663
+ "Whistle",
533
664
  "单簧管",
534
665
  "竖笛",
535
666
  "Clarinet",
@@ -551,9 +682,11 @@ const S = {
551
682
  "Saxophone",
552
683
  "Alto Sax",
553
684
  "Tenor Sax",
685
+ "Soprano Sax",
554
686
  "Baritone Sax",
555
687
  "A.Sax",
556
688
  "T.Sax",
689
+ "S.Sax",
557
690
  "B.Sax",
558
691
  "Sax",
559
692
  "小号",
@@ -586,6 +719,9 @@ const S = {
586
719
  "Drums",
587
720
  "Drum",
588
721
  "Dr",
722
+ "电子鼓",
723
+ "Drum Machine",
724
+ "Drum Programming",
589
725
  "定音鼓",
590
726
  "Timpani",
591
727
  "Timp",
@@ -599,10 +735,17 @@ const S = {
599
735
  "钹",
600
736
  "镲",
601
737
  "Cymbal",
738
+ "Cymbals",
602
739
  "锣",
603
740
  "Gong",
604
741
  "沙锤",
605
742
  "Shaker",
743
+ "三角铁",
744
+ "Triangle",
745
+ "响板",
746
+ "Castanets",
747
+ "钟琴",
748
+ "Glockenspiel",
606
749
  "木琴",
607
750
  "Xylophone",
608
751
  "Xylo",
@@ -644,21 +787,36 @@ const S = {
644
787
  "口琴",
645
788
  "Harmonica",
646
789
  "特雷门琴",
647
- "Theremin"
648
- ], P = [...A, ...T, "PGM"], M = (a) => {
649
- if (!a)
790
+ "Theremin",
791
+ "拇指琴",
792
+ "Kalimba",
793
+ "Mbira",
794
+ "钢片琴",
795
+ "Celesta",
796
+ "电子琴",
797
+ "Electronic Keyboard",
798
+ "转盘",
799
+ "Turntable",
800
+ "Turntables",
801
+ "DJ",
802
+ "Scratching"
803
+ ], F = [...x, ...M, "PGM"], V = (s) => {
804
+ if (!s)
650
805
  return null;
651
- const e = a.indexOf(":"), t = a.indexOf(":");
806
+ const e = s.indexOf(":"), t = s.indexOf(":");
652
807
  if (e === -1 && t === -1)
653
808
  return null;
654
- let n = -1;
655
- e !== -1 && t !== -1 ? n = Math.min(e, t) : n = e !== -1 ? e : t;
656
- const r = a.substring(0, n).trim(), i = a.substring(n + 1).trim();
657
- return r ? [r, i] : null;
658
- }, y = (a, e) => a.split(e).map((t) => t.trim()).filter((t) => !!t);
659
- class B extends m {
809
+ let r = -1;
810
+ e !== -1 && t !== -1 ? r = Math.min(e, t) : r = e !== -1 ? e : t;
811
+ const n = s.substring(0, r).trim(), i = s.substring(r + 1).trim();
812
+ return n ? [n, i] : null;
813
+ }, D = (s, e) => s.split(e).map((t) => t.trim()).filter((t) => !!t);
814
+ class G extends y {
660
815
  matcher;
661
- config = new g(S);
816
+ config = new f(T);
817
+ get priority() {
818
+ return 40;
819
+ }
662
820
  get id() {
663
821
  return "TRANSFORM-EXTRACT";
664
822
  }
@@ -666,10 +824,10 @@ class B extends m {
666
824
  return "TRANSFORM-EXTRACT";
667
825
  }
668
826
  get stage() {
669
- return d.Transform;
827
+ return b.Transform;
670
828
  }
671
829
  constructor() {
672
- super(), this.matcher = new p(this.config.current.match, P), this.config.on((e) => {
830
+ super(), this.matcher = new A(this.config.current.match, F), this.config.on((e) => {
673
831
  this.matcher.update(e.match);
674
832
  });
675
833
  }
@@ -680,30 +838,30 @@ class B extends m {
680
838
  const t = e.result.lines;
681
839
  if (!t.length)
682
840
  return;
683
- const n = [...e.result.metas], r = [];
841
+ const r = [...e.result.metas], n = [];
684
842
  for (const i of t) {
685
- if (i.type != f.Normal) {
686
- r.push(i);
843
+ if (i.type != C.Normal) {
844
+ n.push(i);
687
845
  continue;
688
846
  }
689
- const c = M(i.content.original);
690
- if (!c) {
691
- r.push(i);
847
+ const a = V(i.content.original);
848
+ if (!a) {
849
+ n.push(i);
692
850
  continue;
693
851
  }
694
- const [o, l] = c;
695
- if (!this.matcher.match(R(o))) {
696
- r.push(i);
852
+ const [g, o] = a;
853
+ if (!this.matcher.match(p(g))) {
854
+ n.push(i);
697
855
  continue;
698
856
  }
699
- const s = new x();
700
- s.content.role = o, s.content.name = y(l, this.config.current.split), this.config.current.replace || r.push(i), n.push(s);
857
+ const h = new R();
858
+ h.content.role = g, h.content.name = D(o, this.config.current.split), this.config.current.replace || n.push(i), r.push(h);
701
859
  }
702
- e.result.lines = r, e.result.metas = n;
860
+ e.result.lines = n, e.result.metas = r;
703
861
  }
704
862
  }
705
863
  export {
706
- L as CleanPlugin,
707
- B as ExtractCreatorPlugin
864
+ w as CleanPlugin,
865
+ G as ExtractCreatorPlugin
708
866
  };
709
867
  //# sourceMappingURL=index.ecma.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.ecma.js","sources":["../src/clean/config.ts","../src/clean/constants.ts","../src/utils/match.ts","../src/clean/index.ts","../src/extract/config.ts","../src/extract/constants.ts","../src/extract/utils.ts","../src/extract/index.ts"],"sourcesContent":["import type { MatchOptions } from '@root/utils/match'\n\nexport interface CleanConfig extends MatchOptions {}\n\nexport const DEFAULT_CONFIG: CleanConfig = {\n mode: 'fuzzy',\n fuzzy: {},\n exact: {\n check: 50,\n },\n rule: {\n useDefault: true,\n custom: [],\n },\n}\n","import type { MatchRule } from '@root/utils/match'\n\nexport const DEFAULT_RULES: MatchRule[] = [\n '版权所有',\n '版权',\n '授权',\n 'Copyright',\n 'License',\n 'All rights reserved',\n\n '翻唱',\n '改编',\n '致敬',\n 'Cover',\n 'Adaptation',\n 'Tribute',\n 'Remake',\n]\n","export type MatchRule = string | RegExp\n\nexport interface MatchOptions {\n /**\n * match mode\n * @default fuzzy\n */\n mode: 'fuzzy' | 'exact'\n /** fuzzy mode options */\n fuzzy: {}\n /** exact mode options */\n exact: {\n /**\n * need more than this percentage\n * @default 50\n */\n check: number\n }\n /** match rules */\n rule: {\n /**\n * is use default rule\n * @default true\n */\n useDefault: boolean\n /**\n * custom rule, it will be merge with default when useDefault is enable\n * @default []\n */\n custom: MatchRule[]\n }\n}\n\nexport class Matcher {\n private options: MatchOptions\n\n private stringRules: string[] = []\n private regexRules: RegExp[] = []\n\n private defaultRules: MatchRule[] = []\n private combinedRegex: RegExp | null = null\n\n constructor(options: MatchOptions, defaultRules: MatchRule[]) {\n this.options = options\n this.defaultRules = defaultRules\n this.init()\n }\n\n private init() {\n const raw = this.options.rule.useDefault ? [...this.defaultRules, ...(this.options.rule.custom || [])] : [...(this.options.rule.custom || [])]\n\n for (const rule of raw) {\n if (typeof rule === 'string') {\n this.stringRules.push(rule)\n } else if (rule instanceof RegExp) {\n this.regexRules.push(rule)\n }\n }\n\n if (this.options.mode === 'fuzzy' && this.stringRules.length > 0) {\n const target = this.stringRules.sort((a, b) => b.length - a.length).map((str) => str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n this.combinedRegex = new RegExp(`(${target.join('|')})`)\n }\n }\n\n update(options: MatchOptions) {\n this.options = options\n this.init()\n }\n\n match(line: string): boolean {\n if (!line) {\n return false\n }\n\n const targetLine = line.trim()\n if (!targetLine.length) {\n return false\n }\n\n return this.options.mode === 'fuzzy' ? this.withFuzzy(targetLine) : this.withExact(targetLine)\n }\n\n private withFuzzy(line: string): boolean {\n if (this.combinedRegex && this.combinedRegex.test(line)) {\n return true\n }\n\n for (let i = 0; i < this.regexRules.length; i++) {\n if (this.regexRules[i].test(line)) return true\n }\n\n return false\n }\n\n private withExact(line: string): boolean {\n const thresholdPercent = Math.max(this.options.exact.check, 0)\n\n const targetMatchCount = Math.ceil((thresholdPercent / 100) * line.length)\n if (targetMatchCount === 0) {\n return true\n }\n\n const matchedChars = new Uint8Array(line.length)\n let matchedCount = 0\n\n for (let i = 0; i < this.stringRules.length; i++) {\n const rule = this.stringRules[i]\n const ruleLen = rule.length\n if (ruleLen === 0) continue\n\n let postion = line.indexOf(rule)\n while (postion !== -1) {\n for (let j = 0; j < ruleLen; j++) {\n if (matchedChars[postion + j] === 0) {\n matchedChars[postion + j] = 1\n matchedCount++\n }\n }\n\n if (matchedCount >= targetMatchCount) {\n return true\n }\n\n postion = line.indexOf(rule, postion + ruleLen)\n }\n }\n\n for (let i = 0; i < this.regexRules.length; i++) {\n const matchResult = line.match(this.regexRules[i])\n if (matchResult && matchResult[0] && matchResult.index !== undefined) {\n const matchStr = matchResult[0]\n const matchLen = matchStr.length\n const pos = matchResult.index\n\n for (let j = 0; j < matchLen; j++) {\n if (matchedChars[pos + j] === 0) {\n matchedChars[pos + j] = 1\n matchedCount++\n }\n }\n\n if (matchedCount >= targetMatchCount) {\n return true\n }\n }\n }\n\n return false\n }\n}\n","import type { DeepPartial } from '@music-lyric-kit/utils'\nimport type { Line } from '@music-lyric-kit/lyric'\nimport type { CleanConfig } from './config'\n\nimport { DEFAULT_CONFIG } from './config'\nimport { DEFAULT_RULES } from './constants'\n\nimport { ConfigManager } from '@music-lyric-kit/utils'\nimport { Matcher } from '@root/utils/match'\n\nimport { ParserPlugin, ParserStage, ParserContext } from '@music-lyric-kit/core'\nimport { LineType } from '@music-lyric-kit/lyric'\n\nexport class CleanPlugin extends ParserPlugin {\n private matcher: Matcher\n\n override config = new ConfigManager<CleanConfig, DeepPartial<CleanConfig>>(DEFAULT_CONFIG)\n\n override get id() {\n return 'TRANSFORM-CLEAN'\n }\n\n override get name() {\n return 'TRANSFORM-CLEAN'\n }\n\n override get stage() {\n return ParserStage.Transform\n }\n\n constructor() {\n super()\n this.matcher = new Matcher(this.config.current, DEFAULT_RULES)\n this.config.on((opt) => {\n this.matcher.update(opt)\n })\n }\n\n override check(ctx: ParserContext) {\n return true\n }\n\n override exec(ctx: ParserContext) {\n const lines = ctx.result.lines\n if (!lines.length) {\n return\n }\n\n const newLines: Line[] = []\n\n for (const line of lines) {\n if (line.type == LineType.Normal) {\n const result = this.matcher.match(line.content.original)\n if (result) {\n continue\n }\n }\n newLines.push(line)\n }\n\n ctx.result.lines = newLines\n }\n}\n\nexport type { CleanConfig }\n","import type { MatchOptions } from '@root/utils/match'\n\nexport interface ExtractCreatorConfig {\n match: MatchOptions\n /**\n * split name\n */\n split: string | RegExp\n /**\n * is replace this line when matched\n * @default true\n */\n replace: boolean\n}\n\nexport const DEFAULT_CREATOR_CONFIG: ExtractCreatorConfig = {\n match: {\n mode: 'exact',\n fuzzy: {},\n exact: {\n check: 50,\n },\n rule: {\n useDefault: true,\n custom: [],\n },\n },\n split: '/',\n replace: true,\n}\n","import type { MatchRule } from '@root/utils/match'\n\nconst CREATOR_RULES_ROLE: MatchRule[] = [\n '演唱',\n '主唱',\n '原唱',\n '翻唱',\n '唱',\n\n 'Vocal',\n 'Vocals',\n 'Lead Vocal',\n 'Singer',\n 'Original Singer',\n 'Cover',\n\n '客串',\n '特邀',\n 'Featuring',\n 'Feat',\n 'Ft',\n\n '和声',\n '和音',\n '伴唱',\n '合声',\n '合音',\n 'Backing Vocals',\n 'Background Vocals',\n 'Chorus',\n 'Harmony',\n 'BGs',\n 'Bvox',\n 'BV',\n\n '童声',\n '男声',\n '女声',\n '人声',\n '腔',\n 'Voice',\n 'Children Voice',\n 'Male Voice',\n 'Female Voice',\n\n '配音',\n '念白',\n '旁白',\n 'CV',\n 'Voice Actor',\n 'Recitation',\n 'Rap',\n 'Rapper',\n\n '说唱',\n '演奏者',\n '乐手',\n '乐师',\n 'Session Musician',\n 'Musician',\n 'Performer',\n 'Player',\n\n '现场乐队',\n '乐队',\n 'Live Band',\n 'Band',\n\n '作词',\n '填词',\n '词',\n 'Lyricist',\n 'Lyrics',\n 'Words',\n 'Lyr',\n\n '作曲',\n '谱曲',\n '曲',\n 'Composer',\n 'Compose',\n 'Music',\n 'Comp',\n\n '编曲',\n '编',\n 'Arranger',\n 'Arrangement',\n 'Arrange',\n 'Arr',\n\n '制作人',\n '制作',\n '单曲制作',\n 'Producer',\n 'Produce',\n 'Prod',\n\n '执行制作人',\n '执制',\n 'Executive Producer',\n 'Exec Producer',\n 'ExProd',\n\n '协力制作人',\n '共同制作',\n '协力',\n 'Co-Producer',\n 'CoProd',\n 'Associate Producer',\n\n '节拍制作',\n '节拍',\n 'Beatmaker',\n 'Beat Maker',\n 'Beat',\n\n '编调',\n '编程',\n 'Programming',\n 'Programmer',\n 'Prog',\n\n '配器',\n '管弦乐编排',\n 'Orchestrator',\n 'Orchestration',\n 'Orch',\n\n '和声编写',\n '和音编写',\n 'Backing Vocals Arranger',\n 'Vocal Arranger',\n 'BV Arranger',\n\n '工程师',\n '工程',\n 'Engineer',\n 'Eng',\n\n '录音师',\n '录音',\n 'Recording Engineer',\n 'Recordist',\n 'Recording',\n 'Rec',\n\n '混音师',\n '混音',\n '分轨',\n '贴混',\n '混',\n 'Mixing Engineer',\n 'Mixer',\n 'Mixing',\n 'Mixed',\n 'Mix',\n\n '母带工程师',\n '母带后期',\n '母带',\n '后期',\n 'Mastering Engineer',\n 'Mastering',\n 'Master',\n 'Mst',\n\n '修音师',\n '修音',\n '调校',\n '调教',\n 'Vocal Editing',\n 'Vocal Tuning',\n 'Pitch Editing',\n 'Tuning',\n\n '人声编辑',\n '音频编辑',\n '剪辑',\n 'Audio Editor',\n 'Vocal Editor',\n 'Vocal Edit',\n 'Edit',\n 'Editor',\n\n '重混音师',\n 'Remixer',\n 'Remix',\n 'Remixed by',\n\n '声音设计师',\n '音效设计',\n '音效',\n 'Sound Designer',\n 'Sound Effects',\n 'SFX Designer',\n 'SFX',\n\n '拟音师',\n '拟音',\n 'Foley Artist',\n 'Foley',\n\n '监制',\n '音乐总监',\n '监',\n 'Supervisor',\n 'Music Director',\n 'MD',\n\n '指挥',\n 'Conductor',\n 'Cond',\n 'A&R',\n\n '艺人与产品',\n '艺人统筹',\n 'Artists and Repertoire',\n\n '录音室经理',\n '录音室',\n '录音棚',\n 'Studio Manager',\n 'Studio',\n\n '助理工程师',\n '助工',\n '助理',\n 'Assistant Engineer',\n 'Assistant',\n 'Asst Eng',\n\n '抄谱员',\n '抄谱',\n 'Copyist',\n\n '扒谱员',\n '扒谱',\n 'Transcriber',\n 'Trans',\n\n '乐谱管理员',\n 'Librarian',\n\n '乐器技师',\n '吉他技师',\n '鼓技师',\n 'Guitar Tech',\n 'Drum Tech',\n 'Instrument Tech',\n\n '音控师',\n '调音师',\n '前台工程师',\n 'FOH Engineer',\n 'Front of House',\n 'Live Sound Engineer',\n 'Sound Mixer',\n\n '监听工程师',\n '监听',\n 'Monitor Engineer',\n\n '舞台监督',\n 'Stage Manager',\n\n '灯光师',\n 'Lighting Designer',\n 'Light Tech',\n\n '企划',\n '策划',\n '项目统筹',\n '统筹',\n '项目',\n 'Planner',\n 'Project Coordinator',\n 'Coordinator',\n\n '出品',\n '发行',\n '发布',\n 'Publisher',\n 'Produced',\n 'Release',\n\n '宣传',\n '推广',\n '宣发',\n '宣推',\n '营销',\n 'Marketing',\n 'Publicity',\n 'Promotion',\n\n '版权',\n 'Copyright',\n 'OP',\n 'SP',\n\n '视觉设计',\n '视觉',\n '设计',\n 'Visual Design',\n 'Visual',\n 'Design',\n\n '封面',\n '海报',\n '插画',\n '曲绘',\n '图绘',\n '映像',\n '封',\n 'Cover',\n 'Illustration',\n 'Image',\n 'Artwork',\n\n '美工',\n '美术',\n 'Graphic Design',\n 'Fine Arts',\n 'Art',\n\n '视频',\n '分镜',\n '脚本',\n '导演',\n 'Video',\n 'PV',\n 'MV',\n 'CG',\n 'Director',\n\n '艺术顾问',\n '艺术',\n '顾问',\n 'Art Consultant',\n 'Consultant',\n\n '题字',\n '文案',\n 'Inscription',\n 'Copywriting',\n\n '支持',\n '鸣谢',\n '特约嘉宾',\n '指导',\n '承办单位',\n '承办',\n '单位',\n '业务',\n 'Special Thanks',\n 'Acknowledgments',\n]\n\nconst CREATOR_RULES_INST: MatchRule[] = [\n '键盘',\n 'Keyboard',\n 'Kybd',\n 'Keys',\n 'Key',\n\n '钢琴',\n 'Piano',\n 'Pno',\n\n '电钢琴',\n 'Electric Piano',\n 'Wurlitzer',\n 'Rhodes',\n 'EP',\n\n '风琴',\n 'Organ',\n 'Org',\n\n '大键琴',\n 'Harpsichord',\n 'Hpschd',\n\n '合成器',\n 'Synthesizer',\n 'Synths',\n 'Synth',\n\n '采样器',\n 'Sampler',\n\n '序列器',\n 'Sequencer',\n\n '电吉他',\n '木吉他',\n '箱琴',\n '吉他',\n 'Electric Guitar',\n 'Acoustic Guitar',\n 'Guitar',\n 'E.Gtr',\n 'A.Gtr',\n 'Gtr',\n\n '电贝斯',\n '低音吉他',\n '贝斯',\n 'Electric Bass',\n 'Bass Guitar',\n 'Bass',\n 'Bss',\n\n '乌德琴',\n 'Oud',\n\n '班卓琴',\n 'Banjo',\n\n '西塔琴',\n 'Sitar',\n\n '鲁特琴',\n 'Lute',\n\n '曼陀林',\n 'Mandolin',\n\n '弦乐',\n 'Strings',\n 'Str',\n\n '小提琴',\n '提琴',\n 'Violin',\n 'Vln',\n\n '中提琴',\n 'Viola',\n 'Vla',\n\n '大提琴',\n 'Cello',\n 'Vc',\n\n '低音提琴',\n 'Double Bass',\n 'Contrabass',\n 'Cb',\n\n '竖琴',\n 'Harp',\n 'Hrp',\n\n '管乐',\n '铜管',\n '木管',\n 'Brass',\n 'Woodwinds',\n 'Winds',\n\n '笛子',\n '长笛',\n 'Flute',\n 'Fl',\n\n '短笛',\n 'Piccolo',\n 'Picc',\n\n '哨笛',\n 'Flageolet',\n 'Flt',\n\n '单簧管',\n '竖笛',\n 'Clarinet',\n 'Cl',\n\n '低音单簧管',\n 'Bass Clarinet',\n 'B.Cl',\n\n '双簧管',\n 'Oboe',\n 'Ob',\n\n '英国管',\n 'English Horn',\n 'E.Hn',\n\n '巴松',\n '大管',\n 'Bassoon',\n 'Bsn',\n\n '萨克斯',\n 'Saxophone',\n 'Alto Sax',\n 'Tenor Sax',\n 'Baritone Sax',\n 'A.Sax',\n 'T.Sax',\n 'B.Sax',\n 'Sax',\n\n '小号',\n 'Trumpet',\n 'Tpt',\n\n '短号',\n 'Cornet',\n 'Cnt',\n\n '长号',\n 'Trombone',\n 'Tbn',\n\n '大号',\n 'Tuba',\n 'Tba',\n\n '圆号',\n 'French Horn',\n 'Horn',\n 'Hn',\n\n '次中音号',\n 'Euphonium',\n 'Euph',\n\n '富鲁格号',\n 'Flugelhorn',\n\n '打击乐',\n 'Percussion',\n 'Perc',\n\n '架子鼓',\n '鼓',\n 'Drum Set',\n 'Drums',\n 'Drum',\n 'Dr',\n\n '定音鼓',\n 'Timpani',\n 'Timp',\n\n '铃鼓',\n 'Tambourine',\n 'Tamb',\n\n '康加鼓',\n 'Conga',\n\n '邦戈鼓',\n 'Bongo',\n\n '钹',\n '镲',\n 'Cymbal',\n\n '锣',\n 'Gong',\n\n '沙锤',\n 'Shaker',\n\n '木琴',\n 'Xylophone',\n 'Xylo',\n\n '马林巴',\n 'Marimba',\n\n '颤音琴',\n 'Vibraphone',\n 'Vibes',\n 'Vib',\n\n '古琴',\n '瑶琴',\n '玉琴',\n 'Guqin',\n\n '古筝',\n 'Guzheng',\n\n '琵琶',\n 'Pipa',\n\n '二胡',\n 'Erhu',\n\n '扬琴',\n 'Yangqin',\n\n '阮',\n '中阮',\n 'Ruan',\n\n '箫',\n '笛萧',\n '洞萧',\n 'Xiao',\n\n '笙',\n 'Sheng',\n\n '唢呐',\n 'Suona',\n\n '巴乌',\n 'Bawu',\n\n '葫芦丝',\n 'Hulusi',\n\n '手风琴',\n 'Accordion',\n\n '口琴',\n 'Harmonica',\n\n '特雷门琴',\n 'Theremin',\n]\n\nexport const DEFAULT_CREATOR_RULES: MatchRule[] = [...CREATOR_RULES_ROLE, ...CREATOR_RULES_INST, 'PGM']\n","export const extractCreator = (line: string): [string, string] | null => {\n if (!line) {\n return null\n }\n\n const enColonIdx = line.indexOf(':')\n const cnColonIdx = line.indexOf(':')\n\n if (enColonIdx === -1 && cnColonIdx === -1) {\n return null\n }\n\n let splitIdx = -1\n if (enColonIdx !== -1 && cnColonIdx !== -1) {\n splitIdx = Math.min(enColonIdx, cnColonIdx)\n } else {\n splitIdx = enColonIdx !== -1 ? enColonIdx : cnColonIdx\n }\n\n const role = line.substring(0, splitIdx).trim()\n const name = line.substring(splitIdx + 1).trim()\n\n if (!role) {\n return null\n }\n\n return [role, name]\n}\n\nexport const splitNameWithRule = (name: string, rule: string | RegExp) => {\n return name\n .split(rule)\n .map((item) => item.trim())\n .filter((item) => !!item)\n}\n","import type { DeepPartial } from '@music-lyric-kit/utils'\nimport type { Line, Meta } from '@music-lyric-kit/lyric'\nimport type { ExtractCreatorConfig } from './config'\n\nimport { DEFAULT_CREATOR_CONFIG } from './config'\nimport { DEFAULT_CREATOR_RULES } from './constants'\n\nimport { ConfigManager, removeTextSpaceAll } from '@music-lyric-kit/utils'\nimport { Matcher } from '@root/utils/match'\n\nimport { ParserPlugin, ParserStage, ParserContext } from '@music-lyric-kit/core'\nimport { LineType, MetaCreator } from '@music-lyric-kit/lyric'\nimport { extractCreator, splitNameWithRule } from './utils'\n\nexport class ExtractCreatorPlugin extends ParserPlugin {\n private matcher: Matcher\n\n override config = new ConfigManager<ExtractCreatorConfig, DeepPartial<ExtractCreatorConfig>>(DEFAULT_CREATOR_CONFIG)\n\n override get id() {\n return 'TRANSFORM-EXTRACT'\n }\n\n override get name() {\n return 'TRANSFORM-EXTRACT'\n }\n\n override get stage() {\n return ParserStage.Transform\n }\n\n constructor() {\n super()\n this.matcher = new Matcher(this.config.current.match, DEFAULT_CREATOR_RULES)\n this.config.on((opt) => {\n this.matcher.update(opt.match)\n })\n }\n\n override check(ctx: ParserContext) {\n return true\n }\n\n override exec(ctx: ParserContext) {\n const lines = ctx.result.lines\n if (!lines.length) {\n return\n }\n\n const newMetas: Meta[] = [...ctx.result.metas]\n const newLines: Line[] = []\n\n for (const line of lines) {\n if (line.type != LineType.Normal) {\n newLines.push(line)\n continue\n }\n\n const target = extractCreator(line.content.original)\n if (!target) {\n newLines.push(line)\n continue\n }\n\n const [role, name] = target\n const result = this.matcher.match(removeTextSpaceAll(role))\n if (!result) {\n newLines.push(line)\n continue\n }\n\n const meta = new MetaCreator()\n meta.content.role = role\n meta.content.name = splitNameWithRule(name, this.config.current.split)\n\n if (!this.config.current.replace) {\n newLines.push(line)\n }\n newMetas.push(meta)\n }\n\n ctx.result.lines = newLines\n ctx.result.metas = newMetas\n }\n}\n\nexport type { ExtractCreatorConfig }\n"],"names":["DEFAULT_CONFIG","DEFAULT_RULES","Matcher","options","defaultRules","raw","rule","target","a","b","str","line","targetLine","i","thresholdPercent","targetMatchCount","matchedChars","matchedCount","ruleLen","postion","j","matchResult","matchLen","pos","CleanPlugin","ParserPlugin","ConfigManager","ParserStage","opt","ctx","lines","newLines","LineType","DEFAULT_CREATOR_CONFIG","CREATOR_RULES_ROLE","CREATOR_RULES_INST","DEFAULT_CREATOR_RULES","extractCreator","enColonIdx","cnColonIdx","splitIdx","role","name","splitNameWithRule","item","ExtractCreatorPlugin","newMetas","removeTextSpaceAll","meta","MetaCreator"],"mappings":"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AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAEMC,IAAkC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AACF,GAEaC,IAAqC,CAAC,GAAGF,GAAoB,GAAGC,GAAoB,KAAK,GCrnBzFE,IAAiB,CAAC1B,MAA0C;AACvE,MAAI,CAACA;AACH,WAAO;AAGT,QAAM2B,IAAa3B,EAAK,QAAQ,GAAG,GAC7B4B,IAAa5B,EAAK,QAAQ,GAAG;AAEnC,MAAI2B,MAAe,MAAMC,MAAe;AACtC,WAAO;AAGT,MAAIC,IAAW;AACf,EAAIF,MAAe,MAAMC,MAAe,KACtCC,IAAW,KAAK,IAAIF,GAAYC,CAAU,IAE1CC,IAAWF,MAAe,KAAKA,IAAaC;AAG9C,QAAME,IAAO9B,EAAK,UAAU,GAAG6B,CAAQ,EAAE,KAAA,GACnCE,IAAO/B,EAAK,UAAU6B,IAAW,CAAC,EAAE,KAAA;AAE1C,SAAKC,IAIE,CAACA,GAAMC,CAAI,IAHT;AAIX,GAEaC,IAAoB,CAACD,GAAcpC,MACvCoC,EACJ,MAAMpC,CAAI,EACV,IAAI,CAACsC,MAASA,EAAK,KAAA,CAAM,EACzB,OAAO,CAACA,MAAS,CAAC,CAACA,CAAI;ACnBrB,MAAMC,UAA6BpB,EAAa;AAAA,EAC7C;AAAA,EAEC,SAAS,IAAIC,EAAuEO,CAAsB;AAAA,EAEnH,IAAa,KAAK;AAChB,WAAO;AAAA,EACT;AAAA,EAEA,IAAa,OAAO;AAClB,WAAO;AAAA,EACT;AAAA,EAEA,IAAa,QAAQ;AACnB,WAAON,EAAY;AAAA,EACrB;AAAA,EAEA,cAAc;AACZ,UAAA,GACA,KAAK,UAAU,IAAIzB,EAAQ,KAAK,OAAO,QAAQ,OAAOkC,CAAqB,GAC3E,KAAK,OAAO,GAAG,CAACR,MAAQ;AACtB,WAAK,QAAQ,OAAOA,EAAI,KAAK;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA,EAES,MAAMC,GAAoB;AACjC,WAAO;AAAA,EACT;AAAA,EAES,KAAKA,GAAoB;AAChC,UAAMC,IAAQD,EAAI,OAAO;AACzB,QAAI,CAACC,EAAM;AACT;AAGF,UAAMgB,IAAmB,CAAC,GAAGjB,EAAI,OAAO,KAAK,GACvCE,IAAmB,CAAA;AAEzB,eAAWpB,KAAQmB,GAAO;AACxB,UAAInB,EAAK,QAAQqB,EAAS,QAAQ;AAChC,QAAAD,EAAS,KAAKpB,CAAI;AAClB;AAAA,MACF;AAEA,YAAMJ,IAAS8B,EAAe1B,EAAK,QAAQ,QAAQ;AACnD,UAAI,CAACJ,GAAQ;AACX,QAAAwB,EAAS,KAAKpB,CAAI;AAClB;AAAA,MACF;AAEA,YAAM,CAAC8B,GAAMC,CAAI,IAAInC;AAErB,UAAI,CADW,KAAK,QAAQ,MAAMwC,EAAmBN,CAAI,CAAC,GAC7C;AACX,QAAAV,EAAS,KAAKpB,CAAI;AAClB;AAAA,MACF;AAEA,YAAMqC,IAAO,IAAIC,EAAA;AACjB,MAAAD,EAAK,QAAQ,OAAOP,GACpBO,EAAK,QAAQ,OAAOL,EAAkBD,GAAM,KAAK,OAAO,QAAQ,KAAK,GAEhE,KAAK,OAAO,QAAQ,WACvBX,EAAS,KAAKpB,CAAI,GAEpBmC,EAAS,KAAKE,CAAI;AAAA,IACpB;AAEA,IAAAnB,EAAI,OAAO,QAAQE,GACnBF,EAAI,OAAO,QAAQiB;AAAA,EACrB;AACF;"}
1
+ {"version":3,"file":"index.ecma.js","sources":["../src/clean/config.ts","../src/clean/constants.ts","../src/utils/match.ts","../src/clean/utils.ts","../src/clean/index.ts","../src/extract/config.ts","../src/extract/constants.ts","../src/extract/utils.ts","../src/extract/index.ts"],"sourcesContent":["import type { MatchOptions } from '@root/utils/match'\n\nexport interface CleanConfig extends MatchOptions {\n /**\n * use music info when clean first line\n * @example song name - song singer -> will be remove\n * @example song lyric -> skip\n * @default true\n */\n firstLineWithMusicInfo: boolean\n}\n\nexport const DEFAULT_CONFIG: CleanConfig = {\n mode: 'fuzzy',\n fuzzy: {},\n exact: {\n check: 50,\n },\n rule: {\n useDefault: true,\n custom: [],\n },\n firstLineWithMusicInfo: true,\n}\n","import type { MatchRule } from '@root/utils/match'\n\nexport const DEFAULT_RULES: MatchRule[] = [\n '版权所有',\n '版权',\n '授权',\n 'Copyright',\n 'License',\n 'All rights reserved',\n\n '翻唱',\n '改编',\n '致敬',\n 'Cover',\n 'Adaptation',\n 'Tribute',\n 'Remake',\n]\n","export type MatchRule = string | RegExp\n\nexport interface MatchOptions {\n /**\n * match mode\n * @default fuzzy\n */\n mode: 'fuzzy' | 'exact'\n /** fuzzy mode options */\n fuzzy: {}\n /** exact mode options */\n exact: {\n /**\n * need more than this percentage\n * @default 50\n */\n check: number\n }\n /** match rules */\n rule: {\n /**\n * is use default rule\n * @default true\n */\n useDefault: boolean\n /**\n * custom rule, it will be merge with default when useDefault is enable\n * @default []\n */\n custom: MatchRule[]\n }\n}\n\nexport class Matcher {\n private options: MatchOptions\n\n private stringRules: string[] = []\n private regexRules: RegExp[] = []\n\n private defaultRules: MatchRule[] = []\n private combinedRegex: RegExp | null = null\n\n constructor(options: MatchOptions, defaultRules: MatchRule[]) {\n this.options = options\n this.defaultRules = defaultRules\n this.init()\n }\n\n private init() {\n const raw = this.options.rule.useDefault ? [...this.defaultRules, ...(this.options.rule.custom || [])] : [...(this.options.rule.custom || [])]\n\n for (const rule of raw) {\n if (typeof rule === 'string') {\n this.stringRules.push(rule)\n } else if (rule instanceof RegExp) {\n this.regexRules.push(rule)\n }\n }\n\n if (this.options.mode === 'fuzzy' && this.stringRules.length > 0) {\n const target = this.stringRules.sort((a, b) => b.length - a.length).map((str) => str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n this.combinedRegex = new RegExp(`(${target.join('|')})`)\n }\n }\n\n update(options: MatchOptions) {\n this.options = options\n this.init()\n }\n\n match(line: string, extra?: string[]): boolean {\n if (!line) {\n return false\n }\n\n const targetLine = line.trim()\n if (!targetLine.length) {\n return false\n }\n\n return this.options.mode === 'fuzzy' ? this.withFuzzy(targetLine, extra) : this.withExact(targetLine, extra)\n }\n\n private withFuzzy(line: string, extra?: string[]): boolean {\n if (this.combinedRegex && this.combinedRegex.test(line)) {\n return true\n }\n\n for (let i = 0; i < this.regexRules.length; i++) {\n if (this.regexRules[i].test(line)) return true\n }\n\n if (extra && extra.length > 0) {\n for (let i = 0; i < extra.length; i++) {\n if (line.includes(extra[i])) return true\n }\n }\n\n return false\n }\n\n private withExact(line: string, extra?: string[]): boolean {\n const thresholdPercent = Math.max(this.options.exact.check, 0)\n\n const targetMatchCount = Math.ceil((thresholdPercent / 100) * line.length)\n if (targetMatchCount === 0) {\n return true\n }\n\n const matchedChars = new Uint8Array(line.length)\n let matchedCount = 0\n\n const stringRules = [...this.stringRules, ...(extra || [])]\n for (let i = 0; i < stringRules.length; i++) {\n const rule = stringRules[i]\n const ruleLen = rule.length\n if (ruleLen === 0) {\n continue\n }\n\n let postion = line.indexOf(rule)\n while (postion !== -1) {\n for (let j = 0; j < ruleLen; j++) {\n if (matchedChars[postion + j] === 0) {\n matchedChars[postion + j] = 1\n matchedCount++\n }\n }\n\n if (matchedCount >= targetMatchCount) {\n return true\n }\n\n postion = line.indexOf(rule, postion + ruleLen)\n }\n }\n\n for (let i = 0; i < this.regexRules.length; i++) {\n const matchResult = line.match(this.regexRules[i])\n if (matchResult && matchResult[0] && matchResult.index !== undefined) {\n const matchStr = matchResult[0]\n const matchLen = matchStr.length\n const pos = matchResult.index\n\n for (let j = 0; j < matchLen; j++) {\n if (matchedChars[pos + j] === 0) {\n matchedChars[pos + j] = 1\n matchedCount++\n }\n }\n\n if (matchedCount >= targetMatchCount) {\n return true\n }\n }\n }\n\n return false\n }\n}\n","import { removeTextSpaceAll } from '@music-lyric-kit/utils'\n\nconst CLEAN_REGEXP = /[^\\u4E00-\\u9FFF\\u3400-\\u4DBF\\u3040-\\u309F\\u30A0-\\u30FF\\uAC00-\\uD7AFa-zA-Z0-9\\s]/g\n\nexport const cleanText = (text: string) => {\n if (!text.trim()) {\n return ''\n }\n return removeTextSpaceAll(text.replace(CLEAN_REGEXP, ''))\n}\n","import type { DeepPartial } from '@music-lyric-kit/utils'\nimport type { Line } from '@music-lyric-kit/lyric'\nimport type { CleanConfig } from './config'\n\nimport { DEFAULT_CONFIG } from './config'\nimport { DEFAULT_RULES } from './constants'\n\nimport { ConfigManager } from '@music-lyric-kit/utils'\nimport { Matcher } from '@root/utils/match'\n\nimport { ParserPlugin, ParserStage, ParserContext } from '@music-lyric-kit/core'\nimport { LineType } from '@music-lyric-kit/lyric'\n\nimport { cleanText } from './utils'\n\nexport class CleanPlugin extends ParserPlugin {\n private matcher: Matcher\n\n override config = new ConfigManager<CleanConfig, DeepPartial<CleanConfig>>(DEFAULT_CONFIG)\n\n override get priority() {\n return 50\n }\n\n override get id() {\n return 'TRANSFORM-CLEAN'\n }\n\n override get name() {\n return 'TRANSFORM-CLEAN'\n }\n\n override get stage() {\n return ParserStage.Transform\n }\n\n constructor() {\n super()\n this.matcher = new Matcher(this.config.current, DEFAULT_RULES)\n this.config.on((opt) => {\n this.matcher.update(opt)\n })\n }\n\n override check(ctx: ParserContext) {\n return true\n }\n\n override exec(ctx: ParserContext) {\n const lines = ctx.result.lines\n const linesLength = lines.length\n if (!linesLength) {\n return\n }\n\n const newLines: Line[] = []\n\n for (let i = 0; i < linesLength; i++) {\n const line = lines[i]\n if (line.type !== LineType.Normal) {\n newLines.push(line)\n continue\n }\n\n const musicInfo = ctx.params.musicInfo\n const extra = []\n\n if (i === 0 && musicInfo && this.config.current.firstLineWithMusicInfo) {\n const name = cleanText(musicInfo.name || '')\n if (name) {\n extra.push(name)\n }\n const singer = musicInfo.singer?.map((item) => cleanText(item))\n if (singer) {\n extra.push(...singer)\n }\n }\n\n const clean = extra.length ? cleanText(line.content.original) : line.content.original\n const result = this.matcher.match(clean, extra)\n if (!result) {\n newLines.push(line)\n }\n }\n\n ctx.result.lines = newLines\n }\n}\n\nexport type { CleanConfig }\n","import type { MatchOptions } from '@root/utils/match'\n\nexport interface ExtractCreatorConfig {\n match: MatchOptions\n /**\n * split name\n */\n split: string | RegExp\n /**\n * is replace this line when matched\n * @default true\n */\n replace: boolean\n}\n\nexport const DEFAULT_CREATOR_CONFIG: ExtractCreatorConfig = {\n match: {\n mode: 'exact',\n fuzzy: {},\n exact: {\n check: 50,\n },\n rule: {\n useDefault: true,\n custom: [],\n },\n },\n split: '/',\n replace: true,\n}\n","import type { MatchRule } from '@root/utils/match'\n\nconst CREATOR_RULES_ROLE: MatchRule[] = [\n '演唱',\n '主唱',\n '原唱',\n '翻唱',\n '唱',\n\n 'Vocal',\n 'Vocals',\n 'Lead Vocal',\n 'Lead Vocals',\n 'Singer',\n 'Original Singer',\n 'Cover',\n 'Sung by',\n 'Performed by',\n 'Performed',\n\n '客串',\n '特邀',\n 'Featuring',\n 'Feat',\n 'Ft',\n 'Guest',\n\n '和声',\n '和音',\n '伴唱',\n '合声',\n '合音',\n 'Backing Vocals',\n 'Backing Vocal',\n 'Background Vocals',\n 'Background Vocal',\n 'Chorus',\n 'Harmony',\n 'Harmonies',\n 'BGs',\n 'Bvox',\n 'BV',\n\n '童声',\n '男声',\n '女声',\n '人声',\n '腔',\n 'Voice',\n 'Children Voice',\n 'Male Voice',\n 'Female Voice',\n\n '配音',\n '念白',\n '旁白',\n 'CV',\n 'Voice Actor',\n 'Voice Actress',\n 'Narrator',\n 'Narration',\n 'Recitation',\n 'Rap',\n 'Rapper',\n\n '说唱',\n '演奏者',\n '乐手',\n '乐师',\n 'Session Musician',\n 'Musician',\n 'Performer',\n 'Player',\n\n '现场乐队',\n '乐队',\n 'Live Band',\n 'Band',\n\n '作词',\n '填词',\n '词',\n 'Lyricist',\n 'Lyrics',\n 'Lyrics by',\n 'Words',\n 'Words by',\n 'Lyr',\n 'Written',\n 'Written by',\n 'Writer',\n 'Songwriter',\n 'Songwriting',\n\n '作曲',\n '谱曲',\n '曲',\n 'Composer',\n 'Composed',\n 'Composed by',\n 'Compose',\n 'Composition',\n 'Music',\n 'Music by',\n 'Comp',\n\n '词曲',\n '词曲创作',\n 'Song by',\n 'Song',\n\n '编曲',\n '编',\n 'Arranger',\n 'Arranged',\n 'Arranged by',\n 'Arrangement',\n 'Arrange',\n 'Arr',\n\n '制作人',\n '制作',\n '单曲制作',\n 'Producer',\n 'Produced',\n 'Produced by',\n 'Produce',\n 'Prod',\n 'Prod by',\n\n '执行制作人',\n '执制',\n 'Executive Producer',\n 'Exec Producer',\n 'ExProd',\n\n '协力制作人',\n '共同制作',\n '协力',\n 'Co-Producer',\n 'Co-Produced by',\n 'CoProd',\n 'Associate Producer',\n 'Additional Production',\n 'Additional Producer',\n\n '节拍制作',\n '节拍',\n 'Beatmaker',\n 'Beat Maker',\n 'Beat',\n 'Beat by',\n 'Beats',\n\n '编调',\n '编程',\n 'Programming',\n 'Programmed by',\n 'Programmer',\n 'Prog',\n\n '配器',\n '管弦乐编排',\n 'Orchestrator',\n 'Orchestrated by',\n 'Orchestration',\n 'Orch',\n\n '和声编写',\n '和音编写',\n 'Backing Vocals Arranger',\n 'Vocal Arranger',\n 'Vocal Arrangement',\n 'Vocal Arranged by',\n 'BV Arranger',\n\n '工程师',\n '工程',\n 'Engineer',\n 'Engineered by',\n 'Eng',\n\n '录音师',\n '录音',\n 'Recording Engineer',\n 'Recorded by',\n 'Recorded at',\n 'Recordist',\n 'Recording',\n 'Rec',\n\n '混音师',\n '混音',\n '分轨',\n '贴混',\n '混',\n 'Mixing Engineer',\n 'Mixer',\n 'Mixing',\n 'Mixed',\n 'Mixed by',\n 'Mixed at',\n 'Mix',\n\n '母带工程师',\n '母带后期',\n '母带',\n '后期',\n 'Mastering Engineer',\n 'Mastering',\n 'Mastered',\n 'Mastered by',\n 'Mastered at',\n 'Master',\n 'Mst',\n\n '修音师',\n '修音',\n '调校',\n '调教',\n 'Vocal Editing',\n 'Vocal Tuning',\n 'Pitch Editing',\n 'Pitch Correction',\n 'Tuning',\n 'Tuned by',\n 'Auto-Tune',\n\n '人声编辑',\n '音频编辑',\n '剪辑',\n 'Audio Editor',\n 'Audio Editing',\n 'Vocal Editor',\n 'Vocal Edit',\n 'Edit',\n 'Edited by',\n 'Editor',\n\n '重混音师',\n 'Remixer',\n 'Remix',\n 'Remixed by',\n\n '声音设计师',\n '音效设计',\n '音效',\n 'Sound Designer',\n 'Sound Design',\n 'Sound Effects',\n 'SFX Designer',\n 'SFX',\n\n '拟音师',\n '拟音',\n 'Foley Artist',\n 'Foley',\n\n '监制',\n '音乐总监',\n '监',\n 'Supervisor',\n 'Supervised by',\n 'Music Director',\n 'Music Supervisor',\n 'MD',\n\n '指挥',\n 'Conductor',\n 'Conducted by',\n 'Cond',\n 'A&R',\n\n '艺人与产品',\n '艺人统筹',\n 'Artists and Repertoire',\n\n '录音室经理',\n '录音室',\n '录音棚',\n 'Studio Manager',\n 'Studio',\n\n '助理工程师',\n '助工',\n '助理',\n 'Assistant Engineer',\n 'Assistant',\n 'Asst Eng',\n\n '抄谱员',\n '抄谱',\n 'Copyist',\n\n '扒谱员',\n '扒谱',\n 'Transcriber',\n 'Transcription',\n 'Trans',\n\n '乐谱管理员',\n 'Librarian',\n\n '乐器技师',\n '吉他技师',\n '鼓技师',\n 'Guitar Tech',\n 'Drum Tech',\n 'Instrument Tech',\n 'Tech',\n\n '音控师',\n '调音师',\n '前台工程师',\n 'FOH Engineer',\n 'Front of House',\n 'Live Sound Engineer',\n 'Sound Mixer',\n 'Sound Engineer',\n\n '监听工程师',\n '监听',\n 'Monitor Engineer',\n\n '舞台监督',\n 'Stage Manager',\n\n '灯光师',\n 'Lighting Designer',\n 'Light Tech',\n\n '企划',\n '策划',\n '项目统筹',\n '统筹',\n '项目',\n 'Planner',\n 'Project Coordinator',\n 'Coordinator',\n\n '出品',\n '出品人',\n '发行',\n '发布',\n '厂牌',\n 'Publisher',\n 'Published by',\n 'Produced',\n 'Release',\n 'Label',\n 'Distributed by',\n 'Distribution',\n\n '宣传',\n '推广',\n '宣发',\n '宣推',\n '营销',\n 'Marketing',\n 'Publicity',\n 'Promotion',\n\n '版权',\n 'Copyright',\n 'OP',\n 'SP',\n\n '视觉设计',\n '视觉',\n '设计',\n 'Visual Design',\n 'Visual',\n 'Design',\n 'Designed by',\n\n '封面',\n '海报',\n '插画',\n '曲绘',\n '图绘',\n '映像',\n '封',\n 'Cover',\n 'Cover Art',\n 'Cover Design',\n 'Illustration',\n 'Illustrated by',\n 'Image',\n 'Artwork',\n 'Album Art',\n\n '美工',\n '美术',\n 'Graphic Design',\n 'Graphics',\n 'Fine Arts',\n 'Art',\n 'Art Direction',\n 'Art Director',\n\n '摄影',\n '摄像',\n 'Photography',\n 'Photographer',\n 'Photo',\n 'Photo by',\n\n '视频',\n '分镜',\n '脚本',\n '导演',\n 'Video',\n 'Video by',\n 'PV',\n 'MV',\n 'CG',\n 'Director',\n 'Directed by',\n 'Film',\n 'Filmed by',\n 'Animation',\n 'Animator',\n 'Animated by',\n\n '艺术顾问',\n '艺术',\n '顾问',\n 'Art Consultant',\n 'Consultant',\n 'Creative Director',\n 'Creative Direction',\n\n '题字',\n '文案',\n 'Inscription',\n 'Copywriting',\n 'Copywriter',\n\n '翻译',\n '译',\n 'Translator',\n 'Translation',\n 'Translated by',\n\n '支持',\n '鸣谢',\n '特约嘉宾',\n '指导',\n '承办单位',\n '承办',\n '单位',\n '业务',\n 'Special Thanks',\n 'Thanks to',\n 'Acknowledgments',\n 'Credits',\n]\n\nconst CREATOR_RULES_INST: MatchRule[] = [\n '键盘',\n 'Keyboard',\n 'Keyboards',\n 'Kybd',\n 'Keys',\n 'Key',\n\n '钢琴',\n 'Piano',\n 'Pno',\n\n '电钢琴',\n 'Electric Piano',\n 'Wurlitzer',\n 'Rhodes',\n 'EP',\n\n '风琴',\n 'Organ',\n 'Org',\n\n '大键琴',\n 'Harpsichord',\n 'Hpschd',\n\n '合成器',\n 'Synthesizer',\n 'Synths',\n 'Synth',\n\n '采样器',\n 'Sampler',\n\n '序列器',\n 'Sequencer',\n\n '电吉他',\n '木吉他',\n '箱琴',\n '吉他',\n 'Electric Guitar',\n 'Acoustic Guitar',\n 'Classical Guitar',\n 'Guitar',\n 'Guitars',\n 'E.Gtr',\n 'A.Gtr',\n 'Gtr',\n\n '尤克里里',\n 'Ukulele',\n 'Uke',\n\n '电贝斯',\n '低音吉他',\n '贝斯',\n 'Electric Bass',\n 'Bass Guitar',\n 'Bass',\n 'Bss',\n\n '乌德琴',\n 'Oud',\n\n '班卓琴',\n 'Banjo',\n\n '西塔琴',\n 'Sitar',\n\n '鲁特琴',\n 'Lute',\n\n '曼陀林',\n 'Mandolin',\n\n '弦乐',\n 'Strings',\n 'Str',\n\n '小提琴',\n '提琴',\n 'Violin',\n 'Vln',\n\n '中提琴',\n 'Viola',\n 'Vla',\n\n '大提琴',\n 'Cello',\n 'Vc',\n\n '低音提琴',\n 'Double Bass',\n 'Contrabass',\n 'Cb',\n\n '竖琴',\n 'Harp',\n 'Hrp',\n\n '管乐',\n '铜管',\n '木管',\n 'Brass',\n 'Woodwinds',\n 'Winds',\n 'Horns',\n\n '笛子',\n '长笛',\n 'Flute',\n 'Fl',\n\n '短笛',\n 'Piccolo',\n 'Picc',\n\n '哨笛',\n 'Flageolet',\n 'Flt',\n 'Tin Whistle',\n 'Whistle',\n\n '单簧管',\n '竖笛',\n 'Clarinet',\n 'Cl',\n\n '低音单簧管',\n 'Bass Clarinet',\n 'B.Cl',\n\n '双簧管',\n 'Oboe',\n 'Ob',\n\n '英国管',\n 'English Horn',\n 'E.Hn',\n\n '巴松',\n '大管',\n 'Bassoon',\n 'Bsn',\n\n '萨克斯',\n 'Saxophone',\n 'Alto Sax',\n 'Tenor Sax',\n 'Soprano Sax',\n 'Baritone Sax',\n 'A.Sax',\n 'T.Sax',\n 'S.Sax',\n 'B.Sax',\n 'Sax',\n\n '小号',\n 'Trumpet',\n 'Tpt',\n\n '短号',\n 'Cornet',\n 'Cnt',\n\n '长号',\n 'Trombone',\n 'Tbn',\n\n '大号',\n 'Tuba',\n 'Tba',\n\n '圆号',\n 'French Horn',\n 'Horn',\n 'Hn',\n\n '次中音号',\n 'Euphonium',\n 'Euph',\n\n '富鲁格号',\n 'Flugelhorn',\n\n '打击乐',\n 'Percussion',\n 'Perc',\n\n '架子鼓',\n '鼓',\n 'Drum Set',\n 'Drums',\n 'Drum',\n 'Dr',\n\n '电子鼓',\n 'Drum Machine',\n 'Drum Programming',\n\n '定音鼓',\n 'Timpani',\n 'Timp',\n\n '铃鼓',\n 'Tambourine',\n 'Tamb',\n\n '康加鼓',\n 'Conga',\n\n '邦戈鼓',\n 'Bongo',\n\n '钹',\n '镲',\n 'Cymbal',\n 'Cymbals',\n\n '锣',\n 'Gong',\n\n '沙锤',\n 'Shaker',\n\n '三角铁',\n 'Triangle',\n\n '响板',\n 'Castanets',\n\n '钟琴',\n 'Glockenspiel',\n\n '木琴',\n 'Xylophone',\n 'Xylo',\n\n '马林巴',\n 'Marimba',\n\n '颤音琴',\n 'Vibraphone',\n 'Vibes',\n 'Vib',\n\n '古琴',\n '瑶琴',\n '玉琴',\n 'Guqin',\n\n '古筝',\n 'Guzheng',\n\n '琵琶',\n 'Pipa',\n\n '二胡',\n 'Erhu',\n\n '扬琴',\n 'Yangqin',\n\n '阮',\n '中阮',\n 'Ruan',\n\n '箫',\n '笛萧',\n '洞萧',\n 'Xiao',\n\n '笙',\n 'Sheng',\n\n '唢呐',\n 'Suona',\n\n '巴乌',\n 'Bawu',\n\n '葫芦丝',\n 'Hulusi',\n\n '手风琴',\n 'Accordion',\n\n '口琴',\n 'Harmonica',\n\n '特雷门琴',\n 'Theremin',\n\n '拇指琴',\n 'Kalimba',\n 'Mbira',\n\n '钢片琴',\n 'Celesta',\n\n '电子琴',\n 'Electronic Keyboard',\n\n '转盘',\n 'Turntable',\n 'Turntables',\n 'DJ',\n 'Scratching',\n]\n\nexport const DEFAULT_CREATOR_RULES: MatchRule[] = [...CREATOR_RULES_ROLE, ...CREATOR_RULES_INST, 'PGM']\n","export const extractCreator = (line: string): [string, string] | null => {\n if (!line) {\n return null\n }\n\n const enColonIdx = line.indexOf(':')\n const cnColonIdx = line.indexOf(':')\n\n if (enColonIdx === -1 && cnColonIdx === -1) {\n return null\n }\n\n let splitIdx = -1\n if (enColonIdx !== -1 && cnColonIdx !== -1) {\n splitIdx = Math.min(enColonIdx, cnColonIdx)\n } else {\n splitIdx = enColonIdx !== -1 ? enColonIdx : cnColonIdx\n }\n\n const role = line.substring(0, splitIdx).trim()\n const name = line.substring(splitIdx + 1).trim()\n\n if (!role) {\n return null\n }\n\n return [role, name]\n}\n\nexport const splitNameWithRule = (name: string, rule: string | RegExp) => {\n return name\n .split(rule)\n .map((item) => item.trim())\n .filter((item) => !!item)\n}\n","import type { DeepPartial } from '@music-lyric-kit/utils'\nimport type { Line, Meta } from '@music-lyric-kit/lyric'\nimport type { ExtractCreatorConfig } from './config'\n\nimport { DEFAULT_CREATOR_CONFIG } from './config'\nimport { DEFAULT_CREATOR_RULES } from './constants'\n\nimport { ConfigManager, removeTextSpaceAll } from '@music-lyric-kit/utils'\nimport { Matcher } from '@root/utils/match'\n\nimport { ParserPlugin, ParserStage, ParserContext } from '@music-lyric-kit/core'\nimport { LineType, MetaCreator } from '@music-lyric-kit/lyric'\nimport { extractCreator, splitNameWithRule } from './utils'\n\nexport class ExtractCreatorPlugin extends ParserPlugin {\n private matcher: Matcher\n\n override config = new ConfigManager<ExtractCreatorConfig, DeepPartial<ExtractCreatorConfig>>(DEFAULT_CREATOR_CONFIG)\n\n override get priority() {\n return 40\n }\n\n override get id() {\n return 'TRANSFORM-EXTRACT'\n }\n\n override get name() {\n return 'TRANSFORM-EXTRACT'\n }\n\n override get stage() {\n return ParserStage.Transform\n }\n\n constructor() {\n super()\n this.matcher = new Matcher(this.config.current.match, DEFAULT_CREATOR_RULES)\n this.config.on((opt) => {\n this.matcher.update(opt.match)\n })\n }\n\n override check(ctx: ParserContext) {\n return true\n }\n\n override exec(ctx: ParserContext) {\n const lines = ctx.result.lines\n if (!lines.length) {\n return\n }\n\n const newMetas: Meta[] = [...ctx.result.metas]\n const newLines: Line[] = []\n\n for (const line of lines) {\n if (line.type != LineType.Normal) {\n newLines.push(line)\n continue\n }\n\n const target = extractCreator(line.content.original)\n if (!target) {\n newLines.push(line)\n continue\n }\n\n const [role, name] = target\n const result = this.matcher.match(removeTextSpaceAll(role))\n if (!result) {\n newLines.push(line)\n continue\n }\n\n const meta = new MetaCreator()\n meta.content.role = role\n meta.content.name = splitNameWithRule(name, this.config.current.split)\n\n if (!this.config.current.replace) {\n newLines.push(line)\n }\n newMetas.push(meta)\n }\n\n ctx.result.lines = newLines\n ctx.result.metas = newMetas\n }\n}\n\nexport type { ExtractCreatorConfig }\n"],"names":["DEFAULT_CONFIG","DEFAULT_RULES","Matcher","options","defaultRules","raw","rule","target","a","b","str","line","extra","targetLine","i","thresholdPercent","targetMatchCount","matchedChars","matchedCount","stringRules","ruleLen","postion","j","matchResult","matchLen","pos","CLEAN_REGEXP","cleanText","text","removeTextSpaceAll","CleanPlugin","ParserPlugin","ConfigManager","ParserStage","opt","ctx","lines","linesLength","newLines","LineType","musicInfo","name","singer","item","clean","DEFAULT_CREATOR_CONFIG","CREATOR_RULES_ROLE","CREATOR_RULES_INST","DEFAULT_CREATOR_RULES","extractCreator","enColonIdx","cnColonIdx","splitIdx","role","splitNameWithRule","ExtractCreatorPlugin","newMetas","meta","MetaCreator"],"mappings":"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A;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAEMC,IAAkC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@music-lyric-kit/plugin-transform-pure",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "author": "folltoshe",
5
5
  "type": "module",
6
6
  "description": "Music Lyric Kit - Transform Pure Plugin",
@@ -28,9 +28,9 @@
28
28
  "dist"
29
29
  ],
30
30
  "dependencies": {
31
- "@music-lyric-kit/core": "0.3.1",
32
- "@music-lyric-kit/utils": "0.3.0",
33
- "@music-lyric-kit/lyric": "0.2.1"
31
+ "@music-lyric-kit/lyric": "0.3.0",
32
+ "@music-lyric-kit/utils": "0.4.0",
33
+ "@music-lyric-kit/core": "0.3.2"
34
34
  },
35
35
  "scripts": {
36
36
  "build": "vite build"