From e9c067c0b93cba572b14b17d4ea40b26ce8cd319 Mon Sep 17 00:00:00 2001 From: AnidlSupport <111142021+AnidlSupport@users.noreply.github.com> Date: Sat, 19 Aug 2023 18:58:55 +0000 Subject: [PATCH] New Sync beta --- modules/module.merger.ts | 120 +++++++++++++++++++++++++++------------ package.json | 1 + pnpm-lock.yaml | 111 ++++++++++++++++++++++++++++-------- 3 files changed, 173 insertions(+), 59 deletions(-) diff --git a/modules/module.merger.ts b/modules/module.merger.ts index 42a34bc..4f13bbc 100644 --- a/modules/module.merger.ts +++ b/modules/module.merger.ts @@ -8,6 +8,7 @@ import { exec } from './sei-helper-fixes'; import { console } from './log'; import ffprobe from 'ffprobe'; import ffprobeStatic from 'ffprobe-static'; +import lookssame from "looks-same"; export type MergerInput = { path: string, @@ -15,13 +16,15 @@ export type MergerInput = { duration?: number, delay?: number, isPrimary?: boolean, + frameRate?: number } export type SubtitleInput = { language: LanguageItem, file: string, closedCaption?: boolean, - delay?: number + delay?: number, + frameRate?: number } export type Font = keyof typeof fontFamilies; @@ -55,8 +58,11 @@ export type MergerOptions = { } } +const SECURITY_FRAMES = 30; +const MAX_OFFSET_SEC = 15; + class Merger { - + constructor(private options: MergerOptions) { if (this.options.skipSubMux) this.options.subtitles = []; @@ -65,7 +71,6 @@ class Merger { } public async createDelays() { - //Don't bother scanning it if there is only 1 vna stream if (this.options.videoAndAudio.length > 1) { const vnas = this.options.videoAndAudio; //get and set durations on each videoAndAudio Stream @@ -73,35 +78,64 @@ class Merger { const streamInfo = await ffprobe(vna.path, { path: ffprobeStatic.path }); const videoInfo = streamInfo.streams.filter(stream => stream.codec_type == 'video'); vnas[vnaIndex].duration = videoInfo[0].duration; + vnas[vnaIndex].frameRate = eval(videoInfo[0].avg_frame_rate) as number } //Sort videoAndAudio streams by duration (shortest first) vnas.sort((a,b) => { if (!a.duration || !b.duration) return -1; return a.duration - b.duration; }); - //Set Delays - const shortestDuration = vnas[0].duration; - for (const [vnaIndex, vna] of vnas.entries()) { - //Don't calculate the shortestDuration track - if (vnaIndex == 0) { - if (!vna.isPrimary && vna.isPrimary !== undefined) - console.warn('Shortest video isn\'t primary, this might lead to problems with subtitles. Please report on github or discord if you experience issues.'); - continue; - } - if (vna.duration && shortestDuration) { - //Calculate the tracks delay - vna.delay = Math.ceil((vna.duration-shortestDuration) * 1000) / 1000; - //TODO: set primary language for audio so it can be used to determine which track needs the delay - //The above is a problem in the event that it isn't the dub that needs the delay, but rather the sub. - //Alternatively: Might not work: it could be checked if there are multiple of the same video language, and if there is - //more than 1 of the same video language, then do the subtitle delay on CC, else normal language. - const subtitles = this.options.subtitles.filter(sub => sub.language.code == vna.lang.code); - for (const [subIndex, sub] of subtitles.entries()) { - if (vna.isPrimary) subtitles[subIndex].delay = vna.delay; - else if (sub.closedCaption) subtitles[subIndex].delay = vna.delay; + + for (let item of vnas) { + fs.mkdirSync(`temp-${item.lang.code}`, { recursive: true }); + exec("ffmpeg", "ffmpeg", `-i "${item.path}" -t ${MAX_OFFSET_SEC} temp-${item.lang.code}/%03d.png`) + } + + let start = vnas[0]; + + console.info(`Using ${start.lang.code} as the base for syncing`); + let items = fs.readdirSync(`temp-${start.lang.code}`) + itemLoop: for (const vna of vnas.slice(1)) { + console.info(`Trying to find delay for ${vna.lang.code}...`) + for (let [index, file] of items.entries()) { + console.info(`${Math.ceil( (index / items.length) * 100 )} %`) + outer: for (let i = 1; i <= items.length; i++) { + let number = i.toString(); + number = "0".repeat(3 - number.length) + number; + + let result = await lookssame(`temp-${start.lang.code}/${file}`, `temp-${vna.lang.code}/${number}.png`); + if (result.equal) { + for (let b = i; b < Math.min(items.length, i + SECURITY_FRAMES); b++) { + let number = b.toString(); + number = "0".repeat(3 - number.length) + number; + if (!await lookssame(`temp-${start.lang.code}/${file}`, `temp-${vna.lang.code}/${number}.png`)) { + continue outer; + } + } + vna.delay = i; + const subtitles = this.options.subtitles.filter(sub => sub.language.code == vna.lang.code); + for (const [subIndex, sub] of subtitles.entries()) { + if (vna.isPrimary) { + subtitles[subIndex].delay = vna.delay; + subtitles[subIndex].frameRate = vna.frameRate; + } else if (sub.closedCaption) { + subtitles[subIndex].delay = vna.delay + subtitles[subIndex].frameRate = vna.frameRate; + }; + } + + console.info(`Found ${vna.delay} frames delay for ${vna.lang.code}`) + continue itemLoop; + } } } + console.error(`Unable to find delay for ${vna.lang.code}`); } + for (let item of vnas) { + fs.rmSync(`temp-${item.lang.code}`, { recursive: true, force: true }); + } + + console.info(`Processed all files to find a delay.`) } } @@ -115,9 +149,13 @@ class Merger { for (const vid of this.options.videoAndAudio) { if (vid.delay && hasVideo) { - args.push( - `-itsoffset -${Math.ceil(vid.delay*1000)}ms` - ); + if (vid.frameRate) { + args.push( + `-ss ${Math.ceil(vid.delay * (1000 / vid.frameRate))}ms` + ); + } else { + console.error(`Missing framerate for video ${vid.lang.code}`) + } } args.push(`-i "${vid.path}"`); if (!hasVideo || this.options.keepAllVideos) { @@ -154,9 +192,13 @@ class Merger { for (const index in this.options.subtitles) { const sub = this.options.subtitles[index]; if (sub.delay) { - args.push( - `-itsoffset -${Math.ceil(sub.delay*1000)}ms` - ); + if (sub.frameRate) { + args.push( + `-ss ${Math.ceil(sub.delay * (1000 / sub.frameRate))}ms` + ); + } else { + console.error(`Missing framerate for subtitle: ${JSON.stringify(sub)}`) + } } args.push(`-i "${sub.file}"`); } @@ -222,8 +264,12 @@ class Merger { const audioTrackNum = this.options.inverseTrackOrder ? '0' : '1'; const videoTrackNum = this.options.inverseTrackOrder ? '1' : '0'; if (vid.delay) { + if (!vid.frameRate) { + console.error(`Unable to find framerate for stream ${vid.lang.code}`) + continue; + } args.push( - `--sync ${audioTrackNum}:-${Math.ceil(vid.delay*1000)}` + `--sync ${audioTrackNum}:-${Math.ceil(vid.delay*(1000 / vid.frameRate))}` ); } if (!hasVideo || this.options.keepAllVideos) { @@ -276,9 +322,13 @@ class Merger { if (this.options.subtitles.length > 0) { for (const subObj of this.options.subtitles) { if (subObj.delay) { - args.push( - `--sync 0:-${Math.ceil(subObj.delay*1000)}` - ); + if (subObj.frameRate) { + args.push( + `--sync 0:-${Math.ceil(subObj.delay*(1000 / subObj.frameRate))}` + ); + } else { + console.error(`Missing framerate for subtitle: ${JSON.stringify(subObj)}`) + } } args.push('--track-name', `0:"${(subObj.language.language || subObj.language.name) + `${subObj.closedCaption === true ? ` ${this.options.ccTag}` : ''}`}"`); args.push('--language', `0:"${subObj.language.code}"`); @@ -369,7 +419,7 @@ class Merger { path: fontPath, mime: mime, }); - } + } } } } @@ -409,4 +459,4 @@ class Merger { } -export default Merger; \ No newline at end of file +export default Merger; diff --git a/package.json b/package.json index 8acf26c..5f63d9f 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,7 @@ "iso-639": "^0.2.2", "log4js": "^6.9.1", "lookpath": "^1.2.2", + "looks-same": "^8.2.1", "m3u8-parsed": "^1.3.0", "open": "^8.4.2", "sei-helper": "^3.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5a0db97..fcdc172 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,9 +1,5 @@ lockfileVersion: '6.0' -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - dependencies: '@babel/core': specifier: ^7.22.9 @@ -53,6 +49,9 @@ dependencies: lookpath: specifier: ^1.2.2 version: 1.2.2 + looks-same: + specifier: ^8.2.1 + version: 8.2.1 m3u8-parsed: specifier: ^1.3.0 version: 1.3.0 @@ -2629,7 +2628,6 @@ packages: /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: true /cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} @@ -2654,6 +2652,10 @@ packages: mimic-response: 1.0.1 dev: false + /color-convert@0.5.3: + resolution: {integrity: sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==} + dev: false + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -2665,12 +2667,31 @@ packages: dependencies: color-name: 1.1.4 + /color-diff@1.4.0: + resolution: {integrity: sha512-4oDB/o78lNdppbaqrg0HjOp7pHmUc+dfCxWKWFnQg6AB/1dkjtBDop3RZht5386cq9xBUDRvDvSCA7WUlM9Jqw==} + dev: false + /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + /combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -2837,7 +2858,6 @@ packages: /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} - dev: true /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -2883,7 +2903,6 @@ packages: /detect-libc@2.0.1: resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} engines: {node: '>=8'} - dev: true /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} @@ -3458,7 +3477,6 @@ packages: /expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} - dev: true /express@4.18.2: resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} @@ -3612,7 +3630,6 @@ packages: /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: true /fs-extra@11.1.1: resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} @@ -3691,7 +3708,6 @@ packages: /github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - dev: true /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -3895,7 +3911,6 @@ packages: /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} @@ -3937,6 +3952,10 @@ packages: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: @@ -4088,6 +4107,11 @@ packages: resolution: {integrity: sha512-t1ZNgV1kLZ4dBQGxtY4z5oysRFPANt0kqHjomasflQW0w+YdDRF+Wsl0gFftIeUiP508KhZxG3MXQ31Swd643Q==} dev: false + /js-graph-algorithms@1.0.18: + resolution: {integrity: sha512-Gu1wtWzXBzGeye/j9BuyplGHscwqKRZodp/0M1vyBc19RJpblSwKGu099KwwaTx9cRIV+Qupk8xUMfEiGfFqSA==} + hasBin: true + dev: false + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -4200,7 +4224,6 @@ packages: /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true /log4js@6.9.1: resolution: {integrity: sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==} @@ -4221,6 +4244,19 @@ packages: hasBin: true dev: false + /looks-same@8.2.1: + resolution: {integrity: sha512-55u5dWPWc/9cIFRtDjqbH/J3h0nyar1gqFrDIDQSpqYDDd19dZUQtTMxLj0hvsxzp/qzQ0EV0HChtXRWylY2Pg==} + engines: {node: '>= 12.0.0'} + dependencies: + color-diff: 1.4.0 + fs-extra: 8.1.0 + js-graph-algorithms: 1.0.18 + lodash: 4.17.21 + nested-error-stacks: 2.1.1 + parse-color: 1.0.0 + sharp: 0.30.7 + dev: false + /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -4330,7 +4366,6 @@ packages: /mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - dev: true /ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -4351,7 +4386,6 @@ packages: /napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - dev: true /native-promise-only@0.8.1: resolution: {integrity: sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==} @@ -4369,12 +4403,19 @@ packages: engines: {node: '>= 0.6'} dev: false + /nested-error-stacks@2.1.1: + resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==} + dev: false + /node-abi@3.35.0: resolution: {integrity: sha512-jAlSOFR1Bls963NmFwxeQkNTzqjUF0NThm8Le7eRIRGzFUVJuMOFZDLv5Y30W/Oaw+KEebEJLAigwO9gQHoEmw==} engines: {node: '>=10'} dependencies: semver: 7.3.8 - dev: true + + /node-addon-api@5.1.0: + resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + dev: false /node-fetch@2.6.9: resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} @@ -4527,6 +4568,12 @@ packages: dependencies: callsites: 3.1.0 + /parse-color@1.0.0: + resolution: {integrity: sha512-fuDHYgFHJGbpGMgw9skY/bj3HL/Jrn4l/5rSspy00DoT4RyLnDcRvPxdZ+r6OFwIsgAuhDh4I09tAId4mI12bw==} + dependencies: + color-convert: 0.5.3 + dev: false + /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -4647,7 +4694,6 @@ packages: simple-get: 4.0.1 tar-fs: 2.1.1 tunnel-agent: 0.6.0 - dev: true /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -4731,7 +4777,6 @@ packages: ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 - dev: true /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -4900,7 +4945,6 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 - dev: true /semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} @@ -4946,6 +4990,21 @@ packages: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: false + /sharp@0.30.7: + resolution: {integrity: sha512-G+MY2YW33jgflKPTXXptVO28HvNOo9G3j0MybYAHeEmby+QuD2U98dT6ueht9cv/XDqZspSpIhoSW+BAKJ7Hig==} + engines: {node: '>=12.13.0'} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.1 + node-addon-api: 5.1.0 + prebuild-install: 7.1.1 + semver: 7.5.4 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -4965,7 +5024,6 @@ packages: /simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - dev: true /simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} @@ -4973,7 +5031,12 @@ packages: decompress-response: 6.0.0 once: 1.4.0 simple-concat: 1.0.1 - dev: true + + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} @@ -5079,7 +5142,6 @@ packages: /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} - dev: true /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} @@ -5108,7 +5170,6 @@ packages: mkdirp-classic: 0.5.3 pump: 3.0.0 tar-stream: 2.2.0 - dev: true /tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} @@ -5119,7 +5180,6 @@ packages: fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -5212,7 +5272,6 @@ packages: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} dependencies: safe-buffer: 5.2.1 - dev: true /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -5475,3 +5534,7 @@ packages: /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false