Content-addressed version deploy system for Diffuse elements.diffuse.sh

chore: deploy 4.0.0-alpha update

+14086 -1
+4
artifacts/artifacts.json
··· 14 14 "bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou": { 15 15 "cid": "bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou", 16 16 "version": "4.0.0-alpha" 17 + }, 18 + "bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da": { 19 + "cid": "bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da", 20 + "version": "4.0.0-alpha" 17 21 } 18 22 }
+16
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/APEv2Parser-7M4PAZ3N.js
··· 1 + import { 2 + APEv2Parser, 3 + ApeContentError, 4 + tryParseApeHeader 5 + } from "./chunk-CSVVW572.js"; 6 + import "./chunk-6AX6SYMQ.js"; 7 + import "./chunk-FGRUWWG5.js"; 8 + import "./chunk-ETGVMC2T.js"; 9 + import "./chunk-7IARE43G.js"; 10 + export { 11 + APEv2Parser, 12 + ApeContentError, 13 + tryParseApeHeader 14 + }; 15 + 16 + //# sourceMappingURL=./APEv2Parser-7M4PAZ3N.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/APEv2Parser-7M4PAZ3N.js.map
··· 1 + {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/APEv2Parser-7M4PAZ3N.js.map"}
+201
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/AiffParser-EXCORBCX.js
··· 1 + import { 2 + ID3v2Parser 3 + } from "./chunk-QOFAJIKO.js"; 4 + import "./chunk-Z6RWJW2M.js"; 5 + import "./chunk-SGG7NSCF.js"; 6 + import { 7 + FourCcToken 8 + } from "./chunk-CSVVW572.js"; 9 + import "./chunk-6AX6SYMQ.js"; 10 + import { 11 + EndOfStreamError, 12 + fromBuffer 13 + } from "./chunk-FGRUWWG5.js"; 14 + import { 15 + BasicParser, 16 + StringType, 17 + UINT16_BE, 18 + UINT32_BE, 19 + UINT8, 20 + Uint8ArrayType, 21 + makeUnexpectedFileContentError, 22 + require_src 23 + } from "./chunk-ETGVMC2T.js"; 24 + import { 25 + __name, 26 + __toESM 27 + } from "./chunk-7IARE43G.js"; 28 + 29 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/aiff/AiffParser.js 30 + var import_debug = __toESM(require_src()); 31 + 32 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/aiff/AiffToken.js 33 + var compressionTypes = { 34 + NONE: "not compressed PCM Apple Computer", 35 + sowt: "PCM (byte swapped)", 36 + fl32: "32-bit floating point IEEE 32-bit float", 37 + fl64: "64-bit floating point IEEE 64-bit float Apple Computer", 38 + alaw: "ALaw 2:1 8-bit ITU-T G.711 A-law", 39 + ulaw: "\xB5Law 2:1 8-bit ITU-T G.711 \xB5-law Apple Computer", 40 + ULAW: "CCITT G.711 u-law 8-bit ITU-T G.711 \xB5-law", 41 + ALAW: "CCITT G.711 A-law 8-bit ITU-T G.711 A-law", 42 + FL32: "Float 32 IEEE 32-bit float " 43 + }; 44 + var AiffContentError = class extends makeUnexpectedFileContentError("AIFF") { 45 + static { 46 + __name(this, "AiffContentError"); 47 + } 48 + }; 49 + var Common = class { 50 + static { 51 + __name(this, "Common"); 52 + } 53 + constructor(header, isAifc) { 54 + this.isAifc = isAifc; 55 + const minimumChunkSize = isAifc ? 22 : 18; 56 + if (header.chunkSize < minimumChunkSize) 57 + throw new AiffContentError(`COMMON CHUNK size should always be at least ${minimumChunkSize}`); 58 + this.len = header.chunkSize; 59 + } 60 + get(buf, off) { 61 + const shift = UINT16_BE.get(buf, off + 8) - 16398; 62 + const baseSampleRate = UINT16_BE.get(buf, off + 8 + 2); 63 + const res = { 64 + numChannels: UINT16_BE.get(buf, off), 65 + numSampleFrames: UINT32_BE.get(buf, off + 2), 66 + sampleSize: UINT16_BE.get(buf, off + 6), 67 + sampleRate: shift < 0 ? baseSampleRate >> Math.abs(shift) : baseSampleRate << shift 68 + }; 69 + if (this.isAifc) { 70 + res.compressionType = FourCcToken.get(buf, off + 18); 71 + if (this.len > 22) { 72 + const strLen = UINT8.get(buf, off + 22); 73 + if (strLen > 0) { 74 + const padding = (strLen + 1) % 2; 75 + if (23 + strLen + padding === this.len) { 76 + res.compressionName = new StringType(strLen, "latin1").get(buf, off + 23); 77 + } else { 78 + throw new AiffContentError("Illegal pstring length"); 79 + } 80 + } else { 81 + res.compressionName = void 0; 82 + } 83 + } 84 + } else { 85 + res.compressionName = "PCM"; 86 + } 87 + return res; 88 + } 89 + }; 90 + 91 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/iff/index.js 92 + var Header = { 93 + len: 8, 94 + get: /* @__PURE__ */ __name((buf, off) => { 95 + return { 96 + // Chunk type ID 97 + chunkID: FourCcToken.get(buf, off), 98 + // Chunk size 99 + chunkSize: Number(BigInt(UINT32_BE.get(buf, off + 4))) 100 + }; 101 + }, "get") 102 + }; 103 + 104 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/aiff/AiffParser.js 105 + var debug = (0, import_debug.default)("music-metadata:parser:aiff"); 106 + var AIFFParser = class extends BasicParser { 107 + static { 108 + __name(this, "AIFFParser"); 109 + } 110 + constructor() { 111 + super(...arguments); 112 + this.isCompressed = null; 113 + } 114 + async parse() { 115 + const header = await this.tokenizer.readToken(Header); 116 + if (header.chunkID !== "FORM") 117 + throw new AiffContentError("Invalid Chunk-ID, expected 'FORM'"); 118 + const type = await this.tokenizer.readToken(FourCcToken); 119 + switch (type) { 120 + case "AIFF": 121 + this.metadata.setFormat("container", type); 122 + this.isCompressed = false; 123 + break; 124 + case "AIFC": 125 + this.metadata.setFormat("container", "AIFF-C"); 126 + this.isCompressed = true; 127 + break; 128 + default: 129 + throw new AiffContentError(`Unsupported AIFF type: ${type}`); 130 + } 131 + this.metadata.setFormat("lossless", !this.isCompressed); 132 + this.metadata.setAudioOnly(); 133 + try { 134 + while (!this.tokenizer.fileInfo.size || this.tokenizer.fileInfo.size - this.tokenizer.position >= Header.len) { 135 + debug(`Reading AIFF chunk at offset=${this.tokenizer.position}`); 136 + const chunkHeader = await this.tokenizer.readToken(Header); 137 + const nextChunk = 2 * Math.round(chunkHeader.chunkSize / 2); 138 + const bytesRead = await this.readData(chunkHeader); 139 + await this.tokenizer.ignore(nextChunk - bytesRead); 140 + } 141 + } catch (err) { 142 + if (err instanceof EndOfStreamError) { 143 + debug("End-of-stream"); 144 + } else { 145 + throw err; 146 + } 147 + } 148 + } 149 + async readData(header) { 150 + switch (header.chunkID) { 151 + case "COMM": { 152 + if (this.isCompressed === null) { 153 + throw new AiffContentError("Failed to parse AIFF.COMM chunk when compression type is unknown"); 154 + } 155 + const common = await this.tokenizer.readToken(new Common(header, this.isCompressed)); 156 + this.metadata.setFormat("bitsPerSample", common.sampleSize); 157 + this.metadata.setFormat("sampleRate", common.sampleRate); 158 + this.metadata.setFormat("numberOfChannels", common.numChannels); 159 + this.metadata.setFormat("numberOfSamples", common.numSampleFrames); 160 + this.metadata.setFormat("duration", common.numSampleFrames / common.sampleRate); 161 + if (common.compressionName || common.compressionType) { 162 + this.metadata.setFormat("codec", common.compressionName ?? compressionTypes[common.compressionType]); 163 + } 164 + return header.chunkSize; 165 + } 166 + case "ID3 ": { 167 + const id3_data = await this.tokenizer.readToken(new Uint8ArrayType(header.chunkSize)); 168 + const rst = fromBuffer(id3_data); 169 + await new ID3v2Parser().parse(this.metadata, rst, this.options); 170 + return header.chunkSize; 171 + } 172 + case "SSND": 173 + if (this.metadata.format.duration) { 174 + this.metadata.setFormat("bitrate", 8 * header.chunkSize / this.metadata.format.duration); 175 + } 176 + return 0; 177 + case "NAME": 178 + // Sample name chunk 179 + case "AUTH": 180 + // Author chunk 181 + case "(c) ": 182 + // Copyright chunk 183 + case "ANNO": 184 + return this.readTextChunk(header); 185 + default: 186 + debug(`Ignore chunk id=${header.chunkID}, size=${header.chunkSize}`); 187 + return 0; 188 + } 189 + } 190 + async readTextChunk(header) { 191 + const value = await this.tokenizer.readToken(new StringType(header.chunkSize, "ascii")); 192 + const values = value.split("\0").map((v) => v.trim()).filter((v) => v?.length); 193 + await Promise.all(values.map((v) => this.metadata.addTag("AIFF", header.chunkID, v))); 194 + return header.chunkSize; 195 + } 196 + }; 197 + export { 198 + AIFFParser 199 + }; 200 + 201 + //# sourceMappingURL=./AiffParser-EXCORBCX.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/AiffParser-EXCORBCX.js.map
··· 1 + {"version":3,"sources":["/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/aiff/AiffParser.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/aiff/AiffToken.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/iff/index.js"],"sourcesContent":["import * as Token from 'token-types';\nimport initDebug from 'debug';\nimport * as strtok3 from 'strtok3';\nimport { ID3v2Parser } from '../id3v2/ID3v2Parser.js';\nimport { FourCcToken } from '../common/FourCC.js';\nimport { BasicParser } from '../common/BasicParser.js';\nimport * as AiffToken from './AiffToken.js';\nimport { AiffContentError, compressionTypes } from './AiffToken.js';\nimport * as iff from '../iff/index.js';\nconst debug = initDebug('music-metadata:parser:aiff');\n/**\n * AIFF - Audio Interchange File Format\n *\n * Ref:\n * - http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/AIFF/AIFF.html\n * - http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/AIFF/Docs/AIFF-1.3.pdf\n */\nexport class AIFFParser extends BasicParser {\n constructor() {\n super(...arguments);\n this.isCompressed = null;\n }\n async parse() {\n const header = await this.tokenizer.readToken(iff.Header);\n if (header.chunkID !== 'FORM')\n throw new AiffContentError('Invalid Chunk-ID, expected \\'FORM\\''); // Not AIFF format\n const type = await this.tokenizer.readToken(FourCcToken);\n switch (type) {\n case 'AIFF':\n this.metadata.setFormat('container', type);\n this.isCompressed = false;\n break;\n case 'AIFC':\n this.metadata.setFormat('container', 'AIFF-C');\n this.isCompressed = true;\n break;\n default:\n throw new AiffContentError(`Unsupported AIFF type: ${type}`);\n }\n this.metadata.setFormat('lossless', !this.isCompressed);\n this.metadata.setAudioOnly();\n try {\n while (!this.tokenizer.fileInfo.size || this.tokenizer.fileInfo.size - this.tokenizer.position >= iff.Header.len) {\n debug(`Reading AIFF chunk at offset=${this.tokenizer.position}`);\n const chunkHeader = await this.tokenizer.readToken(iff.Header);\n const nextChunk = 2 * Math.round(chunkHeader.chunkSize / 2);\n const bytesRead = await this.readData(chunkHeader);\n await this.tokenizer.ignore(nextChunk - bytesRead);\n }\n }\n catch (err) {\n if (err instanceof strtok3.EndOfStreamError) {\n debug(\"End-of-stream\");\n }\n else {\n throw err;\n }\n }\n }\n async readData(header) {\n switch (header.chunkID) {\n case 'COMM': { // The Common Chunk\n if (this.isCompressed === null) {\n throw new AiffContentError('Failed to parse AIFF.COMM chunk when compression type is unknown');\n }\n const common = await this.tokenizer.readToken(new AiffToken.Common(header, this.isCompressed));\n this.metadata.setFormat('bitsPerSample', common.sampleSize);\n this.metadata.setFormat('sampleRate', common.sampleRate);\n this.metadata.setFormat('numberOfChannels', common.numChannels);\n this.metadata.setFormat('numberOfSamples', common.numSampleFrames);\n this.metadata.setFormat('duration', common.numSampleFrames / common.sampleRate);\n if (common.compressionName || common.compressionType) {\n this.metadata.setFormat('codec', common.compressionName ?? compressionTypes[common.compressionType]);\n }\n return header.chunkSize;\n }\n case 'ID3 ': { // ID3-meta-data\n const id3_data = await this.tokenizer.readToken(new Token.Uint8ArrayType(header.chunkSize));\n const rst = strtok3.fromBuffer(id3_data);\n await new ID3v2Parser().parse(this.metadata, rst, this.options);\n return header.chunkSize;\n }\n case 'SSND': // Sound Data Chunk\n if (this.metadata.format.duration) {\n this.metadata.setFormat('bitrate', 8 * header.chunkSize / this.metadata.format.duration);\n }\n return 0;\n case 'NAME': // Sample name chunk\n case 'AUTH': // Author chunk\n case '(c) ': // Copyright chunk\n case 'ANNO': // Annotation chunk\n return this.readTextChunk(header);\n default:\n debug(`Ignore chunk id=${header.chunkID}, size=${header.chunkSize}`);\n return 0;\n }\n }\n async readTextChunk(header) {\n const value = await this.tokenizer.readToken(new Token.StringType(header.chunkSize, 'ascii'));\n const values = value.split('\\0').map(v => v.trim()).filter(v => v?.length);\n await Promise.all(values.map(v => this.metadata.addTag('AIFF', header.chunkID, v)));\n return header.chunkSize;\n }\n}\n","import * as Token from 'token-types';\nimport { FourCcToken } from '../common/FourCC.js';\nimport { makeUnexpectedFileContentError } from '../ParseError.js';\nexport const compressionTypes = {\n NONE: 'not compressed\tPCM\tApple Computer',\n sowt: 'PCM (byte swapped)',\n fl32: '32-bit floating point IEEE 32-bit float',\n fl64: '64-bit floating point IEEE 64-bit float\tApple Computer',\n alaw: 'ALaw 2:1\t8-bit ITU-T G.711 A-law',\n ulaw: 'µLaw 2:1\t8-bit ITU-T G.711 µ-law\tApple Computer',\n ULAW: 'CCITT G.711 u-law 8-bit ITU-T G.711 µ-law',\n ALAW: 'CCITT G.711 A-law 8-bit ITU-T G.711 A-law',\n FL32: 'Float 32\tIEEE 32-bit float '\n};\nexport class AiffContentError extends makeUnexpectedFileContentError('AIFF') {\n}\nexport class Common {\n constructor(header, isAifc) {\n this.isAifc = isAifc;\n const minimumChunkSize = isAifc ? 22 : 18;\n if (header.chunkSize < minimumChunkSize)\n throw new AiffContentError(`COMMON CHUNK size should always be at least ${minimumChunkSize}`);\n this.len = header.chunkSize;\n }\n get(buf, off) {\n // see: https://cycling74.com/forums/aiffs-80-bit-sample-rate-value\n const shift = Token.UINT16_BE.get(buf, off + 8) - 16398;\n const baseSampleRate = Token.UINT16_BE.get(buf, off + 8 + 2);\n const res = {\n numChannels: Token.UINT16_BE.get(buf, off),\n numSampleFrames: Token.UINT32_BE.get(buf, off + 2),\n sampleSize: Token.UINT16_BE.get(buf, off + 6),\n sampleRate: shift < 0 ? baseSampleRate >> Math.abs(shift) : baseSampleRate << shift\n };\n if (this.isAifc) {\n res.compressionType = FourCcToken.get(buf, off + 18);\n if (this.len > 22) {\n const strLen = Token.UINT8.get(buf, off + 22);\n if (strLen > 0) {\n const padding = (strLen + 1) % 2;\n if (23 + strLen + padding === this.len) {\n res.compressionName = new Token.StringType(strLen, 'latin1').get(buf, off + 23);\n }\n else {\n throw new AiffContentError('Illegal pstring length');\n }\n }\n else {\n res.compressionName = undefined;\n }\n }\n }\n else {\n res.compressionName = 'PCM';\n }\n return res;\n }\n}\n","import * as Token from 'token-types';\nimport { FourCcToken } from '../common/FourCC.js';\n/**\n * Common AIFF chunk header\n */\nexport const Header = {\n len: 8,\n get: (buf, off) => {\n return {\n // Chunk type ID\n chunkID: FourCcToken.get(buf, off),\n // Chunk size\n chunkSize: Number(BigInt(Token.UINT32_BE.get(buf, off + 4)))\n };\n }\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,mBAAsB;;;ACEf,IAAM,mBAAmB;AAAA,EAC5B,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACV;AACO,IAAM,mBAAN,cAA+B,+BAA+B,MAAM,EAAE;AAAA,EAd7E,OAc6E;AAAA;AAAA;AAC7E;AACO,IAAM,SAAN,MAAa;AAAA,EAhBpB,OAgBoB;AAAA;AAAA;AAAA,EAChB,YAAY,QAAQ,QAAQ;AACxB,SAAK,SAAS;AACd,UAAM,mBAAmB,SAAS,KAAK;AACvC,QAAI,OAAO,YAAY;AACnB,YAAM,IAAI,iBAAiB,+CAA+C,gBAAgB,EAAE;AAChG,SAAK,MAAM,OAAO;AAAA,EACtB;AAAA,EACA,IAAI,KAAK,KAAK;AAEV,UAAM,QAAc,UAAU,IAAI,KAAK,MAAM,CAAC,IAAI;AAClD,UAAM,iBAAuB,UAAU,IAAI,KAAK,MAAM,IAAI,CAAC;AAC3D,UAAM,MAAM;AAAA,MACR,aAAmB,UAAU,IAAI,KAAK,GAAG;AAAA,MACzC,iBAAuB,UAAU,IAAI,KAAK,MAAM,CAAC;AAAA,MACjD,YAAkB,UAAU,IAAI,KAAK,MAAM,CAAC;AAAA,MAC5C,YAAY,QAAQ,IAAI,kBAAkB,KAAK,IAAI,KAAK,IAAI,kBAAkB;AAAA,IAClF;AACA,QAAI,KAAK,QAAQ;AACb,UAAI,kBAAkB,YAAY,IAAI,KAAK,MAAM,EAAE;AACnD,UAAI,KAAK,MAAM,IAAI;AACf,cAAM,SAAe,MAAM,IAAI,KAAK,MAAM,EAAE;AAC5C,YAAI,SAAS,GAAG;AACZ,gBAAM,WAAW,SAAS,KAAK;AAC/B,cAAI,KAAK,SAAS,YAAY,KAAK,KAAK;AACpC,gBAAI,kBAAkB,IAAU,WAAW,QAAQ,QAAQ,EAAE,IAAI,KAAK,MAAM,EAAE;AAAA,UAClF,OACK;AACD,kBAAM,IAAI,iBAAiB,wBAAwB;AAAA,UACvD;AAAA,QACJ,OACK;AACD,cAAI,kBAAkB;AAAA,QAC1B;AAAA,MACJ;AAAA,IACJ,OACK;AACD,UAAI,kBAAkB;AAAA,IAC1B;AACA,WAAO;AAAA,EACX;AACJ;;;ACpDO,IAAM,SAAS;AAAA,EAClB,KAAK;AAAA,EACL,KAAK,wBAAC,KAAK,QAAQ;AACf,WAAO;AAAA;AAAA,MAEH,SAAS,YAAY,IAAI,KAAK,GAAG;AAAA;AAAA,MAEjC,WAAW,OAAO,OAAa,UAAU,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC;AAAA,IAC/D;AAAA,EACJ,GAPK;AAQT;;;AFNA,IAAM,YAAQ,aAAAA,SAAU,4BAA4B;AAQ7C,IAAM,aAAN,cAAyB,YAAY;AAAA,EAjB5C,OAiB4C;AAAA;AAAA;AAAA,EACxC,cAAc;AACV,UAAM,GAAG,SAAS;AAClB,SAAK,eAAe;AAAA,EACxB;AAAA,EACA,MAAM,QAAQ;AACV,UAAM,SAAS,MAAM,KAAK,UAAU,UAAc,MAAM;AACxD,QAAI,OAAO,YAAY;AACnB,YAAM,IAAI,iBAAiB,mCAAqC;AACpE,UAAM,OAAO,MAAM,KAAK,UAAU,UAAU,WAAW;AACvD,YAAQ,MAAM;AAAA,MACV,KAAK;AACD,aAAK,SAAS,UAAU,aAAa,IAAI;AACzC,aAAK,eAAe;AACpB;AAAA,MACJ,KAAK;AACD,aAAK,SAAS,UAAU,aAAa,QAAQ;AAC7C,aAAK,eAAe;AACpB;AAAA,MACJ;AACI,cAAM,IAAI,iBAAiB,0BAA0B,IAAI,EAAE;AAAA,IACnE;AACA,SAAK,SAAS,UAAU,YAAY,CAAC,KAAK,YAAY;AACtD,SAAK,SAAS,aAAa;AAC3B,QAAI;AACA,aAAO,CAAC,KAAK,UAAU,SAAS,QAAQ,KAAK,UAAU,SAAS,OAAO,KAAK,UAAU,YAAgB,OAAO,KAAK;AAC9G,cAAM,gCAAgC,KAAK,UAAU,QAAQ,EAAE;AAC/D,cAAM,cAAc,MAAM,KAAK,UAAU,UAAc,MAAM;AAC7D,cAAM,YAAY,IAAI,KAAK,MAAM,YAAY,YAAY,CAAC;AAC1D,cAAM,YAAY,MAAM,KAAK,SAAS,WAAW;AACjD,cAAM,KAAK,UAAU,OAAO,YAAY,SAAS;AAAA,MACrD;AAAA,IACJ,SACO,KAAK;AACR,UAAI,eAAuB,kBAAkB;AACzC,cAAM,eAAe;AAAA,MACzB,OACK;AACD,cAAM;AAAA,MACV;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,MAAM,SAAS,QAAQ;AACnB,YAAQ,OAAO,SAAS;AAAA,MACpB,KAAK,QAAQ;AACT,YAAI,KAAK,iBAAiB,MAAM;AAC5B,gBAAM,IAAI,iBAAiB,kEAAkE;AAAA,QACjG;AACA,cAAM,SAAS,MAAM,KAAK,UAAU,UAAU,IAAc,OAAO,QAAQ,KAAK,YAAY,CAAC;AAC7F,aAAK,SAAS,UAAU,iBAAiB,OAAO,UAAU;AAC1D,aAAK,SAAS,UAAU,cAAc,OAAO,UAAU;AACvD,aAAK,SAAS,UAAU,oBAAoB,OAAO,WAAW;AAC9D,aAAK,SAAS,UAAU,mBAAmB,OAAO,eAAe;AACjE,aAAK,SAAS,UAAU,YAAY,OAAO,kBAAkB,OAAO,UAAU;AAC9E,YAAI,OAAO,mBAAmB,OAAO,iBAAiB;AAClD,eAAK,SAAS,UAAU,SAAS,OAAO,mBAAmB,iBAAiB,OAAO,eAAe,CAAC;AAAA,QACvG;AACA,eAAO,OAAO;AAAA,MAClB;AAAA,MACA,KAAK,QAAQ;AACT,cAAM,WAAW,MAAM,KAAK,UAAU,UAAU,IAAU,eAAe,OAAO,SAAS,CAAC;AAC1F,cAAM,MAAc,WAAW,QAAQ;AACvC,cAAM,IAAI,YAAY,EAAE,MAAM,KAAK,UAAU,KAAK,KAAK,OAAO;AAC9D,eAAO,OAAO;AAAA,MAClB;AAAA,MACA,KAAK;AACD,YAAI,KAAK,SAAS,OAAO,UAAU;AAC/B,eAAK,SAAS,UAAU,WAAW,IAAI,OAAO,YAAY,KAAK,SAAS,OAAO,QAAQ;AAAA,QAC3F;AACA,eAAO;AAAA,MACX,KAAK;AAAA;AAAA,MACL,KAAK;AAAA;AAAA,MACL,KAAK;AAAA;AAAA,MACL,KAAK;AACD,eAAO,KAAK,cAAc,MAAM;AAAA,MACpC;AACI,cAAM,mBAAmB,OAAO,OAAO,UAAU,OAAO,SAAS,EAAE;AACnE,eAAO;AAAA,IACf;AAAA,EACJ;AAAA,EACA,MAAM,cAAc,QAAQ;AACxB,UAAM,QAAQ,MAAM,KAAK,UAAU,UAAU,IAAU,WAAW,OAAO,WAAW,OAAO,CAAC;AAC5F,UAAM,SAAS,MAAM,MAAM,IAAI,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAK,GAAG,MAAM;AACzE,UAAM,QAAQ,IAAI,OAAO,IAAI,OAAK,KAAK,SAAS,OAAO,QAAQ,OAAO,SAAS,CAAC,CAAC,CAAC;AAClF,WAAO,OAAO;AAAA,EAClB;AACJ;","names":["initDebug"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/AiffParser-EXCORBCX.js.map"}
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/AsfParser-N6VZQ5OP.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/AsfParser-N6VZQ5OP.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/AsfParser-N6VZQ5OP.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/AsfParser-N6VZQ5OP.js.map
+197
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/DsdiffParser-DF4OM5HV.js
··· 1 + import { 2 + ID3v2Parser 3 + } from "./chunk-QOFAJIKO.js"; 4 + import "./chunk-Z6RWJW2M.js"; 5 + import "./chunk-SGG7NSCF.js"; 6 + import { 7 + FourCcToken 8 + } from "./chunk-CSVVW572.js"; 9 + import "./chunk-6AX6SYMQ.js"; 10 + import { 11 + fromBuffer 12 + } from "./chunk-FGRUWWG5.js"; 13 + import { 14 + BasicParser, 15 + INT64_BE, 16 + StringType, 17 + UINT16_BE, 18 + UINT32_BE, 19 + UINT32_LE, 20 + UINT8, 21 + Uint8ArrayType, 22 + makeUnexpectedFileContentError, 23 + require_src 24 + } from "./chunk-ETGVMC2T.js"; 25 + import { 26 + __name, 27 + __toESM 28 + } from "./chunk-7IARE43G.js"; 29 + 30 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/dsdiff/DsdiffParser.js 31 + var import_debug = __toESM(require_src()); 32 + 33 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/dsdiff/DsdiffToken.js 34 + var ChunkHeader64 = { 35 + len: 12, 36 + get: /* @__PURE__ */ __name((buf, off) => { 37 + return { 38 + // Group-ID 39 + chunkID: FourCcToken.get(buf, off), 40 + // Size 41 + chunkSize: INT64_BE.get(buf, off + 4) 42 + }; 43 + }, "get") 44 + }; 45 + 46 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/dsdiff/DsdiffParser.js 47 + var debug = (0, import_debug.default)("music-metadata:parser:aiff"); 48 + var DsdiffContentParseError = class extends makeUnexpectedFileContentError("DSDIFF") { 49 + static { 50 + __name(this, "DsdiffContentParseError"); 51 + } 52 + }; 53 + var DsdiffParser = class extends BasicParser { 54 + static { 55 + __name(this, "DsdiffParser"); 56 + } 57 + async parse() { 58 + const header = await this.tokenizer.readToken(ChunkHeader64); 59 + if (header.chunkID !== "FRM8") 60 + throw new DsdiffContentParseError("Unexpected chunk-ID"); 61 + this.metadata.setAudioOnly(); 62 + const type = (await this.tokenizer.readToken(FourCcToken)).trim(); 63 + switch (type) { 64 + case "DSD": 65 + this.metadata.setFormat("container", `DSDIFF/${type}`); 66 + this.metadata.setFormat("lossless", true); 67 + return this.readFmt8Chunks(header.chunkSize - BigInt(FourCcToken.len)); 68 + default: 69 + throw new DsdiffContentParseError(`Unsupported DSDIFF type: ${type}`); 70 + } 71 + } 72 + async readFmt8Chunks(remainingSize) { 73 + while (remainingSize >= ChunkHeader64.len) { 74 + const chunkHeader = await this.tokenizer.readToken(ChunkHeader64); 75 + debug(`Chunk id=${chunkHeader.chunkID}`); 76 + await this.readData(chunkHeader); 77 + remainingSize -= BigInt(ChunkHeader64.len) + chunkHeader.chunkSize; 78 + } 79 + } 80 + async readData(header) { 81 + debug(`Reading data of chunk[ID=${header.chunkID}, size=${header.chunkSize}]`); 82 + const p0 = this.tokenizer.position; 83 + switch (header.chunkID.trim()) { 84 + case "FVER": { 85 + const version = await this.tokenizer.readToken(UINT32_LE); 86 + debug(`DSDIFF version=${version}`); 87 + break; 88 + } 89 + case "PROP": { 90 + const propType = await this.tokenizer.readToken(FourCcToken); 91 + if (propType !== "SND ") 92 + throw new DsdiffContentParseError("Unexpected PROP-chunk ID"); 93 + await this.handleSoundPropertyChunks(header.chunkSize - BigInt(FourCcToken.len)); 94 + break; 95 + } 96 + case "ID3": { 97 + const id3_data = await this.tokenizer.readToken(new Uint8ArrayType(Number(header.chunkSize))); 98 + const rst = fromBuffer(id3_data); 99 + await new ID3v2Parser().parse(this.metadata, rst, this.options); 100 + break; 101 + } 102 + case "DSD": 103 + if (this.metadata.format.numberOfChannels) { 104 + this.metadata.setFormat("numberOfSamples", Number(header.chunkSize * BigInt(8) / BigInt(this.metadata.format.numberOfChannels))); 105 + } 106 + if (this.metadata.format.numberOfSamples && this.metadata.format.sampleRate) { 107 + this.metadata.setFormat("duration", this.metadata.format.numberOfSamples / this.metadata.format.sampleRate); 108 + } 109 + break; 110 + default: 111 + debug(`Ignore chunk[ID=${header.chunkID}, size=${header.chunkSize}]`); 112 + break; 113 + } 114 + const remaining = header.chunkSize - BigInt(this.tokenizer.position - p0); 115 + if (remaining > 0) { 116 + debug(`After Parsing chunk, remaining ${remaining} bytes`); 117 + await this.tokenizer.ignore(Number(remaining)); 118 + } 119 + } 120 + async handleSoundPropertyChunks(remainingSize) { 121 + debug(`Parsing sound-property-chunks, remainingSize=${remainingSize}`); 122 + while (remainingSize > 0) { 123 + const sndPropHeader = await this.tokenizer.readToken(ChunkHeader64); 124 + debug(`Sound-property-chunk[ID=${sndPropHeader.chunkID}, size=${sndPropHeader.chunkSize}]`); 125 + const p0 = this.tokenizer.position; 126 + switch (sndPropHeader.chunkID.trim()) { 127 + case "FS": { 128 + const sampleRate = await this.tokenizer.readToken(UINT32_BE); 129 + this.metadata.setFormat("sampleRate", sampleRate); 130 + break; 131 + } 132 + case "CHNL": { 133 + const numChannels = await this.tokenizer.readToken(UINT16_BE); 134 + this.metadata.setFormat("numberOfChannels", numChannels); 135 + await this.handleChannelChunks(sndPropHeader.chunkSize - BigInt(UINT16_BE.len)); 136 + break; 137 + } 138 + case "CMPR": { 139 + const compressionIdCode = (await this.tokenizer.readToken(FourCcToken)).trim(); 140 + const count = await this.tokenizer.readToken(UINT8); 141 + const compressionName = await this.tokenizer.readToken(new StringType(count, "ascii")); 142 + if (compressionIdCode === "DSD") { 143 + this.metadata.setFormat("lossless", true); 144 + this.metadata.setFormat("bitsPerSample", 1); 145 + } 146 + this.metadata.setFormat("codec", `${compressionIdCode} (${compressionName})`); 147 + break; 148 + } 149 + case "ABSS": { 150 + const hours = await this.tokenizer.readToken(UINT16_BE); 151 + const minutes = await this.tokenizer.readToken(UINT8); 152 + const seconds = await this.tokenizer.readToken(UINT8); 153 + const samples = await this.tokenizer.readToken(UINT32_BE); 154 + debug(`ABSS ${hours}:${minutes}:${seconds}.${samples}`); 155 + break; 156 + } 157 + case "LSCO": { 158 + const lsConfig = await this.tokenizer.readToken(UINT16_BE); 159 + debug(`LSCO lsConfig=${lsConfig}`); 160 + break; 161 + } 162 + default: 163 + debug(`Unknown sound-property-chunk[ID=${sndPropHeader.chunkID}, size=${sndPropHeader.chunkSize}]`); 164 + await this.tokenizer.ignore(Number(sndPropHeader.chunkSize)); 165 + } 166 + const remaining = sndPropHeader.chunkSize - BigInt(this.tokenizer.position - p0); 167 + if (remaining > 0) { 168 + debug(`After Parsing sound-property-chunk ${sndPropHeader.chunkSize}, remaining ${remaining} bytes`); 169 + await this.tokenizer.ignore(Number(remaining)); 170 + } 171 + remainingSize -= BigInt(ChunkHeader64.len) + sndPropHeader.chunkSize; 172 + debug(`Parsing sound-property-chunks, remainingSize=${remainingSize}`); 173 + } 174 + if (this.metadata.format.lossless && this.metadata.format.sampleRate && this.metadata.format.numberOfChannels && this.metadata.format.bitsPerSample) { 175 + const bitrate = this.metadata.format.sampleRate * this.metadata.format.numberOfChannels * this.metadata.format.bitsPerSample; 176 + this.metadata.setFormat("bitrate", bitrate); 177 + } 178 + } 179 + async handleChannelChunks(remainingSize) { 180 + debug(`Parsing channel-chunks, remainingSize=${remainingSize}`); 181 + const channels = []; 182 + while (remainingSize >= FourCcToken.len) { 183 + const channelId = await this.tokenizer.readToken(FourCcToken); 184 + debug(`Channel[ID=${channelId}]`); 185 + channels.push(channelId); 186 + remainingSize -= BigInt(FourCcToken.len); 187 + } 188 + debug(`Channels: ${channels.join(", ")}`); 189 + return channels; 190 + } 191 + }; 192 + export { 193 + DsdiffContentParseError, 194 + DsdiffParser 195 + }; 196 + 197 + //# sourceMappingURL=./DsdiffParser-DF4OM5HV.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/DsdiffParser-DF4OM5HV.js.map
··· 1 + {"version":3,"sources":["/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/dsdiff/DsdiffParser.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/dsdiff/DsdiffToken.js"],"sourcesContent":["import * as Token from 'token-types';\nimport initDebug from 'debug';\nimport * as strtok3 from 'strtok3';\nimport { FourCcToken } from '../common/FourCC.js';\nimport { BasicParser } from '../common/BasicParser.js';\nimport { ID3v2Parser } from '../id3v2/ID3v2Parser.js';\nimport { ChunkHeader64 } from './DsdiffToken.js';\nimport { makeUnexpectedFileContentError } from '../ParseError.js';\nconst debug = initDebug('music-metadata:parser:aiff');\nexport class DsdiffContentParseError extends makeUnexpectedFileContentError('DSDIFF') {\n}\n/**\n * DSDIFF - Direct Stream Digital Interchange File Format (Phillips)\n *\n * Ref:\n * - http://www.sonicstudio.com/pdf/dsd/DSDIFF_1.5_Spec.pdf\n */\nexport class DsdiffParser extends BasicParser {\n async parse() {\n const header = await this.tokenizer.readToken(ChunkHeader64);\n if (header.chunkID !== 'FRM8')\n throw new DsdiffContentParseError('Unexpected chunk-ID');\n this.metadata.setAudioOnly();\n const type = (await this.tokenizer.readToken(FourCcToken)).trim();\n switch (type) {\n case 'DSD':\n this.metadata.setFormat('container', `DSDIFF/${type}`);\n this.metadata.setFormat('lossless', true);\n return this.readFmt8Chunks(header.chunkSize - BigInt(FourCcToken.len));\n default:\n throw new DsdiffContentParseError(`Unsupported DSDIFF type: ${type}`);\n }\n }\n async readFmt8Chunks(remainingSize) {\n while (remainingSize >= ChunkHeader64.len) {\n const chunkHeader = await this.tokenizer.readToken(ChunkHeader64);\n // If the data is an odd number of bytes in length, a pad byte must be added at the end\n debug(`Chunk id=${chunkHeader.chunkID}`);\n await this.readData(chunkHeader);\n remainingSize -= (BigInt(ChunkHeader64.len) + chunkHeader.chunkSize);\n }\n }\n async readData(header) {\n debug(`Reading data of chunk[ID=${header.chunkID}, size=${header.chunkSize}]`);\n const p0 = this.tokenizer.position;\n switch (header.chunkID.trim()) {\n case 'FVER': { // 3.1 FORMAT VERSION CHUNK\n const version = await this.tokenizer.readToken(Token.UINT32_LE);\n debug(`DSDIFF version=${version}`);\n break;\n }\n case 'PROP': { // 3.2 PROPERTY CHUNK\n const propType = await this.tokenizer.readToken(FourCcToken);\n if (propType !== 'SND ')\n throw new DsdiffContentParseError('Unexpected PROP-chunk ID');\n await this.handleSoundPropertyChunks(header.chunkSize - BigInt(FourCcToken.len));\n break;\n }\n case 'ID3': { // Unofficial ID3 tag support\n const id3_data = await this.tokenizer.readToken(new Token.Uint8ArrayType(Number(header.chunkSize)));\n const rst = strtok3.fromBuffer(id3_data);\n await new ID3v2Parser().parse(this.metadata, rst, this.options);\n break;\n }\n case 'DSD':\n if (this.metadata.format.numberOfChannels) {\n this.metadata.setFormat('numberOfSamples', Number(header.chunkSize * BigInt(8) / BigInt(this.metadata.format.numberOfChannels)));\n }\n if (this.metadata.format.numberOfSamples && this.metadata.format.sampleRate) {\n this.metadata.setFormat('duration', this.metadata.format.numberOfSamples / this.metadata.format.sampleRate);\n }\n break;\n default:\n debug(`Ignore chunk[ID=${header.chunkID}, size=${header.chunkSize}]`);\n break;\n }\n const remaining = header.chunkSize - BigInt(this.tokenizer.position - p0);\n if (remaining > 0) {\n debug(`After Parsing chunk, remaining ${remaining} bytes`);\n await this.tokenizer.ignore(Number(remaining));\n }\n }\n async handleSoundPropertyChunks(remainingSize) {\n debug(`Parsing sound-property-chunks, remainingSize=${remainingSize}`);\n while (remainingSize > 0) {\n const sndPropHeader = await this.tokenizer.readToken(ChunkHeader64);\n debug(`Sound-property-chunk[ID=${sndPropHeader.chunkID}, size=${sndPropHeader.chunkSize}]`);\n const p0 = this.tokenizer.position;\n switch (sndPropHeader.chunkID.trim()) {\n case 'FS': { // 3.2.1 Sample Rate Chunk\n const sampleRate = await this.tokenizer.readToken(Token.UINT32_BE);\n this.metadata.setFormat('sampleRate', sampleRate);\n break;\n }\n case 'CHNL': { // 3.2.2 Channels Chunk\n const numChannels = await this.tokenizer.readToken(Token.UINT16_BE);\n this.metadata.setFormat('numberOfChannels', numChannels);\n await this.handleChannelChunks(sndPropHeader.chunkSize - BigInt(Token.UINT16_BE.len));\n break;\n }\n case 'CMPR': { // 3.2.3 Compression Type Chunk\n const compressionIdCode = (await this.tokenizer.readToken(FourCcToken)).trim();\n const count = await this.tokenizer.readToken(Token.UINT8);\n const compressionName = await this.tokenizer.readToken(new Token.StringType(count, 'ascii'));\n if (compressionIdCode === 'DSD') {\n this.metadata.setFormat('lossless', true);\n this.metadata.setFormat('bitsPerSample', 1);\n }\n this.metadata.setFormat('codec', `${compressionIdCode} (${compressionName})`);\n break;\n }\n case 'ABSS': { // 3.2.4 Absolute Start Time Chunk\n const hours = await this.tokenizer.readToken(Token.UINT16_BE);\n const minutes = await this.tokenizer.readToken(Token.UINT8);\n const seconds = await this.tokenizer.readToken(Token.UINT8);\n const samples = await this.tokenizer.readToken(Token.UINT32_BE);\n debug(`ABSS ${hours}:${minutes}:${seconds}.${samples}`);\n break;\n }\n case 'LSCO': { // 3.2.5 Loudspeaker Configuration Chunk\n const lsConfig = await this.tokenizer.readToken(Token.UINT16_BE);\n debug(`LSCO lsConfig=${lsConfig}`);\n break;\n }\n default:\n debug(`Unknown sound-property-chunk[ID=${sndPropHeader.chunkID}, size=${sndPropHeader.chunkSize}]`);\n await this.tokenizer.ignore(Number(sndPropHeader.chunkSize));\n }\n const remaining = sndPropHeader.chunkSize - BigInt(this.tokenizer.position - p0);\n if (remaining > 0) {\n debug(`After Parsing sound-property-chunk ${sndPropHeader.chunkSize}, remaining ${remaining} bytes`);\n await this.tokenizer.ignore(Number(remaining));\n }\n remainingSize -= BigInt(ChunkHeader64.len) + sndPropHeader.chunkSize;\n debug(`Parsing sound-property-chunks, remainingSize=${remainingSize}`);\n }\n if (this.metadata.format.lossless && this.metadata.format.sampleRate && this.metadata.format.numberOfChannels && this.metadata.format.bitsPerSample) {\n const bitrate = this.metadata.format.sampleRate * this.metadata.format.numberOfChannels * this.metadata.format.bitsPerSample;\n this.metadata.setFormat('bitrate', bitrate);\n }\n }\n async handleChannelChunks(remainingSize) {\n debug(`Parsing channel-chunks, remainingSize=${remainingSize}`);\n const channels = [];\n while (remainingSize >= FourCcToken.len) {\n const channelId = await this.tokenizer.readToken(FourCcToken);\n debug(`Channel[ID=${channelId}]`);\n channels.push(channelId);\n remainingSize -= BigInt(FourCcToken.len);\n }\n debug(`Channels: ${channels.join(', ')}`);\n return channels;\n }\n}\n","import * as Token from 'token-types';\nimport { FourCcToken } from '../common/FourCC.js';\n/**\n * DSDIFF chunk header\n * The data-size encoding is deviating from EA-IFF 85\n * Ref: http://www.sonicstudio.com/pdf/dsd/DSDIFF_1.5_Spec.pdf\n */\nexport const ChunkHeader64 = {\n len: 12,\n get: (buf, off) => {\n return {\n // Group-ID\n chunkID: FourCcToken.get(buf, off),\n // Size\n chunkSize: Token.INT64_BE.get(buf, off + 4)\n };\n }\n};\n"],"mappings":"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","names":["initDebug"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/DsdiffParser-DF4OM5HV.js.map"}
+119
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/DsfParser-WJENCYIA.js
··· 1 + import { 2 + AbstractID3Parser 3 + } from "./chunk-WBWWX4CZ.js"; 4 + import { 5 + ID3v2Parser 6 + } from "./chunk-QOFAJIKO.js"; 7 + import "./chunk-Z6RWJW2M.js"; 8 + import "./chunk-SGG7NSCF.js"; 9 + import { 10 + FourCcToken 11 + } from "./chunk-CSVVW572.js"; 12 + import "./chunk-6AX6SYMQ.js"; 13 + import "./chunk-FGRUWWG5.js"; 14 + import { 15 + INT32_LE, 16 + INT64_LE, 17 + UINT64_LE, 18 + makeUnexpectedFileContentError, 19 + require_src 20 + } from "./chunk-ETGVMC2T.js"; 21 + import { 22 + __name, 23 + __toESM 24 + } from "./chunk-7IARE43G.js"; 25 + 26 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/dsf/DsfParser.js 27 + var import_debug = __toESM(require_src()); 28 + 29 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/dsf/DsfChunk.js 30 + var ChunkHeader = { 31 + len: 12, 32 + get: /* @__PURE__ */ __name((buf, off) => { 33 + return { id: FourCcToken.get(buf, off), size: UINT64_LE.get(buf, off + 4) }; 34 + }, "get") 35 + }; 36 + var DsdChunk = { 37 + len: 16, 38 + get: /* @__PURE__ */ __name((buf, off) => { 39 + return { 40 + fileSize: INT64_LE.get(buf, off), 41 + metadataPointer: INT64_LE.get(buf, off + 8) 42 + }; 43 + }, "get") 44 + }; 45 + var FormatChunk = { 46 + len: 40, 47 + get: /* @__PURE__ */ __name((buf, off) => { 48 + return { 49 + formatVersion: INT32_LE.get(buf, off), 50 + formatID: INT32_LE.get(buf, off + 4), 51 + channelType: INT32_LE.get(buf, off + 8), 52 + channelNum: INT32_LE.get(buf, off + 12), 53 + samplingFrequency: INT32_LE.get(buf, off + 16), 54 + bitsPerSample: INT32_LE.get(buf, off + 20), 55 + sampleCount: INT64_LE.get(buf, off + 24), 56 + blockSizePerChannel: INT32_LE.get(buf, off + 32) 57 + }; 58 + }, "get") 59 + }; 60 + 61 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/dsf/DsfParser.js 62 + var debug = (0, import_debug.default)("music-metadata:parser:DSF"); 63 + var DsdContentParseError = class extends makeUnexpectedFileContentError("DSD") { 64 + static { 65 + __name(this, "DsdContentParseError"); 66 + } 67 + }; 68 + var DsfParser = class extends AbstractID3Parser { 69 + static { 70 + __name(this, "DsfParser"); 71 + } 72 + async postId3v2Parse() { 73 + const p0 = this.tokenizer.position; 74 + const chunkHeader = await this.tokenizer.readToken(ChunkHeader); 75 + if (chunkHeader.id !== "DSD ") 76 + throw new DsdContentParseError("Invalid chunk signature"); 77 + this.metadata.setFormat("container", "DSF"); 78 + this.metadata.setFormat("lossless", true); 79 + this.metadata.setAudioOnly(); 80 + const dsdChunk = await this.tokenizer.readToken(DsdChunk); 81 + if (dsdChunk.metadataPointer === BigInt(0)) { 82 + debug("No ID3v2 tag present"); 83 + } else { 84 + debug(`expect ID3v2 at offset=${dsdChunk.metadataPointer}`); 85 + await this.parseChunks(dsdChunk.fileSize - chunkHeader.size); 86 + await this.tokenizer.ignore(Number(dsdChunk.metadataPointer) - this.tokenizer.position - p0); 87 + return new ID3v2Parser().parse(this.metadata, this.tokenizer, this.options); 88 + } 89 + } 90 + async parseChunks(bytesRemaining) { 91 + while (bytesRemaining >= ChunkHeader.len) { 92 + const chunkHeader = await this.tokenizer.readToken(ChunkHeader); 93 + debug(`Parsing chunk name=${chunkHeader.id} size=${chunkHeader.size}`); 94 + switch (chunkHeader.id) { 95 + case "fmt ": { 96 + const formatChunk = await this.tokenizer.readToken(FormatChunk); 97 + this.metadata.setFormat("numberOfChannels", formatChunk.channelNum); 98 + this.metadata.setFormat("sampleRate", formatChunk.samplingFrequency); 99 + this.metadata.setFormat("bitsPerSample", formatChunk.bitsPerSample); 100 + this.metadata.setFormat("numberOfSamples", formatChunk.sampleCount); 101 + this.metadata.setFormat("duration", Number(formatChunk.sampleCount) / formatChunk.samplingFrequency); 102 + const bitrate = formatChunk.bitsPerSample * formatChunk.samplingFrequency * formatChunk.channelNum; 103 + this.metadata.setFormat("bitrate", bitrate); 104 + return; 105 + } 106 + default: 107 + this.tokenizer.ignore(Number(chunkHeader.size) - ChunkHeader.len); 108 + break; 109 + } 110 + bytesRemaining -= chunkHeader.size; 111 + } 112 + } 113 + }; 114 + export { 115 + DsdContentParseError, 116 + DsfParser 117 + }; 118 + 119 + //# sourceMappingURL=./DsfParser-WJENCYIA.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/DsfParser-WJENCYIA.js.map
··· 1 + {"version":3,"sources":["/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/dsf/DsfParser.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/dsf/DsfChunk.js"],"sourcesContent":["import initDebug from 'debug';\nimport { AbstractID3Parser } from '../id3v2/AbstractID3Parser.js';\nimport { ChunkHeader, DsdChunk, FormatChunk } from './DsfChunk.js';\nimport { ID3v2Parser } from \"../id3v2/ID3v2Parser.js\";\nimport { makeUnexpectedFileContentError } from '../ParseError.js';\nconst debug = initDebug('music-metadata:parser:DSF');\nexport class DsdContentParseError extends makeUnexpectedFileContentError('DSD') {\n}\n/**\n * DSF (dsd stream file) File Parser\n * Ref: https://dsd-guide.com/sites/default/files/white-papers/DSFFileFormatSpec_E.pdf\n */\nexport class DsfParser extends AbstractID3Parser {\n async postId3v2Parse() {\n const p0 = this.tokenizer.position; // mark start position, normally 0\n const chunkHeader = await this.tokenizer.readToken(ChunkHeader);\n if (chunkHeader.id !== 'DSD ')\n throw new DsdContentParseError('Invalid chunk signature');\n this.metadata.setFormat('container', 'DSF');\n this.metadata.setFormat('lossless', true);\n this.metadata.setAudioOnly();\n const dsdChunk = await this.tokenizer.readToken(DsdChunk);\n if (dsdChunk.metadataPointer === BigInt(0)) {\n debug(\"No ID3v2 tag present\");\n }\n else {\n debug(`expect ID3v2 at offset=${dsdChunk.metadataPointer}`);\n await this.parseChunks(dsdChunk.fileSize - chunkHeader.size);\n // Jump to ID3 header\n await this.tokenizer.ignore(Number(dsdChunk.metadataPointer) - this.tokenizer.position - p0);\n return new ID3v2Parser().parse(this.metadata, this.tokenizer, this.options);\n }\n }\n async parseChunks(bytesRemaining) {\n while (bytesRemaining >= ChunkHeader.len) {\n const chunkHeader = await this.tokenizer.readToken(ChunkHeader);\n debug(`Parsing chunk name=${chunkHeader.id} size=${chunkHeader.size}`);\n switch (chunkHeader.id) {\n case 'fmt ': {\n const formatChunk = await this.tokenizer.readToken(FormatChunk);\n this.metadata.setFormat('numberOfChannels', formatChunk.channelNum);\n this.metadata.setFormat('sampleRate', formatChunk.samplingFrequency);\n this.metadata.setFormat('bitsPerSample', formatChunk.bitsPerSample);\n this.metadata.setFormat('numberOfSamples', formatChunk.sampleCount);\n this.metadata.setFormat('duration', Number(formatChunk.sampleCount) / formatChunk.samplingFrequency);\n const bitrate = formatChunk.bitsPerSample * formatChunk.samplingFrequency * formatChunk.channelNum;\n this.metadata.setFormat('bitrate', bitrate);\n return; // We got what we want, stop further processing of chunks\n }\n default:\n this.tokenizer.ignore(Number(chunkHeader.size) - ChunkHeader.len);\n break;\n }\n bytesRemaining -= chunkHeader.size;\n }\n }\n}\n","import * as Token from 'token-types';\nimport { FourCcToken } from '../common/FourCC.js';\n/**\n * Common chunk DSD header: the 'chunk name (Four-CC)' & chunk size\n */\nexport const ChunkHeader = {\n len: 12,\n get: (buf, off) => {\n return { id: FourCcToken.get(buf, off), size: Token.UINT64_LE.get(buf, off + 4) };\n }\n};\n/**\n * Common chunk DSD header: the 'chunk name (Four-CC)' & chunk size\n */\nexport const DsdChunk = {\n len: 16,\n get: (buf, off) => {\n return {\n fileSize: Token.INT64_LE.get(buf, off),\n metadataPointer: Token.INT64_LE.get(buf, off + 8)\n };\n }\n};\nexport const ChannelType = {\n mono: 1,\n stereo: 2,\n channels: 3,\n quad: 4,\n '4 channels': 5,\n '5 channels': 6,\n '5.1 channels': 7\n};\n/**\n * Common chunk DSD header: the 'chunk name (Four-CC)' & chunk size\n */\nexport const FormatChunk = {\n len: 40,\n get: (buf, off) => {\n return {\n formatVersion: Token.INT32_LE.get(buf, off),\n formatID: Token.INT32_LE.get(buf, off + 4),\n channelType: Token.INT32_LE.get(buf, off + 8),\n channelNum: Token.INT32_LE.get(buf, off + 12),\n samplingFrequency: Token.INT32_LE.get(buf, off + 16),\n bitsPerSample: Token.INT32_LE.get(buf, off + 20),\n sampleCount: Token.INT64_LE.get(buf, off + 24),\n blockSizePerChannel: Token.INT32_LE.get(buf, off + 32)\n };\n }\n};\n"],"mappings":"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","names":["initDebug"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/DsfParser-WJENCYIA.js.map"}
+17
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/FlacParser-UYVOMKF2.js
··· 1 + import { 2 + FlacParser 3 + } from "./chunk-A4RQ3WIY.js"; 4 + import "./chunk-WBWWX4CZ.js"; 5 + import "./chunk-QOFAJIKO.js"; 6 + import "./chunk-Z6RWJW2M.js"; 7 + import "./chunk-SGG7NSCF.js"; 8 + import "./chunk-CSVVW572.js"; 9 + import "./chunk-6AX6SYMQ.js"; 10 + import "./chunk-FGRUWWG5.js"; 11 + import "./chunk-ETGVMC2T.js"; 12 + import "./chunk-7IARE43G.js"; 13 + export { 14 + FlacParser 15 + }; 16 + 17 + //# sourceMappingURL=./FlacParser-UYVOMKF2.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/FlacParser-UYVOMKF2.js.map
··· 1 + {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/FlacParser-UYVOMKF2.js.map"}
+1208
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/MP4Parser-CA3XAXIP.js
··· 1 + import "./chunk-L3PGUTA5.js"; 2 + import { 3 + TrackType 4 + } from "./chunk-7OCWG5AW.js"; 5 + import { 6 + Genres 7 + } from "./chunk-Z6RWJW2M.js"; 8 + import "./chunk-SGG7NSCF.js"; 9 + import { 10 + FourCcToken 11 + } from "./chunk-CSVVW572.js"; 12 + import { 13 + getBit, 14 + uint8ArrayToHex 15 + } from "./chunk-6AX6SYMQ.js"; 16 + import "./chunk-FGRUWWG5.js"; 17 + import { 18 + BasicParser, 19 + INT16_BE, 20 + INT24_BE, 21 + INT32_BE, 22 + INT8, 23 + StringType, 24 + UINT16_BE, 25 + UINT24_BE, 26 + UINT32_BE, 27 + UINT64_BE, 28 + UINT8, 29 + Uint8ArrayType, 30 + lib_exports, 31 + makeUnexpectedFileContentError, 32 + require_src, 33 + textDecode 34 + } from "./chunk-ETGVMC2T.js"; 35 + import { 36 + __name, 37 + __toESM 38 + } from "./chunk-7IARE43G.js"; 39 + 40 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/mp4/MP4Parser.js 41 + var import_debug3 = __toESM(require_src()); 42 + 43 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/mp4/Atom.js 44 + var import_debug2 = __toESM(require_src()); 45 + 46 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/mp4/AtomToken.js 47 + var import_debug = __toESM(require_src()); 48 + var debug = (0, import_debug.default)("music-metadata:parser:MP4:atom"); 49 + var Mp4ContentError = class extends makeUnexpectedFileContentError("MP4") { 50 + static { 51 + __name(this, "Mp4ContentError"); 52 + } 53 + }; 54 + var Header = { 55 + len: 8, 56 + get: /* @__PURE__ */ __name((buf, off) => { 57 + const length = UINT32_BE.get(buf, off); 58 + if (length < 0) 59 + throw new Mp4ContentError("Invalid atom header length"); 60 + return { 61 + length: BigInt(length), 62 + name: new StringType(4, "latin1").get(buf, off + 4) 63 + }; 64 + }, "get"), 65 + put: /* @__PURE__ */ __name((buf, off, hdr) => { 66 + UINT32_BE.put(buf, off, Number(hdr.length)); 67 + return FourCcToken.put(buf, off + 4, hdr.name); 68 + }, "put") 69 + }; 70 + var ExtendedSize = UINT64_BE; 71 + var ftyp = { 72 + len: 4, 73 + get: /* @__PURE__ */ __name((buf, off) => { 74 + return { 75 + type: new StringType(4, "ascii").get(buf, off) 76 + }; 77 + }, "get") 78 + }; 79 + var FixedLengthAtom = class { 80 + static { 81 + __name(this, "FixedLengthAtom"); 82 + } 83 + /** 84 + * 85 + * @param {number} len Length as specified in the size field 86 + * @param {number} expLen Total length of sum of specified fields in the standard 87 + * @param atomId Atom ID 88 + */ 89 + constructor(len, expLen, atomId) { 90 + if (len < expLen) { 91 + throw new Mp4ContentError(`Atom ${atomId} expected to be ${expLen}, but specifies ${len} bytes long.`); 92 + } 93 + if (len > expLen) { 94 + debug(`Warning: atom ${atomId} expected to be ${expLen}, but was actually ${len} bytes long.`); 95 + } 96 + this.len = len; 97 + } 98 + }; 99 + var SecondsSinceMacEpoch = { 100 + len: 4, 101 + get: /* @__PURE__ */ __name((buf, off) => { 102 + const secondsSinceUnixEpoch = UINT32_BE.get(buf, off) - 2082844800; 103 + return new Date(secondsSinceUnixEpoch * 1e3); 104 + }, "get") 105 + }; 106 + var MdhdAtom = class extends FixedLengthAtom { 107 + static { 108 + __name(this, "MdhdAtom"); 109 + } 110 + constructor(len) { 111 + super(len, 24, "mdhd"); 112 + } 113 + get(buf, off) { 114 + return { 115 + version: UINT8.get(buf, off + 0), 116 + flags: UINT24_BE.get(buf, off + 1), 117 + creationTime: SecondsSinceMacEpoch.get(buf, off + 4), 118 + modificationTime: SecondsSinceMacEpoch.get(buf, off + 8), 119 + timeScale: UINT32_BE.get(buf, off + 12), 120 + duration: UINT32_BE.get(buf, off + 16), 121 + language: UINT16_BE.get(buf, off + 20), 122 + quality: UINT16_BE.get(buf, off + 22) 123 + }; 124 + } 125 + }; 126 + var MvhdAtom = class extends FixedLengthAtom { 127 + static { 128 + __name(this, "MvhdAtom"); 129 + } 130 + constructor(len) { 131 + super(len, 100, "mvhd"); 132 + } 133 + get(buf, off) { 134 + return { 135 + version: UINT8.get(buf, off), 136 + flags: UINT24_BE.get(buf, off + 1), 137 + creationTime: SecondsSinceMacEpoch.get(buf, off + 4), 138 + modificationTime: SecondsSinceMacEpoch.get(buf, off + 8), 139 + timeScale: UINT32_BE.get(buf, off + 12), 140 + duration: UINT32_BE.get(buf, off + 16), 141 + preferredRate: UINT32_BE.get(buf, off + 20), 142 + preferredVolume: UINT16_BE.get(buf, off + 24), 143 + // ignore reserver: 10 bytes 144 + // ignore matrix structure: 36 bytes 145 + previewTime: UINT32_BE.get(buf, off + 72), 146 + previewDuration: UINT32_BE.get(buf, off + 76), 147 + posterTime: UINT32_BE.get(buf, off + 80), 148 + selectionTime: UINT32_BE.get(buf, off + 84), 149 + selectionDuration: UINT32_BE.get(buf, off + 88), 150 + currentTime: UINT32_BE.get(buf, off + 92), 151 + nextTrackID: UINT32_BE.get(buf, off + 96) 152 + }; 153 + } 154 + }; 155 + var DataAtom = class { 156 + static { 157 + __name(this, "DataAtom"); 158 + } 159 + constructor(len) { 160 + this.len = len; 161 + } 162 + get(buf, off) { 163 + return { 164 + type: { 165 + set: UINT8.get(buf, off + 0), 166 + type: UINT24_BE.get(buf, off + 1) 167 + }, 168 + locale: UINT24_BE.get(buf, off + 4), 169 + value: new Uint8ArrayType(this.len - 8).get(buf, off + 8) 170 + }; 171 + } 172 + }; 173 + var NameAtom = class { 174 + static { 175 + __name(this, "NameAtom"); 176 + } 177 + constructor(len) { 178 + this.len = len; 179 + } 180 + get(buf, off) { 181 + return { 182 + version: UINT8.get(buf, off), 183 + flags: UINT24_BE.get(buf, off + 1), 184 + name: new StringType(this.len - 4, "utf-8").get(buf, off + 4) 185 + }; 186 + } 187 + }; 188 + var TrackHeaderAtom = class { 189 + static { 190 + __name(this, "TrackHeaderAtom"); 191 + } 192 + constructor(len) { 193 + this.len = len; 194 + } 195 + get(buf, off) { 196 + return { 197 + version: UINT8.get(buf, off), 198 + flags: UINT24_BE.get(buf, off + 1), 199 + creationTime: SecondsSinceMacEpoch.get(buf, off + 4), 200 + modificationTime: SecondsSinceMacEpoch.get(buf, off + 8), 201 + trackId: UINT32_BE.get(buf, off + 12), 202 + // reserved 4 bytes 203 + duration: UINT32_BE.get(buf, off + 20), 204 + layer: UINT16_BE.get(buf, off + 24), 205 + alternateGroup: UINT16_BE.get(buf, off + 26), 206 + volume: UINT16_BE.get(buf, off + 28) 207 + // ToDo: fixed point 208 + // ToDo: add remaining fields 209 + }; 210 + } 211 + }; 212 + var stsdHeader = { 213 + len: 8, 214 + get: /* @__PURE__ */ __name((buf, off) => { 215 + return { 216 + version: UINT8.get(buf, off), 217 + flags: UINT24_BE.get(buf, off + 1), 218 + numberOfEntries: UINT32_BE.get(buf, off + 4) 219 + }; 220 + }, "get") 221 + }; 222 + var SampleDescriptionTable = class { 223 + static { 224 + __name(this, "SampleDescriptionTable"); 225 + } 226 + constructor(len) { 227 + this.len = len; 228 + } 229 + get(buf, off) { 230 + const descrLen = this.len - 12; 231 + return { 232 + dataFormat: FourCcToken.get(buf, off), 233 + dataReferenceIndex: UINT16_BE.get(buf, off + 10), 234 + description: descrLen > 0 ? new Uint8ArrayType(descrLen).get(buf, off + 12) : void 0 235 + }; 236 + } 237 + }; 238 + var StsdAtom = class { 239 + static { 240 + __name(this, "StsdAtom"); 241 + } 242 + constructor(len) { 243 + this.len = len; 244 + } 245 + get(buf, off) { 246 + const header = stsdHeader.get(buf, off); 247 + off += stsdHeader.len; 248 + const table = []; 249 + for (let n = 0; n < header.numberOfEntries; ++n) { 250 + const size = UINT32_BE.get(buf, off); 251 + off += UINT32_BE.len; 252 + table.push(new SampleDescriptionTable(size - UINT32_BE.len).get(buf, off)); 253 + off += size; 254 + } 255 + return { 256 + header, 257 + table 258 + }; 259 + } 260 + }; 261 + var SoundSampleDescriptionVersion = { 262 + len: 8, 263 + get(buf, off) { 264 + return { 265 + version: INT16_BE.get(buf, off), 266 + revision: INT16_BE.get(buf, off + 2), 267 + vendor: INT32_BE.get(buf, off + 4) 268 + }; 269 + } 270 + }; 271 + var SoundSampleDescriptionV0 = { 272 + len: 12, 273 + get(buf, off) { 274 + return { 275 + numAudioChannels: INT16_BE.get(buf, off + 0), 276 + sampleSize: INT16_BE.get(buf, off + 2), 277 + compressionId: INT16_BE.get(buf, off + 4), 278 + packetSize: INT16_BE.get(buf, off + 6), 279 + sampleRate: UINT16_BE.get(buf, off + 8) + UINT16_BE.get(buf, off + 10) / 1e4 280 + }; 281 + } 282 + }; 283 + var SimpleTableAtom = class { 284 + static { 285 + __name(this, "SimpleTableAtom"); 286 + } 287 + constructor(len, token) { 288 + this.len = len; 289 + this.token = token; 290 + } 291 + get(buf, off) { 292 + const nrOfEntries = INT32_BE.get(buf, off + 4); 293 + return { 294 + version: INT8.get(buf, off + 0), 295 + flags: INT24_BE.get(buf, off + 1), 296 + numberOfEntries: nrOfEntries, 297 + entries: readTokenTable(buf, this.token, off + 8, this.len - 8, nrOfEntries) 298 + }; 299 + } 300 + }; 301 + var TimeToSampleToken = { 302 + len: 8, 303 + get(buf, off) { 304 + return { 305 + count: INT32_BE.get(buf, off + 0), 306 + duration: INT32_BE.get(buf, off + 4) 307 + }; 308 + } 309 + }; 310 + var SttsAtom = class extends SimpleTableAtom { 311 + static { 312 + __name(this, "SttsAtom"); 313 + } 314 + constructor(len) { 315 + super(len, TimeToSampleToken); 316 + } 317 + }; 318 + var SampleToChunkToken = { 319 + len: 12, 320 + get(buf, off) { 321 + return { 322 + firstChunk: INT32_BE.get(buf, off), 323 + samplesPerChunk: INT32_BE.get(buf, off + 4), 324 + sampleDescriptionId: INT32_BE.get(buf, off + 8) 325 + }; 326 + } 327 + }; 328 + var StscAtom = class extends SimpleTableAtom { 329 + static { 330 + __name(this, "StscAtom"); 331 + } 332 + constructor(len) { 333 + super(len, SampleToChunkToken); 334 + } 335 + }; 336 + var StszAtom = class { 337 + static { 338 + __name(this, "StszAtom"); 339 + } 340 + constructor(len) { 341 + this.len = len; 342 + } 343 + get(buf, off) { 344 + const nrOfEntries = INT32_BE.get(buf, off + 8); 345 + return { 346 + version: INT8.get(buf, off), 347 + flags: INT24_BE.get(buf, off + 1), 348 + sampleSize: INT32_BE.get(buf, off + 4), 349 + numberOfEntries: nrOfEntries, 350 + entries: readTokenTable(buf, INT32_BE, off + 12, this.len - 12, nrOfEntries) 351 + }; 352 + } 353 + }; 354 + var StcoAtom = class extends SimpleTableAtom { 355 + static { 356 + __name(this, "StcoAtom"); 357 + } 358 + constructor(len) { 359 + super(len, INT32_BE); 360 + this.len = len; 361 + } 362 + }; 363 + var ChapterText = class { 364 + static { 365 + __name(this, "ChapterText"); 366 + } 367 + constructor(len) { 368 + this.len = len; 369 + } 370 + get(buf, off) { 371 + const titleLen = INT16_BE.get(buf, off + 0); 372 + const str = new StringType(titleLen, "utf-8"); 373 + return str.get(buf, off + 2); 374 + } 375 + }; 376 + function readTokenTable(buf, token, off, remainingLen, numberOfEntries) { 377 + debug(`remainingLen=${remainingLen}, numberOfEntries=${numberOfEntries} * token-len=${token.len}`); 378 + if (remainingLen === 0) 379 + return []; 380 + if (remainingLen !== numberOfEntries * token.len) 381 + throw new Mp4ContentError("mismatch number-of-entries with remaining atom-length"); 382 + const entries = []; 383 + for (let n = 0; n < numberOfEntries; ++n) { 384 + entries.push(token.get(buf, off)); 385 + off += token.len; 386 + } 387 + return entries; 388 + } 389 + __name(readTokenTable, "readTokenTable"); 390 + var TrackFragmentHeaderBox = class { 391 + static { 392 + __name(this, "TrackFragmentHeaderBox"); 393 + } 394 + constructor(len) { 395 + this.len = len; 396 + } 397 + get(buf, off) { 398 + const flagOffset = off + 1; 399 + const header = { 400 + version: INT8.get(buf, off), 401 + flags: { 402 + baseDataOffsetPresent: getBit(buf, flagOffset + 2, 0), 403 + sampleDescriptionIndexPresent: getBit(buf, flagOffset + 2, 1), 404 + defaultSampleDurationPresent: getBit(buf, flagOffset + 2, 3), 405 + defaultSampleSizePresent: getBit(buf, flagOffset + 2, 4), 406 + defaultSampleFlagsPresent: getBit(buf, flagOffset + 2, 5), 407 + defaultDurationIsEmpty: getBit(buf, flagOffset, 0), 408 + defaultBaseIsMoof: getBit(buf, flagOffset, 1) 409 + }, 410 + trackId: UINT32_BE.get(buf, 4) 411 + }; 412 + let dynOffset = 8; 413 + if (header.flags.baseDataOffsetPresent) { 414 + header.baseDataOffset = UINT64_BE.get(buf, dynOffset); 415 + dynOffset += 8; 416 + } 417 + if (header.flags.sampleDescriptionIndexPresent) { 418 + header.sampleDescriptionIndex = UINT32_BE.get(buf, dynOffset); 419 + dynOffset += 4; 420 + } 421 + if (header.flags.defaultSampleDurationPresent) { 422 + header.defaultSampleDuration = UINT32_BE.get(buf, dynOffset); 423 + dynOffset += 4; 424 + } 425 + if (header.flags.defaultSampleSizePresent) { 426 + header.defaultSampleSize = UINT32_BE.get(buf, dynOffset); 427 + dynOffset += 4; 428 + } 429 + if (header.flags.defaultSampleFlagsPresent) { 430 + header.defaultSampleFlags = UINT32_BE.get(buf, dynOffset); 431 + } 432 + return header; 433 + } 434 + }; 435 + var TrackRunBox = class { 436 + static { 437 + __name(this, "TrackRunBox"); 438 + } 439 + constructor(len) { 440 + this.len = len; 441 + } 442 + get(buf, off) { 443 + const flagOffset = off + 1; 444 + const trun = { 445 + version: INT8.get(buf, off), 446 + flags: { 447 + dataOffsetPresent: getBit(buf, flagOffset + 2, 0), 448 + firstSampleFlagsPresent: getBit(buf, flagOffset + 2, 2), 449 + sampleDurationPresent: getBit(buf, flagOffset + 1, 0), 450 + sampleSizePresent: getBit(buf, flagOffset + 1, 1), 451 + sampleFlagsPresent: getBit(buf, flagOffset + 1, 2), 452 + sampleCompositionTimeOffsetsPresent: getBit(buf, flagOffset + 1, 3) 453 + }, 454 + sampleCount: UINT32_BE.get(buf, off + 4), 455 + samples: [] 456 + }; 457 + let dynOffset = off + 8; 458 + if (trun.flags.dataOffsetPresent) { 459 + trun.dataOffset = UINT32_BE.get(buf, dynOffset); 460 + dynOffset += 4; 461 + } 462 + if (trun.flags.firstSampleFlagsPresent) { 463 + trun.firstSampleFlags = UINT32_BE.get(buf, dynOffset); 464 + dynOffset += 4; 465 + } 466 + for (let n = 0; n < trun.sampleCount; ++n) { 467 + if (dynOffset >= this.len) { 468 + debug("TrackRunBox size mismatch"); 469 + break; 470 + } 471 + const sample = {}; 472 + if (trun.flags.sampleDurationPresent) { 473 + sample.sampleDuration = UINT32_BE.get(buf, dynOffset); 474 + dynOffset += 4; 475 + } 476 + if (trun.flags.sampleSizePresent) { 477 + sample.sampleSize = UINT32_BE.get(buf, dynOffset); 478 + dynOffset += 4; 479 + } 480 + if (trun.flags.sampleFlagsPresent) { 481 + sample.sampleFlags = UINT32_BE.get(buf, dynOffset); 482 + dynOffset += 4; 483 + } 484 + if (trun.flags.sampleCompositionTimeOffsetsPresent) { 485 + sample.sampleCompositionTimeOffset = UINT32_BE.get(buf, dynOffset); 486 + dynOffset += 4; 487 + } 488 + trun.samples.push(sample); 489 + } 490 + return trun; 491 + } 492 + }; 493 + var HandlerBox = class { 494 + static { 495 + __name(this, "HandlerBox"); 496 + } 497 + constructor(len) { 498 + this.len = len; 499 + } 500 + get(buf, off) { 501 + const _flagOffset = off + 1; 502 + const charTypeToken = new StringType(4, "utf-8"); 503 + return { 504 + version: INT8.get(buf, off), 505 + flags: UINT24_BE.get(buf, off + 1), 506 + componentType: charTypeToken.get(buf, off + 4), 507 + handlerType: charTypeToken.get(buf, off + 8), 508 + componentName: new StringType(this.len - 28, "utf-8").get(buf, off + 28) 509 + }; 510 + } 511 + }; 512 + var ChapterTrackReferenceBox = class { 513 + static { 514 + __name(this, "ChapterTrackReferenceBox"); 515 + } 516 + constructor(len) { 517 + this.len = len; 518 + } 519 + get(buf, off) { 520 + let dynOffset = 0; 521 + const trackIds = []; 522 + while (dynOffset < this.len) { 523 + trackIds.push(UINT32_BE.get(buf, off + dynOffset)); 524 + dynOffset += 4; 525 + } 526 + return trackIds; 527 + } 528 + }; 529 + 530 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/mp4/Atom.js 531 + var debug2 = (0, import_debug2.default)("music-metadata:parser:MP4:Atom"); 532 + var Atom = class _Atom { 533 + static { 534 + __name(this, "Atom"); 535 + } 536 + static async readAtom(tokenizer, dataHandler, parent, remaining) { 537 + const offset = tokenizer.position; 538 + debug2(`Reading next token on offset=${offset}...`); 539 + const header = await tokenizer.readToken(Header); 540 + const extended = header.length === 1n; 541 + if (extended) { 542 + header.length = await tokenizer.readToken(ExtendedSize); 543 + } 544 + const atomBean = new _Atom(header, extended, parent); 545 + const payloadLength = atomBean.getPayloadLength(remaining); 546 + debug2(`parse atom name=${atomBean.atomPath}, extended=${atomBean.extended}, offset=${offset}, len=${atomBean.header.length}`); 547 + await atomBean.readData(tokenizer, dataHandler, payloadLength); 548 + return atomBean; 549 + } 550 + constructor(header, extended, parent) { 551 + this.header = header; 552 + this.extended = extended; 553 + this.parent = parent; 554 + this.children = []; 555 + this.atomPath = (this.parent ? `${this.parent.atomPath}.` : "") + this.header.name; 556 + } 557 + getHeaderLength() { 558 + return this.extended ? 16 : 8; 559 + } 560 + getPayloadLength(remaining) { 561 + return (this.header.length === 0n ? remaining : Number(this.header.length)) - this.getHeaderLength(); 562 + } 563 + async readAtoms(tokenizer, dataHandler, size) { 564 + while (size > 0) { 565 + const atomBean = await _Atom.readAtom(tokenizer, dataHandler, this, size); 566 + this.children.push(atomBean); 567 + size -= atomBean.header.length === 0n ? size : Number(atomBean.header.length); 568 + } 569 + } 570 + async readData(tokenizer, dataHandler, remaining) { 571 + switch (this.header.name) { 572 + // "Container" atoms, contains nested atoms 573 + case "moov": 574 + // The Movie Atom: contains other atoms 575 + case "udta": 576 + // User defined atom 577 + case "mdia": 578 + // Media atom 579 + case "minf": 580 + // Media Information Atom 581 + case "stbl": 582 + // The Sample Table Atom 583 + case "<id>": 584 + case "ilst": 585 + case "tref": 586 + case "moof": 587 + return this.readAtoms(tokenizer, dataHandler, this.getPayloadLength(remaining)); 588 + case "meta": { 589 + const peekHeader = await tokenizer.peekToken(Header); 590 + const paddingLength = peekHeader.name === "hdlr" ? 0 : 4; 591 + await tokenizer.ignore(paddingLength); 592 + return this.readAtoms(tokenizer, dataHandler, this.getPayloadLength(remaining) - paddingLength); 593 + } 594 + default: 595 + return dataHandler(this, remaining); 596 + } 597 + } 598 + }; 599 + 600 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/mp4/MP4Parser.js 601 + var debug3 = (0, import_debug3.default)("music-metadata:parser:MP4"); 602 + var tagFormat = "iTunes"; 603 + var encoderDict = { 604 + raw: { 605 + lossy: false, 606 + format: "raw" 607 + }, 608 + MAC3: { 609 + lossy: true, 610 + format: "MACE 3:1" 611 + }, 612 + MAC6: { 613 + lossy: true, 614 + format: "MACE 6:1" 615 + }, 616 + ima4: { 617 + lossy: true, 618 + format: "IMA 4:1" 619 + }, 620 + ulaw: { 621 + lossy: true, 622 + format: "uLaw 2:1" 623 + }, 624 + alaw: { 625 + lossy: true, 626 + format: "uLaw 2:1" 627 + }, 628 + Qclp: { 629 + lossy: true, 630 + format: "QUALCOMM PureVoice" 631 + }, 632 + ".mp3": { 633 + lossy: true, 634 + format: "MPEG-1 layer 3" 635 + }, 636 + alac: { 637 + lossy: false, 638 + format: "ALAC" 639 + }, 640 + "ac-3": { 641 + lossy: true, 642 + format: "AC-3" 643 + }, 644 + mp4a: { 645 + lossy: true, 646 + format: "MPEG-4/AAC" 647 + }, 648 + mp4s: { 649 + lossy: true, 650 + format: "MP4S" 651 + }, 652 + // Closed Captioning Media, https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html#//apple_ref/doc/uid/TP40000939-CH205-SW87 653 + c608: { 654 + lossy: true, 655 + format: "CEA-608" 656 + }, 657 + c708: { 658 + lossy: true, 659 + format: "CEA-708" 660 + } 661 + }; 662 + function distinct(value, index, self) { 663 + return self.indexOf(value) === index; 664 + } 665 + __name(distinct, "distinct"); 666 + var MP4Parser = class _MP4Parser extends BasicParser { 667 + static { 668 + __name(this, "MP4Parser"); 669 + } 670 + constructor() { 671 + super(...arguments); 672 + this.tracks = /* @__PURE__ */ new Map(); 673 + this.hasVideoTrack = false; 674 + this.hasAudioTrack = true; 675 + this.atomParsers = { 676 + /** 677 + * Parse movie header (mvhd) atom 678 + * Ref: https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap2/qtff2.html#//apple_ref/doc/uid/TP40000939-CH204-56313 679 + */ 680 + mvhd: /* @__PURE__ */ __name(async (len) => { 681 + const mvhd = await this.tokenizer.readToken(new MvhdAtom(len)); 682 + this.metadata.setFormat("creationTime", mvhd.creationTime); 683 + this.metadata.setFormat("modificationTime", mvhd.modificationTime); 684 + }, "mvhd"), 685 + chap: /* @__PURE__ */ __name(async (len) => { 686 + const td = this.getTrackDescription(); 687 + const trackIds = []; 688 + while (len >= UINT32_BE.len) { 689 + trackIds.push(await this.tokenizer.readNumber(UINT32_BE)); 690 + len -= UINT32_BE.len; 691 + } 692 + td.chapterList = trackIds; 693 + }, "chap"), 694 + /** 695 + * Parse mdat atom. 696 + * Will scan for chapters 697 + */ 698 + mdat: /* @__PURE__ */ __name(async (len) => { 699 + if (this.options.includeChapters) { 700 + const trackWithChapters = [...this.tracks.values()].filter((track) => track.chapterList); 701 + if (trackWithChapters.length === 1) { 702 + const chapterTrackIds = trackWithChapters[0].chapterList; 703 + const chapterTracks = [...this.tracks.values()].filter((track) => chapterTrackIds.indexOf(track.header.trackId) !== -1); 704 + if (chapterTracks.length === 1) { 705 + return this.parseChapterTrack(chapterTracks[0], trackWithChapters[0], len); 706 + } 707 + } 708 + } 709 + await this.tokenizer.ignore(len); 710 + }, "mdat"), 711 + ftyp: /* @__PURE__ */ __name(async (len) => { 712 + const types = []; 713 + while (len > 0) { 714 + const ftype = await this.tokenizer.readToken(ftyp); 715 + len -= ftyp.len; 716 + const value = ftype.type.replace(/\W/g, ""); 717 + if (value.length > 0) { 718 + types.push(value); 719 + } 720 + } 721 + debug3(`ftyp: ${types.join("/")}`); 722 + const x = types.filter(distinct).join("/"); 723 + this.metadata.setFormat("container", x); 724 + }, "ftyp"), 725 + /** 726 + * Parse sample description atom 727 + */ 728 + stsd: /* @__PURE__ */ __name(async (len) => { 729 + const stsd = await this.tokenizer.readToken(new StsdAtom(len)); 730 + const trackDescription = this.getTrackDescription(); 731 + trackDescription.soundSampleDescription = stsd.table.map((dfEntry) => this.parseSoundSampleDescription(dfEntry)); 732 + }, "stsd"), 733 + /** 734 + * Parse sample-sizes atom ('stsz') 735 + */ 736 + stsz: /* @__PURE__ */ __name(async (len) => { 737 + const stsz = await this.tokenizer.readToken(new StszAtom(len)); 738 + const td = this.getTrackDescription(); 739 + td.sampleSize = stsz.sampleSize; 740 + td.sampleSizeTable = stsz.entries; 741 + }, "stsz"), 742 + date: /* @__PURE__ */ __name(async (len) => { 743 + const date = await this.tokenizer.readToken(new StringType(len, "utf-8")); 744 + await this.addTag("date", date); 745 + }, "date") 746 + }; 747 + } 748 + static read_BE_Integer(array, signed) { 749 + const integerType = (signed ? "INT" : "UINT") + array.length * 8 + (array.length > 1 ? "_BE" : ""); 750 + const token = lib_exports[integerType]; 751 + if (!token) { 752 + throw new Mp4ContentError(`Token for integer type not found: "${integerType}"`); 753 + } 754 + return Number(token.get(array, 0)); 755 + } 756 + async parse() { 757 + this.hasVideoTrack = false; 758 + this.hasAudioTrack = true; 759 + this.tracks.clear(); 760 + let remainingFileSize = this.tokenizer.fileInfo.size || 0; 761 + while (!this.tokenizer.fileInfo.size || remainingFileSize > 0) { 762 + try { 763 + const token = await this.tokenizer.peekToken(Header); 764 + if (token.name === "\0\0\0\0") { 765 + const errMsg = `Error at offset=${this.tokenizer.position}: box.id=0`; 766 + debug3(errMsg); 767 + this.addWarning(errMsg); 768 + break; 769 + } 770 + } catch (error) { 771 + if (error instanceof Error) { 772 + const errMsg = `Error at offset=${this.tokenizer.position}: ${error.message}`; 773 + debug3(errMsg); 774 + this.addWarning(errMsg); 775 + } else 776 + throw error; 777 + break; 778 + } 779 + const rootAtom = await Atom.readAtom(this.tokenizer, (atom, remaining) => this.handleAtom(atom, remaining), null, remainingFileSize); 780 + remainingFileSize -= rootAtom.header.length === BigInt(0) ? remainingFileSize : Number(rootAtom.header.length); 781 + } 782 + const formatList = []; 783 + this.tracks.forEach((track) => { 784 + const trackFormats = []; 785 + track.soundSampleDescription.forEach((ssd) => { 786 + const streamInfo = {}; 787 + const encoderInfo = encoderDict[ssd.dataFormat]; 788 + if (encoderInfo) { 789 + trackFormats.push(encoderInfo.format); 790 + streamInfo.codecName = encoderInfo.format; 791 + } else { 792 + streamInfo.codecName = `<${ssd.dataFormat}>`; 793 + } 794 + if (ssd.description) { 795 + const { description } = ssd; 796 + if (description.sampleRate > 0) { 797 + streamInfo.type = TrackType.audio; 798 + streamInfo.audio = { 799 + samplingFrequency: description.sampleRate, 800 + bitDepth: description.sampleSize, 801 + channels: description.numAudioChannels 802 + }; 803 + } 804 + } 805 + this.metadata.addStreamInfo(streamInfo); 806 + }); 807 + if (trackFormats.length >= 1) { 808 + formatList.push(trackFormats.join("/")); 809 + } 810 + }); 811 + if (formatList.length > 0) { 812 + this.metadata.setFormat("codec", formatList.filter(distinct).join("+")); 813 + } 814 + const audioTracks = [...this.tracks.values()].filter((track) => { 815 + return track.soundSampleDescription.length >= 1 && track.soundSampleDescription[0].description && track.soundSampleDescription[0].description.numAudioChannels > 0; 816 + }); 817 + for (const audioTrack of audioTracks) { 818 + if (audioTrack.media.header && audioTrack.media.header.timeScale > 0) { 819 + audioTrack.sampleRate = audioTrack.media.header.timeScale; 820 + if (audioTrack.media.header.duration > 0) { 821 + debug3("Using duration defined on audio track"); 822 + audioTrack.samples = audioTrack.media.header.duration; 823 + audioTrack.duration = audioTrack.samples / audioTrack.sampleRate; 824 + } 825 + if (audioTrack.fragments.length > 0) { 826 + debug3("Calculate duration defined in track fragments"); 827 + let totalTimeUnits = 0; 828 + audioTrack.sizeInBytes = 0; 829 + for (const fragment of audioTrack.fragments) { 830 + for (const sample of fragment.trackRun.samples) { 831 + const dur = sample.sampleDuration ?? fragment.header.defaultSampleDuration ?? 0; 832 + const size = sample.sampleSize ?? fragment.header.defaultSampleSize ?? 0; 833 + if (dur === 0) { 834 + throw new Error("Missing sampleDuration and no defaultSampleDuration in track fragment header"); 835 + } 836 + if (size === 0) { 837 + throw new Error("Missing sampleSize and no defaultSampleSize in track fragment header"); 838 + } 839 + totalTimeUnits += dur; 840 + audioTrack.sizeInBytes += size; 841 + } 842 + } 843 + if (!audioTrack.samples) { 844 + audioTrack.samples = totalTimeUnits; 845 + } 846 + if (!audioTrack.duration) { 847 + audioTrack.duration = totalTimeUnits / audioTrack.sampleRate; 848 + } 849 + } else if (audioTrack.sampleSizeTable.length > 0) { 850 + audioTrack.sizeInBytes = audioTrack.sampleSizeTable.reduce((sum, n) => sum + n, 0); 851 + } 852 + } 853 + const ssd = audioTrack.soundSampleDescription[0]; 854 + if (ssd.description && audioTrack.media.header) { 855 + this.metadata.setFormat("sampleRate", ssd.description.sampleRate); 856 + this.metadata.setFormat("bitsPerSample", ssd.description.sampleSize); 857 + this.metadata.setFormat("numberOfChannels", ssd.description.numAudioChannels); 858 + if (audioTrack.media.header.timeScale === 0 && audioTrack.timeToSampleTable.length > 0) { 859 + const totalSampleSize = audioTrack.timeToSampleTable.map((ttstEntry) => ttstEntry.count * ttstEntry.duration).reduce((total, sampleSize) => total + sampleSize); 860 + audioTrack.duration = totalSampleSize / ssd.description.sampleRate; 861 + } 862 + } 863 + const encoderInfo = encoderDict[ssd.dataFormat]; 864 + if (encoderInfo) { 865 + this.metadata.setFormat("lossless", !encoderInfo.lossy); 866 + } 867 + } 868 + if (audioTracks.length >= 1) { 869 + const firstAudioTrack = audioTracks[0]; 870 + if (firstAudioTrack.duration) { 871 + this.metadata.setFormat("duration", firstAudioTrack.duration); 872 + if (firstAudioTrack.sizeInBytes) { 873 + this.metadata.setFormat("bitrate", 8 * firstAudioTrack.sizeInBytes / firstAudioTrack.duration); 874 + } 875 + } 876 + } 877 + this.metadata.setFormat("hasAudio", this.hasAudioTrack); 878 + this.metadata.setFormat("hasVideo", this.hasVideoTrack); 879 + } 880 + async handleAtom(atom, remaining) { 881 + if (atom.parent) { 882 + switch (atom.parent.header.name) { 883 + case "ilst": 884 + case "<id>": 885 + return this.parseMetadataItemData(atom); 886 + case "moov": 887 + switch (atom.header.name) { 888 + case "trak": 889 + return this.parseTrackBox(atom); 890 + case "udta": 891 + return this.parseTrackBox(atom); 892 + } 893 + break; 894 + case "moof": 895 + switch (atom.header.name) { 896 + case "traf": 897 + return this.parseTrackFragmentBox(atom); 898 + } 899 + } 900 + } 901 + if (this.atomParsers[atom.header.name]) { 902 + return this.atomParsers[atom.header.name](remaining); 903 + } 904 + debug3(`No parser for atom path=${atom.atomPath}, payload-len=${remaining}, ignoring atom`); 905 + await this.tokenizer.ignore(remaining); 906 + } 907 + getTrackDescription() { 908 + const tracks = [...this.tracks.values()]; 909 + return tracks[tracks.length - 1]; 910 + } 911 + async addTag(id, value) { 912 + await this.metadata.addTag(tagFormat, id, value); 913 + } 914 + addWarning(message) { 915 + debug3(`Warning: ${message}`); 916 + this.metadata.addWarning(message); 917 + } 918 + /** 919 + * Parse data of Meta-item-list-atom (item of 'ilst' atom) 920 + * @param metaAtom 921 + * Ref: https://developer.apple.com/library/content/documentation/QuickTime/QTFF/Metadata/Metadata.html#//apple_ref/doc/uid/TP40000939-CH1-SW8 922 + */ 923 + parseMetadataItemData(metaAtom) { 924 + let tagKey = metaAtom.header.name; 925 + return metaAtom.readAtoms(this.tokenizer, async (child, remaining) => { 926 + const payLoadLength = child.getPayloadLength(remaining); 927 + switch (child.header.name) { 928 + case "data": 929 + return this.parseValueAtom(tagKey, child); 930 + case "name": 931 + // name atom (optional) 932 + case "mean": 933 + case "rate": { 934 + const name = await this.tokenizer.readToken(new NameAtom(payLoadLength)); 935 + tagKey += `:${name.name}`; 936 + break; 937 + } 938 + default: { 939 + const uint8Array = await this.tokenizer.readToken(new Uint8ArrayType(payLoadLength)); 940 + this.addWarning(`Unsupported meta-item: ${tagKey}[${child.header.name}] => value=${uint8ArrayToHex(uint8Array)} ascii=${textDecode(uint8Array, "ascii")}`); 941 + } 942 + } 943 + }, metaAtom.getPayloadLength(0)); 944 + } 945 + async parseValueAtom(tagKey, metaAtom) { 946 + const dataAtom = await this.tokenizer.readToken(new DataAtom(Number(metaAtom.header.length) - Header.len)); 947 + if (dataAtom.type.set !== 0) { 948 + throw new Mp4ContentError(`Unsupported type-set != 0: ${dataAtom.type.set}`); 949 + } 950 + switch (dataAtom.type.type) { 951 + case 0: 952 + switch (tagKey) { 953 + case "trkn": 954 + case "disk": { 955 + const num = UINT8.get(dataAtom.value, 3); 956 + const of = UINT8.get(dataAtom.value, 5); 957 + await this.addTag(tagKey, `${num}/${of}`); 958 + break; 959 + } 960 + case "gnre": { 961 + const genreInt = UINT8.get(dataAtom.value, 1); 962 + const genreStr = Genres[genreInt - 1]; 963 + await this.addTag(tagKey, genreStr); 964 + break; 965 + } 966 + case "rate": { 967 + const rate = textDecode(dataAtom.value, "ascii"); 968 + await this.addTag(tagKey, rate); 969 + break; 970 + } 971 + default: 972 + debug3(`unknown proprietary value type for: ${metaAtom.atomPath}`); 973 + } 974 + break; 975 + case 1: 976 + // UTF-8: Without any count or NULL terminator 977 + case 18: 978 + await this.addTag(tagKey, textDecode(dataAtom.value)); 979 + break; 980 + case 13: 981 + if (this.options.skipCovers) 982 + break; 983 + await this.addTag(tagKey, { 984 + format: "image/jpeg", 985 + data: Uint8Array.from(dataAtom.value) 986 + }); 987 + break; 988 + case 14: 989 + if (this.options.skipCovers) 990 + break; 991 + await this.addTag(tagKey, { 992 + format: "image/png", 993 + data: Uint8Array.from(dataAtom.value) 994 + }); 995 + break; 996 + case 21: 997 + await this.addTag(tagKey, _MP4Parser.read_BE_Integer(dataAtom.value, true)); 998 + break; 999 + case 22: 1000 + await this.addTag(tagKey, _MP4Parser.read_BE_Integer(dataAtom.value, false)); 1001 + break; 1002 + case 65: 1003 + await this.addTag(tagKey, UINT8.get(dataAtom.value, 0)); 1004 + break; 1005 + case 66: 1006 + await this.addTag(tagKey, UINT16_BE.get(dataAtom.value, 0)); 1007 + break; 1008 + case 67: 1009 + await this.addTag(tagKey, UINT32_BE.get(dataAtom.value, 0)); 1010 + break; 1011 + default: 1012 + this.addWarning(`atom key=${tagKey}, has unknown well-known-type (data-type): ${dataAtom.type.type}`); 1013 + } 1014 + } 1015 + async parseTrackBox(trakBox) { 1016 + const track = { 1017 + media: {}, 1018 + fragments: [] 1019 + }; 1020 + await trakBox.readAtoms(this.tokenizer, async (child, remaining) => { 1021 + const payLoadLength = child.getPayloadLength(remaining); 1022 + switch (child.header.name) { 1023 + case "chap": { 1024 + const chap = await this.tokenizer.readToken(new ChapterTrackReferenceBox(remaining)); 1025 + track.chapterList = chap; 1026 + break; 1027 + } 1028 + case "tkhd": 1029 + track.header = await this.tokenizer.readToken(new TrackHeaderAtom(payLoadLength)); 1030 + break; 1031 + case "hdlr": 1032 + track.handler = await this.tokenizer.readToken(new HandlerBox(payLoadLength)); 1033 + track.isAudio = () => track.handler.handlerType === "audi" || track.handler.handlerType === "soun"; 1034 + track.isVideo = () => track.handler.handlerType === "vide"; 1035 + if (track.isAudio()) { 1036 + this.hasAudioTrack = true; 1037 + } else if (track.isVideo()) { 1038 + this.hasVideoTrack = true; 1039 + } 1040 + break; 1041 + case "mdhd": { 1042 + const mdhd_data = await this.tokenizer.readToken(new MdhdAtom(payLoadLength)); 1043 + track.media.header = mdhd_data; 1044 + break; 1045 + } 1046 + case "stco": { 1047 + const stco = await this.tokenizer.readToken(new StcoAtom(payLoadLength)); 1048 + track.chunkOffsetTable = stco.entries; 1049 + break; 1050 + } 1051 + case "stsc": { 1052 + const stsc = await this.tokenizer.readToken(new StscAtom(payLoadLength)); 1053 + track.sampleToChunkTable = stsc.entries; 1054 + break; 1055 + } 1056 + case "stsd": { 1057 + const stsd = await this.tokenizer.readToken(new StsdAtom(payLoadLength)); 1058 + track.soundSampleDescription = stsd.table.map((dfEntry) => this.parseSoundSampleDescription(dfEntry)); 1059 + break; 1060 + } 1061 + case "stts": { 1062 + const stts = await this.tokenizer.readToken(new SttsAtom(payLoadLength)); 1063 + track.timeToSampleTable = stts.entries; 1064 + break; 1065 + } 1066 + case "stsz": { 1067 + const stsz = await this.tokenizer.readToken(new StszAtom(payLoadLength)); 1068 + track.sampleSize = stsz.sampleSize; 1069 + track.sampleSizeTable = stsz.entries; 1070 + break; 1071 + } 1072 + case "dinf": 1073 + case "vmhd": 1074 + case "smhd": 1075 + debug3(`Ignoring: ${child.header.name}`); 1076 + await this.tokenizer.ignore(payLoadLength); 1077 + break; 1078 + default: { 1079 + debug3(`Unexpected track box: ${child.header.name}`); 1080 + await this.tokenizer.ignore(payLoadLength); 1081 + } 1082 + } 1083 + }, trakBox.getPayloadLength(0)); 1084 + this.tracks.set(track.header.trackId, track); 1085 + } 1086 + parseTrackFragmentBox(trafBox) { 1087 + let tfhd; 1088 + return trafBox.readAtoms(this.tokenizer, async (child, remaining) => { 1089 + const payLoadLength = child.getPayloadLength(remaining); 1090 + switch (child.header.name) { 1091 + case "tfhd": { 1092 + const fragmentHeaderBox = new TrackFragmentHeaderBox(child.getPayloadLength(remaining)); 1093 + tfhd = await this.tokenizer.readToken(fragmentHeaderBox); 1094 + break; 1095 + } 1096 + case "tfdt": 1097 + await this.tokenizer.ignore(payLoadLength); 1098 + break; 1099 + case "trun": { 1100 + const trackRunBox = new TrackRunBox(payLoadLength); 1101 + const trun = await this.tokenizer.readToken(trackRunBox); 1102 + if (tfhd) { 1103 + const track = this.tracks.get(tfhd.trackId); 1104 + track?.fragments.push({ header: tfhd, trackRun: trun }); 1105 + } 1106 + break; 1107 + } 1108 + default: { 1109 + debug3(`Unexpected box: ${child.header.name}`); 1110 + await this.tokenizer.ignore(payLoadLength); 1111 + } 1112 + } 1113 + }, trafBox.getPayloadLength(0)); 1114 + } 1115 + /** 1116 + * @param sampleDescription 1117 + * Ref: https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html#//apple_ref/doc/uid/TP40000939-CH205-128916 1118 + */ 1119 + parseSoundSampleDescription(sampleDescription) { 1120 + const ssd = { 1121 + dataFormat: sampleDescription.dataFormat, 1122 + dataReferenceIndex: sampleDescription.dataReferenceIndex 1123 + }; 1124 + let offset = 0; 1125 + if (sampleDescription.description) { 1126 + const version = SoundSampleDescriptionVersion.get(sampleDescription.description, offset); 1127 + offset += SoundSampleDescriptionVersion.len; 1128 + if (version.version === 0 || version.version === 1) { 1129 + ssd.description = SoundSampleDescriptionV0.get(sampleDescription.description, offset); 1130 + } else { 1131 + debug3(`Warning: sound-sample-description ${version} not implemented`); 1132 + } 1133 + } 1134 + return ssd; 1135 + } 1136 + async parseChapterTrack(chapterTrack, track, len) { 1137 + if (!chapterTrack.sampleSize) { 1138 + if (chapterTrack.chunkOffsetTable.length !== chapterTrack.sampleSizeTable.length) 1139 + throw new Error("Expected equal chunk-offset-table & sample-size-table length."); 1140 + } 1141 + const chapters = []; 1142 + for (let i = 0; i < chapterTrack.chunkOffsetTable.length && len > 0; ++i) { 1143 + const start = chapterTrack.timeToSampleTable.slice(0, i).reduce((acc, cur) => acc + cur.duration, 0); 1144 + const chunkOffset = chapterTrack.chunkOffsetTable[i]; 1145 + const nextChunkLen = chunkOffset - this.tokenizer.position; 1146 + const sampleSize = chapterTrack.sampleSize > 0 ? chapterTrack.sampleSize : chapterTrack.sampleSizeTable[i]; 1147 + len -= nextChunkLen + sampleSize; 1148 + if (len < 0) 1149 + throw new Mp4ContentError("Chapter chunk exceeding token length"); 1150 + await this.tokenizer.ignore(nextChunkLen); 1151 + const title = await this.tokenizer.readToken(new ChapterText(sampleSize)); 1152 + debug3(`Chapter ${i + 1}: ${title}`); 1153 + const chapter = { 1154 + title, 1155 + timeScale: chapterTrack.media.header ? chapterTrack.media.header.timeScale : 0, 1156 + start, 1157 + sampleOffset: this.findSampleOffset(track, this.tokenizer.position) 1158 + }; 1159 + debug3(`Chapter title=${chapter.title}, offset=${chapter.sampleOffset}/${track.header.duration}`); 1160 + chapters.push(chapter); 1161 + } 1162 + this.metadata.setFormat("chapters", chapters); 1163 + await this.tokenizer.ignore(len); 1164 + } 1165 + findSampleOffset(track, chapterOffset) { 1166 + let chunkIndex = 0; 1167 + while (chunkIndex < track.chunkOffsetTable.length && track.chunkOffsetTable[chunkIndex] < chapterOffset) { 1168 + ++chunkIndex; 1169 + } 1170 + return this.getChunkDuration(chunkIndex + 1, track); 1171 + } 1172 + getChunkDuration(chunkId, track) { 1173 + let ttsi = 0; 1174 + let ttsc = track.timeToSampleTable[ttsi].count; 1175 + let ttsd = track.timeToSampleTable[ttsi].duration; 1176 + let curChunkId = 1; 1177 + let samplesPerChunk = this.getSamplesPerChunk(curChunkId, track.sampleToChunkTable); 1178 + let totalDuration = 0; 1179 + while (curChunkId < chunkId) { 1180 + const nrOfSamples = Math.min(ttsc, samplesPerChunk); 1181 + totalDuration += nrOfSamples * ttsd; 1182 + ttsc -= nrOfSamples; 1183 + samplesPerChunk -= nrOfSamples; 1184 + if (samplesPerChunk === 0) { 1185 + ++curChunkId; 1186 + samplesPerChunk = this.getSamplesPerChunk(curChunkId, track.sampleToChunkTable); 1187 + } else { 1188 + ++ttsi; 1189 + ttsc = track.timeToSampleTable[ttsi].count; 1190 + ttsd = track.timeToSampleTable[ttsi].duration; 1191 + } 1192 + } 1193 + return totalDuration; 1194 + } 1195 + getSamplesPerChunk(chunkId, stcTable) { 1196 + for (let i = 0; i < stcTable.length - 1; ++i) { 1197 + if (chunkId >= stcTable[i].firstChunk && chunkId < stcTable[i + 1].firstChunk) { 1198 + return stcTable[i].samplesPerChunk; 1199 + } 1200 + } 1201 + return stcTable[stcTable.length - 1].samplesPerChunk; 1202 + } 1203 + }; 1204 + export { 1205 + MP4Parser 1206 + }; 1207 + 1208 + //# sourceMappingURL=./MP4Parser-CA3XAXIP.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/MP4Parser-CA3XAXIP.js.map
··· 1 + {"version":3,"sources":["/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/mp4/MP4Parser.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/mp4/Atom.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/mp4/AtomToken.js"],"sourcesContent":["import initDebug from 'debug';\nimport * as Token from 'token-types';\nimport { BasicParser } from '../common/BasicParser.js';\nimport { Genres } from '../id3v1/ID3v1Parser.js';\nimport { Atom } from './Atom.js';\nimport * as AtomToken from './AtomToken.js';\nimport { ChapterTrackReferenceBox, Mp4ContentError } from './AtomToken.js';\nimport { TrackType } from '../type.js';\nimport { uint8ArrayToHex } from 'uint8array-extras';\nimport { textDecode } from '@borewit/text-codec';\nconst debug = initDebug('music-metadata:parser:MP4');\nconst tagFormat = 'iTunes';\nconst encoderDict = {\n raw: {\n lossy: false,\n format: 'raw'\n },\n MAC3: {\n lossy: true,\n format: 'MACE 3:1'\n },\n MAC6: {\n lossy: true,\n format: 'MACE 6:1'\n },\n ima4: {\n lossy: true,\n format: 'IMA 4:1'\n },\n ulaw: {\n lossy: true,\n format: 'uLaw 2:1'\n },\n alaw: {\n lossy: true,\n format: 'uLaw 2:1'\n },\n Qclp: {\n lossy: true,\n format: 'QUALCOMM PureVoice'\n },\n '.mp3': {\n lossy: true,\n format: 'MPEG-1 layer 3'\n },\n alac: {\n lossy: false,\n format: 'ALAC'\n },\n 'ac-3': {\n lossy: true,\n format: 'AC-3'\n },\n mp4a: {\n lossy: true,\n format: 'MPEG-4/AAC'\n },\n mp4s: {\n lossy: true,\n format: 'MP4S'\n },\n // Closed Captioning Media, https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html#//apple_ref/doc/uid/TP40000939-CH205-SW87\n c608: {\n lossy: true,\n format: 'CEA-608'\n },\n c708: {\n lossy: true,\n format: 'CEA-708'\n }\n};\nfunction distinct(value, index, self) {\n return self.indexOf(value) === index;\n}\n/*\n * Parser for the MP4 (MPEG-4 Part 14) container format\n * Standard: ISO/IEC 14496-14\n * supporting:\n * - QuickTime container\n * - MP4 File Format\n * - 3GPP file format\n * - 3GPP2 file format\n *\n * MPEG-4 Audio / Part 3 (.m4a)& MPEG 4 Video (m4v, mp4) extension.\n * Support for Apple iTunes tags as found in a M4A/M4V files.\n * Ref:\n * https://en.wikipedia.org/wiki/ISO_base_media_file_format\n * https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/Metadata/Metadata.html\n * http://atomicparsley.sourceforge.net/mpeg-4files.html\n * https://github.com/sergiomb2/libmp4v2/wiki/iTunesMetadata\n * https://wiki.multimedia.cx/index.php/QuickTime_container\n */\nexport class MP4Parser extends BasicParser {\n constructor() {\n super(...arguments);\n this.tracks = new Map();\n this.hasVideoTrack = false;\n this.hasAudioTrack = true;\n this.atomParsers = {\n /**\n * Parse movie header (mvhd) atom\n * Ref: https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap2/qtff2.html#//apple_ref/doc/uid/TP40000939-CH204-56313\n */\n mvhd: async (len) => {\n const mvhd = await this.tokenizer.readToken(new AtomToken.MvhdAtom(len));\n this.metadata.setFormat('creationTime', mvhd.creationTime);\n this.metadata.setFormat('modificationTime', mvhd.modificationTime);\n },\n chap: async (len) => {\n const td = this.getTrackDescription();\n const trackIds = [];\n while (len >= Token.UINT32_BE.len) {\n trackIds.push(await this.tokenizer.readNumber(Token.UINT32_BE));\n len -= Token.UINT32_BE.len;\n }\n td.chapterList = trackIds;\n },\n /**\n * Parse mdat atom.\n * Will scan for chapters\n */\n mdat: async (len) => {\n if (this.options.includeChapters) {\n const trackWithChapters = [...this.tracks.values()].filter(track => track.chapterList);\n if (trackWithChapters.length === 1) {\n const chapterTrackIds = trackWithChapters[0].chapterList;\n const chapterTracks = [...this.tracks.values()].filter(track => chapterTrackIds.indexOf(track.header.trackId) !== -1);\n if (chapterTracks.length === 1) {\n return this.parseChapterTrack(chapterTracks[0], trackWithChapters[0], len);\n }\n }\n }\n await this.tokenizer.ignore(len);\n },\n ftyp: async (len) => {\n const types = [];\n while (len > 0) {\n const ftype = await this.tokenizer.readToken(AtomToken.ftyp);\n len -= AtomToken.ftyp.len;\n const value = ftype.type.replace(/\\W/g, '');\n if (value.length > 0) {\n types.push(value); // unshift for backward compatibility\n }\n }\n debug(`ftyp: ${types.join('/')}`);\n const x = types.filter(distinct).join('/');\n this.metadata.setFormat('container', x);\n },\n /**\n * Parse sample description atom\n */\n stsd: async (len) => {\n const stsd = await this.tokenizer.readToken(new AtomToken.StsdAtom(len));\n const trackDescription = this.getTrackDescription();\n trackDescription.soundSampleDescription = stsd.table.map(dfEntry => this.parseSoundSampleDescription(dfEntry));\n },\n /**\n * Parse sample-sizes atom ('stsz')\n */\n stsz: async (len) => {\n const stsz = await this.tokenizer.readToken(new AtomToken.StszAtom(len));\n const td = this.getTrackDescription();\n td.sampleSize = stsz.sampleSize;\n td.sampleSizeTable = stsz.entries;\n },\n date: async (len) => {\n const date = await this.tokenizer.readToken(new Token.StringType(len, 'utf-8'));\n await this.addTag('date', date);\n }\n };\n }\n static read_BE_Integer(array, signed) {\n const integerType = (signed ? 'INT' : 'UINT') + array.length * 8 + (array.length > 1 ? '_BE' : '');\n const token = Token[integerType];\n if (!token) {\n throw new Mp4ContentError(`Token for integer type not found: \"${integerType}\"`);\n }\n return Number(token.get(array, 0));\n }\n async parse() {\n this.hasVideoTrack = false;\n this.hasAudioTrack = true;\n this.tracks.clear();\n let remainingFileSize = this.tokenizer.fileInfo.size || 0;\n while (!this.tokenizer.fileInfo.size || remainingFileSize > 0) {\n try {\n const token = await this.tokenizer.peekToken(AtomToken.Header);\n if (token.name === '\\0\\0\\0\\0') {\n const errMsg = `Error at offset=${this.tokenizer.position}: box.id=0`;\n debug(errMsg);\n this.addWarning(errMsg);\n break;\n }\n }\n catch (error) {\n if (error instanceof Error) {\n const errMsg = `Error at offset=${this.tokenizer.position}: ${error.message}`;\n debug(errMsg);\n this.addWarning(errMsg);\n }\n else\n throw error;\n break;\n }\n const rootAtom = await Atom.readAtom(this.tokenizer, (atom, remaining) => this.handleAtom(atom, remaining), null, remainingFileSize);\n remainingFileSize -= rootAtom.header.length === BigInt(0) ? remainingFileSize : Number(rootAtom.header.length);\n }\n // Post process metadata\n const formatList = [];\n this.tracks.forEach(track => {\n const trackFormats = [];\n track.soundSampleDescription.forEach(ssd => {\n const streamInfo = {};\n const encoderInfo = encoderDict[ssd.dataFormat];\n if (encoderInfo) {\n trackFormats.push(encoderInfo.format);\n streamInfo.codecName = encoderInfo.format;\n }\n else {\n streamInfo.codecName = `<${ssd.dataFormat}>`;\n }\n if (ssd.description) {\n const { description } = ssd;\n if (description.sampleRate > 0) {\n streamInfo.type = TrackType.audio;\n streamInfo.audio = {\n samplingFrequency: description.sampleRate,\n bitDepth: description.sampleSize,\n channels: description.numAudioChannels\n };\n }\n }\n this.metadata.addStreamInfo(streamInfo);\n });\n if (trackFormats.length >= 1) {\n formatList.push(trackFormats.join('/'));\n }\n });\n if (formatList.length > 0) {\n this.metadata.setFormat('codec', formatList.filter(distinct).join('+'));\n }\n const audioTracks = [...this.tracks.values()].filter(track => {\n return track.soundSampleDescription.length >= 1 && track.soundSampleDescription[0].description && track.soundSampleDescription[0].description.numAudioChannels > 0;\n });\n // Calculate duration and bitrate of audio tracks\n for (const audioTrack of audioTracks) {\n if (audioTrack.media.header && audioTrack.media.header.timeScale > 0) {\n audioTrack.sampleRate = audioTrack.media.header.timeScale;\n if (audioTrack.media.header.duration > 0) {\n debug('Using duration defined on audio track');\n audioTrack.samples = audioTrack.media.header.duration;\n audioTrack.duration = audioTrack.samples / audioTrack.sampleRate;\n }\n if (audioTrack.fragments.length > 0) {\n debug('Calculate duration defined in track fragments');\n let totalTimeUnits = 0;\n audioTrack.sizeInBytes = 0;\n for (const fragment of audioTrack.fragments) {\n for (const sample of fragment.trackRun.samples) {\n const dur = sample.sampleDuration ?? fragment.header.defaultSampleDuration ?? 0;\n const size = sample.sampleSize ?? fragment.header.defaultSampleSize ?? 0;\n if (dur === 0) {\n throw new Error(\"Missing sampleDuration and no defaultSampleDuration in track fragment header\");\n }\n if (size === 0) {\n throw new Error(\"Missing sampleSize and no defaultSampleSize in track fragment header\");\n }\n totalTimeUnits += dur;\n audioTrack.sizeInBytes += size;\n }\n }\n if (!audioTrack.samples) {\n audioTrack.samples = totalTimeUnits;\n }\n if (!audioTrack.duration) {\n audioTrack.duration = totalTimeUnits / audioTrack.sampleRate;\n }\n }\n else if (audioTrack.sampleSizeTable.length > 0) {\n audioTrack.sizeInBytes = audioTrack.sampleSizeTable.reduce((sum, n) => sum + n, 0);\n }\n }\n const ssd = audioTrack.soundSampleDescription[0];\n if (ssd.description && audioTrack.media.header) {\n this.metadata.setFormat('sampleRate', ssd.description.sampleRate);\n this.metadata.setFormat('bitsPerSample', ssd.description.sampleSize);\n this.metadata.setFormat('numberOfChannels', ssd.description.numAudioChannels);\n if (audioTrack.media.header.timeScale === 0 && audioTrack.timeToSampleTable.length > 0) {\n const totalSampleSize = audioTrack.timeToSampleTable\n .map(ttstEntry => ttstEntry.count * ttstEntry.duration)\n .reduce((total, sampleSize) => total + sampleSize);\n audioTrack.duration = totalSampleSize / ssd.description.sampleRate;\n }\n }\n const encoderInfo = encoderDict[ssd.dataFormat];\n if (encoderInfo) {\n this.metadata.setFormat('lossless', !encoderInfo.lossy);\n }\n }\n if (audioTracks.length >= 1) {\n const firstAudioTrack = audioTracks[0];\n if (firstAudioTrack.duration) {\n this.metadata.setFormat('duration', firstAudioTrack.duration);\n if (firstAudioTrack.sizeInBytes) {\n this.metadata.setFormat('bitrate', 8 * firstAudioTrack.sizeInBytes / firstAudioTrack.duration);\n }\n }\n }\n this.metadata.setFormat('hasAudio', this.hasAudioTrack);\n this.metadata.setFormat('hasVideo', this.hasVideoTrack);\n }\n async handleAtom(atom, remaining) {\n if (atom.parent) {\n switch (atom.parent.header.name) {\n case 'ilst':\n case '<id>':\n return this.parseMetadataItemData(atom);\n case 'moov':\n switch (atom.header.name) {\n case 'trak':\n return this.parseTrackBox(atom);\n case 'udta':\n return this.parseTrackBox(atom);\n }\n break;\n case 'moof':\n switch (atom.header.name) {\n case 'traf':\n return this.parseTrackFragmentBox(atom);\n }\n }\n }\n // const payloadLength = atom.getPayloadLength(remaining);\n if (this.atomParsers[atom.header.name]) {\n return this.atomParsers[atom.header.name](remaining);\n }\n debug(`No parser for atom path=${atom.atomPath}, payload-len=${remaining}, ignoring atom`);\n await this.tokenizer.ignore(remaining);\n }\n getTrackDescription() {\n // ToDo: pick the right track, not the last track!!!!\n const tracks = [...this.tracks.values()];\n return tracks[tracks.length - 1];\n }\n async addTag(id, value) {\n await this.metadata.addTag(tagFormat, id, value);\n }\n addWarning(message) {\n debug(`Warning: ${message}`);\n this.metadata.addWarning(message);\n }\n /**\n * Parse data of Meta-item-list-atom (item of 'ilst' atom)\n * @param metaAtom\n * Ref: https://developer.apple.com/library/content/documentation/QuickTime/QTFF/Metadata/Metadata.html#//apple_ref/doc/uid/TP40000939-CH1-SW8\n */\n parseMetadataItemData(metaAtom) {\n let tagKey = metaAtom.header.name;\n return metaAtom.readAtoms(this.tokenizer, async (child, remaining) => {\n const payLoadLength = child.getPayloadLength(remaining);\n switch (child.header.name) {\n case 'data': // value atom\n return this.parseValueAtom(tagKey, child);\n case 'name': // name atom (optional)\n case 'mean':\n case 'rate': {\n const name = await this.tokenizer.readToken(new AtomToken.NameAtom(payLoadLength));\n tagKey += `:${name.name}`;\n break;\n }\n default: {\n const uint8Array = await this.tokenizer.readToken(new Token.Uint8ArrayType(payLoadLength));\n this.addWarning(`Unsupported meta-item: ${tagKey}[${child.header.name}] => value=${uint8ArrayToHex(uint8Array)} ascii=${textDecode(uint8Array, 'ascii')}`);\n }\n }\n }, metaAtom.getPayloadLength(0));\n }\n async parseValueAtom(tagKey, metaAtom) {\n const dataAtom = await this.tokenizer.readToken(new AtomToken.DataAtom(Number(metaAtom.header.length) - AtomToken.Header.len));\n if (dataAtom.type.set !== 0) {\n throw new Mp4ContentError(`Unsupported type-set != 0: ${dataAtom.type.set}`);\n }\n // Use well-known-type table\n // Ref: https://developer.apple.com/library/content/documentation/QuickTime/QTFF/Metadata/Metadata.html#//apple_ref/doc/uid/TP40000939-CH1-SW35\n switch (dataAtom.type.type) {\n case 0: // reserved: Reserved for use where no type needs to be indicated\n switch (tagKey) {\n case 'trkn':\n case 'disk': {\n const num = Token.UINT8.get(dataAtom.value, 3);\n const of = Token.UINT8.get(dataAtom.value, 5);\n // console.log(\" %s[data] = %s/%s\", tagKey, num, of);\n await this.addTag(tagKey, `${num}/${of}`);\n break;\n }\n case 'gnre': {\n const genreInt = Token.UINT8.get(dataAtom.value, 1);\n const genreStr = Genres[genreInt - 1];\n // console.log(\" %s[data] = %s\", tagKey, genreStr);\n await this.addTag(tagKey, genreStr);\n break;\n }\n case 'rate': {\n const rate = textDecode(dataAtom.value, 'ascii');\n await this.addTag(tagKey, rate);\n break;\n }\n default:\n debug(`unknown proprietary value type for: ${metaAtom.atomPath}`);\n }\n break;\n case 1: // UTF-8: Without any count or NULL terminator\n case 18: // Unknown: Found in m4b in combination with a '©gen' tag\n await this.addTag(tagKey, textDecode(dataAtom.value));\n break;\n case 13: // JPEG\n if (this.options.skipCovers)\n break;\n await this.addTag(tagKey, {\n format: 'image/jpeg',\n data: Uint8Array.from(dataAtom.value)\n });\n break;\n case 14: // PNG\n if (this.options.skipCovers)\n break;\n await this.addTag(tagKey, {\n format: 'image/png',\n data: Uint8Array.from(dataAtom.value)\n });\n break;\n case 21: // BE Signed Integer\n await this.addTag(tagKey, MP4Parser.read_BE_Integer(dataAtom.value, true));\n break;\n case 22: // BE Unsigned Integer\n await this.addTag(tagKey, MP4Parser.read_BE_Integer(dataAtom.value, false));\n break;\n case 65: // An 8-bit signed integer\n await this.addTag(tagKey, Token.UINT8.get(dataAtom.value, 0));\n break;\n case 66: // A big-endian 16-bit signed integer\n await this.addTag(tagKey, Token.UINT16_BE.get(dataAtom.value, 0));\n break;\n case 67: // A big-endian 32-bit signed integer\n await this.addTag(tagKey, Token.UINT32_BE.get(dataAtom.value, 0));\n break;\n default:\n this.addWarning(`atom key=${tagKey}, has unknown well-known-type (data-type): ${dataAtom.type.type}`);\n }\n }\n async parseTrackBox(trakBox) {\n // @ts-expect-error\n const track = {\n media: {},\n fragments: []\n };\n await trakBox.readAtoms(this.tokenizer, async (child, remaining) => {\n const payLoadLength = child.getPayloadLength(remaining);\n switch (child.header.name) {\n case 'chap': {\n const chap = await this.tokenizer.readToken(new ChapterTrackReferenceBox(remaining));\n track.chapterList = chap;\n break;\n }\n case 'tkhd': // TrackHeaderBox\n track.header = await this.tokenizer.readToken(new AtomToken.TrackHeaderAtom(payLoadLength));\n break;\n case 'hdlr': // TrackHeaderBox\n track.handler = await this.tokenizer.readToken(new AtomToken.HandlerBox(payLoadLength));\n track.isAudio = () => track.handler.handlerType === 'audi' || track.handler.handlerType === 'soun';\n track.isVideo = () => track.handler.handlerType === 'vide';\n if (track.isAudio()) {\n this.hasAudioTrack = true;\n }\n else if (track.isVideo()) {\n this.hasVideoTrack = true;\n }\n break;\n case 'mdhd': { // Parse media header (mdhd) box\n const mdhd_data = await this.tokenizer.readToken(new AtomToken.MdhdAtom(payLoadLength));\n track.media.header = mdhd_data;\n break;\n }\n case 'stco': {\n const stco = await this.tokenizer.readToken(new AtomToken.StcoAtom(payLoadLength));\n track.chunkOffsetTable = stco.entries; // remember chunk offsets\n break;\n }\n case 'stsc': { // sample-to-Chunk box\n const stsc = await this.tokenizer.readToken(new AtomToken.StscAtom(payLoadLength));\n track.sampleToChunkTable = stsc.entries;\n break;\n }\n case 'stsd': { // sample description box\n const stsd = await this.tokenizer.readToken(new AtomToken.StsdAtom(payLoadLength));\n track.soundSampleDescription = stsd.table.map(dfEntry => this.parseSoundSampleDescription(dfEntry));\n break;\n }\n case 'stts': { // time-to-sample table\n const stts = await this.tokenizer.readToken(new AtomToken.SttsAtom(payLoadLength));\n track.timeToSampleTable = stts.entries;\n break;\n }\n case 'stsz': {\n const stsz = await this.tokenizer.readToken(new AtomToken.StszAtom(payLoadLength));\n track.sampleSize = stsz.sampleSize;\n track.sampleSizeTable = stsz.entries;\n break;\n }\n case 'dinf':\n case 'vmhd':\n case 'smhd':\n debug(`Ignoring: ${child.header.name}`);\n await this.tokenizer.ignore(payLoadLength);\n break;\n default: {\n debug(`Unexpected track box: ${child.header.name}`);\n await this.tokenizer.ignore(payLoadLength);\n }\n }\n }, trakBox.getPayloadLength(0));\n // Register track\n this.tracks.set(track.header.trackId, track);\n }\n parseTrackFragmentBox(trafBox) {\n let tfhd;\n return trafBox.readAtoms(this.tokenizer, async (child, remaining) => {\n const payLoadLength = child.getPayloadLength(remaining);\n switch (child.header.name) {\n case 'tfhd': { // TrackFragmentHeaderBox\n const fragmentHeaderBox = new AtomToken.TrackFragmentHeaderBox(child.getPayloadLength(remaining));\n tfhd = await this.tokenizer.readToken(fragmentHeaderBox);\n break;\n }\n case 'tfdt': // TrackFragmentBaseMediaDecodeTimeBo\n await this.tokenizer.ignore(payLoadLength);\n break;\n case 'trun': { // TrackRunBox\n const trackRunBox = new AtomToken.TrackRunBox(payLoadLength);\n const trun = await this.tokenizer.readToken(trackRunBox);\n if (tfhd) {\n const track = this.tracks.get(tfhd.trackId);\n track?.fragments.push({ header: tfhd, trackRun: trun });\n }\n break;\n }\n default: {\n debug(`Unexpected box: ${child.header.name}`);\n await this.tokenizer.ignore(payLoadLength);\n }\n }\n }, trafBox.getPayloadLength(0));\n }\n /**\n * @param sampleDescription\n * Ref: https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html#//apple_ref/doc/uid/TP40000939-CH205-128916\n */\n parseSoundSampleDescription(sampleDescription) {\n const ssd = {\n dataFormat: sampleDescription.dataFormat,\n dataReferenceIndex: sampleDescription.dataReferenceIndex\n };\n let offset = 0;\n if (sampleDescription.description) {\n const version = AtomToken.SoundSampleDescriptionVersion.get(sampleDescription.description, offset);\n offset += AtomToken.SoundSampleDescriptionVersion.len;\n if (version.version === 0 || version.version === 1) {\n // Sound Sample Description (Version 0)\n ssd.description = AtomToken.SoundSampleDescriptionV0.get(sampleDescription.description, offset);\n }\n else {\n debug(`Warning: sound-sample-description ${version} not implemented`);\n }\n }\n return ssd;\n }\n async parseChapterTrack(chapterTrack, track, len) {\n if (!chapterTrack.sampleSize) {\n if (chapterTrack.chunkOffsetTable.length !== chapterTrack.sampleSizeTable.length)\n throw new Error('Expected equal chunk-offset-table & sample-size-table length.');\n }\n const chapters = [];\n for (let i = 0; i < chapterTrack.chunkOffsetTable.length && len > 0; ++i) {\n const start = chapterTrack.timeToSampleTable\n .slice(0, i)\n .reduce((acc, cur) => acc + cur.duration, 0);\n const chunkOffset = chapterTrack.chunkOffsetTable[i];\n const nextChunkLen = chunkOffset - this.tokenizer.position;\n const sampleSize = chapterTrack.sampleSize > 0 ? chapterTrack.sampleSize : chapterTrack.sampleSizeTable[i];\n len -= nextChunkLen + sampleSize;\n if (len < 0)\n throw new Mp4ContentError('Chapter chunk exceeding token length');\n await this.tokenizer.ignore(nextChunkLen);\n const title = await this.tokenizer.readToken(new AtomToken.ChapterText(sampleSize));\n debug(`Chapter ${i + 1}: ${title}`);\n const chapter = {\n title,\n timeScale: chapterTrack.media.header ? chapterTrack.media.header.timeScale : 0,\n start,\n sampleOffset: this.findSampleOffset(track, this.tokenizer.position)\n };\n debug(`Chapter title=${chapter.title}, offset=${chapter.sampleOffset}/${track.header.duration}`); // ToDo, use media duration if required!!!\n chapters.push(chapter);\n }\n this.metadata.setFormat('chapters', chapters);\n await this.tokenizer.ignore(len);\n }\n findSampleOffset(track, chapterOffset) {\n let chunkIndex = 0;\n while (chunkIndex < track.chunkOffsetTable.length && track.chunkOffsetTable[chunkIndex] < chapterOffset) {\n ++chunkIndex;\n }\n return this.getChunkDuration(chunkIndex + 1, track);\n }\n getChunkDuration(chunkId, track) {\n let ttsi = 0;\n let ttsc = track.timeToSampleTable[ttsi].count;\n let ttsd = track.timeToSampleTable[ttsi].duration;\n let curChunkId = 1;\n let samplesPerChunk = this.getSamplesPerChunk(curChunkId, track.sampleToChunkTable);\n let totalDuration = 0;\n while (curChunkId < chunkId) {\n const nrOfSamples = Math.min(ttsc, samplesPerChunk);\n totalDuration += nrOfSamples * ttsd;\n ttsc -= nrOfSamples;\n samplesPerChunk -= nrOfSamples;\n if (samplesPerChunk === 0) {\n ++curChunkId;\n samplesPerChunk = this.getSamplesPerChunk(curChunkId, track.sampleToChunkTable);\n }\n else {\n ++ttsi;\n ttsc = track.timeToSampleTable[ttsi].count;\n ttsd = track.timeToSampleTable[ttsi].duration;\n }\n }\n return totalDuration;\n }\n getSamplesPerChunk(chunkId, stcTable) {\n for (let i = 0; i < stcTable.length - 1; ++i) {\n if (chunkId >= stcTable[i].firstChunk && chunkId < stcTable[i + 1].firstChunk) {\n return stcTable[i].samplesPerChunk;\n }\n }\n return stcTable[stcTable.length - 1].samplesPerChunk;\n }\n}\n","import initDebug from 'debug';\nimport * as AtomToken from './AtomToken.js';\nimport { Header } from './AtomToken.js';\nconst debug = initDebug('music-metadata:parser:MP4:Atom');\nexport class Atom {\n static async readAtom(tokenizer, dataHandler, parent, remaining) {\n // Parse atom header\n const offset = tokenizer.position;\n debug(`Reading next token on offset=${offset}...`); // buf.toString('ascii')\n const header = await tokenizer.readToken(AtomToken.Header);\n const extended = header.length === 1n;\n if (extended) {\n header.length = await tokenizer.readToken(AtomToken.ExtendedSize);\n }\n const atomBean = new Atom(header, extended, parent);\n const payloadLength = atomBean.getPayloadLength(remaining);\n debug(`parse atom name=${atomBean.atomPath}, extended=${atomBean.extended}, offset=${offset}, len=${atomBean.header.length}`); // buf.toString('ascii')\n await atomBean.readData(tokenizer, dataHandler, payloadLength);\n return atomBean;\n }\n constructor(header, extended, parent) {\n this.header = header;\n this.extended = extended;\n this.parent = parent;\n this.children = [];\n this.atomPath = (this.parent ? `${this.parent.atomPath}.` : '') + this.header.name;\n }\n getHeaderLength() {\n return this.extended ? 16 : 8;\n }\n getPayloadLength(remaining) {\n return (this.header.length === 0n ? remaining : Number(this.header.length)) - this.getHeaderLength();\n }\n async readAtoms(tokenizer, dataHandler, size) {\n while (size > 0) {\n const atomBean = await Atom.readAtom(tokenizer, dataHandler, this, size);\n this.children.push(atomBean);\n size -= atomBean.header.length === 0n ? size : Number(atomBean.header.length);\n }\n }\n async readData(tokenizer, dataHandler, remaining) {\n switch (this.header.name) {\n // \"Container\" atoms, contains nested atoms\n case 'moov': // The Movie Atom: contains other atoms\n case 'udta': // User defined atom\n case 'mdia': // Media atom\n case 'minf': // Media Information Atom\n case 'stbl': // The Sample Table Atom\n case '<id>':\n case 'ilst':\n case 'tref':\n case 'moof':\n return this.readAtoms(tokenizer, dataHandler, this.getPayloadLength(remaining));\n case 'meta': { // Metadata Atom, ref: https://developer.apple.com/library/content/documentation/QuickTime/QTFF/Metadata/Metadata.html#//apple_ref/doc/uid/TP40000939-CH1-SW8\n // meta has 4 bytes of padding, ignore\n const peekHeader = await tokenizer.peekToken(Header);\n const paddingLength = peekHeader.name === 'hdlr' ? 0 : 4;\n await tokenizer.ignore(paddingLength);\n return this.readAtoms(tokenizer, dataHandler, this.getPayloadLength(remaining) - paddingLength);\n }\n default:\n return dataHandler(this, remaining);\n }\n }\n}\n","import * as Token from 'token-types';\nimport initDebug from 'debug';\nimport { FourCcToken } from '../common/FourCC.js';\nimport { makeUnexpectedFileContentError } from '../ParseError.js';\nimport * as util from '../common/Util.js';\nconst debug = initDebug('music-metadata:parser:MP4:atom');\nexport class Mp4ContentError extends makeUnexpectedFileContentError('MP4') {\n}\nexport const Header = {\n len: 8,\n get: (buf, off) => {\n const length = Token.UINT32_BE.get(buf, off);\n if (length < 0)\n throw new Mp4ContentError('Invalid atom header length');\n return {\n length: BigInt(length),\n name: new Token.StringType(4, 'latin1').get(buf, off + 4)\n };\n },\n put: (buf, off, hdr) => {\n Token.UINT32_BE.put(buf, off, Number(hdr.length));\n return FourCcToken.put(buf, off + 4, hdr.name);\n }\n};\n/**\n * Ref: https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html#//apple_ref/doc/uid/TP40000939-CH203-38190\n */\nexport const ExtendedSize = Token.UINT64_BE;\nexport const ftyp = {\n len: 4,\n get: (buf, off) => {\n return {\n type: new Token.StringType(4, 'ascii').get(buf, off)\n };\n }\n};\n/**\n * Token: Movie Header Atom\n */\nexport const mhdr = {\n len: 8,\n get: (buf, off) => {\n return {\n version: Token.UINT8.get(buf, off),\n flags: Token.UINT24_BE.get(buf, off + 1),\n nextItemID: Token.UINT32_BE.get(buf, off + 4)\n };\n }\n};\n/**\n * Base class for 'fixed' length atoms.\n * In some cases these atoms are longer then the sum of the described fields.\n * Issue: https://github.com/Borewit/music-metadata/issues/120\n */\nexport class FixedLengthAtom {\n /**\n *\n * @param {number} len Length as specified in the size field\n * @param {number} expLen Total length of sum of specified fields in the standard\n * @param atomId Atom ID\n */\n constructor(len, expLen, atomId) {\n if (len < expLen) {\n throw new Mp4ContentError(`Atom ${atomId} expected to be ${expLen}, but specifies ${len} bytes long.`);\n }\n if (len > expLen) {\n debug(`Warning: atom ${atomId} expected to be ${expLen}, but was actually ${len} bytes long.`);\n }\n this.len = len;\n }\n}\n/**\n * Timestamp stored in seconds since Mac Epoch (1 January 1904)\n */\nconst SecondsSinceMacEpoch = {\n len: 4,\n get: (buf, off) => {\n const secondsSinceUnixEpoch = Token.UINT32_BE.get(buf, off) - 2082844800;\n return new Date(secondsSinceUnixEpoch * 1000);\n }\n};\n/**\n * Token: Media Header Atom\n * Ref:\n * - https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap2/qtff2.html#//apple_ref/doc/uid/TP40000939-CH204-SW34\n * - https://wiki.multimedia.cx/index.php/QuickTime_container#mdhd\n */\nexport class MdhdAtom extends FixedLengthAtom {\n constructor(len) {\n super(len, 24, 'mdhd');\n }\n get(buf, off) {\n return {\n version: Token.UINT8.get(buf, off + 0),\n flags: Token.UINT24_BE.get(buf, off + 1),\n creationTime: SecondsSinceMacEpoch.get(buf, off + 4),\n modificationTime: SecondsSinceMacEpoch.get(buf, off + 8),\n timeScale: Token.UINT32_BE.get(buf, off + 12),\n duration: Token.UINT32_BE.get(buf, off + 16),\n language: Token.UINT16_BE.get(buf, off + 20),\n quality: Token.UINT16_BE.get(buf, off + 22)\n };\n }\n}\n/**\n * Token: Movie Header Atom\n */\nexport class MvhdAtom extends FixedLengthAtom {\n constructor(len) {\n super(len, 100, 'mvhd');\n }\n get(buf, off) {\n return {\n version: Token.UINT8.get(buf, off),\n flags: Token.UINT24_BE.get(buf, off + 1),\n creationTime: SecondsSinceMacEpoch.get(buf, off + 4),\n modificationTime: SecondsSinceMacEpoch.get(buf, off + 8),\n timeScale: Token.UINT32_BE.get(buf, off + 12),\n duration: Token.UINT32_BE.get(buf, off + 16),\n preferredRate: Token.UINT32_BE.get(buf, off + 20),\n preferredVolume: Token.UINT16_BE.get(buf, off + 24),\n // ignore reserver: 10 bytes\n // ignore matrix structure: 36 bytes\n previewTime: Token.UINT32_BE.get(buf, off + 72),\n previewDuration: Token.UINT32_BE.get(buf, off + 76),\n posterTime: Token.UINT32_BE.get(buf, off + 80),\n selectionTime: Token.UINT32_BE.get(buf, off + 84),\n selectionDuration: Token.UINT32_BE.get(buf, off + 88),\n currentTime: Token.UINT32_BE.get(buf, off + 92),\n nextTrackID: Token.UINT32_BE.get(buf, off + 96)\n };\n }\n}\n/**\n * Data Atom Structure\n */\nexport class DataAtom {\n constructor(len) {\n this.len = len;\n }\n get(buf, off) {\n return {\n type: {\n set: Token.UINT8.get(buf, off + 0),\n type: Token.UINT24_BE.get(buf, off + 1)\n },\n locale: Token.UINT24_BE.get(buf, off + 4),\n value: new Token.Uint8ArrayType(this.len - 8).get(buf, off + 8)\n };\n }\n}\n/**\n * Data Atom Structure\n * Ref: https://developer.apple.com/library/content/documentation/QuickTime/QTFF/Metadata/Metadata.html#//apple_ref/doc/uid/TP40000939-CH1-SW31\n */\nexport class NameAtom {\n constructor(len) {\n this.len = len;\n }\n get(buf, off) {\n return {\n version: Token.UINT8.get(buf, off),\n flags: Token.UINT24_BE.get(buf, off + 1),\n name: new Token.StringType(this.len - 4, 'utf-8').get(buf, off + 4)\n };\n }\n}\n/**\n * Track Header Atoms structure (`tkhd`)\n * Ref: https://developer.apple.com/library/content/documentation/QuickTime/QTFF/QTFFChap2/qtff2.html#//apple_ref/doc/uid/TP40000939-CH204-25550\n */\nexport class TrackHeaderAtom {\n constructor(len) {\n this.len = len;\n }\n get(buf, off) {\n return {\n version: Token.UINT8.get(buf, off),\n flags: Token.UINT24_BE.get(buf, off + 1),\n creationTime: SecondsSinceMacEpoch.get(buf, off + 4),\n modificationTime: SecondsSinceMacEpoch.get(buf, off + 8),\n trackId: Token.UINT32_BE.get(buf, off + 12),\n // reserved 4 bytes\n duration: Token.UINT32_BE.get(buf, off + 20),\n layer: Token.UINT16_BE.get(buf, off + 24),\n alternateGroup: Token.UINT16_BE.get(buf, off + 26),\n volume: Token.UINT16_BE.get(buf, off + 28) // ToDo: fixed point\n // ToDo: add remaining fields\n };\n }\n}\n/**\n * Atom: Sample Description Atom ('stsd')\n * Ref: https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap2/qtff2.html#//apple_ref/doc/uid/TP40000939-CH204-25691\n */\nconst stsdHeader = {\n len: 8,\n get: (buf, off) => {\n return {\n version: Token.UINT8.get(buf, off),\n flags: Token.UINT24_BE.get(buf, off + 1),\n numberOfEntries: Token.UINT32_BE.get(buf, off + 4)\n };\n }\n};\n/**\n * Atom: Sample Description Atom ('stsd')\n * Ref: https://developer.apple.com/documentation/quicktime-file-format/sample_description_atom\n */\nclass SampleDescriptionTable {\n constructor(len) {\n this.len = len;\n }\n get(buf, off) {\n const descrLen = this.len - 12;\n return {\n dataFormat: FourCcToken.get(buf, off),\n dataReferenceIndex: Token.UINT16_BE.get(buf, off + 10),\n description: descrLen > 0 ? new Token.Uint8ArrayType(descrLen).get(buf, off + 12) : undefined\n };\n }\n}\n/**\n * Atom: Sample-description Atom ('stsd')\n * Ref: https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap2/qtff2.html#//apple_ref/doc/uid/TP40000939-CH204-25691\n */\nexport class StsdAtom {\n constructor(len) {\n this.len = len;\n }\n get(buf, off) {\n const header = stsdHeader.get(buf, off);\n off += stsdHeader.len;\n const table = [];\n for (let n = 0; n < header.numberOfEntries; ++n) {\n const size = Token.UINT32_BE.get(buf, off); // Sample description size\n off += Token.UINT32_BE.len;\n table.push(new SampleDescriptionTable(size - Token.UINT32_BE.len).get(buf, off));\n off += size;\n }\n return {\n header,\n table\n };\n }\n}\n/**\n * Common Sound Sample Description (version & revision)\n * Ref: https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html#//apple_ref/doc/uid/TP40000939-CH205-57317\n */\nexport const SoundSampleDescriptionVersion = {\n len: 8,\n get(buf, off) {\n return {\n version: Token.INT16_BE.get(buf, off),\n revision: Token.INT16_BE.get(buf, off + 2),\n vendor: Token.INT32_BE.get(buf, off + 4)\n };\n }\n};\n/**\n * Sound Sample Description (Version 0)\n * Ref: https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html#//apple_ref/doc/uid/TP40000939-CH205-130736\n */\nexport const SoundSampleDescriptionV0 = {\n len: 12,\n get(buf, off) {\n return {\n numAudioChannels: Token.INT16_BE.get(buf, off + 0),\n sampleSize: Token.INT16_BE.get(buf, off + 2),\n compressionId: Token.INT16_BE.get(buf, off + 4),\n packetSize: Token.INT16_BE.get(buf, off + 6),\n sampleRate: Token.UINT16_BE.get(buf, off + 8) + Token.UINT16_BE.get(buf, off + 10) / 10000\n };\n }\n};\nclass SimpleTableAtom {\n constructor(len, token) {\n this.len = len;\n this.token = token;\n }\n get(buf, off) {\n const nrOfEntries = Token.INT32_BE.get(buf, off + 4);\n return {\n version: Token.INT8.get(buf, off + 0),\n flags: Token.INT24_BE.get(buf, off + 1),\n numberOfEntries: nrOfEntries,\n entries: readTokenTable(buf, this.token, off + 8, this.len - 8, nrOfEntries)\n };\n }\n}\nexport const TimeToSampleToken = {\n len: 8,\n get(buf, off) {\n return {\n count: Token.INT32_BE.get(buf, off + 0),\n duration: Token.INT32_BE.get(buf, off + 4)\n };\n }\n};\n/**\n * Time-to-sample('stts') atom.\n * Store duration information for a media’s samples.\n * Ref: https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap2/qtff2.html#//apple_ref/doc/uid/TP40000939-CH204-25696\n */\nexport class SttsAtom extends SimpleTableAtom {\n constructor(len) {\n super(len, TimeToSampleToken);\n }\n}\nexport const SampleToChunkToken = {\n len: 12,\n get(buf, off) {\n return {\n firstChunk: Token.INT32_BE.get(buf, off),\n samplesPerChunk: Token.INT32_BE.get(buf, off + 4),\n sampleDescriptionId: Token.INT32_BE.get(buf, off + 8)\n };\n }\n};\n/**\n * Sample-to-Chunk ('stsc') atom interface\n * Ref: https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap2/qtff2.html#//apple_ref/doc/uid/TP40000939-CH204-25706\n */\nexport class StscAtom extends SimpleTableAtom {\n constructor(len) {\n super(len, SampleToChunkToken);\n }\n}\n/**\n * Sample-size ('stsz') atom\n * Ref: https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap2/qtff2.html#//apple_ref/doc/uid/TP40000939-CH204-25710\n */\nexport class StszAtom {\n constructor(len) {\n this.len = len;\n }\n get(buf, off) {\n const nrOfEntries = Token.INT32_BE.get(buf, off + 8);\n return {\n version: Token.INT8.get(buf, off),\n flags: Token.INT24_BE.get(buf, off + 1),\n sampleSize: Token.INT32_BE.get(buf, off + 4),\n numberOfEntries: nrOfEntries,\n entries: readTokenTable(buf, Token.INT32_BE, off + 12, this.len - 12, nrOfEntries)\n };\n }\n}\n/**\n * Chunk offset atom, 'stco'\n * Ref: https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap2/qtff2.html#//apple_ref/doc/uid/TP40000939-CH204-25715\n */\nexport class StcoAtom extends SimpleTableAtom {\n constructor(len) {\n super(len, Token.INT32_BE);\n this.len = len;\n }\n}\n/**\n * Token used to decode text-track from 'mdat' atom (raw data stream)\n */\nexport class ChapterText {\n constructor(len) {\n this.len = len;\n }\n get(buf, off) {\n const titleLen = Token.INT16_BE.get(buf, off + 0);\n const str = new Token.StringType(titleLen, 'utf-8');\n return str.get(buf, off + 2);\n }\n}\nfunction readTokenTable(buf, token, off, remainingLen, numberOfEntries) {\n debug(`remainingLen=${remainingLen}, numberOfEntries=${numberOfEntries} * token-len=${token.len}`);\n if (remainingLen === 0)\n return [];\n if (remainingLen !== numberOfEntries * token.len)\n throw new Mp4ContentError('mismatch number-of-entries with remaining atom-length');\n const entries = [];\n // parse offset-table\n for (let n = 0; n < numberOfEntries; ++n) {\n entries.push(token.get(buf, off));\n off += token.len;\n }\n return entries;\n}\n/**\n * Sample-size ('tfhd') TrackFragmentHeaderBox\n */\nexport class TrackFragmentHeaderBox {\n constructor(len) {\n this.len = len;\n }\n get(buf, off) {\n const flagOffset = off + 1;\n const header = {\n version: Token.INT8.get(buf, off),\n flags: {\n baseDataOffsetPresent: util.getBit(buf, flagOffset + 2, 0),\n sampleDescriptionIndexPresent: util.getBit(buf, flagOffset + 2, 1),\n defaultSampleDurationPresent: util.getBit(buf, flagOffset + 2, 3),\n defaultSampleSizePresent: util.getBit(buf, flagOffset + 2, 4),\n defaultSampleFlagsPresent: util.getBit(buf, flagOffset + 2, 5),\n defaultDurationIsEmpty: util.getBit(buf, flagOffset, 0),\n defaultBaseIsMoof: util.getBit(buf, flagOffset, 1)\n },\n trackId: Token.UINT32_BE.get(buf, 4)\n };\n let dynOffset = 8;\n if (header.flags.baseDataOffsetPresent) {\n header.baseDataOffset = Token.UINT64_BE.get(buf, dynOffset);\n dynOffset += 8;\n }\n if (header.flags.sampleDescriptionIndexPresent) {\n header.sampleDescriptionIndex = Token.UINT32_BE.get(buf, dynOffset);\n dynOffset += 4;\n }\n if (header.flags.defaultSampleDurationPresent) {\n header.defaultSampleDuration = Token.UINT32_BE.get(buf, dynOffset);\n dynOffset += 4;\n }\n if (header.flags.defaultSampleSizePresent) {\n header.defaultSampleSize = Token.UINT32_BE.get(buf, dynOffset);\n dynOffset += 4;\n }\n if (header.flags.defaultSampleFlagsPresent) {\n header.defaultSampleFlags = Token.UINT32_BE.get(buf, dynOffset);\n }\n return header;\n }\n}\n/**\n * Sample-size ('trun') TrackRunBox\n */\nexport class TrackRunBox {\n constructor(len) {\n this.len = len;\n }\n get(buf, off) {\n const flagOffset = off + 1;\n const trun = {\n version: Token.INT8.get(buf, off),\n flags: {\n dataOffsetPresent: util.getBit(buf, flagOffset + 2, 0),\n firstSampleFlagsPresent: util.getBit(buf, flagOffset + 2, 2),\n sampleDurationPresent: util.getBit(buf, flagOffset + 1, 0),\n sampleSizePresent: util.getBit(buf, flagOffset + 1, 1),\n sampleFlagsPresent: util.getBit(buf, flagOffset + 1, 2),\n sampleCompositionTimeOffsetsPresent: util.getBit(buf, flagOffset + 1, 3)\n },\n sampleCount: Token.UINT32_BE.get(buf, off + 4),\n samples: []\n };\n let dynOffset = off + 8;\n if (trun.flags.dataOffsetPresent) {\n trun.dataOffset = Token.UINT32_BE.get(buf, dynOffset);\n dynOffset += 4;\n }\n if (trun.flags.firstSampleFlagsPresent) {\n trun.firstSampleFlags = Token.UINT32_BE.get(buf, dynOffset);\n dynOffset += 4;\n }\n for (let n = 0; n < trun.sampleCount; ++n) {\n if (dynOffset >= this.len) {\n debug(\"TrackRunBox size mismatch\");\n break;\n }\n const sample = {};\n if (trun.flags.sampleDurationPresent) {\n sample.sampleDuration = Token.UINT32_BE.get(buf, dynOffset);\n dynOffset += 4;\n }\n if (trun.flags.sampleSizePresent) {\n sample.sampleSize = Token.UINT32_BE.get(buf, dynOffset);\n dynOffset += 4;\n }\n if (trun.flags.sampleFlagsPresent) {\n sample.sampleFlags = Token.UINT32_BE.get(buf, dynOffset);\n dynOffset += 4;\n }\n if (trun.flags.sampleCompositionTimeOffsetsPresent) {\n sample.sampleCompositionTimeOffset = Token.UINT32_BE.get(buf, dynOffset);\n dynOffset += 4;\n }\n trun.samples.push(sample);\n }\n return trun;\n }\n}\n/**\n * HandlerBox (`hdlr`)\n */\nexport class HandlerBox {\n constructor(len) {\n this.len = len;\n }\n get(buf, off) {\n const _flagOffset = off + 1;\n const charTypeToken = new Token.StringType(4, 'utf-8');\n return {\n version: Token.INT8.get(buf, off),\n flags: Token.UINT24_BE.get(buf, off + 1),\n componentType: charTypeToken.get(buf, off + 4),\n handlerType: charTypeToken.get(buf, off + 8),\n componentName: new Token.StringType(this.len - 28, 'utf-8').get(buf, off + 28),\n };\n }\n}\n/**\n * Chapter Track Reference Box (`chap`)\n */\nexport class ChapterTrackReferenceBox {\n constructor(len) {\n this.len = len;\n }\n get(buf, off) {\n let dynOffset = 0;\n const trackIds = [];\n while (dynOffset < this.len) {\n trackIds.push(Token.UINT32_BE.get(buf, off + dynOffset));\n dynOffset += 4;\n }\n return trackIds;\n }\n}\n"],"mappings":"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","names":["import_debug","import_debug","initDebug","debug","initDebug","debug","initDebug"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/MP4Parser-CA3XAXIP.js.map"}
+670
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/MatroskaParser-K556QMVK.js
··· 1 + import { 2 + TargetType, 3 + TrackType 4 + } from "./chunk-7OCWG5AW.js"; 5 + import { 6 + EndOfStreamError 7 + } from "./chunk-FGRUWWG5.js"; 8 + import { 9 + BasicParser, 10 + Float32_BE, 11 + Float64_BE, 12 + StringType, 13 + UINT64_BE, 14 + UINT8, 15 + makeUnexpectedFileContentError, 16 + require_src 17 + } from "./chunk-ETGVMC2T.js"; 18 + import { 19 + __name, 20 + __toESM 21 + } from "./chunk-7IARE43G.js"; 22 + 23 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/matroska/MatroskaParser.js 24 + var import_debug2 = __toESM(require_src()); 25 + 26 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ebml/types.js 27 + var DataType = { 28 + string: 0, 29 + uint: 1, 30 + uid: 2, 31 + bool: 3, 32 + binary: 4, 33 + float: 5 34 + }; 35 + 36 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/matroska/MatroskaDtd.js 37 + var matroskaDtd = { 38 + name: "dtd", 39 + container: { 40 + 440786851: { 41 + name: "ebml", 42 + container: { 43 + 17030: { name: "ebmlVersion", value: DataType.uint }, 44 + // 5.1.1 45 + 17143: { name: "ebmlReadVersion", value: DataType.uint }, 46 + // 5.1.2 47 + 17138: { name: "ebmlMaxIDWidth", value: DataType.uint }, 48 + // 5.1.3 49 + 17139: { name: "ebmlMaxSizeWidth", value: DataType.uint }, 50 + // 5.1.4 51 + 17026: { name: "docType", value: DataType.string }, 52 + // 5.1.5 53 + 17031: { name: "docTypeVersion", value: DataType.uint }, 54 + // 5.1.6 55 + 17029: { name: "docTypeReadVersion", value: DataType.uint } 56 + // 5.1.7 57 + } 58 + }, 59 + // Matroska segments 60 + 408125543: { 61 + name: "segment", 62 + container: { 63 + // Meta Seek Information (also known as MetaSeek) 64 + 290298740: { 65 + name: "seekHead", 66 + container: { 67 + 19899: { 68 + name: "seek", 69 + multiple: true, 70 + container: { 71 + 21419: { name: "id", value: DataType.binary }, 72 + 21420: { name: "position", value: DataType.uint } 73 + } 74 + } 75 + } 76 + }, 77 + // Segment Information 78 + 357149030: { 79 + name: "info", 80 + container: { 81 + 29604: { name: "uid", value: DataType.uid }, 82 + 29572: { name: "filename", value: DataType.string }, 83 + 3979555: { name: "prevUID", value: DataType.uid }, 84 + 3965867: { name: "prevFilename", value: DataType.string }, 85 + 4110627: { name: "nextUID", value: DataType.uid }, 86 + 4096955: { name: "nextFilename", value: DataType.string }, 87 + 2807729: { name: "timecodeScale", value: DataType.uint }, 88 + 17545: { name: "duration", value: DataType.float }, 89 + 17505: { name: "dateUTC", value: DataType.uint }, 90 + 31657: { name: "title", value: DataType.string }, 91 + 19840: { name: "muxingApp", value: DataType.string }, 92 + 22337: { name: "writingApp", value: DataType.string } 93 + } 94 + }, 95 + // Cluster 96 + 524531317: { 97 + name: "cluster", 98 + multiple: true, 99 + container: { 100 + 231: { name: "timecode", value: DataType.uid }, 101 + 22743: { name: "silentTracks ", multiple: true }, 102 + 167: { name: "position", value: DataType.uid }, 103 + 171: { name: "prevSize", value: DataType.uid }, 104 + 160: { name: "blockGroup" }, 105 + 163: { name: "simpleBlock" } 106 + } 107 + }, 108 + // Track 109 + 374648427: { 110 + name: "tracks", 111 + container: { 112 + 174: { 113 + name: "entries", 114 + multiple: true, 115 + container: { 116 + 215: { name: "trackNumber", value: DataType.uint }, 117 + 29637: { name: "uid", value: DataType.uid }, 118 + 131: { name: "trackType", value: DataType.uint }, 119 + 185: { name: "flagEnabled", value: DataType.bool }, 120 + 136: { name: "flagDefault", value: DataType.bool }, 121 + 21930: { name: "flagForced", value: DataType.bool }, 122 + // extended 123 + 156: { name: "flagLacing", value: DataType.bool }, 124 + 28135: { name: "minCache", value: DataType.uint }, 125 + 28136: { name: "maxCache", value: DataType.uint }, 126 + 2352003: { name: "defaultDuration", value: DataType.uint }, 127 + 2306383: { name: "timecodeScale", value: DataType.float }, 128 + 21358: { name: "name", value: DataType.string }, 129 + 2274716: { name: "language", value: DataType.string }, 130 + 134: { name: "codecID", value: DataType.string }, 131 + 25506: { name: "codecPrivate", value: DataType.binary }, 132 + 2459272: { name: "codecName", value: DataType.string }, 133 + 3839639: { name: "codecSettings", value: DataType.string }, 134 + 3883072: { name: "codecInfoUrl", value: DataType.string }, 135 + 2536e3: { name: "codecDownloadUrl", value: DataType.string }, 136 + 170: { name: "codecDecodeAll", value: DataType.bool }, 137 + 28587: { name: "trackOverlay", value: DataType.uint }, 138 + // Video 139 + 224: { 140 + name: "video", 141 + container: { 142 + 154: { name: "flagInterlaced", value: DataType.bool }, 143 + 21432: { name: "stereoMode", value: DataType.uint }, 144 + 176: { name: "pixelWidth", value: DataType.uint }, 145 + 186: { name: "pixelHeight", value: DataType.uint }, 146 + 21680: { name: "displayWidth", value: DataType.uint }, 147 + 21690: { name: "displayHeight", value: DataType.uint }, 148 + 21683: { name: "aspectRatioType", value: DataType.uint }, 149 + 3061028: { name: "colourSpace", value: DataType.uint }, 150 + 3126563: { name: "gammaValue", value: DataType.float } 151 + } 152 + }, 153 + // Audio 154 + 225: { 155 + name: "audio", 156 + container: { 157 + 181: { name: "samplingFrequency", value: DataType.float }, 158 + 30901: { name: "outputSamplingFrequency", value: DataType.float }, 159 + 159: { name: "channels", value: DataType.uint }, 160 + // https://www.matroska.org/technical/specs/index.html 161 + 148: { name: "channels", value: DataType.uint }, 162 + 32123: { name: "channelPositions", value: DataType.binary }, 163 + 25188: { name: "bitDepth", value: DataType.uint } 164 + } 165 + }, 166 + // Content Encoding 167 + 28032: { 168 + name: "contentEncodings", 169 + container: { 170 + 25152: { 171 + name: "contentEncoding", 172 + container: { 173 + 20529: { name: "order", value: DataType.uint }, 174 + 20530: { name: "scope", value: DataType.bool }, 175 + 20531: { name: "type", value: DataType.uint }, 176 + 20532: { 177 + name: "contentEncoding", 178 + container: { 179 + 16980: { name: "contentCompAlgo", value: DataType.uint }, 180 + 16981: { name: "contentCompSettings", value: DataType.binary } 181 + } 182 + }, 183 + 20533: { 184 + name: "contentEncoding", 185 + container: { 186 + 18401: { name: "contentEncAlgo", value: DataType.uint }, 187 + 18402: { name: "contentEncKeyID", value: DataType.binary }, 188 + 18403: { name: "contentSignature ", value: DataType.binary }, 189 + 18404: { name: "ContentSigKeyID ", value: DataType.binary }, 190 + 18405: { name: "contentSigAlgo ", value: DataType.uint }, 191 + 18406: { name: "contentSigHashAlgo ", value: DataType.uint } 192 + } 193 + }, 194 + 25188: { name: "bitDepth", value: DataType.uint } 195 + } 196 + } 197 + } 198 + } 199 + } 200 + } 201 + } 202 + }, 203 + // Cueing Data 204 + 475249515: { 205 + name: "cues", 206 + container: { 207 + 187: { 208 + name: "cuePoint", 209 + container: { 210 + 179: { name: "cueTime", value: DataType.uid }, 211 + 183: { 212 + name: "positions", 213 + container: { 214 + 247: { name: "track", value: DataType.uint }, 215 + 241: { name: "clusterPosition", value: DataType.uint }, 216 + 21368: { name: "blockNumber", value: DataType.uint }, 217 + 234: { name: "codecState", value: DataType.uint }, 218 + 219: { 219 + name: "reference", 220 + container: { 221 + 150: { name: "time", value: DataType.uint }, 222 + 151: { name: "cluster", value: DataType.uint }, 223 + 21343: { name: "number", value: DataType.uint }, 224 + 235: { name: "codecState", value: DataType.uint } 225 + } 226 + }, 227 + 240: { name: "relativePosition", value: DataType.uint } 228 + // extended 229 + } 230 + } 231 + } 232 + } 233 + } 234 + }, 235 + // Attachment 236 + 423732329: { 237 + name: "attachments", 238 + container: { 239 + 24999: { 240 + name: "attachedFiles", 241 + multiple: true, 242 + container: { 243 + 18046: { name: "description", value: DataType.string }, 244 + 18030: { name: "name", value: DataType.string }, 245 + 18016: { name: "mimeType", value: DataType.string }, 246 + 18012: { name: "data", value: DataType.binary }, 247 + 18094: { name: "uid", value: DataType.uid } 248 + } 249 + } 250 + } 251 + }, 252 + // Chapters 253 + 272869232: { 254 + name: "chapters", 255 + container: { 256 + 17849: { 257 + name: "editionEntry", 258 + container: { 259 + 182: { 260 + name: "chapterAtom", 261 + container: { 262 + 29636: { name: "uid", value: DataType.uid }, 263 + 145: { name: "timeStart", value: DataType.uint }, 264 + 146: { name: "timeEnd", value: DataType.uid }, 265 + 152: { name: "hidden", value: DataType.bool }, 266 + 17816: { name: "enabled", value: DataType.uid }, 267 + 143: { 268 + name: "track", 269 + container: { 270 + 137: { name: "trackNumber", value: DataType.uid }, 271 + 128: { 272 + name: "display", 273 + container: { 274 + 133: { name: "string", value: DataType.string }, 275 + 17276: { name: "language ", value: DataType.string }, 276 + 17278: { name: "country ", value: DataType.string } 277 + } 278 + } 279 + } 280 + } 281 + } 282 + } 283 + } 284 + } 285 + } 286 + }, 287 + // Tagging 288 + 307544935: { 289 + name: "tags", 290 + container: { 291 + 29555: { 292 + name: "tag", 293 + multiple: true, 294 + container: { 295 + 25536: { 296 + name: "target", 297 + container: { 298 + 25541: { name: "tagTrackUID", value: DataType.uid }, 299 + 25540: { name: "tagChapterUID", value: DataType.uint }, 300 + 25542: { name: "tagAttachmentUID", value: DataType.uid }, 301 + 25546: { name: "targetType", value: DataType.string }, 302 + // extended 303 + 26826: { name: "targetTypeValue", value: DataType.uint }, 304 + // extended 305 + 25545: { name: "tagEditionUID", value: DataType.uid } 306 + // extended 307 + } 308 + }, 309 + 26568: { 310 + name: "simpleTags", 311 + multiple: true, 312 + container: { 313 + 17827: { name: "name", value: DataType.string }, 314 + 17543: { name: "string", value: DataType.string }, 315 + 17541: { name: "binary", value: DataType.binary }, 316 + 17530: { name: "language", value: DataType.string }, 317 + // extended 318 + 17531: { name: "languageIETF", value: DataType.string }, 319 + // extended 320 + 17540: { name: "default", value: DataType.bool } 321 + // extended 322 + } 323 + } 324 + } 325 + } 326 + } 327 + } 328 + } 329 + } 330 + } 331 + }; 332 + 333 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ebml/EbmlIterator.js 334 + var import_debug = __toESM(require_src()); 335 + var debug = (0, import_debug.default)("music-metadata:parser:ebml"); 336 + var EbmlContentError = class extends makeUnexpectedFileContentError("EBML") { 337 + static { 338 + __name(this, "EbmlContentError"); 339 + } 340 + }; 341 + var ParseAction = { 342 + ReadNext: 0, 343 + // Continue reading the next elements 344 + IgnoreElement: 2, 345 + // Ignore (do not read) this element 346 + SkipSiblings: 3, 347 + // Skip all remaining elements at the same level 348 + TerminateParsing: 4, 349 + // Terminate the parsing process 350 + SkipElement: 5 351 + // Consider the element has read, assume position is at the next element 352 + }; 353 + var EbmlIterator = class { 354 + static { 355 + __name(this, "EbmlIterator"); 356 + } 357 + /** 358 + * @param {ITokenizer} tokenizer Input 359 + * @param tokenizer 360 + */ 361 + constructor(tokenizer) { 362 + this.parserMap = /* @__PURE__ */ new Map(); 363 + this.ebmlMaxIDLength = 4; 364 + this.ebmlMaxSizeLength = 8; 365 + this.tokenizer = tokenizer; 366 + this.parserMap.set(DataType.uint, (e) => this.readUint(e)); 367 + this.parserMap.set(DataType.string, (e) => this.readString(e)); 368 + this.parserMap.set(DataType.binary, (e) => this.readBuffer(e)); 369 + this.parserMap.set(DataType.uid, async (e) => this.readBuffer(e)); 370 + this.parserMap.set(DataType.bool, (e) => this.readFlag(e)); 371 + this.parserMap.set(DataType.float, (e) => this.readFloat(e)); 372 + } 373 + async iterate(dtdElement, posDone, listener) { 374 + return this.parseContainer(linkParents(dtdElement), posDone, listener); 375 + } 376 + async parseContainer(dtdElement, posDone, listener) { 377 + const tree = {}; 378 + while (this.tokenizer.position < posDone) { 379 + let element; 380 + const elementPosition = this.tokenizer.position; 381 + try { 382 + element = await this.readElement(); 383 + } catch (error) { 384 + if (error instanceof EndOfStreamError) { 385 + break; 386 + } 387 + throw error; 388 + } 389 + const child = dtdElement.container[element.id]; 390 + if (child) { 391 + const action = listener.startNext(child); 392 + switch (action) { 393 + case ParseAction.ReadNext: 394 + { 395 + if (element.id === 524531317) { 396 + } 397 + debug(`Read element: name=${getElementPath(child)}{id=0x${element.id.toString(16)}, container=${!!child.container}} at position=${elementPosition}`); 398 + if (child.container) { 399 + const res = await this.parseContainer(child, element.len >= 0 ? this.tokenizer.position + element.len : -1, listener); 400 + if (child.multiple) { 401 + if (!tree[child.name]) { 402 + tree[child.name] = []; 403 + } 404 + tree[child.name].push(res); 405 + } else { 406 + tree[child.name] = res; 407 + } 408 + await listener.elementValue(child, res, elementPosition); 409 + } else { 410 + const parser = this.parserMap.get(child.value); 411 + if (typeof parser === "function") { 412 + const value = await parser(element); 413 + tree[child.name] = value; 414 + await listener.elementValue(child, value, elementPosition); 415 + } 416 + } 417 + } 418 + break; 419 + case ParseAction.SkipElement: 420 + debug(`Go to next element: name=${getElementPath(child)}, element.id=0x${element.id}, container=${!!child.container} at position=${elementPosition}`); 421 + break; 422 + case ParseAction.IgnoreElement: 423 + debug(`Ignore element: name=${getElementPath(child)}, element.id=0x${element.id}, container=${!!child.container} at position=${elementPosition}`); 424 + await this.tokenizer.ignore(element.len); 425 + break; 426 + case ParseAction.SkipSiblings: 427 + debug(`Ignore remaining container, at: name=${getElementPath(child)}, element.id=0x${element.id}, container=${!!child.container} at position=${elementPosition}`); 428 + await this.tokenizer.ignore(posDone - this.tokenizer.position); 429 + break; 430 + case ParseAction.TerminateParsing: 431 + debug(`Terminate parsing at element: name=${getElementPath(child)}, element.id=0x${element.id}, container=${!!child.container} at position=${elementPosition}`); 432 + return tree; 433 + } 434 + } else { 435 + switch (element.id) { 436 + case 236: 437 + await this.tokenizer.ignore(element.len); 438 + break; 439 + default: 440 + debug(`parseEbml: parent=${getElementPath(dtdElement)}, unknown child: id=${element.id.toString(16)} at position=${elementPosition}`); 441 + await this.tokenizer.ignore(element.len); 442 + } 443 + } 444 + } 445 + return tree; 446 + } 447 + async readVintData(maxLength) { 448 + const msb = await this.tokenizer.peekNumber(UINT8); 449 + let mask = 128; 450 + let oc = 1; 451 + while ((msb & mask) === 0) { 452 + if (oc > maxLength) { 453 + throw new EbmlContentError("VINT value exceeding maximum size"); 454 + } 455 + ++oc; 456 + mask >>= 1; 457 + } 458 + const id = new Uint8Array(oc); 459 + await this.tokenizer.readBuffer(id); 460 + return id; 461 + } 462 + async readElement() { 463 + const id = await this.readVintData(this.ebmlMaxIDLength); 464 + const lenField = await this.readVintData(this.ebmlMaxSizeLength); 465 + lenField[0] ^= 128 >> lenField.length - 1; 466 + return { 467 + id: readUIntBE(id, id.length), 468 + len: readUIntBE(lenField, lenField.length) 469 + }; 470 + } 471 + async readFloat(e) { 472 + switch (e.len) { 473 + case 0: 474 + return 0; 475 + case 4: 476 + return this.tokenizer.readNumber(Float32_BE); 477 + case 8: 478 + return this.tokenizer.readNumber(Float64_BE); 479 + case 10: 480 + return this.tokenizer.readNumber(Float64_BE); 481 + default: 482 + throw new EbmlContentError(`Invalid IEEE-754 float length: ${e.len}`); 483 + } 484 + } 485 + async readFlag(e) { 486 + return await this.readUint(e) === 1; 487 + } 488 + async readUint(e) { 489 + const buf = await this.readBuffer(e); 490 + return readUIntBE(buf, e.len); 491 + } 492 + async readString(e) { 493 + const rawString = await this.tokenizer.readToken(new StringType(e.len, "utf-8")); 494 + return rawString.replace(/\x00.*$/g, ""); 495 + } 496 + async readBuffer(e) { 497 + const buf = new Uint8Array(e.len); 498 + await this.tokenizer.readBuffer(buf); 499 + return buf; 500 + } 501 + }; 502 + function readUIntBE(buf, len) { 503 + return Number(readUIntBeAsBigInt(buf, len)); 504 + } 505 + __name(readUIntBE, "readUIntBE"); 506 + function readUIntBeAsBigInt(buf, len) { 507 + const normalizedNumber = new Uint8Array(8); 508 + const cleanNumber = buf.subarray(0, len); 509 + try { 510 + normalizedNumber.set(cleanNumber, 8 - len); 511 + return UINT64_BE.get(normalizedNumber, 0); 512 + } catch (_error) { 513 + return BigInt(-1); 514 + } 515 + } 516 + __name(readUIntBeAsBigInt, "readUIntBeAsBigInt"); 517 + function linkParents(element) { 518 + if (element.container) { 519 + Object.keys(element.container).map((id) => { 520 + const child = element.container[id]; 521 + child.id = Number.parseInt(id, 10); 522 + return child; 523 + }).forEach((child) => { 524 + child.parent = element; 525 + linkParents(child); 526 + }); 527 + } 528 + return element; 529 + } 530 + __name(linkParents, "linkParents"); 531 + function getElementPath(element) { 532 + let path = ""; 533 + if (element.parent && element.parent.name !== "dtd") { 534 + path += `${getElementPath(element.parent)}/`; 535 + } 536 + return path + element.name; 537 + } 538 + __name(getElementPath, "getElementPath"); 539 + 540 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/matroska/MatroskaParser.js 541 + var debug2 = (0, import_debug2.default)("music-metadata:parser:matroska"); 542 + var MatroskaParser = class extends BasicParser { 543 + static { 544 + __name(this, "MatroskaParser"); 545 + } 546 + constructor() { 547 + super(...arguments); 548 + this.seekHeadOffset = 0; 549 + this.flagUseIndexToSkipClusters = this.options.mkvUseIndex ?? false; 550 + } 551 + async parse() { 552 + const containerSize = this.tokenizer.fileInfo.size ?? Number.MAX_SAFE_INTEGER; 553 + const matroskaIterator = new EbmlIterator(this.tokenizer); 554 + debug2("Initializing DTD end MatroskaIterator"); 555 + await matroskaIterator.iterate(matroskaDtd, containerSize, { 556 + startNext: /* @__PURE__ */ __name((element) => { 557 + switch (element.id) { 558 + // case 0x1f43b675: // cluster 559 + case 475249515: 560 + debug2(`Skip element: name=${element.name}, id=0x${element.id.toString(16)}`); 561 + return ParseAction.IgnoreElement; 562 + case 524531317: 563 + if (this.flagUseIndexToSkipClusters && this.seekHead) { 564 + const index = this.seekHead.seek.find((index2) => index2.position + this.seekHeadOffset > this.tokenizer.position); 565 + if (index) { 566 + const ignoreSize = index.position + this.seekHeadOffset - this.tokenizer.position; 567 + debug2(`Use index to go to next position, ignoring ${ignoreSize} bytes`); 568 + this.tokenizer.ignore(ignoreSize); 569 + return ParseAction.SkipElement; 570 + } 571 + } 572 + return ParseAction.IgnoreElement; 573 + default: 574 + return ParseAction.ReadNext; 575 + } 576 + }, "startNext"), 577 + elementValue: /* @__PURE__ */ __name(async (element, value, offset) => { 578 + debug2(`Received: name=${element.name}, value=${value}`); 579 + switch (element.id) { 580 + case 17026: 581 + this.metadata.setFormat("container", `EBML/${value}`); 582 + break; 583 + case 290298740: 584 + this.seekHead = value; 585 + this.seekHeadOffset = offset; 586 + break; 587 + case 357149030: 588 + { 589 + const info = value; 590 + const timecodeScale = info.timecodeScale ? info.timecodeScale : 1e6; 591 + if (typeof info.duration === "number") { 592 + const duration = info.duration * timecodeScale / 1e9; 593 + await this.addTag("segment:title", info.title); 594 + this.metadata.setFormat("duration", Number(duration)); 595 + } 596 + } 597 + break; 598 + case 374648427: 599 + { 600 + const audioTracks = value; 601 + if (audioTracks?.entries) { 602 + audioTracks.entries.forEach((entry) => { 603 + const stream = { 604 + codecName: entry.codecID.replace("A_", "").replace("V_", ""), 605 + codecSettings: entry.codecSettings, 606 + flagDefault: entry.flagDefault, 607 + flagLacing: entry.flagLacing, 608 + flagEnabled: entry.flagEnabled, 609 + language: entry.language, 610 + name: entry.name, 611 + type: entry.trackType, 612 + audio: entry.audio, 613 + video: entry.video 614 + }; 615 + this.metadata.addStreamInfo(stream); 616 + }); 617 + const audioTrack = audioTracks.entries.filter((entry) => entry.trackType === TrackType.audio).reduce((acc, cur) => { 618 + if (!acc) 619 + return cur; 620 + if (cur.flagDefault && !acc.flagDefault) 621 + return cur; 622 + if (cur.trackNumber < acc.trackNumber) 623 + return cur; 624 + return acc; 625 + }, null); 626 + if (audioTrack) { 627 + this.metadata.setFormat("codec", audioTrack.codecID.replace("A_", "")); 628 + this.metadata.setFormat("sampleRate", audioTrack.audio.samplingFrequency); 629 + this.metadata.setFormat("numberOfChannels", audioTrack.audio.channels); 630 + } 631 + } 632 + } 633 + break; 634 + case 307544935: 635 + { 636 + const tags = value; 637 + await Promise.all(tags.tag.map(async (tag) => { 638 + const target = tag.target; 639 + const targetType = target?.targetTypeValue ? TargetType[target.targetTypeValue] : target?.targetType ? target.targetType : "track"; 640 + await Promise.all(tag.simpleTags.map(async (simpleTag) => { 641 + const value2 = simpleTag.string ? simpleTag.string : simpleTag.binary; 642 + await this.addTag(`${targetType}:${simpleTag.name}`, value2); 643 + })); 644 + })); 645 + } 646 + break; 647 + case 423732329: 648 + { 649 + const attachments = value; 650 + await Promise.all(attachments.attachedFiles.filter((file) => file.mimeType.startsWith("image/")).map((file) => this.addTag("picture", { 651 + data: file.data, 652 + format: file.mimeType, 653 + description: file.description, 654 + name: file.name 655 + }))); 656 + } 657 + break; 658 + } 659 + }, "elementValue") 660 + }); 661 + } 662 + async addTag(tagId, value) { 663 + await this.metadata.addTag("matroska", tagId, value); 664 + } 665 + }; 666 + export { 667 + MatroskaParser 668 + }; 669 + 670 + //# sourceMappingURL=./MatroskaParser-K556QMVK.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/MatroskaParser-K556QMVK.js.map
··· 1 + {"version":3,"sources":["/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/matroska/MatroskaParser.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ebml/types.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/matroska/MatroskaDtd.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ebml/EbmlIterator.js"],"sourcesContent":["import initDebug from 'debug';\nimport { BasicParser } from '../common/BasicParser.js';\nimport { matroskaDtd } from './MatroskaDtd.js';\nimport { TargetType, TrackType } from './types.js';\nimport { EbmlIterator, ParseAction } from '../ebml/EbmlIterator.js';\nconst debug = initDebug('music-metadata:parser:matroska');\n/**\n * Extensible Binary Meta Language (EBML) parser\n * https://en.wikipedia.org/wiki/Extensible_Binary_Meta_Language\n * http://matroska.sourceforge.net/technical/specs/rfc/index.html\n *\n * WEBM VP8 AUDIO FILE\n */\nexport class MatroskaParser extends BasicParser {\n constructor() {\n super(...arguments);\n this.seekHeadOffset = 0;\n /**\n * Use index to skip multiple segment/cluster elements at once.\n * Significant performance impact\n */\n this.flagUseIndexToSkipClusters = this.options.mkvUseIndex ?? false;\n }\n async parse() {\n const containerSize = this.tokenizer.fileInfo.size ?? Number.MAX_SAFE_INTEGER;\n const matroskaIterator = new EbmlIterator(this.tokenizer);\n debug('Initializing DTD end MatroskaIterator');\n await matroskaIterator.iterate(matroskaDtd, containerSize, {\n startNext: (element) => {\n switch (element.id) {\n // case 0x1f43b675: // cluster\n case 0x1c53bb6b: // Cueing Data\n debug(`Skip element: name=${element.name}, id=0x${element.id.toString(16)}`);\n return ParseAction.IgnoreElement;\n case 0x1f43b675: // cluster\n if (this.flagUseIndexToSkipClusters && this.seekHead) {\n const index = this.seekHead.seek.find(index => index.position + this.seekHeadOffset > this.tokenizer.position);\n if (index) {\n // Go to next index position\n const ignoreSize = index.position + this.seekHeadOffset - this.tokenizer.position;\n debug(`Use index to go to next position, ignoring ${ignoreSize} bytes`);\n this.tokenizer.ignore(ignoreSize);\n return ParseAction.SkipElement;\n }\n }\n return ParseAction.IgnoreElement;\n default:\n return ParseAction.ReadNext;\n }\n },\n elementValue: async (element, value, offset) => {\n debug(`Received: name=${element.name}, value=${value}`);\n switch (element.id) {\n case 0x4282: // docType\n this.metadata.setFormat('container', `EBML/${value}`);\n break;\n case 0x114d9b74:\n this.seekHead = value;\n this.seekHeadOffset = offset;\n break;\n case 0x1549a966:\n { // Info (Segment Information)\n const info = value;\n const timecodeScale = info.timecodeScale ? info.timecodeScale : 1000000;\n if (typeof info.duration === 'number') {\n const duration = info.duration * timecodeScale / 1000000000;\n await this.addTag('segment:title', info.title);\n this.metadata.setFormat('duration', Number(duration));\n }\n }\n break;\n case 0x1654ae6b:\n { // tracks\n const audioTracks = value;\n if (audioTracks?.entries) {\n audioTracks.entries.forEach(entry => {\n const stream = {\n codecName: entry.codecID.replace('A_', '').replace('V_', ''),\n codecSettings: entry.codecSettings,\n flagDefault: entry.flagDefault,\n flagLacing: entry.flagLacing,\n flagEnabled: entry.flagEnabled,\n language: entry.language,\n name: entry.name,\n type: entry.trackType,\n audio: entry.audio,\n video: entry.video\n };\n this.metadata.addStreamInfo(stream);\n });\n const audioTrack = audioTracks.entries\n .filter(entry => entry.trackType === TrackType.audio)\n .reduce((acc, cur) => {\n if (!acc)\n return cur;\n if (cur.flagDefault && !acc.flagDefault)\n return cur;\n if (cur.trackNumber < acc.trackNumber)\n return cur;\n return acc;\n }, null);\n if (audioTrack) {\n this.metadata.setFormat('codec', audioTrack.codecID.replace('A_', ''));\n this.metadata.setFormat('sampleRate', audioTrack.audio.samplingFrequency);\n this.metadata.setFormat('numberOfChannels', audioTrack.audio.channels);\n }\n }\n }\n break;\n case 0x1254c367:\n { // tags\n const tags = value;\n await Promise.all(tags.tag.map(async (tag) => {\n const target = tag.target;\n const targetType = target?.targetTypeValue ? TargetType[target.targetTypeValue] : (target?.targetType ? target.targetType : 'track');\n await Promise.all(tag.simpleTags.map(async (simpleTag) => {\n const value = simpleTag.string ? simpleTag.string : simpleTag.binary;\n await this.addTag(`${targetType}:${simpleTag.name}`, value);\n }));\n }));\n }\n break;\n case 0x1941a469:\n { // attachments\n const attachments = value;\n await Promise.all(attachments.attachedFiles\n .filter(file => file.mimeType.startsWith('image/'))\n .map(file => this.addTag('picture', {\n data: file.data,\n format: file.mimeType,\n description: file.description,\n name: file.name\n })));\n }\n break;\n }\n }\n });\n }\n async addTag(tagId, value) {\n await this.metadata.addTag('matroska', tagId, value);\n }\n}\n","export const DataType = {\n string: 0,\n uint: 1,\n uid: 2,\n bool: 3,\n binary: 4,\n float: 5,\n};\n","import { DataType } from '../ebml/types.js';\n/**\n * Elements of document type description\n * Derived from https://github.com/tungol/EBML/blob/master/doctypes/matroska.dtd\n * Extended with:\n * - https://www.matroska.org/technical/specs/index.html\n */\nexport const matroskaDtd = {\n name: 'dtd',\n container: {\n 0x1a45dfa3: {\n name: 'ebml',\n container: {\n 0x4286: { name: 'ebmlVersion', value: DataType.uint }, // 5.1.1\n 0x42f7: { name: 'ebmlReadVersion', value: DataType.uint }, // 5.1.2\n 0x42f2: { name: 'ebmlMaxIDWidth', value: DataType.uint }, // 5.1.3\n 0x42f3: { name: 'ebmlMaxSizeWidth', value: DataType.uint }, // 5.1.4\n 0x4282: { name: 'docType', value: DataType.string }, // 5.1.5\n 0x4287: { name: 'docTypeVersion', value: DataType.uint }, // 5.1.6\n 0x4285: { name: 'docTypeReadVersion', value: DataType.uint } // 5.1.7\n }\n },\n // Matroska segments\n 0x18538067: {\n name: 'segment',\n container: {\n // Meta Seek Information (also known as MetaSeek)\n 0x114d9b74: {\n name: 'seekHead',\n container: {\n 0x4dbb: {\n name: 'seek',\n multiple: true,\n container: {\n 0x53ab: { name: 'id', value: DataType.binary },\n 0x53ac: { name: 'position', value: DataType.uint }\n }\n }\n }\n },\n // Segment Information\n 0x1549a966: {\n name: 'info',\n container: {\n 0x73a4: { name: 'uid', value: DataType.uid },\n 0x7384: { name: 'filename', value: DataType.string },\n 0x3cb923: { name: 'prevUID', value: DataType.uid },\n 0x3c83ab: { name: 'prevFilename', value: DataType.string },\n 0x3eb923: { name: 'nextUID', value: DataType.uid },\n 0x3e83bb: { name: 'nextFilename', value: DataType.string },\n 0x2ad7b1: { name: 'timecodeScale', value: DataType.uint },\n 0x4489: { name: 'duration', value: DataType.float },\n 0x4461: { name: 'dateUTC', value: DataType.uint },\n 0x7ba9: { name: 'title', value: DataType.string },\n 0x4d80: { name: 'muxingApp', value: DataType.string },\n 0x5741: { name: 'writingApp', value: DataType.string }\n }\n },\n // Cluster\n 0x1f43b675: {\n name: 'cluster',\n multiple: true,\n container: {\n 0xe7: { name: 'timecode', value: DataType.uid },\n 0x58d7: { name: 'silentTracks ', multiple: true },\n 0xa7: { name: 'position', value: DataType.uid },\n 0xab: { name: 'prevSize', value: DataType.uid },\n 0xa0: { name: 'blockGroup' },\n 0xa3: { name: 'simpleBlock' }\n }\n },\n // Track\n 0x1654ae6b: {\n name: 'tracks',\n container: {\n 0xae: {\n name: 'entries',\n multiple: true,\n container: {\n 0xd7: { name: 'trackNumber', value: DataType.uint },\n 0x73c5: { name: 'uid', value: DataType.uid },\n 0x83: { name: 'trackType', value: DataType.uint },\n 0xb9: { name: 'flagEnabled', value: DataType.bool },\n 0x88: { name: 'flagDefault', value: DataType.bool },\n 0x55aa: { name: 'flagForced', value: DataType.bool }, // extended\n 0x9c: { name: 'flagLacing', value: DataType.bool },\n 0x6de7: { name: 'minCache', value: DataType.uint },\n 0x6de8: { name: 'maxCache', value: DataType.uint },\n 0x23e383: { name: 'defaultDuration', value: DataType.uint },\n 0x23314f: { name: 'timecodeScale', value: DataType.float },\n 0x536e: { name: 'name', value: DataType.string },\n 0x22b59c: { name: 'language', value: DataType.string },\n 0x86: { name: 'codecID', value: DataType.string },\n 0x63a2: { name: 'codecPrivate', value: DataType.binary },\n 0x258688: { name: 'codecName', value: DataType.string },\n 0x3a9697: { name: 'codecSettings', value: DataType.string },\n 0x3b4040: { name: 'codecInfoUrl', value: DataType.string },\n 0x26b240: { name: 'codecDownloadUrl', value: DataType.string },\n 0xaa: { name: 'codecDecodeAll', value: DataType.bool },\n 0x6fab: { name: 'trackOverlay', value: DataType.uint },\n // Video\n 0xe0: {\n name: 'video',\n container: {\n 0x9a: { name: 'flagInterlaced', value: DataType.bool },\n 0x53b8: { name: 'stereoMode', value: DataType.uint },\n 0xb0: { name: 'pixelWidth', value: DataType.uint },\n 0xba: { name: 'pixelHeight', value: DataType.uint },\n 0x54b0: { name: 'displayWidth', value: DataType.uint },\n 0x54ba: { name: 'displayHeight', value: DataType.uint },\n 0x54b3: { name: 'aspectRatioType', value: DataType.uint },\n 0x2eb524: { name: 'colourSpace', value: DataType.uint },\n 0x2fb523: { name: 'gammaValue', value: DataType.float }\n }\n },\n // Audio\n 0xe1: {\n name: 'audio',\n container: {\n 0xb5: { name: 'samplingFrequency', value: DataType.float },\n 0x78b5: { name: 'outputSamplingFrequency', value: DataType.float },\n 0x9f: { name: 'channels', value: DataType.uint }, // https://www.matroska.org/technical/specs/index.html\n 0x94: { name: 'channels', value: DataType.uint },\n 0x7d7b: { name: 'channelPositions', value: DataType.binary },\n 0x6264: { name: 'bitDepth', value: DataType.uint }\n }\n },\n // Content Encoding\n 0x6d80: {\n name: 'contentEncodings',\n container: {\n 0x6240: {\n name: 'contentEncoding',\n container: {\n 0x5031: { name: 'order', value: DataType.uint },\n 0x5032: { name: 'scope', value: DataType.bool },\n 0x5033: { name: 'type', value: DataType.uint },\n 0x5034: {\n name: 'contentEncoding',\n container: {\n 0x4254: { name: 'contentCompAlgo', value: DataType.uint },\n 0x4255: { name: 'contentCompSettings', value: DataType.binary }\n }\n },\n 0x5035: {\n name: 'contentEncoding',\n container: {\n 0x47e1: { name: 'contentEncAlgo', value: DataType.uint },\n 0x47e2: { name: 'contentEncKeyID', value: DataType.binary },\n 0x47e3: { name: 'contentSignature ', value: DataType.binary },\n 0x47e4: { name: 'ContentSigKeyID ', value: DataType.binary },\n 0x47e5: { name: 'contentSigAlgo ', value: DataType.uint },\n 0x47e6: { name: 'contentSigHashAlgo ', value: DataType.uint }\n }\n },\n 0x6264: { name: 'bitDepth', value: DataType.uint }\n }\n }\n }\n }\n }\n }\n }\n },\n // Cueing Data\n 0x1c53bb6b: {\n name: 'cues',\n container: {\n 0xbb: {\n name: 'cuePoint',\n container: {\n 0xb3: { name: 'cueTime', value: DataType.uid },\n 0xb7: {\n name: 'positions',\n container: {\n 0xf7: { name: 'track', value: DataType.uint },\n 0xf1: { name: 'clusterPosition', value: DataType.uint },\n 0x5378: { name: 'blockNumber', value: DataType.uint },\n 0xea: { name: 'codecState', value: DataType.uint },\n 0xdb: {\n name: 'reference', container: {\n 0x96: { name: 'time', value: DataType.uint },\n 0x97: { name: 'cluster', value: DataType.uint },\n 0x535f: { name: 'number', value: DataType.uint },\n 0xeb: { name: 'codecState', value: DataType.uint }\n }\n },\n 0xf0: { name: 'relativePosition', value: DataType.uint } // extended\n }\n }\n }\n }\n }\n },\n // Attachment\n 0x1941a469: {\n name: 'attachments',\n container: {\n 0x61a7: {\n name: 'attachedFiles',\n multiple: true,\n container: {\n 0x467e: { name: 'description', value: DataType.string },\n 0x466e: { name: 'name', value: DataType.string },\n 0x4660: { name: 'mimeType', value: DataType.string },\n 0x465c: { name: 'data', value: DataType.binary },\n 0x46ae: { name: 'uid', value: DataType.uid }\n }\n }\n }\n },\n // Chapters\n 0x1043a770: {\n name: 'chapters',\n container: {\n 0x45b9: {\n name: 'editionEntry',\n container: {\n 0xb6: {\n name: 'chapterAtom',\n container: {\n 0x73c4: { name: 'uid', value: DataType.uid },\n 0x91: { name: 'timeStart', value: DataType.uint },\n 0x92: { name: 'timeEnd', value: DataType.uid },\n 0x98: { name: 'hidden', value: DataType.bool },\n 0x4598: { name: 'enabled', value: DataType.uid },\n 0x8f: {\n name: 'track', container: {\n 0x89: { name: 'trackNumber', value: DataType.uid },\n 0x80: {\n name: 'display', container: {\n 0x85: { name: 'string', value: DataType.string },\n 0x437c: { name: 'language ', value: DataType.string },\n 0x437e: { name: 'country ', value: DataType.string }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n },\n // Tagging\n 0x1254c367: {\n name: 'tags',\n container: {\n 0x7373: {\n name: 'tag',\n multiple: true,\n container: {\n 0x63c0: {\n name: 'target',\n container: {\n 0x63c5: { name: 'tagTrackUID', value: DataType.uid },\n 0x63c4: { name: 'tagChapterUID', value: DataType.uint },\n 0x63c6: { name: 'tagAttachmentUID', value: DataType.uid },\n 0x63ca: { name: 'targetType', value: DataType.string }, // extended\n 0x68ca: { name: 'targetTypeValue', value: DataType.uint }, // extended\n 0x63c9: { name: 'tagEditionUID', value: DataType.uid } // extended\n }\n },\n 0x67c8: {\n name: 'simpleTags',\n multiple: true,\n container: {\n 0x45a3: { name: 'name', value: DataType.string },\n 0x4487: { name: 'string', value: DataType.string },\n 0x4485: { name: 'binary', value: DataType.binary },\n 0x447a: { name: 'language', value: DataType.string }, // extended\n 0x447b: { name: 'languageIETF', value: DataType.string }, // extended\n 0x4484: { name: 'default', value: DataType.bool } // extended\n }\n }\n }\n }\n }\n }\n }\n }\n }\n};\n","import { Float32_BE, Float64_BE, StringType, UINT8 } from 'token-types';\nimport initDebug from 'debug';\nimport { EndOfStreamError } from 'strtok3';\nimport { DataType } from './types.js';\nimport * as Token from 'token-types';\nimport { makeUnexpectedFileContentError } from '../ParseError.js';\nconst debug = initDebug('music-metadata:parser:ebml');\nexport class EbmlContentError extends makeUnexpectedFileContentError('EBML') {\n}\nexport const ParseAction = {\n ReadNext: 0, // Continue reading the next elements\n IgnoreElement: 2, // Ignore (do not read) this element\n SkipSiblings: 3, // Skip all remaining elements at the same level\n TerminateParsing: 4, // Terminate the parsing process\n SkipElement: 5 // Consider the element has read, assume position is at the next element\n};\n/**\n * Extensible Binary Meta Language (EBML) iterator\n * https://en.wikipedia.org/wiki/Extensible_Binary_Meta_Language\n * http://matroska.sourceforge.net/technical/specs/rfc/index.html\n *\n * WEBM VP8 AUDIO FILE\n */\nexport class EbmlIterator {\n /**\n * @param {ITokenizer} tokenizer Input\n * @param tokenizer\n */\n constructor(tokenizer) {\n this.parserMap = new Map();\n this.ebmlMaxIDLength = 4;\n this.ebmlMaxSizeLength = 8;\n this.tokenizer = tokenizer;\n this.parserMap.set(DataType.uint, e => this.readUint(e));\n this.parserMap.set(DataType.string, e => this.readString(e));\n this.parserMap.set(DataType.binary, e => this.readBuffer(e));\n this.parserMap.set(DataType.uid, async (e) => this.readBuffer(e));\n this.parserMap.set(DataType.bool, e => this.readFlag(e));\n this.parserMap.set(DataType.float, e => this.readFloat(e));\n }\n async iterate(dtdElement, posDone, listener) {\n return this.parseContainer(linkParents(dtdElement), posDone, listener);\n }\n async parseContainer(dtdElement, posDone, listener) {\n const tree = {};\n while (this.tokenizer.position < posDone) {\n let element;\n const elementPosition = this.tokenizer.position;\n try {\n element = await this.readElement();\n }\n catch (error) {\n if (error instanceof EndOfStreamError) {\n break;\n }\n throw error;\n }\n const child = dtdElement.container[element.id];\n if (child) {\n const action = listener.startNext(child);\n switch (action) {\n case ParseAction.ReadNext:\n {\n if (element.id === 0x1F43B675) {\n // Hack to ignore remaining segment, when cluster element received\n // await this.tokenizer.ignore(posDone - this.tokenizer.position);\n // break;\n }\n debug(`Read element: name=${getElementPath(child)}{id=0x${element.id.toString(16)}, container=${!!child.container}} at position=${elementPosition}`);\n if (child.container) {\n const res = await this.parseContainer(child, element.len >= 0 ? this.tokenizer.position + element.len : -1, listener);\n if (child.multiple) {\n if (!tree[child.name]) {\n tree[child.name] = [];\n }\n tree[child.name].push(res);\n }\n else {\n tree[child.name] = res;\n }\n await listener.elementValue(child, res, elementPosition);\n }\n else {\n const parser = this.parserMap.get(child.value);\n if (typeof parser === 'function') {\n const value = await parser(element);\n tree[child.name] = value;\n await listener.elementValue(child, value, elementPosition);\n }\n }\n }\n break;\n case ParseAction.SkipElement:\n debug(`Go to next element: name=${getElementPath(child)}, element.id=0x${element.id}, container=${!!child.container} at position=${elementPosition}`);\n break;\n case ParseAction.IgnoreElement:\n debug(`Ignore element: name=${getElementPath(child)}, element.id=0x${element.id}, container=${!!child.container} at position=${elementPosition}`);\n await this.tokenizer.ignore(element.len);\n break;\n case ParseAction.SkipSiblings:\n debug(`Ignore remaining container, at: name=${getElementPath(child)}, element.id=0x${element.id}, container=${!!child.container} at position=${elementPosition}`);\n await this.tokenizer.ignore(posDone - this.tokenizer.position);\n break;\n case ParseAction.TerminateParsing:\n debug(`Terminate parsing at element: name=${getElementPath(child)}, element.id=0x${element.id}, container=${!!child.container} at position=${elementPosition}`);\n return tree;\n }\n }\n else {\n switch (element.id) {\n case 0xec: // void\n await this.tokenizer.ignore(element.len);\n break;\n default:\n debug(`parseEbml: parent=${getElementPath(dtdElement)}, unknown child: id=${element.id.toString(16)} at position=${elementPosition}`);\n await this.tokenizer.ignore(element.len);\n }\n }\n }\n return tree;\n }\n async readVintData(maxLength) {\n const msb = await this.tokenizer.peekNumber(UINT8);\n let mask = 0x80;\n let oc = 1;\n // Calculate VINT_WIDTH\n while ((msb & mask) === 0) {\n if (oc > maxLength) {\n throw new EbmlContentError('VINT value exceeding maximum size');\n }\n ++oc;\n mask >>= 1;\n }\n const id = new Uint8Array(oc);\n await this.tokenizer.readBuffer(id);\n return id;\n }\n async readElement() {\n const id = await this.readVintData(this.ebmlMaxIDLength);\n const lenField = await this.readVintData(this.ebmlMaxSizeLength);\n lenField[0] ^= 0x80 >> (lenField.length - 1);\n return {\n id: readUIntBE(id, id.length),\n len: readUIntBE(lenField, lenField.length)\n };\n }\n async readFloat(e) {\n switch (e.len) {\n case 0:\n return 0.0;\n case 4:\n return this.tokenizer.readNumber(Float32_BE);\n case 8:\n return this.tokenizer.readNumber(Float64_BE);\n case 10:\n return this.tokenizer.readNumber(Float64_BE);\n default:\n throw new EbmlContentError(`Invalid IEEE-754 float length: ${e.len}`);\n }\n }\n async readFlag(e) {\n return (await this.readUint(e)) === 1;\n }\n async readUint(e) {\n const buf = await this.readBuffer(e);\n return readUIntBE(buf, e.len);\n }\n async readString(e) {\n const rawString = await this.tokenizer.readToken(new StringType(e.len, 'utf-8'));\n return rawString.replace(/\\x00.*$/g, '');\n }\n async readBuffer(e) {\n const buf = new Uint8Array(e.len);\n await this.tokenizer.readBuffer(buf);\n return buf;\n }\n}\nfunction readUIntBE(buf, len) {\n return Number(readUIntBeAsBigInt(buf, len));\n}\n/**\n * Reeds an unsigned integer from a big endian buffer of length `len`\n * @param buf Buffer to decode from\n * @param len Number of bytes\n * @private\n */\nfunction readUIntBeAsBigInt(buf, len) {\n const normalizedNumber = new Uint8Array(8);\n const cleanNumber = buf.subarray(0, len);\n try {\n normalizedNumber.set(cleanNumber, 8 - len);\n return Token.UINT64_BE.get(normalizedNumber, 0);\n }\n catch (_error) {\n return BigInt(-1);\n }\n}\nfunction linkParents(element) {\n if (element.container) {\n Object.keys(element.container)\n .map(id => {\n const child = element.container[id];\n child.id = Number.parseInt(id, 10);\n return child;\n }).forEach(child => {\n child.parent = element;\n linkParents(child);\n });\n }\n return element;\n}\nexport function getElementPath(element) {\n let path = '';\n if (element.parent && element.parent.name !== 'dtd') {\n path += `${getElementPath(element.parent)}/`;\n }\n return path + element.name;\n}\n"],"mappings":"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","names":["import_debug","initDebug","debug","initDebug","index","value"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/MatroskaParser-K556QMVK.js.map"}
+656
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/MpegParser-6I4WPE7H.js
··· 1 + import { 2 + AbstractID3Parser 3 + } from "./chunk-WBWWX4CZ.js"; 4 + import "./chunk-QOFAJIKO.js"; 5 + import "./chunk-Z6RWJW2M.js"; 6 + import "./chunk-SGG7NSCF.js"; 7 + import "./chunk-CSVVW572.js"; 8 + import { 9 + getBitAllignedNumber, 10 + isBitSet, 11 + stripNulls 12 + } from "./chunk-6AX6SYMQ.js"; 13 + import { 14 + EndOfStreamError 15 + } from "./chunk-FGRUWWG5.js"; 16 + import { 17 + INT16_BE, 18 + StringType, 19 + UINT16_BE, 20 + UINT32_BE, 21 + UINT8, 22 + Uint8ArrayType, 23 + makeUnexpectedFileContentError, 24 + require_src 25 + } from "./chunk-ETGVMC2T.js"; 26 + import { 27 + __name, 28 + __toESM 29 + } from "./chunk-7IARE43G.js"; 30 + 31 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/mpeg/MpegParser.js 32 + var import_debug = __toESM(require_src()); 33 + 34 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/mpeg/ReplayGainDataFormat.js 35 + var ReplayGain = { 36 + len: 2, 37 + get: /* @__PURE__ */ __name((buf, off) => { 38 + const gain_type = getBitAllignedNumber(buf, off, 0, 3); 39 + const sign = getBitAllignedNumber(buf, off, 6, 1); 40 + const gain_adj = getBitAllignedNumber(buf, off, 7, 9) / 10; 41 + if (gain_type > 0) { 42 + return { 43 + type: getBitAllignedNumber(buf, off, 0, 3), 44 + origin: getBitAllignedNumber(buf, off, 3, 3), 45 + adjustment: sign ? -gain_adj : gain_adj 46 + }; 47 + } 48 + return void 0; 49 + }, "get") 50 + }; 51 + 52 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/mpeg/ExtendedLameHeader.js 53 + var ExtendedLameHeader = { 54 + len: 27, 55 + get: /* @__PURE__ */ __name((buf, off) => { 56 + const track_peak = UINT32_BE.get(buf, off + 2); 57 + return { 58 + revision: getBitAllignedNumber(buf, off, 0, 4), 59 + vbr_method: getBitAllignedNumber(buf, off, 4, 4), 60 + lowpass_filter: 100 * UINT8.get(buf, off + 1), 61 + track_peak: track_peak === 0 ? null : track_peak / 2 ** 23, 62 + track_gain: ReplayGain.get(buf, 6), 63 + album_gain: ReplayGain.get(buf, 8), 64 + music_length: UINT32_BE.get(buf, off + 20), 65 + music_crc: UINT8.get(buf, off + 24), 66 + header_crc: UINT16_BE.get(buf, off + 24) 67 + }; 68 + }, "get") 69 + }; 70 + 71 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/mpeg/XingTag.js 72 + var InfoTagHeaderTag = new StringType(4, "ascii"); 73 + var LameEncoderVersion = new StringType(6, "ascii"); 74 + var XingHeaderFlags = { 75 + len: 4, 76 + get: /* @__PURE__ */ __name((buf, off) => { 77 + return { 78 + frames: isBitSet(buf, off, 31), 79 + bytes: isBitSet(buf, off, 30), 80 + toc: isBitSet(buf, off, 29), 81 + vbrScale: isBitSet(buf, off, 28) 82 + }; 83 + }, "get") 84 + }; 85 + async function readXingHeader(tokenizer) { 86 + const flags = await tokenizer.readToken(XingHeaderFlags); 87 + const xingInfoTag = { numFrames: null, streamSize: null, vbrScale: null }; 88 + if (flags.frames) { 89 + xingInfoTag.numFrames = await tokenizer.readToken(UINT32_BE); 90 + } 91 + if (flags.bytes) { 92 + xingInfoTag.streamSize = await tokenizer.readToken(UINT32_BE); 93 + } 94 + if (flags.toc) { 95 + xingInfoTag.toc = new Uint8Array(100); 96 + await tokenizer.readBuffer(xingInfoTag.toc); 97 + } 98 + if (flags.vbrScale) { 99 + xingInfoTag.vbrScale = await tokenizer.readToken(UINT32_BE); 100 + } 101 + const lameTag = await tokenizer.peekToken(new StringType(4, "ascii")); 102 + if (lameTag === "LAME") { 103 + await tokenizer.ignore(4); 104 + xingInfoTag.lame = { 105 + version: await tokenizer.readToken(new StringType(5, "ascii")) 106 + }; 107 + const match = xingInfoTag.lame.version.match(/\d+.\d+/g); 108 + if (match !== null) { 109 + const majorMinorVersion = match[0]; 110 + const version = majorMinorVersion.split(".").map((n) => Number.parseInt(n, 10)); 111 + if (version[0] >= 3 && version[1] >= 90) { 112 + xingInfoTag.lame.extended = await tokenizer.readToken(ExtendedLameHeader); 113 + } 114 + } 115 + } 116 + return xingInfoTag; 117 + } 118 + __name(readXingHeader, "readXingHeader"); 119 + 120 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/mpeg/MpegParser.js 121 + var debug = (0, import_debug.default)("music-metadata:parser:mpeg"); 122 + var MpegContentError = class extends makeUnexpectedFileContentError("MPEG") { 123 + static { 124 + __name(this, "MpegContentError"); 125 + } 126 + }; 127 + var maxPeekLen = 1024; 128 + var MPEG4 = { 129 + /** 130 + * Audio Object Types 131 + */ 132 + AudioObjectTypes: [ 133 + "AAC Main", 134 + "AAC LC", 135 + // Low Complexity 136 + "AAC SSR", 137 + // Scalable Sample Rate 138 + "AAC LTP" 139 + // Long Term Prediction 140 + ], 141 + /** 142 + * Sampling Frequencies 143 + * https://wiki.multimedia.cx/index.php/MPEG-4_Audio#Sampling_Frequencies 144 + */ 145 + SamplingFrequencies: [ 146 + 96e3, 147 + 88200, 148 + 64e3, 149 + 48e3, 150 + 44100, 151 + 32e3, 152 + 24e3, 153 + 22050, 154 + 16e3, 155 + 12e3, 156 + 11025, 157 + 8e3, 158 + 7350, 159 + null, 160 + null, 161 + -1 162 + ] 163 + /** 164 + * Channel Configurations 165 + */ 166 + }; 167 + var MPEG4_ChannelConfigurations = [ 168 + void 0, 169 + ["front-center"], 170 + ["front-left", "front-right"], 171 + ["front-center", "front-left", "front-right"], 172 + ["front-center", "front-left", "front-right", "back-center"], 173 + ["front-center", "front-left", "front-right", "back-left", "back-right"], 174 + ["front-center", "front-left", "front-right", "back-left", "back-right", "LFE-channel"], 175 + ["front-center", "front-left", "front-right", "side-left", "side-right", "back-left", "back-right", "LFE-channel"] 176 + ]; 177 + var MpegFrameHeader = class _MpegFrameHeader { 178 + static { 179 + __name(this, "MpegFrameHeader"); 180 + } 181 + constructor(buf, off) { 182 + this.bitrateIndex = null; 183 + this.sampRateFreqIndex = null; 184 + this.padding = null; 185 + this.privateBit = null; 186 + this.channelModeIndex = null; 187 + this.modeExtension = null; 188 + this.isOriginalMedia = null; 189 + this.version = null; 190 + this.bitrate = null; 191 + this.samplingRate = null; 192 + this.frameLength = 0; 193 + this.versionIndex = getBitAllignedNumber(buf, off + 1, 3, 2); 194 + this.layer = _MpegFrameHeader.LayerDescription[getBitAllignedNumber(buf, off + 1, 5, 2)]; 195 + if (this.versionIndex > 1 && this.layer === 0) { 196 + this.parseAdtsHeader(buf, off); 197 + } else { 198 + this.parseMpegHeader(buf, off); 199 + } 200 + this.isProtectedByCRC = !isBitSet(buf, off + 1, 7); 201 + } 202 + calcDuration(numFrames) { 203 + return this.samplingRate == null ? null : numFrames * this.calcSamplesPerFrame() / this.samplingRate; 204 + } 205 + calcSamplesPerFrame() { 206 + return _MpegFrameHeader.samplesInFrameTable[this.version === 1 ? 0 : 1][this.layer]; 207 + } 208 + calculateSideInfoLength() { 209 + if (this.layer !== 3) 210 + return 2; 211 + if (this.channelModeIndex === 3) { 212 + if (this.version === 1) { 213 + return 17; 214 + } 215 + if (this.version === 2 || this.version === 2.5) { 216 + return 9; 217 + } 218 + } else { 219 + if (this.version === 1) { 220 + return 32; 221 + } 222 + if (this.version === 2 || this.version === 2.5) { 223 + return 17; 224 + } 225 + } 226 + return null; 227 + } 228 + calcSlotSize() { 229 + return [null, 4, 1, 1][this.layer]; 230 + } 231 + parseMpegHeader(buf, off) { 232 + this.container = "MPEG"; 233 + this.bitrateIndex = getBitAllignedNumber(buf, off + 2, 0, 4); 234 + this.sampRateFreqIndex = getBitAllignedNumber(buf, off + 2, 4, 2); 235 + this.padding = isBitSet(buf, off + 2, 6); 236 + this.privateBit = isBitSet(buf, off + 2, 7); 237 + this.channelModeIndex = getBitAllignedNumber(buf, off + 3, 0, 2); 238 + this.modeExtension = getBitAllignedNumber(buf, off + 3, 2, 2); 239 + this.isCopyrighted = isBitSet(buf, off + 3, 4); 240 + this.isOriginalMedia = isBitSet(buf, off + 3, 5); 241 + this.emphasis = getBitAllignedNumber(buf, off + 3, 7, 2); 242 + this.version = _MpegFrameHeader.VersionID[this.versionIndex]; 243 + this.channelMode = _MpegFrameHeader.ChannelMode[this.channelModeIndex]; 244 + this.codec = `MPEG ${this.version} Layer ${this.layer}`; 245 + const bitrateInKbps = this.calcBitrate(); 246 + if (!bitrateInKbps) { 247 + throw new MpegContentError("Cannot determine bit-rate"); 248 + } 249 + this.bitrate = bitrateInKbps * 1e3; 250 + this.samplingRate = this.calcSamplingRate(); 251 + if (this.samplingRate == null) { 252 + throw new MpegContentError("Cannot determine sampling-rate"); 253 + } 254 + } 255 + parseAdtsHeader(buf, off) { 256 + debug("layer=0 => ADTS"); 257 + this.version = this.versionIndex === 2 ? 4 : 2; 258 + this.container = `ADTS/MPEG-${this.version}`; 259 + const profileIndex = getBitAllignedNumber(buf, off + 2, 0, 2); 260 + this.codec = "AAC"; 261 + this.codecProfile = MPEG4.AudioObjectTypes[profileIndex]; 262 + debug(`MPEG-4 audio-codec=${this.codec}`); 263 + const samplingFrequencyIndex = getBitAllignedNumber(buf, off + 2, 2, 4); 264 + this.samplingRate = MPEG4.SamplingFrequencies[samplingFrequencyIndex]; 265 + debug(`sampling-rate=${this.samplingRate}`); 266 + const channelIndex = getBitAllignedNumber(buf, off + 2, 7, 3); 267 + this.mp4ChannelConfig = MPEG4_ChannelConfigurations[channelIndex]; 268 + debug(`channel-config=${this.mp4ChannelConfig ? this.mp4ChannelConfig.join("+") : "?"}`); 269 + this.frameLength = getBitAllignedNumber(buf, off + 3, 6, 2) << 11; 270 + } 271 + calcBitrate() { 272 + if (this.bitrateIndex === 0 || // free 273 + this.bitrateIndex === 15) { 274 + return null; 275 + } 276 + if (this.version && this.bitrateIndex) { 277 + const codecIndex = 10 * Math.floor(this.version) + this.layer; 278 + return _MpegFrameHeader.bitrate_index[this.bitrateIndex][codecIndex]; 279 + } 280 + return null; 281 + } 282 + calcSamplingRate() { 283 + if (this.sampRateFreqIndex === 3 || this.version === null || this.sampRateFreqIndex == null) 284 + return null; 285 + return _MpegFrameHeader.sampling_rate_freq_index[this.version][this.sampRateFreqIndex]; 286 + } 287 + }; 288 + MpegFrameHeader.SyncByte1 = 255; 289 + MpegFrameHeader.SyncByte2 = 224; 290 + MpegFrameHeader.VersionID = [2.5, null, 2, 1]; 291 + MpegFrameHeader.LayerDescription = [0, 3, 2, 1]; 292 + MpegFrameHeader.ChannelMode = ["stereo", "joint_stereo", "dual_channel", "mono"]; 293 + MpegFrameHeader.bitrate_index = { 294 + 1: { 11: 32, 12: 32, 13: 32, 21: 32, 22: 8, 23: 8 }, 295 + 2: { 11: 64, 12: 48, 13: 40, 21: 48, 22: 16, 23: 16 }, 296 + 3: { 11: 96, 12: 56, 13: 48, 21: 56, 22: 24, 23: 24 }, 297 + 4: { 11: 128, 12: 64, 13: 56, 21: 64, 22: 32, 23: 32 }, 298 + 5: { 11: 160, 12: 80, 13: 64, 21: 80, 22: 40, 23: 40 }, 299 + 6: { 11: 192, 12: 96, 13: 80, 21: 96, 22: 48, 23: 48 }, 300 + 7: { 11: 224, 12: 112, 13: 96, 21: 112, 22: 56, 23: 56 }, 301 + 8: { 11: 256, 12: 128, 13: 112, 21: 128, 22: 64, 23: 64 }, 302 + 9: { 11: 288, 12: 160, 13: 128, 21: 144, 22: 80, 23: 80 }, 303 + 10: { 11: 320, 12: 192, 13: 160, 21: 160, 22: 96, 23: 96 }, 304 + 11: { 11: 352, 12: 224, 13: 192, 21: 176, 22: 112, 23: 112 }, 305 + 12: { 11: 384, 12: 256, 13: 224, 21: 192, 22: 128, 23: 128 }, 306 + 13: { 11: 416, 12: 320, 13: 256, 21: 224, 22: 144, 23: 144 }, 307 + 14: { 11: 448, 12: 384, 13: 320, 21: 256, 22: 160, 23: 160 } 308 + }; 309 + MpegFrameHeader.sampling_rate_freq_index = { 310 + 1: { 0: 44100, 1: 48e3, 2: 32e3 }, 311 + 2: { 0: 22050, 1: 24e3, 2: 16e3 }, 312 + 2.5: { 0: 11025, 1: 12e3, 2: 8e3 } 313 + }; 314 + MpegFrameHeader.samplesInFrameTable = [ 315 + /* Layer I II III */ 316 + [0, 384, 1152, 1152], 317 + // MPEG-1 318 + [0, 384, 1152, 576] 319 + // MPEG-2(.5 320 + ]; 321 + var FrameHeader = { 322 + len: 4, 323 + get: /* @__PURE__ */ __name((buf, off) => { 324 + return new MpegFrameHeader(buf, off); 325 + }, "get") 326 + }; 327 + function getVbrCodecProfile(vbrScale) { 328 + return `V${Math.floor((100 - vbrScale) / 10)}`; 329 + } 330 + __name(getVbrCodecProfile, "getVbrCodecProfile"); 331 + var MpegParser = class extends AbstractID3Parser { 332 + static { 333 + __name(this, "MpegParser"); 334 + } 335 + constructor() { 336 + super(...arguments); 337 + this.frameCount = 0; 338 + this.syncFrameCount = -1; 339 + this.totalDataLength = 0; 340 + this.bitrates = []; 341 + this.offset = 0; 342 + this.frame_size = 0; 343 + this.calculateEofDuration = false; 344 + this.samplesPerFrame = null; 345 + this.buf_frame_header = new Uint8Array(4); 346 + this.mpegOffset = null; 347 + this.syncPeek = { 348 + buf: new Uint8Array(maxPeekLen), 349 + len: 0 350 + }; 351 + } 352 + /** 353 + * Called after ID3 headers have been parsed 354 + */ 355 + async postId3v2Parse() { 356 + this.metadata.setFormat("lossless", false); 357 + this.metadata.setAudioOnly(); 358 + try { 359 + let quit = false; 360 + while (!quit) { 361 + await this.sync(); 362 + quit = await this.parseCommonMpegHeader(); 363 + } 364 + } catch (err) { 365 + if (err instanceof EndOfStreamError) { 366 + debug("End-of-stream"); 367 + if (this.calculateEofDuration) { 368 + if (this.samplesPerFrame !== null) { 369 + const numberOfSamples = this.frameCount * this.samplesPerFrame; 370 + this.metadata.setFormat("numberOfSamples", numberOfSamples); 371 + if (this.metadata.format.sampleRate) { 372 + const duration = numberOfSamples / this.metadata.format.sampleRate; 373 + debug(`Calculate duration at EOF: ${duration} sec.`, duration); 374 + this.metadata.setFormat("duration", duration); 375 + } 376 + } 377 + } 378 + } else { 379 + throw err; 380 + } 381 + } 382 + } 383 + /** 384 + * Called after file has been fully parsed, this allows, if present, to exclude the ID3v1.1 header length 385 + */ 386 + finalize() { 387 + const format = this.metadata.format; 388 + const hasID3v1 = !!this.metadata.native.ID3v1; 389 + if (this.mpegOffset !== null) { 390 + if (format.duration && this.tokenizer.fileInfo.size) { 391 + const mpegSize = this.tokenizer.fileInfo.size - this.mpegOffset - (hasID3v1 ? 128 : 0); 392 + if (format.codecProfile && format.codecProfile[0] === "V") { 393 + this.metadata.setFormat("bitrate", mpegSize * 8 / format.duration); 394 + } 395 + } 396 + if (this.tokenizer.fileInfo.size && format.codecProfile === "CBR") { 397 + const mpegSize = this.tokenizer.fileInfo.size - this.mpegOffset - (hasID3v1 ? 128 : 0); 398 + if (this.frame_size !== null && this.samplesPerFrame !== null) { 399 + const numberOfSamples = Math.round(mpegSize / this.frame_size) * this.samplesPerFrame; 400 + this.metadata.setFormat("numberOfSamples", numberOfSamples); 401 + if (format.sampleRate && !format.duration) { 402 + const duration = numberOfSamples / format.sampleRate; 403 + debug("Calculate CBR duration based on file size: %s", duration); 404 + this.metadata.setFormat("duration", duration); 405 + } 406 + } 407 + } 408 + } 409 + } 410 + async sync() { 411 + let gotFirstSync = false; 412 + while (true) { 413 + let bo = 0; 414 + this.syncPeek.len = await this.tokenizer.peekBuffer(this.syncPeek.buf, { length: maxPeekLen, mayBeLess: true }); 415 + if (this.syncPeek.len <= 163) { 416 + throw new EndOfStreamError(); 417 + } 418 + while (true) { 419 + if (gotFirstSync && (this.syncPeek.buf[bo] & 224) === 224) { 420 + this.buf_frame_header[0] = MpegFrameHeader.SyncByte1; 421 + this.buf_frame_header[1] = this.syncPeek.buf[bo]; 422 + await this.tokenizer.ignore(bo); 423 + debug(`Sync at offset=${this.tokenizer.position - 1}, frameCount=${this.frameCount}`); 424 + if (this.syncFrameCount === this.frameCount) { 425 + debug(`Re-synced MPEG stream, frameCount=${this.frameCount}`); 426 + this.frameCount = 0; 427 + this.frame_size = 0; 428 + } 429 + this.syncFrameCount = this.frameCount; 430 + return; 431 + } 432 + gotFirstSync = false; 433 + bo = this.syncPeek.buf.indexOf(MpegFrameHeader.SyncByte1, bo); 434 + if (bo === -1) { 435 + if (this.syncPeek.len < this.syncPeek.buf.length) { 436 + throw new EndOfStreamError(); 437 + } 438 + await this.tokenizer.ignore(this.syncPeek.len); 439 + break; 440 + } 441 + ++bo; 442 + gotFirstSync = true; 443 + } 444 + } 445 + } 446 + /** 447 + * Combined ADTS & MPEG (MP2 & MP3) header handling 448 + * @return {Promise<boolean>} true if parser should quit 449 + */ 450 + async parseCommonMpegHeader() { 451 + if (this.frameCount === 0) { 452 + this.mpegOffset = this.tokenizer.position - 1; 453 + } 454 + await this.tokenizer.peekBuffer(this.buf_frame_header.subarray(1), { length: 3 }); 455 + let header; 456 + try { 457 + header = FrameHeader.get(this.buf_frame_header, 0); 458 + } catch (err) { 459 + await this.tokenizer.ignore(1); 460 + if (err instanceof Error) { 461 + this.metadata.addWarning(`Parse error: ${err.message}`); 462 + return false; 463 + } 464 + throw err; 465 + } 466 + await this.tokenizer.ignore(3); 467 + this.metadata.setFormat("container", header.container); 468 + this.metadata.setFormat("codec", header.codec); 469 + this.metadata.setFormat("lossless", false); 470 + this.metadata.setFormat("sampleRate", header.samplingRate); 471 + this.frameCount++; 472 + return header.version !== null && header.version >= 2 && header.layer === 0 ? this.parseAdts(header) : this.parseAudioFrameHeader(header); 473 + } 474 + /** 475 + * @return {Promise<boolean>} true if parser should quit 476 + */ 477 + async parseAudioFrameHeader(header) { 478 + this.metadata.setFormat("numberOfChannels", header.channelMode === "mono" ? 1 : 2); 479 + this.metadata.setFormat("bitrate", header.bitrate); 480 + if (this.frameCount < 20 * 1e4) { 481 + debug("offset=%s MP%s bitrate=%s sample-rate=%s", this.tokenizer.position - 4, header.layer, header.bitrate, header.samplingRate); 482 + } 483 + const slot_size = header.calcSlotSize(); 484 + if (slot_size === null) { 485 + throw new MpegContentError("invalid slot_size"); 486 + } 487 + const samples_per_frame = header.calcSamplesPerFrame(); 488 + debug(`samples_per_frame=${samples_per_frame}`); 489 + const bps = samples_per_frame / 8; 490 + if (header.bitrate !== null && header.samplingRate != null) { 491 + const fsize = bps * header.bitrate / header.samplingRate + (header.padding ? slot_size : 0); 492 + this.frame_size = Math.floor(fsize); 493 + } 494 + this.audioFrameHeader = header; 495 + if (header.bitrate !== null) { 496 + this.bitrates.push(header.bitrate); 497 + } 498 + if (this.frameCount === 1) { 499 + this.offset = FrameHeader.len; 500 + await this.skipSideInformation(); 501 + return false; 502 + } 503 + if (this.frameCount === 4) { 504 + if (this.areAllSame(this.bitrates)) { 505 + this.samplesPerFrame = samples_per_frame; 506 + this.metadata.setFormat("codecProfile", "CBR"); 507 + if (this.tokenizer.fileInfo.size) 508 + return true; 509 + } else if (this.metadata.format.duration) { 510 + return true; 511 + } 512 + if (!this.options.duration) { 513 + return true; 514 + } 515 + } 516 + if (this.options.duration && this.frameCount === 4) { 517 + this.samplesPerFrame = samples_per_frame; 518 + this.calculateEofDuration = true; 519 + } 520 + this.offset = 4; 521 + if (header.isProtectedByCRC) { 522 + await this.parseCrc(); 523 + return false; 524 + } 525 + await this.skipSideInformation(); 526 + return false; 527 + } 528 + async parseAdts(header) { 529 + const buf = new Uint8Array(3); 530 + await this.tokenizer.readBuffer(buf); 531 + header.frameLength += getBitAllignedNumber(buf, 0, 0, 11); 532 + this.totalDataLength += header.frameLength; 533 + this.samplesPerFrame = 1024; 534 + if (header.samplingRate !== null) { 535 + const framesPerSec = header.samplingRate / this.samplesPerFrame; 536 + const bytesPerFrame = this.frameCount === 0 ? 0 : this.totalDataLength / this.frameCount; 537 + const bitrate = 8 * bytesPerFrame * framesPerSec + 0.5; 538 + this.metadata.setFormat("bitrate", bitrate); 539 + debug(`frame-count=${this.frameCount}, size=${header.frameLength} bytes, bit-rate=${bitrate}`); 540 + } 541 + await this.tokenizer.ignore(header.frameLength > 7 ? header.frameLength - 7 : 1); 542 + if (this.frameCount === 3) { 543 + this.metadata.setFormat("codecProfile", header.codecProfile); 544 + if (header.mp4ChannelConfig) { 545 + this.metadata.setFormat("numberOfChannels", header.mp4ChannelConfig.length); 546 + } 547 + if (this.options.duration) { 548 + this.calculateEofDuration = true; 549 + } else { 550 + return true; 551 + } 552 + } 553 + return false; 554 + } 555 + async parseCrc() { 556 + await this.tokenizer.ignore(INT16_BE.len); 557 + this.offset += INT16_BE.len; 558 + return this.skipSideInformation(); 559 + } 560 + async skipSideInformation() { 561 + if (this.audioFrameHeader) { 562 + const sideinfo_length = this.audioFrameHeader.calculateSideInfoLength(); 563 + if (sideinfo_length !== null) { 564 + await this.tokenizer.readToken(new Uint8ArrayType(sideinfo_length)); 565 + this.offset += sideinfo_length; 566 + await this.readXtraInfoHeader(); 567 + return; 568 + } 569 + } 570 + } 571 + async readXtraInfoHeader() { 572 + const headerTag = await this.tokenizer.readToken(InfoTagHeaderTag); 573 + this.offset += InfoTagHeaderTag.len; 574 + switch (headerTag) { 575 + case "Info": 576 + this.metadata.setFormat("codecProfile", "CBR"); 577 + return this.readXingInfoHeader(); 578 + case "Xing": { 579 + const infoTag = await this.readXingInfoHeader(); 580 + if (infoTag.vbrScale !== null) { 581 + const codecProfile = getVbrCodecProfile(infoTag.vbrScale); 582 + this.metadata.setFormat("codecProfile", codecProfile); 583 + } 584 + return null; 585 + } 586 + case "Xtra": 587 + break; 588 + case "LAME": { 589 + const version = await this.tokenizer.readToken(LameEncoderVersion); 590 + if (this.frame_size !== null && this.frame_size >= this.offset + LameEncoderVersion.len) { 591 + this.offset += LameEncoderVersion.len; 592 + this.metadata.setFormat("tool", `LAME ${version}`); 593 + await this.skipFrameData(this.frame_size - this.offset); 594 + return null; 595 + } 596 + this.metadata.addWarning("Corrupt LAME header"); 597 + break; 598 + } 599 + } 600 + const frameDataLeft = this.frame_size - this.offset; 601 + if (frameDataLeft < 0) { 602 + this.metadata.addWarning(`Frame ${this.frameCount}corrupt: negative frameDataLeft`); 603 + } else { 604 + await this.skipFrameData(frameDataLeft); 605 + } 606 + return null; 607 + } 608 + /** 609 + * Ref: http://gabriel.mp3-tech.org/mp3infotag.html 610 + * @returns {Promise<string>} 611 + */ 612 + async readXingInfoHeader() { 613 + const offset = this.tokenizer.position; 614 + const infoTag = await readXingHeader(this.tokenizer); 615 + this.offset += this.tokenizer.position - offset; 616 + if (infoTag.lame) { 617 + this.metadata.setFormat("tool", `LAME ${stripNulls(infoTag.lame.version)}`); 618 + if (infoTag.lame.extended) { 619 + this.metadata.setFormat("trackPeakLevel", infoTag.lame.extended.track_peak); 620 + if (infoTag.lame.extended.track_gain) { 621 + this.metadata.setFormat("trackGain", infoTag.lame.extended.track_gain.adjustment); 622 + } 623 + if (infoTag.lame.extended.album_gain) { 624 + this.metadata.setFormat("albumGain", infoTag.lame.extended.album_gain.adjustment); 625 + } 626 + this.metadata.setFormat("duration", infoTag.lame.extended.music_length / 1e3); 627 + } 628 + } 629 + if (infoTag.streamSize && this.audioFrameHeader && infoTag.numFrames !== null) { 630 + const duration = this.audioFrameHeader.calcDuration(infoTag.numFrames); 631 + this.metadata.setFormat("duration", duration); 632 + debug("Get duration from Xing header: %s", this.metadata.format.duration); 633 + return infoTag; 634 + } 635 + const frameDataLeft = this.frame_size - this.offset; 636 + await this.skipFrameData(frameDataLeft); 637 + return infoTag; 638 + } 639 + async skipFrameData(frameDataLeft) { 640 + if (frameDataLeft < 0) 641 + throw new MpegContentError("frame-data-left cannot be negative"); 642 + await this.tokenizer.ignore(frameDataLeft); 643 + } 644 + areAllSame(array) { 645 + const first = array[0]; 646 + return array.every((element) => { 647 + return element === first; 648 + }); 649 + } 650 + }; 651 + export { 652 + MpegContentError, 653 + MpegParser 654 + }; 655 + 656 + //# sourceMappingURL=./MpegParser-6I4WPE7H.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/MpegParser-6I4WPE7H.js.map
··· 1 + {"version":3,"sources":["/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/mpeg/MpegParser.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/mpeg/ReplayGainDataFormat.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/mpeg/ExtendedLameHeader.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/mpeg/XingTag.js"],"sourcesContent":["import * as Token from 'token-types';\nimport { EndOfStreamError } from 'strtok3';\nimport initDebug from 'debug';\nimport * as common from '../common/Util.js';\nimport { AbstractID3Parser } from '../id3v2/AbstractID3Parser.js';\nimport { InfoTagHeaderTag, LameEncoderVersion, readXingHeader } from './XingTag.js';\nimport { makeUnexpectedFileContentError } from '../ParseError.js';\nconst debug = initDebug('music-metadata:parser:mpeg');\nexport class MpegContentError extends makeUnexpectedFileContentError('MPEG') {\n}\n/**\n * Cache buffer size used for searching synchronization preabmle\n */\nconst maxPeekLen = 1024;\n/**\n * MPEG-4 Audio definitions\n * Ref: https://wiki.multimedia.cx/index.php/MPEG-4_Audio\n */\nconst MPEG4 = {\n /**\n * Audio Object Types\n */\n AudioObjectTypes: [\n 'AAC Main',\n 'AAC LC', // Low Complexity\n 'AAC SSR', // Scalable Sample Rate\n 'AAC LTP' // Long Term Prediction\n ],\n /**\n * Sampling Frequencies\n * https://wiki.multimedia.cx/index.php/MPEG-4_Audio#Sampling_Frequencies\n */\n SamplingFrequencies: [\n 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350, null, null, -1\n ]\n /**\n * Channel Configurations\n */\n};\nconst MPEG4_ChannelConfigurations = [\n undefined,\n ['front-center'],\n ['front-left', 'front-right'],\n ['front-center', 'front-left', 'front-right'],\n ['front-center', 'front-left', 'front-right', 'back-center'],\n ['front-center', 'front-left', 'front-right', 'back-left', 'back-right'],\n ['front-center', 'front-left', 'front-right', 'back-left', 'back-right', 'LFE-channel'],\n ['front-center', 'front-left', 'front-right', 'side-left', 'side-right', 'back-left', 'back-right', 'LFE-channel']\n];\n/**\n * MPEG Audio Layer I/II/III frame header\n * Ref: https://www.mp3-tech.org/programmer/frame_header.html\n * Bit layout: AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM\n * Ref: https://wiki.multimedia.cx/index.php/ADTS\n */\nclass MpegFrameHeader {\n constructor(buf, off) {\n // E(15,12): Bitrate index\n this.bitrateIndex = null;\n // F(11,10): Sampling rate frequency index\n this.sampRateFreqIndex = null;\n // G(9): Padding bit\n this.padding = null;\n // H(8): Private bit\n this.privateBit = null;\n // I(7,6): Channel Mode\n this.channelModeIndex = null;\n // J(5,4): Mode extension (Only used in Joint stereo)\n this.modeExtension = null;\n // L(2): Original\n this.isOriginalMedia = null;\n this.version = null;\n this.bitrate = null;\n this.samplingRate = null;\n this.frameLength = 0;\n // B(20,19): MPEG Audio versionIndex ID\n this.versionIndex = common.getBitAllignedNumber(buf, off + 1, 3, 2);\n // C(18,17): Layer description\n this.layer = MpegFrameHeader.LayerDescription[common.getBitAllignedNumber(buf, off + 1, 5, 2)];\n if (this.versionIndex > 1 && this.layer === 0) {\n this.parseAdtsHeader(buf, off); // Audio Data Transport Stream (ADTS)\n }\n else {\n this.parseMpegHeader(buf, off); // Conventional MPEG header\n }\n // D(16): Protection bit (if true 16-bit CRC follows header)\n this.isProtectedByCRC = !common.isBitSet(buf, off + 1, 7);\n }\n calcDuration(numFrames) {\n return this.samplingRate == null ? null : (numFrames * this.calcSamplesPerFrame() / this.samplingRate);\n }\n calcSamplesPerFrame() {\n return MpegFrameHeader.samplesInFrameTable[this.version === 1 ? 0 : 1][this.layer];\n }\n calculateSideInfoLength() {\n if (this.layer !== 3)\n return 2;\n if (this.channelModeIndex === 3) {\n // mono\n if (this.version === 1) {\n return 17;\n }\n if (this.version === 2 || this.version === 2.5) {\n return 9;\n }\n }\n else {\n if (this.version === 1) {\n return 32;\n }\n if (this.version === 2 || this.version === 2.5) {\n return 17;\n }\n }\n return null;\n }\n calcSlotSize() {\n return [null, 4, 1, 1][this.layer];\n }\n parseMpegHeader(buf, off) {\n this.container = 'MPEG';\n // E(15,12): Bitrate index\n this.bitrateIndex = common.getBitAllignedNumber(buf, off + 2, 0, 4);\n // F(11,10): Sampling rate frequency index\n this.sampRateFreqIndex = common.getBitAllignedNumber(buf, off + 2, 4, 2);\n // G(9): Padding bit\n this.padding = common.isBitSet(buf, off + 2, 6);\n // H(8): Private bit\n this.privateBit = common.isBitSet(buf, off + 2, 7);\n // I(7,6): Channel Mode\n this.channelModeIndex = common.getBitAllignedNumber(buf, off + 3, 0, 2);\n // J(5,4): Mode extension (Only used in Joint stereo)\n this.modeExtension = common.getBitAllignedNumber(buf, off + 3, 2, 2);\n // K(3): Copyright\n this.isCopyrighted = common.isBitSet(buf, off + 3, 4);\n // L(2): Original\n this.isOriginalMedia = common.isBitSet(buf, off + 3, 5);\n // M(3): The original bit indicates, if it is set, that the frame is located on its original media.\n this.emphasis = common.getBitAllignedNumber(buf, off + 3, 7, 2);\n this.version = MpegFrameHeader.VersionID[this.versionIndex];\n this.channelMode = MpegFrameHeader.ChannelMode[this.channelModeIndex];\n this.codec = `MPEG ${this.version} Layer ${this.layer}`;\n // Calculate bitrate\n const bitrateInKbps = this.calcBitrate();\n if (!bitrateInKbps) {\n throw new MpegContentError('Cannot determine bit-rate');\n }\n this.bitrate = bitrateInKbps * 1000;\n // Calculate sampling rate\n this.samplingRate = this.calcSamplingRate();\n if (this.samplingRate == null) {\n throw new MpegContentError('Cannot determine sampling-rate');\n }\n }\n parseAdtsHeader(buf, off) {\n debug(\"layer=0 => ADTS\");\n this.version = this.versionIndex === 2 ? 4 : 2;\n this.container = `ADTS/MPEG-${this.version}`;\n const profileIndex = common.getBitAllignedNumber(buf, off + 2, 0, 2);\n this.codec = 'AAC';\n this.codecProfile = MPEG4.AudioObjectTypes[profileIndex];\n debug(`MPEG-4 audio-codec=${this.codec}`);\n const samplingFrequencyIndex = common.getBitAllignedNumber(buf, off + 2, 2, 4);\n this.samplingRate = MPEG4.SamplingFrequencies[samplingFrequencyIndex];\n debug(`sampling-rate=${this.samplingRate}`);\n const channelIndex = common.getBitAllignedNumber(buf, off + 2, 7, 3);\n this.mp4ChannelConfig = MPEG4_ChannelConfigurations[channelIndex];\n debug(`channel-config=${this.mp4ChannelConfig ? this.mp4ChannelConfig.join('+') : '?'}`);\n this.frameLength = common.getBitAllignedNumber(buf, off + 3, 6, 2) << 11;\n }\n calcBitrate() {\n if (this.bitrateIndex === 0x00 || // free\n this.bitrateIndex === 0x0F) { // reserved\n return null;\n }\n if (this.version && this.bitrateIndex) {\n const codecIndex = 10 * Math.floor(this.version) + this.layer;\n return MpegFrameHeader.bitrate_index[this.bitrateIndex][codecIndex];\n }\n return null;\n }\n calcSamplingRate() {\n if (this.sampRateFreqIndex === 0x03 || this.version === null || this.sampRateFreqIndex == null)\n return null; // 'reserved'\n return MpegFrameHeader.sampling_rate_freq_index[this.version][this.sampRateFreqIndex];\n }\n}\nMpegFrameHeader.SyncByte1 = 0xFF;\nMpegFrameHeader.SyncByte2 = 0xE0;\nMpegFrameHeader.VersionID = [2.5, null, 2, 1];\nMpegFrameHeader.LayerDescription = [0, 3, 2, 1];\nMpegFrameHeader.ChannelMode = ['stereo', 'joint_stereo', 'dual_channel', 'mono'];\nMpegFrameHeader.bitrate_index = {\n 1: { 11: 32, 12: 32, 13: 32, 21: 32, 22: 8, 23: 8 },\n 2: { 11: 64, 12: 48, 13: 40, 21: 48, 22: 16, 23: 16 },\n 3: { 11: 96, 12: 56, 13: 48, 21: 56, 22: 24, 23: 24 },\n 4: { 11: 128, 12: 64, 13: 56, 21: 64, 22: 32, 23: 32 },\n 5: { 11: 160, 12: 80, 13: 64, 21: 80, 22: 40, 23: 40 },\n 6: { 11: 192, 12: 96, 13: 80, 21: 96, 22: 48, 23: 48 },\n 7: { 11: 224, 12: 112, 13: 96, 21: 112, 22: 56, 23: 56 },\n 8: { 11: 256, 12: 128, 13: 112, 21: 128, 22: 64, 23: 64 },\n 9: { 11: 288, 12: 160, 13: 128, 21: 144, 22: 80, 23: 80 },\n 10: { 11: 320, 12: 192, 13: 160, 21: 160, 22: 96, 23: 96 },\n 11: { 11: 352, 12: 224, 13: 192, 21: 176, 22: 112, 23: 112 },\n 12: { 11: 384, 12: 256, 13: 224, 21: 192, 22: 128, 23: 128 },\n 13: { 11: 416, 12: 320, 13: 256, 21: 224, 22: 144, 23: 144 },\n 14: { 11: 448, 12: 384, 13: 320, 21: 256, 22: 160, 23: 160 }\n};\nMpegFrameHeader.sampling_rate_freq_index = {\n 1: { 0: 44100, 1: 48000, 2: 32000 },\n 2: { 0: 22050, 1: 24000, 2: 16000 },\n 2.5: { 0: 11025, 1: 12000, 2: 8000 }\n};\nMpegFrameHeader.samplesInFrameTable = [\n /* Layer I II III */\n [0, 384, 1152, 1152], // MPEG-1\n [0, 384, 1152, 576] // MPEG-2(.5\n];\n/**\n * MPEG Audio Layer I/II/III\n */\nconst FrameHeader = {\n len: 4,\n get: (buf, off) => {\n return new MpegFrameHeader(buf, off);\n }\n};\nfunction getVbrCodecProfile(vbrScale) {\n return `V${Math.floor((100 - vbrScale) / 10)}`;\n}\nexport class MpegParser extends AbstractID3Parser {\n constructor() {\n super(...arguments);\n this.frameCount = 0;\n this.syncFrameCount = -1;\n this.totalDataLength = 0;\n this.bitrates = [];\n this.offset = 0;\n this.frame_size = 0;\n this.calculateEofDuration = false;\n this.samplesPerFrame = null;\n this.buf_frame_header = new Uint8Array(4);\n /**\n * Number of bytes already parsed since beginning of stream / file\n */\n this.mpegOffset = null;\n this.syncPeek = {\n buf: new Uint8Array(maxPeekLen),\n len: 0\n };\n }\n /**\n * Called after ID3 headers have been parsed\n */\n async postId3v2Parse() {\n this.metadata.setFormat('lossless', false);\n this.metadata.setAudioOnly();\n try {\n let quit = false;\n while (!quit) {\n await this.sync();\n quit = await this.parseCommonMpegHeader();\n }\n }\n catch (err) {\n if (err instanceof EndOfStreamError) {\n debug(\"End-of-stream\");\n if (this.calculateEofDuration) {\n if (this.samplesPerFrame !== null) {\n const numberOfSamples = this.frameCount * this.samplesPerFrame;\n this.metadata.setFormat('numberOfSamples', numberOfSamples);\n if (this.metadata.format.sampleRate) {\n const duration = numberOfSamples / this.metadata.format.sampleRate;\n debug(`Calculate duration at EOF: ${duration} sec.`, duration);\n this.metadata.setFormat('duration', duration);\n }\n }\n }\n }\n else {\n throw err;\n }\n }\n }\n /**\n * Called after file has been fully parsed, this allows, if present, to exclude the ID3v1.1 header length\n */\n finalize() {\n const format = this.metadata.format;\n const hasID3v1 = !!this.metadata.native.ID3v1;\n if (this.mpegOffset !== null) {\n if (format.duration && this.tokenizer.fileInfo.size) {\n const mpegSize = this.tokenizer.fileInfo.size - this.mpegOffset - (hasID3v1 ? 128 : 0);\n if (format.codecProfile && format.codecProfile[0] === 'V') {\n this.metadata.setFormat('bitrate', mpegSize * 8 / format.duration);\n }\n }\n if (this.tokenizer.fileInfo.size && format.codecProfile === 'CBR') {\n const mpegSize = this.tokenizer.fileInfo.size - this.mpegOffset - (hasID3v1 ? 128 : 0);\n if (this.frame_size !== null && this.samplesPerFrame !== null) {\n const numberOfSamples = Math.round(mpegSize / this.frame_size) * this.samplesPerFrame;\n this.metadata.setFormat('numberOfSamples', numberOfSamples);\n if (format.sampleRate && !format.duration) {\n const duration = numberOfSamples / format.sampleRate;\n debug(\"Calculate CBR duration based on file size: %s\", duration);\n this.metadata.setFormat('duration', duration);\n }\n }\n }\n }\n }\n async sync() {\n let gotFirstSync = false;\n while (true) {\n let bo = 0;\n this.syncPeek.len = await this.tokenizer.peekBuffer(this.syncPeek.buf, { length: maxPeekLen, mayBeLess: true });\n if (this.syncPeek.len <= 163) {\n throw new EndOfStreamError();\n }\n while (true) {\n if (gotFirstSync && (this.syncPeek.buf[bo] & 0xE0) === 0xE0) {\n this.buf_frame_header[0] = MpegFrameHeader.SyncByte1;\n this.buf_frame_header[1] = this.syncPeek.buf[bo];\n await this.tokenizer.ignore(bo);\n debug(`Sync at offset=${this.tokenizer.position - 1}, frameCount=${this.frameCount}`);\n if (this.syncFrameCount === this.frameCount) {\n debug(`Re-synced MPEG stream, frameCount=${this.frameCount}`);\n this.frameCount = 0;\n this.frame_size = 0;\n }\n this.syncFrameCount = this.frameCount;\n return; // sync\n }\n gotFirstSync = false;\n bo = this.syncPeek.buf.indexOf(MpegFrameHeader.SyncByte1, bo);\n if (bo === -1) {\n if (this.syncPeek.len < this.syncPeek.buf.length) {\n throw new EndOfStreamError();\n }\n await this.tokenizer.ignore(this.syncPeek.len);\n break; // continue with next buffer\n }\n ++bo;\n gotFirstSync = true;\n }\n }\n }\n /**\n * Combined ADTS & MPEG (MP2 & MP3) header handling\n * @return {Promise<boolean>} true if parser should quit\n */\n async parseCommonMpegHeader() {\n if (this.frameCount === 0) {\n this.mpegOffset = this.tokenizer.position - 1;\n }\n await this.tokenizer.peekBuffer(this.buf_frame_header.subarray(1), { length: 3 });\n let header;\n try {\n header = FrameHeader.get(this.buf_frame_header, 0);\n }\n catch (err) {\n await this.tokenizer.ignore(1);\n if (err instanceof Error) {\n this.metadata.addWarning(`Parse error: ${err.message}`);\n return false; // sync\n }\n throw err;\n }\n await this.tokenizer.ignore(3);\n this.metadata.setFormat('container', header.container);\n this.metadata.setFormat('codec', header.codec);\n this.metadata.setFormat('lossless', false);\n this.metadata.setFormat('sampleRate', header.samplingRate);\n this.frameCount++;\n return header.version !== null && header.version >= 2 && header.layer === 0 ? this.parseAdts(header) : this.parseAudioFrameHeader(header);\n }\n /**\n * @return {Promise<boolean>} true if parser should quit\n */\n async parseAudioFrameHeader(header) {\n this.metadata.setFormat('numberOfChannels', header.channelMode === 'mono' ? 1 : 2);\n this.metadata.setFormat('bitrate', header.bitrate);\n if (this.frameCount < 20 * 10000) {\n debug('offset=%s MP%s bitrate=%s sample-rate=%s', this.tokenizer.position - 4, header.layer, header.bitrate, header.samplingRate);\n }\n const slot_size = header.calcSlotSize();\n if (slot_size === null) {\n throw new MpegContentError('invalid slot_size');\n }\n const samples_per_frame = header.calcSamplesPerFrame();\n debug(`samples_per_frame=${samples_per_frame}`);\n const bps = samples_per_frame / 8.0;\n if (header.bitrate !== null && header.samplingRate != null) {\n const fsize = (bps * header.bitrate / header.samplingRate) + ((header.padding) ? slot_size : 0);\n this.frame_size = Math.floor(fsize);\n }\n this.audioFrameHeader = header;\n if (header.bitrate !== null) {\n this.bitrates.push(header.bitrate);\n }\n // xtra header only exists in first frame\n if (this.frameCount === 1) {\n this.offset = FrameHeader.len;\n await this.skipSideInformation();\n return false;\n }\n if (this.frameCount === 4) {\n // the stream is CBR if the first 3 frame bitrates are the same\n if (this.areAllSame(this.bitrates)) {\n // Actual calculation will be done in finalize\n this.samplesPerFrame = samples_per_frame;\n this.metadata.setFormat('codecProfile', 'CBR');\n if (this.tokenizer.fileInfo.size)\n return true; // Will calculate duration based on the file size\n }\n else if (this.metadata.format.duration) {\n return true; // We already got the duration, stop processing MPEG stream any further\n }\n if (!this.options.duration) {\n return true; // Enforce duration not enabled, stop processing entire stream\n }\n }\n // once we know the file is VBR attach listener to end of\n // stream so we can do the duration calculation when we\n // have counted all the frames\n if (this.options.duration && this.frameCount === 4) {\n this.samplesPerFrame = samples_per_frame;\n this.calculateEofDuration = true;\n }\n this.offset = 4;\n if (header.isProtectedByCRC) {\n await this.parseCrc();\n return false;\n }\n await this.skipSideInformation();\n return false;\n }\n async parseAdts(header) {\n const buf = new Uint8Array(3);\n await this.tokenizer.readBuffer(buf);\n header.frameLength += common.getBitAllignedNumber(buf, 0, 0, 11);\n this.totalDataLength += header.frameLength;\n this.samplesPerFrame = 1024;\n if (header.samplingRate !== null) {\n const framesPerSec = header.samplingRate / this.samplesPerFrame;\n const bytesPerFrame = this.frameCount === 0 ? 0 : this.totalDataLength / this.frameCount;\n const bitrate = 8 * bytesPerFrame * framesPerSec + 0.5;\n this.metadata.setFormat('bitrate', bitrate);\n debug(`frame-count=${this.frameCount}, size=${header.frameLength} bytes, bit-rate=${bitrate}`);\n }\n await this.tokenizer.ignore(header.frameLength > 7 ? header.frameLength - 7 : 1);\n // Consume remaining header and frame data\n if (this.frameCount === 3) {\n this.metadata.setFormat('codecProfile', header.codecProfile);\n if (header.mp4ChannelConfig) {\n this.metadata.setFormat('numberOfChannels', header.mp4ChannelConfig.length);\n }\n if (this.options.duration) {\n this.calculateEofDuration = true;\n }\n else {\n return true; // Stop parsing after the third frame\n }\n }\n return false;\n }\n async parseCrc() {\n await this.tokenizer.ignore(Token.INT16_BE.len); // Ignore CRC\n this.offset += Token.INT16_BE.len;\n return this.skipSideInformation();\n }\n async skipSideInformation() {\n if (this.audioFrameHeader) {\n const sideinfo_length = this.audioFrameHeader.calculateSideInfoLength();\n if (sideinfo_length !== null) {\n await this.tokenizer.readToken(new Token.Uint8ArrayType(sideinfo_length));\n // side information\n this.offset += sideinfo_length;\n await this.readXtraInfoHeader();\n return;\n }\n }\n }\n async readXtraInfoHeader() {\n const headerTag = await this.tokenizer.readToken(InfoTagHeaderTag);\n this.offset += InfoTagHeaderTag.len; // 12\n switch (headerTag) {\n case 'Info':\n this.metadata.setFormat('codecProfile', 'CBR');\n return this.readXingInfoHeader();\n case 'Xing': {\n const infoTag = await this.readXingInfoHeader();\n if (infoTag.vbrScale !== null) {\n const codecProfile = getVbrCodecProfile(infoTag.vbrScale);\n this.metadata.setFormat('codecProfile', codecProfile);\n }\n return null;\n }\n case 'Xtra':\n // ToDo: ???\n break;\n case 'LAME': {\n const version = await this.tokenizer.readToken(LameEncoderVersion);\n if (this.frame_size !== null && this.frame_size >= this.offset + LameEncoderVersion.len) {\n this.offset += LameEncoderVersion.len;\n this.metadata.setFormat('tool', `LAME ${version}`);\n await this.skipFrameData(this.frame_size - this.offset);\n return null;\n }\n this.metadata.addWarning('Corrupt LAME header');\n break;\n }\n // ToDo: ???\n }\n // ToDo: promise duration???\n const frameDataLeft = this.frame_size - this.offset;\n if (frameDataLeft < 0) {\n this.metadata.addWarning(`Frame ${this.frameCount}corrupt: negative frameDataLeft`);\n }\n else {\n await this.skipFrameData(frameDataLeft);\n }\n return null;\n }\n /**\n * Ref: http://gabriel.mp3-tech.org/mp3infotag.html\n * @returns {Promise<string>}\n */\n async readXingInfoHeader() {\n const offset = this.tokenizer.position;\n const infoTag = await readXingHeader(this.tokenizer);\n this.offset += this.tokenizer.position - offset;\n if (infoTag.lame) {\n this.metadata.setFormat('tool', `LAME ${common.stripNulls(infoTag.lame.version)}`);\n if (infoTag.lame.extended) {\n // this.metadata.setFormat('trackGain', infoTag.lame.extended.track_gain);\n this.metadata.setFormat('trackPeakLevel', infoTag.lame.extended.track_peak);\n if (infoTag.lame.extended.track_gain) {\n this.metadata.setFormat('trackGain', infoTag.lame.extended.track_gain.adjustment);\n }\n if (infoTag.lame.extended.album_gain) {\n this.metadata.setFormat('albumGain', infoTag.lame.extended.album_gain.adjustment);\n }\n this.metadata.setFormat('duration', infoTag.lame.extended.music_length / 1000);\n }\n }\n if (infoTag.streamSize && this.audioFrameHeader && infoTag.numFrames !== null) {\n const duration = this.audioFrameHeader.calcDuration(infoTag.numFrames);\n this.metadata.setFormat('duration', duration);\n debug('Get duration from Xing header: %s', this.metadata.format.duration);\n return infoTag;\n }\n // frames field is not present\n const frameDataLeft = this.frame_size - this.offset;\n await this.skipFrameData(frameDataLeft);\n return infoTag;\n }\n async skipFrameData(frameDataLeft) {\n if (frameDataLeft < 0)\n throw new MpegContentError('frame-data-left cannot be negative');\n await this.tokenizer.ignore(frameDataLeft);\n }\n areAllSame(array) {\n const first = array[0];\n return array.every(element => {\n return element === first;\n });\n }\n}\n","import * as common from '../common/Util.js';\n/**\n * https://github.com/Borewit/music-metadata/wiki/Replay-Gain-Data-Format#name-code\n */\nconst NameCode = {\n /**\n * not set\n */\n not_set: 0,\n /**\n * Radio Gain Adjustment\n */\n radio: 1,\n /**\n * Audiophile Gain Adjustment\n */\n audiophile: 2\n};\n/**\n * https://github.com/Borewit/music-metadata/wiki/Replay-Gain-Data-Format#originator-code\n */\nconst ReplayGainOriginator = {\n /**\n * Replay Gain unspecified\n */\n unspecified: 0,\n /**\n * Replay Gain pre-set by artist/producer/mastering engineer\n */\n engineer: 1,\n /**\n * Replay Gain set by user\n */\n user: 2,\n /**\n * Replay Gain determined automatically, as described on this site\n */\n automatic: 3,\n /**\n * Set by simple RMS average\n */\n rms_average: 4\n};\n/**\n * Replay Gain Data Format\n *\n * https://github.com/Borewit/music-metadata/wiki/Replay-Gain-Data-Format\n */\nexport const ReplayGain = {\n len: 2,\n get: (buf, off) => {\n const gain_type = common.getBitAllignedNumber(buf, off, 0, 3);\n const sign = common.getBitAllignedNumber(buf, off, 6, 1);\n const gain_adj = common.getBitAllignedNumber(buf, off, 7, 9) / 10.0;\n if (gain_type > 0) {\n return {\n type: common.getBitAllignedNumber(buf, off, 0, 3),\n origin: common.getBitAllignedNumber(buf, off, 3, 3),\n adjustment: (sign ? -gain_adj : gain_adj)\n };\n }\n return undefined;\n }\n};\n","/**\n * Extended Lame Header\n */\nimport * as Token from 'token-types';\nimport * as common from '../common/Util.js';\nimport { ReplayGain } from './ReplayGainDataFormat.js';\n/**\n * Info Tag\n * @link http://gabriel.mp3-tech.org/mp3infotag.html\n * @link https://github.com/quodlibet/mutagen/blob/abd58ee58772224334a18817c3fb31103572f70e/mutagen/mp3/_util.py#L112\n */\nexport const ExtendedLameHeader = {\n len: 27,\n get: (buf, off) => {\n const track_peak = Token.UINT32_BE.get(buf, off + 2);\n return {\n revision: common.getBitAllignedNumber(buf, off, 0, 4),\n vbr_method: common.getBitAllignedNumber(buf, off, 4, 4),\n lowpass_filter: 100 * Token.UINT8.get(buf, off + 1),\n track_peak: track_peak === 0 ? null : track_peak / 2 ** 23,\n track_gain: ReplayGain.get(buf, 6),\n album_gain: ReplayGain.get(buf, 8),\n music_length: Token.UINT32_BE.get(buf, off + 20),\n music_crc: Token.UINT8.get(buf, off + 24),\n header_crc: Token.UINT16_BE.get(buf, off + 24)\n };\n }\n};\n","import * as Token from 'token-types';\nimport * as util from '../common/Util.js';\nimport { ExtendedLameHeader } from './ExtendedLameHeader.js';\n/**\n * Info Tag: Xing, LAME\n */\nexport const InfoTagHeaderTag = new Token.StringType(4, 'ascii');\n/**\n * LAME TAG value\n * Did not find any official documentation for this\n * Value e.g.: \"3.98.4\"\n */\nexport const LameEncoderVersion = new Token.StringType(6, 'ascii');\n/**\n * Info Tag\n * Ref: http://gabriel.mp3-tech.org/mp3infotag.html\n */\nexport const XingHeaderFlags = {\n len: 4,\n get: (buf, off) => {\n return {\n frames: util.isBitSet(buf, off, 31),\n bytes: util.isBitSet(buf, off, 30),\n toc: util.isBitSet(buf, off, 29),\n vbrScale: util.isBitSet(buf, off, 28)\n };\n }\n};\n// /**\n// * XING Header Tag\n// * Ref: http://gabriel.mp3-tech.org/mp3infotag.html\n// */\nexport async function readXingHeader(tokenizer) {\n const flags = await tokenizer.readToken(XingHeaderFlags);\n const xingInfoTag = { numFrames: null, streamSize: null, vbrScale: null };\n if (flags.frames) {\n xingInfoTag.numFrames = await tokenizer.readToken(Token.UINT32_BE);\n }\n if (flags.bytes) {\n xingInfoTag.streamSize = await tokenizer.readToken(Token.UINT32_BE);\n }\n if (flags.toc) {\n xingInfoTag.toc = new Uint8Array(100);\n await tokenizer.readBuffer(xingInfoTag.toc);\n }\n if (flags.vbrScale) {\n xingInfoTag.vbrScale = await tokenizer.readToken(Token.UINT32_BE);\n }\n const lameTag = await tokenizer.peekToken(new Token.StringType(4, 'ascii'));\n if (lameTag === 'LAME') {\n await tokenizer.ignore(4);\n xingInfoTag.lame = {\n version: await tokenizer.readToken(new Token.StringType(5, 'ascii'))\n };\n const match = xingInfoTag.lame.version.match(/\\d+.\\d+/g);\n if (match !== null) {\n const majorMinorVersion = match[0]; // e.g. 3.97\n const version = majorMinorVersion.split('.').map(n => Number.parseInt(n, 10));\n if (version[0] >= 3 && version[1] >= 90) {\n xingInfoTag.lame.extended = await tokenizer.readToken(ExtendedLameHeader);\n }\n }\n }\n return xingInfoTag;\n}\n"],"mappings":"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","names":["initDebug"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/MpegParser-6I4WPE7H.js.map"}
+343
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/MusepackParser-PVJGCXWZ.js
··· 1 + import { 2 + AbstractID3Parser 3 + } from "./chunk-WBWWX4CZ.js"; 4 + import "./chunk-QOFAJIKO.js"; 5 + import "./chunk-Z6RWJW2M.js"; 6 + import "./chunk-SGG7NSCF.js"; 7 + import { 8 + FourCcToken, 9 + tryParseApeHeader 10 + } from "./chunk-CSVVW572.js"; 11 + import { 12 + getBitAllignedNumber, 13 + isBitSet 14 + } from "./chunk-6AX6SYMQ.js"; 15 + import "./chunk-FGRUWWG5.js"; 16 + import { 17 + BasicParser, 18 + StringType, 19 + UINT16_LE, 20 + UINT32_LE, 21 + UINT8, 22 + makeUnexpectedFileContentError, 23 + require_src, 24 + textDecode 25 + } from "./chunk-ETGVMC2T.js"; 26 + import { 27 + __name, 28 + __toESM 29 + } from "./chunk-7IARE43G.js"; 30 + 31 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/musepack/MusepackParser.js 32 + var import_debug4 = __toESM(require_src()); 33 + 34 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/musepack/sv8/MpcSv8Parser.js 35 + var import_debug2 = __toESM(require_src()); 36 + 37 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/musepack/sv8/StreamVersion8.js 38 + var import_debug = __toESM(require_src()); 39 + var debug = (0, import_debug.default)("music-metadata:parser:musepack:sv8"); 40 + var PacketKey = new StringType(2, "latin1"); 41 + var SH_part1 = { 42 + len: 5, 43 + get: /* @__PURE__ */ __name((buf, off) => { 44 + return { 45 + crc: UINT32_LE.get(buf, off), 46 + streamVersion: UINT8.get(buf, off + 4) 47 + }; 48 + }, "get") 49 + }; 50 + var SH_part3 = { 51 + len: 2, 52 + get: /* @__PURE__ */ __name((buf, off) => { 53 + return { 54 + sampleFrequency: [44100, 48e3, 37800, 32e3][getBitAllignedNumber(buf, off, 0, 3)], 55 + maxUsedBands: getBitAllignedNumber(buf, off, 3, 5), 56 + channelCount: getBitAllignedNumber(buf, off + 1, 0, 4) + 1, 57 + msUsed: isBitSet(buf, off + 1, 4), 58 + audioBlockFrames: getBitAllignedNumber(buf, off + 1, 5, 3) 59 + }; 60 + }, "get") 61 + }; 62 + var StreamReader = class { 63 + static { 64 + __name(this, "StreamReader"); 65 + } 66 + get tokenizer() { 67 + return this._tokenizer; 68 + } 69 + set tokenizer(value) { 70 + this._tokenizer = value; 71 + } 72 + constructor(_tokenizer) { 73 + this._tokenizer = _tokenizer; 74 + } 75 + async readPacketHeader() { 76 + const key = await this.tokenizer.readToken(PacketKey); 77 + const size = await this.readVariableSizeField(); 78 + return { 79 + key, 80 + payloadLength: size.value - 2 - size.len 81 + }; 82 + } 83 + async readStreamHeader(size) { 84 + const streamHeader = {}; 85 + debug(`Reading SH at offset=${this.tokenizer.position}`); 86 + const part1 = await this.tokenizer.readToken(SH_part1); 87 + size -= SH_part1.len; 88 + Object.assign(streamHeader, part1); 89 + debug(`SH.streamVersion = ${part1.streamVersion}`); 90 + const sampleCount = await this.readVariableSizeField(); 91 + size -= sampleCount.len; 92 + streamHeader.sampleCount = sampleCount.value; 93 + const bs = await this.readVariableSizeField(); 94 + size -= bs.len; 95 + streamHeader.beginningOfSilence = bs.value; 96 + const part3 = await this.tokenizer.readToken(SH_part3); 97 + size -= SH_part3.len; 98 + Object.assign(streamHeader, part3); 99 + await this.tokenizer.ignore(size); 100 + return streamHeader; 101 + } 102 + async readVariableSizeField(len = 1, hb = 0) { 103 + let n = await this.tokenizer.readNumber(UINT8); 104 + if ((n & 128) === 0) { 105 + return { len, value: hb + n }; 106 + } 107 + n &= 127; 108 + n += hb; 109 + return this.readVariableSizeField(len + 1, n << 7); 110 + } 111 + }; 112 + 113 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/musepack/MusepackConentError.js 114 + var MusepackContentError = class extends makeUnexpectedFileContentError("Musepack") { 115 + static { 116 + __name(this, "MusepackContentError"); 117 + } 118 + }; 119 + 120 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/musepack/sv8/MpcSv8Parser.js 121 + var debug2 = (0, import_debug2.default)("music-metadata:parser:musepack"); 122 + var MpcSv8Parser = class extends BasicParser { 123 + static { 124 + __name(this, "MpcSv8Parser"); 125 + } 126 + constructor() { 127 + super(...arguments); 128 + this.audioLength = 0; 129 + } 130 + async parse() { 131 + const signature = await this.tokenizer.readToken(FourCcToken); 132 + if (signature !== "MPCK") 133 + throw new MusepackContentError("Invalid Magic number"); 134 + this.metadata.setFormat("container", "Musepack, SV8"); 135 + return this.parsePacket(); 136 + } 137 + async parsePacket() { 138 + const sv8reader = new StreamReader(this.tokenizer); 139 + do { 140 + const header = await sv8reader.readPacketHeader(); 141 + debug2(`packet-header key=${header.key}, payloadLength=${header.payloadLength}`); 142 + switch (header.key) { 143 + case "SH": { 144 + const sh = await sv8reader.readStreamHeader(header.payloadLength); 145 + this.metadata.setFormat("numberOfSamples", sh.sampleCount); 146 + this.metadata.setFormat("sampleRate", sh.sampleFrequency); 147 + this.metadata.setFormat("duration", sh.sampleCount / sh.sampleFrequency); 148 + this.metadata.setFormat("numberOfChannels", sh.channelCount); 149 + break; 150 + } 151 + case "AP": 152 + this.audioLength += header.payloadLength; 153 + await this.tokenizer.ignore(header.payloadLength); 154 + break; 155 + case "RG": 156 + // Replaygain 157 + case "EI": 158 + // Encoder Info 159 + case "SO": 160 + // Seek Table Offset 161 + case "ST": 162 + // Seek Table 163 + case "CT": 164 + await this.tokenizer.ignore(header.payloadLength); 165 + break; 166 + case "SE": 167 + if (this.metadata.format.duration) { 168 + this.metadata.setFormat("bitrate", this.audioLength * 8 / this.metadata.format.duration); 169 + } 170 + return tryParseApeHeader(this.metadata, this.tokenizer, this.options); 171 + default: 172 + throw new MusepackContentError(`Unexpected header: ${header.key}`); 173 + } 174 + } while (true); 175 + } 176 + }; 177 + 178 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/musepack/sv7/MpcSv7Parser.js 179 + var import_debug3 = __toESM(require_src()); 180 + 181 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/musepack/sv7/BitReader.js 182 + var BitReader = class { 183 + static { 184 + __name(this, "BitReader"); 185 + } 186 + constructor(tokenizer) { 187 + this.pos = 0; 188 + this.dword = null; 189 + this.tokenizer = tokenizer; 190 + } 191 + /** 192 + * 193 + * @param bits 1..30 bits 194 + */ 195 + async read(bits) { 196 + while (this.dword === null) { 197 + this.dword = await this.tokenizer.readToken(UINT32_LE); 198 + } 199 + let out = this.dword; 200 + this.pos += bits; 201 + if (this.pos < 32) { 202 + out >>>= 32 - this.pos; 203 + return out & (1 << bits) - 1; 204 + } 205 + this.pos -= 32; 206 + if (this.pos === 0) { 207 + this.dword = null; 208 + return out & (1 << bits) - 1; 209 + } 210 + this.dword = await this.tokenizer.readToken(UINT32_LE); 211 + if (this.pos) { 212 + out <<= this.pos; 213 + out |= this.dword >>> 32 - this.pos; 214 + } 215 + return out & (1 << bits) - 1; 216 + } 217 + async ignore(bits) { 218 + if (this.pos > 0) { 219 + const remaining = 32 - this.pos; 220 + this.dword = null; 221 + bits -= remaining; 222 + this.pos = 0; 223 + } 224 + const remainder = bits % 32; 225 + const numOfWords = (bits - remainder) / 32; 226 + await this.tokenizer.ignore(numOfWords * 4); 227 + return this.read(remainder); 228 + } 229 + }; 230 + 231 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/musepack/sv7/StreamVersion7.js 232 + var Header = { 233 + len: 6 * 4, 234 + get: /* @__PURE__ */ __name((buf, off) => { 235 + const header = { 236 + // word 0 237 + signature: textDecode(buf.subarray(off, off + 3), "latin1"), 238 + // versionIndex number * 1000 (3.81 = 3810) (remember that 4-byte alignment causes this to take 4-bytes) 239 + streamMinorVersion: getBitAllignedNumber(buf, off + 3, 0, 4), 240 + streamMajorVersion: getBitAllignedNumber(buf, off + 3, 4, 4), 241 + // word 1 242 + frameCount: UINT32_LE.get(buf, off + 4), 243 + // word 2 244 + maxLevel: UINT16_LE.get(buf, off + 8), 245 + sampleFrequency: [44100, 48e3, 37800, 32e3][getBitAllignedNumber(buf, off + 10, 0, 2)], 246 + link: getBitAllignedNumber(buf, off + 10, 2, 2), 247 + profile: getBitAllignedNumber(buf, off + 10, 4, 4), 248 + maxBand: getBitAllignedNumber(buf, off + 11, 0, 6), 249 + intensityStereo: isBitSet(buf, off + 11, 6), 250 + midSideStereo: isBitSet(buf, off + 11, 7), 251 + // word 3 252 + titlePeak: UINT16_LE.get(buf, off + 12), 253 + titleGain: UINT16_LE.get(buf, off + 14), 254 + // word 4 255 + albumPeak: UINT16_LE.get(buf, off + 16), 256 + albumGain: UINT16_LE.get(buf, off + 18), 257 + // word 258 + lastFrameLength: UINT32_LE.get(buf, off + 20) >>> 20 & 2047, 259 + trueGapless: isBitSet(buf, off + 23, 0) 260 + }; 261 + header.lastFrameLength = header.trueGapless ? UINT32_LE.get(buf, 20) >>> 20 & 2047 : 0; 262 + return header; 263 + }, "get") 264 + }; 265 + 266 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/musepack/sv7/MpcSv7Parser.js 267 + var debug3 = (0, import_debug3.default)("music-metadata:parser:musepack"); 268 + var MpcSv7Parser = class extends BasicParser { 269 + static { 270 + __name(this, "MpcSv7Parser"); 271 + } 272 + constructor() { 273 + super(...arguments); 274 + this.bitreader = null; 275 + this.audioLength = 0; 276 + this.duration = null; 277 + } 278 + async parse() { 279 + const header = await this.tokenizer.readToken(Header); 280 + if (header.signature !== "MP+") 281 + throw new MusepackContentError("Unexpected magic number"); 282 + debug3(`stream-version=${header.streamMajorVersion}.${header.streamMinorVersion}`); 283 + this.metadata.setFormat("container", "Musepack, SV7"); 284 + this.metadata.setFormat("sampleRate", header.sampleFrequency); 285 + const numberOfSamples = 1152 * (header.frameCount - 1) + header.lastFrameLength; 286 + this.metadata.setFormat("numberOfSamples", numberOfSamples); 287 + this.duration = numberOfSamples / header.sampleFrequency; 288 + this.metadata.setFormat("duration", this.duration); 289 + this.bitreader = new BitReader(this.tokenizer); 290 + this.metadata.setFormat("numberOfChannels", header.midSideStereo || header.intensityStereo ? 2 : 1); 291 + const version = await this.bitreader.read(8); 292 + this.metadata.setFormat("codec", (version / 100).toFixed(2)); 293 + await this.skipAudioData(header.frameCount); 294 + debug3(`End of audio stream, switching to APEv2, offset=${this.tokenizer.position}`); 295 + return tryParseApeHeader(this.metadata, this.tokenizer, this.options); 296 + } 297 + async skipAudioData(frameCount) { 298 + while (frameCount-- > 0) { 299 + const frameLength = await this.bitreader.read(20); 300 + this.audioLength += 20 + frameLength; 301 + await this.bitreader.ignore(frameLength); 302 + } 303 + const lastFrameLength = await this.bitreader.read(11); 304 + this.audioLength += lastFrameLength; 305 + if (this.duration !== null) { 306 + this.metadata.setFormat("bitrate", this.audioLength / this.duration); 307 + } 308 + } 309 + }; 310 + 311 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/musepack/MusepackParser.js 312 + var debug4 = (0, import_debug4.default)("music-metadata:parser:musepack"); 313 + var MusepackParser = class extends AbstractID3Parser { 314 + static { 315 + __name(this, "MusepackParser"); 316 + } 317 + async postId3v2Parse() { 318 + const signature = await this.tokenizer.peekToken(new StringType(3, "latin1")); 319 + let mpcParser; 320 + switch (signature) { 321 + case "MP+": { 322 + debug4("Stream-version 7"); 323 + mpcParser = new MpcSv7Parser(this.metadata, this.tokenizer, this.options); 324 + break; 325 + } 326 + case "MPC": { 327 + debug4("Stream-version 8"); 328 + mpcParser = new MpcSv8Parser(this.metadata, this.tokenizer, this.options); 329 + break; 330 + } 331 + default: { 332 + throw new MusepackContentError("Invalid signature prefix"); 333 + } 334 + } 335 + this.metadata.setAudioOnly(); 336 + return mpcParser.parse(); 337 + } 338 + }; 339 + export { 340 + MusepackParser 341 + }; 342 + 343 + //# sourceMappingURL=./MusepackParser-PVJGCXWZ.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/MusepackParser-PVJGCXWZ.js.map
··· 1 + {"version":3,"sources":["/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/musepack/MusepackParser.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/musepack/sv8/MpcSv8Parser.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/musepack/sv8/StreamVersion8.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/musepack/MusepackConentError.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/musepack/sv7/MpcSv7Parser.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/musepack/sv7/BitReader.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/musepack/sv7/StreamVersion7.js"],"sourcesContent":["import initDebug from 'debug';\nimport * as Token from 'token-types';\nimport { AbstractID3Parser } from '../id3v2/AbstractID3Parser.js';\nimport { MpcSv8Parser } from './sv8/MpcSv8Parser.js';\nimport { MpcSv7Parser } from './sv7/MpcSv7Parser.js';\nimport { MusepackContentError } from './MusepackConentError.js';\nconst debug = initDebug('music-metadata:parser:musepack');\nexport class MusepackParser extends AbstractID3Parser {\n async postId3v2Parse() {\n const signature = await this.tokenizer.peekToken(new Token.StringType(3, 'latin1'));\n let mpcParser;\n switch (signature) {\n case 'MP+': {\n debug('Stream-version 7');\n mpcParser = new MpcSv7Parser(this.metadata, this.tokenizer, this.options);\n break;\n }\n case 'MPC': {\n debug('Stream-version 8');\n mpcParser = new MpcSv8Parser(this.metadata, this.tokenizer, this.options);\n break;\n }\n default: {\n throw new MusepackContentError('Invalid signature prefix');\n }\n }\n this.metadata.setAudioOnly();\n return mpcParser.parse();\n }\n}\n","import initDebug from 'debug';\nimport { BasicParser } from '../../common/BasicParser.js';\nimport { tryParseApeHeader } from '../../apev2/APEv2Parser.js';\nimport { FourCcToken } from '../../common/FourCC.js';\nimport * as SV8 from './StreamVersion8.js';\nimport { MusepackContentError } from '../MusepackConentError.js';\nconst debug = initDebug('music-metadata:parser:musepack');\nexport class MpcSv8Parser extends BasicParser {\n constructor() {\n super(...arguments);\n this.audioLength = 0;\n }\n async parse() {\n const signature = await this.tokenizer.readToken(FourCcToken);\n if (signature !== 'MPCK')\n throw new MusepackContentError('Invalid Magic number');\n this.metadata.setFormat('container', 'Musepack, SV8');\n return this.parsePacket();\n }\n async parsePacket() {\n const sv8reader = new SV8.StreamReader(this.tokenizer);\n do {\n const header = await sv8reader.readPacketHeader();\n debug(`packet-header key=${header.key}, payloadLength=${header.payloadLength}`);\n switch (header.key) {\n case 'SH': { // Stream Header\n const sh = await sv8reader.readStreamHeader(header.payloadLength);\n this.metadata.setFormat('numberOfSamples', sh.sampleCount);\n this.metadata.setFormat('sampleRate', sh.sampleFrequency);\n this.metadata.setFormat('duration', sh.sampleCount / sh.sampleFrequency);\n this.metadata.setFormat('numberOfChannels', sh.channelCount);\n break;\n }\n case 'AP': // Audio Packet\n this.audioLength += header.payloadLength;\n await this.tokenizer.ignore(header.payloadLength);\n break;\n case 'RG': // Replaygain\n case 'EI': // Encoder Info\n case 'SO': // Seek Table Offset\n case 'ST': // Seek Table\n case 'CT': // Chapter-Tag\n await this.tokenizer.ignore(header.payloadLength);\n break;\n case 'SE': // Stream End\n if (this.metadata.format.duration) {\n this.metadata.setFormat('bitrate', this.audioLength * 8 / this.metadata.format.duration);\n }\n return tryParseApeHeader(this.metadata, this.tokenizer, this.options);\n default:\n throw new MusepackContentError(`Unexpected header: ${header.key}`);\n }\n // biome-ignore lint/correctness/noConstantCondition: break is handled in the switch statement\n } while (true);\n }\n}\n","import * as Token from 'token-types';\nimport initDebug from 'debug';\nimport * as util from '../../common/Util.js';\nconst debug = initDebug('music-metadata:parser:musepack:sv8');\nconst PacketKey = new Token.StringType(2, 'latin1');\n/**\n * Stream Header Packet part 1\n * Ref: http://trac.musepack.net/musepack/wiki/SV8Specification#StreamHeaderPacket\n */\nconst SH_part1 = {\n len: 5,\n get: (buf, off) => {\n return {\n crc: Token.UINT32_LE.get(buf, off),\n streamVersion: Token.UINT8.get(buf, off + 4)\n };\n }\n};\n/**\n * Stream Header Packet part 3\n * Ref: http://trac.musepack.net/musepack/wiki/SV8Specification#StreamHeaderPacket\n */\nconst SH_part3 = {\n len: 2,\n get: (buf, off) => {\n return {\n sampleFrequency: [44100, 48000, 37800, 32000][util.getBitAllignedNumber(buf, off, 0, 3)],\n maxUsedBands: util.getBitAllignedNumber(buf, off, 3, 5),\n channelCount: util.getBitAllignedNumber(buf, off + 1, 0, 4) + 1,\n msUsed: util.isBitSet(buf, off + 1, 4),\n audioBlockFrames: util.getBitAllignedNumber(buf, off + 1, 5, 3)\n };\n }\n};\nexport class StreamReader {\n get tokenizer() {\n return this._tokenizer;\n }\n set tokenizer(value) {\n this._tokenizer = value;\n }\n constructor(_tokenizer) {\n this._tokenizer = _tokenizer;\n }\n async readPacketHeader() {\n const key = await this.tokenizer.readToken(PacketKey);\n const size = await this.readVariableSizeField();\n return {\n key,\n payloadLength: size.value - 2 - size.len\n };\n }\n async readStreamHeader(size) {\n const streamHeader = {};\n debug(`Reading SH at offset=${this.tokenizer.position}`);\n const part1 = await this.tokenizer.readToken(SH_part1);\n size -= SH_part1.len;\n Object.assign(streamHeader, part1);\n debug(`SH.streamVersion = ${part1.streamVersion}`);\n const sampleCount = await this.readVariableSizeField();\n size -= sampleCount.len;\n streamHeader.sampleCount = sampleCount.value;\n const bs = await this.readVariableSizeField();\n size -= bs.len;\n streamHeader.beginningOfSilence = bs.value;\n const part3 = await this.tokenizer.readToken(SH_part3);\n size -= SH_part3.len;\n Object.assign(streamHeader, part3);\n // assert.equal(size, 0);\n await this.tokenizer.ignore(size);\n return streamHeader;\n }\n async readVariableSizeField(len = 1, hb = 0) {\n let n = await this.tokenizer.readNumber(Token.UINT8);\n if ((n & 0x80) === 0) {\n return { len, value: hb + n };\n }\n n &= 0x7F;\n n += hb;\n return this.readVariableSizeField(len + 1, n << 7);\n }\n}\n","import { makeUnexpectedFileContentError } from '../ParseError.js';\nexport class MusepackContentError extends makeUnexpectedFileContentError('Musepack') {\n}\n","import initDebug from 'debug';\nimport { BasicParser } from '../../common/BasicParser.js';\nimport { tryParseApeHeader } from '../../apev2/APEv2Parser.js';\nimport { BitReader } from './BitReader.js';\nimport * as SV7 from './StreamVersion7.js';\nimport { MusepackContentError } from '../MusepackConentError.js';\nconst debug = initDebug('music-metadata:parser:musepack');\nexport class MpcSv7Parser extends BasicParser {\n constructor() {\n super(...arguments);\n this.bitreader = null;\n this.audioLength = 0;\n this.duration = null;\n }\n async parse() {\n const header = await this.tokenizer.readToken(SV7.Header);\n if (header.signature !== 'MP+')\n throw new MusepackContentError('Unexpected magic number');\n debug(`stream-version=${header.streamMajorVersion}.${header.streamMinorVersion}`);\n this.metadata.setFormat('container', 'Musepack, SV7');\n this.metadata.setFormat('sampleRate', header.sampleFrequency);\n const numberOfSamples = 1152 * (header.frameCount - 1) + header.lastFrameLength;\n this.metadata.setFormat('numberOfSamples', numberOfSamples);\n this.duration = numberOfSamples / header.sampleFrequency;\n this.metadata.setFormat('duration', this.duration);\n this.bitreader = new BitReader(this.tokenizer);\n this.metadata.setFormat('numberOfChannels', header.midSideStereo || header.intensityStereo ? 2 : 1);\n const version = await this.bitreader.read(8);\n this.metadata.setFormat('codec', (version / 100).toFixed(2));\n await this.skipAudioData(header.frameCount);\n debug(`End of audio stream, switching to APEv2, offset=${this.tokenizer.position}`);\n return tryParseApeHeader(this.metadata, this.tokenizer, this.options);\n }\n async skipAudioData(frameCount) {\n while (frameCount-- > 0) {\n const frameLength = await this.bitreader.read(20);\n this.audioLength += 20 + frameLength;\n await this.bitreader.ignore(frameLength);\n }\n // last frame\n const lastFrameLength = await this.bitreader.read(11);\n this.audioLength += lastFrameLength;\n if (this.duration !== null) {\n this.metadata.setFormat('bitrate', this.audioLength / this.duration);\n }\n }\n}\n","import * as Token from 'token-types';\nexport class BitReader {\n constructor(tokenizer) {\n this.pos = 0;\n this.dword = null;\n this.tokenizer = tokenizer;\n }\n /**\n *\n * @param bits 1..30 bits\n */\n async read(bits) {\n while (this.dword === null) {\n this.dword = await this.tokenizer.readToken(Token.UINT32_LE);\n }\n let out = this.dword;\n this.pos += bits;\n if (this.pos < 32) {\n out >>>= (32 - this.pos);\n return out & ((1 << bits) - 1);\n }\n this.pos -= 32;\n if (this.pos === 0) {\n this.dword = null;\n return out & ((1 << bits) - 1);\n }\n this.dword = await this.tokenizer.readToken(Token.UINT32_LE);\n if (this.pos) {\n out <<= this.pos;\n out |= this.dword >>> (32 - this.pos);\n }\n return out & ((1 << bits) - 1);\n }\n async ignore(bits) {\n if (this.pos > 0) {\n const remaining = 32 - this.pos;\n this.dword = null;\n bits -= remaining;\n this.pos = 0;\n }\n const remainder = bits % 32;\n const numOfWords = (bits - remainder) / 32;\n await this.tokenizer.ignore(numOfWords * 4);\n return this.read(remainder);\n }\n}\n","import * as Token from 'token-types';\nimport * as util from '../../common/Util.js';\nimport { textDecode } from '@borewit/text-codec';\n/**\n * BASIC STRUCTURE\n */\nexport const Header = {\n len: 6 * 4,\n get: (buf, off) => {\n const header = {\n // word 0\n signature: textDecode(buf.subarray(off, off + 3), 'latin1'),\n // versionIndex number * 1000 (3.81 = 3810) (remember that 4-byte alignment causes this to take 4-bytes)\n streamMinorVersion: util.getBitAllignedNumber(buf, off + 3, 0, 4),\n streamMajorVersion: util.getBitAllignedNumber(buf, off + 3, 4, 4),\n // word 1\n frameCount: Token.UINT32_LE.get(buf, off + 4),\n // word 2\n maxLevel: Token.UINT16_LE.get(buf, off + 8),\n sampleFrequency: [44100, 48000, 37800, 32000][util.getBitAllignedNumber(buf, off + 10, 0, 2)],\n link: util.getBitAllignedNumber(buf, off + 10, 2, 2),\n profile: util.getBitAllignedNumber(buf, off + 10, 4, 4),\n maxBand: util.getBitAllignedNumber(buf, off + 11, 0, 6),\n intensityStereo: util.isBitSet(buf, off + 11, 6),\n midSideStereo: util.isBitSet(buf, off + 11, 7),\n // word 3\n titlePeak: Token.UINT16_LE.get(buf, off + 12),\n titleGain: Token.UINT16_LE.get(buf, off + 14),\n // word 4\n albumPeak: Token.UINT16_LE.get(buf, off + 16),\n albumGain: Token.UINT16_LE.get(buf, off + 18),\n // word\n lastFrameLength: (Token.UINT32_LE.get(buf, off + 20) >>> 20) & 0x7FF,\n trueGapless: util.isBitSet(buf, off + 23, 0)\n };\n header.lastFrameLength = header.trueGapless ? (Token.UINT32_LE.get(buf, 20) >>> 20) & 0x7FF : 0;\n return header;\n }\n};\n"],"mappings":"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","names":["import_debug","import_debug","initDebug","debug","initDebug","import_debug","debug","initDebug","debug","initDebug"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/MusepackParser-PVJGCXWZ.js.map"}
+468
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/OggParser-HOABAP6I.js
··· 1 + import { 2 + BlockHeader, 3 + BlockStreamInfo, 4 + BlockType, 5 + FlacParser, 6 + VorbisPictureToken, 7 + VorbisStream 8 + } from "./chunk-A4RQ3WIY.js"; 9 + import "./chunk-WBWWX4CZ.js"; 10 + import "./chunk-QOFAJIKO.js"; 11 + import "./chunk-Z6RWJW2M.js"; 12 + import "./chunk-SGG7NSCF.js"; 13 + import { 14 + FourCcToken 15 + } from "./chunk-CSVVW572.js"; 16 + import { 17 + getBit, 18 + trimRightNull 19 + } from "./chunk-6AX6SYMQ.js"; 20 + import { 21 + EndOfStreamError 22 + } from "./chunk-FGRUWWG5.js"; 23 + import { 24 + BasicParser, 25 + INT32_LE, 26 + StringType, 27 + UINT16_BE, 28 + UINT16_LE, 29 + UINT24_BE, 30 + UINT32_LE, 31 + UINT64_LE, 32 + UINT8, 33 + Uint8ArrayType, 34 + makeUnexpectedFileContentError, 35 + require_src 36 + } from "./chunk-ETGVMC2T.js"; 37 + import { 38 + __name, 39 + __toESM 40 + } from "./chunk-7IARE43G.js"; 41 + 42 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/OggParser.js 43 + var import_debug4 = __toESM(require_src()); 44 + 45 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/opus/Opus.js 46 + var OpusContentError = class extends makeUnexpectedFileContentError("Opus") { 47 + static { 48 + __name(this, "OpusContentError"); 49 + } 50 + }; 51 + var IdHeader = class { 52 + static { 53 + __name(this, "IdHeader"); 54 + } 55 + constructor(len) { 56 + if (len < 19) { 57 + throw new OpusContentError("ID-header-page 0 should be at least 19 bytes long"); 58 + } 59 + this.len = len; 60 + } 61 + get(buf, off) { 62 + return { 63 + magicSignature: new StringType(8, "ascii").get(buf, off + 0), 64 + version: UINT8.get(buf, off + 8), 65 + channelCount: UINT8.get(buf, off + 9), 66 + preSkip: UINT16_LE.get(buf, off + 10), 67 + inputSampleRate: UINT32_LE.get(buf, off + 12), 68 + outputGain: UINT16_LE.get(buf, off + 16), 69 + channelMapping: UINT8.get(buf, off + 18) 70 + }; 71 + } 72 + }; 73 + 74 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/opus/OpusStream.js 75 + var OpusStream = class extends VorbisStream { 76 + static { 77 + __name(this, "OpusStream"); 78 + } 79 + constructor(metadata, options, tokenizer) { 80 + super(metadata, options); 81 + this.idHeader = null; 82 + this.lastPos = -1; 83 + this.tokenizer = tokenizer; 84 + this.durationOnLastPage = true; 85 + } 86 + /** 87 + * Parse first Opus Ogg page 88 + * @param {IPageHeader} header 89 + * @param {Uint8Array} pageData 90 + */ 91 + parseFirstPage(_header, pageData) { 92 + this.metadata.setFormat("codec", "Opus"); 93 + this.idHeader = new IdHeader(pageData.length).get(pageData, 0); 94 + if (this.idHeader.magicSignature !== "OpusHead") 95 + throw new OpusContentError("Illegal ogg/Opus magic-signature"); 96 + this.metadata.setFormat("sampleRate", this.idHeader.inputSampleRate); 97 + this.metadata.setFormat("numberOfChannels", this.idHeader.channelCount); 98 + this.metadata.setAudioOnly(); 99 + } 100 + async parseFullPage(pageData) { 101 + const magicSignature = new StringType(8, "ascii").get(pageData, 0); 102 + switch (magicSignature) { 103 + case "OpusTags": 104 + await this.parseUserCommentList(pageData, 8); 105 + this.lastPos = this.tokenizer.position - pageData.length; 106 + break; 107 + default: 108 + break; 109 + } 110 + } 111 + calculateDuration(enfOfStream) { 112 + if (this.lastPageHeader && (enfOfStream || this.lastPageHeader.headerType.lastPage) && this.metadata.format.sampleRate && this.lastPageHeader.absoluteGranulePosition >= 0) { 113 + const pos_48bit = this.lastPageHeader.absoluteGranulePosition - this.idHeader.preSkip; 114 + this.metadata.setFormat("numberOfSamples", pos_48bit); 115 + this.metadata.setFormat("duration", pos_48bit / 48e3); 116 + if (this.lastPos !== -1 && this.tokenizer.fileInfo.size && this.metadata.format.duration) { 117 + const dataSize = this.tokenizer.fileInfo.size - this.lastPos; 118 + this.metadata.setFormat("bitrate", 8 * dataSize / this.metadata.format.duration); 119 + } 120 + } 121 + } 122 + }; 123 + 124 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/speex/SpeexStream.js 125 + var import_debug = __toESM(require_src()); 126 + 127 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/speex/Speex.js 128 + var Header = { 129 + len: 80, 130 + get: /* @__PURE__ */ __name((buf, off) => { 131 + return { 132 + speex: new StringType(8, "ascii").get(buf, off + 0), 133 + version: trimRightNull(new StringType(20, "ascii").get(buf, off + 8)), 134 + version_id: INT32_LE.get(buf, off + 28), 135 + header_size: INT32_LE.get(buf, off + 32), 136 + rate: INT32_LE.get(buf, off + 36), 137 + mode: INT32_LE.get(buf, off + 40), 138 + mode_bitstream_version: INT32_LE.get(buf, off + 44), 139 + nb_channels: INT32_LE.get(buf, off + 48), 140 + bitrate: INT32_LE.get(buf, off + 52), 141 + frame_size: INT32_LE.get(buf, off + 56), 142 + vbr: INT32_LE.get(buf, off + 60), 143 + frames_per_packet: INT32_LE.get(buf, off + 64), 144 + extra_headers: INT32_LE.get(buf, off + 68), 145 + reserved1: INT32_LE.get(buf, off + 72), 146 + reserved2: INT32_LE.get(buf, off + 76) 147 + }; 148 + }, "get") 149 + }; 150 + 151 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/speex/SpeexStream.js 152 + var debug = (0, import_debug.default)("music-metadata:parser:ogg:speex"); 153 + var SpeexStream = class extends VorbisStream { 154 + static { 155 + __name(this, "SpeexStream"); 156 + } 157 + constructor(metadata, options, _tokenizer) { 158 + super(metadata, options); 159 + } 160 + /** 161 + * Parse first Speex Ogg page 162 + * @param {IPageHeader} header 163 + * @param {Uint8Array} pageData 164 + */ 165 + parseFirstPage(_header, pageData) { 166 + debug("First Ogg/Speex page"); 167 + const speexHeader = Header.get(pageData, 0); 168 + this.metadata.setFormat("codec", `Speex ${speexHeader.version}`); 169 + this.metadata.setFormat("numberOfChannels", speexHeader.nb_channels); 170 + this.metadata.setFormat("sampleRate", speexHeader.rate); 171 + if (speexHeader.bitrate !== -1) { 172 + this.metadata.setFormat("bitrate", speexHeader.bitrate); 173 + } 174 + this.metadata.setAudioOnly(); 175 + } 176 + }; 177 + 178 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/theora/TheoraStream.js 179 + var import_debug2 = __toESM(require_src()); 180 + 181 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/theora/Theora.js 182 + var IdentificationHeader = { 183 + len: 42, 184 + get: /* @__PURE__ */ __name((buf, off) => { 185 + return { 186 + id: new StringType(7, "ascii").get(buf, off), 187 + vmaj: UINT8.get(buf, off + 7), 188 + vmin: UINT8.get(buf, off + 8), 189 + vrev: UINT8.get(buf, off + 9), 190 + vmbw: UINT16_BE.get(buf, off + 10), 191 + vmbh: UINT16_BE.get(buf, off + 17), 192 + nombr: UINT24_BE.get(buf, off + 37), 193 + nqual: UINT8.get(buf, off + 40) 194 + }; 195 + }, "get") 196 + }; 197 + 198 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/theora/TheoraStream.js 199 + var debug2 = (0, import_debug2.default)("music-metadata:parser:ogg:theora"); 200 + var TheoraStream = class { 201 + static { 202 + __name(this, "TheoraStream"); 203 + } 204 + constructor(metadata, _options, _tokenizer) { 205 + this.durationOnLastPage = false; 206 + this.metadata = metadata; 207 + } 208 + /** 209 + * Vorbis 1 parser 210 + * @param header Ogg Page Header 211 + * @param pageData Page data 212 + */ 213 + async parsePage(header, pageData) { 214 + if (header.headerType.firstPage) { 215 + await this.parseFirstPage(header, pageData); 216 + } 217 + } 218 + calculateDuration() { 219 + debug2("duration calculation not implemented"); 220 + } 221 + /** 222 + * Parse first Theora Ogg page. the initial identification header packet 223 + */ 224 + async parseFirstPage(_header, pageData) { 225 + debug2("First Ogg/Theora page"); 226 + this.metadata.setFormat("codec", "Theora"); 227 + const idHeader = IdentificationHeader.get(pageData, 0); 228 + this.metadata.setFormat("bitrate", idHeader.nombr); 229 + this.metadata.setFormat("hasVideo", true); 230 + } 231 + flush() { 232 + return Promise.resolve(); 233 + } 234 + }; 235 + 236 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/OggToken.js 237 + var PageHeader = { 238 + len: 27, 239 + get: /* @__PURE__ */ __name((buf, off) => { 240 + return { 241 + capturePattern: new StringType(4, "latin1").get(buf, off), 242 + version: UINT8.get(buf, off + 4), 243 + headerType: { 244 + continued: getBit(buf, off + 5, 0), 245 + firstPage: getBit(buf, off + 5, 1), 246 + lastPage: getBit(buf, off + 5, 2) 247 + }, 248 + // packet_flag: Token.UINT8.get(buf, off + 5), 249 + absoluteGranulePosition: Number(UINT64_LE.get(buf, off + 6)), 250 + streamSerialNumber: UINT32_LE.get(buf, off + 14), 251 + pageSequenceNo: UINT32_LE.get(buf, off + 18), 252 + pageChecksum: UINT32_LE.get(buf, off + 22), 253 + page_segments: UINT8.get(buf, off + 26) 254 + }; 255 + }, "get") 256 + }; 257 + var SegmentTable = class _SegmentTable { 258 + static { 259 + __name(this, "SegmentTable"); 260 + } 261 + static sum(buf, off, len) { 262 + const dv = new DataView(buf.buffer, 0); 263 + let s = 0; 264 + for (let i = off; i < off + len; ++i) { 265 + s += dv.getUint8(i); 266 + } 267 + return s; 268 + } 269 + constructor(header) { 270 + this.len = header.page_segments; 271 + } 272 + get(buf, off) { 273 + return { 274 + totalPageSize: _SegmentTable.sum(buf, off, this.len) 275 + }; 276 + } 277 + }; 278 + 279 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/flac/FlacStream.js 280 + var import_debug3 = __toESM(require_src()); 281 + var debug3 = (0, import_debug3.default)("music-metadata:parser:ogg:theora"); 282 + var FlacStream = class { 283 + static { 284 + __name(this, "FlacStream"); 285 + } 286 + constructor(metadata, options, tokenizer) { 287 + this.durationOnLastPage = false; 288 + this.metadata = metadata; 289 + this.options = options; 290 + this.tokenizer = tokenizer; 291 + this.flacParser = new FlacParser(this.metadata, this.tokenizer, options); 292 + } 293 + /** 294 + * Vorbis 1 parser 295 + * @param header Ogg Page Header 296 + * @param pageData Page data 297 + */ 298 + async parsePage(header, pageData) { 299 + if (header.headerType.firstPage) { 300 + await this.parseFirstPage(header, pageData); 301 + } 302 + } 303 + calculateDuration() { 304 + debug3("duration calculation not implemented"); 305 + } 306 + /** 307 + * Parse first Theora Ogg page. the initial identification header packet 308 + */ 309 + async parseFirstPage(_header, pageData) { 310 + debug3("First Ogg/FLAC page"); 311 + const fourCC = await FourCcToken.get(pageData, 9); 312 + if (fourCC.toString() !== "fLaC") { 313 + throw new Error("Invalid FLAC preamble"); 314 + } 315 + const blockHeader = await BlockHeader.get(pageData, 13); 316 + await this.parseDataBlock(blockHeader, pageData.subarray(13 + BlockHeader.len)); 317 + } 318 + async parseDataBlock(blockHeader, pageData) { 319 + debug3(`blockHeader type=${blockHeader.type}, length=${blockHeader.length}`); 320 + switch (blockHeader.type) { 321 + case BlockType.STREAMINFO: { 322 + const streamInfo = BlockStreamInfo.get(pageData, 0); 323 + return this.flacParser.processsStreamInfo(streamInfo); 324 + } 325 + case BlockType.PADDING: 326 + break; 327 + case BlockType.APPLICATION: 328 + break; 329 + case BlockType.SEEKTABLE: 330 + break; 331 + case BlockType.VORBIS_COMMENT: 332 + return this.flacParser.parseComment(pageData); 333 + case BlockType.PICTURE: 334 + if (!this.options.skipCovers) { 335 + const picture = new VorbisPictureToken(pageData.length).get(pageData, 0); 336 + return this.flacParser.addPictureTag(picture); 337 + } 338 + break; 339 + default: 340 + this.metadata.addWarning(`Unknown block type: ${blockHeader.type}`); 341 + } 342 + return this.tokenizer.ignore(blockHeader.length).then(); 343 + } 344 + flush() { 345 + return Promise.resolve(); 346 + } 347 + }; 348 + 349 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/OggParser.js 350 + var OggContentError = class extends makeUnexpectedFileContentError("Ogg") { 351 + static { 352 + __name(this, "OggContentError"); 353 + } 354 + }; 355 + var debug4 = (0, import_debug4.default)("music-metadata:parser:ogg"); 356 + var OggStream = class { 357 + static { 358 + __name(this, "OggStream"); 359 + } 360 + constructor(metadata, streamSerial, options) { 361 + this.pageNumber = 0; 362 + this.closed = false; 363 + this.metadata = metadata; 364 + this.streamSerial = streamSerial; 365 + this.options = options; 366 + } 367 + async parsePage(tokenizer, header) { 368 + this.pageNumber = header.pageSequenceNo; 369 + debug4("serial=%s page#=%s, Ogg.id=%s", header.streamSerialNumber, header.pageSequenceNo, header.capturePattern); 370 + const segmentTable = await tokenizer.readToken(new SegmentTable(header)); 371 + debug4("totalPageSize=%s", segmentTable.totalPageSize); 372 + const pageData = await tokenizer.readToken(new Uint8ArrayType(segmentTable.totalPageSize)); 373 + debug4("firstPage=%s, lastPage=%s, continued=%s", header.headerType.firstPage, header.headerType.lastPage, header.headerType.continued); 374 + if (header.headerType.firstPage) { 375 + this.metadata.setFormat("container", "Ogg"); 376 + const idData = pageData.subarray(0, 7); 377 + const asciiId = Array.from(idData).filter((b) => b >= 32 && b <= 126).map((b) => String.fromCharCode(b)).join(""); 378 + switch (asciiId) { 379 + case "vorbis": 380 + debug4(`Set Ogg stream serial ${header.streamSerialNumber}, codec=Vorbis`); 381 + this.pageConsumer = new VorbisStream(this.metadata, this.options); 382 + break; 383 + case "OpusHea": 384 + debug4("Set page consumer to Ogg/Opus"); 385 + this.pageConsumer = new OpusStream(this.metadata, this.options, tokenizer); 386 + break; 387 + case "Speex ": 388 + debug4("Set page consumer to Ogg/Speex"); 389 + this.pageConsumer = new SpeexStream(this.metadata, this.options, tokenizer); 390 + break; 391 + case "fishead": 392 + case "theora": 393 + debug4("Set page consumer to Ogg/Theora"); 394 + this.pageConsumer = new TheoraStream(this.metadata, this.options, tokenizer); 395 + break; 396 + case "FLAC": 397 + debug4("Set page consumer to Vorbis"); 398 + this.pageConsumer = new FlacStream(this.metadata, this.options, tokenizer); 399 + break; 400 + default: 401 + throw new OggContentError(`Ogg codec not recognized (id=${asciiId}`); 402 + } 403 + } 404 + if (header.headerType.lastPage) { 405 + this.closed = true; 406 + } 407 + if (this.pageConsumer) { 408 + await this.pageConsumer.parsePage(header, pageData); 409 + } else 410 + throw new Error("pageConsumer should be initialized"); 411 + } 412 + }; 413 + var OggParser = class extends BasicParser { 414 + static { 415 + __name(this, "OggParser"); 416 + } 417 + constructor() { 418 + super(...arguments); 419 + this.streams = /* @__PURE__ */ new Map(); 420 + } 421 + /** 422 + * Parse page 423 + * @returns {Promise<void>} 424 + */ 425 + async parse() { 426 + this.streams = /* @__PURE__ */ new Map(); 427 + let enfOfStream = false; 428 + let header; 429 + try { 430 + do { 431 + header = await this.tokenizer.readToken(PageHeader); 432 + if (header.capturePattern !== "OggS") 433 + throw new OggContentError("Invalid Ogg capture pattern"); 434 + let stream = this.streams.get(header.streamSerialNumber); 435 + if (!stream) { 436 + stream = new OggStream(this.metadata, header.streamSerialNumber, this.options); 437 + this.streams.set(header.streamSerialNumber, stream); 438 + } 439 + await stream.parsePage(this.tokenizer, header); 440 + if (stream.pageNumber > 12 && !(this.options.duration && [...this.streams.values()].find((stream2) => stream2.pageConsumer?.durationOnLastPage))) { 441 + debug4("Stop processing Ogg stream"); 442 + break; 443 + } 444 + } while (![...this.streams.values()].every((item) => item.closed)); 445 + } catch (err) { 446 + if (err instanceof EndOfStreamError) { 447 + debug4("Reached end-of-stream"); 448 + enfOfStream = true; 449 + } else if (err instanceof OggContentError) { 450 + this.metadata.addWarning(`Corrupt Ogg content at ${this.tokenizer.position}`); 451 + } else 452 + throw err; 453 + } 454 + for (const stream of this.streams.values()) { 455 + if (!stream.closed) { 456 + this.metadata.addWarning(`End-of-stream reached before reaching last page in Ogg stream serial=${stream.streamSerial}`); 457 + await stream.pageConsumer?.flush(); 458 + } 459 + stream.pageConsumer?.calculateDuration(enfOfStream); 460 + } 461 + } 462 + }; 463 + export { 464 + OggContentError, 465 + OggParser 466 + }; 467 + 468 + //# sourceMappingURL=./OggParser-HOABAP6I.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/OggParser-HOABAP6I.js.map
··· 1 + {"version":3,"sources":["/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/OggParser.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/opus/Opus.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/opus/OpusStream.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/speex/SpeexStream.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/speex/Speex.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/theora/TheoraStream.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/theora/Theora.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/OggToken.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/flac/FlacStream.js"],"sourcesContent":["import * as Token from 'token-types';\nimport { EndOfStreamError } from 'strtok3';\nimport initDebug from 'debug';\nimport { BasicParser } from '../common/BasicParser.js';\nimport { VorbisStream } from './vorbis/VorbisStream.js';\nimport { OpusStream } from './opus/OpusStream.js';\nimport { SpeexStream } from './speex/SpeexStream.js';\nimport { TheoraStream } from './theora/TheoraStream.js';\nimport { makeUnexpectedFileContentError } from '../ParseError.js';\nimport { PageHeader, SegmentTable } from './OggToken.js';\nimport { FlacStream } from './flac/FlacStream.js';\nexport class OggContentError extends makeUnexpectedFileContentError('Ogg') {\n}\nconst debug = initDebug('music-metadata:parser:ogg');\nclass OggStream {\n constructor(metadata, streamSerial, options) {\n this.pageNumber = 0;\n this.closed = false;\n this.metadata = metadata;\n this.streamSerial = streamSerial;\n this.options = options;\n }\n async parsePage(tokenizer, header) {\n this.pageNumber = header.pageSequenceNo;\n debug('serial=%s page#=%s, Ogg.id=%s', header.streamSerialNumber, header.pageSequenceNo, header.capturePattern);\n const segmentTable = await tokenizer.readToken(new SegmentTable(header));\n debug('totalPageSize=%s', segmentTable.totalPageSize);\n const pageData = await tokenizer.readToken(new Token.Uint8ArrayType(segmentTable.totalPageSize));\n debug('firstPage=%s, lastPage=%s, continued=%s', header.headerType.firstPage, header.headerType.lastPage, header.headerType.continued);\n if (header.headerType.firstPage) {\n this.metadata.setFormat('container', 'Ogg');\n const idData = pageData.subarray(0, 7); // Copy this portion\n const asciiId = Array.from(idData)\n .filter(b => b >= 32 && b <= 126) // Keep only printable ASCII\n .map(b => String.fromCharCode(b))\n .join('');\n switch (asciiId) {\n case 'vorbis': // Ogg/Vorbis\n debug(`Set Ogg stream serial ${header.streamSerialNumber}, codec=Vorbis`);\n this.pageConsumer = new VorbisStream(this.metadata, this.options);\n break;\n case 'OpusHea': // Ogg/Opus\n debug('Set page consumer to Ogg/Opus');\n this.pageConsumer = new OpusStream(this.metadata, this.options, tokenizer);\n break;\n case 'Speex ': // Ogg/Speex\n debug('Set page consumer to Ogg/Speex');\n this.pageConsumer = new SpeexStream(this.metadata, this.options, tokenizer);\n break;\n case 'fishead':\n case 'theora': // Ogg/Theora\n debug('Set page consumer to Ogg/Theora');\n this.pageConsumer = new TheoraStream(this.metadata, this.options, tokenizer);\n break;\n case 'FLAC': // Ogg/Theora\n debug('Set page consumer to Vorbis');\n this.pageConsumer = new FlacStream(this.metadata, this.options, tokenizer);\n break;\n default:\n throw new OggContentError(`Ogg codec not recognized (id=${asciiId}`);\n }\n }\n if (header.headerType.lastPage) {\n this.closed = true;\n }\n if (this.pageConsumer) {\n await this.pageConsumer.parsePage(header, pageData);\n }\n else\n throw new Error('pageConsumer should be initialized');\n }\n}\n/**\n * Parser for Ogg logical bitstream framing\n */\nexport class OggParser extends BasicParser {\n constructor() {\n super(...arguments);\n this.streams = new Map();\n }\n /**\n * Parse page\n * @returns {Promise<void>}\n */\n async parse() {\n this.streams = new Map();\n let enfOfStream = false;\n let header;\n try {\n do {\n header = await this.tokenizer.readToken(PageHeader);\n if (header.capturePattern !== 'OggS')\n throw new OggContentError('Invalid Ogg capture pattern');\n let stream = this.streams.get(header.streamSerialNumber);\n if (!stream) {\n stream = new OggStream(this.metadata, header.streamSerialNumber, this.options);\n this.streams.set(header.streamSerialNumber, stream);\n }\n await stream.parsePage(this.tokenizer, header);\n if (stream.pageNumber > 12 && !(this.options.duration && [...this.streams.values()].find(stream => stream.pageConsumer?.durationOnLastPage))) {\n debug(\"Stop processing Ogg stream\");\n break;\n }\n } while (![...this.streams.values()].every(item => item.closed));\n }\n catch (err) {\n if (err instanceof EndOfStreamError) {\n debug(\"Reached end-of-stream\");\n enfOfStream = true;\n }\n else if (err instanceof OggContentError) {\n this.metadata.addWarning(`Corrupt Ogg content at ${this.tokenizer.position}`);\n }\n else\n throw err;\n }\n for (const stream of this.streams.values()) {\n if (!stream.closed) {\n this.metadata.addWarning(`End-of-stream reached before reaching last page in Ogg stream serial=${stream.streamSerial}`);\n await stream.pageConsumer?.flush();\n }\n stream.pageConsumer?.calculateDuration(enfOfStream);\n }\n }\n}\n","import * as Token from 'token-types';\nimport { makeUnexpectedFileContentError } from '../../ParseError.js';\nexport class OpusContentError extends makeUnexpectedFileContentError('Opus') {\n}\n/**\n * Opus ID Header parser\n * Ref: https://wiki.xiph.org/OggOpus#ID_Header\n */\nexport class IdHeader {\n constructor(len) {\n if (len < 19) {\n throw new OpusContentError('ID-header-page 0 should be at least 19 bytes long');\n }\n this.len = len;\n }\n get(buf, off) {\n return {\n magicSignature: new Token.StringType(8, 'ascii').get(buf, off + 0),\n version: Token.UINT8.get(buf, off + 8),\n channelCount: Token.UINT8.get(buf, off + 9),\n preSkip: Token.UINT16_LE.get(buf, off + 10),\n inputSampleRate: Token.UINT32_LE.get(buf, off + 12),\n outputGain: Token.UINT16_LE.get(buf, off + 16),\n channelMapping: Token.UINT8.get(buf, off + 18)\n };\n }\n}\n","import * as Token from 'token-types';\nimport { VorbisStream } from '../vorbis/VorbisStream.js';\nimport * as Opus from './Opus.js';\nimport { OpusContentError } from './Opus.js';\n/**\n * Opus parser\n * Internet Engineering Task Force (IETF) - RFC 6716\n * Used by OggStream\n */\nexport class OpusStream extends VorbisStream {\n constructor(metadata, options, tokenizer) {\n super(metadata, options);\n this.idHeader = null;\n this.lastPos = -1;\n this.tokenizer = tokenizer;\n this.durationOnLastPage = true;\n }\n /**\n * Parse first Opus Ogg page\n * @param {IPageHeader} header\n * @param {Uint8Array} pageData\n */\n parseFirstPage(_header, pageData) {\n this.metadata.setFormat('codec', 'Opus');\n // Parse Opus ID Header\n this.idHeader = new Opus.IdHeader(pageData.length).get(pageData, 0);\n if (this.idHeader.magicSignature !== \"OpusHead\")\n throw new OpusContentError(\"Illegal ogg/Opus magic-signature\");\n this.metadata.setFormat('sampleRate', this.idHeader.inputSampleRate);\n this.metadata.setFormat('numberOfChannels', this.idHeader.channelCount);\n this.metadata.setAudioOnly();\n }\n async parseFullPage(pageData) {\n const magicSignature = new Token.StringType(8, 'ascii').get(pageData, 0);\n switch (magicSignature) {\n case 'OpusTags':\n await this.parseUserCommentList(pageData, 8);\n this.lastPos = this.tokenizer.position - pageData.length;\n break;\n default:\n break;\n }\n }\n calculateDuration(enfOfStream) {\n if (this.lastPageHeader && (enfOfStream || this.lastPageHeader.headerType.lastPage) && this.metadata.format.sampleRate && this.lastPageHeader.absoluteGranulePosition >= 0) {\n // Calculate duration\n const pos_48bit = this.lastPageHeader.absoluteGranulePosition - this.idHeader.preSkip;\n this.metadata.setFormat('numberOfSamples', pos_48bit);\n this.metadata.setFormat('duration', pos_48bit / 48000);\n if (this.lastPos !== -1 && this.tokenizer.fileInfo.size && this.metadata.format.duration) {\n const dataSize = this.tokenizer.fileInfo.size - this.lastPos;\n this.metadata.setFormat('bitrate', 8 * dataSize / this.metadata.format.duration);\n }\n }\n }\n}\n","import initDebug from 'debug';\nimport { VorbisStream } from '../vorbis/VorbisStream.js';\nimport * as Speex from './Speex.js';\nconst debug = initDebug('music-metadata:parser:ogg:speex');\n/**\n * Speex, RFC 5574\n * Ref:\n * - https://www.speex.org/docs/manual/speex-manual/\n * - https://tools.ietf.org/html/rfc5574\n */\nexport class SpeexStream extends VorbisStream {\n constructor(metadata, options, _tokenizer) {\n super(metadata, options);\n }\n /**\n * Parse first Speex Ogg page\n * @param {IPageHeader} header\n * @param {Uint8Array} pageData\n */\n parseFirstPage(_header, pageData) {\n debug('First Ogg/Speex page');\n const speexHeader = Speex.Header.get(pageData, 0);\n this.metadata.setFormat('codec', `Speex ${speexHeader.version}`);\n this.metadata.setFormat('numberOfChannels', speexHeader.nb_channels);\n this.metadata.setFormat('sampleRate', speexHeader.rate);\n if (speexHeader.bitrate !== -1) {\n this.metadata.setFormat('bitrate', speexHeader.bitrate);\n }\n this.metadata.setAudioOnly();\n }\n}\n","import * as Token from 'token-types';\nimport * as util from '../../common/Util.js';\n/**\n * Speex Header Packet\n * Ref: https://www.speex.org/docs/manual/speex-manual/node8.html#SECTION00830000000000000000\n */\nexport const Header = {\n len: 80,\n get: (buf, off) => {\n return {\n speex: new Token.StringType(8, 'ascii').get(buf, off + 0),\n version: util.trimRightNull(new Token.StringType(20, 'ascii').get(buf, off + 8)),\n version_id: Token.INT32_LE.get(buf, off + 28),\n header_size: Token.INT32_LE.get(buf, off + 32),\n rate: Token.INT32_LE.get(buf, off + 36),\n mode: Token.INT32_LE.get(buf, off + 40),\n mode_bitstream_version: Token.INT32_LE.get(buf, off + 44),\n nb_channels: Token.INT32_LE.get(buf, off + 48),\n bitrate: Token.INT32_LE.get(buf, off + 52),\n frame_size: Token.INT32_LE.get(buf, off + 56),\n vbr: Token.INT32_LE.get(buf, off + 60),\n frames_per_packet: Token.INT32_LE.get(buf, off + 64),\n extra_headers: Token.INT32_LE.get(buf, off + 68),\n reserved1: Token.INT32_LE.get(buf, off + 72),\n reserved2: Token.INT32_LE.get(buf, off + 76)\n };\n }\n};\n","import initDebug from 'debug';\nimport { IdentificationHeader } from './Theora.js';\nconst debug = initDebug('music-metadata:parser:ogg:theora');\n/**\n * Ref:\n * - https://theora.org/doc/Theora.pdf\n */\nexport class TheoraStream {\n constructor(metadata, _options, _tokenizer) {\n this.durationOnLastPage = false;\n this.metadata = metadata;\n }\n /**\n * Vorbis 1 parser\n * @param header Ogg Page Header\n * @param pageData Page data\n */\n async parsePage(header, pageData) {\n if (header.headerType.firstPage) {\n await this.parseFirstPage(header, pageData);\n }\n }\n calculateDuration() {\n debug('duration calculation not implemented');\n }\n /**\n * Parse first Theora Ogg page. the initial identification header packet\n */\n async parseFirstPage(_header, pageData) {\n debug('First Ogg/Theora page');\n this.metadata.setFormat('codec', 'Theora');\n const idHeader = IdentificationHeader.get(pageData, 0);\n this.metadata.setFormat('bitrate', idHeader.nombr);\n this.metadata.setFormat('hasVideo', true);\n }\n flush() {\n return Promise.resolve();\n }\n}\n","import * as Token from 'token-types';\n/**\n * 6.2 Identification Header\n * Ref: https://theora.org/doc/Theora.pdf: 6.2 Identification Header Decode\n */\nexport const IdentificationHeader = {\n len: 42,\n get: (buf, off) => {\n return {\n id: new Token.StringType(7, 'ascii').get(buf, off),\n vmaj: Token.UINT8.get(buf, off + 7),\n vmin: Token.UINT8.get(buf, off + 8),\n vrev: Token.UINT8.get(buf, off + 9),\n vmbw: Token.UINT16_BE.get(buf, off + 10),\n vmbh: Token.UINT16_BE.get(buf, off + 17),\n nombr: Token.UINT24_BE.get(buf, off + 37),\n nqual: Token.UINT8.get(buf, off + 40)\n };\n }\n};\n","import * as Token from 'token-types';\nimport * as util from '../common/Util.js';\nimport { StringType } from 'token-types';\nexport const PageHeader = {\n len: 27,\n get: (buf, off) => {\n return {\n capturePattern: new StringType(4, 'latin1').get(buf, off),\n version: Token.UINT8.get(buf, off + 4),\n headerType: {\n continued: util.getBit(buf, off + 5, 0),\n firstPage: util.getBit(buf, off + 5, 1),\n lastPage: util.getBit(buf, off + 5, 2)\n },\n // packet_flag: Token.UINT8.get(buf, off + 5),\n absoluteGranulePosition: Number(Token.UINT64_LE.get(buf, off + 6)),\n streamSerialNumber: Token.UINT32_LE.get(buf, off + 14),\n pageSequenceNo: Token.UINT32_LE.get(buf, off + 18),\n pageChecksum: Token.UINT32_LE.get(buf, off + 22),\n page_segments: Token.UINT8.get(buf, off + 26)\n };\n }\n};\nexport class SegmentTable {\n static sum(buf, off, len) {\n const dv = new DataView(buf.buffer, 0);\n let s = 0;\n for (let i = off; i < off + len; ++i) {\n s += dv.getUint8(i);\n }\n return s;\n }\n constructor(header) {\n this.len = header.page_segments;\n }\n get(buf, off) {\n return {\n totalPageSize: SegmentTable.sum(buf, off, this.len)\n };\n }\n}\n","import initDebug from 'debug';\nimport * as Flac from '../../flac/FlacToken.js';\nimport { FlacParser } from '../../flac/FlacParser.js';\nimport { FourCcToken } from '../../common/FourCC.js';\nimport { VorbisPictureToken } from '../vorbis/Vorbis.js';\nconst debug = initDebug('music-metadata:parser:ogg:theora');\n/**\n * Ref:\n * - https://xiph.org/flac/ogg_mapping.html\n */\nexport class FlacStream {\n constructor(metadata, options, tokenizer) {\n this.durationOnLastPage = false;\n this.metadata = metadata;\n this.options = options;\n this.tokenizer = tokenizer;\n this.flacParser = new FlacParser(this.metadata, this.tokenizer, options);\n }\n /**\n * Vorbis 1 parser\n * @param header Ogg Page Header\n * @param pageData Page data\n */\n async parsePage(header, pageData) {\n if (header.headerType.firstPage) {\n await this.parseFirstPage(header, pageData);\n }\n }\n calculateDuration() {\n debug('duration calculation not implemented');\n }\n /**\n * Parse first Theora Ogg page. the initial identification header packet\n */\n async parseFirstPage(_header, pageData) {\n debug('First Ogg/FLAC page');\n const fourCC = await FourCcToken.get(pageData, 9);\n if (fourCC.toString() !== 'fLaC') {\n throw new Error('Invalid FLAC preamble');\n }\n const blockHeader = await Flac.BlockHeader.get(pageData, 13);\n await this.parseDataBlock(blockHeader, pageData.subarray(13 + Flac.BlockHeader.len));\n }\n async parseDataBlock(blockHeader, pageData) {\n debug(`blockHeader type=${blockHeader.type}, length=${blockHeader.length}`);\n switch (blockHeader.type) {\n case Flac.BlockType.STREAMINFO: {\n const streamInfo = Flac.BlockStreamInfo.get(pageData, 0);\n return this.flacParser.processsStreamInfo(streamInfo);\n }\n case Flac.BlockType.PADDING:\n break;\n case Flac.BlockType.APPLICATION:\n break;\n case Flac.BlockType.SEEKTABLE:\n break;\n case Flac.BlockType.VORBIS_COMMENT:\n return this.flacParser.parseComment(pageData);\n case Flac.BlockType.PICTURE:\n if (!this.options.skipCovers) {\n const picture = new VorbisPictureToken(pageData.length).get(pageData, 0);\n return this.flacParser.addPictureTag(picture);\n }\n break;\n default:\n this.metadata.addWarning(`Unknown block type: ${blockHeader.type}`);\n }\n // Ignore data block\n return this.tokenizer.ignore(blockHeader.length).then();\n }\n flush() {\n return Promise.resolve();\n }\n}\n"],"mappings":"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","names":["import_debug","initDebug","import_debug","debug","initDebug","import_debug","debug","initDebug","debug","initDebug","stream"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/OggParser-HOABAP6I.js.map"}
+214
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/WavPackParser-BDZJQRUN.js
··· 1 + import { 2 + FourCcToken, 3 + tryParseApeHeader 4 + } from "./chunk-CSVVW572.js"; 5 + import { 6 + uint8ArrayToHex 7 + } from "./chunk-6AX6SYMQ.js"; 8 + import "./chunk-FGRUWWG5.js"; 9 + import { 10 + BasicParser, 11 + UINT16_LE, 12 + UINT24_LE, 13 + UINT32_LE, 14 + UINT8, 15 + Uint8ArrayType, 16 + makeUnexpectedFileContentError, 17 + require_src 18 + } from "./chunk-ETGVMC2T.js"; 19 + import { 20 + __name, 21 + __toESM 22 + } from "./chunk-7IARE43G.js"; 23 + 24 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/wavpack/WavPackToken.js 25 + var SampleRates = [ 26 + 6e3, 27 + 8e3, 28 + 9600, 29 + 11025, 30 + 12e3, 31 + 16e3, 32 + 22050, 33 + 24e3, 34 + 32e3, 35 + 44100, 36 + 48e3, 37 + 64e3, 38 + 88200, 39 + 96e3, 40 + 192e3, 41 + -1 42 + ]; 43 + var BlockHeaderToken = { 44 + len: 32, 45 + get: /* @__PURE__ */ __name((buf, off) => { 46 + const flags = UINT32_LE.get(buf, off + 24); 47 + const res = { 48 + // should equal 'wvpk' 49 + BlockID: FourCcToken.get(buf, off), 50 + // 0x402 to 0x410 are valid for decode 51 + blockSize: UINT32_LE.get(buf, off + 4), 52 + // 0x402 (1026) to 0x410 are valid for decode 53 + version: UINT16_LE.get(buf, off + 8), 54 + // 40-bit total samples for entire file (if block_index == 0 and a value of -1 indicates an unknown length) 55 + totalSamples: ( 56 + /* replace with bigint? (Token.UINT8.get(buf, off + 11) << 32) + */ 57 + UINT32_LE.get(buf, off + 12) 58 + ), 59 + // 40-bit block_index 60 + blockIndex: ( 61 + /* replace with bigint? (Token.UINT8.get(buf, off + 10) << 32) + */ 62 + UINT32_LE.get(buf, off + 16) 63 + ), 64 + // 40-bit total samples for entire file (if block_index == 0 and a value of -1 indicates an unknown length) 65 + blockSamples: UINT32_LE.get(buf, off + 20), 66 + // various flags for id and decoding 67 + flags: { 68 + bitsPerSample: (1 + getBitAllignedNumber(flags, 0, 2)) * 8, 69 + isMono: isBitSet(flags, 2), 70 + isHybrid: isBitSet(flags, 3), 71 + isJointStereo: isBitSet(flags, 4), 72 + crossChannel: isBitSet(flags, 5), 73 + hybridNoiseShaping: isBitSet(flags, 6), 74 + floatingPoint: isBitSet(flags, 7), 75 + samplingRate: SampleRates[getBitAllignedNumber(flags, 23, 4)], 76 + isDSD: isBitSet(flags, 31) 77 + }, 78 + // crc for actual decoded data 79 + crc: new Uint8ArrayType(4).get(buf, off + 28) 80 + }; 81 + if (res.flags.isDSD) { 82 + res.totalSamples *= 8; 83 + } 84 + return res; 85 + }, "get") 86 + }; 87 + var MetadataIdToken = { 88 + len: 1, 89 + get: /* @__PURE__ */ __name((buf, off) => { 90 + return { 91 + functionId: getBitAllignedNumber(buf[off], 0, 6), 92 + // functionId overlaps with isOptional flag 93 + isOptional: isBitSet(buf[off], 5), 94 + isOddSize: isBitSet(buf[off], 6), 95 + largeBlock: isBitSet(buf[off], 7) 96 + }; 97 + }, "get") 98 + }; 99 + function isBitSet(flags, bitOffset) { 100 + return getBitAllignedNumber(flags, bitOffset, 1) === 1; 101 + } 102 + __name(isBitSet, "isBitSet"); 103 + function getBitAllignedNumber(flags, bitOffset, len) { 104 + return flags >>> bitOffset & 4294967295 >>> 32 - len; 105 + } 106 + __name(getBitAllignedNumber, "getBitAllignedNumber"); 107 + 108 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/wavpack/WavPackParser.js 109 + var import_debug = __toESM(require_src()); 110 + var debug = (0, import_debug.default)("music-metadata:parser:WavPack"); 111 + var WavPackContentError = class extends makeUnexpectedFileContentError("WavPack") { 112 + static { 113 + __name(this, "WavPackContentError"); 114 + } 115 + }; 116 + var WavPackParser = class extends BasicParser { 117 + static { 118 + __name(this, "WavPackParser"); 119 + } 120 + constructor() { 121 + super(...arguments); 122 + this.audioDataSize = 0; 123 + } 124 + async parse() { 125 + this.metadata.setAudioOnly(); 126 + this.audioDataSize = 0; 127 + await this.parseWavPackBlocks(); 128 + return tryParseApeHeader(this.metadata, this.tokenizer, this.options); 129 + } 130 + async parseWavPackBlocks() { 131 + do { 132 + const blockId = await this.tokenizer.peekToken(FourCcToken); 133 + if (blockId !== "wvpk") 134 + break; 135 + const header = await this.tokenizer.readToken(BlockHeaderToken); 136 + if (header.BlockID !== "wvpk") 137 + throw new WavPackContentError("Invalid WavPack Block-ID"); 138 + debug(`WavPack header blockIndex=${header.blockIndex}, len=${BlockHeaderToken.len}`); 139 + if (header.blockIndex === 0 && !this.metadata.format.container) { 140 + this.metadata.setFormat("container", "WavPack"); 141 + this.metadata.setFormat("lossless", !header.flags.isHybrid); 142 + this.metadata.setFormat("bitsPerSample", header.flags.bitsPerSample); 143 + if (!header.flags.isDSD) { 144 + this.metadata.setFormat("sampleRate", header.flags.samplingRate); 145 + this.metadata.setFormat("duration", header.totalSamples / header.flags.samplingRate); 146 + } 147 + this.metadata.setFormat("numberOfChannels", header.flags.isMono ? 1 : 2); 148 + this.metadata.setFormat("numberOfSamples", header.totalSamples); 149 + this.metadata.setFormat("codec", header.flags.isDSD ? "DSD" : "PCM"); 150 + } 151 + const ignoreBytes = header.blockSize - (BlockHeaderToken.len - 8); 152 + await (header.blockIndex === 0 ? this.parseMetadataSubBlock(header, ignoreBytes) : this.tokenizer.ignore(ignoreBytes)); 153 + if (header.blockSamples > 0) { 154 + this.audioDataSize += header.blockSize; 155 + } 156 + } while (!this.tokenizer.fileInfo.size || this.tokenizer.fileInfo.size - this.tokenizer.position >= BlockHeaderToken.len); 157 + if (this.metadata.format.duration) { 158 + this.metadata.setFormat("bitrate", this.audioDataSize * 8 / this.metadata.format.duration); 159 + } 160 + } 161 + /** 162 + * Ref: http://www.wavpack.com/WavPack5FileFormat.pdf, 3.0 Metadata Sub-blocks 163 + * @param header Header 164 + * @param remainingLength Remaining length 165 + */ 166 + async parseMetadataSubBlock(header, remainingLength) { 167 + let remaining = remainingLength; 168 + while (remaining > MetadataIdToken.len) { 169 + const id = await this.tokenizer.readToken(MetadataIdToken); 170 + const dataSizeInWords = await this.tokenizer.readNumber(id.largeBlock ? UINT24_LE : UINT8); 171 + const data = new Uint8Array(dataSizeInWords * 2 - (id.isOddSize ? 1 : 0)); 172 + await this.tokenizer.readBuffer(data); 173 + debug(`Metadata Sub-Blocks functionId=0x${id.functionId.toString(16)}, id.largeBlock=${id.largeBlock},data-size=${data.length}`); 174 + switch (id.functionId) { 175 + case 0: 176 + break; 177 + case 14: { 178 + debug("ID_DSD_BLOCK"); 179 + const mp = 1 << UINT8.get(data, 0); 180 + const samplingRate = header.flags.samplingRate * mp * 8; 181 + if (!header.flags.isDSD) 182 + throw new WavPackContentError("Only expect DSD block if DSD-flag is set"); 183 + this.metadata.setFormat("sampleRate", samplingRate); 184 + this.metadata.setFormat("duration", header.totalSamples / samplingRate); 185 + break; 186 + } 187 + case 36: 188 + debug("ID_ALT_TRAILER: trailer for non-wav files"); 189 + break; 190 + case 38: 191 + this.metadata.setFormat("audioMD5", data); 192 + break; 193 + case 47: 194 + debug(`ID_BLOCK_CHECKSUM: checksum=${uint8ArrayToHex(data)}`); 195 + break; 196 + default: 197 + debug(`Ignore unsupported meta-sub-block-id functionId=0x${id.functionId.toString(16)}`); 198 + break; 199 + } 200 + remaining -= MetadataIdToken.len + (id.largeBlock ? UINT24_LE.len : UINT8.len) + dataSizeInWords * 2; 201 + debug(`remainingLength=${remaining}`); 202 + if (id.isOddSize) 203 + this.tokenizer.ignore(1); 204 + } 205 + if (remaining !== 0) 206 + throw new WavPackContentError("metadata-sub-block should fit it remaining length"); 207 + } 208 + }; 209 + export { 210 + WavPackContentError, 211 + WavPackParser 212 + }; 213 + 214 + //# sourceMappingURL=./WavPackParser-BDZJQRUN.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/WavPackParser-BDZJQRUN.js.map
··· 1 + {"version":3,"sources":["/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/wavpack/WavPackToken.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/wavpack/WavPackParser.js"],"sourcesContent":["import * as Token from 'token-types';\nimport { FourCcToken } from '../common/FourCC.js';\nconst SampleRates = [6000, 8000, 9600, 11025, 12000, 16000, 22050, 24000, 32000, 44100,\n 48000, 64000, 88200, 96000, 192000, -1];\n/**\n * WavPack Block Header\n *\n * 32-byte little-endian header at the front of every WavPack block\n *\n * Ref: http://www.wavpack.com/WavPack5FileFormat.pdf (page 2/6: 2.0 \"Block Header\")\n */\nexport const BlockHeaderToken = {\n len: 32,\n get: (buf, off) => {\n const flags = Token.UINT32_LE.get(buf, off + 24);\n const res = {\n // should equal 'wvpk'\n BlockID: FourCcToken.get(buf, off),\n // 0x402 to 0x410 are valid for decode\n blockSize: Token.UINT32_LE.get(buf, off + 4),\n // 0x402 (1026) to 0x410 are valid for decode\n version: Token.UINT16_LE.get(buf, off + 8),\n // 40-bit total samples for entire file (if block_index == 0 and a value of -1 indicates an unknown length)\n totalSamples: /* replace with bigint? (Token.UINT8.get(buf, off + 11) << 32) + */ Token.UINT32_LE.get(buf, off + 12),\n // 40-bit block_index\n blockIndex: /* replace with bigint? (Token.UINT8.get(buf, off + 10) << 32) + */ Token.UINT32_LE.get(buf, off + 16),\n // 40-bit total samples for entire file (if block_index == 0 and a value of -1 indicates an unknown length)\n blockSamples: Token.UINT32_LE.get(buf, off + 20),\n // various flags for id and decoding\n flags: {\n bitsPerSample: (1 + getBitAllignedNumber(flags, 0, 2)) * 8,\n isMono: isBitSet(flags, 2),\n isHybrid: isBitSet(flags, 3),\n isJointStereo: isBitSet(flags, 4),\n crossChannel: isBitSet(flags, 5),\n hybridNoiseShaping: isBitSet(flags, 6),\n floatingPoint: isBitSet(flags, 7),\n samplingRate: SampleRates[getBitAllignedNumber(flags, 23, 4)],\n isDSD: isBitSet(flags, 31)\n },\n // crc for actual decoded data\n crc: new Token.Uint8ArrayType(4).get(buf, off + 28)\n };\n if (res.flags.isDSD) {\n res.totalSamples *= 8;\n }\n return res;\n }\n};\n/**\n * 3.0 Metadata Sub-Blocks\n * Ref: http://www.wavpack.com/WavPack5FileFormat.pdf (page 4/6: 3.0 \"Metadata Sub-Block\")\n */\nexport const MetadataIdToken = {\n len: 1,\n get: (buf, off) => {\n return {\n functionId: getBitAllignedNumber(buf[off], 0, 6), // functionId overlaps with isOptional flag\n isOptional: isBitSet(buf[off], 5),\n isOddSize: isBitSet(buf[off], 6),\n largeBlock: isBitSet(buf[off], 7)\n };\n }\n};\nfunction isBitSet(flags, bitOffset) {\n return getBitAllignedNumber(flags, bitOffset, 1) === 1;\n}\nfunction getBitAllignedNumber(flags, bitOffset, len) {\n return (flags >>> bitOffset) & (0xffffffff >>> (32 - len));\n}\n","import * as Token from 'token-types';\nimport { tryParseApeHeader } from '../apev2/APEv2Parser.js';\nimport { FourCcToken } from '../common/FourCC.js';\nimport { BasicParser } from '../common/BasicParser.js';\nimport { BlockHeaderToken, MetadataIdToken } from './WavPackToken.js';\nimport initDebug from 'debug';\nimport { uint8ArrayToHex } from 'uint8array-extras';\nimport { makeUnexpectedFileContentError } from '../ParseError.js';\nconst debug = initDebug('music-metadata:parser:WavPack');\nexport class WavPackContentError extends makeUnexpectedFileContentError('WavPack') {\n}\n/**\n * WavPack Parser\n */\nexport class WavPackParser extends BasicParser {\n constructor() {\n super(...arguments);\n this.audioDataSize = 0;\n }\n async parse() {\n this.metadata.setAudioOnly();\n this.audioDataSize = 0;\n // First parse all WavPack blocks\n await this.parseWavPackBlocks();\n // try to parse APEv2 header\n return tryParseApeHeader(this.metadata, this.tokenizer, this.options);\n }\n async parseWavPackBlocks() {\n do {\n const blockId = await this.tokenizer.peekToken(FourCcToken);\n if (blockId !== 'wvpk')\n break;\n const header = await this.tokenizer.readToken(BlockHeaderToken);\n if (header.BlockID !== 'wvpk')\n throw new WavPackContentError('Invalid WavPack Block-ID');\n debug(`WavPack header blockIndex=${header.blockIndex}, len=${BlockHeaderToken.len}`);\n if (header.blockIndex === 0 && !this.metadata.format.container) {\n this.metadata.setFormat('container', 'WavPack');\n this.metadata.setFormat('lossless', !header.flags.isHybrid);\n // tagTypes: this.type,\n this.metadata.setFormat('bitsPerSample', header.flags.bitsPerSample);\n if (!header.flags.isDSD) {\n // In case isDSD, these values will ne set in ID_DSD_BLOCK\n this.metadata.setFormat('sampleRate', header.flags.samplingRate);\n this.metadata.setFormat('duration', header.totalSamples / header.flags.samplingRate);\n }\n this.metadata.setFormat('numberOfChannels', header.flags.isMono ? 1 : 2);\n this.metadata.setFormat('numberOfSamples', header.totalSamples);\n this.metadata.setFormat('codec', header.flags.isDSD ? 'DSD' : 'PCM');\n }\n const ignoreBytes = header.blockSize - (BlockHeaderToken.len - 8);\n await (header.blockIndex === 0 ? this.parseMetadataSubBlock(header, ignoreBytes) : this.tokenizer.ignore(ignoreBytes));\n if (header.blockSamples > 0) {\n this.audioDataSize += header.blockSize; // Count audio data for bit-rate calculation\n }\n } while (!this.tokenizer.fileInfo.size || this.tokenizer.fileInfo.size - this.tokenizer.position >= BlockHeaderToken.len);\n if (this.metadata.format.duration) {\n this.metadata.setFormat('bitrate', this.audioDataSize * 8 / this.metadata.format.duration);\n }\n }\n /**\n * Ref: http://www.wavpack.com/WavPack5FileFormat.pdf, 3.0 Metadata Sub-blocks\n * @param header Header\n * @param remainingLength Remaining length\n */\n async parseMetadataSubBlock(header, remainingLength) {\n let remaining = remainingLength;\n while (remaining > MetadataIdToken.len) {\n const id = await this.tokenizer.readToken(MetadataIdToken);\n const dataSizeInWords = await this.tokenizer.readNumber(id.largeBlock ? Token.UINT24_LE : Token.UINT8);\n const data = new Uint8Array(dataSizeInWords * 2 - (id.isOddSize ? 1 : 0));\n await this.tokenizer.readBuffer(data);\n debug(`Metadata Sub-Blocks functionId=0x${id.functionId.toString(16)}, id.largeBlock=${id.largeBlock},data-size=${data.length}`);\n switch (id.functionId) {\n case 0x0: // ID_DUMMY: could be used to pad WavPack blocks\n break;\n case 0xe: { // ID_DSD_BLOCK\n debug('ID_DSD_BLOCK');\n // https://github.com/dbry/WavPack/issues/71#issuecomment-483094813\n const mp = 1 << Token.UINT8.get(data, 0);\n const samplingRate = header.flags.samplingRate * mp * 8; // ToDo: second factor should be read from DSD-metadata block https://github.com/dbry/WavPack/issues/71#issuecomment-483094813\n if (!header.flags.isDSD)\n throw new WavPackContentError('Only expect DSD block if DSD-flag is set');\n this.metadata.setFormat('sampleRate', samplingRate);\n this.metadata.setFormat('duration', header.totalSamples / samplingRate);\n break;\n }\n case 0x24: // ID_ALT_TRAILER: maybe used to embed original ID3 tag header\n debug('ID_ALT_TRAILER: trailer for non-wav files');\n break;\n case 0x26: // ID_MD5_CHECKSUM\n this.metadata.setFormat('audioMD5', data);\n break;\n case 0x2f: // ID_BLOCK_CHECKSUM\n debug(`ID_BLOCK_CHECKSUM: checksum=${uint8ArrayToHex(data)}`);\n break;\n default:\n debug(`Ignore unsupported meta-sub-block-id functionId=0x${id.functionId.toString(16)}`);\n break;\n }\n remaining -= MetadataIdToken.len + (id.largeBlock ? Token.UINT24_LE.len : Token.UINT8.len) + dataSizeInWords * 2;\n debug(`remainingLength=${remaining}`);\n if (id.isOddSize)\n this.tokenizer.ignore(1);\n }\n if (remaining !== 0)\n throw new WavPackContentError('metadata-sub-block should fit it remaining length');\n }\n}\n"],"mappings":"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","names":["initDebug"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/WavPackParser-BDZJQRUN.js.map"}
+312
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/WaveParser-CTTJTFLC.js
··· 1 + import { 2 + ID3v2Parser 3 + } from "./chunk-QOFAJIKO.js"; 4 + import "./chunk-Z6RWJW2M.js"; 5 + import "./chunk-SGG7NSCF.js"; 6 + import { 7 + FourCcToken 8 + } from "./chunk-CSVVW572.js"; 9 + import { 10 + stripNulls 11 + } from "./chunk-6AX6SYMQ.js"; 12 + import { 13 + EndOfStreamError, 14 + fromBuffer 15 + } from "./chunk-FGRUWWG5.js"; 16 + import { 17 + BasicParser, 18 + StringType, 19 + UINT16_LE, 20 + UINT32_LE, 21 + Uint8ArrayType, 22 + makeUnexpectedFileContentError, 23 + require_src 24 + } from "./chunk-ETGVMC2T.js"; 25 + import { 26 + __name, 27 + __toESM 28 + } from "./chunk-7IARE43G.js"; 29 + 30 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/wav/WaveParser.js 31 + var import_debug = __toESM(require_src()); 32 + 33 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/riff/RiffChunk.js 34 + var Header = { 35 + len: 8, 36 + get: /* @__PURE__ */ __name((buf, off) => { 37 + return { 38 + // Group-ID 39 + chunkID: new StringType(4, "latin1").get(buf, off), 40 + // Size 41 + chunkSize: UINT32_LE.get(buf, off + 4) 42 + }; 43 + }, "get") 44 + }; 45 + var ListInfoTagValue = class { 46 + static { 47 + __name(this, "ListInfoTagValue"); 48 + } 49 + constructor(tagHeader) { 50 + this.tagHeader = tagHeader; 51 + this.len = tagHeader.chunkSize; 52 + this.len += this.len & 1; 53 + } 54 + get(buf, off) { 55 + return new StringType(this.tagHeader.chunkSize, "ascii").get(buf, off); 56 + } 57 + }; 58 + 59 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/wav/WaveChunk.js 60 + var WaveContentError = class extends makeUnexpectedFileContentError("Wave") { 61 + static { 62 + __name(this, "WaveContentError"); 63 + } 64 + }; 65 + var WaveFormat = { 66 + PCM: 1, 67 + // MPEG-4 and AAC Audio Types 68 + ADPCM: 2, 69 + IEEE_FLOAT: 3, 70 + MPEG_ADTS_AAC: 5632, 71 + MPEG_LOAS: 5634, 72 + RAW_AAC1: 255, 73 + // Dolby Audio Types 74 + DOLBY_AC3_SPDIF: 146, 75 + DVM: 8192, 76 + RAW_SPORT: 576, 77 + ESST_AC3: 577, 78 + DRM: 9, 79 + DTS2: 8193, 80 + MPEG: 80 81 + }; 82 + var WaveFormatNameMap = { 83 + [WaveFormat.PCM]: "PCM", 84 + [WaveFormat.ADPCM]: "ADPCM", 85 + [WaveFormat.IEEE_FLOAT]: "IEEE_FLOAT", 86 + [WaveFormat.MPEG_ADTS_AAC]: "MPEG_ADTS_AAC", 87 + [WaveFormat.MPEG_LOAS]: "MPEG_LOAS", 88 + [WaveFormat.RAW_AAC1]: "RAW_AAC1", 89 + [WaveFormat.DOLBY_AC3_SPDIF]: "DOLBY_AC3_SPDIF", 90 + [WaveFormat.DVM]: "DVM", 91 + [WaveFormat.RAW_SPORT]: "RAW_SPORT", 92 + [WaveFormat.ESST_AC3]: "ESST_AC3", 93 + [WaveFormat.DRM]: "DRM", 94 + [WaveFormat.DTS2]: "DTS2", 95 + [WaveFormat.MPEG]: "MPEG" 96 + }; 97 + var Format = class { 98 + static { 99 + __name(this, "Format"); 100 + } 101 + constructor(header) { 102 + if (header.chunkSize < 16) 103 + throw new WaveContentError("Invalid chunk size"); 104 + this.len = header.chunkSize; 105 + } 106 + get(buf, off) { 107 + return { 108 + wFormatTag: UINT16_LE.get(buf, off), 109 + nChannels: UINT16_LE.get(buf, off + 2), 110 + nSamplesPerSec: UINT32_LE.get(buf, off + 4), 111 + nAvgBytesPerSec: UINT32_LE.get(buf, off + 8), 112 + nBlockAlign: UINT16_LE.get(buf, off + 12), 113 + wBitsPerSample: UINT16_LE.get(buf, off + 14) 114 + }; 115 + } 116 + }; 117 + var FactChunk = class { 118 + static { 119 + __name(this, "FactChunk"); 120 + } 121 + constructor(header) { 122 + if (header.chunkSize < 4) { 123 + throw new WaveContentError("Invalid fact chunk size."); 124 + } 125 + this.len = header.chunkSize; 126 + } 127 + get(buf, off) { 128 + return { 129 + dwSampleLength: UINT32_LE.get(buf, off) 130 + }; 131 + } 132 + }; 133 + 134 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/wav/BwfChunk.js 135 + var BroadcastAudioExtensionChunk = { 136 + len: 420, 137 + get: /* @__PURE__ */ __name((uint8array, off) => { 138 + return { 139 + description: stripNulls(new StringType(256, "ascii").get(uint8array, off)).trim(), 140 + originator: stripNulls(new StringType(32, "ascii").get(uint8array, off + 256)).trim(), 141 + originatorReference: stripNulls(new StringType(32, "ascii").get(uint8array, off + 288)).trim(), 142 + originationDate: stripNulls(new StringType(10, "ascii").get(uint8array, off + 320)).trim(), 143 + originationTime: stripNulls(new StringType(8, "ascii").get(uint8array, off + 330)).trim(), 144 + timeReferenceLow: UINT32_LE.get(uint8array, off + 338), 145 + timeReferenceHigh: UINT32_LE.get(uint8array, off + 342), 146 + version: UINT16_LE.get(uint8array, off + 346), 147 + umid: new Uint8ArrayType(64).get(uint8array, off + 348), 148 + loudnessValue: UINT16_LE.get(uint8array, off + 412), 149 + maxTruePeakLevel: UINT16_LE.get(uint8array, off + 414), 150 + maxMomentaryLoudness: UINT16_LE.get(uint8array, off + 416), 151 + maxShortTermLoudness: UINT16_LE.get(uint8array, off + 418) 152 + }; 153 + }, "get") 154 + }; 155 + 156 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/wav/WaveParser.js 157 + var debug = (0, import_debug.default)("music-metadata:parser:RIFF"); 158 + var WaveParser = class extends BasicParser { 159 + static { 160 + __name(this, "WaveParser"); 161 + } 162 + constructor() { 163 + super(...arguments); 164 + this.blockAlign = 0; 165 + } 166 + async parse() { 167 + const riffHeader = await this.tokenizer.readToken(Header); 168 + debug(`pos=${this.tokenizer.position}, parse: chunkID=${riffHeader.chunkID}`); 169 + if (riffHeader.chunkID !== "RIFF") 170 + return; 171 + this.metadata.setAudioOnly(); 172 + return this.parseRiffChunk(riffHeader.chunkSize).catch((err) => { 173 + if (!(err instanceof EndOfStreamError)) { 174 + throw err; 175 + } 176 + }); 177 + } 178 + async parseRiffChunk(chunkSize) { 179 + const type = await this.tokenizer.readToken(FourCcToken); 180 + this.metadata.setFormat("container", type); 181 + switch (type) { 182 + case "WAVE": 183 + return this.readWaveChunk(chunkSize - FourCcToken.len); 184 + default: 185 + throw new WaveContentError(`Unsupported RIFF format: RIFF/${type}`); 186 + } 187 + } 188 + async readWaveChunk(remaining) { 189 + while (remaining >= Header.len) { 190 + const header = await this.tokenizer.readToken(Header); 191 + remaining -= Header.len + header.chunkSize; 192 + if (header.chunkSize > remaining) { 193 + this.metadata.addWarning("Data chunk size exceeds file size"); 194 + } 195 + this.header = header; 196 + debug(`pos=${this.tokenizer.position}, readChunk: chunkID=RIFF/WAVE/${header.chunkID}`); 197 + switch (header.chunkID) { 198 + case "LIST": 199 + await this.parseListTag(header); 200 + break; 201 + case "fact": 202 + this.metadata.setFormat("lossless", false); 203 + this.fact = await this.tokenizer.readToken(new FactChunk(header)); 204 + break; 205 + case "fmt ": { 206 + const fmt = await this.tokenizer.readToken(new Format(header)); 207 + let subFormat = WaveFormatNameMap[fmt.wFormatTag]; 208 + if (!subFormat) { 209 + debug(`WAVE/non-PCM format=${fmt.wFormatTag}`); 210 + subFormat = `non-PCM (${fmt.wFormatTag})`; 211 + } 212 + this.metadata.setFormat("codec", subFormat); 213 + this.metadata.setFormat("bitsPerSample", fmt.wBitsPerSample); 214 + this.metadata.setFormat("sampleRate", fmt.nSamplesPerSec); 215 + this.metadata.setFormat("numberOfChannels", fmt.nChannels); 216 + this.metadata.setFormat("bitrate", fmt.nBlockAlign * fmt.nSamplesPerSec * 8); 217 + this.blockAlign = fmt.nBlockAlign; 218 + break; 219 + } 220 + case "id3 ": 221 + // The way Picard, FooBar currently stores, ID3 meta-data 222 + case "ID3 ": { 223 + const id3_data = await this.tokenizer.readToken(new Uint8ArrayType(header.chunkSize)); 224 + const rst = fromBuffer(id3_data); 225 + await new ID3v2Parser().parse(this.metadata, rst, this.options); 226 + break; 227 + } 228 + case "data": { 229 + if (this.metadata.format.lossless !== false) { 230 + this.metadata.setFormat("lossless", true); 231 + } 232 + let chunkSize = header.chunkSize; 233 + if (this.tokenizer.fileInfo.size) { 234 + const calcRemaining = this.tokenizer.fileInfo.size - this.tokenizer.position; 235 + if (calcRemaining < chunkSize) { 236 + this.metadata.addWarning("data chunk length exceeding file length"); 237 + chunkSize = calcRemaining; 238 + } 239 + } 240 + const numberOfSamples = this.fact ? this.fact.dwSampleLength : chunkSize === 4294967295 ? void 0 : chunkSize / this.blockAlign; 241 + if (numberOfSamples) { 242 + this.metadata.setFormat("numberOfSamples", numberOfSamples); 243 + if (this.metadata.format.sampleRate) { 244 + this.metadata.setFormat("duration", numberOfSamples / this.metadata.format.sampleRate); 245 + } 246 + } 247 + if (this.metadata.format.codec === "ADPCM") { 248 + this.metadata.setFormat("bitrate", 352e3); 249 + } else if (this.metadata.format.sampleRate) { 250 + this.metadata.setFormat("bitrate", this.blockAlign * this.metadata.format.sampleRate * 8); 251 + } 252 + await this.tokenizer.ignore(header.chunkSize); 253 + break; 254 + } 255 + case "bext": { 256 + const bext = await this.tokenizer.readToken(BroadcastAudioExtensionChunk); 257 + Object.keys(bext).forEach((key) => { 258 + this.metadata.addTag("exif", `bext.${key}`, bext[key]); 259 + }); 260 + const bextRemaining = header.chunkSize - BroadcastAudioExtensionChunk.len; 261 + await this.tokenizer.ignore(bextRemaining); 262 + break; 263 + } 264 + case "\0\0\0\0": 265 + debug(`Ignore padding chunk: RIFF/${header.chunkID} of ${header.chunkSize} bytes`); 266 + this.metadata.addWarning(`Ignore chunk: RIFF/${header.chunkID}`); 267 + await this.tokenizer.ignore(header.chunkSize); 268 + break; 269 + default: 270 + debug(`Ignore chunk: RIFF/${header.chunkID} of ${header.chunkSize} bytes`); 271 + this.metadata.addWarning(`Ignore chunk: RIFF/${header.chunkID}`); 272 + await this.tokenizer.ignore(header.chunkSize); 273 + } 274 + if (this.header.chunkSize % 2 === 1) { 275 + debug("Read odd padding byte"); 276 + await this.tokenizer.ignore(1); 277 + } 278 + } 279 + } 280 + async parseListTag(listHeader) { 281 + const listType = await this.tokenizer.readToken(new StringType(4, "latin1")); 282 + debug("pos=%s, parseListTag: chunkID=RIFF/WAVE/LIST/%s", this.tokenizer.position, listType); 283 + switch (listType) { 284 + case "INFO": 285 + return this.parseRiffInfoTags(listHeader.chunkSize - 4); 286 + default: 287 + this.metadata.addWarning(`Ignore chunk: RIFF/WAVE/LIST/${listType}`); 288 + debug(`Ignoring chunkID=RIFF/WAVE/LIST/${listType}`); 289 + return this.tokenizer.ignore(listHeader.chunkSize - 4).then(); 290 + } 291 + } 292 + async parseRiffInfoTags(chunkSize) { 293 + while (chunkSize >= 8) { 294 + const header = await this.tokenizer.readToken(Header); 295 + const valueToken = new ListInfoTagValue(header); 296 + const value = await this.tokenizer.readToken(valueToken); 297 + this.addTag(header.chunkID, stripNulls(value)); 298 + chunkSize -= 8 + valueToken.len; 299 + } 300 + if (chunkSize !== 0) { 301 + throw new WaveContentError(`Illegal remaining size: ${chunkSize}`); 302 + } 303 + } 304 + addTag(id, value) { 305 + this.metadata.addTag("exif", id, value); 306 + } 307 + }; 308 + export { 309 + WaveParser 310 + }; 311 + 312 + //# sourceMappingURL=./WaveParser-CTTJTFLC.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/WaveParser-CTTJTFLC.js.map
··· 1 + {"version":3,"sources":["/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/wav/WaveParser.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/riff/RiffChunk.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/wav/WaveChunk.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/wav/BwfChunk.js"],"sourcesContent":["import * as strtok3 from 'strtok3';\nimport * as Token from 'token-types';\nimport initDebug from 'debug';\nimport * as riff from '../riff/RiffChunk.js';\nimport * as WaveChunk from './WaveChunk.js';\nimport { ID3v2Parser } from '../id3v2/ID3v2Parser.js';\nimport * as util from '../common/Util.js';\nimport { FourCcToken } from '../common/FourCC.js';\nimport { BasicParser } from '../common/BasicParser.js';\nimport { BroadcastAudioExtensionChunk } from './BwfChunk.js';\nimport { WaveContentError } from './WaveChunk.js';\nconst debug = initDebug('music-metadata:parser:RIFF');\n/**\n * Resource Interchange File Format (RIFF) Parser\n *\n * WAVE PCM soundfile format\n *\n * Ref:\n * - http://www.johnloomis.org/cpe102/asgn/asgn1/riff.html\n * - http://soundfile.sapp.org/doc/WaveFormat\n *\n * ToDo: Split WAVE part from RIFF parser\n */\nexport class WaveParser extends BasicParser {\n constructor() {\n super(...arguments);\n this.blockAlign = 0;\n }\n async parse() {\n const riffHeader = await this.tokenizer.readToken(riff.Header);\n debug(`pos=${this.tokenizer.position}, parse: chunkID=${riffHeader.chunkID}`);\n if (riffHeader.chunkID !== 'RIFF')\n return; // Not RIFF format\n this.metadata.setAudioOnly();\n return this.parseRiffChunk(riffHeader.chunkSize).catch(err => {\n if (!(err instanceof strtok3.EndOfStreamError)) {\n throw err;\n }\n });\n }\n async parseRiffChunk(chunkSize) {\n const type = await this.tokenizer.readToken(FourCcToken);\n this.metadata.setFormat('container', type);\n switch (type) {\n case 'WAVE':\n return this.readWaveChunk(chunkSize - FourCcToken.len);\n default:\n throw new WaveContentError(`Unsupported RIFF format: RIFF/${type}`);\n }\n }\n async readWaveChunk(remaining) {\n while (remaining >= riff.Header.len) {\n const header = await this.tokenizer.readToken(riff.Header);\n remaining -= riff.Header.len + header.chunkSize;\n if (header.chunkSize > remaining) {\n this.metadata.addWarning('Data chunk size exceeds file size');\n }\n this.header = header;\n debug(`pos=${this.tokenizer.position}, readChunk: chunkID=RIFF/WAVE/${header.chunkID}`);\n switch (header.chunkID) {\n case 'LIST':\n await this.parseListTag(header);\n break;\n case 'fact': // extended Format chunk,\n this.metadata.setFormat('lossless', false);\n this.fact = await this.tokenizer.readToken(new WaveChunk.FactChunk(header));\n break;\n case 'fmt ': { // The Util Chunk, non-PCM Formats\n const fmt = await this.tokenizer.readToken(new WaveChunk.Format(header));\n let subFormat = WaveChunk.WaveFormatNameMap[fmt.wFormatTag];\n if (!subFormat) {\n debug(`WAVE/non-PCM format=${fmt.wFormatTag}`);\n subFormat = `non-PCM (${fmt.wFormatTag})`;\n }\n this.metadata.setFormat('codec', subFormat);\n this.metadata.setFormat('bitsPerSample', fmt.wBitsPerSample);\n this.metadata.setFormat('sampleRate', fmt.nSamplesPerSec);\n this.metadata.setFormat('numberOfChannels', fmt.nChannels);\n this.metadata.setFormat('bitrate', fmt.nBlockAlign * fmt.nSamplesPerSec * 8);\n this.blockAlign = fmt.nBlockAlign;\n break;\n }\n case 'id3 ': // The way Picard, FooBar currently stores, ID3 meta-data\n case 'ID3 ': { // The way Mp3Tags stores ID3 meta-data\n const id3_data = await this.tokenizer.readToken(new Token.Uint8ArrayType(header.chunkSize));\n const rst = strtok3.fromBuffer(id3_data);\n await new ID3v2Parser().parse(this.metadata, rst, this.options);\n break;\n }\n case 'data': { // PCM-data\n if (this.metadata.format.lossless !== false) {\n this.metadata.setFormat('lossless', true);\n }\n let chunkSize = header.chunkSize;\n if (this.tokenizer.fileInfo.size) {\n const calcRemaining = this.tokenizer.fileInfo.size - this.tokenizer.position;\n if (calcRemaining < chunkSize) {\n this.metadata.addWarning('data chunk length exceeding file length');\n chunkSize = calcRemaining;\n }\n }\n const numberOfSamples = this.fact ? this.fact.dwSampleLength : (chunkSize === 0xffffffff ? undefined : chunkSize / this.blockAlign);\n if (numberOfSamples) {\n this.metadata.setFormat('numberOfSamples', numberOfSamples);\n if (this.metadata.format.sampleRate) {\n this.metadata.setFormat('duration', numberOfSamples / this.metadata.format.sampleRate);\n }\n }\n if (this.metadata.format.codec === 'ADPCM') { // ADPCM is 4 bits lossy encoding resulting in 352kbps\n this.metadata.setFormat('bitrate', 352000);\n }\n else if (this.metadata.format.sampleRate) {\n this.metadata.setFormat('bitrate', this.blockAlign * this.metadata.format.sampleRate * 8);\n }\n await this.tokenizer.ignore(header.chunkSize);\n break;\n }\n case 'bext': { // Broadcast Audio Extension chunk\thttps://tech.ebu.ch/docs/tech/tech3285.pdf\n const bext = await this.tokenizer.readToken(BroadcastAudioExtensionChunk);\n Object.keys(bext).forEach(key => {\n this.metadata.addTag('exif', `bext.${key}`, bext[key]);\n });\n const bextRemaining = header.chunkSize - BroadcastAudioExtensionChunk.len;\n await this.tokenizer.ignore(bextRemaining);\n break;\n }\n case '\\x00\\x00\\x00\\x00': // padding ??\n debug(`Ignore padding chunk: RIFF/${header.chunkID} of ${header.chunkSize} bytes`);\n this.metadata.addWarning(`Ignore chunk: RIFF/${header.chunkID}`);\n await this.tokenizer.ignore(header.chunkSize);\n break;\n default:\n debug(`Ignore chunk: RIFF/${header.chunkID} of ${header.chunkSize} bytes`);\n this.metadata.addWarning(`Ignore chunk: RIFF/${header.chunkID}`);\n await this.tokenizer.ignore(header.chunkSize);\n }\n if (this.header.chunkSize % 2 === 1) {\n debug('Read odd padding byte'); // https://wiki.multimedia.cx/index.php/RIFF\n await this.tokenizer.ignore(1);\n }\n }\n }\n async parseListTag(listHeader) {\n const listType = await this.tokenizer.readToken(new Token.StringType(4, 'latin1'));\n debug('pos=%s, parseListTag: chunkID=RIFF/WAVE/LIST/%s', this.tokenizer.position, listType);\n switch (listType) {\n case 'INFO':\n return this.parseRiffInfoTags(listHeader.chunkSize - 4);\n default:\n this.metadata.addWarning(`Ignore chunk: RIFF/WAVE/LIST/${listType}`);\n debug(`Ignoring chunkID=RIFF/WAVE/LIST/${listType}`);\n return this.tokenizer.ignore(listHeader.chunkSize - 4).then();\n }\n }\n async parseRiffInfoTags(chunkSize) {\n while (chunkSize >= 8) {\n const header = await this.tokenizer.readToken(riff.Header);\n const valueToken = new riff.ListInfoTagValue(header);\n const value = await this.tokenizer.readToken(valueToken);\n this.addTag(header.chunkID, util.stripNulls(value));\n chunkSize -= (8 + valueToken.len);\n }\n if (chunkSize !== 0) {\n throw new WaveContentError(`Illegal remaining size: ${chunkSize}`);\n }\n }\n addTag(id, value) {\n this.metadata.addTag('exif', id, value);\n }\n}\n","import * as Token from 'token-types';\n/**\n * Common RIFF chunk header\n */\nexport const Header = {\n len: 8,\n get: (buf, off) => {\n return {\n // Group-ID\n chunkID: new Token.StringType(4, 'latin1').get(buf, off),\n // Size\n chunkSize: Token.UINT32_LE.get(buf, off + 4)\n };\n }\n};\n/**\n * Token to parse RIFF-INFO tag value\n */\nexport class ListInfoTagValue {\n constructor(tagHeader) {\n this.tagHeader = tagHeader;\n this.len = tagHeader.chunkSize;\n this.len += this.len & 1; // if it is an odd length, round up to even\n }\n get(buf, off) {\n return new Token.StringType(this.tagHeader.chunkSize, 'ascii').get(buf, off);\n }\n}\n","import * as Token from 'token-types';\nimport { makeUnexpectedFileContentError } from '../ParseError.js';\nexport class WaveContentError extends makeUnexpectedFileContentError('Wave') {\n}\n/**\n * Ref: https://msdn.microsoft.com/en-us/library/windows/desktop/dd317599(v=vs.85).aspx\n */\nexport const WaveFormat = {\n PCM: 0x0001,\n // MPEG-4 and AAC Audio Types\n ADPCM: 0x0002,\n IEEE_FLOAT: 0x0003,\n MPEG_ADTS_AAC: 0x1600,\n MPEG_LOAS: 0x1602,\n RAW_AAC1: 0x00FF,\n // Dolby Audio Types\n DOLBY_AC3_SPDIF: 0x0092,\n DVM: 0x2000,\n RAW_SPORT: 0x0240,\n ESST_AC3: 0x0241,\n DRM: 0x0009,\n DTS2: 0x2001,\n MPEG: 0x0050\n};\nexport const WaveFormatNameMap = {\n [WaveFormat.PCM]: 'PCM',\n [WaveFormat.ADPCM]: 'ADPCM',\n [WaveFormat.IEEE_FLOAT]: 'IEEE_FLOAT',\n [WaveFormat.MPEG_ADTS_AAC]: 'MPEG_ADTS_AAC',\n [WaveFormat.MPEG_LOAS]: 'MPEG_LOAS',\n [WaveFormat.RAW_AAC1]: 'RAW_AAC1',\n [WaveFormat.DOLBY_AC3_SPDIF]: 'DOLBY_AC3_SPDIF',\n [WaveFormat.DVM]: 'DVM',\n [WaveFormat.RAW_SPORT]: 'RAW_SPORT',\n [WaveFormat.ESST_AC3]: 'ESST_AC3',\n [WaveFormat.DRM]: 'DRM',\n [WaveFormat.DTS2]: 'DTS2',\n [WaveFormat.MPEG]: 'MPEG'\n};\n/**\n * format chunk; chunk-id is \"fmt \"\n * http://soundfile.sapp.org/doc/WaveFormat/\n */\nexport class Format {\n constructor(header) {\n if (header.chunkSize < 16)\n throw new WaveContentError('Invalid chunk size');\n this.len = header.chunkSize;\n }\n get(buf, off) {\n return {\n wFormatTag: Token.UINT16_LE.get(buf, off),\n nChannels: Token.UINT16_LE.get(buf, off + 2),\n nSamplesPerSec: Token.UINT32_LE.get(buf, off + 4),\n nAvgBytesPerSec: Token.UINT32_LE.get(buf, off + 8),\n nBlockAlign: Token.UINT16_LE.get(buf, off + 12),\n wBitsPerSample: Token.UINT16_LE.get(buf, off + 14)\n };\n }\n}\n/**\n * Fact chunk; chunk-id is \"fact\"\n * http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html\n * http://www.recordingblogs.com/wiki/fact-chunk-of-a-wave-file\n */\nexport class FactChunk {\n constructor(header) {\n if (header.chunkSize < 4) {\n throw new WaveContentError('Invalid fact chunk size.');\n }\n this.len = header.chunkSize;\n }\n get(buf, off) {\n return {\n dwSampleLength: Token.UINT32_LE.get(buf, off)\n };\n }\n}\n","import * as Token from 'token-types';\nimport { stripNulls } from '../common/Util.js';\n/**\n * Broadcast Audio Extension Chunk\n * Ref: https://tech.ebu.ch/docs/tech/tech3285.pdf\n */\nexport const BroadcastAudioExtensionChunk = {\n len: 420,\n get: (uint8array, off) => {\n return {\n description: stripNulls(new Token.StringType(256, 'ascii').get(uint8array, off)).trim(),\n originator: stripNulls(new Token.StringType(32, 'ascii').get(uint8array, off + 256)).trim(),\n originatorReference: stripNulls(new Token.StringType(32, 'ascii').get(uint8array, off + 288)).trim(),\n originationDate: stripNulls(new Token.StringType(10, 'ascii').get(uint8array, off + 320)).trim(),\n originationTime: stripNulls(new Token.StringType(8, 'ascii').get(uint8array, off + 330)).trim(),\n timeReferenceLow: Token.UINT32_LE.get(uint8array, off + 338),\n timeReferenceHigh: Token.UINT32_LE.get(uint8array, off + 342),\n version: Token.UINT16_LE.get(uint8array, off + 346),\n umid: new Token.Uint8ArrayType(64).get(uint8array, off + 348),\n loudnessValue: Token.UINT16_LE.get(uint8array, off + 412),\n maxTruePeakLevel: Token.UINT16_LE.get(uint8array, off + 414),\n maxMomentaryLoudness: Token.UINT16_LE.get(uint8array, off + 416),\n maxShortTermLoudness: Token.UINT16_LE.get(uint8array, off + 418)\n };\n }\n};\n"],"mappings":"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","names":["initDebug"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/WaveParser-CTTJTFLC.js.map"}
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/android-chrome-192x192.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/android-chrome-192x192.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/android-chrome-512x512.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/android-chrome-512x512.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/apple-touch-icon.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/apple-touch-icon.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/browserconfig.xml
··· 1 + ../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/browserconfig.xml
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-2DEWUZFM.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-2DEWUZFM.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-2DEWUZFM.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-2DEWUZFM.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-2X53XAU6.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-2X53XAU6.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-2X53XAU6.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-2X53XAU6.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-3SOBXJU4.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-3SOBXJU4.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-3SOBXJU4.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-3SOBXJU4.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-47SOYRCA.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-47SOYRCA.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-47SOYRCA.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-47SOYRCA.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-5PUD235R.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-5PUD235R.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-5PUD235R.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-5PUD235R.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-5U6EFMUU.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-5U6EFMUU.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-5U6EFMUU.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-5U6EFMUU.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-6AX6SYMQ.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-6AX6SYMQ.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-6AX6SYMQ.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-6AX6SYMQ.js.map
+4891
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-6WU6XF6M.js
··· 1 + import { 2 + TrackType, 3 + TrackTypeValueToKeyMap 4 + } from "./chunk-7OCWG5AW.js"; 5 + import { 6 + hasID3v1Header 7 + } from "./chunk-Z6RWJW2M.js"; 8 + import { 9 + LyricsContentType, 10 + TimestampFormat 11 + } from "./chunk-SGG7NSCF.js"; 12 + import { 13 + APEv2Parser 14 + } from "./chunk-CSVVW572.js"; 15 + import { 16 + decodeString, 17 + getUintBE, 18 + toRatio 19 + } from "./chunk-6AX6SYMQ.js"; 20 + import { 21 + AbstractTokenizer, 22 + EndOfStreamError, 23 + fromBlob, 24 + fromBuffer, 25 + fromWebStream, 26 + open2 27 + } from "./chunk-FGRUWWG5.js"; 28 + import { 29 + CouldNotDetermineFileTypeError, 30 + INT32_BE, 31 + InternalParserError, 32 + StringType, 33 + UINT16_BE, 34 + UINT16_LE, 35 + UINT32_BE, 36 + UINT32_LE, 37 + UINT64_LE, 38 + UINT8, 39 + UnsupportedFileTypeError, 40 + require_src, 41 + textDecode 42 + } from "./chunk-ETGVMC2T.js"; 43 + import { 44 + require_uri_all 45 + } from "./chunk-BGA2NGTF.js"; 46 + import { 47 + removeUndefinedValuesFromRecord 48 + } from "./chunk-AN7CZG6F.js"; 49 + import { 50 + __commonJS, 51 + __name, 52 + __toESM 53 + } from "./chunk-7IARE43G.js"; 54 + 55 + // ../node_modules/.deno/content-type@1.0.5/node_modules/content-type/index.js 56 + var require_content_type = __commonJS({ 57 + "../node_modules/.deno/content-type@1.0.5/node_modules/content-type/index.js"(exports) { 58 + "use strict"; 59 + var PARAM_REGEXP = /; *([!#$%&'*+.^_`|~0-9A-Za-z-]+) *= *("(?:[\u000b\u0020\u0021\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\u000b\u0020-\u00ff])*"|[!#$%&'*+.^_`|~0-9A-Za-z-]+) */g; 60 + var TEXT_REGEXP = /^[\u000b\u0020-\u007e\u0080-\u00ff]+$/; 61 + var TOKEN_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/; 62 + var QESC_REGEXP = /\\([\u000b\u0020-\u00ff])/g; 63 + var QUOTE_REGEXP = /([\\"])/g; 64 + var TYPE_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+\/[!#$%&'*+.^_`|~0-9A-Za-z-]+$/; 65 + exports.format = format; 66 + exports.parse = parse2; 67 + function format(obj) { 68 + if (!obj || typeof obj !== "object") { 69 + throw new TypeError("argument obj is required"); 70 + } 71 + var parameters = obj.parameters; 72 + var type = obj.type; 73 + if (!type || !TYPE_REGEXP.test(type)) { 74 + throw new TypeError("invalid type"); 75 + } 76 + var string = type; 77 + if (parameters && typeof parameters === "object") { 78 + var param; 79 + var params = Object.keys(parameters).sort(); 80 + for (var i = 0; i < params.length; i++) { 81 + param = params[i]; 82 + if (!TOKEN_REGEXP.test(param)) { 83 + throw new TypeError("invalid parameter name"); 84 + } 85 + string += "; " + param + "=" + qstring(parameters[param]); 86 + } 87 + } 88 + return string; 89 + } 90 + __name(format, "format"); 91 + function parse2(string) { 92 + if (!string) { 93 + throw new TypeError("argument string is required"); 94 + } 95 + var header = typeof string === "object" ? getcontenttype(string) : string; 96 + if (typeof header !== "string") { 97 + throw new TypeError("argument string is required to be a string"); 98 + } 99 + var index = header.indexOf(";"); 100 + var type = index !== -1 ? header.slice(0, index).trim() : header.trim(); 101 + if (!TYPE_REGEXP.test(type)) { 102 + throw new TypeError("invalid media type"); 103 + } 104 + var obj = new ContentType2(type.toLowerCase()); 105 + if (index !== -1) { 106 + var key; 107 + var match; 108 + var value; 109 + PARAM_REGEXP.lastIndex = index; 110 + while (match = PARAM_REGEXP.exec(header)) { 111 + if (match.index !== index) { 112 + throw new TypeError("invalid parameter format"); 113 + } 114 + index += match[0].length; 115 + key = match[1].toLowerCase(); 116 + value = match[2]; 117 + if (value.charCodeAt(0) === 34) { 118 + value = value.slice(1, -1); 119 + if (value.indexOf("\\") !== -1) { 120 + value = value.replace(QESC_REGEXP, "$1"); 121 + } 122 + } 123 + obj.parameters[key] = value; 124 + } 125 + if (index !== header.length) { 126 + throw new TypeError("invalid parameter format"); 127 + } 128 + } 129 + return obj; 130 + } 131 + __name(parse2, "parse"); 132 + function getcontenttype(obj) { 133 + var header; 134 + if (typeof obj.getHeader === "function") { 135 + header = obj.getHeader("content-type"); 136 + } else if (typeof obj.headers === "object") { 137 + header = obj.headers && obj.headers["content-type"]; 138 + } 139 + if (typeof header !== "string") { 140 + throw new TypeError("content-type header is missing from object"); 141 + } 142 + return header; 143 + } 144 + __name(getcontenttype, "getcontenttype"); 145 + function qstring(val) { 146 + var str = String(val); 147 + if (TOKEN_REGEXP.test(str)) { 148 + return str; 149 + } 150 + if (str.length > 0 && !TEXT_REGEXP.test(str)) { 151 + throw new TypeError("invalid parameter value"); 152 + } 153 + return '"' + str.replace(QUOTE_REGEXP, "\\$1") + '"'; 154 + } 155 + __name(qstring, "qstring"); 156 + function ContentType2(type) { 157 + this.parameters = /* @__PURE__ */ Object.create(null); 158 + this.type = type; 159 + } 160 + __name(ContentType2, "ContentType"); 161 + } 162 + }); 163 + 164 + // ../node_modules/.deno/media-typer@1.1.0/node_modules/media-typer/index.js 165 + var require_media_typer = __commonJS({ 166 + "../node_modules/.deno/media-typer@1.1.0/node_modules/media-typer/index.js"(exports) { 167 + "use strict"; 168 + var SUBTYPE_NAME_REGEXP = /^[A-Za-z0-9][A-Za-z0-9!#$&^_.-]{0,126}$/; 169 + var TYPE_NAME_REGEXP = /^[A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126}$/; 170 + var TYPE_REGEXP = /^ *([A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126})\/([A-Za-z0-9][A-Za-z0-9!#$&^_.+-]{0,126}) *$/; 171 + exports.format = format; 172 + exports.parse = parse2; 173 + exports.test = test; 174 + function format(obj) { 175 + if (!obj || typeof obj !== "object") { 176 + throw new TypeError("argument obj is required"); 177 + } 178 + var subtype = obj.subtype; 179 + var suffix = obj.suffix; 180 + var type = obj.type; 181 + if (!type || !TYPE_NAME_REGEXP.test(type)) { 182 + throw new TypeError("invalid type"); 183 + } 184 + if (!subtype || !SUBTYPE_NAME_REGEXP.test(subtype)) { 185 + throw new TypeError("invalid subtype"); 186 + } 187 + var string = type + "/" + subtype; 188 + if (suffix) { 189 + if (!TYPE_NAME_REGEXP.test(suffix)) { 190 + throw new TypeError("invalid suffix"); 191 + } 192 + string += "+" + suffix; 193 + } 194 + return string; 195 + } 196 + __name(format, "format"); 197 + function test(string) { 198 + if (!string) { 199 + throw new TypeError("argument string is required"); 200 + } 201 + if (typeof string !== "string") { 202 + throw new TypeError("argument string is required to be a string"); 203 + } 204 + return TYPE_REGEXP.test(string.toLowerCase()); 205 + } 206 + __name(test, "test"); 207 + function parse2(string) { 208 + if (!string) { 209 + throw new TypeError("argument string is required"); 210 + } 211 + if (typeof string !== "string") { 212 + throw new TypeError("argument string is required to be a string"); 213 + } 214 + var match = TYPE_REGEXP.exec(string.toLowerCase()); 215 + if (!match) { 216 + throw new TypeError("invalid media type"); 217 + } 218 + var type = match[1]; 219 + var subtype = match[2]; 220 + var suffix; 221 + var index = subtype.lastIndexOf("+"); 222 + if (index !== -1) { 223 + suffix = subtype.substr(index + 1); 224 + subtype = subtype.substr(0, index); 225 + } 226 + return new MediaType(type, subtype, suffix); 227 + } 228 + __name(parse2, "parse"); 229 + function MediaType(type, subtype, suffix) { 230 + this.type = type; 231 + this.subtype = subtype; 232 + this.suffix = suffix; 233 + } 234 + __name(MediaType, "MediaType"); 235 + } 236 + }); 237 + 238 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/index.js 239 + var import_debug4 = __toESM(require_src()); 240 + 241 + // ../node_modules/.deno/@tokenizer+inflate@0.4.1/node_modules/@tokenizer/inflate/lib/ZipHandler.js 242 + var import_debug = __toESM(require_src()); 243 + 244 + // ../node_modules/.deno/@tokenizer+inflate@0.4.1/node_modules/@tokenizer/inflate/lib/ZipToken.js 245 + var Signature = { 246 + LocalFileHeader: 67324752, 247 + DataDescriptor: 134695760, 248 + CentralFileHeader: 33639248, 249 + EndOfCentralDirectory: 101010256 250 + }; 251 + var DataDescriptor = { 252 + get(array) { 253 + return { 254 + signature: UINT32_LE.get(array, 0), 255 + compressedSize: UINT32_LE.get(array, 8), 256 + uncompressedSize: UINT32_LE.get(array, 12) 257 + }; 258 + }, 259 + len: 16 260 + }; 261 + var LocalFileHeaderToken = { 262 + get(array) { 263 + const flags = UINT16_LE.get(array, 6); 264 + return { 265 + signature: UINT32_LE.get(array, 0), 266 + minVersion: UINT16_LE.get(array, 4), 267 + dataDescriptor: !!(flags & 8), 268 + compressedMethod: UINT16_LE.get(array, 8), 269 + compressedSize: UINT32_LE.get(array, 18), 270 + uncompressedSize: UINT32_LE.get(array, 22), 271 + filenameLength: UINT16_LE.get(array, 26), 272 + extraFieldLength: UINT16_LE.get(array, 28), 273 + filename: null 274 + }; 275 + }, 276 + len: 30 277 + }; 278 + var EndOfCentralDirectoryRecordToken = { 279 + get(array) { 280 + return { 281 + signature: UINT32_LE.get(array, 0), 282 + nrOfThisDisk: UINT16_LE.get(array, 4), 283 + nrOfThisDiskWithTheStart: UINT16_LE.get(array, 6), 284 + nrOfEntriesOnThisDisk: UINT16_LE.get(array, 8), 285 + nrOfEntriesOfSize: UINT16_LE.get(array, 10), 286 + sizeOfCd: UINT32_LE.get(array, 12), 287 + offsetOfStartOfCd: UINT32_LE.get(array, 16), 288 + zipFileCommentLength: UINT16_LE.get(array, 20) 289 + }; 290 + }, 291 + len: 22 292 + }; 293 + var FileHeader = { 294 + get(array) { 295 + const flags = UINT16_LE.get(array, 8); 296 + return { 297 + signature: UINT32_LE.get(array, 0), 298 + minVersion: UINT16_LE.get(array, 6), 299 + dataDescriptor: !!(flags & 8), 300 + compressedMethod: UINT16_LE.get(array, 10), 301 + compressedSize: UINT32_LE.get(array, 20), 302 + uncompressedSize: UINT32_LE.get(array, 24), 303 + filenameLength: UINT16_LE.get(array, 28), 304 + extraFieldLength: UINT16_LE.get(array, 30), 305 + fileCommentLength: UINT16_LE.get(array, 32), 306 + relativeOffsetOfLocalHeader: UINT32_LE.get(array, 42), 307 + filename: null 308 + }; 309 + }, 310 + len: 46 311 + }; 312 + 313 + // ../node_modules/.deno/@tokenizer+inflate@0.4.1/node_modules/@tokenizer/inflate/lib/ZipHandler.js 314 + function signatureToArray(signature) { 315 + const signatureBytes = new Uint8Array(UINT32_LE.len); 316 + UINT32_LE.put(signatureBytes, 0, signature); 317 + return signatureBytes; 318 + } 319 + __name(signatureToArray, "signatureToArray"); 320 + var debug = (0, import_debug.default)("tokenizer:inflate"); 321 + var syncBufferSize = 256 * 1024; 322 + var ddSignatureArray = signatureToArray(Signature.DataDescriptor); 323 + var eocdSignatureBytes = signatureToArray(Signature.EndOfCentralDirectory); 324 + var ZipHandler = class _ZipHandler { 325 + static { 326 + __name(this, "ZipHandler"); 327 + } 328 + constructor(tokenizer3) { 329 + this.tokenizer = tokenizer3; 330 + this.syncBuffer = new Uint8Array(syncBufferSize); 331 + } 332 + async isZip() { 333 + return await this.peekSignature() === Signature.LocalFileHeader; 334 + } 335 + peekSignature() { 336 + return this.tokenizer.peekToken(UINT32_LE); 337 + } 338 + async findEndOfCentralDirectoryLocator() { 339 + const randomReadTokenizer = this.tokenizer; 340 + const chunkLength = Math.min(16 * 1024, randomReadTokenizer.fileInfo.size); 341 + const buffer = this.syncBuffer.subarray(0, chunkLength); 342 + await this.tokenizer.readBuffer(buffer, { position: randomReadTokenizer.fileInfo.size - chunkLength }); 343 + for (let i = buffer.length - 4; i >= 0; i--) { 344 + if (buffer[i] === eocdSignatureBytes[0] && buffer[i + 1] === eocdSignatureBytes[1] && buffer[i + 2] === eocdSignatureBytes[2] && buffer[i + 3] === eocdSignatureBytes[3]) { 345 + return randomReadTokenizer.fileInfo.size - chunkLength + i; 346 + } 347 + } 348 + return -1; 349 + } 350 + async readCentralDirectory() { 351 + if (!this.tokenizer.supportsRandomAccess()) { 352 + debug("Cannot reading central-directory without random-read support"); 353 + return; 354 + } 355 + debug("Reading central-directory..."); 356 + const pos = this.tokenizer.position; 357 + const offset = await this.findEndOfCentralDirectoryLocator(); 358 + if (offset > 0) { 359 + debug("Central-directory 32-bit signature found"); 360 + const eocdHeader = await this.tokenizer.readToken(EndOfCentralDirectoryRecordToken, offset); 361 + const files = []; 362 + this.tokenizer.setPosition(eocdHeader.offsetOfStartOfCd); 363 + for (let n = 0; n < eocdHeader.nrOfEntriesOfSize; ++n) { 364 + const entry = await this.tokenizer.readToken(FileHeader); 365 + if (entry.signature !== Signature.CentralFileHeader) { 366 + throw new Error("Expected Central-File-Header signature"); 367 + } 368 + entry.filename = await this.tokenizer.readToken(new StringType(entry.filenameLength, "utf-8")); 369 + await this.tokenizer.ignore(entry.extraFieldLength); 370 + await this.tokenizer.ignore(entry.fileCommentLength); 371 + files.push(entry); 372 + debug(`Add central-directory file-entry: n=${n + 1}/${files.length}: filename=${files[n].filename}`); 373 + } 374 + this.tokenizer.setPosition(pos); 375 + return files; 376 + } 377 + this.tokenizer.setPosition(pos); 378 + } 379 + async unzip(fileCb) { 380 + const entries = await this.readCentralDirectory(); 381 + if (entries) { 382 + return this.iterateOverCentralDirectory(entries, fileCb); 383 + } 384 + let stop = false; 385 + do { 386 + const zipHeader = await this.readLocalFileHeader(); 387 + if (!zipHeader) 388 + break; 389 + const next = fileCb(zipHeader); 390 + stop = !!next.stop; 391 + let fileData; 392 + await this.tokenizer.ignore(zipHeader.extraFieldLength); 393 + if (zipHeader.dataDescriptor && zipHeader.compressedSize === 0) { 394 + const chunks = []; 395 + let len = syncBufferSize; 396 + debug("Compressed-file-size unknown, scanning for next data-descriptor-signature...."); 397 + let nextHeaderIndex = -1; 398 + while (nextHeaderIndex < 0 && len === syncBufferSize) { 399 + len = await this.tokenizer.peekBuffer(this.syncBuffer, { mayBeLess: true }); 400 + nextHeaderIndex = indexOf(this.syncBuffer.subarray(0, len), ddSignatureArray); 401 + const size = nextHeaderIndex >= 0 ? nextHeaderIndex : len; 402 + if (next.handler) { 403 + const data = new Uint8Array(size); 404 + await this.tokenizer.readBuffer(data); 405 + chunks.push(data); 406 + } else { 407 + await this.tokenizer.ignore(size); 408 + } 409 + } 410 + debug(`Found data-descriptor-signature at pos=${this.tokenizer.position}`); 411 + if (next.handler) { 412 + await this.inflate(zipHeader, mergeArrays(chunks), next.handler); 413 + } 414 + } else { 415 + if (next.handler) { 416 + debug(`Reading compressed-file-data: ${zipHeader.compressedSize} bytes`); 417 + fileData = new Uint8Array(zipHeader.compressedSize); 418 + await this.tokenizer.readBuffer(fileData); 419 + await this.inflate(zipHeader, fileData, next.handler); 420 + } else { 421 + debug(`Ignoring compressed-file-data: ${zipHeader.compressedSize} bytes`); 422 + await this.tokenizer.ignore(zipHeader.compressedSize); 423 + } 424 + } 425 + debug(`Reading data-descriptor at pos=${this.tokenizer.position}`); 426 + if (zipHeader.dataDescriptor) { 427 + const dataDescriptor = await this.tokenizer.readToken(DataDescriptor); 428 + if (dataDescriptor.signature !== 134695760) { 429 + throw new Error(`Expected data-descriptor-signature at position ${this.tokenizer.position - DataDescriptor.len}`); 430 + } 431 + } 432 + } while (!stop); 433 + } 434 + async iterateOverCentralDirectory(entries, fileCb) { 435 + for (const fileHeader of entries) { 436 + const next = fileCb(fileHeader); 437 + if (next.handler) { 438 + this.tokenizer.setPosition(fileHeader.relativeOffsetOfLocalHeader); 439 + const zipHeader = await this.readLocalFileHeader(); 440 + if (zipHeader) { 441 + await this.tokenizer.ignore(zipHeader.extraFieldLength); 442 + const fileData = new Uint8Array(fileHeader.compressedSize); 443 + await this.tokenizer.readBuffer(fileData); 444 + await this.inflate(zipHeader, fileData, next.handler); 445 + } 446 + } 447 + if (next.stop) 448 + break; 449 + } 450 + } 451 + async inflate(zipHeader, fileData, cb) { 452 + if (zipHeader.compressedMethod === 0) { 453 + return cb(fileData); 454 + } 455 + if (zipHeader.compressedMethod !== 8) { 456 + throw new Error(`Unsupported ZIP compression method: ${zipHeader.compressedMethod}`); 457 + } 458 + debug(`Decompress filename=${zipHeader.filename}, compressed-size=${fileData.length}`); 459 + const uncompressedData = await _ZipHandler.decompressDeflateRaw(fileData); 460 + return cb(uncompressedData); 461 + } 462 + static async decompressDeflateRaw(data) { 463 + const input = new ReadableStream({ 464 + start(controller) { 465 + controller.enqueue(data); 466 + controller.close(); 467 + } 468 + }); 469 + const ds = new DecompressionStream("deflate-raw"); 470 + const output = input.pipeThrough(ds); 471 + try { 472 + const response = new Response(output); 473 + const buffer = await response.arrayBuffer(); 474 + return new Uint8Array(buffer); 475 + } catch (err) { 476 + const message = err instanceof Error ? `Failed to deflate ZIP entry: ${err.message}` : "Unknown decompression error in ZIP entry"; 477 + throw new TypeError(message); 478 + } 479 + } 480 + async readLocalFileHeader() { 481 + const signature = await this.tokenizer.peekToken(UINT32_LE); 482 + if (signature === Signature.LocalFileHeader) { 483 + const header = await this.tokenizer.readToken(LocalFileHeaderToken); 484 + header.filename = await this.tokenizer.readToken(new StringType(header.filenameLength, "utf-8")); 485 + return header; 486 + } 487 + if (signature === Signature.CentralFileHeader) { 488 + return false; 489 + } 490 + if (signature === 3759263696) { 491 + throw new Error("Encrypted ZIP"); 492 + } 493 + throw new Error("Unexpected signature"); 494 + } 495 + }; 496 + function indexOf(buffer, portion) { 497 + const bufferLength = buffer.length; 498 + const portionLength = portion.length; 499 + if (portionLength > bufferLength) 500 + return -1; 501 + for (let i = 0; i <= bufferLength - portionLength; i++) { 502 + let found = true; 503 + for (let j = 0; j < portionLength; j++) { 504 + if (buffer[i + j] !== portion[j]) { 505 + found = false; 506 + break; 507 + } 508 + } 509 + if (found) { 510 + return i; 511 + } 512 + } 513 + return -1; 514 + } 515 + __name(indexOf, "indexOf"); 516 + function mergeArrays(chunks) { 517 + const totalLength = chunks.reduce((acc, curr) => acc + curr.length, 0); 518 + const mergedArray = new Uint8Array(totalLength); 519 + let offset = 0; 520 + for (const chunk of chunks) { 521 + mergedArray.set(chunk, offset); 522 + offset += chunk.length; 523 + } 524 + return mergedArray; 525 + } 526 + __name(mergeArrays, "mergeArrays"); 527 + 528 + // ../node_modules/.deno/@tokenizer+inflate@0.4.1/node_modules/@tokenizer/inflate/lib/GzipHandler.js 529 + var GzipHandler = class { 530 + static { 531 + __name(this, "GzipHandler"); 532 + } 533 + constructor(tokenizer3) { 534 + this.tokenizer = tokenizer3; 535 + } 536 + inflate() { 537 + const tokenizer3 = this.tokenizer; 538 + return new ReadableStream({ 539 + async pull(controller) { 540 + const buffer = new Uint8Array(1024); 541 + const size = await tokenizer3.readBuffer(buffer, { mayBeLess: true }); 542 + if (size === 0) { 543 + controller.close(); 544 + return; 545 + } 546 + controller.enqueue(buffer.subarray(0, size)); 547 + } 548 + }).pipeThrough(new DecompressionStream("gzip")); 549 + } 550 + }; 551 + 552 + // ../node_modules/.deno/file-type@21.3.0/node_modules/file-type/util.js 553 + function stringToBytes(string, encoding) { 554 + if (encoding === "utf-16le") { 555 + const bytes = []; 556 + for (let index = 0; index < string.length; index++) { 557 + const code = string.charCodeAt(index); 558 + bytes.push(code & 255, code >> 8 & 255); 559 + } 560 + return bytes; 561 + } 562 + if (encoding === "utf-16be") { 563 + const bytes = []; 564 + for (let index = 0; index < string.length; index++) { 565 + const code = string.charCodeAt(index); 566 + bytes.push(code >> 8 & 255, code & 255); 567 + } 568 + return bytes; 569 + } 570 + return [...string].map((character) => character.charCodeAt(0)); 571 + } 572 + __name(stringToBytes, "stringToBytes"); 573 + function tarHeaderChecksumMatches(arrayBuffer, offset = 0) { 574 + const readSum = Number.parseInt(new StringType(6).get(arrayBuffer, 148).replace(/\0.*$/, "").trim(), 8); 575 + if (Number.isNaN(readSum)) { 576 + return false; 577 + } 578 + let sum = 8 * 32; 579 + for (let index = offset; index < offset + 148; index++) { 580 + sum += arrayBuffer[index]; 581 + } 582 + for (let index = offset + 156; index < offset + 512; index++) { 583 + sum += arrayBuffer[index]; 584 + } 585 + return readSum === sum; 586 + } 587 + __name(tarHeaderChecksumMatches, "tarHeaderChecksumMatches"); 588 + var uint32SyncSafeToken = { 589 + get: /* @__PURE__ */ __name((buffer, offset) => buffer[offset + 3] & 127 | buffer[offset + 2] << 7 | buffer[offset + 1] << 14 | buffer[offset] << 21, "get"), 590 + len: 4 591 + }; 592 + 593 + // ../node_modules/.deno/file-type@21.3.0/node_modules/file-type/supported.js 594 + var extensions = [ 595 + "jpg", 596 + "png", 597 + "apng", 598 + "gif", 599 + "webp", 600 + "flif", 601 + "xcf", 602 + "cr2", 603 + "cr3", 604 + "orf", 605 + "arw", 606 + "dng", 607 + "nef", 608 + "rw2", 609 + "raf", 610 + "tif", 611 + "bmp", 612 + "icns", 613 + "jxr", 614 + "psd", 615 + "indd", 616 + "zip", 617 + "tar", 618 + "rar", 619 + "gz", 620 + "bz2", 621 + "7z", 622 + "dmg", 623 + "mp4", 624 + "mid", 625 + "mkv", 626 + "webm", 627 + "mov", 628 + "avi", 629 + "mpg", 630 + "mp2", 631 + "mp3", 632 + "m4a", 633 + "oga", 634 + "ogg", 635 + "ogv", 636 + "opus", 637 + "flac", 638 + "wav", 639 + "spx", 640 + "amr", 641 + "pdf", 642 + "epub", 643 + "elf", 644 + "macho", 645 + "exe", 646 + "swf", 647 + "rtf", 648 + "wasm", 649 + "woff", 650 + "woff2", 651 + "eot", 652 + "ttf", 653 + "otf", 654 + "ttc", 655 + "ico", 656 + "flv", 657 + "ps", 658 + "xz", 659 + "sqlite", 660 + "nes", 661 + "crx", 662 + "xpi", 663 + "cab", 664 + "deb", 665 + "ar", 666 + "rpm", 667 + "Z", 668 + "lz", 669 + "cfb", 670 + "mxf", 671 + "mts", 672 + "blend", 673 + "bpg", 674 + "docx", 675 + "pptx", 676 + "xlsx", 677 + "3gp", 678 + "3g2", 679 + "j2c", 680 + "jp2", 681 + "jpm", 682 + "jpx", 683 + "mj2", 684 + "aif", 685 + "qcp", 686 + "odt", 687 + "ods", 688 + "odp", 689 + "xml", 690 + "mobi", 691 + "heic", 692 + "cur", 693 + "ktx", 694 + "ape", 695 + "wv", 696 + "dcm", 697 + "ics", 698 + "glb", 699 + "pcap", 700 + "dsf", 701 + "lnk", 702 + "alias", 703 + "voc", 704 + "ac3", 705 + "m4v", 706 + "m4p", 707 + "m4b", 708 + "f4v", 709 + "f4p", 710 + "f4b", 711 + "f4a", 712 + "mie", 713 + "asf", 714 + "ogm", 715 + "ogx", 716 + "mpc", 717 + "arrow", 718 + "shp", 719 + "aac", 720 + "mp1", 721 + "it", 722 + "s3m", 723 + "xm", 724 + "skp", 725 + "avif", 726 + "eps", 727 + "lzh", 728 + "pgp", 729 + "asar", 730 + "stl", 731 + "chm", 732 + "3mf", 733 + "zst", 734 + "jxl", 735 + "vcf", 736 + "jls", 737 + "pst", 738 + "dwg", 739 + "parquet", 740 + "class", 741 + "arj", 742 + "cpio", 743 + "ace", 744 + "avro", 745 + "icc", 746 + "fbx", 747 + "vsdx", 748 + "vtt", 749 + "apk", 750 + "drc", 751 + "lz4", 752 + "potx", 753 + "xltx", 754 + "dotx", 755 + "xltm", 756 + "ott", 757 + "ots", 758 + "otp", 759 + "odg", 760 + "otg", 761 + "xlsm", 762 + "docm", 763 + "dotm", 764 + "potm", 765 + "pptm", 766 + "jar", 767 + "jmp", 768 + "rm", 769 + "sav", 770 + "ppsm", 771 + "ppsx", 772 + "tar.gz", 773 + "reg", 774 + "dat" 775 + ]; 776 + var mimeTypes = [ 777 + "image/jpeg", 778 + "image/png", 779 + "image/gif", 780 + "image/webp", 781 + "image/flif", 782 + "image/x-xcf", 783 + "image/x-canon-cr2", 784 + "image/x-canon-cr3", 785 + "image/tiff", 786 + "image/bmp", 787 + "image/vnd.ms-photo", 788 + "image/vnd.adobe.photoshop", 789 + "application/x-indesign", 790 + "application/epub+zip", 791 + "application/x-xpinstall", 792 + "application/vnd.ms-powerpoint.slideshow.macroenabled.12", 793 + "application/vnd.oasis.opendocument.text", 794 + "application/vnd.oasis.opendocument.spreadsheet", 795 + "application/vnd.oasis.opendocument.presentation", 796 + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", 797 + "application/vnd.openxmlformats-officedocument.presentationml.presentation", 798 + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", 799 + "application/vnd.openxmlformats-officedocument.presentationml.slideshow", 800 + "application/zip", 801 + "application/x-tar", 802 + "application/x-rar-compressed", 803 + "application/gzip", 804 + "application/x-bzip2", 805 + "application/x-7z-compressed", 806 + "application/x-apple-diskimage", 807 + "application/vnd.apache.arrow.file", 808 + "video/mp4", 809 + "audio/midi", 810 + "video/matroska", 811 + "video/webm", 812 + "video/quicktime", 813 + "video/vnd.avi", 814 + "audio/wav", 815 + "audio/qcelp", 816 + "audio/x-ms-asf", 817 + "video/x-ms-asf", 818 + "application/vnd.ms-asf", 819 + "video/mpeg", 820 + "video/3gpp", 821 + "audio/mpeg", 822 + "audio/mp4", 823 + // RFC 4337 824 + "video/ogg", 825 + "audio/ogg", 826 + "audio/ogg; codecs=opus", 827 + "application/ogg", 828 + "audio/flac", 829 + "audio/ape", 830 + "audio/wavpack", 831 + "audio/amr", 832 + "application/pdf", 833 + "application/x-elf", 834 + "application/x-mach-binary", 835 + "application/x-msdownload", 836 + "application/x-shockwave-flash", 837 + "application/rtf", 838 + "application/wasm", 839 + "font/woff", 840 + "font/woff2", 841 + "application/vnd.ms-fontobject", 842 + "font/ttf", 843 + "font/otf", 844 + "font/collection", 845 + "image/x-icon", 846 + "video/x-flv", 847 + "application/postscript", 848 + "application/eps", 849 + "application/x-xz", 850 + "application/x-sqlite3", 851 + "application/x-nintendo-nes-rom", 852 + "application/x-google-chrome-extension", 853 + "application/vnd.ms-cab-compressed", 854 + "application/x-deb", 855 + "application/x-unix-archive", 856 + "application/x-rpm", 857 + "application/x-compress", 858 + "application/x-lzip", 859 + "application/x-cfb", 860 + "application/x-mie", 861 + "application/mxf", 862 + "video/mp2t", 863 + "application/x-blender", 864 + "image/bpg", 865 + "image/j2c", 866 + "image/jp2", 867 + "image/jpx", 868 + "image/jpm", 869 + "image/mj2", 870 + "audio/aiff", 871 + "application/xml", 872 + "application/x-mobipocket-ebook", 873 + "image/heif", 874 + "image/heif-sequence", 875 + "image/heic", 876 + "image/heic-sequence", 877 + "image/icns", 878 + "image/ktx", 879 + "application/dicom", 880 + "audio/x-musepack", 881 + "text/calendar", 882 + "text/vcard", 883 + "text/vtt", 884 + "model/gltf-binary", 885 + "application/vnd.tcpdump.pcap", 886 + "audio/x-dsf", 887 + // Non-standard 888 + "application/x.ms.shortcut", 889 + // Invented by us 890 + "application/x.apple.alias", 891 + // Invented by us 892 + "audio/x-voc", 893 + "audio/vnd.dolby.dd-raw", 894 + "audio/x-m4a", 895 + "image/apng", 896 + "image/x-olympus-orf", 897 + "image/x-sony-arw", 898 + "image/x-adobe-dng", 899 + "image/x-nikon-nef", 900 + "image/x-panasonic-rw2", 901 + "image/x-fujifilm-raf", 902 + "video/x-m4v", 903 + "video/3gpp2", 904 + "application/x-esri-shape", 905 + "audio/aac", 906 + "audio/x-it", 907 + "audio/x-s3m", 908 + "audio/x-xm", 909 + "video/MP1S", 910 + "video/MP2P", 911 + "application/vnd.sketchup.skp", 912 + "image/avif", 913 + "application/x-lzh-compressed", 914 + "application/pgp-encrypted", 915 + "application/x-asar", 916 + "model/stl", 917 + "application/vnd.ms-htmlhelp", 918 + "model/3mf", 919 + "image/jxl", 920 + "application/zstd", 921 + "image/jls", 922 + "application/vnd.ms-outlook", 923 + "image/vnd.dwg", 924 + "application/vnd.apache.parquet", 925 + "application/java-vm", 926 + "application/x-arj", 927 + "application/x-cpio", 928 + "application/x-ace-compressed", 929 + "application/avro", 930 + "application/vnd.iccprofile", 931 + "application/x.autodesk.fbx", 932 + // Invented by us 933 + "application/vnd.visio", 934 + "application/vnd.android.package-archive", 935 + "application/vnd.google.draco", 936 + // Invented by us 937 + "application/x-lz4", 938 + // Invented by us 939 + "application/vnd.openxmlformats-officedocument.presentationml.template", 940 + "application/vnd.openxmlformats-officedocument.spreadsheetml.template", 941 + "application/vnd.openxmlformats-officedocument.wordprocessingml.template", 942 + "application/vnd.ms-excel.template.macroenabled.12", 943 + "application/vnd.oasis.opendocument.text-template", 944 + "application/vnd.oasis.opendocument.spreadsheet-template", 945 + "application/vnd.oasis.opendocument.presentation-template", 946 + "application/vnd.oasis.opendocument.graphics", 947 + "application/vnd.oasis.opendocument.graphics-template", 948 + "application/vnd.ms-excel.sheet.macroenabled.12", 949 + "application/vnd.ms-word.document.macroenabled.12", 950 + "application/vnd.ms-word.template.macroenabled.12", 951 + "application/vnd.ms-powerpoint.template.macroenabled.12", 952 + "application/vnd.ms-powerpoint.presentation.macroenabled.12", 953 + "application/java-archive", 954 + "application/vnd.rn-realmedia", 955 + "application/x-spss-sav", 956 + "application/x-ms-regedit", 957 + "application/x-ft-windows-registry-hive", 958 + "application/x-jmp-data" 959 + ]; 960 + 961 + // ../node_modules/.deno/file-type@21.3.0/node_modules/file-type/core.js 962 + var reasonableDetectionSizeInBytes = 4100; 963 + async function fileTypeFromBuffer(input, options) { 964 + return new FileTypeParser(options).fromBuffer(input); 965 + } 966 + __name(fileTypeFromBuffer, "fileTypeFromBuffer"); 967 + function getFileTypeFromMimeType(mimeType) { 968 + mimeType = mimeType.toLowerCase(); 969 + switch (mimeType) { 970 + case "application/epub+zip": 971 + return { 972 + ext: "epub", 973 + mime: mimeType 974 + }; 975 + case "application/vnd.oasis.opendocument.text": 976 + return { 977 + ext: "odt", 978 + mime: mimeType 979 + }; 980 + case "application/vnd.oasis.opendocument.text-template": 981 + return { 982 + ext: "ott", 983 + mime: mimeType 984 + }; 985 + case "application/vnd.oasis.opendocument.spreadsheet": 986 + return { 987 + ext: "ods", 988 + mime: mimeType 989 + }; 990 + case "application/vnd.oasis.opendocument.spreadsheet-template": 991 + return { 992 + ext: "ots", 993 + mime: mimeType 994 + }; 995 + case "application/vnd.oasis.opendocument.presentation": 996 + return { 997 + ext: "odp", 998 + mime: mimeType 999 + }; 1000 + case "application/vnd.oasis.opendocument.presentation-template": 1001 + return { 1002 + ext: "otp", 1003 + mime: mimeType 1004 + }; 1005 + case "application/vnd.oasis.opendocument.graphics": 1006 + return { 1007 + ext: "odg", 1008 + mime: mimeType 1009 + }; 1010 + case "application/vnd.oasis.opendocument.graphics-template": 1011 + return { 1012 + ext: "otg", 1013 + mime: mimeType 1014 + }; 1015 + case "application/vnd.openxmlformats-officedocument.presentationml.slideshow": 1016 + return { 1017 + ext: "ppsx", 1018 + mime: mimeType 1019 + }; 1020 + case "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": 1021 + return { 1022 + ext: "xlsx", 1023 + mime: mimeType 1024 + }; 1025 + case "application/vnd.ms-excel.sheet.macroenabled": 1026 + return { 1027 + ext: "xlsm", 1028 + mime: "application/vnd.ms-excel.sheet.macroenabled.12" 1029 + }; 1030 + case "application/vnd.openxmlformats-officedocument.spreadsheetml.template": 1031 + return { 1032 + ext: "xltx", 1033 + mime: mimeType 1034 + }; 1035 + case "application/vnd.ms-excel.template.macroenabled": 1036 + return { 1037 + ext: "xltm", 1038 + mime: "application/vnd.ms-excel.template.macroenabled.12" 1039 + }; 1040 + case "application/vnd.ms-powerpoint.slideshow.macroenabled": 1041 + return { 1042 + ext: "ppsm", 1043 + mime: "application/vnd.ms-powerpoint.slideshow.macroenabled.12" 1044 + }; 1045 + case "application/vnd.openxmlformats-officedocument.wordprocessingml.document": 1046 + return { 1047 + ext: "docx", 1048 + mime: mimeType 1049 + }; 1050 + case "application/vnd.ms-word.document.macroenabled": 1051 + return { 1052 + ext: "docm", 1053 + mime: "application/vnd.ms-word.document.macroenabled.12" 1054 + }; 1055 + case "application/vnd.openxmlformats-officedocument.wordprocessingml.template": 1056 + return { 1057 + ext: "dotx", 1058 + mime: mimeType 1059 + }; 1060 + case "application/vnd.ms-word.template.macroenabledtemplate": 1061 + return { 1062 + ext: "dotm", 1063 + mime: "application/vnd.ms-word.template.macroenabled.12" 1064 + }; 1065 + case "application/vnd.openxmlformats-officedocument.presentationml.template": 1066 + return { 1067 + ext: "potx", 1068 + mime: mimeType 1069 + }; 1070 + case "application/vnd.ms-powerpoint.template.macroenabled": 1071 + return { 1072 + ext: "potm", 1073 + mime: "application/vnd.ms-powerpoint.template.macroenabled.12" 1074 + }; 1075 + case "application/vnd.openxmlformats-officedocument.presentationml.presentation": 1076 + return { 1077 + ext: "pptx", 1078 + mime: mimeType 1079 + }; 1080 + case "application/vnd.ms-powerpoint.presentation.macroenabled": 1081 + return { 1082 + ext: "pptm", 1083 + mime: "application/vnd.ms-powerpoint.presentation.macroenabled.12" 1084 + }; 1085 + case "application/vnd.ms-visio.drawing": 1086 + return { 1087 + ext: "vsdx", 1088 + mime: "application/vnd.visio" 1089 + }; 1090 + case "application/vnd.ms-package.3dmanufacturing-3dmodel+xml": 1091 + return { 1092 + ext: "3mf", 1093 + mime: "model/3mf" 1094 + }; 1095 + default: 1096 + } 1097 + } 1098 + __name(getFileTypeFromMimeType, "getFileTypeFromMimeType"); 1099 + function _check(buffer, headers, options) { 1100 + options = { 1101 + offset: 0, 1102 + ...options 1103 + }; 1104 + for (const [index, header] of headers.entries()) { 1105 + if (options.mask) { 1106 + if (header !== (options.mask[index] & buffer[index + options.offset])) { 1107 + return false; 1108 + } 1109 + } else if (header !== buffer[index + options.offset]) { 1110 + return false; 1111 + } 1112 + } 1113 + return true; 1114 + } 1115 + __name(_check, "_check"); 1116 + var FileTypeParser = class { 1117 + static { 1118 + __name(this, "FileTypeParser"); 1119 + } 1120 + constructor(options) { 1121 + this.options = { 1122 + mpegOffsetTolerance: 0, 1123 + ...options 1124 + }; 1125 + this.detectors = [ 1126 + ...options?.customDetectors ?? [], 1127 + { id: "core", detect: this.detectConfident }, 1128 + { id: "core.imprecise", detect: this.detectImprecise } 1129 + ]; 1130 + this.tokenizerOptions = { 1131 + abortSignal: options?.signal 1132 + }; 1133 + } 1134 + async fromTokenizer(tokenizer3) { 1135 + const initialPosition = tokenizer3.position; 1136 + for (const detector of this.detectors) { 1137 + const fileType = await detector.detect(tokenizer3); 1138 + if (fileType) { 1139 + return fileType; 1140 + } 1141 + if (initialPosition !== tokenizer3.position) { 1142 + return void 0; 1143 + } 1144 + } 1145 + } 1146 + async fromBuffer(input) { 1147 + if (!(input instanceof Uint8Array || input instanceof ArrayBuffer)) { 1148 + throw new TypeError(`Expected the \`input\` argument to be of type \`Uint8Array\` or \`ArrayBuffer\`, got \`${typeof input}\``); 1149 + } 1150 + const buffer = input instanceof Uint8Array ? input : new Uint8Array(input); 1151 + if (!(buffer?.length > 1)) { 1152 + return; 1153 + } 1154 + return this.fromTokenizer(fromBuffer(buffer, this.tokenizerOptions)); 1155 + } 1156 + async fromBlob(blob) { 1157 + const tokenizer3 = fromBlob(blob, this.tokenizerOptions); 1158 + try { 1159 + return await this.fromTokenizer(tokenizer3); 1160 + } finally { 1161 + await tokenizer3.close(); 1162 + } 1163 + } 1164 + async fromStream(stream) { 1165 + const tokenizer3 = fromWebStream(stream, this.tokenizerOptions); 1166 + try { 1167 + return await this.fromTokenizer(tokenizer3); 1168 + } finally { 1169 + await tokenizer3.close(); 1170 + } 1171 + } 1172 + async toDetectionStream(stream, options) { 1173 + const { sampleSize = reasonableDetectionSizeInBytes } = options; 1174 + let detectedFileType; 1175 + let firstChunk; 1176 + const reader = stream.getReader({ mode: "byob" }); 1177 + try { 1178 + const { value: chunk, done } = await reader.read(new Uint8Array(sampleSize)); 1179 + firstChunk = chunk; 1180 + if (!done && chunk) { 1181 + try { 1182 + detectedFileType = await this.fromBuffer(chunk.subarray(0, sampleSize)); 1183 + } catch (error) { 1184 + if (!(error instanceof EndOfStreamError)) { 1185 + throw error; 1186 + } 1187 + detectedFileType = void 0; 1188 + } 1189 + } 1190 + firstChunk = chunk; 1191 + } finally { 1192 + reader.releaseLock(); 1193 + } 1194 + const transformStream = new TransformStream({ 1195 + async start(controller) { 1196 + controller.enqueue(firstChunk); 1197 + }, 1198 + transform(chunk, controller) { 1199 + controller.enqueue(chunk); 1200 + } 1201 + }); 1202 + const newStream = stream.pipeThrough(transformStream); 1203 + newStream.fileType = detectedFileType; 1204 + return newStream; 1205 + } 1206 + check(header, options) { 1207 + return _check(this.buffer, header, options); 1208 + } 1209 + checkString(header, options) { 1210 + return this.check(stringToBytes(header, options?.encoding), options); 1211 + } 1212 + // Detections with a high degree of certainty in identifying the correct file type 1213 + detectConfident = /* @__PURE__ */ __name(async (tokenizer3) => { 1214 + this.buffer = new Uint8Array(reasonableDetectionSizeInBytes); 1215 + if (tokenizer3.fileInfo.size === void 0) { 1216 + tokenizer3.fileInfo.size = Number.MAX_SAFE_INTEGER; 1217 + } 1218 + this.tokenizer = tokenizer3; 1219 + await tokenizer3.peekBuffer(this.buffer, { length: 32, mayBeLess: true }); 1220 + if (this.check([66, 77])) { 1221 + return { 1222 + ext: "bmp", 1223 + mime: "image/bmp" 1224 + }; 1225 + } 1226 + if (this.check([11, 119])) { 1227 + return { 1228 + ext: "ac3", 1229 + mime: "audio/vnd.dolby.dd-raw" 1230 + }; 1231 + } 1232 + if (this.check([120, 1])) { 1233 + return { 1234 + ext: "dmg", 1235 + mime: "application/x-apple-diskimage" 1236 + }; 1237 + } 1238 + if (this.check([77, 90])) { 1239 + return { 1240 + ext: "exe", 1241 + mime: "application/x-msdownload" 1242 + }; 1243 + } 1244 + if (this.check([37, 33])) { 1245 + await tokenizer3.peekBuffer(this.buffer, { length: 24, mayBeLess: true }); 1246 + if (this.checkString("PS-Adobe-", { offset: 2 }) && this.checkString(" EPSF-", { offset: 14 })) { 1247 + return { 1248 + ext: "eps", 1249 + mime: "application/eps" 1250 + }; 1251 + } 1252 + return { 1253 + ext: "ps", 1254 + mime: "application/postscript" 1255 + }; 1256 + } 1257 + if (this.check([31, 160]) || this.check([31, 157])) { 1258 + return { 1259 + ext: "Z", 1260 + mime: "application/x-compress" 1261 + }; 1262 + } 1263 + if (this.check([199, 113])) { 1264 + return { 1265 + ext: "cpio", 1266 + mime: "application/x-cpio" 1267 + }; 1268 + } 1269 + if (this.check([96, 234])) { 1270 + return { 1271 + ext: "arj", 1272 + mime: "application/x-arj" 1273 + }; 1274 + } 1275 + if (this.check([239, 187, 191])) { 1276 + this.tokenizer.ignore(3); 1277 + return this.detectConfident(tokenizer3); 1278 + } 1279 + if (this.check([71, 73, 70])) { 1280 + return { 1281 + ext: "gif", 1282 + mime: "image/gif" 1283 + }; 1284 + } 1285 + if (this.check([73, 73, 188])) { 1286 + return { 1287 + ext: "jxr", 1288 + mime: "image/vnd.ms-photo" 1289 + }; 1290 + } 1291 + if (this.check([31, 139, 8])) { 1292 + const gzipHandler = new GzipHandler(tokenizer3); 1293 + const stream = gzipHandler.inflate(); 1294 + let shouldCancelStream = true; 1295 + try { 1296 + let compressedFileType; 1297 + try { 1298 + compressedFileType = await this.fromStream(stream); 1299 + } catch { 1300 + shouldCancelStream = false; 1301 + } 1302 + if (compressedFileType && compressedFileType.ext === "tar") { 1303 + return { 1304 + ext: "tar.gz", 1305 + mime: "application/gzip" 1306 + }; 1307 + } 1308 + } finally { 1309 + if (shouldCancelStream) { 1310 + await stream.cancel(); 1311 + } 1312 + } 1313 + return { 1314 + ext: "gz", 1315 + mime: "application/gzip" 1316 + }; 1317 + } 1318 + if (this.check([66, 90, 104])) { 1319 + return { 1320 + ext: "bz2", 1321 + mime: "application/x-bzip2" 1322 + }; 1323 + } 1324 + if (this.checkString("ID3")) { 1325 + await tokenizer3.ignore(6); 1326 + const id3HeaderLength = await tokenizer3.readToken(uint32SyncSafeToken); 1327 + if (tokenizer3.position + id3HeaderLength > tokenizer3.fileInfo.size) { 1328 + return { 1329 + ext: "mp3", 1330 + mime: "audio/mpeg" 1331 + }; 1332 + } 1333 + await tokenizer3.ignore(id3HeaderLength); 1334 + return this.fromTokenizer(tokenizer3); 1335 + } 1336 + if (this.checkString("MP+")) { 1337 + return { 1338 + ext: "mpc", 1339 + mime: "audio/x-musepack" 1340 + }; 1341 + } 1342 + if ((this.buffer[0] === 67 || this.buffer[0] === 70) && this.check([87, 83], { offset: 1 })) { 1343 + return { 1344 + ext: "swf", 1345 + mime: "application/x-shockwave-flash" 1346 + }; 1347 + } 1348 + if (this.check([255, 216, 255])) { 1349 + if (this.check([247], { offset: 3 })) { 1350 + return { 1351 + ext: "jls", 1352 + mime: "image/jls" 1353 + }; 1354 + } 1355 + return { 1356 + ext: "jpg", 1357 + mime: "image/jpeg" 1358 + }; 1359 + } 1360 + if (this.check([79, 98, 106, 1])) { 1361 + return { 1362 + ext: "avro", 1363 + mime: "application/avro" 1364 + }; 1365 + } 1366 + if (this.checkString("FLIF")) { 1367 + return { 1368 + ext: "flif", 1369 + mime: "image/flif" 1370 + }; 1371 + } 1372 + if (this.checkString("8BPS")) { 1373 + return { 1374 + ext: "psd", 1375 + mime: "image/vnd.adobe.photoshop" 1376 + }; 1377 + } 1378 + if (this.checkString("MPCK")) { 1379 + return { 1380 + ext: "mpc", 1381 + mime: "audio/x-musepack" 1382 + }; 1383 + } 1384 + if (this.checkString("FORM")) { 1385 + return { 1386 + ext: "aif", 1387 + mime: "audio/aiff" 1388 + }; 1389 + } 1390 + if (this.checkString("icns", { offset: 0 })) { 1391 + return { 1392 + ext: "icns", 1393 + mime: "image/icns" 1394 + }; 1395 + } 1396 + if (this.check([80, 75, 3, 4])) { 1397 + let fileType; 1398 + await new ZipHandler(tokenizer3).unzip((zipHeader) => { 1399 + switch (zipHeader.filename) { 1400 + case "META-INF/mozilla.rsa": 1401 + fileType = { 1402 + ext: "xpi", 1403 + mime: "application/x-xpinstall" 1404 + }; 1405 + return { 1406 + stop: true 1407 + }; 1408 + case "META-INF/MANIFEST.MF": 1409 + fileType = { 1410 + ext: "jar", 1411 + mime: "application/java-archive" 1412 + }; 1413 + return { 1414 + stop: true 1415 + }; 1416 + case "mimetype": 1417 + return { 1418 + async handler(fileData) { 1419 + const mimeType = new TextDecoder("utf-8").decode(fileData).trim(); 1420 + fileType = getFileTypeFromMimeType(mimeType); 1421 + }, 1422 + stop: true 1423 + }; 1424 + case "[Content_Types].xml": 1425 + return { 1426 + async handler(fileData) { 1427 + let xmlContent = new TextDecoder("utf-8").decode(fileData); 1428 + const endPos = xmlContent.indexOf('.main+xml"'); 1429 + if (endPos === -1) { 1430 + const mimeType = "application/vnd.ms-package.3dmanufacturing-3dmodel+xml"; 1431 + if (xmlContent.includes(`ContentType="${mimeType}"`)) { 1432 + fileType = getFileTypeFromMimeType(mimeType); 1433 + } 1434 + } else { 1435 + xmlContent = xmlContent.slice(0, Math.max(0, endPos)); 1436 + const firstPos = xmlContent.lastIndexOf('"'); 1437 + const mimeType = xmlContent.slice(Math.max(0, firstPos + 1)); 1438 + fileType = getFileTypeFromMimeType(mimeType); 1439 + } 1440 + }, 1441 + stop: true 1442 + }; 1443 + default: 1444 + if (/classes\d*\.dex/.test(zipHeader.filename)) { 1445 + fileType = { 1446 + ext: "apk", 1447 + mime: "application/vnd.android.package-archive" 1448 + }; 1449 + return { stop: true }; 1450 + } 1451 + return {}; 1452 + } 1453 + }).catch((error) => { 1454 + if (!(error instanceof EndOfStreamError)) { 1455 + throw error; 1456 + } 1457 + }); 1458 + return fileType ?? { 1459 + ext: "zip", 1460 + mime: "application/zip" 1461 + }; 1462 + } 1463 + if (this.checkString("OggS")) { 1464 + await tokenizer3.ignore(28); 1465 + const type = new Uint8Array(8); 1466 + await tokenizer3.readBuffer(type); 1467 + if (_check(type, [79, 112, 117, 115, 72, 101, 97, 100])) { 1468 + return { 1469 + ext: "opus", 1470 + mime: "audio/ogg; codecs=opus" 1471 + }; 1472 + } 1473 + if (_check(type, [128, 116, 104, 101, 111, 114, 97])) { 1474 + return { 1475 + ext: "ogv", 1476 + mime: "video/ogg" 1477 + }; 1478 + } 1479 + if (_check(type, [1, 118, 105, 100, 101, 111, 0])) { 1480 + return { 1481 + ext: "ogm", 1482 + mime: "video/ogg" 1483 + }; 1484 + } 1485 + if (_check(type, [127, 70, 76, 65, 67])) { 1486 + return { 1487 + ext: "oga", 1488 + mime: "audio/ogg" 1489 + }; 1490 + } 1491 + if (_check(type, [83, 112, 101, 101, 120, 32, 32])) { 1492 + return { 1493 + ext: "spx", 1494 + mime: "audio/ogg" 1495 + }; 1496 + } 1497 + if (_check(type, [1, 118, 111, 114, 98, 105, 115])) { 1498 + return { 1499 + ext: "ogg", 1500 + mime: "audio/ogg" 1501 + }; 1502 + } 1503 + return { 1504 + ext: "ogx", 1505 + mime: "application/ogg" 1506 + }; 1507 + } 1508 + if (this.check([80, 75]) && (this.buffer[2] === 3 || this.buffer[2] === 5 || this.buffer[2] === 7) && (this.buffer[3] === 4 || this.buffer[3] === 6 || this.buffer[3] === 8)) { 1509 + return { 1510 + ext: "zip", 1511 + mime: "application/zip" 1512 + }; 1513 + } 1514 + if (this.checkString("MThd")) { 1515 + return { 1516 + ext: "mid", 1517 + mime: "audio/midi" 1518 + }; 1519 + } 1520 + if (this.checkString("wOFF") && (this.check([0, 1, 0, 0], { offset: 4 }) || this.checkString("OTTO", { offset: 4 }))) { 1521 + return { 1522 + ext: "woff", 1523 + mime: "font/woff" 1524 + }; 1525 + } 1526 + if (this.checkString("wOF2") && (this.check([0, 1, 0, 0], { offset: 4 }) || this.checkString("OTTO", { offset: 4 }))) { 1527 + return { 1528 + ext: "woff2", 1529 + mime: "font/woff2" 1530 + }; 1531 + } 1532 + if (this.check([212, 195, 178, 161]) || this.check([161, 178, 195, 212])) { 1533 + return { 1534 + ext: "pcap", 1535 + mime: "application/vnd.tcpdump.pcap" 1536 + }; 1537 + } 1538 + if (this.checkString("DSD ")) { 1539 + return { 1540 + ext: "dsf", 1541 + mime: "audio/x-dsf" 1542 + // Non-standard 1543 + }; 1544 + } 1545 + if (this.checkString("LZIP")) { 1546 + return { 1547 + ext: "lz", 1548 + mime: "application/x-lzip" 1549 + }; 1550 + } 1551 + if (this.checkString("fLaC")) { 1552 + return { 1553 + ext: "flac", 1554 + mime: "audio/flac" 1555 + }; 1556 + } 1557 + if (this.check([66, 80, 71, 251])) { 1558 + return { 1559 + ext: "bpg", 1560 + mime: "image/bpg" 1561 + }; 1562 + } 1563 + if (this.checkString("wvpk")) { 1564 + return { 1565 + ext: "wv", 1566 + mime: "audio/wavpack" 1567 + }; 1568 + } 1569 + if (this.checkString("%PDF")) { 1570 + return { 1571 + ext: "pdf", 1572 + mime: "application/pdf" 1573 + }; 1574 + } 1575 + if (this.check([0, 97, 115, 109])) { 1576 + return { 1577 + ext: "wasm", 1578 + mime: "application/wasm" 1579 + }; 1580 + } 1581 + if (this.check([73, 73])) { 1582 + const fileType = await this.readTiffHeader(false); 1583 + if (fileType) { 1584 + return fileType; 1585 + } 1586 + } 1587 + if (this.check([77, 77])) { 1588 + const fileType = await this.readTiffHeader(true); 1589 + if (fileType) { 1590 + return fileType; 1591 + } 1592 + } 1593 + if (this.checkString("MAC ")) { 1594 + return { 1595 + ext: "ape", 1596 + mime: "audio/ape" 1597 + }; 1598 + } 1599 + if (this.check([26, 69, 223, 163])) { 1600 + async function readField() { 1601 + const msb = await tokenizer3.peekNumber(UINT8); 1602 + let mask = 128; 1603 + let ic = 0; 1604 + while ((msb & mask) === 0 && mask !== 0) { 1605 + ++ic; 1606 + mask >>= 1; 1607 + } 1608 + const id = new Uint8Array(ic + 1); 1609 + await tokenizer3.readBuffer(id); 1610 + return id; 1611 + } 1612 + __name(readField, "readField"); 1613 + async function readElement() { 1614 + const idField = await readField(); 1615 + const lengthField = await readField(); 1616 + lengthField[0] ^= 128 >> lengthField.length - 1; 1617 + const nrLength = Math.min(6, lengthField.length); 1618 + const idView = new DataView(idField.buffer); 1619 + const lengthView = new DataView(lengthField.buffer, lengthField.length - nrLength, nrLength); 1620 + return { 1621 + id: getUintBE(idView), 1622 + len: getUintBE(lengthView) 1623 + }; 1624 + } 1625 + __name(readElement, "readElement"); 1626 + async function readChildren(children) { 1627 + while (children > 0) { 1628 + const element = await readElement(); 1629 + if (element.id === 17026) { 1630 + const rawValue = await tokenizer3.readToken(new StringType(element.len)); 1631 + return rawValue.replaceAll(/\00.*$/g, ""); 1632 + } 1633 + await tokenizer3.ignore(element.len); 1634 + --children; 1635 + } 1636 + } 1637 + __name(readChildren, "readChildren"); 1638 + const re = await readElement(); 1639 + const documentType = await readChildren(re.len); 1640 + switch (documentType) { 1641 + case "webm": 1642 + return { 1643 + ext: "webm", 1644 + mime: "video/webm" 1645 + }; 1646 + case "matroska": 1647 + return { 1648 + ext: "mkv", 1649 + mime: "video/matroska" 1650 + }; 1651 + default: 1652 + return; 1653 + } 1654 + } 1655 + if (this.checkString("SQLi")) { 1656 + return { 1657 + ext: "sqlite", 1658 + mime: "application/x-sqlite3" 1659 + }; 1660 + } 1661 + if (this.check([78, 69, 83, 26])) { 1662 + return { 1663 + ext: "nes", 1664 + mime: "application/x-nintendo-nes-rom" 1665 + }; 1666 + } 1667 + if (this.checkString("Cr24")) { 1668 + return { 1669 + ext: "crx", 1670 + mime: "application/x-google-chrome-extension" 1671 + }; 1672 + } 1673 + if (this.checkString("MSCF") || this.checkString("ISc(")) { 1674 + return { 1675 + ext: "cab", 1676 + mime: "application/vnd.ms-cab-compressed" 1677 + }; 1678 + } 1679 + if (this.check([237, 171, 238, 219])) { 1680 + return { 1681 + ext: "rpm", 1682 + mime: "application/x-rpm" 1683 + }; 1684 + } 1685 + if (this.check([197, 208, 211, 198])) { 1686 + return { 1687 + ext: "eps", 1688 + mime: "application/eps" 1689 + }; 1690 + } 1691 + if (this.check([40, 181, 47, 253])) { 1692 + return { 1693 + ext: "zst", 1694 + mime: "application/zstd" 1695 + }; 1696 + } 1697 + if (this.check([127, 69, 76, 70])) { 1698 + return { 1699 + ext: "elf", 1700 + mime: "application/x-elf" 1701 + }; 1702 + } 1703 + if (this.check([33, 66, 68, 78])) { 1704 + return { 1705 + ext: "pst", 1706 + mime: "application/vnd.ms-outlook" 1707 + }; 1708 + } 1709 + if (this.checkString("PAR1") || this.checkString("PARE")) { 1710 + return { 1711 + ext: "parquet", 1712 + mime: "application/vnd.apache.parquet" 1713 + }; 1714 + } 1715 + if (this.checkString("ttcf")) { 1716 + return { 1717 + ext: "ttc", 1718 + mime: "font/collection" 1719 + }; 1720 + } 1721 + if (this.check([254, 237, 250, 206]) || this.check([254, 237, 250, 207]) || this.check([206, 250, 237, 254]) || this.check([207, 250, 237, 254])) { 1722 + return { 1723 + ext: "macho", 1724 + mime: "application/x-mach-binary" 1725 + }; 1726 + } 1727 + if (this.check([4, 34, 77, 24])) { 1728 + return { 1729 + ext: "lz4", 1730 + mime: "application/x-lz4" 1731 + // Invented by us 1732 + }; 1733 + } 1734 + if (this.checkString("regf")) { 1735 + return { 1736 + ext: "dat", 1737 + mime: "application/x-ft-windows-registry-hive" 1738 + }; 1739 + } 1740 + if (this.checkString("$FL2") || this.checkString("$FL3")) { 1741 + return { 1742 + ext: "sav", 1743 + mime: "application/x-spss-sav" 1744 + }; 1745 + } 1746 + if (this.check([79, 84, 84, 79, 0])) { 1747 + return { 1748 + ext: "otf", 1749 + mime: "font/otf" 1750 + }; 1751 + } 1752 + if (this.checkString("#!AMR")) { 1753 + return { 1754 + ext: "amr", 1755 + mime: "audio/amr" 1756 + }; 1757 + } 1758 + if (this.checkString("{\\rtf")) { 1759 + return { 1760 + ext: "rtf", 1761 + mime: "application/rtf" 1762 + }; 1763 + } 1764 + if (this.check([70, 76, 86, 1])) { 1765 + return { 1766 + ext: "flv", 1767 + mime: "video/x-flv" 1768 + }; 1769 + } 1770 + if (this.checkString("IMPM")) { 1771 + return { 1772 + ext: "it", 1773 + mime: "audio/x-it" 1774 + }; 1775 + } 1776 + if (this.checkString("-lh0-", { offset: 2 }) || this.checkString("-lh1-", { offset: 2 }) || this.checkString("-lh2-", { offset: 2 }) || this.checkString("-lh3-", { offset: 2 }) || this.checkString("-lh4-", { offset: 2 }) || this.checkString("-lh5-", { offset: 2 }) || this.checkString("-lh6-", { offset: 2 }) || this.checkString("-lh7-", { offset: 2 }) || this.checkString("-lzs-", { offset: 2 }) || this.checkString("-lz4-", { offset: 2 }) || this.checkString("-lz5-", { offset: 2 }) || this.checkString("-lhd-", { offset: 2 })) { 1777 + return { 1778 + ext: "lzh", 1779 + mime: "application/x-lzh-compressed" 1780 + }; 1781 + } 1782 + if (this.check([0, 0, 1, 186])) { 1783 + if (this.check([33], { offset: 4, mask: [241] })) { 1784 + return { 1785 + ext: "mpg", 1786 + // May also be .ps, .mpeg 1787 + mime: "video/MP1S" 1788 + }; 1789 + } 1790 + if (this.check([68], { offset: 4, mask: [196] })) { 1791 + return { 1792 + ext: "mpg", 1793 + // May also be .mpg, .m2p, .vob or .sub 1794 + mime: "video/MP2P" 1795 + }; 1796 + } 1797 + } 1798 + if (this.checkString("ITSF")) { 1799 + return { 1800 + ext: "chm", 1801 + mime: "application/vnd.ms-htmlhelp" 1802 + }; 1803 + } 1804 + if (this.check([202, 254, 186, 190])) { 1805 + const machOArchitectureCount = UINT32_BE.get(this.buffer, 4); 1806 + const javaClassFileMajorVersion = UINT16_BE.get(this.buffer, 6); 1807 + if (machOArchitectureCount > 0 && machOArchitectureCount <= 30) { 1808 + return { 1809 + ext: "macho", 1810 + mime: "application/x-mach-binary" 1811 + }; 1812 + } 1813 + if (javaClassFileMajorVersion > 30) { 1814 + return { 1815 + ext: "class", 1816 + mime: "application/java-vm" 1817 + }; 1818 + } 1819 + } 1820 + if (this.checkString(".RMF")) { 1821 + return { 1822 + ext: "rm", 1823 + mime: "application/vnd.rn-realmedia" 1824 + }; 1825 + } 1826 + if (this.checkString("DRACO")) { 1827 + return { 1828 + ext: "drc", 1829 + mime: "application/vnd.google.draco" 1830 + // Invented by us 1831 + }; 1832 + } 1833 + if (this.check([253, 55, 122, 88, 90, 0])) { 1834 + return { 1835 + ext: "xz", 1836 + mime: "application/x-xz" 1837 + }; 1838 + } 1839 + if (this.checkString("<?xml ")) { 1840 + return { 1841 + ext: "xml", 1842 + mime: "application/xml" 1843 + }; 1844 + } 1845 + if (this.check([55, 122, 188, 175, 39, 28])) { 1846 + return { 1847 + ext: "7z", 1848 + mime: "application/x-7z-compressed" 1849 + }; 1850 + } 1851 + if (this.check([82, 97, 114, 33, 26, 7]) && (this.buffer[6] === 0 || this.buffer[6] === 1)) { 1852 + return { 1853 + ext: "rar", 1854 + mime: "application/x-rar-compressed" 1855 + }; 1856 + } 1857 + if (this.checkString("solid ")) { 1858 + return { 1859 + ext: "stl", 1860 + mime: "model/stl" 1861 + }; 1862 + } 1863 + if (this.checkString("AC")) { 1864 + const version = new StringType(4, "latin1").get(this.buffer, 2); 1865 + if (version.match("^d*") && version >= 1e3 && version <= 1050) { 1866 + return { 1867 + ext: "dwg", 1868 + mime: "image/vnd.dwg" 1869 + }; 1870 + } 1871 + } 1872 + if (this.checkString("070707")) { 1873 + return { 1874 + ext: "cpio", 1875 + mime: "application/x-cpio" 1876 + }; 1877 + } 1878 + if (this.checkString("BLENDER")) { 1879 + return { 1880 + ext: "blend", 1881 + mime: "application/x-blender" 1882 + }; 1883 + } 1884 + if (this.checkString("!<arch>")) { 1885 + await tokenizer3.ignore(8); 1886 + const string = await tokenizer3.readToken(new StringType(13, "ascii")); 1887 + if (string === "debian-binary") { 1888 + return { 1889 + ext: "deb", 1890 + mime: "application/x-deb" 1891 + }; 1892 + } 1893 + return { 1894 + ext: "ar", 1895 + mime: "application/x-unix-archive" 1896 + }; 1897 + } 1898 + if (this.checkString("WEBVTT") && // One of LF, CR, tab, space, or end of file must follow "WEBVTT" per the spec (see `fixture/fixture-vtt-*.vtt` for examples). Note that `\0` is technically the null character (there is no such thing as an EOF character). However, checking for `\0` gives us the same result as checking for the end of the stream. 1899 + ["\n", "\r", " ", " ", "\0"].some((char7) => this.checkString(char7, { offset: 6 }))) { 1900 + return { 1901 + ext: "vtt", 1902 + mime: "text/vtt" 1903 + }; 1904 + } 1905 + if (this.check([137, 80, 78, 71, 13, 10, 26, 10])) { 1906 + await tokenizer3.ignore(8); 1907 + async function readChunkHeader() { 1908 + return { 1909 + length: await tokenizer3.readToken(INT32_BE), 1910 + type: await tokenizer3.readToken(new StringType(4, "latin1")) 1911 + }; 1912 + } 1913 + __name(readChunkHeader, "readChunkHeader"); 1914 + do { 1915 + const chunk = await readChunkHeader(); 1916 + if (chunk.length < 0) { 1917 + return; 1918 + } 1919 + switch (chunk.type) { 1920 + case "IDAT": 1921 + return { 1922 + ext: "png", 1923 + mime: "image/png" 1924 + }; 1925 + case "acTL": 1926 + return { 1927 + ext: "apng", 1928 + mime: "image/apng" 1929 + }; 1930 + default: 1931 + await tokenizer3.ignore(chunk.length + 4); 1932 + } 1933 + } while (tokenizer3.position + 8 < tokenizer3.fileInfo.size); 1934 + return { 1935 + ext: "png", 1936 + mime: "image/png" 1937 + }; 1938 + } 1939 + if (this.check([65, 82, 82, 79, 87, 49, 0, 0])) { 1940 + return { 1941 + ext: "arrow", 1942 + mime: "application/vnd.apache.arrow.file" 1943 + }; 1944 + } 1945 + if (this.check([103, 108, 84, 70, 2, 0, 0, 0])) { 1946 + return { 1947 + ext: "glb", 1948 + mime: "model/gltf-binary" 1949 + }; 1950 + } 1951 + if (this.check([102, 114, 101, 101], { offset: 4 }) || this.check([109, 100, 97, 116], { offset: 4 }) || this.check([109, 111, 111, 118], { offset: 4 }) || this.check([119, 105, 100, 101], { offset: 4 })) { 1952 + return { 1953 + ext: "mov", 1954 + mime: "video/quicktime" 1955 + }; 1956 + } 1957 + if (this.check([73, 73, 82, 79, 8, 0, 0, 0, 24])) { 1958 + return { 1959 + ext: "orf", 1960 + mime: "image/x-olympus-orf" 1961 + }; 1962 + } 1963 + if (this.checkString("gimp xcf ")) { 1964 + return { 1965 + ext: "xcf", 1966 + mime: "image/x-xcf" 1967 + }; 1968 + } 1969 + if (this.checkString("ftyp", { offset: 4 }) && (this.buffer[8] & 96) !== 0) { 1970 + const brandMajor = new StringType(4, "latin1").get(this.buffer, 8).replace("\0", " ").trim(); 1971 + switch (brandMajor) { 1972 + case "avif": 1973 + case "avis": 1974 + return { ext: "avif", mime: "image/avif" }; 1975 + case "mif1": 1976 + return { ext: "heic", mime: "image/heif" }; 1977 + case "msf1": 1978 + return { ext: "heic", mime: "image/heif-sequence" }; 1979 + case "heic": 1980 + case "heix": 1981 + return { ext: "heic", mime: "image/heic" }; 1982 + case "hevc": 1983 + case "hevx": 1984 + return { ext: "heic", mime: "image/heic-sequence" }; 1985 + case "qt": 1986 + return { ext: "mov", mime: "video/quicktime" }; 1987 + case "M4V": 1988 + case "M4VH": 1989 + case "M4VP": 1990 + return { ext: "m4v", mime: "video/x-m4v" }; 1991 + case "M4P": 1992 + return { ext: "m4p", mime: "video/mp4" }; 1993 + case "M4B": 1994 + return { ext: "m4b", mime: "audio/mp4" }; 1995 + case "M4A": 1996 + return { ext: "m4a", mime: "audio/x-m4a" }; 1997 + case "F4V": 1998 + return { ext: "f4v", mime: "video/mp4" }; 1999 + case "F4P": 2000 + return { ext: "f4p", mime: "video/mp4" }; 2001 + case "F4A": 2002 + return { ext: "f4a", mime: "audio/mp4" }; 2003 + case "F4B": 2004 + return { ext: "f4b", mime: "audio/mp4" }; 2005 + case "crx": 2006 + return { ext: "cr3", mime: "image/x-canon-cr3" }; 2007 + default: 2008 + if (brandMajor.startsWith("3g")) { 2009 + if (brandMajor.startsWith("3g2")) { 2010 + return { ext: "3g2", mime: "video/3gpp2" }; 2011 + } 2012 + return { ext: "3gp", mime: "video/3gpp" }; 2013 + } 2014 + return { ext: "mp4", mime: "video/mp4" }; 2015 + } 2016 + } 2017 + if (this.checkString("REGEDIT4\r\n")) { 2018 + return { 2019 + ext: "reg", 2020 + mime: "application/x-ms-regedit" 2021 + }; 2022 + } 2023 + if (this.check([82, 73, 70, 70])) { 2024 + if (this.checkString("WEBP", { offset: 8 })) { 2025 + return { 2026 + ext: "webp", 2027 + mime: "image/webp" 2028 + }; 2029 + } 2030 + if (this.check([65, 86, 73], { offset: 8 })) { 2031 + return { 2032 + ext: "avi", 2033 + mime: "video/vnd.avi" 2034 + }; 2035 + } 2036 + if (this.check([87, 65, 86, 69], { offset: 8 })) { 2037 + return { 2038 + ext: "wav", 2039 + mime: "audio/wav" 2040 + }; 2041 + } 2042 + if (this.check([81, 76, 67, 77], { offset: 8 })) { 2043 + return { 2044 + ext: "qcp", 2045 + mime: "audio/qcelp" 2046 + }; 2047 + } 2048 + } 2049 + if (this.check([73, 73, 85, 0, 24, 0, 0, 0, 136, 231, 116, 216])) { 2050 + return { 2051 + ext: "rw2", 2052 + mime: "image/x-panasonic-rw2" 2053 + }; 2054 + } 2055 + if (this.check([48, 38, 178, 117, 142, 102, 207, 17, 166, 217])) { 2056 + async function readHeader() { 2057 + const guid = new Uint8Array(16); 2058 + await tokenizer3.readBuffer(guid); 2059 + return { 2060 + id: guid, 2061 + size: Number(await tokenizer3.readToken(UINT64_LE)) 2062 + }; 2063 + } 2064 + __name(readHeader, "readHeader"); 2065 + await tokenizer3.ignore(30); 2066 + while (tokenizer3.position + 24 < tokenizer3.fileInfo.size) { 2067 + const header = await readHeader(); 2068 + let payload = header.size - 24; 2069 + if (_check(header.id, [145, 7, 220, 183, 183, 169, 207, 17, 142, 230, 0, 192, 12, 32, 83, 101])) { 2070 + const typeId = new Uint8Array(16); 2071 + payload -= await tokenizer3.readBuffer(typeId); 2072 + if (_check(typeId, [64, 158, 105, 248, 77, 91, 207, 17, 168, 253, 0, 128, 95, 92, 68, 43])) { 2073 + return { 2074 + ext: "asf", 2075 + mime: "audio/x-ms-asf" 2076 + }; 2077 + } 2078 + if (_check(typeId, [192, 239, 25, 188, 77, 91, 207, 17, 168, 253, 0, 128, 95, 92, 68, 43])) { 2079 + return { 2080 + ext: "asf", 2081 + mime: "video/x-ms-asf" 2082 + }; 2083 + } 2084 + break; 2085 + } 2086 + await tokenizer3.ignore(payload); 2087 + } 2088 + return { 2089 + ext: "asf", 2090 + mime: "application/vnd.ms-asf" 2091 + }; 2092 + } 2093 + if (this.check([171, 75, 84, 88, 32, 49, 49, 187, 13, 10, 26, 10])) { 2094 + return { 2095 + ext: "ktx", 2096 + mime: "image/ktx" 2097 + }; 2098 + } 2099 + if ((this.check([126, 16, 4]) || this.check([126, 24, 4])) && this.check([48, 77, 73, 69], { offset: 4 })) { 2100 + return { 2101 + ext: "mie", 2102 + mime: "application/x-mie" 2103 + }; 2104 + } 2105 + if (this.check([39, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], { offset: 2 })) { 2106 + return { 2107 + ext: "shp", 2108 + mime: "application/x-esri-shape" 2109 + }; 2110 + } 2111 + if (this.check([255, 79, 255, 81])) { 2112 + return { 2113 + ext: "j2c", 2114 + mime: "image/j2c" 2115 + }; 2116 + } 2117 + if (this.check([0, 0, 0, 12, 106, 80, 32, 32, 13, 10, 135, 10])) { 2118 + await tokenizer3.ignore(20); 2119 + const type = await tokenizer3.readToken(new StringType(4, "ascii")); 2120 + switch (type) { 2121 + case "jp2 ": 2122 + return { 2123 + ext: "jp2", 2124 + mime: "image/jp2" 2125 + }; 2126 + case "jpx ": 2127 + return { 2128 + ext: "jpx", 2129 + mime: "image/jpx" 2130 + }; 2131 + case "jpm ": 2132 + return { 2133 + ext: "jpm", 2134 + mime: "image/jpm" 2135 + }; 2136 + case "mjp2": 2137 + return { 2138 + ext: "mj2", 2139 + mime: "image/mj2" 2140 + }; 2141 + default: 2142 + return; 2143 + } 2144 + } 2145 + if (this.check([255, 10]) || this.check([0, 0, 0, 12, 74, 88, 76, 32, 13, 10, 135, 10])) { 2146 + return { 2147 + ext: "jxl", 2148 + mime: "image/jxl" 2149 + }; 2150 + } 2151 + if (this.check([254, 255])) { 2152 + if (this.checkString("<?xml ", { offset: 2, encoding: "utf-16be" })) { 2153 + return { 2154 + ext: "xml", 2155 + mime: "application/xml" 2156 + }; 2157 + } 2158 + return void 0; 2159 + } 2160 + if (this.check([208, 207, 17, 224, 161, 177, 26, 225])) { 2161 + return { 2162 + ext: "cfb", 2163 + mime: "application/x-cfb" 2164 + }; 2165 + } 2166 + await tokenizer3.peekBuffer(this.buffer, { length: Math.min(256, tokenizer3.fileInfo.size), mayBeLess: true }); 2167 + if (this.check([97, 99, 115, 112], { offset: 36 })) { 2168 + return { 2169 + ext: "icc", 2170 + mime: "application/vnd.iccprofile" 2171 + }; 2172 + } 2173 + if (this.checkString("**ACE", { offset: 7 }) && this.checkString("**", { offset: 12 })) { 2174 + return { 2175 + ext: "ace", 2176 + mime: "application/x-ace-compressed" 2177 + }; 2178 + } 2179 + if (this.checkString("BEGIN:")) { 2180 + if (this.checkString("VCARD", { offset: 6 })) { 2181 + return { 2182 + ext: "vcf", 2183 + mime: "text/vcard" 2184 + }; 2185 + } 2186 + if (this.checkString("VCALENDAR", { offset: 6 })) { 2187 + return { 2188 + ext: "ics", 2189 + mime: "text/calendar" 2190 + }; 2191 + } 2192 + } 2193 + if (this.checkString("FUJIFILMCCD-RAW")) { 2194 + return { 2195 + ext: "raf", 2196 + mime: "image/x-fujifilm-raf" 2197 + }; 2198 + } 2199 + if (this.checkString("Extended Module:")) { 2200 + return { 2201 + ext: "xm", 2202 + mime: "audio/x-xm" 2203 + }; 2204 + } 2205 + if (this.checkString("Creative Voice File")) { 2206 + return { 2207 + ext: "voc", 2208 + mime: "audio/x-voc" 2209 + }; 2210 + } 2211 + if (this.check([4, 0, 0, 0]) && this.buffer.length >= 16) { 2212 + const jsonSize = new DataView(this.buffer.buffer).getUint32(12, true); 2213 + if (jsonSize > 12 && this.buffer.length >= jsonSize + 16) { 2214 + try { 2215 + const header = new TextDecoder().decode(this.buffer.subarray(16, jsonSize + 16)); 2216 + const json = JSON.parse(header); 2217 + if (json.files) { 2218 + return { 2219 + ext: "asar", 2220 + mime: "application/x-asar" 2221 + }; 2222 + } 2223 + } catch { 2224 + } 2225 + } 2226 + } 2227 + if (this.check([6, 14, 43, 52, 2, 5, 1, 1, 13, 1, 2, 1, 1, 2])) { 2228 + return { 2229 + ext: "mxf", 2230 + mime: "application/mxf" 2231 + }; 2232 + } 2233 + if (this.checkString("SCRM", { offset: 44 })) { 2234 + return { 2235 + ext: "s3m", 2236 + mime: "audio/x-s3m" 2237 + }; 2238 + } 2239 + if (this.check([71]) && this.check([71], { offset: 188 })) { 2240 + return { 2241 + ext: "mts", 2242 + mime: "video/mp2t" 2243 + }; 2244 + } 2245 + if (this.check([71], { offset: 4 }) && this.check([71], { offset: 196 })) { 2246 + return { 2247 + ext: "mts", 2248 + mime: "video/mp2t" 2249 + }; 2250 + } 2251 + if (this.check([66, 79, 79, 75, 77, 79, 66, 73], { offset: 60 })) { 2252 + return { 2253 + ext: "mobi", 2254 + mime: "application/x-mobipocket-ebook" 2255 + }; 2256 + } 2257 + if (this.check([68, 73, 67, 77], { offset: 128 })) { 2258 + return { 2259 + ext: "dcm", 2260 + mime: "application/dicom" 2261 + }; 2262 + } 2263 + if (this.check([76, 0, 0, 0, 1, 20, 2, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70])) { 2264 + return { 2265 + ext: "lnk", 2266 + mime: "application/x.ms.shortcut" 2267 + // Invented by us 2268 + }; 2269 + } 2270 + if (this.check([98, 111, 111, 107, 0, 0, 0, 0, 109, 97, 114, 107, 0, 0, 0, 0])) { 2271 + return { 2272 + ext: "alias", 2273 + mime: "application/x.apple.alias" 2274 + // Invented by us 2275 + }; 2276 + } 2277 + if (this.checkString("Kaydara FBX Binary \0")) { 2278 + return { 2279 + ext: "fbx", 2280 + mime: "application/x.autodesk.fbx" 2281 + // Invented by us 2282 + }; 2283 + } 2284 + if (this.check([76, 80], { offset: 34 }) && (this.check([0, 0, 1], { offset: 8 }) || this.check([1, 0, 2], { offset: 8 }) || this.check([2, 0, 2], { offset: 8 }))) { 2285 + return { 2286 + ext: "eot", 2287 + mime: "application/vnd.ms-fontobject" 2288 + }; 2289 + } 2290 + if (this.check([6, 6, 237, 245, 216, 29, 70, 229, 189, 49, 239, 231, 254, 116, 183, 29])) { 2291 + return { 2292 + ext: "indd", 2293 + mime: "application/x-indesign" 2294 + }; 2295 + } 2296 + if (this.check([255, 255, 0, 0, 7, 0, 0, 0, 4, 0, 0, 0, 1, 0, 1, 0]) || this.check([0, 0, 255, 255, 0, 0, 0, 7, 0, 0, 0, 4, 0, 1, 0, 1])) { 2297 + return { 2298 + ext: "jmp", 2299 + mime: "application/x-jmp-data" 2300 + }; 2301 + } 2302 + await tokenizer3.peekBuffer(this.buffer, { length: Math.min(512, tokenizer3.fileInfo.size), mayBeLess: true }); 2303 + if (this.checkString("ustar", { offset: 257 }) && (this.checkString("\0", { offset: 262 }) || this.checkString(" ", { offset: 262 })) || this.check([0, 0, 0, 0, 0, 0], { offset: 257 }) && tarHeaderChecksumMatches(this.buffer)) { 2304 + return { 2305 + ext: "tar", 2306 + mime: "application/x-tar" 2307 + }; 2308 + } 2309 + if (this.check([255, 254])) { 2310 + const encoding = "utf-16le"; 2311 + if (this.checkString("<?xml ", { offset: 2, encoding })) { 2312 + return { 2313 + ext: "xml", 2314 + mime: "application/xml" 2315 + }; 2316 + } 2317 + if (this.check([255, 14], { offset: 2 }) && this.checkString("SketchUp Model", { offset: 4, encoding })) { 2318 + return { 2319 + ext: "skp", 2320 + mime: "application/vnd.sketchup.skp" 2321 + }; 2322 + } 2323 + if (this.checkString("Windows Registry Editor Version 5.00\r\n", { offset: 2, encoding })) { 2324 + return { 2325 + ext: "reg", 2326 + mime: "application/x-ms-regedit" 2327 + }; 2328 + } 2329 + return void 0; 2330 + } 2331 + if (this.checkString("-----BEGIN PGP MESSAGE-----")) { 2332 + return { 2333 + ext: "pgp", 2334 + mime: "application/pgp-encrypted" 2335 + }; 2336 + } 2337 + }, "detectConfident"); 2338 + // Detections with limited supporting data, resulting in a higher likelihood of false positives 2339 + detectImprecise = /* @__PURE__ */ __name(async (tokenizer3) => { 2340 + this.buffer = new Uint8Array(reasonableDetectionSizeInBytes); 2341 + await tokenizer3.peekBuffer(this.buffer, { length: Math.min(8, tokenizer3.fileInfo.size), mayBeLess: true }); 2342 + if (this.check([0, 0, 1, 186]) || this.check([0, 0, 1, 179])) { 2343 + return { 2344 + ext: "mpg", 2345 + mime: "video/mpeg" 2346 + }; 2347 + } 2348 + if (this.check([0, 1, 0, 0, 0])) { 2349 + return { 2350 + ext: "ttf", 2351 + mime: "font/ttf" 2352 + }; 2353 + } 2354 + if (this.check([0, 0, 1, 0])) { 2355 + return { 2356 + ext: "ico", 2357 + mime: "image/x-icon" 2358 + }; 2359 + } 2360 + if (this.check([0, 0, 2, 0])) { 2361 + return { 2362 + ext: "cur", 2363 + mime: "image/x-icon" 2364 + }; 2365 + } 2366 + await tokenizer3.peekBuffer(this.buffer, { length: Math.min(2 + this.options.mpegOffsetTolerance, tokenizer3.fileInfo.size), mayBeLess: true }); 2367 + if (this.buffer.length >= 2 + this.options.mpegOffsetTolerance) { 2368 + for (let depth = 0; depth <= this.options.mpegOffsetTolerance; ++depth) { 2369 + const type = this.scanMpeg(depth); 2370 + if (type) { 2371 + return type; 2372 + } 2373 + } 2374 + } 2375 + }, "detectImprecise"); 2376 + async readTiffTag(bigEndian) { 2377 + const tagId = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); 2378 + this.tokenizer.ignore(10); 2379 + switch (tagId) { 2380 + case 50341: 2381 + return { 2382 + ext: "arw", 2383 + mime: "image/x-sony-arw" 2384 + }; 2385 + case 50706: 2386 + return { 2387 + ext: "dng", 2388 + mime: "image/x-adobe-dng" 2389 + }; 2390 + default: 2391 + } 2392 + } 2393 + async readTiffIFD(bigEndian) { 2394 + const numberOfTags = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); 2395 + for (let n = 0; n < numberOfTags; ++n) { 2396 + const fileType = await this.readTiffTag(bigEndian); 2397 + if (fileType) { 2398 + return fileType; 2399 + } 2400 + } 2401 + } 2402 + async readTiffHeader(bigEndian) { 2403 + const version = (bigEndian ? UINT16_BE : UINT16_LE).get(this.buffer, 2); 2404 + const ifdOffset = (bigEndian ? UINT32_BE : UINT32_LE).get(this.buffer, 4); 2405 + if (version === 42) { 2406 + if (ifdOffset >= 6) { 2407 + if (this.checkString("CR", { offset: 8 })) { 2408 + return { 2409 + ext: "cr2", 2410 + mime: "image/x-canon-cr2" 2411 + }; 2412 + } 2413 + if (ifdOffset >= 8) { 2414 + const someId1 = (bigEndian ? UINT16_BE : UINT16_LE).get(this.buffer, 8); 2415 + const someId2 = (bigEndian ? UINT16_BE : UINT16_LE).get(this.buffer, 10); 2416 + if (someId1 === 28 && someId2 === 254 || someId1 === 31 && someId2 === 11) { 2417 + return { 2418 + ext: "nef", 2419 + mime: "image/x-nikon-nef" 2420 + }; 2421 + } 2422 + } 2423 + } 2424 + await this.tokenizer.ignore(ifdOffset); 2425 + const fileType = await this.readTiffIFD(bigEndian); 2426 + return fileType ?? { 2427 + ext: "tif", 2428 + mime: "image/tiff" 2429 + }; 2430 + } 2431 + if (version === 43) { 2432 + return { 2433 + ext: "tif", 2434 + mime: "image/tiff" 2435 + }; 2436 + } 2437 + } 2438 + /** 2439 + Scan check MPEG 1 or 2 Layer 3 header, or 'layer 0' for ADTS (MPEG sync-word 0xFFE). 2440 + 2441 + @param offset - Offset to scan for sync-preamble. 2442 + @returns {{ext: string, mime: string}} 2443 + */ 2444 + scanMpeg(offset) { 2445 + if (this.check([255, 224], { offset, mask: [255, 224] })) { 2446 + if (this.check([16], { offset: offset + 1, mask: [22] })) { 2447 + if (this.check([8], { offset: offset + 1, mask: [8] })) { 2448 + return { 2449 + ext: "aac", 2450 + mime: "audio/aac" 2451 + }; 2452 + } 2453 + return { 2454 + ext: "aac", 2455 + mime: "audio/aac" 2456 + }; 2457 + } 2458 + if (this.check([2], { offset: offset + 1, mask: [6] })) { 2459 + return { 2460 + ext: "mp3", 2461 + mime: "audio/mpeg" 2462 + }; 2463 + } 2464 + if (this.check([4], { offset: offset + 1, mask: [6] })) { 2465 + return { 2466 + ext: "mp2", 2467 + mime: "audio/mpeg" 2468 + }; 2469 + } 2470 + if (this.check([6], { offset: offset + 1, mask: [6] })) { 2471 + return { 2472 + ext: "mp1", 2473 + mime: "audio/mpeg" 2474 + }; 2475 + } 2476 + } 2477 + } 2478 + }; 2479 + var supportedExtensions = new Set(extensions); 2480 + var supportedMimeTypes = new Set(mimeTypes); 2481 + 2482 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ParserFactory.js 2483 + var import_content_type = __toESM(require_content_type()); 2484 + var import_media_typer = __toESM(require_media_typer()); 2485 + var import_debug3 = __toESM(require_src()); 2486 + 2487 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/common/MetadataCollector.js 2488 + var import_debug2 = __toESM(require_src()); 2489 + 2490 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/common/GenericTagTypes.js 2491 + var defaultTagInfo = { 2492 + multiple: false 2493 + }; 2494 + var commonTags = { 2495 + year: defaultTagInfo, 2496 + track: defaultTagInfo, 2497 + disk: defaultTagInfo, 2498 + title: defaultTagInfo, 2499 + artist: defaultTagInfo, 2500 + artists: { multiple: true, unique: true }, 2501 + albumartist: defaultTagInfo, 2502 + album: defaultTagInfo, 2503 + date: defaultTagInfo, 2504 + originaldate: defaultTagInfo, 2505 + originalyear: defaultTagInfo, 2506 + releasedate: defaultTagInfo, 2507 + comment: { multiple: true, unique: false }, 2508 + genre: { multiple: true, unique: true }, 2509 + picture: { multiple: true, unique: true }, 2510 + composer: { multiple: true, unique: true }, 2511 + lyrics: { multiple: true, unique: false }, 2512 + albumsort: { multiple: false, unique: true }, 2513 + titlesort: { multiple: false, unique: true }, 2514 + work: { multiple: false, unique: true }, 2515 + artistsort: { multiple: false, unique: true }, 2516 + albumartistsort: { multiple: false, unique: true }, 2517 + composersort: { multiple: false, unique: true }, 2518 + lyricist: { multiple: true, unique: true }, 2519 + writer: { multiple: true, unique: true }, 2520 + conductor: { multiple: true, unique: true }, 2521 + remixer: { multiple: true, unique: true }, 2522 + arranger: { multiple: true, unique: true }, 2523 + engineer: { multiple: true, unique: true }, 2524 + producer: { multiple: true, unique: true }, 2525 + technician: { multiple: true, unique: true }, 2526 + djmixer: { multiple: true, unique: true }, 2527 + mixer: { multiple: true, unique: true }, 2528 + label: { multiple: true, unique: true }, 2529 + grouping: defaultTagInfo, 2530 + subtitle: { multiple: true }, 2531 + discsubtitle: defaultTagInfo, 2532 + totaltracks: defaultTagInfo, 2533 + totaldiscs: defaultTagInfo, 2534 + compilation: defaultTagInfo, 2535 + rating: { multiple: true }, 2536 + bpm: defaultTagInfo, 2537 + mood: defaultTagInfo, 2538 + media: defaultTagInfo, 2539 + catalognumber: { multiple: true, unique: true }, 2540 + tvShow: defaultTagInfo, 2541 + tvShowSort: defaultTagInfo, 2542 + tvSeason: defaultTagInfo, 2543 + tvEpisode: defaultTagInfo, 2544 + tvEpisodeId: defaultTagInfo, 2545 + tvNetwork: defaultTagInfo, 2546 + podcast: defaultTagInfo, 2547 + podcasturl: defaultTagInfo, 2548 + releasestatus: defaultTagInfo, 2549 + releasetype: { multiple: true }, 2550 + releasecountry: defaultTagInfo, 2551 + script: defaultTagInfo, 2552 + language: defaultTagInfo, 2553 + copyright: defaultTagInfo, 2554 + license: defaultTagInfo, 2555 + encodedby: defaultTagInfo, 2556 + encodersettings: defaultTagInfo, 2557 + gapless: defaultTagInfo, 2558 + barcode: defaultTagInfo, 2559 + isrc: { multiple: true }, 2560 + asin: defaultTagInfo, 2561 + musicbrainz_recordingid: defaultTagInfo, 2562 + musicbrainz_trackid: defaultTagInfo, 2563 + musicbrainz_albumid: defaultTagInfo, 2564 + musicbrainz_artistid: { multiple: true }, 2565 + musicbrainz_albumartistid: { multiple: true }, 2566 + musicbrainz_releasegroupid: defaultTagInfo, 2567 + musicbrainz_workid: defaultTagInfo, 2568 + musicbrainz_trmid: defaultTagInfo, 2569 + musicbrainz_discid: defaultTagInfo, 2570 + acoustid_id: defaultTagInfo, 2571 + acoustid_fingerprint: defaultTagInfo, 2572 + musicip_puid: defaultTagInfo, 2573 + musicip_fingerprint: defaultTagInfo, 2574 + website: defaultTagInfo, 2575 + "performer:instrument": { multiple: true, unique: true }, 2576 + averageLevel: defaultTagInfo, 2577 + peakLevel: defaultTagInfo, 2578 + notes: { multiple: true, unique: false }, 2579 + key: defaultTagInfo, 2580 + originalalbum: defaultTagInfo, 2581 + originalartist: defaultTagInfo, 2582 + discogs_artist_id: { multiple: true, unique: true }, 2583 + discogs_release_id: defaultTagInfo, 2584 + discogs_label_id: defaultTagInfo, 2585 + discogs_master_release_id: defaultTagInfo, 2586 + discogs_votes: defaultTagInfo, 2587 + discogs_rating: defaultTagInfo, 2588 + replaygain_track_peak: defaultTagInfo, 2589 + replaygain_track_gain: defaultTagInfo, 2590 + replaygain_album_peak: defaultTagInfo, 2591 + replaygain_album_gain: defaultTagInfo, 2592 + replaygain_track_minmax: defaultTagInfo, 2593 + replaygain_album_minmax: defaultTagInfo, 2594 + replaygain_undo: defaultTagInfo, 2595 + description: { multiple: true }, 2596 + longDescription: defaultTagInfo, 2597 + category: { multiple: true }, 2598 + hdVideo: defaultTagInfo, 2599 + keywords: { multiple: true }, 2600 + movement: defaultTagInfo, 2601 + movementIndex: defaultTagInfo, 2602 + movementTotal: defaultTagInfo, 2603 + podcastId: defaultTagInfo, 2604 + showMovement: defaultTagInfo, 2605 + stik: defaultTagInfo, 2606 + playCounter: defaultTagInfo 2607 + }; 2608 + function isSingleton(alias) { 2609 + return commonTags[alias] && !commonTags[alias].multiple; 2610 + } 2611 + __name(isSingleton, "isSingleton"); 2612 + function isUnique(alias) { 2613 + return !commonTags[alias].multiple || commonTags[alias].unique || false; 2614 + } 2615 + __name(isUnique, "isUnique"); 2616 + 2617 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/common/GenericTagMapper.js 2618 + var CommonTagMapper = class { 2619 + static { 2620 + __name(this, "CommonTagMapper"); 2621 + } 2622 + static toIntOrNull(str) { 2623 + const cleaned = Number.parseInt(str, 10); 2624 + return Number.isNaN(cleaned) ? null : cleaned; 2625 + } 2626 + // TODO: a string of 1of1 would fail to be converted 2627 + // converts 1/10 to no : 1, of : 10 2628 + // or 1 to no : 1, of : 0 2629 + static normalizeTrack(origVal) { 2630 + const split = origVal.toString().split("/"); 2631 + return { 2632 + no: Number.parseInt(split[0], 10) || null, 2633 + of: Number.parseInt(split[1], 10) || null 2634 + }; 2635 + } 2636 + constructor(tagTypes, tagMap2) { 2637 + this.tagTypes = tagTypes; 2638 + this.tagMap = tagMap2; 2639 + } 2640 + /** 2641 + * Process and set common tags 2642 + * write common tags to 2643 + * @param tag Native tag 2644 + * @param warnings Register warnings 2645 + * @return common name 2646 + */ 2647 + mapGenericTag(tag, warnings) { 2648 + tag = { id: tag.id, value: tag.value }; 2649 + this.postMap(tag, warnings); 2650 + const id = this.getCommonName(tag.id); 2651 + return id ? { id, value: tag.value } : null; 2652 + } 2653 + /** 2654 + * Convert native tag key to common tag key 2655 + * @param tag Native header tag 2656 + * @return common tag name (alias) 2657 + */ 2658 + getCommonName(tag) { 2659 + return this.tagMap[tag]; 2660 + } 2661 + /** 2662 + * Handle post mapping exceptions / correction 2663 + * @param tag Tag e.g. {"©alb", "Buena Vista Social Club") 2664 + * @param warnings Used to register warnings 2665 + */ 2666 + postMap(_tag, _warnings) { 2667 + return; 2668 + } 2669 + }; 2670 + CommonTagMapper.maxRatingScore = 1; 2671 + 2672 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/id3v1/ID3v1TagMap.js 2673 + var id3v1TagMap = { 2674 + title: "title", 2675 + artist: "artist", 2676 + album: "album", 2677 + year: "year", 2678 + comment: "comment", 2679 + track: "track", 2680 + genre: "genre" 2681 + }; 2682 + var ID3v1TagMapper = class extends CommonTagMapper { 2683 + static { 2684 + __name(this, "ID3v1TagMapper"); 2685 + } 2686 + constructor() { 2687 + super(["ID3v1"], id3v1TagMap); 2688 + } 2689 + }; 2690 + 2691 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/common/CaseInsensitiveTagMap.js 2692 + var CaseInsensitiveTagMap = class extends CommonTagMapper { 2693 + static { 2694 + __name(this, "CaseInsensitiveTagMap"); 2695 + } 2696 + constructor(tagTypes, tagMap2) { 2697 + const upperCaseMap = {}; 2698 + for (const tag of Object.keys(tagMap2)) { 2699 + upperCaseMap[tag.toUpperCase()] = tagMap2[tag]; 2700 + } 2701 + super(tagTypes, upperCaseMap); 2702 + } 2703 + /** 2704 + * @tag Native header tag 2705 + * @return common tag name (alias) 2706 + */ 2707 + getCommonName(tag) { 2708 + return this.tagMap[tag.toUpperCase()]; 2709 + } 2710 + }; 2711 + 2712 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/id3v2/ID3v24TagMapper.js 2713 + var id3v24TagMap = { 2714 + // id3v2.3 2715 + TIT2: "title", 2716 + TPE1: "artist", 2717 + "TXXX:Artists": "artists", 2718 + TPE2: "albumartist", 2719 + TALB: "album", 2720 + TDRV: "date", 2721 + // [ 'date', 'year' ] ToDo: improve 'year' mapping 2722 + /** 2723 + * Original release year 2724 + */ 2725 + TORY: "originalyear", 2726 + TPOS: "disk", 2727 + TCON: "genre", 2728 + APIC: "picture", 2729 + TCOM: "composer", 2730 + USLT: "lyrics", 2731 + TSOA: "albumsort", 2732 + TSOT: "titlesort", 2733 + TOAL: "originalalbum", 2734 + TSOP: "artistsort", 2735 + TSO2: "albumartistsort", 2736 + TSOC: "composersort", 2737 + TEXT: "lyricist", 2738 + "TXXX:Writer": "writer", 2739 + TPE3: "conductor", 2740 + // 'IPLS:instrument': 'performer:instrument', // ToDo 2741 + TPE4: "remixer", 2742 + "IPLS:arranger": "arranger", 2743 + "IPLS:engineer": "engineer", 2744 + "IPLS:producer": "producer", 2745 + "IPLS:DJ-mix": "djmixer", 2746 + "IPLS:mix": "mixer", 2747 + TPUB: "label", 2748 + TIT1: "grouping", 2749 + TIT3: "subtitle", 2750 + TRCK: "track", 2751 + TCMP: "compilation", 2752 + POPM: "rating", 2753 + TBPM: "bpm", 2754 + TMED: "media", 2755 + "TXXX:CATALOGNUMBER": "catalognumber", 2756 + "TXXX:MusicBrainz Album Status": "releasestatus", 2757 + "TXXX:MusicBrainz Album Type": "releasetype", 2758 + /** 2759 + * Release country as documented: https://picard.musicbrainz.org/docs/mappings/#cite_note-0 2760 + */ 2761 + "TXXX:MusicBrainz Album Release Country": "releasecountry", 2762 + /** 2763 + * Release country as implemented // ToDo: report 2764 + */ 2765 + "TXXX:RELEASECOUNTRY": "releasecountry", 2766 + "TXXX:SCRIPT": "script", 2767 + TLAN: "language", 2768 + TCOP: "copyright", 2769 + WCOP: "license", 2770 + TENC: "encodedby", 2771 + TSSE: "encodersettings", 2772 + "TXXX:BARCODE": "barcode", 2773 + "TXXX:ISRC": "isrc", 2774 + TSRC: "isrc", 2775 + "TXXX:ASIN": "asin", 2776 + "TXXX:originalyear": "originalyear", 2777 + "UFID:http://musicbrainz.org": "musicbrainz_recordingid", 2778 + "TXXX:MusicBrainz Release Track Id": "musicbrainz_trackid", 2779 + "TXXX:MusicBrainz Album Id": "musicbrainz_albumid", 2780 + "TXXX:MusicBrainz Artist Id": "musicbrainz_artistid", 2781 + "TXXX:MusicBrainz Album Artist Id": "musicbrainz_albumartistid", 2782 + "TXXX:MusicBrainz Release Group Id": "musicbrainz_releasegroupid", 2783 + "TXXX:MusicBrainz Work Id": "musicbrainz_workid", 2784 + "TXXX:MusicBrainz TRM Id": "musicbrainz_trmid", 2785 + "TXXX:MusicBrainz Disc Id": "musicbrainz_discid", 2786 + "TXXX:ACOUSTID_ID": "acoustid_id", 2787 + "TXXX:Acoustid Id": "acoustid_id", 2788 + "TXXX:Acoustid Fingerprint": "acoustid_fingerprint", 2789 + "TXXX:MusicIP PUID": "musicip_puid", 2790 + "TXXX:MusicMagic Fingerprint": "musicip_fingerprint", 2791 + WOAR: "website", 2792 + // id3v2.4 2793 + // ToDo: In same sequence as defined at http://id3.org/id3v2.4.0-frames 2794 + TDRC: "date", 2795 + // date YYYY-MM-DD 2796 + TYER: "year", 2797 + TDOR: "originaldate", 2798 + // 'TMCL:instrument': 'performer:instrument', 2799 + "TIPL:arranger": "arranger", 2800 + "TIPL:engineer": "engineer", 2801 + "TIPL:producer": "producer", 2802 + "TIPL:DJ-mix": "djmixer", 2803 + "TIPL:mix": "mixer", 2804 + TMOO: "mood", 2805 + // additional mappings: 2806 + SYLT: "lyrics", 2807 + TSST: "discsubtitle", 2808 + TKEY: "key", 2809 + COMM: "comment", 2810 + TOPE: "originalartist", 2811 + // Windows Media Player 2812 + "PRIV:AverageLevel": "averageLevel", 2813 + "PRIV:PeakLevel": "peakLevel", 2814 + // Discogs 2815 + "TXXX:DISCOGS_ARTIST_ID": "discogs_artist_id", 2816 + "TXXX:DISCOGS_ARTISTS": "artists", 2817 + "TXXX:DISCOGS_ARTIST_NAME": "artists", 2818 + "TXXX:DISCOGS_ALBUM_ARTISTS": "albumartist", 2819 + "TXXX:DISCOGS_CATALOG": "catalognumber", 2820 + "TXXX:DISCOGS_COUNTRY": "releasecountry", 2821 + "TXXX:DISCOGS_DATE": "originaldate", 2822 + "TXXX:DISCOGS_LABEL": "label", 2823 + "TXXX:DISCOGS_LABEL_ID": "discogs_label_id", 2824 + "TXXX:DISCOGS_MASTER_RELEASE_ID": "discogs_master_release_id", 2825 + "TXXX:DISCOGS_RATING": "discogs_rating", 2826 + "TXXX:DISCOGS_RELEASED": "date", 2827 + "TXXX:DISCOGS_RELEASE_ID": "discogs_release_id", 2828 + "TXXX:DISCOGS_VOTES": "discogs_votes", 2829 + "TXXX:CATALOGID": "catalognumber", 2830 + "TXXX:STYLE": "genre", 2831 + "TXXX:REPLAYGAIN_TRACK_PEAK": "replaygain_track_peak", 2832 + "TXXX:REPLAYGAIN_TRACK_GAIN": "replaygain_track_gain", 2833 + "TXXX:REPLAYGAIN_ALBUM_PEAK": "replaygain_album_peak", 2834 + "TXXX:REPLAYGAIN_ALBUM_GAIN": "replaygain_album_gain", 2835 + "TXXX:MP3GAIN_MINMAX": "replaygain_track_minmax", 2836 + "TXXX:MP3GAIN_ALBUM_MINMAX": "replaygain_album_minmax", 2837 + "TXXX:MP3GAIN_UNDO": "replaygain_undo", 2838 + MVNM: "movement", 2839 + MVIN: "movementIndex", 2840 + PCST: "podcast", 2841 + TCAT: "category", 2842 + TDES: "description", 2843 + TDRL: "releasedate", 2844 + TGID: "podcastId", 2845 + TKWD: "keywords", 2846 + WFED: "podcasturl", 2847 + GRP1: "grouping", 2848 + PCNT: "playCounter" 2849 + }; 2850 + var ID3v24TagMapper = class _ID3v24TagMapper extends CaseInsensitiveTagMap { 2851 + static { 2852 + __name(this, "ID3v24TagMapper"); 2853 + } 2854 + static toRating(popm) { 2855 + return { 2856 + source: popm.email, 2857 + rating: popm.rating > 0 ? (popm.rating - 1) / 254 * CommonTagMapper.maxRatingScore : void 0 2858 + }; 2859 + } 2860 + constructor() { 2861 + super(["ID3v2.3", "ID3v2.4"], id3v24TagMap); 2862 + } 2863 + /** 2864 + * Handle post mapping exceptions / correction 2865 + * @param tag to post map 2866 + * @param warnings Wil be used to register (collect) warnings 2867 + */ 2868 + postMap(tag, warnings) { 2869 + switch (tag.id) { 2870 + case "UFID": 2871 + { 2872 + const idTag = tag.value; 2873 + if (idTag.owner_identifier === "http://musicbrainz.org") { 2874 + tag.id += `:${idTag.owner_identifier}`; 2875 + tag.value = decodeString(idTag.identifier, "latin1"); 2876 + } 2877 + } 2878 + break; 2879 + case "PRIV": 2880 + { 2881 + const customTag = tag.value; 2882 + switch (customTag.owner_identifier) { 2883 + // decode Windows Media Player 2884 + case "AverageLevel": 2885 + case "PeakValue": 2886 + tag.id += `:${customTag.owner_identifier}`; 2887 + tag.value = customTag.data.length === 4 ? UINT32_LE.get(customTag.data, 0) : null; 2888 + if (tag.value === null) { 2889 + warnings.addWarning("Failed to parse PRIV:PeakValue"); 2890 + } 2891 + break; 2892 + default: 2893 + warnings.addWarning(`Unknown PRIV owner-identifier: ${customTag.data}`); 2894 + } 2895 + } 2896 + break; 2897 + case "POPM": 2898 + tag.value = _ID3v24TagMapper.toRating(tag.value); 2899 + break; 2900 + default: 2901 + break; 2902 + } 2903 + } 2904 + }; 2905 + 2906 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/asf/AsfTagMapper.js 2907 + var asfTagMap = { 2908 + Title: "title", 2909 + Author: "artist", 2910 + "WM/AlbumArtist": "albumartist", 2911 + "WM/AlbumTitle": "album", 2912 + "WM/Year": "date", 2913 + // changed to 'year' to 'date' based on Picard mappings; ToDo: check me 2914 + "WM/OriginalReleaseTime": "originaldate", 2915 + "WM/OriginalReleaseYear": "originalyear", 2916 + Description: "comment", 2917 + "WM/TrackNumber": "track", 2918 + "WM/PartOfSet": "disk", 2919 + "WM/Genre": "genre", 2920 + "WM/Composer": "composer", 2921 + "WM/Lyrics": "lyrics", 2922 + "WM/AlbumSortOrder": "albumsort", 2923 + "WM/TitleSortOrder": "titlesort", 2924 + "WM/ArtistSortOrder": "artistsort", 2925 + "WM/AlbumArtistSortOrder": "albumartistsort", 2926 + "WM/ComposerSortOrder": "composersort", 2927 + "WM/Writer": "lyricist", 2928 + "WM/Conductor": "conductor", 2929 + "WM/ModifiedBy": "remixer", 2930 + "WM/Engineer": "engineer", 2931 + "WM/Producer": "producer", 2932 + "WM/DJMixer": "djmixer", 2933 + "WM/Mixer": "mixer", 2934 + "WM/Publisher": "label", 2935 + "WM/ContentGroupDescription": "grouping", 2936 + "WM/SubTitle": "subtitle", 2937 + "WM/SetSubTitle": "discsubtitle", 2938 + // 'WM/PartOfSet': 'totaldiscs', 2939 + "WM/IsCompilation": "compilation", 2940 + "WM/SharedUserRating": "rating", 2941 + "WM/BeatsPerMinute": "bpm", 2942 + "WM/Mood": "mood", 2943 + "WM/Media": "media", 2944 + "WM/CatalogNo": "catalognumber", 2945 + "MusicBrainz/Album Status": "releasestatus", 2946 + "MusicBrainz/Album Type": "releasetype", 2947 + "MusicBrainz/Album Release Country": "releasecountry", 2948 + "WM/Script": "script", 2949 + "WM/Language": "language", 2950 + Copyright: "copyright", 2951 + LICENSE: "license", 2952 + "WM/EncodedBy": "encodedby", 2953 + "WM/EncodingSettings": "encodersettings", 2954 + "WM/Barcode": "barcode", 2955 + "WM/ISRC": "isrc", 2956 + "MusicBrainz/Track Id": "musicbrainz_recordingid", 2957 + "MusicBrainz/Release Track Id": "musicbrainz_trackid", 2958 + "MusicBrainz/Album Id": "musicbrainz_albumid", 2959 + "MusicBrainz/Artist Id": "musicbrainz_artistid", 2960 + "MusicBrainz/Album Artist Id": "musicbrainz_albumartistid", 2961 + "MusicBrainz/Release Group Id": "musicbrainz_releasegroupid", 2962 + "MusicBrainz/Work Id": "musicbrainz_workid", 2963 + "MusicBrainz/TRM Id": "musicbrainz_trmid", 2964 + "MusicBrainz/Disc Id": "musicbrainz_discid", 2965 + "Acoustid/Id": "acoustid_id", 2966 + "Acoustid/Fingerprint": "acoustid_fingerprint", 2967 + "MusicIP/PUID": "musicip_puid", 2968 + "WM/ARTISTS": "artists", 2969 + "WM/InitialKey": "key", 2970 + ASIN: "asin", 2971 + "WM/Work": "work", 2972 + "WM/AuthorURL": "website", 2973 + "WM/Picture": "picture" 2974 + }; 2975 + var AsfTagMapper = class _AsfTagMapper extends CommonTagMapper { 2976 + static { 2977 + __name(this, "AsfTagMapper"); 2978 + } 2979 + static toRating(rating) { 2980 + return { 2981 + rating: Number.parseFloat(rating + 1) / 5 2982 + }; 2983 + } 2984 + constructor() { 2985 + super(["asf"], asfTagMap); 2986 + } 2987 + postMap(tag) { 2988 + switch (tag.id) { 2989 + case "WM/SharedUserRating": { 2990 + const keys = tag.id.split(":"); 2991 + tag.value = _AsfTagMapper.toRating(tag.value); 2992 + tag.id = keys[0]; 2993 + break; 2994 + } 2995 + } 2996 + } 2997 + }; 2998 + 2999 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/id3v2/ID3v22TagMapper.js 3000 + var id3v22TagMap = { 3001 + TT2: "title", 3002 + TP1: "artist", 3003 + TP2: "albumartist", 3004 + TAL: "album", 3005 + TYE: "year", 3006 + COM: "comment", 3007 + TRK: "track", 3008 + TPA: "disk", 3009 + TCO: "genre", 3010 + PIC: "picture", 3011 + TCM: "composer", 3012 + TOR: "originaldate", 3013 + TOT: "originalalbum", 3014 + TXT: "lyricist", 3015 + TP3: "conductor", 3016 + TPB: "label", 3017 + TT1: "grouping", 3018 + TT3: "subtitle", 3019 + TLA: "language", 3020 + TCR: "copyright", 3021 + WCP: "license", 3022 + TEN: "encodedby", 3023 + TSS: "encodersettings", 3024 + WAR: "website", 3025 + PCS: "podcast", 3026 + TCP: "compilation", 3027 + TDR: "date", 3028 + TS2: "albumartistsort", 3029 + TSA: "albumsort", 3030 + TSC: "composersort", 3031 + TSP: "artistsort", 3032 + TST: "titlesort", 3033 + WFD: "podcasturl", 3034 + TBP: "bpm" 3035 + }; 3036 + var ID3v22TagMapper = class extends CaseInsensitiveTagMap { 3037 + static { 3038 + __name(this, "ID3v22TagMapper"); 3039 + } 3040 + constructor() { 3041 + super(["ID3v2.2"], id3v22TagMap); 3042 + } 3043 + }; 3044 + 3045 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/apev2/APEv2TagMapper.js 3046 + var apev2TagMap = { 3047 + Title: "title", 3048 + Artist: "artist", 3049 + Artists: "artists", 3050 + "Album Artist": "albumartist", 3051 + Album: "album", 3052 + Year: "date", 3053 + Originalyear: "originalyear", 3054 + Originaldate: "originaldate", 3055 + Releasedate: "releasedate", 3056 + Comment: "comment", 3057 + Track: "track", 3058 + Disc: "disk", 3059 + DISCNUMBER: "disk", 3060 + // ToDo: backwards compatibility', valid tag? 3061 + Genre: "genre", 3062 + "Cover Art (Front)": "picture", 3063 + "Cover Art (Back)": "picture", 3064 + Composer: "composer", 3065 + Lyrics: "lyrics", 3066 + ALBUMSORT: "albumsort", 3067 + TITLESORT: "titlesort", 3068 + WORK: "work", 3069 + ARTISTSORT: "artistsort", 3070 + ALBUMARTISTSORT: "albumartistsort", 3071 + COMPOSERSORT: "composersort", 3072 + Lyricist: "lyricist", 3073 + Writer: "writer", 3074 + Conductor: "conductor", 3075 + // 'Performer=artist (instrument)': 'performer:instrument', 3076 + MixArtist: "remixer", 3077 + Arranger: "arranger", 3078 + Engineer: "engineer", 3079 + Producer: "producer", 3080 + DJMixer: "djmixer", 3081 + Mixer: "mixer", 3082 + Label: "label", 3083 + Grouping: "grouping", 3084 + Subtitle: "subtitle", 3085 + DiscSubtitle: "discsubtitle", 3086 + Compilation: "compilation", 3087 + BPM: "bpm", 3088 + Mood: "mood", 3089 + Media: "media", 3090 + CatalogNumber: "catalognumber", 3091 + MUSICBRAINZ_ALBUMSTATUS: "releasestatus", 3092 + MUSICBRAINZ_ALBUMTYPE: "releasetype", 3093 + RELEASECOUNTRY: "releasecountry", 3094 + Script: "script", 3095 + Language: "language", 3096 + Copyright: "copyright", 3097 + LICENSE: "license", 3098 + EncodedBy: "encodedby", 3099 + EncoderSettings: "encodersettings", 3100 + Barcode: "barcode", 3101 + ISRC: "isrc", 3102 + ASIN: "asin", 3103 + musicbrainz_trackid: "musicbrainz_recordingid", 3104 + musicbrainz_releasetrackid: "musicbrainz_trackid", 3105 + MUSICBRAINZ_ALBUMID: "musicbrainz_albumid", 3106 + MUSICBRAINZ_ARTISTID: "musicbrainz_artistid", 3107 + MUSICBRAINZ_ALBUMARTISTID: "musicbrainz_albumartistid", 3108 + MUSICBRAINZ_RELEASEGROUPID: "musicbrainz_releasegroupid", 3109 + MUSICBRAINZ_WORKID: "musicbrainz_workid", 3110 + MUSICBRAINZ_TRMID: "musicbrainz_trmid", 3111 + MUSICBRAINZ_DISCID: "musicbrainz_discid", 3112 + Acoustid_Id: "acoustid_id", 3113 + ACOUSTID_FINGERPRINT: "acoustid_fingerprint", 3114 + MUSICIP_PUID: "musicip_puid", 3115 + Weblink: "website", 3116 + REPLAYGAIN_TRACK_GAIN: "replaygain_track_gain", 3117 + REPLAYGAIN_TRACK_PEAK: "replaygain_track_peak", 3118 + MP3GAIN_MINMAX: "replaygain_track_minmax", 3119 + MP3GAIN_UNDO: "replaygain_undo" 3120 + }; 3121 + var APEv2TagMapper = class extends CaseInsensitiveTagMap { 3122 + static { 3123 + __name(this, "APEv2TagMapper"); 3124 + } 3125 + constructor() { 3126 + super(["APEv2"], apev2TagMap); 3127 + } 3128 + }; 3129 + 3130 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/mp4/MP4TagMapper.js 3131 + var mp4TagMap = { 3132 + "\xA9nam": "title", 3133 + "\xA9ART": "artist", 3134 + aART: "albumartist", 3135 + /** 3136 + * ToDo: Album artist seems to be stored here while Picard documentation says: aART 3137 + */ 3138 + "----:com.apple.iTunes:Band": "albumartist", 3139 + "\xA9alb": "album", 3140 + "\xA9day": "date", 3141 + "\xA9cmt": "comment", 3142 + "\xA9com": "comment", 3143 + trkn: "track", 3144 + disk: "disk", 3145 + "\xA9gen": "genre", 3146 + covr: "picture", 3147 + "\xA9wrt": "composer", 3148 + "\xA9lyr": "lyrics", 3149 + soal: "albumsort", 3150 + sonm: "titlesort", 3151 + soar: "artistsort", 3152 + soaa: "albumartistsort", 3153 + soco: "composersort", 3154 + "----:com.apple.iTunes:LYRICIST": "lyricist", 3155 + "----:com.apple.iTunes:CONDUCTOR": "conductor", 3156 + "----:com.apple.iTunes:REMIXER": "remixer", 3157 + "----:com.apple.iTunes:ENGINEER": "engineer", 3158 + "----:com.apple.iTunes:PRODUCER": "producer", 3159 + "----:com.apple.iTunes:DJMIXER": "djmixer", 3160 + "----:com.apple.iTunes:MIXER": "mixer", 3161 + "----:com.apple.iTunes:LABEL": "label", 3162 + "\xA9grp": "grouping", 3163 + "----:com.apple.iTunes:SUBTITLE": "subtitle", 3164 + "----:com.apple.iTunes:DISCSUBTITLE": "discsubtitle", 3165 + cpil: "compilation", 3166 + tmpo: "bpm", 3167 + "----:com.apple.iTunes:MOOD": "mood", 3168 + "----:com.apple.iTunes:MEDIA": "media", 3169 + "----:com.apple.iTunes:CATALOGNUMBER": "catalognumber", 3170 + tvsh: "tvShow", 3171 + tvsn: "tvSeason", 3172 + tves: "tvEpisode", 3173 + sosn: "tvShowSort", 3174 + tven: "tvEpisodeId", 3175 + tvnn: "tvNetwork", 3176 + pcst: "podcast", 3177 + purl: "podcasturl", 3178 + "----:com.apple.iTunes:MusicBrainz Album Status": "releasestatus", 3179 + "----:com.apple.iTunes:MusicBrainz Album Type": "releasetype", 3180 + "----:com.apple.iTunes:MusicBrainz Album Release Country": "releasecountry", 3181 + "----:com.apple.iTunes:SCRIPT": "script", 3182 + "----:com.apple.iTunes:LANGUAGE": "language", 3183 + cprt: "copyright", 3184 + "\xA9cpy": "copyright", 3185 + "----:com.apple.iTunes:LICENSE": "license", 3186 + "\xA9too": "encodedby", 3187 + pgap: "gapless", 3188 + "----:com.apple.iTunes:BARCODE": "barcode", 3189 + "----:com.apple.iTunes:ISRC": "isrc", 3190 + "----:com.apple.iTunes:ASIN": "asin", 3191 + "----:com.apple.iTunes:NOTES": "comment", 3192 + "----:com.apple.iTunes:MusicBrainz Track Id": "musicbrainz_recordingid", 3193 + "----:com.apple.iTunes:MusicBrainz Release Track Id": "musicbrainz_trackid", 3194 + "----:com.apple.iTunes:MusicBrainz Album Id": "musicbrainz_albumid", 3195 + "----:com.apple.iTunes:MusicBrainz Artist Id": "musicbrainz_artistid", 3196 + "----:com.apple.iTunes:MusicBrainz Album Artist Id": "musicbrainz_albumartistid", 3197 + "----:com.apple.iTunes:MusicBrainz Release Group Id": "musicbrainz_releasegroupid", 3198 + "----:com.apple.iTunes:MusicBrainz Work Id": "musicbrainz_workid", 3199 + "----:com.apple.iTunes:MusicBrainz TRM Id": "musicbrainz_trmid", 3200 + "----:com.apple.iTunes:MusicBrainz Disc Id": "musicbrainz_discid", 3201 + "----:com.apple.iTunes:Acoustid Id": "acoustid_id", 3202 + "----:com.apple.iTunes:Acoustid Fingerprint": "acoustid_fingerprint", 3203 + "----:com.apple.iTunes:MusicIP PUID": "musicip_puid", 3204 + "----:com.apple.iTunes:fingerprint": "musicip_fingerprint", 3205 + "----:com.apple.iTunes:replaygain_track_gain": "replaygain_track_gain", 3206 + "----:com.apple.iTunes:replaygain_track_peak": "replaygain_track_peak", 3207 + "----:com.apple.iTunes:replaygain_album_gain": "replaygain_album_gain", 3208 + "----:com.apple.iTunes:replaygain_album_peak": "replaygain_album_peak", 3209 + "----:com.apple.iTunes:replaygain_track_minmax": "replaygain_track_minmax", 3210 + "----:com.apple.iTunes:replaygain_album_minmax": "replaygain_album_minmax", 3211 + "----:com.apple.iTunes:replaygain_undo": "replaygain_undo", 3212 + // Additional mappings: 3213 + gnre: "genre", 3214 + // ToDo: check mapping 3215 + "----:com.apple.iTunes:ALBUMARTISTSORT": "albumartistsort", 3216 + "----:com.apple.iTunes:ARTISTS": "artists", 3217 + "----:com.apple.iTunes:ORIGINALDATE": "originaldate", 3218 + "----:com.apple.iTunes:ORIGINALYEAR": "originalyear", 3219 + "----:com.apple.iTunes:RELEASEDATE": "releasedate", 3220 + // '----:com.apple.iTunes:PERFORMER': 'performer' 3221 + desc: "description", 3222 + ldes: "longDescription", 3223 + "\xA9mvn": "movement", 3224 + "\xA9mvi": "movementIndex", 3225 + "\xA9mvc": "movementTotal", 3226 + "\xA9wrk": "work", 3227 + catg: "category", 3228 + egid: "podcastId", 3229 + hdvd: "hdVideo", 3230 + keyw: "keywords", 3231 + shwm: "showMovement", 3232 + stik: "stik", 3233 + rate: "rating" 3234 + }; 3235 + var tagType = "iTunes"; 3236 + var MP4TagMapper = class extends CaseInsensitiveTagMap { 3237 + static { 3238 + __name(this, "MP4TagMapper"); 3239 + } 3240 + constructor() { 3241 + super([tagType], mp4TagMap); 3242 + } 3243 + postMap(tag, _warnings) { 3244 + switch (tag.id) { 3245 + case "rate": 3246 + tag.value = { 3247 + source: void 0, 3248 + rating: Number.parseFloat(tag.value) / 100 3249 + }; 3250 + break; 3251 + } 3252 + } 3253 + }; 3254 + 3255 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/vorbis/VorbisTagMapper.js 3256 + var vorbisTagMap = { 3257 + TITLE: "title", 3258 + ARTIST: "artist", 3259 + ARTISTS: "artists", 3260 + ALBUMARTIST: "albumartist", 3261 + "ALBUM ARTIST": "albumartist", 3262 + ALBUM: "album", 3263 + DATE: "date", 3264 + ORIGINALDATE: "originaldate", 3265 + ORIGINALYEAR: "originalyear", 3266 + RELEASEDATE: "releasedate", 3267 + COMMENT: "comment", 3268 + TRACKNUMBER: "track", 3269 + DISCNUMBER: "disk", 3270 + GENRE: "genre", 3271 + METADATA_BLOCK_PICTURE: "picture", 3272 + COMPOSER: "composer", 3273 + LYRICS: "lyrics", 3274 + ALBUMSORT: "albumsort", 3275 + TITLESORT: "titlesort", 3276 + WORK: "work", 3277 + ARTISTSORT: "artistsort", 3278 + ALBUMARTISTSORT: "albumartistsort", 3279 + COMPOSERSORT: "composersort", 3280 + LYRICIST: "lyricist", 3281 + WRITER: "writer", 3282 + CONDUCTOR: "conductor", 3283 + // 'PERFORMER=artist (instrument)': 'performer:instrument', // ToDo 3284 + REMIXER: "remixer", 3285 + ARRANGER: "arranger", 3286 + ENGINEER: "engineer", 3287 + PRODUCER: "producer", 3288 + DJMIXER: "djmixer", 3289 + MIXER: "mixer", 3290 + LABEL: "label", 3291 + GROUPING: "grouping", 3292 + SUBTITLE: "subtitle", 3293 + DISCSUBTITLE: "discsubtitle", 3294 + TRACKTOTAL: "totaltracks", 3295 + DISCTOTAL: "totaldiscs", 3296 + COMPILATION: "compilation", 3297 + RATING: "rating", 3298 + BPM: "bpm", 3299 + KEY: "key", 3300 + MOOD: "mood", 3301 + MEDIA: "media", 3302 + CATALOGNUMBER: "catalognumber", 3303 + RELEASESTATUS: "releasestatus", 3304 + RELEASETYPE: "releasetype", 3305 + RELEASECOUNTRY: "releasecountry", 3306 + SCRIPT: "script", 3307 + LANGUAGE: "language", 3308 + COPYRIGHT: "copyright", 3309 + LICENSE: "license", 3310 + ENCODEDBY: "encodedby", 3311 + ENCODERSETTINGS: "encodersettings", 3312 + BARCODE: "barcode", 3313 + ISRC: "isrc", 3314 + ASIN: "asin", 3315 + MUSICBRAINZ_TRACKID: "musicbrainz_recordingid", 3316 + MUSICBRAINZ_RELEASETRACKID: "musicbrainz_trackid", 3317 + MUSICBRAINZ_ALBUMID: "musicbrainz_albumid", 3318 + MUSICBRAINZ_ARTISTID: "musicbrainz_artistid", 3319 + MUSICBRAINZ_ALBUMARTISTID: "musicbrainz_albumartistid", 3320 + MUSICBRAINZ_RELEASEGROUPID: "musicbrainz_releasegroupid", 3321 + MUSICBRAINZ_WORKID: "musicbrainz_workid", 3322 + MUSICBRAINZ_TRMID: "musicbrainz_trmid", 3323 + MUSICBRAINZ_DISCID: "musicbrainz_discid", 3324 + ACOUSTID_ID: "acoustid_id", 3325 + ACOUSTID_ID_FINGERPRINT: "acoustid_fingerprint", 3326 + MUSICIP_PUID: "musicip_puid", 3327 + // 'FINGERPRINT=MusicMagic Fingerprint {fingerprint}': 'musicip_fingerprint', // ToDo 3328 + WEBSITE: "website", 3329 + NOTES: "notes", 3330 + TOTALTRACKS: "totaltracks", 3331 + TOTALDISCS: "totaldiscs", 3332 + // Discogs 3333 + DISCOGS_ARTIST_ID: "discogs_artist_id", 3334 + DISCOGS_ARTISTS: "artists", 3335 + DISCOGS_ARTIST_NAME: "artists", 3336 + DISCOGS_ALBUM_ARTISTS: "albumartist", 3337 + DISCOGS_CATALOG: "catalognumber", 3338 + DISCOGS_COUNTRY: "releasecountry", 3339 + DISCOGS_DATE: "originaldate", 3340 + DISCOGS_LABEL: "label", 3341 + DISCOGS_LABEL_ID: "discogs_label_id", 3342 + DISCOGS_MASTER_RELEASE_ID: "discogs_master_release_id", 3343 + DISCOGS_RATING: "discogs_rating", 3344 + DISCOGS_RELEASED: "date", 3345 + DISCOGS_RELEASE_ID: "discogs_release_id", 3346 + DISCOGS_VOTES: "discogs_votes", 3347 + CATALOGID: "catalognumber", 3348 + STYLE: "genre", 3349 + // 3350 + REPLAYGAIN_TRACK_GAIN: "replaygain_track_gain", 3351 + REPLAYGAIN_TRACK_PEAK: "replaygain_track_peak", 3352 + REPLAYGAIN_ALBUM_GAIN: "replaygain_album_gain", 3353 + REPLAYGAIN_ALBUM_PEAK: "replaygain_album_peak", 3354 + // To Sure if these (REPLAYGAIN_MINMAX, REPLAYGAIN_ALBUM_MINMAX & REPLAYGAIN_UNDO) are used for Vorbis: 3355 + REPLAYGAIN_MINMAX: "replaygain_track_minmax", 3356 + REPLAYGAIN_ALBUM_MINMAX: "replaygain_album_minmax", 3357 + REPLAYGAIN_UNDO: "replaygain_undo" 3358 + }; 3359 + var VorbisTagMapper = class _VorbisTagMapper extends CommonTagMapper { 3360 + static { 3361 + __name(this, "VorbisTagMapper"); 3362 + } 3363 + static toRating(email, rating, maxScore) { 3364 + return { 3365 + source: email ? email.toLowerCase() : void 0, 3366 + rating: Number.parseFloat(rating) / maxScore * CommonTagMapper.maxRatingScore 3367 + }; 3368 + } 3369 + constructor() { 3370 + super(["vorbis"], vorbisTagMap); 3371 + } 3372 + postMap(tag) { 3373 + if (tag.id === "RATING") { 3374 + tag.value = _VorbisTagMapper.toRating(void 0, tag.value, 100); 3375 + } else if (tag.id.indexOf("RATING:") === 0) { 3376 + const keys = tag.id.split(":"); 3377 + tag.value = _VorbisTagMapper.toRating(keys[1], tag.value, 1); 3378 + tag.id = keys[0]; 3379 + } 3380 + } 3381 + }; 3382 + 3383 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/riff/RiffInfoTagMap.js 3384 + var riffInfoTagMap = { 3385 + IART: "artist", 3386 + // Artist 3387 + ICRD: "date", 3388 + // DateCreated 3389 + INAM: "title", 3390 + // Title 3391 + TITL: "title", 3392 + IPRD: "album", 3393 + // Product 3394 + ITRK: "track", 3395 + IPRT: "track", 3396 + // Additional tag for track index 3397 + COMM: "comment", 3398 + // Comments 3399 + ICMT: "comment", 3400 + // Country 3401 + ICNT: "releasecountry", 3402 + GNRE: "genre", 3403 + // Genre 3404 + IWRI: "writer", 3405 + // WrittenBy 3406 + RATE: "rating", 3407 + YEAR: "year", 3408 + ISFT: "encodedby", 3409 + // Software 3410 + CODE: "encodedby", 3411 + // EncodedBy 3412 + TURL: "website", 3413 + // URL, 3414 + IGNR: "genre", 3415 + // Genre 3416 + IENG: "engineer", 3417 + // Engineer 3418 + ITCH: "technician", 3419 + // Technician 3420 + IMED: "media", 3421 + // Original Media 3422 + IRPD: "album" 3423 + // Product, where the file was intended for 3424 + }; 3425 + var RiffInfoTagMapper = class extends CommonTagMapper { 3426 + static { 3427 + __name(this, "RiffInfoTagMapper"); 3428 + } 3429 + constructor() { 3430 + super(["exif"], riffInfoTagMap); 3431 + } 3432 + }; 3433 + 3434 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/matroska/MatroskaTagMapper.js 3435 + var ebmlTagMap = { 3436 + "segment:title": "title", 3437 + "album:ARTIST": "albumartist", 3438 + "album:ARTISTSORT": "albumartistsort", 3439 + "album:TITLE": "album", 3440 + "album:DATE_RECORDED": "originaldate", 3441 + "album:DATE_RELEASED": "releasedate", 3442 + "album:PART_NUMBER": "disk", 3443 + "album:TOTAL_PARTS": "totaltracks", 3444 + "track:ARTIST": "artist", 3445 + "track:ARTISTSORT": "artistsort", 3446 + "track:TITLE": "title", 3447 + "track:PART_NUMBER": "track", 3448 + "track:MUSICBRAINZ_TRACKID": "musicbrainz_recordingid", 3449 + "track:MUSICBRAINZ_ALBUMID": "musicbrainz_albumid", 3450 + "track:MUSICBRAINZ_ARTISTID": "musicbrainz_artistid", 3451 + "track:PUBLISHER": "label", 3452 + "track:GENRE": "genre", 3453 + "track:ENCODER": "encodedby", 3454 + "track:ENCODER_OPTIONS": "encodersettings", 3455 + "edition:TOTAL_PARTS": "totaldiscs", 3456 + picture: "picture" 3457 + }; 3458 + var MatroskaTagMapper = class extends CaseInsensitiveTagMap { 3459 + static { 3460 + __name(this, "MatroskaTagMapper"); 3461 + } 3462 + constructor() { 3463 + super(["matroska"], ebmlTagMap); 3464 + } 3465 + }; 3466 + 3467 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/aiff/AiffTagMap.js 3468 + var tagMap = { 3469 + NAME: "title", 3470 + AUTH: "artist", 3471 + "(c) ": "copyright", 3472 + ANNO: "comment" 3473 + }; 3474 + var AiffTagMapper = class extends CommonTagMapper { 3475 + static { 3476 + __name(this, "AiffTagMapper"); 3477 + } 3478 + constructor() { 3479 + super(["AIFF"], tagMap); 3480 + } 3481 + }; 3482 + 3483 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/common/CombinedTagMapper.js 3484 + var CombinedTagMapper = class { 3485 + static { 3486 + __name(this, "CombinedTagMapper"); 3487 + } 3488 + constructor() { 3489 + this.tagMappers = {}; 3490 + [ 3491 + new ID3v1TagMapper(), 3492 + new ID3v22TagMapper(), 3493 + new ID3v24TagMapper(), 3494 + new MP4TagMapper(), 3495 + new MP4TagMapper(), 3496 + new VorbisTagMapper(), 3497 + new APEv2TagMapper(), 3498 + new AsfTagMapper(), 3499 + new RiffInfoTagMapper(), 3500 + new MatroskaTagMapper(), 3501 + new AiffTagMapper() 3502 + ].forEach((mapper) => { 3503 + this.registerTagMapper(mapper); 3504 + }); 3505 + } 3506 + /** 3507 + * Convert native to generic (common) tags 3508 + * @param tagType Originating tag format 3509 + * @param tag Native tag to map to a generic tag id 3510 + * @param warnings 3511 + * @return Generic tag result (output of this function) 3512 + */ 3513 + mapTag(tagType2, tag, warnings) { 3514 + const tagMapper = this.tagMappers[tagType2]; 3515 + if (tagMapper) { 3516 + return this.tagMappers[tagType2].mapGenericTag(tag, warnings); 3517 + } 3518 + throw new InternalParserError(`No generic tag mapper defined for tag-format: ${tagType2}`); 3519 + } 3520 + registerTagMapper(genericTagMapper) { 3521 + for (const tagType2 of genericTagMapper.tagTypes) { 3522 + this.tagMappers[tagType2] = genericTagMapper; 3523 + } 3524 + } 3525 + }; 3526 + 3527 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/lrc/LyricsParser.js 3528 + var TIMESTAMP_REGEX = /\[(\d{2}):(\d{2})\.(\d{2,3})]/; 3529 + function parseLyrics(input) { 3530 + if (TIMESTAMP_REGEX.test(input)) { 3531 + return parseLrc(input); 3532 + } 3533 + return toUnsyncedLyrics(input); 3534 + } 3535 + __name(parseLyrics, "parseLyrics"); 3536 + function toUnsyncedLyrics(lyrics) { 3537 + return { 3538 + contentType: LyricsContentType.lyrics, 3539 + timeStampFormat: TimestampFormat.notSynchronized, 3540 + text: lyrics.trim(), 3541 + syncText: [] 3542 + }; 3543 + } 3544 + __name(toUnsyncedLyrics, "toUnsyncedLyrics"); 3545 + function parseLrc(lrcString) { 3546 + const lines = lrcString.split("\n"); 3547 + const syncText = []; 3548 + for (const line of lines) { 3549 + const match = line.match(TIMESTAMP_REGEX); 3550 + if (match) { 3551 + const minutes = Number.parseInt(match[1], 10); 3552 + const seconds = Number.parseInt(match[2], 10); 3553 + const ms = match[3].length === 3 ? Number.parseInt(match[3], 10) : Number.parseInt(match[3], 10) * 10; 3554 + const timestamp = (minutes * 60 + seconds) * 1e3 + ms; 3555 + const text = line.replace(TIMESTAMP_REGEX, "").trim(); 3556 + syncText.push({ timestamp, text }); 3557 + } 3558 + } 3559 + return { 3560 + contentType: LyricsContentType.lyrics, 3561 + timeStampFormat: TimestampFormat.milliseconds, 3562 + text: syncText.map((line) => line.text).join("\n"), 3563 + syncText 3564 + }; 3565 + } 3566 + __name(parseLrc, "parseLrc"); 3567 + 3568 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/common/MetadataCollector.js 3569 + var debug2 = (0, import_debug2.default)("music-metadata:collector"); 3570 + var TagPriority = ["matroska", "APEv2", "vorbis", "ID3v2.4", "ID3v2.3", "ID3v2.2", "exif", "asf", "iTunes", "AIFF", "ID3v1"]; 3571 + var MetadataCollector = class { 3572 + static { 3573 + __name(this, "MetadataCollector"); 3574 + } 3575 + constructor(opts) { 3576 + this.format = { 3577 + tagTypes: [], 3578 + trackInfo: [] 3579 + }; 3580 + this.native = {}; 3581 + this.common = { 3582 + track: { no: null, of: null }, 3583 + disk: { no: null, of: null }, 3584 + movementIndex: { no: null, of: null } 3585 + }; 3586 + this.quality = { 3587 + warnings: [] 3588 + }; 3589 + this.commonOrigin = {}; 3590 + this.originPriority = {}; 3591 + this.tagMapper = new CombinedTagMapper(); 3592 + this.opts = opts; 3593 + let priority = 1; 3594 + for (const tagType2 of TagPriority) { 3595 + this.originPriority[tagType2] = priority++; 3596 + } 3597 + this.originPriority.artificial = 500; 3598 + this.originPriority.id3v1 = 600; 3599 + } 3600 + /** 3601 + * @returns {boolean} true if one or more tags have been found 3602 + */ 3603 + hasAny() { 3604 + return Object.keys(this.native).length > 0; 3605 + } 3606 + addStreamInfo(streamInfo) { 3607 + debug2(`streamInfo: type=${streamInfo.type ? TrackTypeValueToKeyMap[streamInfo.type] : "?"}, codec=${streamInfo.codecName}`); 3608 + this.format.trackInfo.push(streamInfo); 3609 + } 3610 + setFormat(key, value) { 3611 + debug2(`format: ${key} = ${value}`); 3612 + this.format[key] = value; 3613 + if (this.opts?.observer) { 3614 + this.opts.observer({ metadata: this, tag: { type: "format", id: key, value } }); 3615 + } 3616 + } 3617 + setAudioOnly() { 3618 + this.setFormat("hasAudio", true); 3619 + this.setFormat("hasVideo", false); 3620 + } 3621 + async addTag(tagType2, tagId, value) { 3622 + debug2(`tag ${tagType2}.${tagId} = ${value}`); 3623 + if (!this.native[tagType2]) { 3624 + this.format.tagTypes.push(tagType2); 3625 + this.native[tagType2] = []; 3626 + } 3627 + this.native[tagType2].push({ id: tagId, value }); 3628 + await this.toCommon(tagType2, tagId, value); 3629 + } 3630 + addWarning(warning) { 3631 + this.quality.warnings.push({ message: warning }); 3632 + } 3633 + async postMap(tagType2, tag) { 3634 + switch (tag.id) { 3635 + case "artist": 3636 + if (this.commonOrigin.artist === this.originPriority[tagType2]) { 3637 + return this.postMap("artificial", { id: "artists", value: tag.value }); 3638 + } 3639 + if (!this.common.artists) { 3640 + this.setGenericTag("artificial", { id: "artists", value: tag.value }); 3641 + } 3642 + break; 3643 + case "artists": 3644 + if (!this.common.artist || this.commonOrigin.artist === this.originPriority.artificial) { 3645 + if (!this.common.artists || this.common.artists.indexOf(tag.value) === -1) { 3646 + const artists = (this.common.artists || []).concat([tag.value]); 3647 + const value = joinArtists(artists); 3648 + const artistTag = { id: "artist", value }; 3649 + this.setGenericTag("artificial", artistTag); 3650 + } 3651 + } 3652 + break; 3653 + case "picture": 3654 + return this.postFixPicture(tag.value).then((picture) => { 3655 + if (picture !== null) { 3656 + tag.value = picture; 3657 + this.setGenericTag(tagType2, tag); 3658 + } 3659 + }); 3660 + case "totaltracks": 3661 + this.common.track.of = CommonTagMapper.toIntOrNull(tag.value); 3662 + return; 3663 + case "totaldiscs": 3664 + this.common.disk.of = CommonTagMapper.toIntOrNull(tag.value); 3665 + return; 3666 + case "movementTotal": 3667 + this.common.movementIndex.of = CommonTagMapper.toIntOrNull(tag.value); 3668 + return; 3669 + case "track": 3670 + case "disk": 3671 + case "movementIndex": { 3672 + const of = this.common[tag.id].of; 3673 + this.common[tag.id] = CommonTagMapper.normalizeTrack(tag.value); 3674 + this.common[tag.id].of = of != null ? of : this.common[tag.id].of; 3675 + return; 3676 + } 3677 + case "bpm": 3678 + case "year": 3679 + case "originalyear": 3680 + tag.value = Number.parseInt(tag.value, 10); 3681 + break; 3682 + case "date": { 3683 + const year = Number.parseInt(tag.value.substr(0, 4), 10); 3684 + if (!Number.isNaN(year)) { 3685 + this.common.year = year; 3686 + } 3687 + break; 3688 + } 3689 + case "discogs_label_id": 3690 + case "discogs_release_id": 3691 + case "discogs_master_release_id": 3692 + case "discogs_artist_id": 3693 + case "discogs_votes": 3694 + tag.value = typeof tag.value === "string" ? Number.parseInt(tag.value, 10) : tag.value; 3695 + break; 3696 + case "replaygain_track_gain": 3697 + case "replaygain_track_peak": 3698 + case "replaygain_album_gain": 3699 + case "replaygain_album_peak": 3700 + tag.value = toRatio(tag.value); 3701 + break; 3702 + case "replaygain_track_minmax": 3703 + tag.value = tag.value.split(",").map((v) => Number.parseInt(v, 10)); 3704 + break; 3705 + case "replaygain_undo": { 3706 + const minMix = tag.value.split(",").map((v) => Number.parseInt(v, 10)); 3707 + tag.value = { 3708 + leftChannel: minMix[0], 3709 + rightChannel: minMix[1] 3710 + }; 3711 + break; 3712 + } 3713 + case "gapless": 3714 + // iTunes gap-less flag 3715 + case "compilation": 3716 + case "podcast": 3717 + case "showMovement": 3718 + tag.value = tag.value === "1" || tag.value === 1; 3719 + break; 3720 + case "isrc": { 3721 + const commonTag = this.common[tag.id]; 3722 + if (commonTag && commonTag.indexOf(tag.value) !== -1) 3723 + return; 3724 + break; 3725 + } 3726 + case "comment": 3727 + if (typeof tag.value === "string") { 3728 + tag.value = { text: tag.value }; 3729 + } 3730 + if (tag.value.descriptor === "iTunPGAP") { 3731 + this.setGenericTag(tagType2, { id: "gapless", value: tag.value.text === "1" }); 3732 + } 3733 + break; 3734 + case "lyrics": 3735 + if (typeof tag.value === "string") { 3736 + tag.value = parseLyrics(tag.value); 3737 + } 3738 + break; 3739 + default: 3740 + } 3741 + if (tag.value !== null) { 3742 + this.setGenericTag(tagType2, tag); 3743 + } 3744 + } 3745 + /** 3746 + * Convert native tags to common tags 3747 + * @returns {IAudioMetadata} Native + common tags 3748 + */ 3749 + toCommonMetadata() { 3750 + return { 3751 + format: this.format, 3752 + native: this.native, 3753 + quality: this.quality, 3754 + common: this.common 3755 + }; 3756 + } 3757 + /** 3758 + * Fix some common issues with picture object 3759 + * @param picture Picture 3760 + */ 3761 + async postFixPicture(picture) { 3762 + if (picture.data && picture.data.length > 0) { 3763 + if (!picture.format) { 3764 + const fileType = await fileTypeFromBuffer(Uint8Array.from(picture.data)); 3765 + if (fileType) { 3766 + picture.format = fileType.mime; 3767 + } else { 3768 + return null; 3769 + } 3770 + } 3771 + picture.format = picture.format.toLocaleLowerCase(); 3772 + switch (picture.format) { 3773 + case "image/jpg": 3774 + picture.format = "image/jpeg"; 3775 + } 3776 + return picture; 3777 + } 3778 + this.addWarning("Empty picture tag found"); 3779 + return null; 3780 + } 3781 + /** 3782 + * Convert native tag to common tags 3783 + */ 3784 + async toCommon(tagType2, tagId, value) { 3785 + const tag = { id: tagId, value }; 3786 + const genericTag = this.tagMapper.mapTag(tagType2, tag, this); 3787 + if (genericTag) { 3788 + await this.postMap(tagType2, genericTag); 3789 + } 3790 + } 3791 + /** 3792 + * Set generic tag 3793 + */ 3794 + setGenericTag(tagType2, tag) { 3795 + debug2(`common.${tag.id} = ${tag.value}`); 3796 + const prio0 = this.commonOrigin[tag.id] || 1e3; 3797 + const prio1 = this.originPriority[tagType2]; 3798 + if (isSingleton(tag.id)) { 3799 + if (prio1 <= prio0) { 3800 + this.common[tag.id] = tag.value; 3801 + this.commonOrigin[tag.id] = prio1; 3802 + } else { 3803 + return debug2(`Ignore native tag (singleton): ${tagType2}.${tag.id} = ${tag.value}`); 3804 + } 3805 + } else { 3806 + if (prio1 === prio0) { 3807 + if (!isUnique(tag.id) || this.common[tag.id].indexOf(tag.value) === -1) { 3808 + this.common[tag.id].push(tag.value); 3809 + } else { 3810 + debug2(`Ignore duplicate value: ${tagType2}.${tag.id} = ${tag.value}`); 3811 + } 3812 + } else if (prio1 < prio0) { 3813 + this.common[tag.id] = [tag.value]; 3814 + this.commonOrigin[tag.id] = prio1; 3815 + } else { 3816 + return debug2(`Ignore native tag (list): ${tagType2}.${tag.id} = ${tag.value}`); 3817 + } 3818 + } 3819 + if (this.opts?.observer) { 3820 + this.opts.observer({ metadata: this, tag: { type: "common", id: tag.id, value: tag.value } }); 3821 + } 3822 + } 3823 + }; 3824 + function joinArtists(artists) { 3825 + if (artists.length > 2) { 3826 + return `${artists.slice(0, artists.length - 1).join(", ")} & ${artists[artists.length - 1]}`; 3827 + } 3828 + return artists.join(" & "); 3829 + } 3830 + __name(joinArtists, "joinArtists"); 3831 + 3832 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/mpeg/MpegLoader.js 3833 + var mpegParserLoader = { 3834 + parserType: "mpeg", 3835 + extensions: [".mp2", ".mp3", ".m2a", ".aac", "aacp"], 3836 + mimeTypes: ["audio/mpeg", "audio/mp3", "audio/aacs", "audio/aacp"], 3837 + async load() { 3838 + return (await import("./MpegParser-6I4WPE7H.js")).MpegParser; 3839 + } 3840 + }; 3841 + 3842 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/apev2/Apev2Loader.js 3843 + var apeParserLoader = { 3844 + parserType: "apev2", 3845 + extensions: [".ape"], 3846 + mimeTypes: ["audio/ape", "audio/monkeys-audio"], 3847 + async load() { 3848 + return (await import("./APEv2Parser-7M4PAZ3N.js")).APEv2Parser; 3849 + } 3850 + }; 3851 + 3852 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/asf/AsfLoader.js 3853 + var asfParserLoader = { 3854 + parserType: "asf", 3855 + extensions: [".asf"], 3856 + mimeTypes: ["audio/ms-wma", "video/ms-wmv", "audio/ms-asf", "video/ms-asf", "application/vnd.ms-asf"], 3857 + async load() { 3858 + return (await import("./AsfParser-N6VZQ5OP.js")).AsfParser; 3859 + } 3860 + }; 3861 + 3862 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/dsdiff/DsdiffLoader.js 3863 + var dsdiffParserLoader = { 3864 + parserType: "dsdiff", 3865 + extensions: [".dff"], 3866 + mimeTypes: ["audio/dsf", "audio/dsd"], 3867 + async load() { 3868 + return (await import("./DsdiffParser-DF4OM5HV.js")).DsdiffParser; 3869 + } 3870 + }; 3871 + 3872 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/aiff/AiffLoader.js 3873 + var aiffParserLoader = { 3874 + parserType: "aiff", 3875 + extensions: [".aif", "aiff", "aifc"], 3876 + mimeTypes: ["audio/aiff", "audio/aif", "audio/aifc", "application/aiff"], 3877 + async load() { 3878 + return (await import("./AiffParser-EXCORBCX.js")).AIFFParser; 3879 + } 3880 + }; 3881 + 3882 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/dsf/DsfLoader.js 3883 + var dsfParserLoader = { 3884 + parserType: "dsf", 3885 + extensions: [".dsf"], 3886 + mimeTypes: ["audio/dsf"], 3887 + async load() { 3888 + return (await import("./DsfParser-WJENCYIA.js")).DsfParser; 3889 + } 3890 + }; 3891 + 3892 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/flac/FlacLoader.js 3893 + var flacParserLoader = { 3894 + parserType: "flac", 3895 + extensions: [".flac"], 3896 + mimeTypes: ["audio/flac"], 3897 + async load() { 3898 + return (await import("./FlacParser-UYVOMKF2.js")).FlacParser; 3899 + } 3900 + }; 3901 + 3902 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/matroska/MatroskaLoader.js 3903 + var matroskaParserLoader = { 3904 + parserType: "matroska", 3905 + extensions: [".mka", ".mkv", ".mk3d", ".mks", "webm"], 3906 + mimeTypes: ["audio/matroska", "video/matroska", "audio/webm", "video/webm"], 3907 + async load() { 3908 + return (await import("./MatroskaParser-K556QMVK.js")).MatroskaParser; 3909 + } 3910 + }; 3911 + 3912 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/mp4/Mp4Loader.js 3913 + var mp4ParserLoader = { 3914 + parserType: "mp4", 3915 + extensions: [".mp4", ".m4a", ".m4b", ".m4pa", "m4v", "m4r", "3gp", ".mov", ".movie", ".qt"], 3916 + mimeTypes: ["audio/mp4", "audio/m4a", "video/m4v", "video/mp4", "video/quicktime"], 3917 + async load() { 3918 + return (await import("./MP4Parser-CA3XAXIP.js")).MP4Parser; 3919 + } 3920 + }; 3921 + 3922 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/musepack/MusepackLoader.js 3923 + var musepackParserLoader = { 3924 + parserType: "musepack", 3925 + extensions: [".mpc"], 3926 + mimeTypes: ["audio/musepack"], 3927 + async load() { 3928 + return (await import("./MusepackParser-PVJGCXWZ.js")).MusepackParser; 3929 + } 3930 + }; 3931 + 3932 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/OggLoader.js 3933 + var oggParserLoader = { 3934 + parserType: "ogg", 3935 + extensions: [".ogg", ".ogv", ".oga", ".ogm", ".ogx", ".opus", ".spx"], 3936 + mimeTypes: ["audio/ogg", "audio/opus", "audio/speex", "video/ogg"], 3937 + // RFC 7845, RFC 6716, RFC 5574 3938 + async load() { 3939 + return (await import("./OggParser-HOABAP6I.js")).OggParser; 3940 + } 3941 + }; 3942 + 3943 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/wavpack/WavPackLoader.js 3944 + var wavpackParserLoader = { 3945 + parserType: "wavpack", 3946 + extensions: [".wv", ".wvp"], 3947 + mimeTypes: ["audio/wavpack"], 3948 + async load() { 3949 + return (await import("./WavPackParser-BDZJQRUN.js")).WavPackParser; 3950 + } 3951 + }; 3952 + 3953 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/wav/WaveLoader.js 3954 + var riffParserLoader = { 3955 + parserType: "riff", 3956 + extensions: [".wav", "wave", ".bwf"], 3957 + mimeTypes: ["audio/vnd.wave", "audio/wav", "audio/wave"], 3958 + async load() { 3959 + return (await import("./WaveParser-CTTJTFLC.js")).WaveParser; 3960 + } 3961 + }; 3962 + 3963 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ParserFactory.js 3964 + var debug3 = (0, import_debug3.default)("music-metadata:parser:factory"); 3965 + function parseHttpContentType(contentType) { 3966 + const type = import_content_type.default.parse(contentType); 3967 + const mime = (0, import_media_typer.parse)(type.type); 3968 + return { 3969 + type: mime.type, 3970 + subtype: mime.subtype, 3971 + suffix: mime.suffix, 3972 + parameters: type.parameters 3973 + }; 3974 + } 3975 + __name(parseHttpContentType, "parseHttpContentType"); 3976 + var ParserFactory = class { 3977 + static { 3978 + __name(this, "ParserFactory"); 3979 + } 3980 + constructor() { 3981 + this.parsers = []; 3982 + [ 3983 + flacParserLoader, 3984 + mpegParserLoader, 3985 + apeParserLoader, 3986 + mp4ParserLoader, 3987 + matroskaParserLoader, 3988 + riffParserLoader, 3989 + oggParserLoader, 3990 + asfParserLoader, 3991 + aiffParserLoader, 3992 + wavpackParserLoader, 3993 + musepackParserLoader, 3994 + dsfParserLoader, 3995 + dsdiffParserLoader 3996 + ].forEach((parser) => { 3997 + this.registerParser(parser); 3998 + }); 3999 + } 4000 + registerParser(parser) { 4001 + this.parsers.push(parser); 4002 + } 4003 + async parse(tokenizer3, parserLoader, opts) { 4004 + if (tokenizer3.supportsRandomAccess()) { 4005 + debug3("tokenizer supports random-access, scanning for appending headers"); 4006 + await scanAppendingHeaders(tokenizer3, opts); 4007 + } else { 4008 + debug3("tokenizer does not support random-access, cannot scan for appending headers"); 4009 + } 4010 + if (!parserLoader) { 4011 + const buf = new Uint8Array(4100); 4012 + if (tokenizer3.fileInfo.mimeType) { 4013 + parserLoader = this.findLoaderForContentType(tokenizer3.fileInfo.mimeType); 4014 + } 4015 + if (!parserLoader && tokenizer3.fileInfo.path) { 4016 + parserLoader = this.findLoaderForExtension(tokenizer3.fileInfo.path); 4017 + } 4018 + if (!parserLoader) { 4019 + debug3("Guess parser on content..."); 4020 + await tokenizer3.peekBuffer(buf, { mayBeLess: true }); 4021 + const guessedType = await fileTypeFromBuffer(buf, { mpegOffsetTolerance: 10 }); 4022 + if (!guessedType || !guessedType.mime) { 4023 + throw new CouldNotDetermineFileTypeError("Failed to determine audio format"); 4024 + } 4025 + debug3(`Guessed file type is mime=${guessedType.mime}, extension=${guessedType.ext}`); 4026 + parserLoader = this.findLoaderForContentType(guessedType.mime); 4027 + if (!parserLoader) { 4028 + throw new UnsupportedFileTypeError(`Guessed MIME-type not supported: ${guessedType.mime}`); 4029 + } 4030 + } 4031 + } 4032 + debug3(`Loading ${parserLoader.parserType} parser...`); 4033 + const metadata = new MetadataCollector(opts); 4034 + const ParserImpl = await parserLoader.load(); 4035 + const parser = new ParserImpl(metadata, tokenizer3, opts ?? {}); 4036 + debug3(`Parser ${parserLoader.parserType} loaded`); 4037 + await parser.parse(); 4038 + if (metadata.format.trackInfo) { 4039 + if (metadata.format.hasAudio === void 0) { 4040 + metadata.setFormat("hasAudio", !!metadata.format.trackInfo.find((track) => track.type === TrackType.audio)); 4041 + } 4042 + if (metadata.format.hasVideo === void 0) { 4043 + metadata.setFormat("hasVideo", !!metadata.format.trackInfo.find((track) => track.type === TrackType.video)); 4044 + } 4045 + } 4046 + return metadata.toCommonMetadata(); 4047 + } 4048 + /** 4049 + * @param filePath - Path, filename or extension to audio file 4050 + * @return Parser submodule name 4051 + */ 4052 + findLoaderForExtension(filePath) { 4053 + if (!filePath) 4054 + return; 4055 + const extension = getExtension(filePath).toLocaleLowerCase() || filePath; 4056 + return this.parsers.find((parser) => parser.extensions.indexOf(extension) !== -1); 4057 + } 4058 + findLoaderForContentType(httpContentType) { 4059 + let mime; 4060 + if (!httpContentType) 4061 + return; 4062 + try { 4063 + mime = parseHttpContentType(httpContentType); 4064 + } catch (_err) { 4065 + debug3(`Invalid HTTP Content-Type header value: ${httpContentType}`); 4066 + return; 4067 + } 4068 + const subType = mime.subtype.indexOf("x-") === 0 ? mime.subtype.substring(2) : mime.subtype; 4069 + return this.parsers.find((parser) => parser.mimeTypes.find((loader) => loader.indexOf(`${mime.type}/${subType}`) !== -1)); 4070 + } 4071 + getSupportedMimeTypes() { 4072 + const mimeTypeSet = /* @__PURE__ */ new Set(); 4073 + this.parsers.forEach((loader) => { 4074 + loader.mimeTypes.forEach((mimeType) => { 4075 + mimeTypeSet.add(mimeType); 4076 + mimeTypeSet.add(mimeType.replace("/", "/x-")); 4077 + }); 4078 + }); 4079 + return Array.from(mimeTypeSet); 4080 + } 4081 + }; 4082 + function getExtension(fname) { 4083 + const i = fname.lastIndexOf("."); 4084 + return i === -1 ? "" : fname.substring(i); 4085 + } 4086 + __name(getExtension, "getExtension"); 4087 + 4088 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/lyrics3/Lyrics3.js 4089 + var endTag2 = "LYRICS200"; 4090 + async function getLyricsHeaderLength(tokenizer3) { 4091 + const fileSize = tokenizer3.fileInfo.size; 4092 + if (fileSize >= 143) { 4093 + const buf = new Uint8Array(15); 4094 + const position = tokenizer3.position; 4095 + await tokenizer3.readBuffer(buf, { position: fileSize - 143 }); 4096 + tokenizer3.setPosition(position); 4097 + const txt = textDecode(buf, "latin1"); 4098 + const tag = txt.substring(6); 4099 + if (tag === endTag2) { 4100 + return Number.parseInt(txt.substring(0, 6), 10) + 15; 4101 + } 4102 + } 4103 + return 0; 4104 + } 4105 + __name(getLyricsHeaderLength, "getLyricsHeaderLength"); 4106 + 4107 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/core.js 4108 + async function parseBlob(blob, options = {}) { 4109 + const tokenizer3 = fromBlob(blob); 4110 + try { 4111 + return await parseFromTokenizer(tokenizer3, options); 4112 + } finally { 4113 + await tokenizer3.close(); 4114 + } 4115 + } 4116 + __name(parseBlob, "parseBlob"); 4117 + async function parseWebStream(webStream, fileInfo, options = {}) { 4118 + const tokenizer3 = fromWebStream(webStream, { fileInfo: typeof fileInfo === "string" ? { mimeType: fileInfo } : fileInfo }); 4119 + try { 4120 + return await parseFromTokenizer(tokenizer3, options); 4121 + } finally { 4122 + await tokenizer3.close(); 4123 + } 4124 + } 4125 + __name(parseWebStream, "parseWebStream"); 4126 + function parseFromTokenizer(tokenizer3, options) { 4127 + const parserFactory = new ParserFactory(); 4128 + return parserFactory.parse(tokenizer3, void 0, options); 4129 + } 4130 + __name(parseFromTokenizer, "parseFromTokenizer"); 4131 + async function scanAppendingHeaders(tokenizer3, options = {}) { 4132 + let apeOffset = tokenizer3.fileInfo.size; 4133 + if (await hasID3v1Header(tokenizer3)) { 4134 + apeOffset -= 128; 4135 + const lyricsLen = await getLyricsHeaderLength(tokenizer3); 4136 + apeOffset -= lyricsLen; 4137 + } 4138 + options.apeHeader = await APEv2Parser.findApeFooterOffset(tokenizer3, apeOffset); 4139 + } 4140 + __name(scanAppendingHeaders, "scanAppendingHeaders"); 4141 + 4142 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/index.js 4143 + var debug4 = (0, import_debug4.default)("music-metadata:parser"); 4144 + 4145 + // components/processor/metadata/common.js 4146 + var URI = __toESM(require_uri_all()); 4147 + 4148 + // ../node_modules/.deno/@tokenizer+http@0.9.2/node_modules/@tokenizer/http/lib/http-client.js 4149 + var import_debug7 = __toESM(require_src()); 4150 + 4151 + // ../node_modules/.deno/peek-readable@5.4.2/node_modules/peek-readable/lib/EndOfStreamError.js 4152 + var defaultMessages = "End-Of-Stream"; 4153 + var EndOfStreamError2 = class extends Error { 4154 + static { 4155 + __name(this, "EndOfStreamError"); 4156 + } 4157 + constructor() { 4158 + super(defaultMessages); 4159 + } 4160 + }; 4161 + 4162 + // ../node_modules/.deno/strtok3@9.1.1/node_modules/strtok3/lib/AbstractTokenizer.js 4163 + var AbstractTokenizer2 = class { 4164 + static { 4165 + __name(this, "AbstractTokenizer"); 4166 + } 4167 + /** 4168 + * Constructor 4169 + * @param options Tokenizer options 4170 + * @protected 4171 + */ 4172 + constructor(options) { 4173 + this.numBuffer = new Uint8Array(8); 4174 + this.position = 0; 4175 + this.onClose = options?.onClose; 4176 + if (options?.abortSignal) { 4177 + options.abortSignal.addEventListener("abort", () => { 4178 + this.abort(); 4179 + }); 4180 + } 4181 + } 4182 + /** 4183 + * Read a token from the tokenizer-stream 4184 + * @param token - The token to read 4185 + * @param position - If provided, the desired position in the tokenizer-stream 4186 + * @returns Promise with token data 4187 + */ 4188 + async readToken(token, position = this.position) { 4189 + const uint8Array = new Uint8Array(token.len); 4190 + const len = await this.readBuffer(uint8Array, { position }); 4191 + if (len < token.len) 4192 + throw new EndOfStreamError2(); 4193 + return token.get(uint8Array, 0); 4194 + } 4195 + /** 4196 + * Peek a token from the tokenizer-stream. 4197 + * @param token - Token to peek from the tokenizer-stream. 4198 + * @param position - Offset where to begin reading within the file. If position is null, data will be read from the current file position. 4199 + * @returns Promise with token data 4200 + */ 4201 + async peekToken(token, position = this.position) { 4202 + const uint8Array = new Uint8Array(token.len); 4203 + const len = await this.peekBuffer(uint8Array, { position }); 4204 + if (len < token.len) 4205 + throw new EndOfStreamError2(); 4206 + return token.get(uint8Array, 0); 4207 + } 4208 + /** 4209 + * Read a numeric token from the stream 4210 + * @param token - Numeric token 4211 + * @returns Promise with number 4212 + */ 4213 + async readNumber(token) { 4214 + const len = await this.readBuffer(this.numBuffer, { length: token.len }); 4215 + if (len < token.len) 4216 + throw new EndOfStreamError2(); 4217 + return token.get(this.numBuffer, 0); 4218 + } 4219 + /** 4220 + * Read a numeric token from the stream 4221 + * @param token - Numeric token 4222 + * @returns Promise with number 4223 + */ 4224 + async peekNumber(token) { 4225 + const len = await this.peekBuffer(this.numBuffer, { length: token.len }); 4226 + if (len < token.len) 4227 + throw new EndOfStreamError2(); 4228 + return token.get(this.numBuffer, 0); 4229 + } 4230 + /** 4231 + * Ignore number of bytes, advances the pointer in under tokenizer-stream. 4232 + * @param length - Number of bytes to ignore 4233 + * @return resolves the number of bytes ignored, equals length if this available, otherwise the number of bytes available 4234 + */ 4235 + async ignore(length) { 4236 + if (this.fileInfo.size !== void 0) { 4237 + const bytesLeft = this.fileInfo.size - this.position; 4238 + if (length > bytesLeft) { 4239 + this.position += bytesLeft; 4240 + return bytesLeft; 4241 + } 4242 + } 4243 + this.position += length; 4244 + return length; 4245 + } 4246 + async close() { 4247 + await this.abort(); 4248 + await this.onClose?.(); 4249 + } 4250 + normalizeOptions(uint8Array, options) { 4251 + if (options && options.position !== void 0 && options.position < this.position) { 4252 + throw new Error("`options.position` must be equal or greater than `tokenizer.position`"); 4253 + } 4254 + if (options) { 4255 + return { 4256 + mayBeLess: options.mayBeLess === true, 4257 + offset: options.offset ? options.offset : 0, 4258 + length: options.length ? options.length : uint8Array.length - (options.offset ? options.offset : 0), 4259 + position: options.position ? options.position : this.position 4260 + }; 4261 + } 4262 + return { 4263 + mayBeLess: false, 4264 + offset: 0, 4265 + length: uint8Array.length, 4266 + position: this.position 4267 + }; 4268 + } 4269 + abort() { 4270 + return Promise.resolve(); 4271 + } 4272 + }; 4273 + 4274 + // ../node_modules/.deno/strtok3@9.1.1/node_modules/strtok3/lib/FileTokenizer.js 4275 + var FileTokenizer = class _FileTokenizer extends AbstractTokenizer2 { 4276 + static { 4277 + __name(this, "FileTokenizer"); 4278 + } 4279 + /** 4280 + * Create tokenizer from provided file path 4281 + * @param sourceFilePath File path 4282 + */ 4283 + static async fromFile(sourceFilePath) { 4284 + const fileHandle = await open2(sourceFilePath, "r"); 4285 + const stat = await fileHandle.stat(); 4286 + return new _FileTokenizer(fileHandle, { fileInfo: { path: sourceFilePath, size: stat.size } }); 4287 + } 4288 + constructor(fileHandle, options) { 4289 + super(options); 4290 + this.fileHandle = fileHandle; 4291 + this.fileInfo = options.fileInfo; 4292 + } 4293 + /** 4294 + * Read buffer from file 4295 + * @param uint8Array - Uint8Array to write result to 4296 + * @param options - Read behaviour options 4297 + * @returns Promise number of bytes read 4298 + */ 4299 + async readBuffer(uint8Array, options) { 4300 + const normOptions = this.normalizeOptions(uint8Array, options); 4301 + this.position = normOptions.position; 4302 + if (normOptions.length === 0) 4303 + return 0; 4304 + const res = await this.fileHandle.read(uint8Array, normOptions.offset, normOptions.length, normOptions.position); 4305 + this.position += res.bytesRead; 4306 + if (res.bytesRead < normOptions.length && (!options || !options.mayBeLess)) { 4307 + throw new EndOfStreamError2(); 4308 + } 4309 + return res.bytesRead; 4310 + } 4311 + /** 4312 + * Peek buffer from file 4313 + * @param uint8Array - Uint8Array (or Buffer) to write data to 4314 + * @param options - Read behaviour options 4315 + * @returns Promise number of bytes read 4316 + */ 4317 + async peekBuffer(uint8Array, options) { 4318 + const normOptions = this.normalizeOptions(uint8Array, options); 4319 + const res = await this.fileHandle.read(uint8Array, normOptions.offset, normOptions.length, normOptions.position); 4320 + if (!normOptions.mayBeLess && res.bytesRead < normOptions.length) { 4321 + throw new EndOfStreamError2(); 4322 + } 4323 + return res.bytesRead; 4324 + } 4325 + async close() { 4326 + await this.fileHandle.close(); 4327 + return super.close(); 4328 + } 4329 + setPosition(position) { 4330 + this.position = position; 4331 + } 4332 + supportsRandomAccess() { 4333 + return true; 4334 + } 4335 + }; 4336 + 4337 + // ../node_modules/.deno/strtok3@9.1.1/node_modules/strtok3/lib/index.js 4338 + var fromFile2 = FileTokenizer.fromFile; 4339 + 4340 + // ../node_modules/.deno/@tokenizer+range@0.12.0/node_modules/@tokenizer/range/lib/range-request-tokenizer.js 4341 + var import_debug5 = __toESM(require_src()); 4342 + var debug5 = (0, import_debug5.default)("range-request-reader"); 4343 + function parseContentRange(contentRange) { 4344 + if (!contentRange) { 4345 + throw new Error("Content range must be provided"); 4346 + } 4347 + debug5(`parseContentRange response: contentRange=${contentRange}`); 4348 + const parsedContentRange = contentRange.match(/bytes (\d+)-(\d+)\/(?:(\d+)|\*)/i); 4349 + if (!parsedContentRange) { 4350 + throw new Error(`FIXME: Unknown Content-Range syntax: ${contentRange}`); 4351 + } 4352 + return { 4353 + firstBytePosition: Number.parseInt(parsedContentRange[1], 10), 4354 + lastBytePosition: Number.parseInt(parsedContentRange[2], 10), 4355 + instanceLength: parsedContentRange[3] ? Number.parseInt(parsedContentRange[3], 10) : void 0 4356 + }; 4357 + } 4358 + __name(parseContentRange, "parseContentRange"); 4359 + 4360 + // ../node_modules/.deno/@tokenizer+range@0.12.0/node_modules/@tokenizer/range/lib/range-request-factory.js 4361 + var import_debug6 = __toESM(require_src()); 4362 + var debug6 = (0, import_debug6.default)("range-request-reader"); 4363 + 4364 + // ../node_modules/.deno/@tokenizer+http@0.9.2/node_modules/@tokenizer/http/lib/response-info.js 4365 + var ResponseInfo = class { 4366 + static { 4367 + __name(this, "ResponseInfo"); 4368 + } 4369 + constructor(response) { 4370 + this.response = response; 4371 + } 4372 + getContentLength() { 4373 + const contentLength = this.response.headers.get("Content-Length"); 4374 + return contentLength ? Number.parseInt(contentLength, 10) : void 0; 4375 + } 4376 + getAcceptRangesHeaderValue() { 4377 + return this.response.headers.get("Accept-Ranges"); 4378 + } 4379 + getContentType() { 4380 + return this.response.headers.get("Content-Type"); 4381 + } 4382 + acceptRanges() { 4383 + const value = this.getAcceptRangesHeaderValue(); 4384 + return value !== null && value.trim().toLowerCase() === "bytes"; 4385 + } 4386 + getContentRange() { 4387 + const contentRange = this.response.headers.get("Content-Range"); 4388 + if (!contentRange) { 4389 + return; 4390 + } 4391 + return parseContentRange(contentRange); 4392 + } 4393 + toRangeRequestResponse() { 4394 + const contentRange = this.getContentRange(); 4395 + const size = contentRange ? contentRange.instanceLength : this.getContentLength(); 4396 + if (typeof size !== "number") { 4397 + throw new Error("Could not determine file-size from HTTP response"); 4398 + } 4399 + return { 4400 + url: this.response.url, 4401 + size, 4402 + mimeType: this.getContentType() ?? void 0, 4403 + acceptPartialRequests: this.acceptRanges(), 4404 + contentRange, 4405 + arrayBuffer: /* @__PURE__ */ __name(() => this.response.arrayBuffer().then((res) => new Uint8Array(res)), "arrayBuffer") 4406 + }; 4407 + } 4408 + }; 4409 + 4410 + // ../node_modules/.deno/@tokenizer+http@0.9.2/node_modules/@tokenizer/http/lib/http-client.js 4411 + var debug7 = (0, import_debug7.default)("streaming-http-token-reader:http-client"); 4412 + var DEFAULT_CONFIG = { 4413 + resolveUrl: false 4414 + }; 4415 + var HttpClient = class { 4416 + static { 4417 + __name(this, "HttpClient"); 4418 + } 4419 + constructor(url, config) { 4420 + this.url = url; 4421 + this.abortController = new AbortController(); 4422 + this.config = DEFAULT_CONFIG; 4423 + Object.assign(this.config, config); 4424 + } 4425 + async getHeadInfo() { 4426 + const response = new ResponseInfo(await fetch(this.url, { method: "HEAD", signal: this.abortController.signal })); 4427 + if (this.config.resolveUrl) 4428 + this.resolvedUrl = response.response.url; 4429 + return response.toRangeRequestResponse(); 4430 + } 4431 + async getResponse(method, range) { 4432 + const headers = new Headers(); 4433 + if (range) { 4434 + debug7(`_getResponse ${method} ${range[0]}..${range[1]}`); 4435 + headers.set("Range", `bytes=${range[0]}-${range[1]}`); 4436 + } else { 4437 + debug7(`_getResponse ${method} (range not provided)`); 4438 + } 4439 + const response = new ResponseInfo(await fetch(this.resolvedUrl || this.url, { method, headers, signal: this.abortController.signal })); 4440 + if (response.response.ok) { 4441 + if (this.config.resolveUrl) 4442 + this.resolvedUrl = response.response.url; 4443 + return response.toRangeRequestResponse(); 4444 + } 4445 + throw new Error(`Unexpected HTTP response status=${response.response.status}`); 4446 + } 4447 + abort() { 4448 + debug7("abort"); 4449 + this.abortController.abort(); 4450 + } 4451 + }; 4452 + 4453 + // ../node_modules/.deno/@tokenizer+range@0.13.0/node_modules/@tokenizer/range/lib/chunked-file-data.js 4454 + var NOT_FOUND = -1; 4455 + var ChunkedFileData2 = class { 4456 + static { 4457 + __name(this, "ChunkedFileData"); 4458 + } 4459 + constructor() { 4460 + this._fileData = []; 4461 + } 4462 + /** 4463 + * Adds data to the file storage at a specific offset. 4464 + */ 4465 + addData(offset, data) { 4466 + const offsetEnd = offset + data.byteLength - 1; 4467 + const chunkRange = this._getChunkRange(offset, offsetEnd); 4468 + if (chunkRange.startIx === NOT_FOUND) { 4469 + this._fileData.splice(chunkRange.insertIx || 0, 0, { 4470 + offset, 4471 + data 4472 + }); 4473 + } else { 4474 + const firstChunk = this._fileData[chunkRange.startIx]; 4475 + const lastChunk = this._fileData[chunkRange.endIx]; 4476 + const needsPrepend = offset > firstChunk.offset; 4477 + const needsAppend = offsetEnd < lastChunk.offset + lastChunk.data.byteLength - 1; 4478 + const chunk = { 4479 + offset: Math.min(offset, firstChunk.offset), 4480 + data 4481 + }; 4482 + if (needsPrepend) { 4483 + const slicedData = firstChunk.data.slice(0, offset - firstChunk.offset); 4484 + chunk.data = this._concatData(slicedData, data); 4485 + } 4486 + if (needsAppend) { 4487 + const slicedData = chunk.data.slice(0, lastChunk.offset - chunk.offset); 4488 + chunk.data = this._concatData(slicedData, lastChunk.data); 4489 + } 4490 + this._fileData.splice(chunkRange.startIx, chunkRange.endIx - chunkRange.startIx + 1, chunk); 4491 + } 4492 + } 4493 + hasDataRange(offsetStart, offsetEnd) { 4494 + for (let i = 0; i < this._fileData.length; i++) { 4495 + const chunk = this._fileData[i]; 4496 + if (offsetEnd < chunk.offset) { 4497 + return false; 4498 + } 4499 + if (offsetStart >= chunk.offset && offsetEnd < chunk.offset + chunk.data.byteLength) { 4500 + return true; 4501 + } 4502 + } 4503 + return false; 4504 + } 4505 + readToBuffer(buffer, offset, position, length) { 4506 + const _pos_offset = position; 4507 + let dataChunk; 4508 + for (let i = 0; i < this._fileData.length; i++) { 4509 + const dataChunkStart = this._fileData[i].offset; 4510 + const dataChunkEnd = dataChunkStart + this._fileData[i].data.byteLength; 4511 + if (_pos_offset >= dataChunkStart && _pos_offset < dataChunkEnd) { 4512 + dataChunk = this._fileData[i]; 4513 + const chunkOffset = _pos_offset - dataChunkStart; 4514 + let chunkLength = Math.min(length, dataChunk.data.byteLength - chunkOffset); 4515 + buffer.set(dataChunk.data.subarray(chunkOffset, chunkOffset + chunkLength), offset); 4516 + if (chunkLength < length) { 4517 + chunkLength += this.readToBuffer(buffer, offset + chunkLength, position + chunkLength, length - chunkLength); 4518 + } 4519 + return chunkLength; 4520 + } 4521 + } 4522 + return 0; 4523 + } 4524 + _concatData(buffer1, buffer2) { 4525 + const tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength); 4526 + tmp.set(new Uint8Array(buffer1), 0); 4527 + tmp.set(new Uint8Array(buffer2), buffer1.byteLength); 4528 + return tmp; 4529 + } 4530 + /** 4531 + * Finds the chunk range that overlaps the [offsetStart-1,offsetEnd+1] range. 4532 + * When a chunk is adjacent to the offset we still consider it part of the 4533 + * range (this is the situation of offsetStart-1 or offsetEnd+1). 4534 + * When no chunks are found `insertIx` denotes the index where the data 4535 + * should be inserted in the data list (startIx == NOT_FOUND and endIX == 4536 + * NOT_FOUND). 4537 + */ 4538 + _getChunkRange(offsetStart, offsetEnd) { 4539 + let startChunkIx = NOT_FOUND; 4540 + let endChunkIx = NOT_FOUND; 4541 + let insertIx = 0; 4542 + for (let i = 0; i < this._fileData.length; i++, insertIx = i) { 4543 + const chunkOffsetStart = this._fileData[i].offset; 4544 + const chunkOffsetEnd = chunkOffsetStart + this._fileData[i].data.byteLength; 4545 + if (offsetEnd < chunkOffsetStart - 1) { 4546 + break; 4547 + } 4548 + if (offsetStart <= chunkOffsetEnd + 1 && offsetEnd >= chunkOffsetStart - 1) { 4549 + startChunkIx = i; 4550 + break; 4551 + } 4552 + } 4553 + if (startChunkIx === NOT_FOUND) { 4554 + return { 4555 + startIx: NOT_FOUND, 4556 + endIx: NOT_FOUND, 4557 + insertIx 4558 + }; 4559 + } 4560 + for (let i = startChunkIx; i < this._fileData.length; i++) { 4561 + const chunkOffsetStart = this._fileData[i].offset; 4562 + const chunkOffsetEnd = chunkOffsetStart + this._fileData[i].data.byteLength; 4563 + if (offsetEnd >= chunkOffsetStart - 1) { 4564 + endChunkIx = i; 4565 + } 4566 + if (offsetEnd <= chunkOffsetEnd + 1) { 4567 + break; 4568 + } 4569 + } 4570 + if (endChunkIx === NOT_FOUND) { 4571 + endChunkIx = startChunkIx; 4572 + } 4573 + return { 4574 + startIx: startChunkIx, 4575 + endIx: endChunkIx 4576 + }; 4577 + } 4578 + }; 4579 + 4580 + // ../node_modules/.deno/@tokenizer+range@0.13.0/node_modules/@tokenizer/range/lib/range-request-tokenizer.js 4581 + var import_debug8 = __toESM(require_src()); 4582 + var debug8 = (0, import_debug8.default)("range-request-reader"); 4583 + var RangeRequestTokenizer2 = class extends AbstractTokenizer { 4584 + static { 4585 + __name(this, "RangeRequestTokenizer"); 4586 + } 4587 + constructor(rangeRequestClient, options) { 4588 + super({ fileInfo: options.fileInfo }); 4589 + this.rangeRequestClient = rangeRequestClient; 4590 + this.options = options; 4591 + this.fileInfo = options.fileInfo; 4592 + if (Number.isNaN(options.minimumChunkSize)) { 4593 + throw new Error("minimumChunkSize must be a number"); 4594 + } 4595 + this._fileData = new ChunkedFileData2(); 4596 + this.options.abortSignal?.addEventListener("abort", () => { 4597 + this.abort(); 4598 + }); 4599 + } 4600 + setPosition(position) { 4601 + this.position = position; 4602 + } 4603 + /** 4604 + * Read portion from stream 4605 + * @param uint8array - Target `Uint8Array` 4606 + * @param options - Additional read options 4607 + * @returns Promise with number of bytes read 4608 + */ 4609 + async readBuffer(uint8array, options) { 4610 + if (options?.position) { 4611 + this.position = options.position; 4612 + } 4613 + const length = await this.peekBuffer(uint8array, options); 4614 + this.position += length; 4615 + return length; 4616 + } 4617 + /** 4618 + * Peek (read ahead) buffer from tokenizer 4619 + * @param uint8array - Target `Uint8Array` to fill with data peek from the tokenizer-stream 4620 + * @param options - Additional read options 4621 + * @returns Promise with number of bytes read 4622 + */ 4623 + async peekBuffer(uint8array, options) { 4624 + let length = uint8array.length; 4625 + const offset = 0; 4626 + let position = this.position; 4627 + if (options) { 4628 + if (options.position) { 4629 + position = options.position; 4630 + } 4631 + if (options.length) { 4632 + length = options.length; 4633 + } else { 4634 + length -= offset; 4635 + } 4636 + } 4637 + if (length === 0) { 4638 + return 0; 4639 + } 4640 + debug8(`peekBuffer position=${position} length=${length}`); 4641 + if (!this.fileInfo) 4642 + throw new Error("File-info missing"); 4643 + const lastPos = Math.min(this.fileInfo.size - 1, position + length - 1); 4644 + await this.loadRange([position, lastPos]); 4645 + this._fileData.readToBuffer(uint8array, offset, position, Math.min(this.fileInfo.size, length)); 4646 + return length; 4647 + } 4648 + /** 4649 + * Ignore number of bytes, advances the pointer in under tokenizer-stream. 4650 + * @param length - Number of bytes to skip (ignore) 4651 + * @return actual number of bytes ignored 4652 + */ 4653 + async ignore(length) { 4654 + const bytesLeft = this.fileInfo.size - this.position; 4655 + if (length <= bytesLeft) { 4656 + this.position += length; 4657 + return length; 4658 + } 4659 + this.position += bytesLeft; 4660 + return bytesLeft; 4661 + } 4662 + async abort() { 4663 + this.rangeRequestClient.abort(); 4664 + } 4665 + supportsRandomAccess() { 4666 + return true; 4667 + } 4668 + async loadRange(range) { 4669 + if (range[0] > this.fileInfo.size - 1) { 4670 + throw new Error("End-Of-File"); 4671 + } 4672 + debug8(`request range ${range[0]}..${range[1]}`); 4673 + debug8(`adjusted range ${range[0]}..${range[1]}`); 4674 + if (this._fileData.hasDataRange(range[0], range[1])) { 4675 + debug8("Read from cache"); 4676 + return; 4677 + } 4678 + range = roundRange2(range, this.options.minimumChunkSize); 4679 + range[1] = Math.min(this.fileInfo.size - 1, range[1]); 4680 + debug8(`blocked range: ${range[0]}..${range[1]}`); 4681 + return this.rangeRequestClient.getResponse("GET", range).then((response) => { 4682 + return response.arrayBuffer().then((data) => { 4683 + this._fileData.addData(range[0], data); 4684 + }); 4685 + }); 4686 + } 4687 + }; 4688 + function roundRange2(range, minimumChunkSize) { 4689 + const length = range[1] - range[0] + 1; 4690 + const newLength = Math.max(minimumChunkSize, length); 4691 + return [range[0], range[0] + newLength - 1]; 4692 + } 4693 + __name(roundRange2, "roundRange"); 4694 + 4695 + // ../node_modules/.deno/@tokenizer+range@0.13.0/node_modules/@tokenizer/range/lib/range-request-factory.js 4696 + var import_debug9 = __toESM(require_src()); 4697 + var debug9 = (0, import_debug9.default)("range-request-reader"); 4698 + var RangeRequestFactory2 = class { 4699 + static { 4700 + __name(this, "RangeRequestFactory"); 4701 + } 4702 + constructor(rangeRequestClient) { 4703 + this.rangeRequestClient = rangeRequestClient; 4704 + this.config = { 4705 + avoidHeadRequests: false, 4706 + initialChunkSize: 4 * 1024, 4707 + minimumChunkSize: 1024 4708 + }; 4709 + } 4710 + async initTokenizer(config) { 4711 + if (config) { 4712 + this.config = { ...this.config, ...config }; 4713 + } 4714 + const headRequestInfo = await this.getHeadRequestInfo(); 4715 + if (!headRequestInfo.acceptPartialRequests) { 4716 + throw new Error("Server does not accept partial requests"); 4717 + } 4718 + return new RangeRequestTokenizer2(this.rangeRequestClient, { 4719 + fileInfo: headRequestInfo, 4720 + minimumChunkSize: this.config.minimumChunkSize, 4721 + abortSignal: config?.abortSignal 4722 + }); 4723 + } 4724 + /** 4725 + * Get file information, an HTTP-client may implement this doing a HEAD request 4726 + * @return Promise with head-request-info, extending tokenizer file-info. 4727 + */ 4728 + getHeadRequestInfo() { 4729 + return this.config.avoidHeadRequests ? this.fetchFileInfoWithGetRequest() : this.fetchFileInfoWithHeadRequest(); 4730 + } 4731 + async fetchFileInfoWithHeadRequest() { 4732 + debug9("_fetchSizeWithHeadRequest()"); 4733 + if (this.rangeRequestClient.getHeadInfo) { 4734 + const info = await this.rangeRequestClient.getHeadInfo(); 4735 + if (info.size) { 4736 + debug9(`MIME-type=${info.mimeType}, content-length=${info.size}, accept-partial-requests=${info.acceptPartialRequests}`); 4737 + return info; 4738 + } 4739 + } 4740 + debug9("Content-Length not provided by the server, fallback to GET requests"); 4741 + return this.fetchFileInfoWithGetRequest(); 4742 + } 4743 + async fetchFileInfoWithGetRequest() { 4744 + const range = roundRange2([0, this.config.initialChunkSize], this.config.minimumChunkSize); 4745 + const response = await this.rangeRequestClient.getResponse("GET", range); 4746 + debug9(`_fetchSizeWithGetRequest response: contentRange=[${response.contentRange?.firstBytePosition}-${response.contentRange?.lastBytePosition}/${response.contentRange?.instanceLength}]`); 4747 + if (!response.contentRange) { 4748 + throw new Error("Failed to resolve content range (file size)"); 4749 + } 4750 + return response; 4751 + } 4752 + }; 4753 + 4754 + // ../node_modules/.deno/@tokenizer+range@0.13.0/node_modules/@tokenizer/range/lib/index.js 4755 + function tokenizer2(rangeRequestClient, config) { 4756 + const factory = new RangeRequestFactory2(rangeRequestClient); 4757 + return factory.initTokenizer(config); 4758 + } 4759 + __name(tokenizer2, "tokenizer"); 4760 + 4761 + // components/processor/metadata/common.js 4762 + async function musicMetadataTags({ 4763 + includeArtwork, 4764 + mimeType, 4765 + stream, 4766 + urls 4767 + }) { 4768 + const uri = urls ? URI.parse(urls.get) : void 0; 4769 + const pathParts = uri?.path?.split("/"); 4770 + const filename = pathParts?.[pathParts.length - 1]; 4771 + let meta; 4772 + if (urls?.get.startsWith("blob:")) { 4773 + const blob = await fetch(urls.get).then((r) => r.blob()); 4774 + meta = await parseBlob(blob, { skipCovers: !includeArtwork }); 4775 + } else if (urls) { 4776 + const httpClient = new HttpClient(urls.head, { 4777 + resolveUrl: false 4778 + }); 4779 + httpClient.resolvedUrl = urls.get; 4780 + const getHeadInfo = httpClient.getHeadInfo; 4781 + httpClient.getHeadInfo = async () => { 4782 + const info = await getHeadInfo.call(httpClient); 4783 + return { ...info, acceptPartialRequests: true }; 4784 + }; 4785 + const tokenizer3 = await tokenizer2(httpClient); 4786 + meta = await parseFromTokenizer(tokenizer3, { skipCovers: !includeArtwork }); 4787 + } else if (stream) { 4788 + meta = await parseWebStream(stream, { mimeType }, { 4789 + skipCovers: !includeArtwork 4790 + }); 4791 + } else { 4792 + throw new Error("Missing args, need either some urls or a stream."); 4793 + } 4794 + const statsFull = { 4795 + albumGain: meta.format.albumGain, 4796 + bitrate: meta.format.bitrate, 4797 + bitsPerSample: meta.format.bitsPerSample, 4798 + codec: meta.format.codec, 4799 + container: meta.format.container, 4800 + duration: meta.format.duration, 4801 + lossless: meta.format.lossless, 4802 + numberOfChannels: meta.format.numberOfChannels, 4803 + sampleRate: meta.format.sampleRate, 4804 + trackGain: meta.format.trackGain 4805 + }; 4806 + const tagsFull = { 4807 + album: meta.common.album, 4808 + albumartist: meta.common.albumartist, 4809 + albumartists: Array.isArray(meta.common.albumartist) ? meta.common.albumartist : meta.common.albumartist ? [meta.common.albumartist] : void 0, 4810 + albumartistsort: meta.common.albumartistsort, 4811 + albumsort: meta.common.albumsort, 4812 + arranger: meta.common.arranger, 4813 + artist: meta.common.artist, 4814 + artists: meta.common.artists ?? (meta.common.artist ? [meta.common.artist] : []), 4815 + artistsort: meta.common.artistsort, 4816 + asin: meta.common.asin, 4817 + averageLevel: meta.common.averageLevel, 4818 + barcode: meta.common.barcode, 4819 + bpm: meta.common.bpm, 4820 + catalognumbers: meta.common.catalognumber, 4821 + compilation: meta.common.compilation, 4822 + composers: meta.common.composer, 4823 + composersort: meta.common.composersort, 4824 + conductors: meta.common.conductor, 4825 + date: meta.common.date, 4826 + disc: { 4827 + no: meta.common.disk.no || 1, 4828 + ...meta.common.disk.of && { of: meta.common.disk.of } 4829 + }, 4830 + djmixers: meta.common.djmixer, 4831 + engineers: meta.common.engineer, 4832 + gapless: meta.common.gapless, 4833 + genres: Array.isArray(meta.common.genre) ? meta.common.genre : meta.common.genre ? [meta.common.genre] : void 0, 4834 + isrc: meta.common.isrc, 4835 + labels: meta.common.label, 4836 + lyricists: meta.common.lyricist, 4837 + media: meta.common.media, 4838 + mixers: meta.common.mixer, 4839 + moods: Array.isArray(meta.common.mood) ? meta.common.mood : meta.common.mood ? [meta.common.mood] : void 0, 4840 + originaldate: meta.common.originaldate, 4841 + originalyear: meta.common.originalyear, 4842 + peakLevel: meta.common.peakLevel, 4843 + producers: meta.common.producer, 4844 + publishers: meta.common.publisher, 4845 + releasecountry: meta.common.releasecountry, 4846 + releasedate: meta.common.releasedate, 4847 + releasestatus: meta.common.releasestatus, 4848 + releasetypes: meta.common.releasetype, 4849 + remixers: meta.common.remixer, 4850 + technicians: meta.common.technician, 4851 + title: meta.common.title || filename || urls?.head || "Unknown", 4852 + titlesort: meta.common.titlesort, 4853 + track: { 4854 + no: meta.common.track.no || 1, 4855 + ...meta.common.track.of && { of: meta.common.track.of } 4856 + }, 4857 + work: meta.common.work, 4858 + writers: meta.common.writer, 4859 + year: meta.common.year 4860 + }; 4861 + const stats = removeUndefinedValuesFromRecord(statsFull); 4862 + const tags = removeUndefinedValuesFromRecord(tagsFull); 4863 + return { 4864 + artwork: includeArtwork ? meta.common.picture : void 0, 4865 + stats, 4866 + tags 4867 + }; 4868 + } 4869 + __name(musicMetadataTags, "musicMetadataTags"); 4870 + 4871 + export { 4872 + musicMetadataTags 4873 + }; 4874 + /*! Bundled license information: 4875 + 4876 + content-type/index.js: 4877 + (*! 4878 + * content-type 4879 + * Copyright(c) 2015 Douglas Christopher Wilson 4880 + * MIT Licensed 4881 + *) 4882 + 4883 + media-typer/index.js: 4884 + (*! 4885 + * media-typer 4886 + * Copyright(c) 2014-2017 Douglas Christopher Wilson 4887 + * MIT Licensed 4888 + *) 4889 + */ 4890 + 4891 + //# sourceMappingURL=./chunk-6WU6XF6M.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-6WU6XF6M.js.map
··· 1 + {"version":3,"sources":["/node_modules/.deno/content-type@1.0.5/node_modules/content-type/index.js","/node_modules/.deno/media-typer@1.1.0/node_modules/media-typer/index.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/index.js","/node_modules/.deno/@tokenizer+inflate@0.4.1/node_modules/@tokenizer/inflate/lib/ZipHandler.js","/node_modules/.deno/@tokenizer+inflate@0.4.1/node_modules/@tokenizer/inflate/lib/ZipToken.js","/node_modules/.deno/@tokenizer+inflate@0.4.1/node_modules/@tokenizer/inflate/lib/GzipHandler.js","/node_modules/.deno/file-type@21.3.0/node_modules/file-type/util.js","/node_modules/.deno/file-type@21.3.0/node_modules/file-type/supported.js","/node_modules/.deno/file-type@21.3.0/node_modules/file-type/core.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ParserFactory.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/common/MetadataCollector.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/common/GenericTagTypes.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/common/GenericTagMapper.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/id3v1/ID3v1TagMap.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/common/CaseInsensitiveTagMap.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/id3v2/ID3v24TagMapper.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/asf/AsfTagMapper.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/id3v2/ID3v22TagMapper.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/apev2/APEv2TagMapper.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/mp4/MP4TagMapper.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/vorbis/VorbisTagMapper.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/riff/RiffInfoTagMap.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/matroska/MatroskaTagMapper.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/aiff/AiffTagMap.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/common/CombinedTagMapper.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/lrc/LyricsParser.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/mpeg/MpegLoader.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/apev2/Apev2Loader.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/asf/AsfLoader.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/dsdiff/DsdiffLoader.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/aiff/AiffLoader.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/dsf/DsfLoader.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/flac/FlacLoader.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/matroska/MatroskaLoader.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/mp4/Mp4Loader.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/musepack/MusepackLoader.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/OggLoader.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/wavpack/WavPackLoader.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/wav/WaveLoader.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/lyrics3/Lyrics3.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/core.js","/components/processor/metadata/common.js","/node_modules/.deno/@tokenizer+http@0.9.2/node_modules/@tokenizer/http/lib/http-client.js","/node_modules/.deno/peek-readable@5.4.2/node_modules/peek-readable/lib/EndOfStreamError.js","/node_modules/.deno/strtok3@9.1.1/node_modules/strtok3/lib/AbstractTokenizer.js","/node_modules/.deno/strtok3@9.1.1/node_modules/strtok3/lib/FileTokenizer.js","/node_modules/.deno/strtok3@9.1.1/node_modules/strtok3/lib/index.js","/node_modules/.deno/@tokenizer+range@0.12.0/node_modules/@tokenizer/range/lib/range-request-tokenizer.js","/node_modules/.deno/@tokenizer+range@0.12.0/node_modules/@tokenizer/range/lib/range-request-factory.js","/node_modules/.deno/@tokenizer+http@0.9.2/node_modules/@tokenizer/http/lib/response-info.js","/node_modules/.deno/@tokenizer+range@0.13.0/node_modules/@tokenizer/range/lib/chunked-file-data.js","/node_modules/.deno/@tokenizer+range@0.13.0/node_modules/@tokenizer/range/lib/range-request-tokenizer.js","/node_modules/.deno/@tokenizer+range@0.13.0/node_modules/@tokenizer/range/lib/range-request-factory.js","/node_modules/.deno/@tokenizer+range@0.13.0/node_modules/@tokenizer/range/lib/index.js"],"sourcesContent":["/*!\n * content-type\n * Copyright(c) 2015 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n'use strict'\n\n/**\n * RegExp to match *( \";\" parameter ) in RFC 7231 sec 3.1.1.1\n *\n * parameter = token \"=\" ( token / quoted-string )\n * token = 1*tchar\n * tchar = \"!\" / \"#\" / \"$\" / \"%\" / \"&\" / \"'\" / \"*\"\n * / \"+\" / \"-\" / \".\" / \"^\" / \"_\" / \"`\" / \"|\" / \"~\"\n * / DIGIT / ALPHA\n * ; any VCHAR, except delimiters\n * quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE\n * qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text\n * obs-text = %x80-FF\n * quoted-pair = \"\\\" ( HTAB / SP / VCHAR / obs-text )\n */\nvar PARAM_REGEXP = /; *([!#$%&'*+.^_`|~0-9A-Za-z-]+) *= *(\"(?:[\\u000b\\u0020\\u0021\\u0023-\\u005b\\u005d-\\u007e\\u0080-\\u00ff]|\\\\[\\u000b\\u0020-\\u00ff])*\"|[!#$%&'*+.^_`|~0-9A-Za-z-]+) */g // eslint-disable-line no-control-regex\nvar TEXT_REGEXP = /^[\\u000b\\u0020-\\u007e\\u0080-\\u00ff]+$/ // eslint-disable-line no-control-regex\nvar TOKEN_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/\n\n/**\n * RegExp to match quoted-pair in RFC 7230 sec 3.2.6\n *\n * quoted-pair = \"\\\" ( HTAB / SP / VCHAR / obs-text )\n * obs-text = %x80-FF\n */\nvar QESC_REGEXP = /\\\\([\\u000b\\u0020-\\u00ff])/g // eslint-disable-line no-control-regex\n\n/**\n * RegExp to match chars that must be quoted-pair in RFC 7230 sec 3.2.6\n */\nvar QUOTE_REGEXP = /([\\\\\"])/g\n\n/**\n * RegExp to match type in RFC 7231 sec 3.1.1.1\n *\n * media-type = type \"/\" subtype\n * type = token\n * subtype = token\n */\nvar TYPE_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+\\/[!#$%&'*+.^_`|~0-9A-Za-z-]+$/\n\n/**\n * Module exports.\n * @public\n */\n\nexports.format = format\nexports.parse = parse\n\n/**\n * Format object to media type.\n *\n * @param {object} obj\n * @return {string}\n * @public\n */\n\nfunction format (obj) {\n if (!obj || typeof obj !== 'object') {\n throw new TypeError('argument obj is required')\n }\n\n var parameters = obj.parameters\n var type = obj.type\n\n if (!type || !TYPE_REGEXP.test(type)) {\n throw new TypeError('invalid type')\n }\n\n var string = type\n\n // append parameters\n if (parameters && typeof parameters === 'object') {\n var param\n var params = Object.keys(parameters).sort()\n\n for (var i = 0; i < params.length; i++) {\n param = params[i]\n\n if (!TOKEN_REGEXP.test(param)) {\n throw new TypeError('invalid parameter name')\n }\n\n string += '; ' + param + '=' + qstring(parameters[param])\n }\n }\n\n return string\n}\n\n/**\n * Parse media type to object.\n *\n * @param {string|object} string\n * @return {Object}\n * @public\n */\n\nfunction parse (string) {\n if (!string) {\n throw new TypeError('argument string is required')\n }\n\n // support req/res-like objects as argument\n var header = typeof string === 'object'\n ? getcontenttype(string)\n : string\n\n if (typeof header !== 'string') {\n throw new TypeError('argument string is required to be a string')\n }\n\n var index = header.indexOf(';')\n var type = index !== -1\n ? header.slice(0, index).trim()\n : header.trim()\n\n if (!TYPE_REGEXP.test(type)) {\n throw new TypeError('invalid media type')\n }\n\n var obj = new ContentType(type.toLowerCase())\n\n // parse parameters\n if (index !== -1) {\n var key\n var match\n var value\n\n PARAM_REGEXP.lastIndex = index\n\n while ((match = PARAM_REGEXP.exec(header))) {\n if (match.index !== index) {\n throw new TypeError('invalid parameter format')\n }\n\n index += match[0].length\n key = match[1].toLowerCase()\n value = match[2]\n\n if (value.charCodeAt(0) === 0x22 /* \" */) {\n // remove quotes\n value = value.slice(1, -1)\n\n // remove escapes\n if (value.indexOf('\\\\') !== -1) {\n value = value.replace(QESC_REGEXP, '$1')\n }\n }\n\n obj.parameters[key] = value\n }\n\n if (index !== header.length) {\n throw new TypeError('invalid parameter format')\n }\n }\n\n return obj\n}\n\n/**\n * Get content-type from req/res objects.\n *\n * @param {object}\n * @return {Object}\n * @private\n */\n\nfunction getcontenttype (obj) {\n var header\n\n if (typeof obj.getHeader === 'function') {\n // res-like\n header = obj.getHeader('content-type')\n } else if (typeof obj.headers === 'object') {\n // req-like\n header = obj.headers && obj.headers['content-type']\n }\n\n if (typeof header !== 'string') {\n throw new TypeError('content-type header is missing from object')\n }\n\n return header\n}\n\n/**\n * Quote a string if necessary.\n *\n * @param {string} val\n * @return {string}\n * @private\n */\n\nfunction qstring (val) {\n var str = String(val)\n\n // no need to quote tokens\n if (TOKEN_REGEXP.test(str)) {\n return str\n }\n\n if (str.length > 0 && !TEXT_REGEXP.test(str)) {\n throw new TypeError('invalid parameter value')\n }\n\n return '\"' + str.replace(QUOTE_REGEXP, '\\\\$1') + '\"'\n}\n\n/**\n * Class to represent a content type.\n * @private\n */\nfunction ContentType (type) {\n this.parameters = Object.create(null)\n this.type = type\n}\n","/*!\n * media-typer\n * Copyright(c) 2014-2017 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n'use strict'\n\n/**\n * RegExp to match type in RFC 6838\n *\n * type-name = restricted-name\n * subtype-name = restricted-name\n * restricted-name = restricted-name-first *126restricted-name-chars\n * restricted-name-first = ALPHA / DIGIT\n * restricted-name-chars = ALPHA / DIGIT / \"!\" / \"#\" /\n * \"$\" / \"&\" / \"-\" / \"^\" / \"_\"\n * restricted-name-chars =/ \".\" ; Characters before first dot always\n * ; specify a facet name\n * restricted-name-chars =/ \"+\" ; Characters after last plus always\n * ; specify a structured syntax suffix\n * ALPHA = %x41-5A / %x61-7A ; A-Z / a-z\n * DIGIT = %x30-39 ; 0-9\n */\nvar SUBTYPE_NAME_REGEXP = /^[A-Za-z0-9][A-Za-z0-9!#$&^_.-]{0,126}$/\nvar TYPE_NAME_REGEXP = /^[A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126}$/\nvar TYPE_REGEXP = /^ *([A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126})\\/([A-Za-z0-9][A-Za-z0-9!#$&^_.+-]{0,126}) *$/\n\n/**\n * Module exports.\n */\n\nexports.format = format\nexports.parse = parse\nexports.test = test\n\n/**\n * Format object to media type.\n *\n * @param {object} obj\n * @return {string}\n * @public\n */\n\nfunction format (obj) {\n if (!obj || typeof obj !== 'object') {\n throw new TypeError('argument obj is required')\n }\n\n var subtype = obj.subtype\n var suffix = obj.suffix\n var type = obj.type\n\n if (!type || !TYPE_NAME_REGEXP.test(type)) {\n throw new TypeError('invalid type')\n }\n\n if (!subtype || !SUBTYPE_NAME_REGEXP.test(subtype)) {\n throw new TypeError('invalid subtype')\n }\n\n // format as type/subtype\n var string = type + '/' + subtype\n\n // append +suffix\n if (suffix) {\n if (!TYPE_NAME_REGEXP.test(suffix)) {\n throw new TypeError('invalid suffix')\n }\n\n string += '+' + suffix\n }\n\n return string\n}\n\n/**\n * Test media type.\n *\n * @param {string} string\n * @return {object}\n * @public\n */\n\nfunction test (string) {\n if (!string) {\n throw new TypeError('argument string is required')\n }\n\n if (typeof string !== 'string') {\n throw new TypeError('argument string is required to be a string')\n }\n\n return TYPE_REGEXP.test(string.toLowerCase())\n}\n\n/**\n * Parse media type to object.\n *\n * @param {string} string\n * @return {object}\n * @public\n */\n\nfunction parse (string) {\n if (!string) {\n throw new TypeError('argument string is required')\n }\n\n if (typeof string !== 'string') {\n throw new TypeError('argument string is required to be a string')\n }\n\n var match = TYPE_REGEXP.exec(string.toLowerCase())\n\n if (!match) {\n throw new TypeError('invalid media type')\n }\n\n var type = match[1]\n var subtype = match[2]\n var suffix\n\n // suffix after last +\n var index = subtype.lastIndexOf('+')\n if (index !== -1) {\n suffix = subtype.substr(index + 1)\n subtype = subtype.substr(0, index)\n }\n\n return new MediaType(type, subtype, suffix)\n}\n\n/**\n * Class for MediaType object.\n * @public\n */\n\nfunction MediaType (type, subtype, suffix) {\n this.type = type\n this.subtype = subtype\n this.suffix = suffix\n}\n","/**\n * Node.js specific entry point.\n */\nimport { fromFile, fromStream } from 'strtok3';\nimport initDebug from 'debug';\nimport { CouldNotDetermineFileTypeError, parseFromTokenizer, UnsupportedFileTypeError } from './core.js';\nimport { ParserFactory } from './ParserFactory.js';\nexport * from './core.js';\nconst debug = initDebug('music-metadata:parser');\n/**\n * Parse audio from Node Stream.Readable\n * @param stream - Stream to read the audio track from\n * @param fileInfo - File information object or MIME-type, e.g.: 'audio/mpeg'\n * @param options - Parsing options\n * @returns Metadata\n */\nexport async function parseStream(stream, fileInfo, options = {}) {\n const tokenizer = await fromStream(stream, { fileInfo: typeof fileInfo === 'string' ? { mimeType: fileInfo } : fileInfo });\n try {\n return await parseFromTokenizer(tokenizer, options);\n }\n finally {\n await tokenizer.close();\n }\n}\n/**\n * Parse audio from Node file\n * @param filePath - Media file to read meta-data from\n * @param options - Parsing options\n * @returns Metadata\n */\nexport async function parseFile(filePath, options = {}) {\n debug(`parseFile: ${filePath}`);\n const fileTokenizer = await fromFile(filePath);\n const parserFactory = new ParserFactory();\n try {\n const parserLoader = parserFactory.findLoaderForExtension(filePath);\n if (!parserLoader)\n debug('Parser could not be determined by file extension');\n try {\n return await parserFactory.parse(fileTokenizer, parserLoader, options);\n }\n catch (error) {\n if (error instanceof CouldNotDetermineFileTypeError || error instanceof UnsupportedFileTypeError) {\n error.message += `: ${filePath}`;\n }\n throw error;\n }\n }\n finally {\n await fileTokenizer.close();\n }\n}\n","import { StringType, UINT32_LE } from 'token-types';\nimport initDebug from 'debug';\nimport { DataDescriptor, EndOfCentralDirectoryRecordToken, FileHeader, LocalFileHeaderToken, Signature } from \"./ZipToken.js\";\nfunction signatureToArray(signature) {\n const signatureBytes = new Uint8Array(UINT32_LE.len);\n UINT32_LE.put(signatureBytes, 0, signature);\n return signatureBytes;\n}\nconst debug = initDebug('tokenizer:inflate');\nconst syncBufferSize = 256 * 1024;\nconst ddSignatureArray = signatureToArray(Signature.DataDescriptor);\nconst eocdSignatureBytes = signatureToArray(Signature.EndOfCentralDirectory);\nexport class ZipHandler {\n constructor(tokenizer) {\n this.tokenizer = tokenizer;\n this.syncBuffer = new Uint8Array(syncBufferSize);\n }\n async isZip() {\n return await this.peekSignature() === Signature.LocalFileHeader;\n }\n peekSignature() {\n return this.tokenizer.peekToken(UINT32_LE);\n }\n async findEndOfCentralDirectoryLocator() {\n const randomReadTokenizer = this.tokenizer;\n const chunkLength = Math.min(16 * 1024, randomReadTokenizer.fileInfo.size);\n const buffer = this.syncBuffer.subarray(0, chunkLength);\n await this.tokenizer.readBuffer(buffer, { position: randomReadTokenizer.fileInfo.size - chunkLength });\n // Search the buffer from end to beginning for EOCD signature\n // const signature = 0x06054b50;\n for (let i = buffer.length - 4; i >= 0; i--) {\n // Compare 4 bytes directly without calling readUInt32LE\n if (buffer[i] === eocdSignatureBytes[0] &&\n buffer[i + 1] === eocdSignatureBytes[1] &&\n buffer[i + 2] === eocdSignatureBytes[2] &&\n buffer[i + 3] === eocdSignatureBytes[3]) {\n return randomReadTokenizer.fileInfo.size - chunkLength + i;\n }\n }\n return -1;\n }\n async readCentralDirectory() {\n if (!this.tokenizer.supportsRandomAccess()) {\n debug('Cannot reading central-directory without random-read support');\n return;\n }\n debug('Reading central-directory...');\n const pos = this.tokenizer.position;\n const offset = await this.findEndOfCentralDirectoryLocator();\n if (offset > 0) {\n debug('Central-directory 32-bit signature found');\n const eocdHeader = await this.tokenizer.readToken(EndOfCentralDirectoryRecordToken, offset);\n const files = [];\n this.tokenizer.setPosition(eocdHeader.offsetOfStartOfCd);\n for (let n = 0; n < eocdHeader.nrOfEntriesOfSize; ++n) {\n const entry = await this.tokenizer.readToken(FileHeader);\n if (entry.signature !== Signature.CentralFileHeader) {\n throw new Error('Expected Central-File-Header signature');\n }\n entry.filename = await this.tokenizer.readToken(new StringType(entry.filenameLength, 'utf-8'));\n await this.tokenizer.ignore(entry.extraFieldLength);\n await this.tokenizer.ignore(entry.fileCommentLength);\n files.push(entry);\n debug(`Add central-directory file-entry: n=${n + 1}/${files.length}: filename=${files[n].filename}`);\n }\n this.tokenizer.setPosition(pos);\n return files;\n }\n this.tokenizer.setPosition(pos);\n }\n async unzip(fileCb) {\n const entries = await this.readCentralDirectory();\n if (entries) {\n // Use Central Directory to iterate over files\n return this.iterateOverCentralDirectory(entries, fileCb);\n }\n // Scan Zip files for local-file-header\n let stop = false;\n do {\n const zipHeader = await this.readLocalFileHeader();\n if (!zipHeader)\n break;\n const next = fileCb(zipHeader);\n stop = !!next.stop;\n let fileData;\n await this.tokenizer.ignore(zipHeader.extraFieldLength);\n if (zipHeader.dataDescriptor && zipHeader.compressedSize === 0) {\n const chunks = [];\n let len = syncBufferSize;\n debug('Compressed-file-size unknown, scanning for next data-descriptor-signature....');\n let nextHeaderIndex = -1;\n while (nextHeaderIndex < 0 && len === syncBufferSize) {\n len = await this.tokenizer.peekBuffer(this.syncBuffer, { mayBeLess: true });\n nextHeaderIndex = indexOf(this.syncBuffer.subarray(0, len), ddSignatureArray);\n const size = nextHeaderIndex >= 0 ? nextHeaderIndex : len;\n if (next.handler) {\n const data = new Uint8Array(size);\n await this.tokenizer.readBuffer(data);\n chunks.push(data);\n }\n else {\n // Move position to the next header if found, skip the whole buffer otherwise\n await this.tokenizer.ignore(size);\n }\n }\n debug(`Found data-descriptor-signature at pos=${this.tokenizer.position}`);\n if (next.handler) {\n await this.inflate(zipHeader, mergeArrays(chunks), next.handler);\n }\n }\n else {\n if (next.handler) {\n debug(`Reading compressed-file-data: ${zipHeader.compressedSize} bytes`);\n fileData = new Uint8Array(zipHeader.compressedSize);\n await this.tokenizer.readBuffer(fileData);\n await this.inflate(zipHeader, fileData, next.handler);\n }\n else {\n debug(`Ignoring compressed-file-data: ${zipHeader.compressedSize} bytes`);\n await this.tokenizer.ignore(zipHeader.compressedSize);\n }\n }\n debug(`Reading data-descriptor at pos=${this.tokenizer.position}`);\n if (zipHeader.dataDescriptor) {\n // await this.tokenizer.ignore(DataDescriptor.len);\n const dataDescriptor = await this.tokenizer.readToken(DataDescriptor);\n if (dataDescriptor.signature !== 0x08074b50) {\n throw new Error(`Expected data-descriptor-signature at position ${this.tokenizer.position - DataDescriptor.len}`);\n }\n }\n } while (!stop);\n }\n async iterateOverCentralDirectory(entries, fileCb) {\n for (const fileHeader of entries) {\n const next = fileCb(fileHeader);\n if (next.handler) {\n this.tokenizer.setPosition(fileHeader.relativeOffsetOfLocalHeader);\n const zipHeader = await this.readLocalFileHeader();\n if (zipHeader) {\n await this.tokenizer.ignore(zipHeader.extraFieldLength);\n const fileData = new Uint8Array(fileHeader.compressedSize);\n await this.tokenizer.readBuffer(fileData);\n await this.inflate(zipHeader, fileData, next.handler);\n }\n }\n if (next.stop)\n break;\n }\n }\n async inflate(zipHeader, fileData, cb) {\n if (zipHeader.compressedMethod === 0) {\n // Stored (uncompressed)\n return cb(fileData);\n }\n if (zipHeader.compressedMethod !== 8) {\n throw new Error(`Unsupported ZIP compression method: ${zipHeader.compressedMethod}`);\n }\n debug(`Decompress filename=${zipHeader.filename}, compressed-size=${fileData.length}`);\n const uncompressedData = await ZipHandler.decompressDeflateRaw(fileData);\n return cb(uncompressedData);\n }\n static async decompressDeflateRaw(data) {\n // Wrap Uint8Array in a ReadableStream without copying\n const input = new ReadableStream({\n start(controller) {\n controller.enqueue(data);\n controller.close();\n }\n });\n const ds = new DecompressionStream(\"deflate-raw\");\n const output = input.pipeThrough(ds);\n try {\n // Collect decompressed bytes from the output stream\n const response = new Response(output);\n const buffer = await response.arrayBuffer();\n return new Uint8Array(buffer);\n }\n catch (err) {\n // Provide ZIP-specific error context\n const message = err instanceof Error\n ? `Failed to deflate ZIP entry: ${err.message}`\n : \"Unknown decompression error in ZIP entry\";\n throw new TypeError(message);\n }\n }\n async readLocalFileHeader() {\n const signature = await this.tokenizer.peekToken(UINT32_LE);\n if (signature === Signature.LocalFileHeader) {\n const header = await this.tokenizer.readToken(LocalFileHeaderToken);\n header.filename = await this.tokenizer.readToken(new StringType(header.filenameLength, 'utf-8'));\n return header;\n }\n if (signature === Signature.CentralFileHeader) {\n return false;\n }\n if (signature === 0xE011CFD0) {\n throw new Error('Encrypted ZIP');\n }\n throw new Error('Unexpected signature');\n }\n}\nfunction indexOf(buffer, portion) {\n const bufferLength = buffer.length;\n const portionLength = portion.length;\n // Return -1 if the portion is longer than the buffer\n if (portionLength > bufferLength)\n return -1;\n // Search for the portion in the buffer\n for (let i = 0; i <= bufferLength - portionLength; i++) {\n let found = true;\n for (let j = 0; j < portionLength; j++) {\n if (buffer[i + j] !== portion[j]) {\n found = false;\n break;\n }\n }\n if (found) {\n return i; // Return the starting offset\n }\n }\n return -1; // Not found\n}\nfunction mergeArrays(chunks) {\n // Concatenate chunks into a single Uint8Array\n const totalLength = chunks.reduce((acc, curr) => acc + curr.length, 0);\n const mergedArray = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n mergedArray.set(chunk, offset);\n offset += chunk.length;\n }\n return mergedArray;\n}\n","/**\n * Ref https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT\n */\nimport { UINT16_LE, UINT32_LE } from \"token-types\";\nexport const Signature = {\n LocalFileHeader: 0x04034b50,\n DataDescriptor: 0x08074b50,\n CentralFileHeader: 0x02014b50,\n EndOfCentralDirectory: 0x06054b50\n};\nexport const DataDescriptor = {\n get(array) {\n return {\n signature: UINT32_LE.get(array, 0),\n compressedSize: UINT32_LE.get(array, 8),\n uncompressedSize: UINT32_LE.get(array, 12),\n };\n }, len: 16\n};\n/**\n * First part of the ZIP Local File Header\n * Offset | Bytes| Description\n * -------|------+-------------------------------------------------------------------\n * 0 | 4 | Signature (0x04034b50)\n * 4 | 2 | Minimum version needed to extract\n * 6 | 2 | Bit flag\n * 8 | 2 | Compression method\n * 10 | 2 | File last modification time (MS-DOS format)\n * 12 | 2 | File last modification date (MS-DOS format)\n * 14 | 4 | CRC-32 of uncompressed data\n * 18 | 4 | Compressed size\n * 22 | 4 | Uncompressed size\n * 26 | 2 | File name length (n)\n * 28 | 2 | Extra field length (m)\n * 30 | n | File name\n * 30 + n | m | Extra field\n */\nexport const LocalFileHeaderToken = {\n get(array) {\n const flags = UINT16_LE.get(array, 6);\n return {\n signature: UINT32_LE.get(array, 0),\n minVersion: UINT16_LE.get(array, 4),\n dataDescriptor: !!(flags & 0x0008),\n compressedMethod: UINT16_LE.get(array, 8),\n compressedSize: UINT32_LE.get(array, 18),\n uncompressedSize: UINT32_LE.get(array, 22),\n filenameLength: UINT16_LE.get(array, 26),\n extraFieldLength: UINT16_LE.get(array, 28),\n filename: null\n };\n }, len: 30\n};\n/**\n * 4.3.16 End of central directory record:\n * end of central dir signature (0x06064b50) 4 bytes\n * number of this disk 2 bytes\n * number of the disk with the start of the central directory 2 bytes\n * total number of entries in the central directory on this disk 2 bytes\n * total number of entries in the size of the central directory 2 bytes\n * sizeOfTheCentralDirectory 4 bytes\n * offset of start of central directory with respect to the starting disk number 4 bytes\n * .ZIP file comment length 2 bytes\n * .ZIP file comment (variable size)\n */\nexport const EndOfCentralDirectoryRecordToken = {\n get(array) {\n return {\n signature: UINT32_LE.get(array, 0),\n nrOfThisDisk: UINT16_LE.get(array, 4),\n nrOfThisDiskWithTheStart: UINT16_LE.get(array, 6),\n nrOfEntriesOnThisDisk: UINT16_LE.get(array, 8),\n nrOfEntriesOfSize: UINT16_LE.get(array, 10),\n sizeOfCd: UINT32_LE.get(array, 12),\n offsetOfStartOfCd: UINT32_LE.get(array, 16),\n zipFileCommentLength: UINT16_LE.get(array, 20),\n };\n }, len: 22\n};\n/**\n * File header:\n * central file header signature 4 bytes 0 (0x02014b50)\n * version made by 2 bytes 4\n * version needed to extract 2 bytes 6\n * general purpose bit flag 2 bytes 8\n * compression method 2 bytes 10\n * last mod file time 2 bytes 12\n * last mod file date 2 bytes 14\n * crc-32 4 bytes 16\n * compressed size 4 bytes 20\n * uncompressed size 4 bytes 24\n * file name length 2 bytes 28\n * extra field length 2 bytes 30\n * file comment length 2 bytes 32\n * disk number start 2 bytes 34\n * internal file attributes 2 bytes 36\n * external file attributes 4 bytes 38\n * relative offset of local header 4 bytes 42\n */\nexport const FileHeader = {\n get(array) {\n const flags = UINT16_LE.get(array, 8);\n return {\n signature: UINT32_LE.get(array, 0),\n minVersion: UINT16_LE.get(array, 6),\n dataDescriptor: !!(flags & 0x0008),\n compressedMethod: UINT16_LE.get(array, 10),\n compressedSize: UINT32_LE.get(array, 20),\n uncompressedSize: UINT32_LE.get(array, 24),\n filenameLength: UINT16_LE.get(array, 28),\n extraFieldLength: UINT16_LE.get(array, 30),\n fileCommentLength: UINT16_LE.get(array, 32),\n relativeOffsetOfLocalHeader: UINT32_LE.get(array, 42),\n filename: null\n };\n }, len: 46\n};\n","export class GzipHandler {\n constructor(tokenizer) {\n this.tokenizer = tokenizer;\n }\n inflate() {\n const tokenizer = this.tokenizer;\n return new ReadableStream({\n async pull(controller) {\n const buffer = new Uint8Array(1024);\n const size = await tokenizer.readBuffer(buffer, { mayBeLess: true });\n if (size === 0) {\n controller.close();\n return;\n }\n controller.enqueue(buffer.subarray(0, size));\n }\n }).pipeThrough(new DecompressionStream(\"gzip\"));\n }\n}\n","import {StringType} from 'token-types';\n\nexport function stringToBytes(string, encoding) {\n\tif (encoding === 'utf-16le') {\n\t\tconst bytes = [];\n\t\tfor (let index = 0; index < string.length; index++) {\n\t\t\tconst code = string.charCodeAt(index); // eslint-disable-line unicorn/prefer-code-point\n\t\t\tbytes.push(code & 0xFF, (code >> 8) & 0xFF); // High byte\n\t\t}\n\n\t\treturn bytes;\n\t}\n\n\tif (encoding === 'utf-16be') {\n\t\tconst bytes = [];\n\t\tfor (let index = 0; index < string.length; index++) {\n\t\t\tconst code = string.charCodeAt(index); // eslint-disable-line unicorn/prefer-code-point\n\t\t\tbytes.push((code >> 8) & 0xFF, code & 0xFF); // Low byte\n\t\t}\n\n\t\treturn bytes;\n\t}\n\n\treturn [...string].map(character => character.charCodeAt(0)); // eslint-disable-line unicorn/prefer-code-point\n}\n\n/**\nChecks whether the TAR checksum is valid.\n\n@param {Uint8Array} arrayBuffer - The TAR header `[offset ... offset + 512]`.\n@param {number} offset - TAR header offset.\n@returns {boolean} `true` if the TAR checksum is valid, otherwise `false`.\n*/\nexport function tarHeaderChecksumMatches(arrayBuffer, offset = 0) {\n\tconst readSum = Number.parseInt(new StringType(6).get(arrayBuffer, 148).replace(/\\0.*$/, '').trim(), 8); // Read sum in header\n\tif (Number.isNaN(readSum)) {\n\t\treturn false;\n\t}\n\n\tlet sum = 8 * 0x20; // Initialize signed bit sum\n\n\tfor (let index = offset; index < offset + 148; index++) {\n\t\tsum += arrayBuffer[index];\n\t}\n\n\tfor (let index = offset + 156; index < offset + 512; index++) {\n\t\tsum += arrayBuffer[index];\n\t}\n\n\treturn readSum === sum;\n}\n\n/**\nID3 UINT32 sync-safe tokenizer token.\n28 bits (representing up to 256MB) integer, the msb is 0 to avoid \"false syncsignals\".\n*/\nexport const uint32SyncSafeToken = {\n\tget: (buffer, offset) => (buffer[offset + 3] & 0x7F) | ((buffer[offset + 2]) << 7) | ((buffer[offset + 1]) << 14) | ((buffer[offset]) << 21),\n\tlen: 4,\n};\n","export const extensions = [\n\t'jpg',\n\t'png',\n\t'apng',\n\t'gif',\n\t'webp',\n\t'flif',\n\t'xcf',\n\t'cr2',\n\t'cr3',\n\t'orf',\n\t'arw',\n\t'dng',\n\t'nef',\n\t'rw2',\n\t'raf',\n\t'tif',\n\t'bmp',\n\t'icns',\n\t'jxr',\n\t'psd',\n\t'indd',\n\t'zip',\n\t'tar',\n\t'rar',\n\t'gz',\n\t'bz2',\n\t'7z',\n\t'dmg',\n\t'mp4',\n\t'mid',\n\t'mkv',\n\t'webm',\n\t'mov',\n\t'avi',\n\t'mpg',\n\t'mp2',\n\t'mp3',\n\t'm4a',\n\t'oga',\n\t'ogg',\n\t'ogv',\n\t'opus',\n\t'flac',\n\t'wav',\n\t'spx',\n\t'amr',\n\t'pdf',\n\t'epub',\n\t'elf',\n\t'macho',\n\t'exe',\n\t'swf',\n\t'rtf',\n\t'wasm',\n\t'woff',\n\t'woff2',\n\t'eot',\n\t'ttf',\n\t'otf',\n\t'ttc',\n\t'ico',\n\t'flv',\n\t'ps',\n\t'xz',\n\t'sqlite',\n\t'nes',\n\t'crx',\n\t'xpi',\n\t'cab',\n\t'deb',\n\t'ar',\n\t'rpm',\n\t'Z',\n\t'lz',\n\t'cfb',\n\t'mxf',\n\t'mts',\n\t'blend',\n\t'bpg',\n\t'docx',\n\t'pptx',\n\t'xlsx',\n\t'3gp',\n\t'3g2',\n\t'j2c',\n\t'jp2',\n\t'jpm',\n\t'jpx',\n\t'mj2',\n\t'aif',\n\t'qcp',\n\t'odt',\n\t'ods',\n\t'odp',\n\t'xml',\n\t'mobi',\n\t'heic',\n\t'cur',\n\t'ktx',\n\t'ape',\n\t'wv',\n\t'dcm',\n\t'ics',\n\t'glb',\n\t'pcap',\n\t'dsf',\n\t'lnk',\n\t'alias',\n\t'voc',\n\t'ac3',\n\t'm4v',\n\t'm4p',\n\t'm4b',\n\t'f4v',\n\t'f4p',\n\t'f4b',\n\t'f4a',\n\t'mie',\n\t'asf',\n\t'ogm',\n\t'ogx',\n\t'mpc',\n\t'arrow',\n\t'shp',\n\t'aac',\n\t'mp1',\n\t'it',\n\t's3m',\n\t'xm',\n\t'skp',\n\t'avif',\n\t'eps',\n\t'lzh',\n\t'pgp',\n\t'asar',\n\t'stl',\n\t'chm',\n\t'3mf',\n\t'zst',\n\t'jxl',\n\t'vcf',\n\t'jls',\n\t'pst',\n\t'dwg',\n\t'parquet',\n\t'class',\n\t'arj',\n\t'cpio',\n\t'ace',\n\t'avro',\n\t'icc',\n\t'fbx',\n\t'vsdx',\n\t'vtt',\n\t'apk',\n\t'drc',\n\t'lz4',\n\t'potx',\n\t'xltx',\n\t'dotx',\n\t'xltm',\n\t'ott',\n\t'ots',\n\t'otp',\n\t'odg',\n\t'otg',\n\t'xlsm',\n\t'docm',\n\t'dotm',\n\t'potm',\n\t'pptm',\n\t'jar',\n\t'jmp',\n\t'rm',\n\t'sav',\n\t'ppsm',\n\t'ppsx',\n\t'tar.gz',\n\t'reg',\n\t'dat',\n];\n\nexport const mimeTypes = [\n\t'image/jpeg',\n\t'image/png',\n\t'image/gif',\n\t'image/webp',\n\t'image/flif',\n\t'image/x-xcf',\n\t'image/x-canon-cr2',\n\t'image/x-canon-cr3',\n\t'image/tiff',\n\t'image/bmp',\n\t'image/vnd.ms-photo',\n\t'image/vnd.adobe.photoshop',\n\t'application/x-indesign',\n\t'application/epub+zip',\n\t'application/x-xpinstall',\n\t'application/vnd.ms-powerpoint.slideshow.macroenabled.12',\n\t'application/vnd.oasis.opendocument.text',\n\t'application/vnd.oasis.opendocument.spreadsheet',\n\t'application/vnd.oasis.opendocument.presentation',\n\t'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n\t'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n\t'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n\t'application/vnd.openxmlformats-officedocument.presentationml.slideshow',\n\t'application/zip',\n\t'application/x-tar',\n\t'application/x-rar-compressed',\n\t'application/gzip',\n\t'application/x-bzip2',\n\t'application/x-7z-compressed',\n\t'application/x-apple-diskimage',\n\t'application/vnd.apache.arrow.file',\n\t'video/mp4',\n\t'audio/midi',\n\t'video/matroska',\n\t'video/webm',\n\t'video/quicktime',\n\t'video/vnd.avi',\n\t'audio/wav',\n\t'audio/qcelp',\n\t'audio/x-ms-asf',\n\t'video/x-ms-asf',\n\t'application/vnd.ms-asf',\n\t'video/mpeg',\n\t'video/3gpp',\n\t'audio/mpeg',\n\t'audio/mp4', // RFC 4337\n\t'video/ogg',\n\t'audio/ogg',\n\t'audio/ogg; codecs=opus',\n\t'application/ogg',\n\t'audio/flac',\n\t'audio/ape',\n\t'audio/wavpack',\n\t'audio/amr',\n\t'application/pdf',\n\t'application/x-elf',\n\t'application/x-mach-binary',\n\t'application/x-msdownload',\n\t'application/x-shockwave-flash',\n\t'application/rtf',\n\t'application/wasm',\n\t'font/woff',\n\t'font/woff2',\n\t'application/vnd.ms-fontobject',\n\t'font/ttf',\n\t'font/otf',\n\t'font/collection',\n\t'image/x-icon',\n\t'video/x-flv',\n\t'application/postscript',\n\t'application/eps',\n\t'application/x-xz',\n\t'application/x-sqlite3',\n\t'application/x-nintendo-nes-rom',\n\t'application/x-google-chrome-extension',\n\t'application/vnd.ms-cab-compressed',\n\t'application/x-deb',\n\t'application/x-unix-archive',\n\t'application/x-rpm',\n\t'application/x-compress',\n\t'application/x-lzip',\n\t'application/x-cfb',\n\t'application/x-mie',\n\t'application/mxf',\n\t'video/mp2t',\n\t'application/x-blender',\n\t'image/bpg',\n\t'image/j2c',\n\t'image/jp2',\n\t'image/jpx',\n\t'image/jpm',\n\t'image/mj2',\n\t'audio/aiff',\n\t'application/xml',\n\t'application/x-mobipocket-ebook',\n\t'image/heif',\n\t'image/heif-sequence',\n\t'image/heic',\n\t'image/heic-sequence',\n\t'image/icns',\n\t'image/ktx',\n\t'application/dicom',\n\t'audio/x-musepack',\n\t'text/calendar',\n\t'text/vcard',\n\t'text/vtt',\n\t'model/gltf-binary',\n\t'application/vnd.tcpdump.pcap',\n\t'audio/x-dsf', // Non-standard\n\t'application/x.ms.shortcut', // Invented by us\n\t'application/x.apple.alias', // Invented by us\n\t'audio/x-voc',\n\t'audio/vnd.dolby.dd-raw',\n\t'audio/x-m4a',\n\t'image/apng',\n\t'image/x-olympus-orf',\n\t'image/x-sony-arw',\n\t'image/x-adobe-dng',\n\t'image/x-nikon-nef',\n\t'image/x-panasonic-rw2',\n\t'image/x-fujifilm-raf',\n\t'video/x-m4v',\n\t'video/3gpp2',\n\t'application/x-esri-shape',\n\t'audio/aac',\n\t'audio/x-it',\n\t'audio/x-s3m',\n\t'audio/x-xm',\n\t'video/MP1S',\n\t'video/MP2P',\n\t'application/vnd.sketchup.skp',\n\t'image/avif',\n\t'application/x-lzh-compressed',\n\t'application/pgp-encrypted',\n\t'application/x-asar',\n\t'model/stl',\n\t'application/vnd.ms-htmlhelp',\n\t'model/3mf',\n\t'image/jxl',\n\t'application/zstd',\n\t'image/jls',\n\t'application/vnd.ms-outlook',\n\t'image/vnd.dwg',\n\t'application/vnd.apache.parquet',\n\t'application/java-vm',\n\t'application/x-arj',\n\t'application/x-cpio',\n\t'application/x-ace-compressed',\n\t'application/avro',\n\t'application/vnd.iccprofile',\n\t'application/x.autodesk.fbx', // Invented by us\n\t'application/vnd.visio',\n\t'application/vnd.android.package-archive',\n\t'application/vnd.google.draco', // Invented by us\n\t'application/x-lz4', // Invented by us\n\t'application/vnd.openxmlformats-officedocument.presentationml.template',\n\t'application/vnd.openxmlformats-officedocument.spreadsheetml.template',\n\t'application/vnd.openxmlformats-officedocument.wordprocessingml.template',\n\t'application/vnd.ms-excel.template.macroenabled.12',\n\t'application/vnd.oasis.opendocument.text-template',\n\t'application/vnd.oasis.opendocument.spreadsheet-template',\n\t'application/vnd.oasis.opendocument.presentation-template',\n\t'application/vnd.oasis.opendocument.graphics',\n\t'application/vnd.oasis.opendocument.graphics-template',\n\t'application/vnd.ms-excel.sheet.macroenabled.12',\n\t'application/vnd.ms-word.document.macroenabled.12',\n\t'application/vnd.ms-word.template.macroenabled.12',\n\t'application/vnd.ms-powerpoint.template.macroenabled.12',\n\t'application/vnd.ms-powerpoint.presentation.macroenabled.12',\n\t'application/java-archive',\n\t'application/vnd.rn-realmedia',\n\t'application/x-spss-sav',\n\t'application/x-ms-regedit',\n\t'application/x-ft-windows-registry-hive',\n\t'application/x-jmp-data',\n];\n","/**\nPrimary entry point, Node.js specific entry point is index.js\n*/\n\nimport * as Token from 'token-types';\nimport * as strtok3 from 'strtok3/core';\nimport {ZipHandler, GzipHandler} from '@tokenizer/inflate';\nimport {getUintBE} from 'uint8array-extras';\nimport {\n\tstringToBytes,\n\ttarHeaderChecksumMatches,\n\tuint32SyncSafeToken,\n} from './util.js';\nimport {extensions, mimeTypes} from './supported.js';\n\nexport const reasonableDetectionSizeInBytes = 4100; // A fair amount of file-types are detectable within this range.\n\nexport async function fileTypeFromStream(stream, options) {\n\treturn new FileTypeParser(options).fromStream(stream);\n}\n\nexport async function fileTypeFromBuffer(input, options) {\n\treturn new FileTypeParser(options).fromBuffer(input);\n}\n\nexport async function fileTypeFromBlob(blob, options) {\n\treturn new FileTypeParser(options).fromBlob(blob);\n}\n\nfunction getFileTypeFromMimeType(mimeType) {\n\tmimeType = mimeType.toLowerCase();\n\tswitch (mimeType) {\n\t\tcase 'application/epub+zip':\n\t\t\treturn {\n\t\t\t\text: 'epub',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.oasis.opendocument.text':\n\t\t\treturn {\n\t\t\t\text: 'odt',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.oasis.opendocument.text-template':\n\t\t\treturn {\n\t\t\t\text: 'ott',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.oasis.opendocument.spreadsheet':\n\t\t\treturn {\n\t\t\t\text: 'ods',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.oasis.opendocument.spreadsheet-template':\n\t\t\treturn {\n\t\t\t\text: 'ots',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.oasis.opendocument.presentation':\n\t\t\treturn {\n\t\t\t\text: 'odp',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.oasis.opendocument.presentation-template':\n\t\t\treturn {\n\t\t\t\text: 'otp',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.oasis.opendocument.graphics':\n\t\t\treturn {\n\t\t\t\text: 'odg',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.oasis.opendocument.graphics-template':\n\t\t\treturn {\n\t\t\t\text: 'otg',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.openxmlformats-officedocument.presentationml.slideshow':\n\t\t\treturn {\n\t\t\t\text: 'ppsx',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':\n\t\t\treturn {\n\t\t\t\text: 'xlsx',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.ms-excel.sheet.macroenabled':\n\t\t\treturn {\n\t\t\t\text: 'xlsm',\n\t\t\t\tmime: 'application/vnd.ms-excel.sheet.macroenabled.12',\n\t\t\t};\n\t\tcase 'application/vnd.openxmlformats-officedocument.spreadsheetml.template':\n\t\t\treturn {\n\t\t\t\text: 'xltx',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.ms-excel.template.macroenabled':\n\t\t\treturn {\n\t\t\t\text: 'xltm',\n\t\t\t\tmime: 'application/vnd.ms-excel.template.macroenabled.12',\n\t\t\t};\n\t\tcase 'application/vnd.ms-powerpoint.slideshow.macroenabled':\n\t\t\treturn {\n\t\t\t\text: 'ppsm',\n\t\t\t\tmime: 'application/vnd.ms-powerpoint.slideshow.macroenabled.12',\n\t\t\t};\n\t\tcase 'application/vnd.openxmlformats-officedocument.wordprocessingml.document':\n\t\t\treturn {\n\t\t\t\text: 'docx',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.ms-word.document.macroenabled':\n\t\t\treturn {\n\t\t\t\text: 'docm',\n\t\t\t\tmime: 'application/vnd.ms-word.document.macroenabled.12',\n\t\t\t};\n\t\tcase 'application/vnd.openxmlformats-officedocument.wordprocessingml.template':\n\t\t\treturn {\n\t\t\t\text: 'dotx',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.ms-word.template.macroenabledtemplate':\n\t\t\treturn {\n\t\t\t\text: 'dotm',\n\t\t\t\tmime: 'application/vnd.ms-word.template.macroenabled.12',\n\t\t\t};\n\t\tcase 'application/vnd.openxmlformats-officedocument.presentationml.template':\n\t\t\treturn {\n\t\t\t\text: 'potx',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.ms-powerpoint.template.macroenabled':\n\t\t\treturn {\n\t\t\t\text: 'potm',\n\t\t\t\tmime: 'application/vnd.ms-powerpoint.template.macroenabled.12',\n\t\t\t};\n\t\tcase 'application/vnd.openxmlformats-officedocument.presentationml.presentation':\n\t\t\treturn {\n\t\t\t\text: 'pptx',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.ms-powerpoint.presentation.macroenabled':\n\t\t\treturn {\n\t\t\t\text: 'pptm',\n\t\t\t\tmime: 'application/vnd.ms-powerpoint.presentation.macroenabled.12',\n\t\t\t};\n\t\tcase 'application/vnd.ms-visio.drawing':\n\t\t\treturn {\n\t\t\t\text: 'vsdx',\n\t\t\t\tmime: 'application/vnd.visio',\n\t\t\t};\n\t\tcase 'application/vnd.ms-package.3dmanufacturing-3dmodel+xml':\n\t\t\treturn {\n\t\t\t\text: '3mf',\n\t\t\t\tmime: 'model/3mf',\n\t\t\t};\n\t\tdefault:\n\t}\n}\n\nfunction _check(buffer, headers, options) {\n\toptions = {\n\t\toffset: 0,\n\t\t...options,\n\t};\n\n\tfor (const [index, header] of headers.entries()) {\n\t\t// If a bitmask is set\n\t\tif (options.mask) {\n\t\t\t// If header doesn't equal `buf` with bits masked off\n\t\t\tif (header !== (options.mask[index] & buffer[index + options.offset])) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if (header !== buffer[index + options.offset]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nexport async function fileTypeFromTokenizer(tokenizer, options) {\n\treturn new FileTypeParser(options).fromTokenizer(tokenizer);\n}\n\nexport async function fileTypeStream(webStream, options) {\n\treturn new FileTypeParser(options).toDetectionStream(webStream, options);\n}\n\nexport class FileTypeParser {\n\tconstructor(options) {\n\t\tthis.options = {\n\t\t\tmpegOffsetTolerance: 0,\n\t\t\t...options,\n\t\t};\n\n\t\tthis.detectors = [...(options?.customDetectors ?? []),\n\t\t\t{id: 'core', detect: this.detectConfident},\n\t\t\t{id: 'core.imprecise', detect: this.detectImprecise}];\n\t\tthis.tokenizerOptions = {\n\t\t\tabortSignal: options?.signal,\n\t\t};\n\t}\n\n\tasync fromTokenizer(tokenizer) {\n\t\tconst initialPosition = tokenizer.position;\n\n\t\t// Iterate through all file-type detectors\n\t\tfor (const detector of this.detectors) {\n\t\t\tconst fileType = await detector.detect(tokenizer);\n\t\t\tif (fileType) {\n\t\t\t\treturn fileType;\n\t\t\t}\n\n\t\t\tif (initialPosition !== tokenizer.position) {\n\t\t\t\treturn undefined; // Cannot proceed scanning of the tokenizer is at an arbitrary position\n\t\t\t}\n\t\t}\n\t}\n\n\tasync fromBuffer(input) {\n\t\tif (!(input instanceof Uint8Array || input instanceof ArrayBuffer)) {\n\t\t\tthrow new TypeError(`Expected the \\`input\\` argument to be of type \\`Uint8Array\\` or \\`ArrayBuffer\\`, got \\`${typeof input}\\``);\n\t\t}\n\n\t\tconst buffer = input instanceof Uint8Array ? input : new Uint8Array(input);\n\n\t\tif (!(buffer?.length > 1)) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.fromTokenizer(strtok3.fromBuffer(buffer, this.tokenizerOptions));\n\t}\n\n\tasync fromBlob(blob) {\n\t\tconst tokenizer = strtok3.fromBlob(blob, this.tokenizerOptions);\n\t\ttry {\n\t\t\treturn await this.fromTokenizer(tokenizer);\n\t\t} finally {\n\t\t\tawait tokenizer.close();\n\t\t}\n\t}\n\n\tasync fromStream(stream) {\n\t\tconst tokenizer = strtok3.fromWebStream(stream, this.tokenizerOptions);\n\t\ttry {\n\t\t\treturn await this.fromTokenizer(tokenizer);\n\t\t} finally {\n\t\t\tawait tokenizer.close();\n\t\t}\n\t}\n\n\tasync toDetectionStream(stream, options) {\n\t\tconst {sampleSize = reasonableDetectionSizeInBytes} = options;\n\t\tlet detectedFileType;\n\t\tlet firstChunk;\n\n\t\tconst reader = stream.getReader({mode: 'byob'});\n\t\ttry {\n\t\t\t// Read the first chunk from the stream\n\t\t\tconst {value: chunk, done} = await reader.read(new Uint8Array(sampleSize));\n\t\t\tfirstChunk = chunk;\n\t\t\tif (!done && chunk) {\n\t\t\t\ttry {\n\t\t\t\t\t// Attempt to detect the file type from the chunk\n\t\t\t\t\tdetectedFileType = await this.fromBuffer(chunk.subarray(0, sampleSize));\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!(error instanceof strtok3.EndOfStreamError)) {\n\t\t\t\t\t\tthrow error; // Re-throw non-EndOfStreamError\n\t\t\t\t\t}\n\n\t\t\t\t\tdetectedFileType = undefined;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfirstChunk = chunk;\n\t\t} finally {\n\t\t\treader.releaseLock(); // Ensure the reader is released\n\t\t}\n\n\t\t// Create a new ReadableStream to manage locking issues\n\t\tconst transformStream = new TransformStream({\n\t\t\tasync start(controller) {\n\t\t\t\tcontroller.enqueue(firstChunk); // Enqueue the initial chunk\n\t\t\t},\n\t\t\ttransform(chunk, controller) {\n\t\t\t\t// Pass through the chunks without modification\n\t\t\t\tcontroller.enqueue(chunk);\n\t\t\t},\n\t\t});\n\n\t\tconst newStream = stream.pipeThrough(transformStream);\n\t\tnewStream.fileType = detectedFileType;\n\n\t\treturn newStream;\n\t}\n\n\tcheck(header, options) {\n\t\treturn _check(this.buffer, header, options);\n\t}\n\n\tcheckString(header, options) {\n\t\treturn this.check(stringToBytes(header, options?.encoding), options);\n\t}\n\n\t// Detections with a high degree of certainty in identifying the correct file type\n\tdetectConfident = async tokenizer => {\n\t\tthis.buffer = new Uint8Array(reasonableDetectionSizeInBytes);\n\n\t\t// Keep reading until EOF if the file size is unknown.\n\t\tif (tokenizer.fileInfo.size === undefined) {\n\t\t\ttokenizer.fileInfo.size = Number.MAX_SAFE_INTEGER;\n\t\t}\n\n\t\tthis.tokenizer = tokenizer;\n\n\t\tawait tokenizer.peekBuffer(this.buffer, {length: 32, mayBeLess: true});\n\n\t\t// -- 2-byte signatures --\n\n\t\tif (this.check([0x42, 0x4D])) {\n\t\t\treturn {\n\t\t\t\text: 'bmp',\n\t\t\t\tmime: 'image/bmp',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x0B, 0x77])) {\n\t\t\treturn {\n\t\t\t\text: 'ac3',\n\t\t\t\tmime: 'audio/vnd.dolby.dd-raw',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x78, 0x01])) {\n\t\t\treturn {\n\t\t\t\text: 'dmg',\n\t\t\t\tmime: 'application/x-apple-diskimage',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x4D, 0x5A])) {\n\t\t\treturn {\n\t\t\t\text: 'exe',\n\t\t\t\tmime: 'application/x-msdownload',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x25, 0x21])) {\n\t\t\tawait tokenizer.peekBuffer(this.buffer, {length: 24, mayBeLess: true});\n\n\t\t\tif (\n\t\t\t\tthis.checkString('PS-Adobe-', {offset: 2})\n\t\t\t\t&& this.checkString(' EPSF-', {offset: 14})\n\t\t\t) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'eps',\n\t\t\t\t\tmime: 'application/eps',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\text: 'ps',\n\t\t\t\tmime: 'application/postscript',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0x1F, 0xA0])\n\t\t\t|| this.check([0x1F, 0x9D])\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'Z',\n\t\t\t\tmime: 'application/x-compress',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xC7, 0x71])) {\n\t\t\treturn {\n\t\t\t\text: 'cpio',\n\t\t\t\tmime: 'application/x-cpio',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x60, 0xEA])) {\n\t\t\treturn {\n\t\t\t\text: 'arj',\n\t\t\t\tmime: 'application/x-arj',\n\t\t\t};\n\t\t}\n\n\t\t// -- 3-byte signatures --\n\n\t\tif (this.check([0xEF, 0xBB, 0xBF])) { // UTF-8-BOM\n\t\t\t// Strip off UTF-8-BOM\n\t\t\tthis.tokenizer.ignore(3);\n\t\t\treturn this.detectConfident(tokenizer);\n\t\t}\n\n\t\tif (this.check([0x47, 0x49, 0x46])) {\n\t\t\treturn {\n\t\t\t\text: 'gif',\n\t\t\t\tmime: 'image/gif',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x49, 0x49, 0xBC])) {\n\t\t\treturn {\n\t\t\t\text: 'jxr',\n\t\t\t\tmime: 'image/vnd.ms-photo',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x1F, 0x8B, 0x8])) {\n\t\t\tconst gzipHandler = new GzipHandler(tokenizer);\n\n\t\t\tconst stream = gzipHandler.inflate();\n\t\t\tlet shouldCancelStream = true;\n\t\t\ttry {\n\t\t\t\tlet compressedFileType;\n\t\t\t\ttry {\n\t\t\t\t\tcompressedFileType = await this.fromStream(stream);\n\t\t\t\t} catch {\n\t\t\t\t\tshouldCancelStream = false;\n\t\t\t\t}\n\n\t\t\t\tif (compressedFileType && compressedFileType.ext === 'tar') {\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'tar.gz',\n\t\t\t\t\t\tmime: 'application/gzip',\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (shouldCancelStream) {\n\t\t\t\t\tawait stream.cancel();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\text: 'gz',\n\t\t\t\tmime: 'application/gzip',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x42, 0x5A, 0x68])) {\n\t\t\treturn {\n\t\t\t\text: 'bz2',\n\t\t\t\tmime: 'application/x-bzip2',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('ID3')) {\n\t\t\tawait tokenizer.ignore(6); // Skip ID3 header until the header size\n\t\t\tconst id3HeaderLength = await tokenizer.readToken(uint32SyncSafeToken);\n\t\t\tif (tokenizer.position + id3HeaderLength > tokenizer.fileInfo.size) {\n\t\t\t\t// Guess file type based on ID3 header for backward compatibility\n\t\t\t\treturn {\n\t\t\t\t\text: 'mp3',\n\t\t\t\t\tmime: 'audio/mpeg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tawait tokenizer.ignore(id3HeaderLength);\n\t\t\treturn this.fromTokenizer(tokenizer); // Skip ID3 header, recursion\n\t\t}\n\n\t\t// Musepack, SV7\n\t\tif (this.checkString('MP+')) {\n\t\t\treturn {\n\t\t\t\text: 'mpc',\n\t\t\t\tmime: 'audio/x-musepack',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\t(this.buffer[0] === 0x43 || this.buffer[0] === 0x46)\n\t\t\t&& this.check([0x57, 0x53], {offset: 1})\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'swf',\n\t\t\t\tmime: 'application/x-shockwave-flash',\n\t\t\t};\n\t\t}\n\n\t\t// -- 4-byte signatures --\n\n\t\t// Requires a sample size of 4 bytes\n\t\tif (this.check([0xFF, 0xD8, 0xFF])) {\n\t\t\tif (this.check([0xF7], {offset: 3})) { // JPG7/SOF55, indicating a ISO/IEC 14495 / JPEG-LS file\n\t\t\t\treturn {\n\t\t\t\t\text: 'jls',\n\t\t\t\t\tmime: 'image/jls',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\text: 'jpg',\n\t\t\t\tmime: 'image/jpeg',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x4F, 0x62, 0x6A, 0x01])) {\n\t\t\treturn {\n\t\t\t\text: 'avro',\n\t\t\t\tmime: 'application/avro',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('FLIF')) {\n\t\t\treturn {\n\t\t\t\text: 'flif',\n\t\t\t\tmime: 'image/flif',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('8BPS')) {\n\t\t\treturn {\n\t\t\t\text: 'psd',\n\t\t\t\tmime: 'image/vnd.adobe.photoshop',\n\t\t\t};\n\t\t}\n\n\t\t// Musepack, SV8\n\t\tif (this.checkString('MPCK')) {\n\t\t\treturn {\n\t\t\t\text: 'mpc',\n\t\t\t\tmime: 'audio/x-musepack',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('FORM')) {\n\t\t\treturn {\n\t\t\t\text: 'aif',\n\t\t\t\tmime: 'audio/aiff',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('icns', {offset: 0})) {\n\t\t\treturn {\n\t\t\t\text: 'icns',\n\t\t\t\tmime: 'image/icns',\n\t\t\t};\n\t\t}\n\n\t\t// Zip-based file formats\n\t\t// Need to be before the `zip` check\n\t\tif (this.check([0x50, 0x4B, 0x3, 0x4])) { // Local file header signature\n\t\t\tlet fileType;\n\t\t\tawait new ZipHandler(tokenizer).unzip(zipHeader => {\n\t\t\t\tswitch (zipHeader.filename) {\n\t\t\t\t\tcase 'META-INF/mozilla.rsa':\n\t\t\t\t\t\tfileType = {\n\t\t\t\t\t\t\text: 'xpi',\n\t\t\t\t\t\t\tmime: 'application/x-xpinstall',\n\t\t\t\t\t\t};\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tstop: true,\n\t\t\t\t\t\t};\n\t\t\t\t\tcase 'META-INF/MANIFEST.MF':\n\t\t\t\t\t\tfileType = {\n\t\t\t\t\t\t\text: 'jar',\n\t\t\t\t\t\t\tmime: 'application/java-archive',\n\t\t\t\t\t\t};\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tstop: true,\n\t\t\t\t\t\t};\n\t\t\t\t\tcase 'mimetype':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tasync handler(fileData) {\n\t\t\t\t\t\t\t\t// Use TextDecoder to decode the UTF-8 encoded data\n\t\t\t\t\t\t\t\tconst mimeType = new TextDecoder('utf-8').decode(fileData).trim();\n\t\t\t\t\t\t\t\tfileType = getFileTypeFromMimeType(mimeType);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tstop: true,\n\t\t\t\t\t\t};\n\n\t\t\t\t\tcase '[Content_Types].xml':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tasync handler(fileData) {\n\t\t\t\t\t\t\t\t// Use TextDecoder to decode the UTF-8 encoded data\n\t\t\t\t\t\t\t\tlet xmlContent = new TextDecoder('utf-8').decode(fileData);\n\t\t\t\t\t\t\t\tconst endPos = xmlContent.indexOf('.main+xml\"');\n\t\t\t\t\t\t\t\tif (endPos === -1) {\n\t\t\t\t\t\t\t\t\tconst mimeType = 'application/vnd.ms-package.3dmanufacturing-3dmodel+xml';\n\t\t\t\t\t\t\t\t\tif (xmlContent.includes(`ContentType=\"${mimeType}\"`)) {\n\t\t\t\t\t\t\t\t\t\tfileType = getFileTypeFromMimeType(mimeType);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\txmlContent = xmlContent.slice(0, Math.max(0, endPos));\n\t\t\t\t\t\t\t\t\tconst firstPos = xmlContent.lastIndexOf('\"');\n\t\t\t\t\t\t\t\t\tconst mimeType = xmlContent.slice(Math.max(0, firstPos + 1));\n\t\t\t\t\t\t\t\t\tfileType = getFileTypeFromMimeType(mimeType);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tstop: true,\n\t\t\t\t\t\t};\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif (/classes\\d*\\.dex/.test(zipHeader.filename)) {\n\t\t\t\t\t\t\tfileType = {\n\t\t\t\t\t\t\t\text: 'apk',\n\t\t\t\t\t\t\t\tmime: 'application/vnd.android.package-archive',\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\treturn {stop: true};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn {};\n\t\t\t\t}\n\t\t\t}).catch(error => {\n\t\t\t\tif (!(error instanceof strtok3.EndOfStreamError)) {\n\t\t\t\t\tthrow error; // Re-throw non-EndOfStreamError\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn fileType ?? {\n\t\t\t\text: 'zip',\n\t\t\t\tmime: 'application/zip',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('OggS')) {\n\t\t\t// This is an OGG container\n\t\t\tawait tokenizer.ignore(28);\n\t\t\tconst type = new Uint8Array(8);\n\t\t\tawait tokenizer.readBuffer(type);\n\n\t\t\t// Needs to be before `ogg` check\n\t\t\tif (_check(type, [0x4F, 0x70, 0x75, 0x73, 0x48, 0x65, 0x61, 0x64])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'opus',\n\t\t\t\t\tmime: 'audio/ogg; codecs=opus',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If ' theora' in header.\n\t\t\tif (_check(type, [0x80, 0x74, 0x68, 0x65, 0x6F, 0x72, 0x61])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'ogv',\n\t\t\t\t\tmime: 'video/ogg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If '\\x01video' in header.\n\t\t\tif (_check(type, [0x01, 0x76, 0x69, 0x64, 0x65, 0x6F, 0x00])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'ogm',\n\t\t\t\t\tmime: 'video/ogg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If ' FLAC' in header https://xiph.org/flac/faq.html\n\t\t\tif (_check(type, [0x7F, 0x46, 0x4C, 0x41, 0x43])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'oga',\n\t\t\t\t\tmime: 'audio/ogg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// 'Speex ' in header https://en.wikipedia.org/wiki/Speex\n\t\t\tif (_check(type, [0x53, 0x70, 0x65, 0x65, 0x78, 0x20, 0x20])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'spx',\n\t\t\t\t\tmime: 'audio/ogg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If '\\x01vorbis' in header\n\t\t\tif (_check(type, [0x01, 0x76, 0x6F, 0x72, 0x62, 0x69, 0x73])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'ogg',\n\t\t\t\t\tmime: 'audio/ogg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Default OGG container https://www.iana.org/assignments/media-types/application/ogg\n\t\t\treturn {\n\t\t\t\text: 'ogx',\n\t\t\t\tmime: 'application/ogg',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0x50, 0x4B])\n\t\t\t&& (this.buffer[2] === 0x3 || this.buffer[2] === 0x5 || this.buffer[2] === 0x7)\n\t\t\t&& (this.buffer[3] === 0x4 || this.buffer[3] === 0x6 || this.buffer[3] === 0x8)\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'zip',\n\t\t\t\tmime: 'application/zip',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('MThd')) {\n\t\t\treturn {\n\t\t\t\text: 'mid',\n\t\t\t\tmime: 'audio/midi',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.checkString('wOFF')\n\t\t\t&& (\n\t\t\t\tthis.check([0x00, 0x01, 0x00, 0x00], {offset: 4})\n\t\t\t\t|| this.checkString('OTTO', {offset: 4})\n\t\t\t)\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'woff',\n\t\t\t\tmime: 'font/woff',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.checkString('wOF2')\n\t\t\t&& (\n\t\t\t\tthis.check([0x00, 0x01, 0x00, 0x00], {offset: 4})\n\t\t\t\t|| this.checkString('OTTO', {offset: 4})\n\t\t\t)\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'woff2',\n\t\t\t\tmime: 'font/woff2',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xD4, 0xC3, 0xB2, 0xA1]) || this.check([0xA1, 0xB2, 0xC3, 0xD4])) {\n\t\t\treturn {\n\t\t\t\text: 'pcap',\n\t\t\t\tmime: 'application/vnd.tcpdump.pcap',\n\t\t\t};\n\t\t}\n\n\t\t// Sony DSD Stream File (DSF)\n\t\tif (this.checkString('DSD ')) {\n\t\t\treturn {\n\t\t\t\text: 'dsf',\n\t\t\t\tmime: 'audio/x-dsf', // Non-standard\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('LZIP')) {\n\t\t\treturn {\n\t\t\t\text: 'lz',\n\t\t\t\tmime: 'application/x-lzip',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('fLaC')) {\n\t\t\treturn {\n\t\t\t\text: 'flac',\n\t\t\t\tmime: 'audio/flac',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x42, 0x50, 0x47, 0xFB])) {\n\t\t\treturn {\n\t\t\t\text: 'bpg',\n\t\t\t\tmime: 'image/bpg',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('wvpk')) {\n\t\t\treturn {\n\t\t\t\text: 'wv',\n\t\t\t\tmime: 'audio/wavpack',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('%PDF')) {\n\t\t\t// Assume this is just a normal PDF\n\t\t\treturn {\n\t\t\t\text: 'pdf',\n\t\t\t\tmime: 'application/pdf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x00, 0x61, 0x73, 0x6D])) {\n\t\t\treturn {\n\t\t\t\text: 'wasm',\n\t\t\t\tmime: 'application/wasm',\n\t\t\t};\n\t\t}\n\n\t\t// TIFF, little-endian type\n\t\tif (this.check([0x49, 0x49])) {\n\t\t\tconst fileType = await this.readTiffHeader(false);\n\t\t\tif (fileType) {\n\t\t\t\treturn fileType;\n\t\t\t}\n\t\t}\n\n\t\t// TIFF, big-endian type\n\t\tif (this.check([0x4D, 0x4D])) {\n\t\t\tconst fileType = await this.readTiffHeader(true);\n\t\t\tif (fileType) {\n\t\t\t\treturn fileType;\n\t\t\t}\n\t\t}\n\n\t\tif (this.checkString('MAC ')) {\n\t\t\treturn {\n\t\t\t\text: 'ape',\n\t\t\t\tmime: 'audio/ape',\n\t\t\t};\n\t\t}\n\n\t\t// https://github.com/file/file/blob/master/magic/Magdir/matroska\n\t\tif (this.check([0x1A, 0x45, 0xDF, 0xA3])) { // Root element: EBML\n\t\t\tasync function readField() {\n\t\t\t\tconst msb = await tokenizer.peekNumber(Token.UINT8);\n\t\t\t\tlet mask = 0x80;\n\t\t\t\tlet ic = 0; // 0 = A, 1 = B, 2 = C, 3 = D\n\n\t\t\t\twhile ((msb & mask) === 0 && mask !== 0) {\n\t\t\t\t\t++ic;\n\t\t\t\t\tmask >>= 1;\n\t\t\t\t}\n\n\t\t\t\tconst id = new Uint8Array(ic + 1);\n\t\t\t\tawait tokenizer.readBuffer(id);\n\t\t\t\treturn id;\n\t\t\t}\n\n\t\t\tasync function readElement() {\n\t\t\t\tconst idField = await readField();\n\t\t\t\tconst lengthField = await readField();\n\n\t\t\t\tlengthField[0] ^= 0x80 >> (lengthField.length - 1);\n\t\t\t\tconst nrLength = Math.min(6, lengthField.length); // JavaScript can max read 6 bytes integer\n\n\t\t\t\tconst idView = new DataView(idField.buffer);\n\t\t\t\tconst lengthView = new DataView(lengthField.buffer, lengthField.length - nrLength, nrLength);\n\n\t\t\t\treturn {\n\t\t\t\t\tid: getUintBE(idView),\n\t\t\t\t\tlen: getUintBE(lengthView),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tasync function readChildren(children) {\n\t\t\t\twhile (children > 0) {\n\t\t\t\t\tconst element = await readElement();\n\t\t\t\t\tif (element.id === 0x42_82) {\n\t\t\t\t\t\tconst rawValue = await tokenizer.readToken(new Token.StringType(element.len));\n\t\t\t\t\t\treturn rawValue.replaceAll(/\\00.*$/g, ''); // Return DocType\n\t\t\t\t\t}\n\n\t\t\t\t\tawait tokenizer.ignore(element.len); // ignore payload\n\t\t\t\t\t--children;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst re = await readElement();\n\t\t\tconst documentType = await readChildren(re.len);\n\n\t\t\tswitch (documentType) {\n\t\t\t\tcase 'webm':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'webm',\n\t\t\t\t\t\tmime: 'video/webm',\n\t\t\t\t\t};\n\n\t\t\t\tcase 'matroska':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'mkv',\n\t\t\t\t\t\tmime: 'video/matroska',\n\t\t\t\t\t};\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (this.checkString('SQLi')) {\n\t\t\treturn {\n\t\t\t\text: 'sqlite',\n\t\t\t\tmime: 'application/x-sqlite3',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x4E, 0x45, 0x53, 0x1A])) {\n\t\t\treturn {\n\t\t\t\text: 'nes',\n\t\t\t\tmime: 'application/x-nintendo-nes-rom',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('Cr24')) {\n\t\t\treturn {\n\t\t\t\text: 'crx',\n\t\t\t\tmime: 'application/x-google-chrome-extension',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.checkString('MSCF')\n\t\t\t|| this.checkString('ISc(')\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'cab',\n\t\t\t\tmime: 'application/vnd.ms-cab-compressed',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xED, 0xAB, 0xEE, 0xDB])) {\n\t\t\treturn {\n\t\t\t\text: 'rpm',\n\t\t\t\tmime: 'application/x-rpm',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xC5, 0xD0, 0xD3, 0xC6])) {\n\t\t\treturn {\n\t\t\t\text: 'eps',\n\t\t\t\tmime: 'application/eps',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x28, 0xB5, 0x2F, 0xFD])) {\n\t\t\treturn {\n\t\t\t\text: 'zst',\n\t\t\t\tmime: 'application/zstd',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x7F, 0x45, 0x4C, 0x46])) {\n\t\t\treturn {\n\t\t\t\text: 'elf',\n\t\t\t\tmime: 'application/x-elf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x21, 0x42, 0x44, 0x4E])) {\n\t\t\treturn {\n\t\t\t\text: 'pst',\n\t\t\t\tmime: 'application/vnd.ms-outlook',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('PAR1') || this.checkString('PARE')) {\n\t\t\treturn {\n\t\t\t\text: 'parquet',\n\t\t\t\tmime: 'application/vnd.apache.parquet',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('ttcf')) {\n\t\t\treturn {\n\t\t\t\text: 'ttc',\n\t\t\t\tmime: 'font/collection',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0xFE, 0xED, 0xFA, 0xCE]) // 32-bit, big-endian\n\t\t\t|| this.check([0xFE, 0xED, 0xFA, 0xCF]) // 64-bit, big-endian\n\t\t\t|| this.check([0xCE, 0xFA, 0xED, 0xFE]) // 32-bit, little-endian\n\t\t\t|| this.check([0xCF, 0xFA, 0xED, 0xFE]) // 64-bit, little-endian\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'macho',\n\t\t\t\tmime: 'application/x-mach-binary',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x04, 0x22, 0x4D, 0x18])) {\n\t\t\treturn {\n\t\t\t\text: 'lz4',\n\t\t\t\tmime: 'application/x-lz4', // Invented by us\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('regf')) {\n\t\t\treturn {\n\t\t\t\text: 'dat',\n\t\t\t\tmime: 'application/x-ft-windows-registry-hive',\n\t\t\t};\n\t\t}\n\n\t\t// SPSS Statistical Data File\n\t\tif (this.checkString('$FL2') || this.checkString('$FL3')) {\n\t\t\treturn {\n\t\t\t\text: 'sav',\n\t\t\t\tmime: 'application/x-spss-sav',\n\t\t\t};\n\t\t}\n\n\t\t// -- 5-byte signatures --\n\n\t\tif (this.check([0x4F, 0x54, 0x54, 0x4F, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'otf',\n\t\t\t\tmime: 'font/otf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('#!AMR')) {\n\t\t\treturn {\n\t\t\t\text: 'amr',\n\t\t\t\tmime: 'audio/amr',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('{\\\\rtf')) {\n\t\t\treturn {\n\t\t\t\text: 'rtf',\n\t\t\t\tmime: 'application/rtf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x46, 0x4C, 0x56, 0x01])) {\n\t\t\treturn {\n\t\t\t\text: 'flv',\n\t\t\t\tmime: 'video/x-flv',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('IMPM')) {\n\t\t\treturn {\n\t\t\t\text: 'it',\n\t\t\t\tmime: 'audio/x-it',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.checkString('-lh0-', {offset: 2})\n\t\t\t|| this.checkString('-lh1-', {offset: 2})\n\t\t\t|| this.checkString('-lh2-', {offset: 2})\n\t\t\t|| this.checkString('-lh3-', {offset: 2})\n\t\t\t|| this.checkString('-lh4-', {offset: 2})\n\t\t\t|| this.checkString('-lh5-', {offset: 2})\n\t\t\t|| this.checkString('-lh6-', {offset: 2})\n\t\t\t|| this.checkString('-lh7-', {offset: 2})\n\t\t\t|| this.checkString('-lzs-', {offset: 2})\n\t\t\t|| this.checkString('-lz4-', {offset: 2})\n\t\t\t|| this.checkString('-lz5-', {offset: 2})\n\t\t\t|| this.checkString('-lhd-', {offset: 2})\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'lzh',\n\t\t\t\tmime: 'application/x-lzh-compressed',\n\t\t\t};\n\t\t}\n\n\t\t// MPEG program stream (PS or MPEG-PS)\n\t\tif (this.check([0x00, 0x00, 0x01, 0xBA])) {\n\t\t\t// MPEG-PS, MPEG-1 Part 1\n\t\t\tif (this.check([0x21], {offset: 4, mask: [0xF1]})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'mpg', // May also be .ps, .mpeg\n\t\t\t\t\tmime: 'video/MP1S',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// MPEG-PS, MPEG-2 Part 1\n\t\t\tif (this.check([0x44], {offset: 4, mask: [0xC4]})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'mpg', // May also be .mpg, .m2p, .vob or .sub\n\t\t\t\t\tmime: 'video/MP2P',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (this.checkString('ITSF')) {\n\t\t\treturn {\n\t\t\t\text: 'chm',\n\t\t\t\tmime: 'application/vnd.ms-htmlhelp',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xCA, 0xFE, 0xBA, 0xBE])) {\n\t\t\t// Java bytecode and Mach-O universal binaries have the same magic number.\n\t\t\t// We disambiguate based on the next 4 bytes, as done by `file`.\n\t\t\t// See https://github.com/file/file/blob/master/magic/Magdir/cafebabe\n\t\t\tconst machOArchitectureCount = Token.UINT32_BE.get(this.buffer, 4);\n\t\t\tconst javaClassFileMajorVersion = Token.UINT16_BE.get(this.buffer, 6);\n\n\t\t\tif (machOArchitectureCount > 0 && machOArchitectureCount <= 30) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'macho',\n\t\t\t\t\tmime: 'application/x-mach-binary',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (javaClassFileMajorVersion > 30) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'class',\n\t\t\t\t\tmime: 'application/java-vm',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (this.checkString('.RMF')) {\n\t\t\treturn {\n\t\t\t\text: 'rm',\n\t\t\t\tmime: 'application/vnd.rn-realmedia',\n\t\t\t};\n\t\t}\n\n\t\t// -- 5-byte signatures --\n\n\t\tif (this.checkString('DRACO')) {\n\t\t\treturn {\n\t\t\t\text: 'drc',\n\t\t\t\tmime: 'application/vnd.google.draco', // Invented by us\n\t\t\t};\n\t\t}\n\n\t\t// -- 6-byte signatures --\n\n\t\tif (this.check([0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'xz',\n\t\t\t\tmime: 'application/x-xz',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('<?xml ')) {\n\t\t\treturn {\n\t\t\t\text: 'xml',\n\t\t\t\tmime: 'application/xml',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C])) {\n\t\t\treturn {\n\t\t\t\text: '7z',\n\t\t\t\tmime: 'application/x-7z-compressed',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0x52, 0x61, 0x72, 0x21, 0x1A, 0x7])\n\t\t\t&& (this.buffer[6] === 0x0 || this.buffer[6] === 0x1)\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'rar',\n\t\t\t\tmime: 'application/x-rar-compressed',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('solid ')) {\n\t\t\treturn {\n\t\t\t\text: 'stl',\n\t\t\t\tmime: 'model/stl',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('AC')) {\n\t\t\tconst version = new Token.StringType(4, 'latin1').get(this.buffer, 2);\n\t\t\tif (version.match('^d*') && version >= 1000 && version <= 1050) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'dwg',\n\t\t\t\t\tmime: 'image/vnd.dwg',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (this.checkString('070707')) {\n\t\t\treturn {\n\t\t\t\text: 'cpio',\n\t\t\t\tmime: 'application/x-cpio',\n\t\t\t};\n\t\t}\n\n\t\t// -- 7-byte signatures --\n\n\t\tif (this.checkString('BLENDER')) {\n\t\t\treturn {\n\t\t\t\text: 'blend',\n\t\t\t\tmime: 'application/x-blender',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('!<arch>')) {\n\t\t\tawait tokenizer.ignore(8);\n\t\t\tconst string = await tokenizer.readToken(new Token.StringType(13, 'ascii'));\n\t\t\tif (string === 'debian-binary') {\n\t\t\t\treturn {\n\t\t\t\t\text: 'deb',\n\t\t\t\t\tmime: 'application/x-deb',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\text: 'ar',\n\t\t\t\tmime: 'application/x-unix-archive',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.checkString('WEBVTT')\n\t\t\t&&\t(\n\t\t\t\t// One of LF, CR, tab, space, or end of file must follow \"WEBVTT\" per the spec (see `fixture/fixture-vtt-*.vtt` for examples). Note that `\\0` is technically the null character (there is no such thing as an EOF character). However, checking for `\\0` gives us the same result as checking for the end of the stream.\n\t\t\t\t(['\\n', '\\r', '\\t', ' ', '\\0'].some(char7 => this.checkString(char7, {offset: 6}))))\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'vtt',\n\t\t\t\tmime: 'text/vtt',\n\t\t\t};\n\t\t}\n\n\t\t// -- 8-byte signatures --\n\n\t\tif (this.check([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])) {\n\t\t\t// APNG format (https://wiki.mozilla.org/APNG_Specification)\n\t\t\t// 1. Find the first IDAT (image data) chunk (49 44 41 54)\n\t\t\t// 2. Check if there is an \"acTL\" chunk before the IDAT one (61 63 54 4C)\n\n\t\t\t// Offset calculated as follows:\n\t\t\t// - 8 bytes: PNG signature\n\t\t\t// - 4 (length) + 4 (chunk type) + 13 (chunk data) + 4 (CRC): IHDR chunk\n\n\t\t\tawait tokenizer.ignore(8); // ignore PNG signature\n\n\t\t\tasync function readChunkHeader() {\n\t\t\t\treturn {\n\t\t\t\t\tlength: await tokenizer.readToken(Token.INT32_BE),\n\t\t\t\t\ttype: await tokenizer.readToken(new Token.StringType(4, 'latin1')),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tdo {\n\t\t\t\tconst chunk = await readChunkHeader();\n\t\t\t\tif (chunk.length < 0) {\n\t\t\t\t\treturn; // Invalid chunk length\n\t\t\t\t}\n\n\t\t\t\tswitch (chunk.type) {\n\t\t\t\t\tcase 'IDAT':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'png',\n\t\t\t\t\t\t\tmime: 'image/png',\n\t\t\t\t\t\t};\n\t\t\t\t\tcase 'acTL':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'apng',\n\t\t\t\t\t\t\tmime: 'image/apng',\n\t\t\t\t\t\t};\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tawait tokenizer.ignore(chunk.length + 4); // Ignore chunk-data + CRC\n\t\t\t\t}\n\t\t\t} while (tokenizer.position + 8 < tokenizer.fileInfo.size);\n\n\t\t\treturn {\n\t\t\t\text: 'png',\n\t\t\t\tmime: 'image/png',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x41, 0x52, 0x52, 0x4F, 0x57, 0x31, 0x00, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'arrow',\n\t\t\t\tmime: 'application/vnd.apache.arrow.file',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x67, 0x6C, 0x54, 0x46, 0x02, 0x00, 0x00, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'glb',\n\t\t\t\tmime: 'model/gltf-binary',\n\t\t\t};\n\t\t}\n\n\t\t// `mov` format variants\n\t\tif (\n\t\t\tthis.check([0x66, 0x72, 0x65, 0x65], {offset: 4}) // `free`\n\t\t\t|| this.check([0x6D, 0x64, 0x61, 0x74], {offset: 4}) // `mdat` MJPEG\n\t\t\t|| this.check([0x6D, 0x6F, 0x6F, 0x76], {offset: 4}) // `moov`\n\t\t\t|| this.check([0x77, 0x69, 0x64, 0x65], {offset: 4}) // `wide`\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'mov',\n\t\t\t\tmime: 'video/quicktime',\n\t\t\t};\n\t\t}\n\n\t\t// -- 9-byte signatures --\n\n\t\tif (this.check([0x49, 0x49, 0x52, 0x4F, 0x08, 0x00, 0x00, 0x00, 0x18])) {\n\t\t\treturn {\n\t\t\t\text: 'orf',\n\t\t\t\tmime: 'image/x-olympus-orf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('gimp xcf ')) {\n\t\t\treturn {\n\t\t\t\text: 'xcf',\n\t\t\t\tmime: 'image/x-xcf',\n\t\t\t};\n\t\t}\n\n\t\t// File Type Box (https://en.wikipedia.org/wiki/ISO_base_media_file_format)\n\t\t// It's not required to be first, but it's recommended to be. Almost all ISO base media files start with `ftyp` box.\n\t\t// `ftyp` box must contain a brand major identifier, which must consist of ISO 8859-1 printable characters.\n\t\t// Here we check for 8859-1 printable characters (for simplicity, it's a mask which also catches one non-printable character).\n\t\tif (\n\t\t\tthis.checkString('ftyp', {offset: 4})\n\t\t\t&& (this.buffer[8] & 0x60) !== 0x00 // Brand major, first character ASCII?\n\t\t) {\n\t\t\t// They all can have MIME `video/mp4` except `application/mp4` special-case which is hard to detect.\n\t\t\t// For some cases, we're specific, everything else falls to `video/mp4` with `mp4` extension.\n\t\t\tconst brandMajor = new Token.StringType(4, 'latin1').get(this.buffer, 8).replace('\\0', ' ').trim();\n\t\t\tswitch (brandMajor) {\n\t\t\t\tcase 'avif':\n\t\t\t\tcase 'avis':\n\t\t\t\t\treturn {ext: 'avif', mime: 'image/avif'};\n\t\t\t\tcase 'mif1':\n\t\t\t\t\treturn {ext: 'heic', mime: 'image/heif'};\n\t\t\t\tcase 'msf1':\n\t\t\t\t\treturn {ext: 'heic', mime: 'image/heif-sequence'};\n\t\t\t\tcase 'heic':\n\t\t\t\tcase 'heix':\n\t\t\t\t\treturn {ext: 'heic', mime: 'image/heic'};\n\t\t\t\tcase 'hevc':\n\t\t\t\tcase 'hevx':\n\t\t\t\t\treturn {ext: 'heic', mime: 'image/heic-sequence'};\n\t\t\t\tcase 'qt':\n\t\t\t\t\treturn {ext: 'mov', mime: 'video/quicktime'};\n\t\t\t\tcase 'M4V':\n\t\t\t\tcase 'M4VH':\n\t\t\t\tcase 'M4VP':\n\t\t\t\t\treturn {ext: 'm4v', mime: 'video/x-m4v'};\n\t\t\t\tcase 'M4P':\n\t\t\t\t\treturn {ext: 'm4p', mime: 'video/mp4'};\n\t\t\t\tcase 'M4B':\n\t\t\t\t\treturn {ext: 'm4b', mime: 'audio/mp4'};\n\t\t\t\tcase 'M4A':\n\t\t\t\t\treturn {ext: 'm4a', mime: 'audio/x-m4a'};\n\t\t\t\tcase 'F4V':\n\t\t\t\t\treturn {ext: 'f4v', mime: 'video/mp4'};\n\t\t\t\tcase 'F4P':\n\t\t\t\t\treturn {ext: 'f4p', mime: 'video/mp4'};\n\t\t\t\tcase 'F4A':\n\t\t\t\t\treturn {ext: 'f4a', mime: 'audio/mp4'};\n\t\t\t\tcase 'F4B':\n\t\t\t\t\treturn {ext: 'f4b', mime: 'audio/mp4'};\n\t\t\t\tcase 'crx':\n\t\t\t\t\treturn {ext: 'cr3', mime: 'image/x-canon-cr3'};\n\t\t\t\tdefault:\n\t\t\t\t\tif (brandMajor.startsWith('3g')) {\n\t\t\t\t\t\tif (brandMajor.startsWith('3g2')) {\n\t\t\t\t\t\t\treturn {ext: '3g2', mime: 'video/3gpp2'};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn {ext: '3gp', mime: 'video/3gpp'};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {ext: 'mp4', mime: 'video/mp4'};\n\t\t\t}\n\t\t}\n\n\t\t// -- 10-byte signatures --\n\n\t\tif (this.checkString('REGEDIT4\\r\\n')) {\n\t\t\treturn {\n\t\t\t\text: 'reg',\n\t\t\t\tmime: 'application/x-ms-regedit',\n\t\t\t};\n\t\t}\n\n\t\t// -- 12-byte signatures --\n\n\t\t// RIFF file format which might be AVI, WAV, QCP, etc\n\t\tif (this.check([0x52, 0x49, 0x46, 0x46])) {\n\t\t\tif (this.checkString('WEBP', {offset: 8})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'webp',\n\t\t\t\t\tmime: 'image/webp',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (this.check([0x41, 0x56, 0x49], {offset: 8})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'avi',\n\t\t\t\t\tmime: 'video/vnd.avi',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (this.check([0x57, 0x41, 0x56, 0x45], {offset: 8})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'wav',\n\t\t\t\t\tmime: 'audio/wav',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// QLCM, QCP file\n\t\t\tif (this.check([0x51, 0x4C, 0x43, 0x4D], {offset: 8})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'qcp',\n\t\t\t\t\tmime: 'audio/qcelp',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (this.check([0x49, 0x49, 0x55, 0x00, 0x18, 0x00, 0x00, 0x00, 0x88, 0xE7, 0x74, 0xD8])) {\n\t\t\treturn {\n\t\t\t\text: 'rw2',\n\t\t\t\tmime: 'image/x-panasonic-rw2',\n\t\t\t};\n\t\t}\n\n\t\t// ASF_Header_Object first 80 bytes\n\t\tif (this.check([0x30, 0x26, 0xB2, 0x75, 0x8E, 0x66, 0xCF, 0x11, 0xA6, 0xD9])) {\n\t\t\tasync function readHeader() {\n\t\t\t\tconst guid = new Uint8Array(16);\n\t\t\t\tawait tokenizer.readBuffer(guid);\n\t\t\t\treturn {\n\t\t\t\t\tid: guid,\n\t\t\t\t\tsize: Number(await tokenizer.readToken(Token.UINT64_LE)),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tawait tokenizer.ignore(30);\n\t\t\t// Search for header should be in first 1KB of file.\n\t\t\twhile (tokenizer.position + 24 < tokenizer.fileInfo.size) {\n\t\t\t\tconst header = await readHeader();\n\t\t\t\tlet payload = header.size - 24;\n\t\t\t\tif (_check(header.id, [0x91, 0x07, 0xDC, 0xB7, 0xB7, 0xA9, 0xCF, 0x11, 0x8E, 0xE6, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65])) {\n\t\t\t\t\t// Sync on Stream-Properties-Object (B7DC0791-A9B7-11CF-8EE6-00C00C205365)\n\t\t\t\t\tconst typeId = new Uint8Array(16);\n\t\t\t\t\tpayload -= await tokenizer.readBuffer(typeId);\n\n\t\t\t\t\tif (_check(typeId, [0x40, 0x9E, 0x69, 0xF8, 0x4D, 0x5B, 0xCF, 0x11, 0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B])) {\n\t\t\t\t\t\t// Found audio:\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'asf',\n\t\t\t\t\t\t\tmime: 'audio/x-ms-asf',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tif (_check(typeId, [0xC0, 0xEF, 0x19, 0xBC, 0x4D, 0x5B, 0xCF, 0x11, 0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B])) {\n\t\t\t\t\t\t// Found video:\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'asf',\n\t\t\t\t\t\t\tmime: 'video/x-ms-asf',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tawait tokenizer.ignore(payload);\n\t\t\t}\n\n\t\t\t// Default to ASF generic extension\n\t\t\treturn {\n\t\t\t\text: 'asf',\n\t\t\t\tmime: 'application/vnd.ms-asf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A])) {\n\t\t\treturn {\n\t\t\t\text: 'ktx',\n\t\t\t\tmime: 'image/ktx',\n\t\t\t};\n\t\t}\n\n\t\tif ((this.check([0x7E, 0x10, 0x04]) || this.check([0x7E, 0x18, 0x04])) && this.check([0x30, 0x4D, 0x49, 0x45], {offset: 4})) {\n\t\t\treturn {\n\t\t\t\text: 'mie',\n\t\t\t\tmime: 'application/x-mie',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x27, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], {offset: 2})) {\n\t\t\treturn {\n\t\t\t\text: 'shp',\n\t\t\t\tmime: 'application/x-esri-shape',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xFF, 0x4F, 0xFF, 0x51])) {\n\t\t\treturn {\n\t\t\t\text: 'j2c',\n\t\t\t\tmime: 'image/j2c',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x00, 0x00, 0x00, 0x0C, 0x6A, 0x50, 0x20, 0x20, 0x0D, 0x0A, 0x87, 0x0A])) {\n\t\t\t// JPEG-2000 family\n\n\t\t\tawait tokenizer.ignore(20);\n\t\t\tconst type = await tokenizer.readToken(new Token.StringType(4, 'ascii'));\n\t\t\tswitch (type) {\n\t\t\t\tcase 'jp2 ':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'jp2',\n\t\t\t\t\t\tmime: 'image/jp2',\n\t\t\t\t\t};\n\t\t\t\tcase 'jpx ':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'jpx',\n\t\t\t\t\t\tmime: 'image/jpx',\n\t\t\t\t\t};\n\t\t\t\tcase 'jpm ':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'jpm',\n\t\t\t\t\t\tmime: 'image/jpm',\n\t\t\t\t\t};\n\t\t\t\tcase 'mjp2':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'mj2',\n\t\t\t\t\t\tmime: 'image/mj2',\n\t\t\t\t\t};\n\t\t\t\tdefault:\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0xFF, 0x0A])\n\t\t\t|| this.check([0x00, 0x00, 0x00, 0x0C, 0x4A, 0x58, 0x4C, 0x20, 0x0D, 0x0A, 0x87, 0x0A])\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'jxl',\n\t\t\t\tmime: 'image/jxl',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xFE, 0xFF])) { // UTF-16-BOM-BE\n\t\t\tif (this.checkString('<?xml ', {offset: 2, encoding: 'utf-16be'})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'xml',\n\t\t\t\t\tmime: 'application/xml',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn undefined; // Some unknown text based format\n\t\t}\n\n\t\tif (this.check([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1])) {\n\t\t\t// Detected Microsoft Compound File Binary File (MS-CFB) Format.\n\t\t\treturn {\n\t\t\t\text: 'cfb',\n\t\t\t\tmime: 'application/x-cfb',\n\t\t\t};\n\t\t}\n\n\t\t// Increase sample size from 32 to 256.\n\t\tawait tokenizer.peekBuffer(this.buffer, {length: Math.min(256, tokenizer.fileInfo.size), mayBeLess: true});\n\n\t\tif (this.check([0x61, 0x63, 0x73, 0x70], {offset: 36})) {\n\t\t\treturn {\n\t\t\t\text: 'icc',\n\t\t\t\tmime: 'application/vnd.iccprofile',\n\t\t\t};\n\t\t}\n\n\t\t// ACE: requires 14 bytes in the buffer\n\t\tif (this.checkString('**ACE', {offset: 7}) && this.checkString('**', {offset: 12})) {\n\t\t\treturn {\n\t\t\t\text: 'ace',\n\t\t\t\tmime: 'application/x-ace-compressed',\n\t\t\t};\n\t\t}\n\n\t\t// -- 15-byte signatures --\n\n\t\tif (this.checkString('BEGIN:')) {\n\t\t\tif (this.checkString('VCARD', {offset: 6})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'vcf',\n\t\t\t\t\tmime: 'text/vcard',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (this.checkString('VCALENDAR', {offset: 6})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'ics',\n\t\t\t\t\tmime: 'text/calendar',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// `raf` is here just to keep all the raw image detectors together.\n\t\tif (this.checkString('FUJIFILMCCD-RAW')) {\n\t\t\treturn {\n\t\t\t\text: 'raf',\n\t\t\t\tmime: 'image/x-fujifilm-raf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('Extended Module:')) {\n\t\t\treturn {\n\t\t\t\text: 'xm',\n\t\t\t\tmime: 'audio/x-xm',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('Creative Voice File')) {\n\t\t\treturn {\n\t\t\t\text: 'voc',\n\t\t\t\tmime: 'audio/x-voc',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x04, 0x00, 0x00, 0x00]) && this.buffer.length >= 16) { // Rough & quick check Pickle/ASAR\n\t\t\tconst jsonSize = new DataView(this.buffer.buffer).getUint32(12, true);\n\n\t\t\tif (jsonSize > 12 && this.buffer.length >= jsonSize + 16) {\n\t\t\t\ttry {\n\t\t\t\t\tconst header = new TextDecoder().decode(this.buffer.subarray(16, jsonSize + 16));\n\t\t\t\t\tconst json = JSON.parse(header);\n\t\t\t\t\t// Check if Pickle is ASAR\n\t\t\t\t\tif (json.files) { // Final check, assuring Pickle/ASAR format\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'asar',\n\t\t\t\t\t\t\tmime: 'application/x-asar',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t}\n\n\t\tif (this.check([0x06, 0x0E, 0x2B, 0x34, 0x02, 0x05, 0x01, 0x01, 0x0D, 0x01, 0x02, 0x01, 0x01, 0x02])) {\n\t\t\treturn {\n\t\t\t\text: 'mxf',\n\t\t\t\tmime: 'application/mxf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('SCRM', {offset: 44})) {\n\t\t\treturn {\n\t\t\t\text: 's3m',\n\t\t\t\tmime: 'audio/x-s3m',\n\t\t\t};\n\t\t}\n\n\t\t// Raw MPEG-2 transport stream (188-byte packets)\n\t\tif (this.check([0x47]) && this.check([0x47], {offset: 188})) {\n\t\t\treturn {\n\t\t\t\text: 'mts',\n\t\t\t\tmime: 'video/mp2t',\n\t\t\t};\n\t\t}\n\n\t\t// Blu-ray Disc Audio-Video (BDAV) MPEG-2 transport stream has 4-byte TP_extra_header before each 188-byte packet\n\t\tif (this.check([0x47], {offset: 4}) && this.check([0x47], {offset: 196})) {\n\t\t\treturn {\n\t\t\t\text: 'mts',\n\t\t\t\tmime: 'video/mp2t',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x42, 0x4F, 0x4F, 0x4B, 0x4D, 0x4F, 0x42, 0x49], {offset: 60})) {\n\t\t\treturn {\n\t\t\t\text: 'mobi',\n\t\t\t\tmime: 'application/x-mobipocket-ebook',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x44, 0x49, 0x43, 0x4D], {offset: 128})) {\n\t\t\treturn {\n\t\t\t\text: 'dcm',\n\t\t\t\tmime: 'application/dicom',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x4C, 0x00, 0x00, 0x00, 0x01, 0x14, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46])) {\n\t\t\treturn {\n\t\t\t\text: 'lnk',\n\t\t\t\tmime: 'application/x.ms.shortcut', // Invented by us\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x62, 0x6F, 0x6F, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x61, 0x72, 0x6B, 0x00, 0x00, 0x00, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'alias',\n\t\t\t\tmime: 'application/x.apple.alias', // Invented by us\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('Kaydara FBX Binary \\u0000')) {\n\t\t\treturn {\n\t\t\t\text: 'fbx',\n\t\t\t\tmime: 'application/x.autodesk.fbx', // Invented by us\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0x4C, 0x50], {offset: 34})\n\t\t\t&& (\n\t\t\t\tthis.check([0x00, 0x00, 0x01], {offset: 8})\n\t\t\t\t|| this.check([0x01, 0x00, 0x02], {offset: 8})\n\t\t\t\t|| this.check([0x02, 0x00, 0x02], {offset: 8})\n\t\t\t)\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'eot',\n\t\t\t\tmime: 'application/vnd.ms-fontobject',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x06, 0x06, 0xED, 0xF5, 0xD8, 0x1D, 0x46, 0xE5, 0xBD, 0x31, 0xEF, 0xE7, 0xFE, 0x74, 0xB7, 0x1D])) {\n\t\t\treturn {\n\t\t\t\text: 'indd',\n\t\t\t\tmime: 'application/x-indesign',\n\t\t\t};\n\t\t}\n\n\t\t// -- 16-byte signatures --\n\n\t\t// JMP files - check for both Little Endian and Big Endian signatures\n\t\tif (this.check([0xFF, 0xFF, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00])\n\t\t\t|| this.check([0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01])) {\n\t\t\treturn {\n\t\t\t\text: 'jmp',\n\t\t\t\tmime: 'application/x-jmp-data',\n\t\t\t};\n\t\t}\n\n\t\t// Increase sample size from 256 to 512\n\t\tawait tokenizer.peekBuffer(this.buffer, {length: Math.min(512, tokenizer.fileInfo.size), mayBeLess: true});\n\n\t\t// Requires a buffer size of 512 bytes\n\t\tif ((this.checkString('ustar', {offset: 257}) && (this.checkString('\\0', {offset: 262}) || this.checkString(' ', {offset: 262})))\n\t\t\t|| (this.check([0, 0, 0, 0, 0, 0], {offset: 257}) && tarHeaderChecksumMatches(this.buffer))) {\n\t\t\treturn {\n\t\t\t\text: 'tar',\n\t\t\t\tmime: 'application/x-tar',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xFF, 0xFE])) { // UTF-16-BOM-LE\n\t\t\tconst encoding = 'utf-16le';\n\t\t\tif (this.checkString('<?xml ', {offset: 2, encoding})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'xml',\n\t\t\t\t\tmime: 'application/xml',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (this.check([0xFF, 0x0E], {offset: 2}) && this.checkString('SketchUp Model', {offset: 4, encoding})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'skp',\n\t\t\t\t\tmime: 'application/vnd.sketchup.skp',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (this.checkString('Windows Registry Editor Version 5.00\\r\\n', {offset: 2, encoding})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'reg',\n\t\t\t\t\tmime: 'application/x-ms-regedit',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn undefined; // Some text based format\n\t\t}\n\n\t\tif (this.checkString('-----BEGIN PGP MESSAGE-----')) {\n\t\t\treturn {\n\t\t\t\text: 'pgp',\n\t\t\t\tmime: 'application/pgp-encrypted',\n\t\t\t};\n\t\t}\n\t};\n\t// Detections with limited supporting data, resulting in a higher likelihood of false positives\n\tdetectImprecise = async tokenizer => {\n\t\tthis.buffer = new Uint8Array(reasonableDetectionSizeInBytes);\n\n\t\t// Read initial sample size of 8 bytes\n\t\tawait tokenizer.peekBuffer(this.buffer, {length: Math.min(8, tokenizer.fileInfo.size), mayBeLess: true});\n\n\t\tif (\n\t\t\tthis.check([0x0, 0x0, 0x1, 0xBA])\n\t\t\t|| this.check([0x0, 0x0, 0x1, 0xB3])\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'mpg',\n\t\t\t\tmime: 'video/mpeg',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x00, 0x01, 0x00, 0x00, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'ttf',\n\t\t\t\tmime: 'font/ttf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x00, 0x00, 0x01, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'ico',\n\t\t\t\tmime: 'image/x-icon',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x00, 0x00, 0x02, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'cur',\n\t\t\t\tmime: 'image/x-icon',\n\t\t\t};\n\t\t}\n\n\t\t// Adjust buffer to `mpegOffsetTolerance`\n\t\tawait tokenizer.peekBuffer(this.buffer, {length: Math.min(2 + this.options.mpegOffsetTolerance, tokenizer.fileInfo.size), mayBeLess: true});\n\n\t\t// Check MPEG 1 or 2 Layer 3 header, or 'layer 0' for ADTS (MPEG sync-word 0xFFE)\n\t\tif (this.buffer.length >= (2 + this.options.mpegOffsetTolerance)) {\n\t\t\tfor (let depth = 0; depth <= this.options.mpegOffsetTolerance; ++depth) {\n\t\t\t\tconst type = this.scanMpeg(depth);\n\t\t\t\tif (type) {\n\t\t\t\t\treturn type;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tasync readTiffTag(bigEndian) {\n\t\tconst tagId = await this.tokenizer.readToken(bigEndian ? Token.UINT16_BE : Token.UINT16_LE);\n\t\tthis.tokenizer.ignore(10);\n\t\tswitch (tagId) {\n\t\t\tcase 50_341:\n\t\t\t\treturn {\n\t\t\t\t\text: 'arw',\n\t\t\t\t\tmime: 'image/x-sony-arw',\n\t\t\t\t};\n\t\t\tcase 50_706:\n\t\t\t\treturn {\n\t\t\t\t\text: 'dng',\n\t\t\t\t\tmime: 'image/x-adobe-dng',\n\t\t\t\t};\n\t\t\tdefault:\n\t\t}\n\t}\n\n\tasync readTiffIFD(bigEndian) {\n\t\tconst numberOfTags = await this.tokenizer.readToken(bigEndian ? Token.UINT16_BE : Token.UINT16_LE);\n\t\tfor (let n = 0; n < numberOfTags; ++n) {\n\t\t\tconst fileType = await this.readTiffTag(bigEndian);\n\t\t\tif (fileType) {\n\t\t\t\treturn fileType;\n\t\t\t}\n\t\t}\n\t}\n\n\tasync readTiffHeader(bigEndian) {\n\t\tconst version = (bigEndian ? Token.UINT16_BE : Token.UINT16_LE).get(this.buffer, 2);\n\t\tconst ifdOffset = (bigEndian ? Token.UINT32_BE : Token.UINT32_LE).get(this.buffer, 4);\n\n\t\tif (version === 42) {\n\t\t\t// TIFF file header\n\t\t\tif (ifdOffset >= 6) {\n\t\t\t\tif (this.checkString('CR', {offset: 8})) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'cr2',\n\t\t\t\t\t\tmime: 'image/x-canon-cr2',\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (ifdOffset >= 8) {\n\t\t\t\t\tconst someId1 = (bigEndian ? Token.UINT16_BE : Token.UINT16_LE).get(this.buffer, 8);\n\t\t\t\t\tconst someId2 = (bigEndian ? Token.UINT16_BE : Token.UINT16_LE).get(this.buffer, 10);\n\n\t\t\t\t\tif (\n\t\t\t\t\t\t(someId1 === 0x1C && someId2 === 0xFE)\n\t\t\t\t\t\t|| (someId1 === 0x1F && someId2 === 0x0B)) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'nef',\n\t\t\t\t\t\t\tmime: 'image/x-nikon-nef',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait this.tokenizer.ignore(ifdOffset);\n\t\t\tconst fileType = await this.readTiffIFD(bigEndian);\n\t\t\treturn fileType ?? {\n\t\t\t\text: 'tif',\n\t\t\t\tmime: 'image/tiff',\n\t\t\t};\n\t\t}\n\n\t\tif (version === 43) {\t// Big TIFF file header\n\t\t\treturn {\n\t\t\t\text: 'tif',\n\t\t\t\tmime: 'image/tiff',\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\tScan check MPEG 1 or 2 Layer 3 header, or 'layer 0' for ADTS (MPEG sync-word 0xFFE).\n\n\t@param offset - Offset to scan for sync-preamble.\n\t@returns {{ext: string, mime: string}}\n\t*/\n\tscanMpeg(offset) {\n\t\tif (this.check([0xFF, 0xE0], {offset, mask: [0xFF, 0xE0]})) {\n\t\t\tif (this.check([0x10], {offset: offset + 1, mask: [0x16]})) {\n\t\t\t\t// Check for (ADTS) MPEG-2\n\t\t\t\tif (this.check([0x08], {offset: offset + 1, mask: [0x08]})) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'aac',\n\t\t\t\t\t\tmime: 'audio/aac',\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Must be (ADTS) MPEG-4\n\t\t\t\treturn {\n\t\t\t\t\text: 'aac',\n\t\t\t\t\tmime: 'audio/aac',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// MPEG 1 or 2 Layer 3 header\n\t\t\t// Check for MPEG layer 3\n\t\t\tif (this.check([0x02], {offset: offset + 1, mask: [0x06]})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'mp3',\n\t\t\t\t\tmime: 'audio/mpeg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Check for MPEG layer 2\n\t\t\tif (this.check([0x04], {offset: offset + 1, mask: [0x06]})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'mp2',\n\t\t\t\t\tmime: 'audio/mpeg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Check for MPEG layer 1\n\t\t\tif (this.check([0x06], {offset: offset + 1, mask: [0x06]})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'mp1',\n\t\t\t\t\tmime: 'audio/mpeg',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport const supportedExtensions = new Set(extensions);\nexport const supportedMimeTypes = new Set(mimeTypes);\n","import { fileTypeFromBuffer } from 'file-type';\nimport ContentType from 'content-type';\nimport { parse as mimeTypeParse } from 'media-typer';\nimport initDebug from 'debug';\nimport { MetadataCollector } from './common/MetadataCollector.js';\nimport { TrackType } from './type.js';\nimport { mpegParserLoader } from './mpeg/MpegLoader.js';\nimport { CouldNotDetermineFileTypeError, UnsupportedFileTypeError } from './ParseError.js';\nimport { apeParserLoader } from './apev2/Apev2Loader.js';\nimport { asfParserLoader } from './asf/AsfLoader.js';\nimport { dsdiffParserLoader } from './dsdiff/DsdiffLoader.js';\nimport { aiffParserLoader } from './aiff/AiffLoader.js';\nimport { dsfParserLoader } from './dsf/DsfLoader.js';\nimport { flacParserLoader } from './flac/FlacLoader.js';\nimport { matroskaParserLoader } from './matroska/MatroskaLoader.js';\nimport { mp4ParserLoader } from './mp4/Mp4Loader.js';\nimport { musepackParserLoader } from './musepack/MusepackLoader.js';\nimport { oggParserLoader } from './ogg/OggLoader.js';\nimport { wavpackParserLoader } from './wavpack/WavPackLoader.js';\nimport { riffParserLoader } from './wav/WaveLoader.js';\nimport { scanAppendingHeaders } from './core.js';\nconst debug = initDebug('music-metadata:parser:factory');\nexport function parseHttpContentType(contentType) {\n const type = ContentType.parse(contentType);\n const mime = mimeTypeParse(type.type);\n return {\n type: mime.type,\n subtype: mime.subtype,\n suffix: mime.suffix,\n parameters: type.parameters\n };\n}\nexport class ParserFactory {\n constructor() {\n this.parsers = [];\n [\n flacParserLoader,\n mpegParserLoader,\n apeParserLoader,\n mp4ParserLoader,\n matroskaParserLoader,\n riffParserLoader,\n oggParserLoader,\n asfParserLoader,\n aiffParserLoader,\n wavpackParserLoader,\n musepackParserLoader,\n dsfParserLoader,\n dsdiffParserLoader\n ].forEach(parser => { this.registerParser(parser); });\n }\n registerParser(parser) {\n this.parsers.push(parser);\n }\n async parse(tokenizer, parserLoader, opts) {\n if (tokenizer.supportsRandomAccess()) {\n debug('tokenizer supports random-access, scanning for appending headers');\n await scanAppendingHeaders(tokenizer, opts);\n }\n else {\n debug('tokenizer does not support random-access, cannot scan for appending headers');\n }\n if (!parserLoader) {\n const buf = new Uint8Array(4100);\n if (tokenizer.fileInfo.mimeType) {\n parserLoader = this.findLoaderForContentType(tokenizer.fileInfo.mimeType);\n }\n if (!parserLoader && tokenizer.fileInfo.path) {\n parserLoader = this.findLoaderForExtension(tokenizer.fileInfo.path);\n }\n if (!parserLoader) {\n // Parser could not be determined on MIME-type or extension\n debug('Guess parser on content...');\n await tokenizer.peekBuffer(buf, { mayBeLess: true });\n const guessedType = await fileTypeFromBuffer(buf, { mpegOffsetTolerance: 10 });\n if (!guessedType || !guessedType.mime) {\n throw new CouldNotDetermineFileTypeError('Failed to determine audio format');\n }\n debug(`Guessed file type is mime=${guessedType.mime}, extension=${guessedType.ext}`);\n parserLoader = this.findLoaderForContentType(guessedType.mime);\n if (!parserLoader) {\n throw new UnsupportedFileTypeError(`Guessed MIME-type not supported: ${guessedType.mime}`);\n }\n }\n }\n // Parser found, execute parser\n debug(`Loading ${parserLoader.parserType} parser...`);\n const metadata = new MetadataCollector(opts);\n const ParserImpl = await parserLoader.load();\n const parser = new ParserImpl(metadata, tokenizer, opts ?? {});\n debug(`Parser ${parserLoader.parserType} loaded`);\n await parser.parse();\n if (metadata.format.trackInfo) {\n if (metadata.format.hasAudio === undefined) {\n metadata.setFormat('hasAudio', !!metadata.format.trackInfo.find(track => track.type === TrackType.audio));\n }\n if (metadata.format.hasVideo === undefined) {\n metadata.setFormat('hasVideo', !!metadata.format.trackInfo.find(track => track.type === TrackType.video));\n }\n }\n return metadata.toCommonMetadata();\n }\n /**\n * @param filePath - Path, filename or extension to audio file\n * @return Parser submodule name\n */\n findLoaderForExtension(filePath) {\n if (!filePath)\n return;\n const extension = getExtension(filePath).toLocaleLowerCase() || filePath;\n return this.parsers.find(parser => parser.extensions.indexOf(extension) !== -1);\n }\n findLoaderForContentType(httpContentType) {\n let mime;\n if (!httpContentType)\n return;\n try {\n mime = parseHttpContentType(httpContentType);\n }\n catch (_err) {\n debug(`Invalid HTTP Content-Type header value: ${httpContentType}`);\n return;\n }\n const subType = mime.subtype.indexOf('x-') === 0 ? mime.subtype.substring(2) : mime.subtype;\n return this.parsers.find(parser => parser.mimeTypes.find(loader => loader.indexOf(`${mime.type}/${subType}`) !== -1));\n }\n getSupportedMimeTypes() {\n const mimeTypeSet = new Set();\n this.parsers.forEach(loader => {\n loader.mimeTypes.forEach(mimeType => {\n mimeTypeSet.add(mimeType);\n mimeTypeSet.add(mimeType.replace('/', '/x-'));\n });\n });\n return Array.from(mimeTypeSet);\n }\n}\nfunction getExtension(fname) {\n const i = fname.lastIndexOf('.');\n return i === -1 ? '' : fname.substring(i);\n}\n","import { TrackTypeValueToKeyMap, } from '../type.js';\nimport initDebug from 'debug';\nimport { isSingleton, isUnique } from './GenericTagTypes.js';\nimport { CombinedTagMapper } from './CombinedTagMapper.js';\nimport { CommonTagMapper } from './GenericTagMapper.js';\nimport { toRatio } from './Util.js';\nimport { fileTypeFromBuffer } from 'file-type';\nimport { parseLyrics } from '../lrc/LyricsParser.js';\nconst debug = initDebug('music-metadata:collector');\nconst TagPriority = ['matroska', 'APEv2', 'vorbis', 'ID3v2.4', 'ID3v2.3', 'ID3v2.2', 'exif', 'asf', 'iTunes', 'AIFF', 'ID3v1'];\n/**\n * Provided to the parser to uodate the metadata result.\n * Responsible for triggering async updates\n */\nexport class MetadataCollector {\n constructor(opts) {\n this.format = {\n tagTypes: [],\n trackInfo: []\n };\n this.native = {};\n this.common = {\n track: { no: null, of: null },\n disk: { no: null, of: null },\n movementIndex: { no: null, of: null }\n };\n this.quality = {\n warnings: []\n };\n /**\n * Keeps track of origin priority for each mapped id\n */\n this.commonOrigin = {};\n /**\n * Maps a tag type to a priority\n */\n this.originPriority = {};\n this.tagMapper = new CombinedTagMapper();\n this.opts = opts;\n let priority = 1;\n for (const tagType of TagPriority) {\n this.originPriority[tagType] = priority++;\n }\n this.originPriority.artificial = 500; // Filled using alternative tags\n this.originPriority.id3v1 = 600; // Consider as the worst because of the field length limit\n }\n /**\n * @returns {boolean} true if one or more tags have been found\n */\n hasAny() {\n return Object.keys(this.native).length > 0;\n }\n addStreamInfo(streamInfo) {\n debug(`streamInfo: type=${streamInfo.type ? TrackTypeValueToKeyMap[streamInfo.type] : '?'}, codec=${streamInfo.codecName}`);\n this.format.trackInfo.push(streamInfo);\n }\n setFormat(key, value) {\n debug(`format: ${key} = ${value}`);\n this.format[key] = value; // as any to override readonly\n if (this.opts?.observer) {\n this.opts.observer({ metadata: this, tag: { type: 'format', id: key, value } });\n }\n }\n setAudioOnly() {\n this.setFormat('hasAudio', true);\n this.setFormat('hasVideo', false);\n }\n async addTag(tagType, tagId, value) {\n debug(`tag ${tagType}.${tagId} = ${value}`);\n if (!this.native[tagType]) {\n this.format.tagTypes.push(tagType);\n this.native[tagType] = [];\n }\n this.native[tagType].push({ id: tagId, value });\n await this.toCommon(tagType, tagId, value);\n }\n addWarning(warning) {\n this.quality.warnings.push({ message: warning });\n }\n async postMap(tagType, tag) {\n // Common tag (alias) found\n // check if we need to do something special with common tag\n // if the event has been aliased then we need to clean it before\n // it is emitted to the user. e.g. genre (20) -> Electronic\n switch (tag.id) {\n case 'artist':\n if (this.commonOrigin.artist === this.originPriority[tagType]) {\n // Assume the artist field is used as artists\n return this.postMap('artificial', { id: 'artists', value: tag.value });\n }\n if (!this.common.artists) {\n // Fill artists using artist source\n this.setGenericTag('artificial', { id: 'artists', value: tag.value });\n }\n break;\n case 'artists':\n if (!this.common.artist || this.commonOrigin.artist === this.originPriority.artificial) {\n if (!this.common.artists || this.common.artists.indexOf(tag.value) === -1) {\n // Fill artist using artists source\n const artists = (this.common.artists || []).concat([tag.value]);\n const value = joinArtists(artists);\n const artistTag = { id: 'artist', value };\n this.setGenericTag('artificial', artistTag);\n }\n }\n break;\n case 'picture':\n return this.postFixPicture(tag.value).then(picture => {\n if (picture !== null) {\n tag.value = picture;\n this.setGenericTag(tagType, tag);\n }\n });\n case 'totaltracks':\n this.common.track.of = CommonTagMapper.toIntOrNull(tag.value);\n return;\n case 'totaldiscs':\n this.common.disk.of = CommonTagMapper.toIntOrNull(tag.value);\n return;\n case 'movementTotal':\n this.common.movementIndex.of = CommonTagMapper.toIntOrNull(tag.value);\n return;\n case 'track':\n case 'disk':\n case 'movementIndex': {\n const of = this.common[tag.id].of; // store of value, maybe maybe overwritten\n this.common[tag.id] = CommonTagMapper.normalizeTrack(tag.value);\n this.common[tag.id].of = of != null ? of : this.common[tag.id].of;\n return;\n }\n case 'bpm':\n case 'year':\n case 'originalyear':\n tag.value = Number.parseInt(tag.value, 10);\n break;\n case 'date': {\n // ToDo: be more strict on 'YYYY...'\n const year = Number.parseInt(tag.value.substr(0, 4), 10);\n if (!Number.isNaN(year)) {\n this.common.year = year;\n }\n break;\n }\n case 'discogs_label_id':\n case 'discogs_release_id':\n case 'discogs_master_release_id':\n case 'discogs_artist_id':\n case 'discogs_votes':\n tag.value = typeof tag.value === 'string' ? Number.parseInt(tag.value, 10) : tag.value;\n break;\n case 'replaygain_track_gain':\n case 'replaygain_track_peak':\n case 'replaygain_album_gain':\n case 'replaygain_album_peak':\n tag.value = toRatio(tag.value);\n break;\n case 'replaygain_track_minmax':\n tag.value = tag.value.split(',').map(v => Number.parseInt(v, 10));\n break;\n case 'replaygain_undo': {\n const minMix = tag.value.split(',').map(v => Number.parseInt(v, 10));\n tag.value = {\n leftChannel: minMix[0],\n rightChannel: minMix[1]\n };\n break;\n }\n case 'gapless': // iTunes gap-less flag\n case 'compilation':\n case 'podcast':\n case 'showMovement':\n tag.value = tag.value === '1' || tag.value === 1; // boolean\n break;\n case 'isrc': { // Only keep unique values\n const commonTag = this.common[tag.id];\n if (commonTag && commonTag.indexOf(tag.value) !== -1)\n return;\n break;\n }\n case 'comment':\n if (typeof tag.value === 'string') {\n tag.value = { text: tag.value };\n }\n if (tag.value.descriptor === 'iTunPGAP') {\n this.setGenericTag(tagType, { id: 'gapless', value: tag.value.text === '1' });\n }\n break;\n case 'lyrics':\n if (typeof tag.value === 'string') {\n tag.value = parseLyrics(tag.value);\n }\n break;\n default:\n // nothing to do\n }\n if (tag.value !== null) {\n this.setGenericTag(tagType, tag);\n }\n }\n /**\n * Convert native tags to common tags\n * @returns {IAudioMetadata} Native + common tags\n */\n toCommonMetadata() {\n return {\n format: this.format,\n native: this.native,\n quality: this.quality,\n common: this.common\n };\n }\n /**\n * Fix some common issues with picture object\n * @param picture Picture\n */\n async postFixPicture(picture) {\n if (picture.data && picture.data.length > 0) {\n if (!picture.format) {\n const fileType = await fileTypeFromBuffer(Uint8Array.from(picture.data)); // ToDO: remove Buffer\n if (fileType) {\n picture.format = fileType.mime;\n }\n else {\n return null;\n }\n }\n picture.format = picture.format.toLocaleLowerCase();\n switch (picture.format) {\n case 'image/jpg':\n picture.format = 'image/jpeg'; // ToDo: register warning\n }\n return picture;\n }\n this.addWarning(\"Empty picture tag found\");\n return null;\n }\n /**\n * Convert native tag to common tags\n */\n async toCommon(tagType, tagId, value) {\n const tag = { id: tagId, value };\n const genericTag = this.tagMapper.mapTag(tagType, tag, this);\n if (genericTag) {\n await this.postMap(tagType, genericTag);\n }\n }\n /**\n * Set generic tag\n */\n setGenericTag(tagType, tag) {\n debug(`common.${tag.id} = ${tag.value}`);\n const prio0 = this.commonOrigin[tag.id] || 1000;\n const prio1 = this.originPriority[tagType];\n if (isSingleton(tag.id)) {\n if (prio1 <= prio0) {\n this.common[tag.id] = tag.value;\n this.commonOrigin[tag.id] = prio1;\n }\n else {\n return debug(`Ignore native tag (singleton): ${tagType}.${tag.id} = ${tag.value}`);\n }\n }\n else {\n if (prio1 === prio0) {\n if (!isUnique(tag.id) || this.common[tag.id].indexOf(tag.value) === -1) {\n this.common[tag.id].push(tag.value);\n }\n else {\n debug(`Ignore duplicate value: ${tagType}.${tag.id} = ${tag.value}`);\n }\n // no effect? this.commonOrigin[tag.id] = prio1;\n }\n else if (prio1 < prio0) {\n this.common[tag.id] = [tag.value];\n this.commonOrigin[tag.id] = prio1;\n }\n else {\n return debug(`Ignore native tag (list): ${tagType}.${tag.id} = ${tag.value}`);\n }\n }\n if (this.opts?.observer) {\n this.opts.observer({ metadata: this, tag: { type: 'common', id: tag.id, value: tag.value } });\n }\n // ToDo: trigger metadata event\n }\n}\nexport function joinArtists(artists) {\n if (artists.length > 2) {\n return `${artists.slice(0, artists.length - 1).join(', ')} & ${artists[artists.length - 1]}`;\n }\n return artists.join(' & ');\n}\n","const defaultTagInfo = {\n multiple: false,\n};\nconst commonTags = {\n year: defaultTagInfo,\n track: defaultTagInfo,\n disk: defaultTagInfo,\n title: defaultTagInfo,\n artist: defaultTagInfo,\n artists: { multiple: true, unique: true },\n albumartist: defaultTagInfo,\n album: defaultTagInfo,\n date: defaultTagInfo,\n originaldate: defaultTagInfo,\n originalyear: defaultTagInfo,\n releasedate: defaultTagInfo,\n comment: { multiple: true, unique: false },\n genre: { multiple: true, unique: true },\n picture: { multiple: true, unique: true },\n composer: { multiple: true, unique: true },\n lyrics: { multiple: true, unique: false },\n albumsort: { multiple: false, unique: true },\n titlesort: { multiple: false, unique: true },\n work: { multiple: false, unique: true },\n artistsort: { multiple: false, unique: true },\n albumartistsort: { multiple: false, unique: true },\n composersort: { multiple: false, unique: true },\n lyricist: { multiple: true, unique: true },\n writer: { multiple: true, unique: true },\n conductor: { multiple: true, unique: true },\n remixer: { multiple: true, unique: true },\n arranger: { multiple: true, unique: true },\n engineer: { multiple: true, unique: true },\n producer: { multiple: true, unique: true },\n technician: { multiple: true, unique: true },\n djmixer: { multiple: true, unique: true },\n mixer: { multiple: true, unique: true },\n label: { multiple: true, unique: true },\n grouping: defaultTagInfo,\n subtitle: { multiple: true },\n discsubtitle: defaultTagInfo,\n totaltracks: defaultTagInfo,\n totaldiscs: defaultTagInfo,\n compilation: defaultTagInfo,\n rating: { multiple: true },\n bpm: defaultTagInfo,\n mood: defaultTagInfo,\n media: defaultTagInfo,\n catalognumber: { multiple: true, unique: true },\n tvShow: defaultTagInfo,\n tvShowSort: defaultTagInfo,\n tvSeason: defaultTagInfo,\n tvEpisode: defaultTagInfo,\n tvEpisodeId: defaultTagInfo,\n tvNetwork: defaultTagInfo,\n podcast: defaultTagInfo,\n podcasturl: defaultTagInfo,\n releasestatus: defaultTagInfo,\n releasetype: { multiple: true },\n releasecountry: defaultTagInfo,\n script: defaultTagInfo,\n language: defaultTagInfo,\n copyright: defaultTagInfo,\n license: defaultTagInfo,\n encodedby: defaultTagInfo,\n encodersettings: defaultTagInfo,\n gapless: defaultTagInfo,\n barcode: defaultTagInfo,\n isrc: { multiple: true },\n asin: defaultTagInfo,\n musicbrainz_recordingid: defaultTagInfo,\n musicbrainz_trackid: defaultTagInfo,\n musicbrainz_albumid: defaultTagInfo,\n musicbrainz_artistid: { multiple: true },\n musicbrainz_albumartistid: { multiple: true },\n musicbrainz_releasegroupid: defaultTagInfo,\n musicbrainz_workid: defaultTagInfo,\n musicbrainz_trmid: defaultTagInfo,\n musicbrainz_discid: defaultTagInfo,\n acoustid_id: defaultTagInfo,\n acoustid_fingerprint: defaultTagInfo,\n musicip_puid: defaultTagInfo,\n musicip_fingerprint: defaultTagInfo,\n website: defaultTagInfo,\n 'performer:instrument': { multiple: true, unique: true },\n averageLevel: defaultTagInfo,\n peakLevel: defaultTagInfo,\n notes: { multiple: true, unique: false },\n key: defaultTagInfo,\n originalalbum: defaultTagInfo,\n originalartist: defaultTagInfo,\n discogs_artist_id: { multiple: true, unique: true },\n discogs_release_id: defaultTagInfo,\n discogs_label_id: defaultTagInfo,\n discogs_master_release_id: defaultTagInfo,\n discogs_votes: defaultTagInfo,\n discogs_rating: defaultTagInfo,\n replaygain_track_peak: defaultTagInfo,\n replaygain_track_gain: defaultTagInfo,\n replaygain_album_peak: defaultTagInfo,\n replaygain_album_gain: defaultTagInfo,\n replaygain_track_minmax: defaultTagInfo,\n replaygain_album_minmax: defaultTagInfo,\n replaygain_undo: defaultTagInfo,\n description: { multiple: true },\n longDescription: defaultTagInfo,\n category: { multiple: true },\n hdVideo: defaultTagInfo,\n keywords: { multiple: true },\n movement: defaultTagInfo,\n movementIndex: defaultTagInfo,\n movementTotal: defaultTagInfo,\n podcastId: defaultTagInfo,\n showMovement: defaultTagInfo,\n stik: defaultTagInfo,\n playCounter: defaultTagInfo\n};\nexport const commonTagsKeys = /* @__PURE__ */ Object.keys(commonTags);\n/**\n * @param alias Name of common tag\n * @returns {boolean|*} true if given alias is mapped as a singleton', otherwise false\n */\nexport function isSingleton(alias) {\n return commonTags[alias] && !commonTags[alias].multiple;\n}\n/**\n * @param alias Common (generic) tag\n * @returns {boolean|*} true if given alias is a singleton or explicitly marked as unique\n */\nexport function isUnique(alias) {\n return !commonTags[alias].multiple || commonTags[alias].unique || false;\n}\n","export class CommonTagMapper {\n static toIntOrNull(str) {\n const cleaned = Number.parseInt(str, 10);\n return Number.isNaN(cleaned) ? null : cleaned;\n }\n // TODO: a string of 1of1 would fail to be converted\n // converts 1/10 to no : 1, of : 10\n // or 1 to no : 1, of : 0\n static normalizeTrack(origVal) {\n const split = origVal.toString().split('/');\n return {\n no: Number.parseInt(split[0], 10) || null,\n of: Number.parseInt(split[1], 10) || null\n };\n }\n constructor(tagTypes, tagMap) {\n this.tagTypes = tagTypes;\n this.tagMap = tagMap;\n }\n /**\n * Process and set common tags\n * write common tags to\n * @param tag Native tag\n * @param warnings Register warnings\n * @return common name\n */\n mapGenericTag(tag, warnings) {\n tag = { id: tag.id, value: tag.value }; // clone object\n this.postMap(tag, warnings);\n // Convert native tag event to generic 'alias' tag\n const id = this.getCommonName(tag.id);\n return id ? { id, value: tag.value } : null;\n }\n /**\n * Convert native tag key to common tag key\n * @param tag Native header tag\n * @return common tag name (alias)\n */\n getCommonName(tag) {\n return this.tagMap[tag];\n }\n /**\n * Handle post mapping exceptions / correction\n * @param tag Tag e.g. {\"©alb\", \"Buena Vista Social Club\")\n * @param warnings Used to register warnings\n */\n postMap(_tag, _warnings) {\n return;\n }\n}\nCommonTagMapper.maxRatingScore = 1;\n","import { CommonTagMapper } from '../common/GenericTagMapper.js';\n/**\n * ID3v1 tag mappings\n */\nconst id3v1TagMap = {\n title: 'title',\n artist: 'artist',\n album: 'album',\n year: 'year',\n comment: 'comment',\n track: 'track',\n genre: 'genre'\n};\nexport class ID3v1TagMapper extends CommonTagMapper {\n constructor() {\n super(['ID3v1'], id3v1TagMap);\n }\n}\n","import { CommonTagMapper } from './GenericTagMapper.js';\nexport class CaseInsensitiveTagMap extends CommonTagMapper {\n constructor(tagTypes, tagMap) {\n const upperCaseMap = {};\n for (const tag of Object.keys(tagMap)) {\n upperCaseMap[tag.toUpperCase()] = tagMap[tag];\n }\n super(tagTypes, upperCaseMap);\n }\n /**\n * @tag Native header tag\n * @return common tag name (alias)\n */\n getCommonName(tag) {\n return this.tagMap[tag.toUpperCase()];\n }\n}\n","import { UINT32_LE } from 'token-types';\nimport { CommonTagMapper } from '../common/GenericTagMapper.js';\nimport { CaseInsensitiveTagMap } from '../common/CaseInsensitiveTagMap.js';\nimport { decodeString } from '../common/Util.js';\n/**\n * ID3v2.3/ID3v2.4 tag mappings\n */\nconst id3v24TagMap = {\n // id3v2.3\n TIT2: 'title',\n TPE1: 'artist',\n 'TXXX:Artists': 'artists',\n TPE2: 'albumartist',\n TALB: 'album',\n TDRV: 'date', // [ 'date', 'year' ] ToDo: improve 'year' mapping\n /**\n * Original release year\n */\n TORY: 'originalyear',\n TPOS: 'disk',\n TCON: 'genre',\n APIC: 'picture',\n TCOM: 'composer',\n USLT: 'lyrics',\n TSOA: 'albumsort',\n TSOT: 'titlesort',\n TOAL: 'originalalbum',\n TSOP: 'artistsort',\n TSO2: 'albumartistsort',\n TSOC: 'composersort',\n TEXT: 'lyricist',\n 'TXXX:Writer': 'writer',\n TPE3: 'conductor',\n // 'IPLS:instrument': 'performer:instrument', // ToDo\n TPE4: 'remixer',\n 'IPLS:arranger': 'arranger',\n 'IPLS:engineer': 'engineer',\n 'IPLS:producer': 'producer',\n 'IPLS:DJ-mix': 'djmixer',\n 'IPLS:mix': 'mixer',\n TPUB: 'label',\n TIT1: 'grouping',\n TIT3: 'subtitle',\n TRCK: 'track',\n TCMP: 'compilation',\n POPM: 'rating',\n TBPM: 'bpm',\n TMED: 'media',\n 'TXXX:CATALOGNUMBER': 'catalognumber',\n 'TXXX:MusicBrainz Album Status': 'releasestatus',\n 'TXXX:MusicBrainz Album Type': 'releasetype',\n /**\n * Release country as documented: https://picard.musicbrainz.org/docs/mappings/#cite_note-0\n */\n 'TXXX:MusicBrainz Album Release Country': 'releasecountry',\n /**\n * Release country as implemented // ToDo: report\n */\n 'TXXX:RELEASECOUNTRY': 'releasecountry',\n 'TXXX:SCRIPT': 'script',\n TLAN: 'language',\n TCOP: 'copyright',\n WCOP: 'license',\n TENC: 'encodedby',\n TSSE: 'encodersettings',\n 'TXXX:BARCODE': 'barcode',\n 'TXXX:ISRC': 'isrc',\n TSRC: 'isrc',\n 'TXXX:ASIN': 'asin',\n 'TXXX:originalyear': 'originalyear',\n 'UFID:http://musicbrainz.org': 'musicbrainz_recordingid',\n 'TXXX:MusicBrainz Release Track Id': 'musicbrainz_trackid',\n 'TXXX:MusicBrainz Album Id': 'musicbrainz_albumid',\n 'TXXX:MusicBrainz Artist Id': 'musicbrainz_artistid',\n 'TXXX:MusicBrainz Album Artist Id': 'musicbrainz_albumartistid',\n 'TXXX:MusicBrainz Release Group Id': 'musicbrainz_releasegroupid',\n 'TXXX:MusicBrainz Work Id': 'musicbrainz_workid',\n 'TXXX:MusicBrainz TRM Id': 'musicbrainz_trmid',\n 'TXXX:MusicBrainz Disc Id': 'musicbrainz_discid',\n 'TXXX:ACOUSTID_ID': 'acoustid_id',\n 'TXXX:Acoustid Id': 'acoustid_id',\n 'TXXX:Acoustid Fingerprint': 'acoustid_fingerprint',\n 'TXXX:MusicIP PUID': 'musicip_puid',\n 'TXXX:MusicMagic Fingerprint': 'musicip_fingerprint',\n WOAR: 'website',\n // id3v2.4\n // ToDo: In same sequence as defined at http://id3.org/id3v2.4.0-frames\n TDRC: 'date', // date YYYY-MM-DD\n TYER: 'year',\n TDOR: 'originaldate',\n // 'TMCL:instrument': 'performer:instrument',\n 'TIPL:arranger': 'arranger',\n 'TIPL:engineer': 'engineer',\n 'TIPL:producer': 'producer',\n 'TIPL:DJ-mix': 'djmixer',\n 'TIPL:mix': 'mixer',\n TMOO: 'mood',\n // additional mappings:\n SYLT: 'lyrics',\n TSST: 'discsubtitle',\n TKEY: 'key',\n COMM: 'comment',\n TOPE: 'originalartist',\n // Windows Media Player\n 'PRIV:AverageLevel': 'averageLevel',\n 'PRIV:PeakLevel': 'peakLevel',\n // Discogs\n 'TXXX:DISCOGS_ARTIST_ID': 'discogs_artist_id',\n 'TXXX:DISCOGS_ARTISTS': 'artists',\n 'TXXX:DISCOGS_ARTIST_NAME': 'artists',\n 'TXXX:DISCOGS_ALBUM_ARTISTS': 'albumartist',\n 'TXXX:DISCOGS_CATALOG': 'catalognumber',\n 'TXXX:DISCOGS_COUNTRY': 'releasecountry',\n 'TXXX:DISCOGS_DATE': 'originaldate',\n 'TXXX:DISCOGS_LABEL': 'label',\n 'TXXX:DISCOGS_LABEL_ID': 'discogs_label_id',\n 'TXXX:DISCOGS_MASTER_RELEASE_ID': 'discogs_master_release_id',\n 'TXXX:DISCOGS_RATING': 'discogs_rating',\n 'TXXX:DISCOGS_RELEASED': 'date',\n 'TXXX:DISCOGS_RELEASE_ID': 'discogs_release_id',\n 'TXXX:DISCOGS_VOTES': 'discogs_votes',\n 'TXXX:CATALOGID': 'catalognumber',\n 'TXXX:STYLE': 'genre',\n 'TXXX:REPLAYGAIN_TRACK_PEAK': 'replaygain_track_peak',\n 'TXXX:REPLAYGAIN_TRACK_GAIN': 'replaygain_track_gain',\n 'TXXX:REPLAYGAIN_ALBUM_PEAK': 'replaygain_album_peak',\n 'TXXX:REPLAYGAIN_ALBUM_GAIN': 'replaygain_album_gain',\n 'TXXX:MP3GAIN_MINMAX': 'replaygain_track_minmax',\n 'TXXX:MP3GAIN_ALBUM_MINMAX': 'replaygain_album_minmax',\n 'TXXX:MP3GAIN_UNDO': 'replaygain_undo',\n MVNM: 'movement',\n MVIN: 'movementIndex',\n PCST: 'podcast',\n TCAT: 'category',\n TDES: 'description',\n TDRL: 'releasedate',\n TGID: 'podcastId',\n TKWD: 'keywords',\n WFED: 'podcasturl',\n GRP1: 'grouping',\n PCNT: 'playCounter',\n};\nexport class ID3v24TagMapper extends CaseInsensitiveTagMap {\n static toRating(popm) {\n return {\n source: popm.email,\n rating: popm.rating > 0 ? (popm.rating - 1) / 254 * CommonTagMapper.maxRatingScore : undefined\n };\n }\n constructor() {\n super(['ID3v2.3', 'ID3v2.4'], id3v24TagMap);\n }\n /**\n * Handle post mapping exceptions / correction\n * @param tag to post map\n * @param warnings Wil be used to register (collect) warnings\n */\n postMap(tag, warnings) {\n switch (tag.id) {\n case 'UFID':\n {\n // decode MusicBrainz Recording Id\n const idTag = tag.value;\n if (idTag.owner_identifier === 'http://musicbrainz.org') {\n tag.id += `:${idTag.owner_identifier}`;\n tag.value = decodeString(idTag.identifier, 'latin1'); // latin1 == iso-8859-1\n }\n }\n break;\n case 'PRIV':\n {\n const customTag = tag.value;\n switch (customTag.owner_identifier) {\n // decode Windows Media Player\n case 'AverageLevel':\n case 'PeakValue':\n tag.id += `:${customTag.owner_identifier}`;\n tag.value = customTag.data.length === 4 ? UINT32_LE.get(customTag.data, 0) : null;\n if (tag.value === null) {\n warnings.addWarning('Failed to parse PRIV:PeakValue');\n }\n break;\n default:\n warnings.addWarning(`Unknown PRIV owner-identifier: ${customTag.data}`);\n }\n }\n break;\n case 'POPM':\n tag.value = ID3v24TagMapper.toRating(tag.value);\n break;\n default:\n break;\n }\n }\n}\n","import { CommonTagMapper } from '../common/GenericTagMapper.js';\n/**\n * ASF Metadata tag mappings.\n * See http://msdn.microsoft.com/en-us/library/ms867702.aspx\n */\nconst asfTagMap = {\n Title: 'title',\n Author: 'artist',\n 'WM/AlbumArtist': 'albumartist',\n 'WM/AlbumTitle': 'album',\n 'WM/Year': 'date', // changed to 'year' to 'date' based on Picard mappings; ToDo: check me\n 'WM/OriginalReleaseTime': 'originaldate',\n 'WM/OriginalReleaseYear': 'originalyear',\n Description: 'comment',\n 'WM/TrackNumber': 'track',\n 'WM/PartOfSet': 'disk',\n 'WM/Genre': 'genre',\n 'WM/Composer': 'composer',\n 'WM/Lyrics': 'lyrics',\n 'WM/AlbumSortOrder': 'albumsort',\n 'WM/TitleSortOrder': 'titlesort',\n 'WM/ArtistSortOrder': 'artistsort',\n 'WM/AlbumArtistSortOrder': 'albumartistsort',\n 'WM/ComposerSortOrder': 'composersort',\n 'WM/Writer': 'lyricist',\n 'WM/Conductor': 'conductor',\n 'WM/ModifiedBy': 'remixer',\n 'WM/Engineer': 'engineer',\n 'WM/Producer': 'producer',\n 'WM/DJMixer': 'djmixer',\n 'WM/Mixer': 'mixer',\n 'WM/Publisher': 'label',\n 'WM/ContentGroupDescription': 'grouping',\n 'WM/SubTitle': 'subtitle',\n 'WM/SetSubTitle': 'discsubtitle',\n // 'WM/PartOfSet': 'totaldiscs',\n 'WM/IsCompilation': 'compilation',\n 'WM/SharedUserRating': 'rating',\n 'WM/BeatsPerMinute': 'bpm',\n 'WM/Mood': 'mood',\n 'WM/Media': 'media',\n 'WM/CatalogNo': 'catalognumber',\n 'MusicBrainz/Album Status': 'releasestatus',\n 'MusicBrainz/Album Type': 'releasetype',\n 'MusicBrainz/Album Release Country': 'releasecountry',\n 'WM/Script': 'script',\n 'WM/Language': 'language',\n Copyright: 'copyright',\n LICENSE: 'license',\n 'WM/EncodedBy': 'encodedby',\n 'WM/EncodingSettings': 'encodersettings',\n 'WM/Barcode': 'barcode',\n 'WM/ISRC': 'isrc',\n 'MusicBrainz/Track Id': 'musicbrainz_recordingid',\n 'MusicBrainz/Release Track Id': 'musicbrainz_trackid',\n 'MusicBrainz/Album Id': 'musicbrainz_albumid',\n 'MusicBrainz/Artist Id': 'musicbrainz_artistid',\n 'MusicBrainz/Album Artist Id': 'musicbrainz_albumartistid',\n 'MusicBrainz/Release Group Id': 'musicbrainz_releasegroupid',\n 'MusicBrainz/Work Id': 'musicbrainz_workid',\n 'MusicBrainz/TRM Id': 'musicbrainz_trmid',\n 'MusicBrainz/Disc Id': 'musicbrainz_discid',\n 'Acoustid/Id': 'acoustid_id',\n 'Acoustid/Fingerprint': 'acoustid_fingerprint',\n 'MusicIP/PUID': 'musicip_puid',\n 'WM/ARTISTS': 'artists',\n 'WM/InitialKey': 'key',\n ASIN: 'asin',\n 'WM/Work': 'work',\n 'WM/AuthorURL': 'website',\n 'WM/Picture': 'picture'\n};\nexport class AsfTagMapper extends CommonTagMapper {\n static toRating(rating) {\n return {\n rating: Number.parseFloat(rating + 1) / 5\n };\n }\n constructor() {\n super(['asf'], asfTagMap);\n }\n postMap(tag) {\n switch (tag.id) {\n case 'WM/SharedUserRating': {\n const keys = tag.id.split(':');\n tag.value = AsfTagMapper.toRating(tag.value);\n tag.id = keys[0];\n break;\n }\n }\n }\n}\n","import { CaseInsensitiveTagMap } from '../common/CaseInsensitiveTagMap.js';\n/**\n * ID3v2.2 tag mappings\n */\nexport const id3v22TagMap = {\n TT2: 'title',\n TP1: 'artist',\n TP2: 'albumartist',\n TAL: 'album',\n TYE: 'year',\n COM: 'comment',\n TRK: 'track',\n TPA: 'disk',\n TCO: 'genre',\n PIC: 'picture',\n TCM: 'composer',\n TOR: 'originaldate',\n TOT: 'originalalbum',\n TXT: 'lyricist',\n TP3: 'conductor',\n TPB: 'label',\n TT1: 'grouping',\n TT3: 'subtitle',\n TLA: 'language',\n TCR: 'copyright',\n WCP: 'license',\n TEN: 'encodedby',\n TSS: 'encodersettings',\n WAR: 'website',\n PCS: 'podcast',\n TCP: \"compilation\",\n TDR: 'date',\n TS2: 'albumartistsort',\n TSA: 'albumsort',\n TSC: 'composersort',\n TSP: 'artistsort',\n TST: 'titlesort',\n WFD: 'podcasturl',\n TBP: 'bpm'\n};\nexport class ID3v22TagMapper extends CaseInsensitiveTagMap {\n constructor() {\n super(['ID3v2.2'], id3v22TagMap);\n }\n}\n","import { CaseInsensitiveTagMap } from '../common/CaseInsensitiveTagMap.js';\n/**\n * ID3v2.2 tag mappings\n */\nconst apev2TagMap = {\n Title: 'title',\n Artist: 'artist',\n Artists: 'artists',\n 'Album Artist': 'albumartist',\n Album: 'album',\n Year: 'date',\n Originalyear: 'originalyear',\n Originaldate: 'originaldate',\n Releasedate: 'releasedate',\n Comment: 'comment',\n Track: 'track',\n Disc: 'disk',\n DISCNUMBER: 'disk', // ToDo: backwards compatibility', valid tag?\n Genre: 'genre',\n 'Cover Art (Front)': 'picture',\n 'Cover Art (Back)': 'picture',\n Composer: 'composer',\n Lyrics: 'lyrics',\n ALBUMSORT: 'albumsort',\n TITLESORT: 'titlesort',\n WORK: 'work',\n ARTISTSORT: 'artistsort',\n ALBUMARTISTSORT: 'albumartistsort',\n COMPOSERSORT: 'composersort',\n Lyricist: 'lyricist',\n Writer: 'writer',\n Conductor: 'conductor',\n // 'Performer=artist (instrument)': 'performer:instrument',\n MixArtist: 'remixer',\n Arranger: 'arranger',\n Engineer: 'engineer',\n Producer: 'producer',\n DJMixer: 'djmixer',\n Mixer: 'mixer',\n Label: 'label',\n Grouping: 'grouping',\n Subtitle: 'subtitle',\n DiscSubtitle: 'discsubtitle',\n Compilation: 'compilation',\n BPM: 'bpm',\n Mood: 'mood',\n Media: 'media',\n CatalogNumber: 'catalognumber',\n MUSICBRAINZ_ALBUMSTATUS: 'releasestatus',\n MUSICBRAINZ_ALBUMTYPE: 'releasetype',\n RELEASECOUNTRY: 'releasecountry',\n Script: 'script',\n Language: 'language',\n Copyright: 'copyright',\n LICENSE: 'license',\n EncodedBy: 'encodedby',\n EncoderSettings: 'encodersettings',\n Barcode: 'barcode',\n ISRC: 'isrc',\n ASIN: 'asin',\n musicbrainz_trackid: 'musicbrainz_recordingid',\n musicbrainz_releasetrackid: 'musicbrainz_trackid',\n MUSICBRAINZ_ALBUMID: 'musicbrainz_albumid',\n MUSICBRAINZ_ARTISTID: 'musicbrainz_artistid',\n MUSICBRAINZ_ALBUMARTISTID: 'musicbrainz_albumartistid',\n MUSICBRAINZ_RELEASEGROUPID: 'musicbrainz_releasegroupid',\n MUSICBRAINZ_WORKID: 'musicbrainz_workid',\n MUSICBRAINZ_TRMID: 'musicbrainz_trmid',\n MUSICBRAINZ_DISCID: 'musicbrainz_discid',\n Acoustid_Id: 'acoustid_id',\n ACOUSTID_FINGERPRINT: 'acoustid_fingerprint',\n MUSICIP_PUID: 'musicip_puid',\n Weblink: 'website',\n REPLAYGAIN_TRACK_GAIN: 'replaygain_track_gain',\n REPLAYGAIN_TRACK_PEAK: 'replaygain_track_peak',\n MP3GAIN_MINMAX: 'replaygain_track_minmax',\n MP3GAIN_UNDO: 'replaygain_undo'\n};\nexport class APEv2TagMapper extends CaseInsensitiveTagMap {\n constructor() {\n super(['APEv2'], apev2TagMap);\n }\n}\n","import { CaseInsensitiveTagMap } from '../common/CaseInsensitiveTagMap.js';\n/**\n * Ref: https://github.com/sergiomb2/libmp4v2/wiki/iTunesMetadata\n */\nconst mp4TagMap = {\n '©nam': 'title',\n '©ART': 'artist',\n aART: 'albumartist',\n /**\n * ToDo: Album artist seems to be stored here while Picard documentation says: aART\n */\n '----:com.apple.iTunes:Band': 'albumartist',\n '©alb': 'album',\n '©day': 'date',\n '©cmt': 'comment',\n '©com': 'comment',\n trkn: 'track',\n disk: 'disk',\n '©gen': 'genre',\n covr: 'picture',\n '©wrt': 'composer',\n '©lyr': 'lyrics',\n soal: 'albumsort',\n sonm: 'titlesort',\n soar: 'artistsort',\n soaa: 'albumartistsort',\n soco: 'composersort',\n '----:com.apple.iTunes:LYRICIST': 'lyricist',\n '----:com.apple.iTunes:CONDUCTOR': 'conductor',\n '----:com.apple.iTunes:REMIXER': 'remixer',\n '----:com.apple.iTunes:ENGINEER': 'engineer',\n '----:com.apple.iTunes:PRODUCER': 'producer',\n '----:com.apple.iTunes:DJMIXER': 'djmixer',\n '----:com.apple.iTunes:MIXER': 'mixer',\n '----:com.apple.iTunes:LABEL': 'label',\n '©grp': 'grouping',\n '----:com.apple.iTunes:SUBTITLE': 'subtitle',\n '----:com.apple.iTunes:DISCSUBTITLE': 'discsubtitle',\n cpil: 'compilation',\n tmpo: 'bpm',\n '----:com.apple.iTunes:MOOD': 'mood',\n '----:com.apple.iTunes:MEDIA': 'media',\n '----:com.apple.iTunes:CATALOGNUMBER': 'catalognumber',\n tvsh: 'tvShow',\n tvsn: 'tvSeason',\n tves: 'tvEpisode',\n sosn: 'tvShowSort',\n tven: 'tvEpisodeId',\n tvnn: 'tvNetwork',\n pcst: 'podcast',\n purl: 'podcasturl',\n '----:com.apple.iTunes:MusicBrainz Album Status': 'releasestatus',\n '----:com.apple.iTunes:MusicBrainz Album Type': 'releasetype',\n '----:com.apple.iTunes:MusicBrainz Album Release Country': 'releasecountry',\n '----:com.apple.iTunes:SCRIPT': 'script',\n '----:com.apple.iTunes:LANGUAGE': 'language',\n cprt: 'copyright',\n '©cpy': 'copyright',\n '----:com.apple.iTunes:LICENSE': 'license',\n '©too': 'encodedby',\n pgap: 'gapless',\n '----:com.apple.iTunes:BARCODE': 'barcode',\n '----:com.apple.iTunes:ISRC': 'isrc',\n '----:com.apple.iTunes:ASIN': 'asin',\n '----:com.apple.iTunes:NOTES': 'comment',\n '----:com.apple.iTunes:MusicBrainz Track Id': 'musicbrainz_recordingid',\n '----:com.apple.iTunes:MusicBrainz Release Track Id': 'musicbrainz_trackid',\n '----:com.apple.iTunes:MusicBrainz Album Id': 'musicbrainz_albumid',\n '----:com.apple.iTunes:MusicBrainz Artist Id': 'musicbrainz_artistid',\n '----:com.apple.iTunes:MusicBrainz Album Artist Id': 'musicbrainz_albumartistid',\n '----:com.apple.iTunes:MusicBrainz Release Group Id': 'musicbrainz_releasegroupid',\n '----:com.apple.iTunes:MusicBrainz Work Id': 'musicbrainz_workid',\n '----:com.apple.iTunes:MusicBrainz TRM Id': 'musicbrainz_trmid',\n '----:com.apple.iTunes:MusicBrainz Disc Id': 'musicbrainz_discid',\n '----:com.apple.iTunes:Acoustid Id': 'acoustid_id',\n '----:com.apple.iTunes:Acoustid Fingerprint': 'acoustid_fingerprint',\n '----:com.apple.iTunes:MusicIP PUID': 'musicip_puid',\n '----:com.apple.iTunes:fingerprint': 'musicip_fingerprint',\n '----:com.apple.iTunes:replaygain_track_gain': 'replaygain_track_gain',\n '----:com.apple.iTunes:replaygain_track_peak': 'replaygain_track_peak',\n '----:com.apple.iTunes:replaygain_album_gain': 'replaygain_album_gain',\n '----:com.apple.iTunes:replaygain_album_peak': 'replaygain_album_peak',\n '----:com.apple.iTunes:replaygain_track_minmax': 'replaygain_track_minmax',\n '----:com.apple.iTunes:replaygain_album_minmax': 'replaygain_album_minmax',\n '----:com.apple.iTunes:replaygain_undo': 'replaygain_undo',\n // Additional mappings:\n gnre: 'genre', // ToDo: check mapping\n '----:com.apple.iTunes:ALBUMARTISTSORT': 'albumartistsort',\n '----:com.apple.iTunes:ARTISTS': 'artists',\n '----:com.apple.iTunes:ORIGINALDATE': 'originaldate',\n '----:com.apple.iTunes:ORIGINALYEAR': 'originalyear',\n '----:com.apple.iTunes:RELEASEDATE': 'releasedate',\n // '----:com.apple.iTunes:PERFORMER': 'performer'\n desc: 'description',\n ldes: 'longDescription',\n '©mvn': 'movement',\n '©mvi': 'movementIndex',\n '©mvc': 'movementTotal',\n '©wrk': 'work',\n catg: 'category',\n egid: 'podcastId',\n hdvd: 'hdVideo',\n keyw: 'keywords',\n shwm: 'showMovement',\n stik: 'stik',\n rate: 'rating'\n};\nexport const tagType = 'iTunes';\nexport class MP4TagMapper extends CaseInsensitiveTagMap {\n constructor() {\n super([tagType], mp4TagMap);\n }\n postMap(tag, _warnings) {\n switch (tag.id) {\n case 'rate':\n tag.value = {\n source: undefined,\n rating: Number.parseFloat(tag.value) / 100\n };\n break;\n }\n }\n}\n","import { CommonTagMapper } from '../../common/GenericTagMapper.js';\n/**\n * Vorbis tag mappings\n *\n * Mapping from native header format to one or possibly more 'common' entries\n * The common entries aim to read the same information from different media files\n * independent of the underlying format\n */\nconst vorbisTagMap = {\n TITLE: 'title',\n ARTIST: 'artist',\n ARTISTS: 'artists',\n ALBUMARTIST: 'albumartist',\n 'ALBUM ARTIST': 'albumartist',\n ALBUM: 'album',\n DATE: 'date',\n ORIGINALDATE: 'originaldate',\n ORIGINALYEAR: 'originalyear',\n RELEASEDATE: 'releasedate',\n COMMENT: 'comment',\n TRACKNUMBER: 'track',\n DISCNUMBER: 'disk',\n GENRE: 'genre',\n METADATA_BLOCK_PICTURE: 'picture',\n COMPOSER: 'composer',\n LYRICS: 'lyrics',\n ALBUMSORT: 'albumsort',\n TITLESORT: 'titlesort',\n WORK: 'work',\n ARTISTSORT: 'artistsort',\n ALBUMARTISTSORT: 'albumartistsort',\n COMPOSERSORT: 'composersort',\n LYRICIST: 'lyricist',\n WRITER: 'writer',\n CONDUCTOR: 'conductor',\n // 'PERFORMER=artist (instrument)': 'performer:instrument', // ToDo\n REMIXER: 'remixer',\n ARRANGER: 'arranger',\n ENGINEER: 'engineer',\n PRODUCER: 'producer',\n DJMIXER: 'djmixer',\n MIXER: 'mixer',\n LABEL: 'label',\n GROUPING: 'grouping',\n SUBTITLE: 'subtitle',\n DISCSUBTITLE: 'discsubtitle',\n TRACKTOTAL: 'totaltracks',\n DISCTOTAL: 'totaldiscs',\n COMPILATION: 'compilation',\n RATING: 'rating',\n BPM: 'bpm',\n KEY: 'key',\n MOOD: 'mood',\n MEDIA: 'media',\n CATALOGNUMBER: 'catalognumber',\n RELEASESTATUS: 'releasestatus',\n RELEASETYPE: 'releasetype',\n RELEASECOUNTRY: 'releasecountry',\n SCRIPT: 'script',\n LANGUAGE: 'language',\n COPYRIGHT: 'copyright',\n LICENSE: 'license',\n ENCODEDBY: 'encodedby',\n ENCODERSETTINGS: 'encodersettings',\n BARCODE: 'barcode',\n ISRC: 'isrc',\n ASIN: 'asin',\n MUSICBRAINZ_TRACKID: 'musicbrainz_recordingid',\n MUSICBRAINZ_RELEASETRACKID: 'musicbrainz_trackid',\n MUSICBRAINZ_ALBUMID: 'musicbrainz_albumid',\n MUSICBRAINZ_ARTISTID: 'musicbrainz_artistid',\n MUSICBRAINZ_ALBUMARTISTID: 'musicbrainz_albumartistid',\n MUSICBRAINZ_RELEASEGROUPID: 'musicbrainz_releasegroupid',\n MUSICBRAINZ_WORKID: 'musicbrainz_workid',\n MUSICBRAINZ_TRMID: 'musicbrainz_trmid',\n MUSICBRAINZ_DISCID: 'musicbrainz_discid',\n ACOUSTID_ID: 'acoustid_id',\n ACOUSTID_ID_FINGERPRINT: 'acoustid_fingerprint',\n MUSICIP_PUID: 'musicip_puid',\n // 'FINGERPRINT=MusicMagic Fingerprint {fingerprint}': 'musicip_fingerprint', // ToDo\n WEBSITE: 'website',\n NOTES: 'notes',\n TOTALTRACKS: 'totaltracks',\n TOTALDISCS: 'totaldiscs',\n // Discogs\n DISCOGS_ARTIST_ID: 'discogs_artist_id',\n DISCOGS_ARTISTS: 'artists',\n DISCOGS_ARTIST_NAME: 'artists',\n DISCOGS_ALBUM_ARTISTS: 'albumartist',\n DISCOGS_CATALOG: 'catalognumber',\n DISCOGS_COUNTRY: 'releasecountry',\n DISCOGS_DATE: 'originaldate',\n DISCOGS_LABEL: 'label',\n DISCOGS_LABEL_ID: 'discogs_label_id',\n DISCOGS_MASTER_RELEASE_ID: 'discogs_master_release_id',\n DISCOGS_RATING: 'discogs_rating',\n DISCOGS_RELEASED: 'date',\n DISCOGS_RELEASE_ID: 'discogs_release_id',\n DISCOGS_VOTES: 'discogs_votes',\n CATALOGID: 'catalognumber',\n STYLE: 'genre',\n //\n REPLAYGAIN_TRACK_GAIN: 'replaygain_track_gain',\n REPLAYGAIN_TRACK_PEAK: 'replaygain_track_peak',\n REPLAYGAIN_ALBUM_GAIN: 'replaygain_album_gain',\n REPLAYGAIN_ALBUM_PEAK: 'replaygain_album_peak',\n // To Sure if these (REPLAYGAIN_MINMAX, REPLAYGAIN_ALBUM_MINMAX & REPLAYGAIN_UNDO) are used for Vorbis:\n REPLAYGAIN_MINMAX: 'replaygain_track_minmax',\n REPLAYGAIN_ALBUM_MINMAX: 'replaygain_album_minmax',\n REPLAYGAIN_UNDO: 'replaygain_undo'\n};\nexport class VorbisTagMapper extends CommonTagMapper {\n static toRating(email, rating, maxScore) {\n return {\n source: email ? email.toLowerCase() : undefined,\n rating: (Number.parseFloat(rating) / maxScore) * CommonTagMapper.maxRatingScore\n };\n }\n constructor() {\n super(['vorbis'], vorbisTagMap);\n }\n postMap(tag) {\n if (tag.id === 'RATING') {\n // The way Winamp 5.666 assigns rating\n tag.value = VorbisTagMapper.toRating(undefined, tag.value, 100);\n }\n else if (tag.id.indexOf('RATING:') === 0) {\n const keys = tag.id.split(':');\n tag.value = VorbisTagMapper.toRating(keys[1], tag.value, 1);\n tag.id = keys[0];\n }\n }\n}\n","import { CommonTagMapper } from '../common/GenericTagMapper.js';\n/**\n * RIFF Info Tags; part of the EXIF 2.3\n * Ref: http://owl.phy.queensu.ca/~phil/exiftool/TagNames/RIFF.html#Info\n */\nexport const riffInfoTagMap = {\n IART: 'artist', // Artist\n ICRD: 'date', // DateCreated\n INAM: 'title', // Title\n TITL: 'title',\n IPRD: 'album', // Product\n ITRK: 'track',\n IPRT: 'track', // Additional tag for track index\n COMM: 'comment', // Comments\n ICMT: 'comment', // Country\n ICNT: 'releasecountry',\n GNRE: 'genre', // Genre\n IWRI: 'writer', // WrittenBy\n RATE: 'rating',\n YEAR: 'year',\n ISFT: 'encodedby', // Software\n CODE: 'encodedby', // EncodedBy\n TURL: 'website', // URL,\n IGNR: 'genre', // Genre\n IENG: 'engineer', // Engineer\n ITCH: 'technician', // Technician\n IMED: 'media', // Original Media\n IRPD: 'album' // Product, where the file was intended for\n};\nexport class RiffInfoTagMapper extends CommonTagMapper {\n constructor() {\n super(['exif'], riffInfoTagMap);\n }\n}\n","import { CaseInsensitiveTagMap } from '../common/CaseInsensitiveTagMap.js';\n/**\n * EBML Tag map\n */\nconst ebmlTagMap = {\n 'segment:title': 'title',\n 'album:ARTIST': 'albumartist',\n 'album:ARTISTSORT': 'albumartistsort',\n 'album:TITLE': 'album',\n 'album:DATE_RECORDED': 'originaldate',\n 'album:DATE_RELEASED': 'releasedate',\n 'album:PART_NUMBER': 'disk',\n 'album:TOTAL_PARTS': 'totaltracks',\n 'track:ARTIST': 'artist',\n 'track:ARTISTSORT': 'artistsort',\n 'track:TITLE': 'title',\n 'track:PART_NUMBER': 'track',\n 'track:MUSICBRAINZ_TRACKID': 'musicbrainz_recordingid',\n 'track:MUSICBRAINZ_ALBUMID': 'musicbrainz_albumid',\n 'track:MUSICBRAINZ_ARTISTID': 'musicbrainz_artistid',\n 'track:PUBLISHER': 'label',\n 'track:GENRE': 'genre',\n 'track:ENCODER': 'encodedby',\n 'track:ENCODER_OPTIONS': 'encodersettings',\n 'edition:TOTAL_PARTS': 'totaldiscs',\n picture: 'picture'\n};\nexport class MatroskaTagMapper extends CaseInsensitiveTagMap {\n constructor() {\n super(['matroska'], ebmlTagMap);\n }\n}\n","import { CommonTagMapper } from '../common/GenericTagMapper.js';\n/**\n * ID3v1 tag mappings\n */\nconst tagMap = {\n NAME: 'title',\n AUTH: 'artist',\n '(c) ': 'copyright',\n ANNO: 'comment'\n};\nexport class AiffTagMapper extends CommonTagMapper {\n constructor() {\n super(['AIFF'], tagMap);\n }\n}\n","import { ID3v1TagMapper } from '../id3v1/ID3v1TagMap.js';\nimport { ID3v24TagMapper } from '../id3v2/ID3v24TagMapper.js';\nimport { AsfTagMapper } from '../asf/AsfTagMapper.js';\nimport { ID3v22TagMapper } from '../id3v2/ID3v22TagMapper.js';\nimport { APEv2TagMapper } from '../apev2/APEv2TagMapper.js';\nimport { MP4TagMapper } from '../mp4/MP4TagMapper.js';\nimport { VorbisTagMapper } from '../ogg/vorbis/VorbisTagMapper.js';\nimport { RiffInfoTagMapper } from '../riff/RiffInfoTagMap.js';\nimport { MatroskaTagMapper } from '../matroska/MatroskaTagMapper.js';\nimport { AiffTagMapper } from '../aiff/AiffTagMap.js';\nimport { InternalParserError } from '../ParseError.js';\nexport class CombinedTagMapper {\n constructor() {\n this.tagMappers = {};\n [\n new ID3v1TagMapper(),\n new ID3v22TagMapper(),\n new ID3v24TagMapper(),\n new MP4TagMapper(),\n new MP4TagMapper(),\n new VorbisTagMapper(),\n new APEv2TagMapper(),\n new AsfTagMapper(),\n new RiffInfoTagMapper(),\n new MatroskaTagMapper(),\n new AiffTagMapper()\n ].forEach(mapper => {\n this.registerTagMapper(mapper);\n });\n }\n /**\n * Convert native to generic (common) tags\n * @param tagType Originating tag format\n * @param tag Native tag to map to a generic tag id\n * @param warnings\n * @return Generic tag result (output of this function)\n */\n mapTag(tagType, tag, warnings) {\n const tagMapper = this.tagMappers[tagType];\n if (tagMapper) {\n return this.tagMappers[tagType].mapGenericTag(tag, warnings);\n }\n throw new InternalParserError(`No generic tag mapper defined for tag-format: ${tagType}`);\n }\n registerTagMapper(genericTagMapper) {\n for (const tagType of genericTagMapper.tagTypes) {\n this.tagMappers[tagType] = genericTagMapper;\n }\n }\n}\n","import { LyricsContentType, TimestampFormat } from '../type.js';\n// Shared timestamp regex for LRC format\nconst TIMESTAMP_REGEX = /\\[(\\d{2}):(\\d{2})\\.(\\d{2,3})]/;\nexport function parseLyrics(input) {\n if (TIMESTAMP_REGEX.test(input)) {\n return parseLrc(input);\n }\n return toUnsyncedLyrics(input);\n}\nexport function toUnsyncedLyrics(lyrics) {\n return {\n contentType: LyricsContentType.lyrics,\n timeStampFormat: TimestampFormat.notSynchronized,\n text: lyrics.trim(),\n syncText: [],\n };\n}\n/**\n * Parse LRC (Lyrics) formatted text\n * Ref: https://en.wikipedia.org/wiki/LRC_(file_format)\n * @param lrcString\n */\nexport function parseLrc(lrcString) {\n const lines = lrcString.split('\\n');\n const syncText = [];\n for (const line of lines) {\n const match = line.match(TIMESTAMP_REGEX);\n if (match) {\n const minutes = Number.parseInt(match[1], 10);\n const seconds = Number.parseInt(match[2], 10);\n const ms = match[3].length === 3\n ? Number.parseInt(match[3], 10)\n : Number.parseInt(match[3], 10) * 10;\n const timestamp = (minutes * 60 + seconds) * 1000 + ms;\n const text = line.replace(TIMESTAMP_REGEX, '').trim();\n syncText.push({ timestamp, text });\n }\n }\n return {\n contentType: LyricsContentType.lyrics,\n timeStampFormat: TimestampFormat.milliseconds,\n text: syncText.map(line => line.text).join('\\n'),\n syncText,\n };\n}\n","export const mpegParserLoader = {\n parserType: 'mpeg',\n extensions: ['.mp2', '.mp3', '.m2a', '.aac', 'aacp'],\n mimeTypes: ['audio/mpeg', 'audio/mp3', 'audio/aacs', 'audio/aacp'],\n async load() {\n return (await import('./MpegParser.js')).MpegParser;\n }\n};\n","export const apeParserLoader = {\n parserType: 'apev2',\n extensions: ['.ape'],\n mimeTypes: ['audio/ape', 'audio/monkeys-audio'],\n async load() {\n return (await import('./APEv2Parser.js')).APEv2Parser;\n }\n};\n","export const asfParserLoader = {\n parserType: 'asf',\n extensions: ['.asf'],\n mimeTypes: ['audio/ms-wma', 'video/ms-wmv', 'audio/ms-asf', 'video/ms-asf', 'application/vnd.ms-asf'],\n async load() {\n return (await import('./AsfParser.js')).AsfParser;\n }\n};\n","export const dsdiffParserLoader = {\n parserType: 'dsdiff',\n extensions: ['.dff'],\n mimeTypes: ['audio/dsf', 'audio/dsd'],\n async load() {\n return (await import('./DsdiffParser.js')).DsdiffParser;\n }\n};\n","export const aiffParserLoader = {\n parserType: 'aiff',\n extensions: ['.aif', 'aiff', 'aifc'],\n mimeTypes: ['audio/aiff', 'audio/aif', 'audio/aifc', 'application/aiff'],\n async load() {\n return (await import('./AiffParser.js')).AIFFParser;\n }\n};\n","export const dsfParserLoader = {\n parserType: 'dsf',\n extensions: ['.dsf'],\n mimeTypes: ['audio/dsf'],\n async load() {\n return (await import('./DsfParser.js')).DsfParser;\n }\n};\n","export const flacParserLoader = {\n parserType: 'flac',\n extensions: ['.flac'],\n mimeTypes: ['audio/flac'],\n async load() {\n return (await import('./FlacParser.js')).FlacParser;\n }\n};\n","export const matroskaParserLoader = {\n parserType: 'matroska',\n extensions: ['.mka', '.mkv', '.mk3d', '.mks', 'webm'],\n mimeTypes: ['audio/matroska', 'video/matroska', 'audio/webm', 'video/webm'],\n async load() {\n return (await import('./MatroskaParser.js')).MatroskaParser;\n }\n};\n","export const mp4ParserLoader = {\n parserType: 'mp4',\n extensions: ['.mp4', '.m4a', '.m4b', '.m4pa', 'm4v', 'm4r', '3gp', '.mov', '.movie', '.qt'],\n mimeTypes: ['audio/mp4', 'audio/m4a', 'video/m4v', 'video/mp4', 'video/quicktime'],\n async load() {\n return (await import('./MP4Parser.js')).MP4Parser;\n }\n};\n","export const musepackParserLoader = {\n parserType: 'musepack',\n extensions: ['.mpc'],\n mimeTypes: ['audio/musepack'],\n async load() {\n return (await import('./MusepackParser.js')).MusepackParser;\n }\n};\n","export const oggParserLoader = {\n parserType: 'ogg',\n extensions: ['.ogg', '.ogv', '.oga', '.ogm', '.ogx', '.opus', '.spx'],\n mimeTypes: ['audio/ogg', 'audio/opus', 'audio/speex', 'video/ogg'], // RFC 7845, RFC 6716, RFC 5574\n async load() {\n return (await import('./OggParser.js')).OggParser;\n }\n};\n","export const wavpackParserLoader = {\n parserType: 'wavpack',\n extensions: ['.wv', '.wvp'],\n mimeTypes: ['audio/wavpack'],\n async load() {\n return (await import('./WavPackParser.js')).WavPackParser;\n }\n};\n","export const riffParserLoader = {\n parserType: 'riff',\n extensions: ['.wav', 'wave', '.bwf'],\n mimeTypes: ['audio/vnd.wave', 'audio/wav', 'audio/wave'],\n async load() {\n return (await import('./WaveParser.js')).WaveParser;\n }\n};\n","import { textDecode } from '@borewit/text-codec';\nexport const endTag2 = 'LYRICS200';\nexport async function getLyricsHeaderLength(tokenizer) {\n const fileSize = tokenizer.fileInfo.size;\n if (fileSize >= 143) {\n const buf = new Uint8Array(15);\n const position = tokenizer.position;\n await tokenizer.readBuffer(buf, { position: fileSize - 143 });\n tokenizer.setPosition(position); // Restore position\n const txt = textDecode(buf, 'latin1');\n const tag = txt.substring(6);\n if (tag === endTag2) {\n return Number.parseInt(txt.substring(0, 6), 10) + 15;\n }\n }\n return 0;\n}\n","/**\n * Primary entry point, Node.js specific entry point is MusepackParser.ts\n */\nimport { fromWebStream, fromBuffer, fromBlob } from 'strtok3';\nimport { ParserFactory } from './ParserFactory.js';\nimport { APEv2Parser } from './apev2/APEv2Parser.js';\nimport { hasID3v1Header } from './id3v1/ID3v1Parser.js';\nimport { getLyricsHeaderLength } from './lyrics3/Lyrics3.js';\nexport { LyricsContentType, TimestampFormat } from './type.js';\nexport { CouldNotDetermineFileTypeError, UnsupportedFileTypeError } from './ParseError.js';\nexport * from './ParseError.js';\n/**\n * Parse Web API File\n * Requires Blob to be able to stream using a ReadableStreamBYOBReader, only available since Node.js ≥ 20\n * @param blob - Blob to parse\n * @param options - Parsing options\n * @returns Metadata\n */\nexport async function parseBlob(blob, options = {}) {\n const tokenizer = fromBlob(blob);\n try {\n return await parseFromTokenizer(tokenizer, options);\n }\n finally {\n await tokenizer.close();\n }\n}\n/**\n * Parse audio from Web Stream.Readable\n * @param webStream - WebStream to read the audio track from\n * @param options - Parsing options\n * @param fileInfo - File information object or MIME-type string\n * @returns Metadata\n */\nexport async function parseWebStream(webStream, fileInfo, options = {}) {\n const tokenizer = fromWebStream(webStream, { fileInfo: typeof fileInfo === 'string' ? { mimeType: fileInfo } : fileInfo });\n try {\n return await parseFromTokenizer(tokenizer, options);\n }\n finally {\n await tokenizer.close();\n }\n}\n/**\n * Parse audio from memory\n * @param uint8Array - Uint8Array holding audio data\n * @param fileInfo - File information object or MIME-type string\n * @param options - Parsing options\n * @returns Metadata\n * Ref: https://github.com/Borewit/strtok3/blob/e6938c81ff685074d5eb3064a11c0b03ca934c1d/src/index.ts#L15\n */\nexport async function parseBuffer(uint8Array, fileInfo, options = {}) {\n const tokenizer = fromBuffer(uint8Array, { fileInfo: typeof fileInfo === 'string' ? { mimeType: fileInfo } : fileInfo });\n return parseFromTokenizer(tokenizer, options);\n}\n/**\n * Parse audio from ITokenizer source\n * @param tokenizer - Audio source implementing the tokenizer interface\n * @param options - Parsing options\n * @returns Metadata\n */\nexport function parseFromTokenizer(tokenizer, options) {\n const parserFactory = new ParserFactory();\n return parserFactory.parse(tokenizer, undefined, options);\n}\n/**\n * Create a dictionary ordered by their tag id (key)\n * @param nativeTags list of tags\n * @returns tags indexed by id\n */\nexport function orderTags(nativeTags) {\n const tags = {};\n for (const { id, value } of nativeTags) {\n (tags[id] || (tags[id] = [])).push(value);\n }\n return tags;\n}\n/**\n * Convert rating to 1-5 star rating\n * @param rating Normalized rating [0..1] (common.rating[n].rating)\n * @returns Number of stars: 1, 2, 3, 4 or 5 stars\n */\nexport function ratingToStars(rating) {\n return rating === undefined ? 0 : 1 + Math.round(rating * 4);\n}\n/**\n * Select most likely cover image.\n * @param pictures Usually metadata.common.picture\n * @return Cover image, if any, otherwise null\n */\nexport function selectCover(pictures) {\n return pictures ? pictures.reduce((acc, cur) => {\n if (cur.name && cur.name.toLowerCase() in ['front', 'cover', 'cover (front)'])\n return cur;\n return acc;\n }) : null;\n}\nexport async function scanAppendingHeaders(tokenizer, options = {}) {\n let apeOffset = tokenizer.fileInfo.size;\n if (await hasID3v1Header(tokenizer)) {\n apeOffset -= 128;\n const lyricsLen = await getLyricsHeaderLength(tokenizer);\n apeOffset -= lyricsLen;\n }\n options.apeHeader = await APEv2Parser.findApeFooterOffset(tokenizer, apeOffset);\n}\n/**\n * Implementation only available when loaded as Node.js\n * This method will throw an Error, always.\n */\nexport async function parseFile(_filePath, _options = {}) {\n throw new Error('This function require a Node engine. To load Web API File objects use parseBlob instead.');\n}\n/**\n * Implementation only available when loaded as Node.js\n * This method will throw an Error, always.\n */\nexport async function parseStream(_stream, _fileInfo, _options = {}) {\n throw new Error('This function require a Node engine.');\n}\n/**\n * Return a list of supported mime-types\n */\nexport function getSupportedMimeTypes() {\n return new ParserFactory().getSupportedMimeTypes();\n}\n","import { parseBlob, parseFromTokenizer, parseWebStream } from \"music-metadata\";\nimport * as URI from \"uri-js\";\nimport { HttpClient } from \"@tokenizer/http\";\nimport { tokenizer as rangeTokenizer } from \"@tokenizer/range\";\n\nimport { removeUndefinedValuesFromRecord } from \"@common/utils.js\";\n\n/**\n * @import { TrackStats, TrackTags } from \"@definitions/types.d.ts\";\n * @import { Extraction, Urls } from \"./types.d.ts\";\n */\n\n// 🛠️\n\n/**\n * @param {{ includeArtwork?: boolean; mimeType?: string; stream?: ReadableStream; urls?: Urls; }} _\n * @returns {Promise<Extraction>}\n */\nexport async function musicMetadataTags({\n includeArtwork,\n mimeType,\n stream,\n urls,\n}) {\n const uri = urls ? URI.parse(urls.get) : undefined;\n const pathParts = uri?.path?.split(\"/\");\n const filename = pathParts?.[pathParts.length - 1];\n\n let meta;\n\n if (urls?.get.startsWith(\"blob:\")) {\n const blob = await fetch(urls.get).then((r) => r.blob());\n meta = await parseBlob(blob, { skipCovers: !includeArtwork });\n } else if (urls) {\n const httpClient = new HttpClient(urls.head, {\n resolveUrl: false,\n });\n httpClient.resolvedUrl = urls.get;\n const getHeadInfo = httpClient.getHeadInfo;\n\n // FUCKAROUND: Not sure of the downsides of this\n httpClient.getHeadInfo = async () => {\n const info = await getHeadInfo.call(httpClient);\n return { ...info, acceptPartialRequests: true };\n };\n\n /** @type {any} */\n const tokenizer = await rangeTokenizer(httpClient);\n meta = await parseFromTokenizer(tokenizer, { skipCovers: !includeArtwork });\n } else if (stream) {\n meta = await parseWebStream(stream, { mimeType }, {\n skipCovers: !includeArtwork,\n });\n } else {\n throw new Error(\"Missing args, need either some urls or a stream.\");\n }\n\n /** @type {TrackStats} */\n const statsFull = {\n albumGain: meta.format.albumGain,\n bitrate: meta.format.bitrate,\n bitsPerSample: meta.format.bitsPerSample,\n codec: meta.format.codec,\n container: meta.format.container,\n duration: meta.format.duration,\n lossless: meta.format.lossless,\n numberOfChannels: meta.format.numberOfChannels,\n sampleRate: meta.format.sampleRate,\n trackGain: meta.format.trackGain,\n };\n\n /** @type {TrackTags} */\n const tagsFull = {\n album: meta.common.album,\n albumartist: meta.common.albumartist,\n albumartists: Array.isArray(meta.common.albumartist)\n ? meta.common.albumartist\n : (meta.common.albumartist ? [meta.common.albumartist] : undefined),\n albumartistsort: meta.common.albumartistsort,\n albumsort: meta.common.albumsort,\n arranger: meta.common.arranger,\n artist: meta.common.artist,\n artists: meta.common.artists ??\n (meta.common.artist ? [meta.common.artist] : []),\n artistsort: meta.common.artistsort,\n asin: meta.common.asin,\n averageLevel: meta.common.averageLevel,\n barcode: meta.common.barcode,\n bpm: meta.common.bpm,\n catalognumbers: meta.common.catalognumber,\n compilation: meta.common.compilation,\n composers: meta.common.composer,\n composersort: meta.common.composersort,\n conductors: meta.common.conductor,\n date: meta.common.date,\n disc: {\n no: meta.common.disk.no || 1,\n ...(meta.common.disk.of && { of: meta.common.disk.of }),\n },\n djmixers: meta.common.djmixer,\n engineers: meta.common.engineer,\n gapless: meta.common.gapless,\n genres: Array.isArray(meta.common.genre)\n ? meta.common.genre\n : meta.common.genre\n ? [meta.common.genre]\n : undefined,\n isrc: meta.common.isrc,\n labels: meta.common.label,\n lyricists: meta.common.lyricist,\n media: meta.common.media,\n mixers: meta.common.mixer,\n moods: Array.isArray(meta.common.mood)\n ? meta.common.mood\n : meta.common.mood\n ? [meta.common.mood]\n : undefined,\n originaldate: meta.common.originaldate,\n originalyear: meta.common.originalyear,\n peakLevel: meta.common.peakLevel,\n producers: meta.common.producer,\n publishers: meta.common.publisher,\n releasecountry: meta.common.releasecountry,\n releasedate: meta.common.releasedate,\n releasestatus: meta.common.releasestatus,\n releasetypes: meta.common.releasetype,\n remixers: meta.common.remixer,\n technicians: meta.common.technician,\n title: meta.common.title || filename || urls?.head || \"Unknown\",\n titlesort: meta.common.titlesort,\n track: {\n no: meta.common.track.no || 1,\n ...(meta.common.track.of && { of: meta.common.track.of }),\n },\n work: meta.common.work,\n writers: meta.common.writer,\n year: meta.common.year,\n };\n\n const stats = removeUndefinedValuesFromRecord(statsFull);\n const tags = removeUndefinedValuesFromRecord(tagsFull);\n\n return {\n artwork: includeArtwork ? meta.common.picture : undefined,\n stats,\n tags,\n };\n}\n","import initDebug from 'debug';\nimport { ResponseInfo } from './response-info.js'; // Add 'fetch' API for node.js\nconst debug = initDebug('streaming-http-token-reader:http-client');\nconst DEFAULT_CONFIG = {\n resolveUrl: false\n};\n/**\n * Simple HTTP-client, which works both in node.js and browser\n */\nexport class HttpClient {\n constructor(url, config) {\n this.url = url;\n this.abortController = new AbortController();\n this.config = DEFAULT_CONFIG;\n Object.assign(this.config, config);\n }\n async getHeadInfo() {\n const response = new ResponseInfo(await fetch(this.url, { method: 'HEAD', signal: this.abortController.signal }));\n if (this.config.resolveUrl)\n this.resolvedUrl = response.response.url;\n return response.toRangeRequestResponse();\n }\n async getResponse(method, range) {\n const headers = new Headers();\n if (range) {\n debug(`_getResponse ${method} ${range[0]}..${range[1]}`);\n headers.set('Range', `bytes=${range[0]}-${range[1]}`);\n }\n else {\n debug(`_getResponse ${method} (range not provided)`);\n }\n const response = new ResponseInfo(await fetch(this.resolvedUrl || this.url, { method, headers, signal: this.abortController.signal }));\n if (response.response.ok) {\n if (this.config.resolveUrl)\n this.resolvedUrl = response.response.url;\n return response.toRangeRequestResponse();\n }\n throw new Error(`Unexpected HTTP response status=${response.response.status}`);\n }\n abort() {\n debug('abort');\n this.abortController.abort();\n }\n}\n//# sourceMappingURL=http-client.js.map","export const defaultMessages = 'End-Of-Stream';\n/**\n * Thrown on read operation of the end of file or stream has been reached\n */\nexport class EndOfStreamError extends Error {\n constructor() {\n super(defaultMessages);\n }\n}\n","import { EndOfStreamError } from 'peek-readable';\n/**\n * Core tokenizer\n */\nexport class AbstractTokenizer {\n /**\n * Constructor\n * @param options Tokenizer options\n * @protected\n */\n constructor(options) {\n this.numBuffer = new Uint8Array(8);\n /**\n * Tokenizer-stream position\n */\n this.position = 0;\n this.onClose = options?.onClose;\n if (options?.abortSignal) {\n options.abortSignal.addEventListener('abort', () => {\n this.abort();\n });\n }\n }\n /**\n * Read a token from the tokenizer-stream\n * @param token - The token to read\n * @param position - If provided, the desired position in the tokenizer-stream\n * @returns Promise with token data\n */\n async readToken(token, position = this.position) {\n const uint8Array = new Uint8Array(token.len);\n const len = await this.readBuffer(uint8Array, { position });\n if (len < token.len)\n throw new EndOfStreamError();\n return token.get(uint8Array, 0);\n }\n /**\n * Peek a token from the tokenizer-stream.\n * @param token - Token to peek from the tokenizer-stream.\n * @param position - Offset where to begin reading within the file. If position is null, data will be read from the current file position.\n * @returns Promise with token data\n */\n async peekToken(token, position = this.position) {\n const uint8Array = new Uint8Array(token.len);\n const len = await this.peekBuffer(uint8Array, { position });\n if (len < token.len)\n throw new EndOfStreamError();\n return token.get(uint8Array, 0);\n }\n /**\n * Read a numeric token from the stream\n * @param token - Numeric token\n * @returns Promise with number\n */\n async readNumber(token) {\n const len = await this.readBuffer(this.numBuffer, { length: token.len });\n if (len < token.len)\n throw new EndOfStreamError();\n return token.get(this.numBuffer, 0);\n }\n /**\n * Read a numeric token from the stream\n * @param token - Numeric token\n * @returns Promise with number\n */\n async peekNumber(token) {\n const len = await this.peekBuffer(this.numBuffer, { length: token.len });\n if (len < token.len)\n throw new EndOfStreamError();\n return token.get(this.numBuffer, 0);\n }\n /**\n * Ignore number of bytes, advances the pointer in under tokenizer-stream.\n * @param length - Number of bytes to ignore\n * @return resolves the number of bytes ignored, equals length if this available, otherwise the number of bytes available\n */\n async ignore(length) {\n if (this.fileInfo.size !== undefined) {\n const bytesLeft = this.fileInfo.size - this.position;\n if (length > bytesLeft) {\n this.position += bytesLeft;\n return bytesLeft;\n }\n }\n this.position += length;\n return length;\n }\n async close() {\n await this.abort();\n await this.onClose?.();\n }\n normalizeOptions(uint8Array, options) {\n if (options && options.position !== undefined && options.position < this.position) {\n throw new Error('`options.position` must be equal or greater than `tokenizer.position`');\n }\n if (options) {\n return {\n mayBeLess: options.mayBeLess === true,\n offset: options.offset ? options.offset : 0,\n length: options.length ? options.length : (uint8Array.length - (options.offset ? options.offset : 0)),\n position: options.position ? options.position : this.position\n };\n }\n return {\n mayBeLess: false,\n offset: 0,\n length: uint8Array.length,\n position: this.position\n };\n }\n abort() {\n return Promise.resolve(); // Ignore abort signal\n }\n}\n","import { AbstractTokenizer } from './AbstractTokenizer.js';\nimport { EndOfStreamError } from 'peek-readable';\nimport { open as fsOpen } from 'node:fs/promises';\nexport class FileTokenizer extends AbstractTokenizer {\n /**\n * Create tokenizer from provided file path\n * @param sourceFilePath File path\n */\n static async fromFile(sourceFilePath) {\n const fileHandle = await fsOpen(sourceFilePath, 'r');\n const stat = await fileHandle.stat();\n return new FileTokenizer(fileHandle, { fileInfo: { path: sourceFilePath, size: stat.size } });\n }\n constructor(fileHandle, options) {\n super(options);\n this.fileHandle = fileHandle;\n this.fileInfo = options.fileInfo;\n }\n /**\n * Read buffer from file\n * @param uint8Array - Uint8Array to write result to\n * @param options - Read behaviour options\n * @returns Promise number of bytes read\n */\n async readBuffer(uint8Array, options) {\n const normOptions = this.normalizeOptions(uint8Array, options);\n this.position = normOptions.position;\n if (normOptions.length === 0)\n return 0;\n const res = await this.fileHandle.read(uint8Array, normOptions.offset, normOptions.length, normOptions.position);\n this.position += res.bytesRead;\n if (res.bytesRead < normOptions.length && (!options || !options.mayBeLess)) {\n throw new EndOfStreamError();\n }\n return res.bytesRead;\n }\n /**\n * Peek buffer from file\n * @param uint8Array - Uint8Array (or Buffer) to write data to\n * @param options - Read behaviour options\n * @returns Promise number of bytes read\n */\n async peekBuffer(uint8Array, options) {\n const normOptions = this.normalizeOptions(uint8Array, options);\n const res = await this.fileHandle.read(uint8Array, normOptions.offset, normOptions.length, normOptions.position);\n if ((!normOptions.mayBeLess) && res.bytesRead < normOptions.length) {\n throw new EndOfStreamError();\n }\n return res.bytesRead;\n }\n async close() {\n await this.fileHandle.close();\n return super.close();\n }\n setPosition(position) {\n this.position = position;\n }\n supportsRandomAccess() {\n return true;\n }\n}\n","import { stat as fsStat } from 'node:fs/promises';\nimport { fromStream as coreFromStream } from './core.js';\nimport { FileTokenizer } from \"./FileTokenizer.js\";\nexport { FileTokenizer } from './FileTokenizer.js';\nexport * from './core.js';\n/**\n * Construct ReadStreamTokenizer from given Stream.\n * Will set fileSize, if provided given Stream has set the .path property.\n * @param stream - Node.js Stream.Readable\n * @param options - Pass additional file information to the tokenizer\n * @returns Tokenizer\n */\nexport async function fromStream(stream, options) {\n const rst = coreFromStream(stream, options);\n if (stream.path) {\n const stat = await fsStat(stream.path);\n rst.fileInfo.path = stream.path;\n rst.fileInfo.size = stat.size;\n }\n return rst;\n}\nexport const fromFile = FileTokenizer.fromFile;\n","import { AbstractTokenizer } from 'strtok3';\nimport { ChunkedFileData } from './chunked-file-data.js';\nimport initDebug from 'debug';\nconst debug = initDebug('range-request-reader');\n/**\n * RangeRequestTokenizer is tokenizer which is an adapter for range-request clients.\n * Typically, HTTP clients implementing the HTTP Range Requests (https://tools.ietf.org/html/rfc7233)\n *\n * Inspired by \"XHR Reader\" written by António Afonso\n * https://github.com/aadsm/jsmediatags/blob/master/src/XhrFileReader.js\n */\nexport class RangeRequestTokenizer extends AbstractTokenizer {\n constructor(rangeRequestClient, options) {\n super({ fileInfo: options.fileInfo });\n this.rangeRequestClient = rangeRequestClient;\n this.options = options;\n this.fileInfo = options.fileInfo;\n if (Number.isNaN(options.minimumChunkSize)) {\n throw new Error('minimumChunkSize must be a number');\n }\n this._fileData = new ChunkedFileData();\n this.options.abortSignal?.addEventListener('abort', () => {\n this.abort();\n });\n }\n setPosition(position) {\n this.position = position;\n }\n /**\n * Read portion from stream\n * @param uint8array - Target `Uint8Array`\n * @param options - Additional read options\n * @returns Promise with number of bytes read\n */\n async readBuffer(uint8array, options) {\n if (options?.position) {\n this.position = options.position;\n }\n const length = await this.peekBuffer(uint8array, options);\n this.position += length;\n return length;\n }\n /**\n * Peek (read ahead) buffer from tokenizer\n * @param uint8array - Target `Uint8Array` to fill with data peek from the tokenizer-stream\n * @param options - Additional read options\n * @returns Promise with number of bytes read\n */\n async peekBuffer(uint8array, options) {\n let length = uint8array.length;\n let offset = 0;\n let position = this.position;\n if (options) {\n if (options.position) {\n position = options.position;\n }\n if (Number.isInteger(options.offset)) {\n offset = options.offset;\n }\n if (options.length) {\n length = options.length;\n }\n else {\n length -= offset;\n }\n }\n if (length === 0) {\n return 0;\n }\n debug(`peekBuffer position=${position} length=${length}`);\n if (!this.fileInfo)\n throw new Error('File-info missing');\n const lastPos = Math.min(this.fileInfo.size - 1, position + length - 1);\n return this.loadRange([position, lastPos]).then(() => {\n this._fileData.readToBuffer(uint8array, offset, position, Math.min(this.fileInfo.size, length));\n return length;\n });\n }\n /**\n * Ignore number of bytes, advances the pointer in under tokenizer-stream.\n * @param length - Number of bytes to skip (ignore)\n * @return actual number of bytes ignored\n */\n async ignore(length) {\n const bytesLeft = this.fileInfo.size - this.position;\n if (length <= bytesLeft) {\n this.position += length;\n return length;\n }\n this.position += bytesLeft;\n return bytesLeft;\n }\n async abort() {\n this.rangeRequestClient.abort();\n }\n supportsRandomAccess() {\n return true;\n }\n async loadRange(range) {\n if (range[0] > (this.fileInfo.size - 1)) {\n throw new Error('End-Of-File');\n }\n debug(`request range ${range[0]}..${range[1]}`);\n debug(`adjusted range ${range[0]}..${range[1]}`);\n if (this._fileData.hasDataRange(range[0], range[1])) {\n debug('Read from cache');\n return;\n }\n // Always download in multiples of CHUNK_SIZE. If we're going to make a\n // request might as well get a chunk that makes sense. The big cost is\n // establishing the connection so getting 10bytes or 1K doesn't really\n // make a difference.\n range = roundRange(range, this.options.minimumChunkSize);\n // Upper range should not be greater than max file size\n range[1] = Math.min(this.fileInfo.size - 1, range[1]);\n debug(`blocked range: ${range[0]}..${range[1]}`);\n return this.rangeRequestClient.getResponse('GET', range).then(response => {\n return response.arrayBuffer().then(data => {\n this._fileData.addData(range[0], data);\n });\n });\n }\n}\nexport function roundRange(range, minimumChunkSize) {\n const length = range[1] - range[0] + 1;\n // const newLength = Math.ceil(length / minimum_chunk_size) * minimum_chunk_size;\n const newLength = Math.max(minimumChunkSize, length);\n return [range[0], range[0] + newLength - 1];\n}\n/**\n * Convert HTTP range header value to IContentRangeType\n * @param contentRange - content range\n */\nexport function parseContentRange(contentRange) {\n if (!contentRange) {\n throw new Error('Content range must be provided');\n }\n debug(`parseContentRange response: contentRange=${contentRange}`);\n const parsedContentRange = contentRange.match(/bytes (\\d+)-(\\d+)\\/(?:(\\d+)|\\*)/i);\n if (!parsedContentRange) {\n throw new Error(`FIXME: Unknown Content-Range syntax: ${contentRange}`);\n }\n return {\n firstBytePosition: Number.parseInt(parsedContentRange[1], 10),\n lastBytePosition: Number.parseInt(parsedContentRange[2], 10),\n instanceLength: parsedContentRange[3] ? Number.parseInt(parsedContentRange[3], 10) : undefined\n };\n}\n//# sourceMappingURL=range-request-tokenizer.js.map","import { RangeRequestTokenizer, roundRange } from './range-request-tokenizer.js';\nimport initDebug from 'debug';\nconst debug = initDebug('range-request-reader');\nexport class RangeRequestFactory {\n constructor(rangeRequestClient) {\n this.rangeRequestClient = rangeRequestClient;\n this.config = {\n avoidHeadRequests: false,\n initialChunkSize: 4 * 1024,\n minimumChunkSize: 1024\n };\n }\n async initTokenizer(config) {\n if (config) {\n this.config = { ...this.config, ...config };\n }\n const headRequestInfo = await this.getHeadRequestInfo();\n if (!headRequestInfo.acceptPartialRequests) {\n throw new Error('Server does not accept partial requests');\n }\n return new RangeRequestTokenizer(this.rangeRequestClient, {\n fileInfo: headRequestInfo,\n minimumChunkSize: this.config.minimumChunkSize,\n abortSignal: config?.abortSignal\n });\n }\n /**\n * Get file information, an HTTP-client may implement this doing a HEAD request\n * @return Promise with head-request-info, extending tokenizer file-info.\n */\n getHeadRequestInfo() {\n return this.config.avoidHeadRequests ?\n this.fetchFileInfoWithGetRequest() :\n this.fetchFileInfoWithHeadRequest();\n }\n async fetchFileInfoWithHeadRequest() {\n debug('_fetchSizeWithHeadRequest()');\n if (this.rangeRequestClient.getHeadInfo) {\n const info = await this.rangeRequestClient.getHeadInfo();\n if (info.size) {\n debug(`MIME-type=${info.mimeType}, content-length=${info.size}, accept-partial-requests=${info.acceptPartialRequests}`);\n return info;\n }\n }\n // Content-Length not provided by the server, fallback to\n // GET requests.\n debug('Content-Length not provided by the server, fallback to GET requests');\n return this.fetchFileInfoWithGetRequest();\n }\n async fetchFileInfoWithGetRequest() {\n const range = roundRange([0, this.config.initialChunkSize], this.config.minimumChunkSize);\n const response = await this.rangeRequestClient.getResponse('GET', range);\n debug(`_fetchSizeWithGetRequest response: contentRange=[${response.contentRange?.firstBytePosition}-${response.contentRange?.lastBytePosition}/${response.contentRange?.instanceLength}]`);\n if (!response.contentRange) {\n throw new Error('Failed to resolve content range (file size)');\n }\n return response;\n }\n}\n//# sourceMappingURL=range-request-factory.js.map","import { parseContentRange as rangeParseContentRange } from '@tokenizer/range';\nexport class ResponseInfo {\n constructor(response) {\n this.response = response;\n }\n getContentLength() {\n const contentLength = this.response.headers.get('Content-Length');\n return contentLength ? Number.parseInt(contentLength, 10) : undefined;\n }\n getAcceptRangesHeaderValue() {\n return this.response.headers.get('Accept-Ranges');\n }\n getContentType() {\n return this.response.headers.get('Content-Type');\n }\n acceptRanges() {\n const value = this.getAcceptRangesHeaderValue();\n return value !== null && value.trim().toLowerCase() === 'bytes';\n }\n getContentRange() {\n const contentRange = this.response.headers.get('Content-Range');\n if (!contentRange) {\n return;\n }\n return rangeParseContentRange(contentRange);\n }\n toRangeRequestResponse() {\n const contentRange = this.getContentRange();\n const size = contentRange ? contentRange.instanceLength : this.getContentLength();\n if (typeof size !== 'number') {\n throw new Error('Could not determine file-size from HTTP response');\n }\n return {\n url: this.response.url,\n size,\n mimeType: this.getContentType() ?? undefined,\n acceptPartialRequests: this.acceptRanges(),\n contentRange,\n arrayBuffer: () => this.response.arrayBuffer().then(res => new Uint8Array(res))\n };\n }\n}\n//# sourceMappingURL=response-info.js.map","const NOT_FOUND = -1;\n/**\n * Keeps track of data chunks (partial downloaded file fragments).\n *\n * Based on \"ChunkedFileData\" written by António Afonso\n * https://github.com/aadsm/jsmediatags/blob/master/src/ChunkedFileData.js\n */\nexport class ChunkedFileData {\n constructor() {\n this._fileData = [];\n }\n /**\n * Adds data to the file storage at a specific offset.\n */\n addData(offset, data) {\n const offsetEnd = offset + data.byteLength - 1;\n const chunkRange = this._getChunkRange(offset, offsetEnd);\n if (chunkRange.startIx === NOT_FOUND) {\n this._fileData.splice(chunkRange.insertIx || 0, 0, {\n offset,\n data\n });\n }\n else {\n // If the data to add collides with existing chunks we prepend and\n // append data from the half colliding chunks to make the collision at\n // 100%. The new data can then replace all the colliding chunkes.\n const firstChunk = this._fileData[chunkRange.startIx];\n const lastChunk = this._fileData[chunkRange.endIx];\n const needsPrepend = offset > firstChunk.offset;\n const needsAppend = offsetEnd < lastChunk.offset + lastChunk.data.byteLength - 1;\n const chunk = {\n offset: Math.min(offset, firstChunk.offset),\n data\n };\n if (needsPrepend) {\n const slicedData = firstChunk.data.slice(0, offset - firstChunk.offset);\n chunk.data = this._concatData(slicedData, data);\n }\n if (needsAppend) {\n // Use the lastChunk because the slice logic is easier to handle.\n const slicedData = chunk.data.slice(0, lastChunk.offset - chunk.offset);\n chunk.data = this._concatData(slicedData, lastChunk.data);\n }\n this._fileData.splice(chunkRange.startIx, chunkRange.endIx - chunkRange.startIx + 1, chunk);\n }\n }\n hasDataRange(offsetStart, offsetEnd) {\n for (let i = 0; i < this._fileData.length; i++) {\n const chunk = this._fileData[i];\n if (offsetEnd < chunk.offset) {\n return false;\n }\n if (offsetStart >= chunk.offset && offsetEnd < chunk.offset + chunk.data.byteLength) {\n return true;\n }\n }\n return false;\n }\n readToBuffer(buffer, offset, position, length) {\n const _pos_offset = position;\n let dataChunk;\n for (let i = 0; i < this._fileData.length; i++) {\n const dataChunkStart = this._fileData[i].offset;\n const dataChunkEnd = dataChunkStart + this._fileData[i].data.byteLength;\n if (_pos_offset >= dataChunkStart && _pos_offset < dataChunkEnd) {\n dataChunk = this._fileData[i];\n const chunkOffset = _pos_offset - dataChunkStart;\n let chunkLength = Math.min(length, dataChunk.data.byteLength - chunkOffset);\n buffer.set(dataChunk.data.subarray(chunkOffset, chunkOffset + chunkLength), offset);\n if (chunkLength < length) {\n chunkLength += this.readToBuffer(buffer, offset + chunkLength, position + chunkLength, length - chunkLength);\n }\n return chunkLength;\n }\n }\n return 0;\n }\n _concatData(buffer1, buffer2) {\n const tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);\n tmp.set(new Uint8Array(buffer1), 0);\n tmp.set(new Uint8Array(buffer2), buffer1.byteLength);\n return tmp;\n }\n /**\n * Finds the chunk range that overlaps the [offsetStart-1,offsetEnd+1] range.\n * When a chunk is adjacent to the offset we still consider it part of the\n * range (this is the situation of offsetStart-1 or offsetEnd+1).\n * When no chunks are found `insertIx` denotes the index where the data\n * should be inserted in the data list (startIx == NOT_FOUND and endIX ==\n * NOT_FOUND).\n */\n _getChunkRange(offsetStart, offsetEnd) {\n let startChunkIx = NOT_FOUND;\n let endChunkIx = NOT_FOUND;\n let insertIx = 0;\n // Could use binary search but not expecting that many blocks to exist.\n for (let i = 0; i < this._fileData.length; i++, insertIx = i) {\n const chunkOffsetStart = this._fileData[i].offset;\n const chunkOffsetEnd = chunkOffsetStart + this._fileData[i].data.byteLength;\n if (offsetEnd < chunkOffsetStart - 1) {\n // This offset range doesn't overlap with any chunks.\n break;\n }\n // If it is adjacent we still consider it part of the range because\n // we're going end up with a single block with all contiguous data.\n if (offsetStart <= chunkOffsetEnd + 1 &&\n offsetEnd >= chunkOffsetStart - 1) {\n startChunkIx = i;\n break;\n }\n }\n // No starting chunk was found, meaning that the offset is either before\n // or after the current stored chunks.\n if (startChunkIx === NOT_FOUND) {\n return {\n startIx: NOT_FOUND,\n endIx: NOT_FOUND,\n insertIx\n };\n }\n // Find the ending chunk.\n for (let i = startChunkIx; i < this._fileData.length; i++) {\n const chunkOffsetStart = this._fileData[i].offset;\n const chunkOffsetEnd = chunkOffsetStart + this._fileData[i].data.byteLength;\n if (offsetEnd >= chunkOffsetStart - 1) {\n // Candidate for the end chunk, it doesn't mean it is yet.\n endChunkIx = i;\n }\n if (offsetEnd <= chunkOffsetEnd + 1) {\n break;\n }\n }\n if (endChunkIx === NOT_FOUND) {\n endChunkIx = startChunkIx;\n }\n return {\n startIx: startChunkIx,\n endIx: endChunkIx\n };\n }\n}\n//# sourceMappingURL=chunked-file-data.js.map","import { AbstractTokenizer } from 'strtok3';\nimport { ChunkedFileData } from './chunked-file-data.js';\nimport initDebug from 'debug';\nconst debug = initDebug('range-request-reader');\n/**\n * RangeRequestTokenizer is tokenizer which is an adapter for range-request clients.\n * Typically, HTTP clients implementing the HTTP Range Requests (https://tools.ietf.org/html/rfc7233)\n *\n * Inspired by \"XHR Reader\" written by António Afonso\n * https://github.com/aadsm/jsmediatags/blob/master/src/XhrFileReader.js\n */\nexport class RangeRequestTokenizer extends AbstractTokenizer {\n constructor(rangeRequestClient, options) {\n super({ fileInfo: options.fileInfo });\n this.rangeRequestClient = rangeRequestClient;\n this.options = options;\n this.fileInfo = options.fileInfo;\n if (Number.isNaN(options.minimumChunkSize)) {\n throw new Error('minimumChunkSize must be a number');\n }\n this._fileData = new ChunkedFileData();\n this.options.abortSignal?.addEventListener('abort', () => {\n this.abort();\n });\n }\n setPosition(position) {\n this.position = position;\n }\n /**\n * Read portion from stream\n * @param uint8array - Target `Uint8Array`\n * @param options - Additional read options\n * @returns Promise with number of bytes read\n */\n async readBuffer(uint8array, options) {\n if (options?.position) {\n this.position = options.position;\n }\n const length = await this.peekBuffer(uint8array, options);\n this.position += length;\n return length;\n }\n /**\n * Peek (read ahead) buffer from tokenizer\n * @param uint8array - Target `Uint8Array` to fill with data peek from the tokenizer-stream\n * @param options - Additional read options\n * @returns Promise with number of bytes read\n */\n async peekBuffer(uint8array, options) {\n let length = uint8array.length;\n const offset = 0;\n let position = this.position;\n if (options) {\n if (options.position) {\n position = options.position;\n }\n if (options.length) {\n length = options.length;\n }\n else {\n length -= offset;\n }\n }\n if (length === 0) {\n return 0;\n }\n debug(`peekBuffer position=${position} length=${length}`);\n if (!this.fileInfo)\n throw new Error('File-info missing');\n const lastPos = Math.min(this.fileInfo.size - 1, position + length - 1);\n await this.loadRange([position, lastPos]);\n this._fileData.readToBuffer(uint8array, offset, position, Math.min(this.fileInfo.size, length));\n return length;\n }\n /**\n * Ignore number of bytes, advances the pointer in under tokenizer-stream.\n * @param length - Number of bytes to skip (ignore)\n * @return actual number of bytes ignored\n */\n async ignore(length) {\n const bytesLeft = this.fileInfo.size - this.position;\n if (length <= bytesLeft) {\n this.position += length;\n return length;\n }\n this.position += bytesLeft;\n return bytesLeft;\n }\n async abort() {\n this.rangeRequestClient.abort();\n }\n supportsRandomAccess() {\n return true;\n }\n async loadRange(range) {\n if (range[0] > (this.fileInfo.size - 1)) {\n throw new Error('End-Of-File');\n }\n debug(`request range ${range[0]}..${range[1]}`);\n debug(`adjusted range ${range[0]}..${range[1]}`);\n if (this._fileData.hasDataRange(range[0], range[1])) {\n debug('Read from cache');\n return;\n }\n // Always download in multiples of CHUNK_SIZE. If we're going to make a\n // request might as well get a chunk that makes sense. The big cost is\n // establishing the connection so getting 10bytes or 1K doesn't really\n // make a difference.\n range = roundRange(range, this.options.minimumChunkSize);\n // Upper range should not be greater than max file size\n range[1] = Math.min(this.fileInfo.size - 1, range[1]);\n debug(`blocked range: ${range[0]}..${range[1]}`);\n return this.rangeRequestClient.getResponse('GET', range).then(response => {\n return response.arrayBuffer().then(data => {\n this._fileData.addData(range[0], data);\n });\n });\n }\n}\nexport function roundRange(range, minimumChunkSize) {\n const length = range[1] - range[0] + 1;\n // const newLength = Math.ceil(length / minimum_chunk_size) * minimum_chunk_size;\n const newLength = Math.max(minimumChunkSize, length);\n return [range[0], range[0] + newLength - 1];\n}\n/**\n * Convert HTTP range header value to IContentRangeType\n * @param contentRange - content range\n */\nexport function parseContentRange(contentRange) {\n if (!contentRange) {\n throw new Error('Content range must be provided');\n }\n debug(`parseContentRange response: contentRange=${contentRange}`);\n const parsedContentRange = contentRange.match(/bytes (\\d+)-(\\d+)\\/(?:(\\d+)|\\*)/i);\n if (!parsedContentRange) {\n throw new Error(`FIXME: Unknown Content-Range syntax: ${contentRange}`);\n }\n return {\n firstBytePosition: Number.parseInt(parsedContentRange[1], 10),\n lastBytePosition: Number.parseInt(parsedContentRange[2], 10),\n instanceLength: parsedContentRange[3] ? Number.parseInt(parsedContentRange[3], 10) : undefined\n };\n}\n//# sourceMappingURL=range-request-tokenizer.js.map","import { RangeRequestTokenizer, roundRange } from './range-request-tokenizer.js';\nimport initDebug from 'debug';\nconst debug = initDebug('range-request-reader');\nexport class RangeRequestFactory {\n constructor(rangeRequestClient) {\n this.rangeRequestClient = rangeRequestClient;\n this.config = {\n avoidHeadRequests: false,\n initialChunkSize: 4 * 1024,\n minimumChunkSize: 1024\n };\n }\n async initTokenizer(config) {\n if (config) {\n this.config = { ...this.config, ...config };\n }\n const headRequestInfo = await this.getHeadRequestInfo();\n if (!headRequestInfo.acceptPartialRequests) {\n throw new Error('Server does not accept partial requests');\n }\n return new RangeRequestTokenizer(this.rangeRequestClient, {\n fileInfo: headRequestInfo,\n minimumChunkSize: this.config.minimumChunkSize,\n abortSignal: config?.abortSignal\n });\n }\n /**\n * Get file information, an HTTP-client may implement this doing a HEAD request\n * @return Promise with head-request-info, extending tokenizer file-info.\n */\n getHeadRequestInfo() {\n return this.config.avoidHeadRequests ?\n this.fetchFileInfoWithGetRequest() :\n this.fetchFileInfoWithHeadRequest();\n }\n async fetchFileInfoWithHeadRequest() {\n debug('_fetchSizeWithHeadRequest()');\n if (this.rangeRequestClient.getHeadInfo) {\n const info = await this.rangeRequestClient.getHeadInfo();\n if (info.size) {\n debug(`MIME-type=${info.mimeType}, content-length=${info.size}, accept-partial-requests=${info.acceptPartialRequests}`);\n return info;\n }\n }\n // Content-Length not provided by the server, fallback to\n // GET requests.\n debug('Content-Length not provided by the server, fallback to GET requests');\n return this.fetchFileInfoWithGetRequest();\n }\n async fetchFileInfoWithGetRequest() {\n const range = roundRange([0, this.config.initialChunkSize], this.config.minimumChunkSize);\n const response = await this.rangeRequestClient.getResponse('GET', range);\n debug(`_fetchSizeWithGetRequest response: contentRange=[${response.contentRange?.firstBytePosition}-${response.contentRange?.lastBytePosition}/${response.contentRange?.instanceLength}]`);\n if (!response.contentRange) {\n throw new Error('Failed to resolve content range (file size)');\n }\n return response;\n }\n}\n//# sourceMappingURL=range-request-factory.js.map","import { RangeRequestFactory } from './range-request-factory.js';\nexport { parseContentRange } from './range-request-tokenizer.js';\n/**\n * Construct range-tokenizer from range-request-client and config\n * @param rangeRequestClient - HTTP range request client\n * @param abortController - AbortController\n * @param config - Configuration\n * @return Tokenizer\n */\nexport function tokenizer(rangeRequestClient, config) {\n const factory = new RangeRequestFactory(rangeRequestClient);\n return factory.initTokenizer(config);\n}\n//# sourceMappingURL=index.js.map"],"mappings":"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OAAO,SAAS,CAAC,KAAM,IAAO,OAAO,SAAS,CAAC,KAAM,KAAQ,OAAO,MAAM,KAAM,IAApI;AAAA,EACL,KAAK;AACN;;;AC3DO,IAAM,aAAa;AAAA,EACzB;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,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,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,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,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,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,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,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,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,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,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,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;AACD;AAEO,IAAM,YAAY;AAAA,EACxB;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,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,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;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,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,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,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,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;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,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,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA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","names":["parse","ContentType","parse","import_debug","initDebug","tokenizer","tokenizer","tokenizer","import_debug","import_debug","tagMap","tagMap","tagType","debug","initDebug","tagType","debug","initDebug","ContentType","mimeTypeParse","tokenizer","tokenizer","tokenizer","tokenizer","tokenizer","debug","initDebug","import_debug","EndOfStreamError","AbstractTokenizer","EndOfStreamError","AbstractTokenizer","EndOfStreamError","fromFile","import_debug","debug","initDebug","debug","import_debug","debug","initDebug","debug","initDebug","ChunkedFileData","import_debug","debug","initDebug","RangeRequestTokenizer","ChunkedFileData","roundRange","import_debug","debug","initDebug","RangeRequestFactory","RangeRequestTokenizer","roundRange","tokenizer","RangeRequestFactory","tokenizer"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-6WU6XF6M.js.map"}
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-7IARE43G.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-7IARE43G.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-7IARE43G.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-7IARE43G.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-7IE47WTB.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-7IE47WTB.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-7IE47WTB.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-7IE47WTB.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-7J35BYGY.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-7J35BYGY.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-7J35BYGY.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-7J35BYGY.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-7OCWG5AW.js
··· 1 + ../bafybeih2s36bol7uisrik77ciyli5rhge2bikg7ezv7g43reykdd4jkaiq/chunk-7OCWG5AW.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-7OCWG5AW.js.map
··· 1 + ../bafybeih2s36bol7uisrik77ciyli5rhge2bikg7ezv7g43reykdd4jkaiq/chunk-7OCWG5AW.js.map
+460
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-A4RQ3WIY.js
··· 1 + import { 2 + AbstractID3Parser 3 + } from "./chunk-WBWWX4CZ.js"; 4 + import { 5 + AttachedPictureType 6 + } from "./chunk-SGG7NSCF.js"; 7 + import { 8 + FourCcToken 9 + } from "./chunk-CSVVW572.js"; 10 + import { 11 + getBit, 12 + getBitAllignedNumber 13 + } from "./chunk-6AX6SYMQ.js"; 14 + import { 15 + StringType, 16 + UINT16_BE, 17 + UINT24_BE, 18 + UINT32_BE, 19 + UINT32_LE, 20 + UINT8, 21 + Uint8ArrayType, 22 + makeUnexpectedFileContentError, 23 + require_src, 24 + textDecode 25 + } from "./chunk-ETGVMC2T.js"; 26 + import { 27 + __name, 28 + __toESM 29 + } from "./chunk-7IARE43G.js"; 30 + 31 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/flac/FlacParser.js 32 + var import_debug2 = __toESM(require_src()); 33 + 34 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/vorbis/Vorbis.js 35 + var VorbisPictureToken = class _VorbisPictureToken { 36 + static { 37 + __name(this, "VorbisPictureToken"); 38 + } 39 + static fromBase64(base64str) { 40 + return _VorbisPictureToken.fromBuffer(Uint8Array.from(atob(base64str), (c) => c.charCodeAt(0))); 41 + } 42 + static fromBuffer(buffer) { 43 + const pic = new _VorbisPictureToken(buffer.length); 44 + return pic.get(buffer, 0); 45 + } 46 + constructor(len) { 47 + this.len = len; 48 + } 49 + get(buffer, offset) { 50 + const type = AttachedPictureType[UINT32_BE.get(buffer, offset)]; 51 + offset += 4; 52 + const mimeLen = UINT32_BE.get(buffer, offset); 53 + offset += 4; 54 + const format = new StringType(mimeLen, "utf-8").get(buffer, offset); 55 + offset += mimeLen; 56 + const descLen = UINT32_BE.get(buffer, offset); 57 + offset += 4; 58 + const description = new StringType(descLen, "utf-8").get(buffer, offset); 59 + offset += descLen; 60 + const width = UINT32_BE.get(buffer, offset); 61 + offset += 4; 62 + const height = UINT32_BE.get(buffer, offset); 63 + offset += 4; 64 + const colour_depth = UINT32_BE.get(buffer, offset); 65 + offset += 4; 66 + const indexed_color = UINT32_BE.get(buffer, offset); 67 + offset += 4; 68 + const picDataLen = UINT32_BE.get(buffer, offset); 69 + offset += 4; 70 + const data = buffer.slice(offset, offset + picDataLen); 71 + return { 72 + type, 73 + format, 74 + description, 75 + width, 76 + height, 77 + colour_depth, 78 + indexed_color, 79 + data 80 + }; 81 + } 82 + }; 83 + var CommonHeader = { 84 + len: 7, 85 + get: /* @__PURE__ */ __name((buf, off) => { 86 + return { 87 + packetType: UINT8.get(buf, off), 88 + vorbis: new StringType(6, "ascii").get(buf, off + 1) 89 + }; 90 + }, "get") 91 + }; 92 + var IdentificationHeader = { 93 + len: 23, 94 + get: /* @__PURE__ */ __name((uint8Array, off) => { 95 + return { 96 + version: UINT32_LE.get(uint8Array, off + 0), 97 + channelMode: UINT8.get(uint8Array, off + 4), 98 + sampleRate: UINT32_LE.get(uint8Array, off + 5), 99 + bitrateMax: UINT32_LE.get(uint8Array, off + 9), 100 + bitrateNominal: UINT32_LE.get(uint8Array, off + 13), 101 + bitrateMin: UINT32_LE.get(uint8Array, off + 17) 102 + }; 103 + }, "get") 104 + }; 105 + 106 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/vorbis/VorbisStream.js 107 + var import_debug = __toESM(require_src()); 108 + 109 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/vorbis/VorbisDecoder.js 110 + var VorbisDecoder = class { 111 + static { 112 + __name(this, "VorbisDecoder"); 113 + } 114 + constructor(data, offset) { 115 + this.data = data; 116 + this.offset = offset; 117 + } 118 + readInt32() { 119 + const value = UINT32_LE.get(this.data, this.offset); 120 + this.offset += 4; 121 + return value; 122 + } 123 + readStringUtf8() { 124 + const len = this.readInt32(); 125 + const value = textDecode(this.data.subarray(this.offset, this.offset + len), "utf-8"); 126 + this.offset += len; 127 + return value; 128 + } 129 + parseUserComment() { 130 + const offset0 = this.offset; 131 + const v = this.readStringUtf8(); 132 + const idx = v.indexOf("="); 133 + return { 134 + key: v.substring(0, idx).toUpperCase(), 135 + value: v.substring(idx + 1), 136 + len: this.offset - offset0 137 + }; 138 + } 139 + }; 140 + 141 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/vorbis/VorbisStream.js 142 + var debug = (0, import_debug.default)("music-metadata:parser:ogg:vorbis1"); 143 + var VorbisContentError = class extends makeUnexpectedFileContentError("Vorbis") { 144 + static { 145 + __name(this, "VorbisContentError"); 146 + } 147 + }; 148 + var VorbisStream = class _VorbisStream { 149 + static { 150 + __name(this, "VorbisStream"); 151 + } 152 + constructor(metadata, options) { 153 + this.pageSegments = []; 154 + this.durationOnLastPage = true; 155 + this.metadata = metadata; 156 + this.options = options; 157 + } 158 + /** 159 + * Vorbis 1 parser 160 + * @param header Ogg Page Header 161 + * @param pageData Page data 162 + */ 163 + async parsePage(header, pageData) { 164 + this.lastPageHeader = header; 165 + if (header.headerType.firstPage) { 166 + this.parseFirstPage(header, pageData); 167 + } else { 168 + if (header.headerType.continued) { 169 + if (this.pageSegments.length === 0) { 170 + throw new VorbisContentError("Cannot continue on previous page"); 171 + } 172 + this.pageSegments.push(pageData); 173 + } 174 + if (header.headerType.lastPage || !header.headerType.continued) { 175 + if (this.pageSegments.length > 0) { 176 + const fullPage = _VorbisStream.mergeUint8Arrays(this.pageSegments); 177 + await this.parseFullPage(fullPage); 178 + } 179 + this.pageSegments = header.headerType.lastPage ? [] : [pageData]; 180 + } 181 + } 182 + } 183 + static mergeUint8Arrays(arrays) { 184 + const totalSize = arrays.reduce((acc, e) => acc + e.length, 0); 185 + const merged = new Uint8Array(totalSize); 186 + arrays.forEach((array, i, _arrays) => { 187 + const offset = _arrays.slice(0, i).reduce((acc, e) => acc + e.length, 0); 188 + merged.set(array, offset); 189 + }); 190 + return merged; 191 + } 192 + async flush() { 193 + await this.parseFullPage(_VorbisStream.mergeUint8Arrays(this.pageSegments)); 194 + } 195 + async parseUserComment(pageData, offset) { 196 + const decoder = new VorbisDecoder(pageData, offset); 197 + const tag = decoder.parseUserComment(); 198 + await this.addTag(tag.key, tag.value); 199 + return tag.len; 200 + } 201 + async addTag(id, value) { 202 + if (id === "METADATA_BLOCK_PICTURE" && typeof value === "string") { 203 + if (this.options.skipCovers) { 204 + debug("Ignore picture"); 205 + return; 206 + } 207 + value = VorbisPictureToken.fromBase64(value); 208 + debug(`Push picture: id=${id}, format=${value.format}`); 209 + } else { 210 + debug(`Push tag: id=${id}, value=${value}`); 211 + } 212 + await this.metadata.addTag("vorbis", id, value); 213 + } 214 + calculateDuration(_enfOfStream) { 215 + if (this.lastPageHeader && this.metadata.format.sampleRate && this.lastPageHeader.absoluteGranulePosition >= 0) { 216 + this.metadata.setFormat("numberOfSamples", this.lastPageHeader.absoluteGranulePosition); 217 + this.metadata.setFormat("duration", this.lastPageHeader.absoluteGranulePosition / this.metadata.format.sampleRate); 218 + } 219 + } 220 + /** 221 + * Parse first Ogg/Vorbis page 222 + * @param _header 223 + * @param pageData 224 + */ 225 + parseFirstPage(_header, pageData) { 226 + this.metadata.setFormat("codec", "Vorbis I"); 227 + this.metadata.setFormat("hasAudio", true); 228 + debug("Parse first page"); 229 + const commonHeader = CommonHeader.get(pageData, 0); 230 + if (commonHeader.vorbis !== "vorbis") 231 + throw new VorbisContentError("Metadata does not look like Vorbis"); 232 + if (commonHeader.packetType === 1) { 233 + const idHeader = IdentificationHeader.get(pageData, CommonHeader.len); 234 + this.metadata.setFormat("sampleRate", idHeader.sampleRate); 235 + this.metadata.setFormat("bitrate", idHeader.bitrateNominal); 236 + this.metadata.setFormat("numberOfChannels", idHeader.channelMode); 237 + debug("sample-rate=%s[hz], bitrate=%s[b/s], channel-mode=%s", idHeader.sampleRate, idHeader.bitrateNominal, idHeader.channelMode); 238 + } else 239 + throw new VorbisContentError("First Ogg page should be type 1: the identification header"); 240 + } 241 + async parseFullPage(pageData) { 242 + const commonHeader = CommonHeader.get(pageData, 0); 243 + debug("Parse full page: type=%s, byteLength=%s", commonHeader.packetType, pageData.byteLength); 244 + switch (commonHeader.packetType) { 245 + case 3: 246 + return this.parseUserCommentList(pageData, CommonHeader.len); 247 + case 1: 248 + // type 1: the identification header 249 + case 5: 250 + break; 251 + } 252 + } 253 + /** 254 + * Ref: https://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-840005.2 255 + */ 256 + async parseUserCommentList(pageData, offset) { 257 + const strLen = UINT32_LE.get(pageData, offset); 258 + offset += 4; 259 + offset += strLen; 260 + let userCommentListLength = UINT32_LE.get(pageData, offset); 261 + offset += 4; 262 + while (userCommentListLength-- > 0) { 263 + offset += await this.parseUserComment(pageData, offset); 264 + } 265 + } 266 + }; 267 + 268 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/flac/FlacToken.js 269 + var BlockType = { 270 + STREAMINFO: 0, 271 + // STREAMINFO 272 + PADDING: 1, 273 + // PADDING 274 + APPLICATION: 2, 275 + // APPLICATION 276 + SEEKTABLE: 3, 277 + // SEEKTABLE 278 + VORBIS_COMMENT: 4, 279 + // VORBIS_COMMENT 280 + CUESHEET: 5, 281 + // CUESHEET 282 + PICTURE: 6 283 + // PICTURE 284 + }; 285 + var BlockHeader = { 286 + len: 4, 287 + get: /* @__PURE__ */ __name((buf, off) => { 288 + return { 289 + lastBlock: getBit(buf, off, 7), 290 + type: getBitAllignedNumber(buf, off, 1, 7), 291 + length: UINT24_BE.get(buf, off + 1) 292 + }; 293 + }, "get") 294 + }; 295 + var BlockStreamInfo = { 296 + len: 34, 297 + get: /* @__PURE__ */ __name((buf, off) => { 298 + return { 299 + // The minimum block size (in samples) used in the stream. 300 + minimumBlockSize: UINT16_BE.get(buf, off), 301 + // The maximum block size (in samples) used in the stream. 302 + // (Minimum blocksize == maximum blocksize) implies a fixed-blocksize stream. 303 + maximumBlockSize: UINT16_BE.get(buf, off + 2) / 1e3, 304 + // The minimum frame size (in bytes) used in the stream. 305 + // May be 0 to imply the value is not known. 306 + minimumFrameSize: UINT24_BE.get(buf, off + 4), 307 + // The maximum frame size (in bytes) used in the stream. 308 + // May be 0 to imply the value is not known. 309 + maximumFrameSize: UINT24_BE.get(buf, off + 7), 310 + // Sample rate in Hz. Though 20 bits are available, 311 + // the maximum sample rate is limited by the structure of frame headers to 655350Hz. 312 + // Also, a value of 0 is invalid. 313 + sampleRate: UINT24_BE.get(buf, off + 10) >> 4, 314 + // probably slower: sampleRate: common.getBitAllignedNumber(buf, off + 10, 0, 20), 315 + // (number of channels)-1. FLAC supports from 1 to 8 channels 316 + channels: getBitAllignedNumber(buf, off + 12, 4, 3) + 1, 317 + // bits per sample)-1. 318 + // FLAC supports from 4 to 32 bits per sample. Currently the reference encoder and decoders only support up to 24 bits per sample. 319 + bitsPerSample: getBitAllignedNumber(buf, off + 12, 7, 5) + 1, 320 + // Total samples in stream. 321 + // 'Samples' means inter-channel sample, i.e. one second of 44.1Khz audio will have 44100 samples regardless of the number of channels. 322 + // A value of zero here means the number of total samples is unknown. 323 + totalSamples: getBitAllignedNumber(buf, off + 13, 4, 36), 324 + // the MD5 hash of the file (see notes for usage... it's a littly tricky) 325 + fileMD5: new Uint8ArrayType(16).get(buf, off + 18) 326 + }; 327 + }, "get") 328 + }; 329 + 330 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/flac/FlacParser.js 331 + var debug2 = (0, import_debug2.default)("music-metadata:parser:FLAC"); 332 + var FlacContentError = class extends makeUnexpectedFileContentError("FLAC") { 333 + static { 334 + __name(this, "FlacContentError"); 335 + } 336 + }; 337 + var FlacParser = class extends AbstractID3Parser { 338 + static { 339 + __name(this, "FlacParser"); 340 + } 341 + constructor() { 342 + super(...arguments); 343 + this.vorbisParser = new VorbisStream(this.metadata, this.options); 344 + } 345 + async postId3v2Parse() { 346 + const fourCC = await this.tokenizer.readToken(FourCcToken); 347 + if (fourCC.toString() !== "fLaC") { 348 + throw new FlacContentError("Invalid FLAC preamble"); 349 + } 350 + let blockHeader; 351 + do { 352 + blockHeader = await this.tokenizer.readToken(BlockHeader); 353 + await this.parseDataBlock(blockHeader); 354 + } while (!blockHeader.lastBlock); 355 + if (this.tokenizer.fileInfo.size && this.metadata.format.duration) { 356 + const dataSize = this.tokenizer.fileInfo.size - this.tokenizer.position; 357 + this.metadata.setFormat("bitrate", 8 * dataSize / this.metadata.format.duration); 358 + } 359 + } 360 + async parseDataBlock(blockHeader) { 361 + debug2(`blockHeader type=${blockHeader.type}, length=${blockHeader.length}`); 362 + switch (blockHeader.type) { 363 + case BlockType.STREAMINFO: 364 + return this.readBlockStreamInfo(blockHeader.length); 365 + case BlockType.PADDING: 366 + break; 367 + case BlockType.APPLICATION: 368 + break; 369 + case BlockType.SEEKTABLE: 370 + break; 371 + case BlockType.VORBIS_COMMENT: 372 + return this.readComment(blockHeader.length); 373 + case BlockType.CUESHEET: 374 + break; 375 + case BlockType.PICTURE: 376 + await this.parsePicture(blockHeader.length); 377 + return; 378 + default: 379 + this.metadata.addWarning(`Unknown block type: ${blockHeader.type}`); 380 + } 381 + return this.tokenizer.ignore(blockHeader.length).then(); 382 + } 383 + /** 384 + * Parse STREAMINFO 385 + */ 386 + async readBlockStreamInfo(dataLen) { 387 + if (dataLen !== BlockStreamInfo.len) 388 + throw new FlacContentError("Unexpected block-stream-info length"); 389 + const streamInfo = await this.tokenizer.readToken(BlockStreamInfo); 390 + this.metadata.setFormat("container", "FLAC"); 391 + this.processsStreamInfo(streamInfo); 392 + } 393 + /** 394 + * Parse STREAMINFO 395 + */ 396 + processsStreamInfo(streamInfo) { 397 + this.metadata.setFormat("codec", "FLAC"); 398 + this.metadata.setFormat("hasAudio", true); 399 + this.metadata.setFormat("lossless", true); 400 + this.metadata.setFormat("numberOfChannels", streamInfo.channels); 401 + this.metadata.setFormat("bitsPerSample", streamInfo.bitsPerSample); 402 + this.metadata.setFormat("sampleRate", streamInfo.sampleRate); 403 + if (streamInfo.totalSamples > 0) { 404 + this.metadata.setFormat("duration", streamInfo.totalSamples / streamInfo.sampleRate); 405 + } 406 + } 407 + /** 408 + * Read VORBIS_COMMENT from tokenizer 409 + * Ref: https://www.xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-640004.2.3 410 + */ 411 + async readComment(dataLen) { 412 + const data = await this.tokenizer.readToken(new Uint8ArrayType(dataLen)); 413 + return this.parseComment(data); 414 + } 415 + /** 416 + * Parse VORBIS_COMMENT 417 + * Ref: https://www.xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-640004.2.3 418 + */ 419 + async parseComment(data) { 420 + const decoder = new VorbisDecoder(data, 0); 421 + const vendor = decoder.readStringUtf8(); 422 + if (vendor.length > 0) { 423 + this.metadata.setFormat("tool", vendor); 424 + } 425 + const commentListLength = decoder.readInt32(); 426 + const tags = new Array(commentListLength); 427 + for (let i = 0; i < commentListLength; i++) { 428 + tags[i] = decoder.parseUserComment(); 429 + } 430 + await Promise.all(tags.map((tag) => { 431 + if (tag.key === "ENCODER") { 432 + this.metadata.setFormat("tool", tag.value); 433 + } 434 + return this.addTag(tag.key, tag.value); 435 + })); 436 + } 437 + async parsePicture(dataLen) { 438 + if (this.options.skipCovers) { 439 + return this.tokenizer.ignore(dataLen); 440 + } 441 + return this.addPictureTag(await this.tokenizer.readToken(new VorbisPictureToken(dataLen))); 442 + } 443 + addPictureTag(picture) { 444 + return this.addTag("METADATA_BLOCK_PICTURE", picture); 445 + } 446 + addTag(id, value) { 447 + return this.vorbisParser.addTag(id, value); 448 + } 449 + }; 450 + 451 + export { 452 + VorbisPictureToken, 453 + VorbisStream, 454 + BlockType, 455 + BlockHeader, 456 + BlockStreamInfo, 457 + FlacParser 458 + }; 459 + 460 + //# sourceMappingURL=./chunk-A4RQ3WIY.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-A4RQ3WIY.js.map
··· 1 + {"version":3,"sources":["/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/flac/FlacParser.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/vorbis/Vorbis.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/vorbis/VorbisStream.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/ogg/vorbis/VorbisDecoder.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/flac/FlacToken.js"],"sourcesContent":["import initDebug from 'debug';\nimport { Uint8ArrayType } from 'token-types';\nimport { VorbisPictureToken } from '../ogg/vorbis/Vorbis.js';\nimport { AbstractID3Parser } from '../id3v2/AbstractID3Parser.js';\nimport { FourCcToken } from '../common/FourCC.js';\nimport { VorbisStream } from '../ogg/vorbis/VorbisStream.js';\nimport { VorbisDecoder } from '../ogg/vorbis/VorbisDecoder.js';\nimport { makeUnexpectedFileContentError } from '../ParseError.js';\nimport * as Flac from './FlacToken.js';\nconst debug = initDebug('music-metadata:parser:FLAC');\nclass FlacContentError extends makeUnexpectedFileContentError('FLAC') {\n}\nexport class FlacParser extends AbstractID3Parser {\n constructor() {\n super(...arguments);\n this.vorbisParser = new VorbisStream(this.metadata, this.options);\n }\n async postId3v2Parse() {\n const fourCC = await this.tokenizer.readToken(FourCcToken);\n if (fourCC.toString() !== 'fLaC') {\n throw new FlacContentError('Invalid FLAC preamble');\n }\n let blockHeader;\n do {\n // Read block header\n blockHeader = await this.tokenizer.readToken(Flac.BlockHeader);\n // Parse block data\n await this.parseDataBlock(blockHeader);\n } while (!blockHeader.lastBlock);\n if (this.tokenizer.fileInfo.size && this.metadata.format.duration) {\n const dataSize = this.tokenizer.fileInfo.size - this.tokenizer.position;\n this.metadata.setFormat('bitrate', 8 * dataSize / this.metadata.format.duration);\n }\n }\n async parseDataBlock(blockHeader) {\n debug(`blockHeader type=${blockHeader.type}, length=${blockHeader.length}`);\n switch (blockHeader.type) {\n case Flac.BlockType.STREAMINFO:\n return this.readBlockStreamInfo(blockHeader.length);\n case Flac.BlockType.PADDING:\n break;\n case Flac.BlockType.APPLICATION:\n break;\n case Flac.BlockType.SEEKTABLE:\n break;\n case Flac.BlockType.VORBIS_COMMENT:\n return this.readComment(blockHeader.length);\n case Flac.BlockType.CUESHEET:\n break;\n case Flac.BlockType.PICTURE:\n await this.parsePicture(blockHeader.length);\n return;\n default:\n this.metadata.addWarning(`Unknown block type: ${blockHeader.type}`);\n }\n // Ignore data block\n return this.tokenizer.ignore(blockHeader.length).then();\n }\n /**\n * Parse STREAMINFO\n */\n async readBlockStreamInfo(dataLen) {\n if (dataLen !== Flac.BlockStreamInfo.len)\n throw new FlacContentError('Unexpected block-stream-info length');\n const streamInfo = await this.tokenizer.readToken(Flac.BlockStreamInfo);\n this.metadata.setFormat('container', 'FLAC');\n this.processsStreamInfo(streamInfo);\n }\n /**\n * Parse STREAMINFO\n */\n processsStreamInfo(streamInfo) {\n this.metadata.setFormat('codec', 'FLAC');\n this.metadata.setFormat('hasAudio', true);\n this.metadata.setFormat('lossless', true);\n this.metadata.setFormat('numberOfChannels', streamInfo.channels);\n this.metadata.setFormat('bitsPerSample', streamInfo.bitsPerSample);\n this.metadata.setFormat('sampleRate', streamInfo.sampleRate);\n if (streamInfo.totalSamples > 0) {\n this.metadata.setFormat('duration', streamInfo.totalSamples / streamInfo.sampleRate);\n }\n }\n /**\n * Read VORBIS_COMMENT from tokenizer\n * Ref: https://www.xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-640004.2.3\n */\n async readComment(dataLen) {\n const data = await this.tokenizer.readToken(new Uint8ArrayType(dataLen));\n return this.parseComment(data);\n }\n /**\n * Parse VORBIS_COMMENT\n * Ref: https://www.xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-640004.2.3\n */\n async parseComment(data) {\n const decoder = new VorbisDecoder(data, 0);\n const vendor = decoder.readStringUtf8();\n if (vendor.length > 0) {\n this.metadata.setFormat('tool', vendor);\n }\n const commentListLength = decoder.readInt32();\n const tags = new Array(commentListLength);\n for (let i = 0; i < commentListLength; i++) {\n tags[i] = decoder.parseUserComment();\n }\n await Promise.all(tags.map(tag => {\n if (tag.key === 'ENCODER') {\n this.metadata.setFormat('tool', tag.value);\n }\n return this.addTag(tag.key, tag.value);\n }));\n }\n async parsePicture(dataLen) {\n if (this.options.skipCovers) {\n return this.tokenizer.ignore(dataLen);\n }\n return this.addPictureTag(await this.tokenizer.readToken(new VorbisPictureToken(dataLen)));\n }\n addPictureTag(picture) {\n return this.addTag('METADATA_BLOCK_PICTURE', picture);\n }\n addTag(id, value) {\n return this.vorbisParser.addTag(id, value);\n }\n}\n","import * as Token from 'token-types';\nimport { AttachedPictureType } from '../../id3v2/ID3v2Token.js';\n/**\n * Parse the METADATA_BLOCK_PICTURE\n * Ref: https://wiki.xiph.org/VorbisComment#METADATA_BLOCK_PICTURE\n * Ref: https://xiph.org/flac/format.html#metadata_block_picture\n * // ToDo: move to ID3 / APIC?\n */\nexport class VorbisPictureToken {\n static fromBase64(base64str) {\n return VorbisPictureToken.fromBuffer(Uint8Array.from(atob(base64str), c => c.charCodeAt(0)));\n }\n static fromBuffer(buffer) {\n const pic = new VorbisPictureToken(buffer.length);\n return pic.get(buffer, 0);\n }\n constructor(len) {\n this.len = len;\n }\n get(buffer, offset) {\n const type = AttachedPictureType[Token.UINT32_BE.get(buffer, offset)];\n offset += 4;\n const mimeLen = Token.UINT32_BE.get(buffer, offset);\n offset += 4;\n const format = new Token.StringType(mimeLen, 'utf-8').get(buffer, offset);\n offset += mimeLen;\n const descLen = Token.UINT32_BE.get(buffer, offset);\n offset += 4;\n const description = new Token.StringType(descLen, 'utf-8').get(buffer, offset);\n offset += descLen;\n const width = Token.UINT32_BE.get(buffer, offset);\n offset += 4;\n const height = Token.UINT32_BE.get(buffer, offset);\n offset += 4;\n const colour_depth = Token.UINT32_BE.get(buffer, offset);\n offset += 4;\n const indexed_color = Token.UINT32_BE.get(buffer, offset);\n offset += 4;\n const picDataLen = Token.UINT32_BE.get(buffer, offset);\n offset += 4;\n const data = buffer.slice(offset, offset + picDataLen);\n return {\n type,\n format,\n description,\n width,\n height,\n colour_depth,\n indexed_color,\n data\n };\n }\n}\n/**\n * Comment header decoder\n * Ref: https://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-620004.2.1\n */\nexport const CommonHeader = {\n len: 7,\n get: (buf, off) => {\n return {\n packetType: Token.UINT8.get(buf, off),\n vorbis: new Token.StringType(6, 'ascii').get(buf, off + 1)\n };\n }\n};\n/**\n * Identification header decoder\n * Ref: https://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-630004.2.2\n */\nexport const IdentificationHeader = {\n len: 23,\n get: (uint8Array, off) => {\n return {\n version: Token.UINT32_LE.get(uint8Array, off + 0),\n channelMode: Token.UINT8.get(uint8Array, off + 4),\n sampleRate: Token.UINT32_LE.get(uint8Array, off + 5),\n bitrateMax: Token.UINT32_LE.get(uint8Array, off + 9),\n bitrateNominal: Token.UINT32_LE.get(uint8Array, off + 13),\n bitrateMin: Token.UINT32_LE.get(uint8Array, off + 17)\n };\n }\n};\n","import * as Token from 'token-types';\nimport debugInit from 'debug';\nimport { VorbisDecoder } from './VorbisDecoder.js';\nimport { CommonHeader, IdentificationHeader, VorbisPictureToken } from './Vorbis.js';\nimport { makeUnexpectedFileContentError } from '../../ParseError.js';\nconst debug = debugInit('music-metadata:parser:ogg:vorbis1');\nexport class VorbisContentError extends makeUnexpectedFileContentError('Vorbis') {\n}\n/**\n * Vorbis 1 Parser.\n * Used by OggStream\n */\nexport class VorbisStream {\n constructor(metadata, options) {\n this.pageSegments = [];\n this.durationOnLastPage = true;\n this.metadata = metadata;\n this.options = options;\n }\n /**\n * Vorbis 1 parser\n * @param header Ogg Page Header\n * @param pageData Page data\n */\n async parsePage(header, pageData) {\n this.lastPageHeader = header;\n if (header.headerType.firstPage) {\n this.parseFirstPage(header, pageData);\n }\n else {\n if (header.headerType.continued) {\n if (this.pageSegments.length === 0) {\n throw new VorbisContentError('Cannot continue on previous page');\n }\n this.pageSegments.push(pageData);\n }\n if (header.headerType.lastPage || !header.headerType.continued) {\n // Flush page segments\n if (this.pageSegments.length > 0) {\n const fullPage = VorbisStream.mergeUint8Arrays(this.pageSegments);\n await this.parseFullPage(fullPage);\n }\n // Reset page segments\n this.pageSegments = header.headerType.lastPage ? [] : [pageData];\n }\n }\n }\n static mergeUint8Arrays(arrays) {\n const totalSize = arrays.reduce((acc, e) => acc + e.length, 0);\n const merged = new Uint8Array(totalSize);\n arrays.forEach((array, i, _arrays) => {\n const offset = _arrays.slice(0, i).reduce((acc, e) => acc + e.length, 0);\n merged.set(array, offset);\n });\n return merged;\n }\n async flush() {\n await this.parseFullPage(VorbisStream.mergeUint8Arrays(this.pageSegments));\n }\n async parseUserComment(pageData, offset) {\n const decoder = new VorbisDecoder(pageData, offset);\n const tag = decoder.parseUserComment();\n await this.addTag(tag.key, tag.value);\n return tag.len;\n }\n async addTag(id, value) {\n if (id === 'METADATA_BLOCK_PICTURE' && (typeof value === 'string')) {\n if (this.options.skipCovers) {\n debug(\"Ignore picture\");\n return;\n }\n value = VorbisPictureToken.fromBase64(value);\n debug(`Push picture: id=${id}, format=${value.format}`);\n }\n else {\n debug(`Push tag: id=${id}, value=${value}`);\n }\n await this.metadata.addTag('vorbis', id, value);\n }\n calculateDuration(_enfOfStream) {\n if (this.lastPageHeader && this.metadata.format.sampleRate && this.lastPageHeader.absoluteGranulePosition >= 0) {\n // Calculate duration\n this.metadata.setFormat('numberOfSamples', this.lastPageHeader.absoluteGranulePosition);\n this.metadata.setFormat('duration', this.lastPageHeader.absoluteGranulePosition / this.metadata.format.sampleRate);\n }\n }\n /**\n * Parse first Ogg/Vorbis page\n * @param _header\n * @param pageData\n */\n parseFirstPage(_header, pageData) {\n this.metadata.setFormat('codec', 'Vorbis I');\n this.metadata.setFormat('hasAudio', true);\n debug('Parse first page');\n // Parse Vorbis common header\n const commonHeader = CommonHeader.get(pageData, 0);\n if (commonHeader.vorbis !== 'vorbis')\n throw new VorbisContentError('Metadata does not look like Vorbis');\n if (commonHeader.packetType === 1) {\n const idHeader = IdentificationHeader.get(pageData, CommonHeader.len);\n this.metadata.setFormat('sampleRate', idHeader.sampleRate);\n this.metadata.setFormat('bitrate', idHeader.bitrateNominal);\n this.metadata.setFormat('numberOfChannels', idHeader.channelMode);\n debug('sample-rate=%s[hz], bitrate=%s[b/s], channel-mode=%s', idHeader.sampleRate, idHeader.bitrateNominal, idHeader.channelMode);\n }\n else\n throw new VorbisContentError('First Ogg page should be type 1: the identification header');\n }\n async parseFullPage(pageData) {\n // New page\n const commonHeader = CommonHeader.get(pageData, 0);\n debug('Parse full page: type=%s, byteLength=%s', commonHeader.packetType, pageData.byteLength);\n switch (commonHeader.packetType) {\n case 3: // type 3: comment header\n return this.parseUserCommentList(pageData, CommonHeader.len);\n case 1: // type 1: the identification header\n case 5: // type 5: setup header type\n break; // ignore\n }\n }\n /**\n * Ref: https://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-840005.2\n */\n async parseUserCommentList(pageData, offset) {\n const strLen = Token.UINT32_LE.get(pageData, offset);\n offset += 4;\n // const vendorString = new Token.StringType(strLen, 'utf-8').get(pageData, offset);\n offset += strLen;\n let userCommentListLength = Token.UINT32_LE.get(pageData, offset);\n offset += 4;\n while (userCommentListLength-- > 0) {\n offset += (await this.parseUserComment(pageData, offset));\n }\n }\n}\n","import * as Token from 'token-types';\nimport { textDecode } from '@borewit/text-codec';\nexport class VorbisDecoder {\n constructor(data, offset) {\n this.data = data;\n this.offset = offset;\n }\n readInt32() {\n const value = Token.UINT32_LE.get(this.data, this.offset);\n this.offset += 4;\n return value;\n }\n readStringUtf8() {\n const len = this.readInt32();\n const value = textDecode(this.data.subarray(this.offset, this.offset + len), 'utf-8');\n this.offset += len;\n return value;\n }\n parseUserComment() {\n const offset0 = this.offset;\n const v = this.readStringUtf8();\n const idx = v.indexOf('=');\n return {\n key: v.substring(0, idx).toUpperCase(),\n value: v.substring(idx + 1),\n len: this.offset - offset0\n };\n }\n}\n","import * as util from '../common/Util.js';\nimport { UINT16_BE, UINT24_BE, Uint8ArrayType } from 'token-types';\n/**\n * FLAC supports up to 128 kinds of metadata blocks; currently the following are defined:\n * ref: https://xiph.org/flac/format.html#metadata_block\n */\nexport const BlockType = {\n STREAMINFO: 0, // STREAMINFO\n PADDING: 1, // PADDING\n APPLICATION: 2, // APPLICATION\n SEEKTABLE: 3, // SEEKTABLE\n VORBIS_COMMENT: 4, // VORBIS_COMMENT\n CUESHEET: 5, // CUESHEET\n PICTURE: 6 // PICTURE\n};\nexport const BlockHeader = {\n len: 4,\n get: (buf, off) => {\n return {\n lastBlock: util.getBit(buf, off, 7),\n type: util.getBitAllignedNumber(buf, off, 1, 7),\n length: UINT24_BE.get(buf, off + 1)\n };\n }\n};\n/**\n * METADATA_BLOCK_DATA\n * Ref: https://xiph.org/flac/format.html#metadata_block_streaminfo\n */\nexport const BlockStreamInfo = {\n len: 34,\n get: (buf, off) => {\n return {\n // The minimum block size (in samples) used in the stream.\n minimumBlockSize: UINT16_BE.get(buf, off),\n // The maximum block size (in samples) used in the stream.\n // (Minimum blocksize == maximum blocksize) implies a fixed-blocksize stream.\n maximumBlockSize: UINT16_BE.get(buf, off + 2) / 1000,\n // The minimum frame size (in bytes) used in the stream.\n // May be 0 to imply the value is not known.\n minimumFrameSize: UINT24_BE.get(buf, off + 4),\n // The maximum frame size (in bytes) used in the stream.\n // May be 0 to imply the value is not known.\n maximumFrameSize: UINT24_BE.get(buf, off + 7),\n // Sample rate in Hz. Though 20 bits are available,\n // the maximum sample rate is limited by the structure of frame headers to 655350Hz.\n // Also, a value of 0 is invalid.\n sampleRate: UINT24_BE.get(buf, off + 10) >> 4,\n // probably slower: sampleRate: common.getBitAllignedNumber(buf, off + 10, 0, 20),\n // (number of channels)-1. FLAC supports from 1 to 8 channels\n channels: util.getBitAllignedNumber(buf, off + 12, 4, 3) + 1,\n // bits per sample)-1.\n // FLAC supports from 4 to 32 bits per sample. Currently the reference encoder and decoders only support up to 24 bits per sample.\n bitsPerSample: util.getBitAllignedNumber(buf, off + 12, 7, 5) + 1,\n // Total samples in stream.\n // 'Samples' means inter-channel sample, i.e. one second of 44.1Khz audio will have 44100 samples regardless of the number of channels.\n // A value of zero here means the number of total samples is unknown.\n totalSamples: util.getBitAllignedNumber(buf, off + 13, 4, 36),\n // the MD5 hash of the file (see notes for usage... it's a littly tricky)\n fileMD5: new Uint8ArrayType(16).get(buf, off + 18)\n };\n }\n};\n"],"mappings":"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","names":["import_debug","debugInit","debug","initDebug"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-A4RQ3WIY.js.map"}
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-AFAFCDHW.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-AFAFCDHW.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-AFAFCDHW.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-AFAFCDHW.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-AN7CZG6F.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-AN7CZG6F.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-AN7CZG6F.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-AN7CZG6F.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-BGA2NGTF.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-BGA2NGTF.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-BGA2NGTF.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-BGA2NGTF.js.map
+326
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-CSVVW572.js
··· 1 + import { 2 + a2hex, 3 + findZero 4 + } from "./chunk-6AX6SYMQ.js"; 5 + import { 6 + fromBuffer 7 + } from "./chunk-FGRUWWG5.js"; 8 + import { 9 + BasicParser, 10 + FieldDecodingError, 11 + InternalParserError, 12 + StringType, 13 + UINT16_LE, 14 + UINT32_LE, 15 + Uint8ArrayType, 16 + makeUnexpectedFileContentError, 17 + require_src, 18 + textDecode, 19 + textEncode 20 + } from "./chunk-ETGVMC2T.js"; 21 + import { 22 + __name, 23 + __toESM 24 + } from "./chunk-7IARE43G.js"; 25 + 26 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/apev2/APEv2Parser.js 27 + var import_debug = __toESM(require_src()); 28 + 29 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/common/FourCC.js 30 + var validFourCC = /^[\x21-\x7e©][\x20-\x7e\x00()]{3}/; 31 + var FourCcToken = { 32 + len: 4, 33 + get: /* @__PURE__ */ __name((buf, off) => { 34 + const id = textDecode(buf.subarray(off, off + FourCcToken.len), "latin1"); 35 + if (!id.match(validFourCC)) { 36 + throw new FieldDecodingError(`FourCC contains invalid characters: ${a2hex(id)} "${id}"`); 37 + } 38 + return id; 39 + }, "get"), 40 + put: /* @__PURE__ */ __name((buffer, offset, id) => { 41 + const str = textEncode(id, "latin1"); 42 + if (str.length !== 4) 43 + throw new InternalParserError("Invalid length"); 44 + buffer.set(str, offset); 45 + return offset + 4; 46 + }, "put") 47 + }; 48 + 49 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/apev2/APEv2Token.js 50 + var DataType = { 51 + text_utf8: 0, 52 + binary: 1, 53 + external_info: 2, 54 + reserved: 3 55 + }; 56 + var DescriptorParser = { 57 + len: 52, 58 + get: /* @__PURE__ */ __name((buf, off) => { 59 + return { 60 + // should equal 'MAC ' 61 + ID: FourCcToken.get(buf, off), 62 + // versionIndex number * 1000 (3.81 = 3810) (remember that 4-byte alignment causes this to take 4-bytes) 63 + version: UINT32_LE.get(buf, off + 4) / 1e3, 64 + // the number of descriptor bytes (allows later expansion of this header) 65 + descriptorBytes: UINT32_LE.get(buf, off + 8), 66 + // the number of header APE_HEADER bytes 67 + headerBytes: UINT32_LE.get(buf, off + 12), 68 + // the number of header APE_HEADER bytes 69 + seekTableBytes: UINT32_LE.get(buf, off + 16), 70 + // the number of header data bytes (from original file) 71 + headerDataBytes: UINT32_LE.get(buf, off + 20), 72 + // the number of bytes of APE frame data 73 + apeFrameDataBytes: UINT32_LE.get(buf, off + 24), 74 + // the high order number of APE frame data bytes 75 + apeFrameDataBytesHigh: UINT32_LE.get(buf, off + 28), 76 + // the terminating data of the file (not including tag data) 77 + terminatingDataBytes: UINT32_LE.get(buf, off + 32), 78 + // the MD5 hash of the file (see notes for usage... it's a little tricky) 79 + fileMD5: new Uint8ArrayType(16).get(buf, off + 36) 80 + }; 81 + }, "get") 82 + }; 83 + var Header = { 84 + len: 24, 85 + get: /* @__PURE__ */ __name((buf, off) => { 86 + return { 87 + // the compression level (see defines I.E. COMPRESSION_LEVEL_FAST) 88 + compressionLevel: UINT16_LE.get(buf, off), 89 + // any format flags (for future use) 90 + formatFlags: UINT16_LE.get(buf, off + 2), 91 + // the number of audio blocks in one frame 92 + blocksPerFrame: UINT32_LE.get(buf, off + 4), 93 + // the number of audio blocks in the final frame 94 + finalFrameBlocks: UINT32_LE.get(buf, off + 8), 95 + // the total number of frames 96 + totalFrames: UINT32_LE.get(buf, off + 12), 97 + // the bits per sample (typically 16) 98 + bitsPerSample: UINT16_LE.get(buf, off + 16), 99 + // the number of channels (1 or 2) 100 + channel: UINT16_LE.get(buf, off + 18), 101 + // the sample rate (typically 44100) 102 + sampleRate: UINT32_LE.get(buf, off + 20) 103 + }; 104 + }, "get") 105 + }; 106 + var TagFooter = { 107 + len: 32, 108 + get: /* @__PURE__ */ __name((buf, off) => { 109 + return { 110 + // should equal 'APETAGEX' 111 + ID: new StringType(8, "ascii").get(buf, off), 112 + // equals CURRENT_APE_TAG_VERSION 113 + version: UINT32_LE.get(buf, off + 8), 114 + // the complete size of the tag, including this footer (excludes header) 115 + size: UINT32_LE.get(buf, off + 12), 116 + // the number of fields in the tag 117 + fields: UINT32_LE.get(buf, off + 16), 118 + // reserved for later use (must be zero), 119 + flags: parseTagFlags(UINT32_LE.get(buf, off + 20)) 120 + }; 121 + }, "get") 122 + }; 123 + var TagItemHeader = { 124 + len: 8, 125 + get: /* @__PURE__ */ __name((buf, off) => { 126 + return { 127 + // Length of assigned value in bytes 128 + size: UINT32_LE.get(buf, off), 129 + // reserved for later use (must be zero), 130 + flags: parseTagFlags(UINT32_LE.get(buf, off + 4)) 131 + }; 132 + }, "get") 133 + }; 134 + function parseTagFlags(flags) { 135 + return { 136 + containsHeader: isBitSet(flags, 31), 137 + containsFooter: isBitSet(flags, 30), 138 + isHeader: isBitSet(flags, 29), 139 + readOnly: isBitSet(flags, 0), 140 + dataType: (flags & 6) >> 1 141 + }; 142 + } 143 + __name(parseTagFlags, "parseTagFlags"); 144 + function isBitSet(num, bit) { 145 + return (num & 1 << bit) !== 0; 146 + } 147 + __name(isBitSet, "isBitSet"); 148 + 149 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/apev2/APEv2Parser.js 150 + var debug = (0, import_debug.default)("music-metadata:parser:APEv2"); 151 + var tagFormat = "APEv2"; 152 + var preamble = "APETAGEX"; 153 + var ApeContentError = class extends makeUnexpectedFileContentError("APEv2") { 154 + static { 155 + __name(this, "ApeContentError"); 156 + } 157 + }; 158 + function tryParseApeHeader(metadata, tokenizer, options) { 159 + const apeParser = new APEv2Parser(metadata, tokenizer, options); 160 + return apeParser.tryParseApeHeader(); 161 + } 162 + __name(tryParseApeHeader, "tryParseApeHeader"); 163 + var APEv2Parser = class _APEv2Parser extends BasicParser { 164 + static { 165 + __name(this, "APEv2Parser"); 166 + } 167 + constructor() { 168 + super(...arguments); 169 + this.ape = {}; 170 + } 171 + /** 172 + * Calculate the media file duration 173 + * @param ah ApeHeader 174 + * @return {number} duration in seconds 175 + */ 176 + static calculateDuration(ah) { 177 + let duration = ah.totalFrames > 1 ? ah.blocksPerFrame * (ah.totalFrames - 1) : 0; 178 + duration += ah.finalFrameBlocks; 179 + return duration / ah.sampleRate; 180 + } 181 + /** 182 + * Calculates the APEv1 / APEv2 first field offset 183 + * @param tokenizer 184 + * @param offset 185 + */ 186 + static async findApeFooterOffset(tokenizer, offset) { 187 + const apeBuf = new Uint8Array(TagFooter.len); 188 + const position = tokenizer.position; 189 + if (offset <= TagFooter.len) { 190 + debug(`Offset is too small to read APE footer: offset=${offset}`); 191 + return void 0; 192 + } 193 + if (offset > TagFooter.len) { 194 + await tokenizer.readBuffer(apeBuf, { position: offset - TagFooter.len }); 195 + tokenizer.setPosition(position); 196 + const tagFooter = TagFooter.get(apeBuf, 0); 197 + if (tagFooter.ID === "APETAGEX") { 198 + if (tagFooter.flags.isHeader) { 199 + debug(`APE Header found at offset=${offset - TagFooter.len}`); 200 + } else { 201 + debug(`APE Footer found at offset=${offset - TagFooter.len}`); 202 + offset -= tagFooter.size; 203 + } 204 + return { footer: tagFooter, offset }; 205 + } 206 + } 207 + } 208 + static parseTagFooter(metadata, buffer, options) { 209 + const footer = TagFooter.get(buffer, buffer.length - TagFooter.len); 210 + if (footer.ID !== preamble) 211 + throw new ApeContentError("Unexpected APEv2 Footer ID preamble value"); 212 + fromBuffer(buffer); 213 + const apeParser = new _APEv2Parser(metadata, fromBuffer(buffer), options); 214 + return apeParser.parseTags(footer); 215 + } 216 + /** 217 + * Parse APEv1 / APEv2 header if header signature found 218 + */ 219 + async tryParseApeHeader() { 220 + if (this.tokenizer.fileInfo.size && this.tokenizer.fileInfo.size - this.tokenizer.position < TagFooter.len) { 221 + debug("No APEv2 header found, end-of-file reached"); 222 + return; 223 + } 224 + const footer = await this.tokenizer.peekToken(TagFooter); 225 + if (footer.ID === preamble) { 226 + await this.tokenizer.ignore(TagFooter.len); 227 + return this.parseTags(footer); 228 + } 229 + debug(`APEv2 header not found at offset=${this.tokenizer.position}`); 230 + if (this.tokenizer.fileInfo.size) { 231 + const remaining = this.tokenizer.fileInfo.size - this.tokenizer.position; 232 + const buffer = new Uint8Array(remaining); 233 + await this.tokenizer.readBuffer(buffer); 234 + return _APEv2Parser.parseTagFooter(this.metadata, buffer, this.options); 235 + } 236 + } 237 + async parse() { 238 + const descriptor = await this.tokenizer.readToken(DescriptorParser); 239 + if (descriptor.ID !== "MAC ") 240 + throw new ApeContentError("Unexpected descriptor ID"); 241 + this.ape.descriptor = descriptor; 242 + const lenExp = descriptor.descriptorBytes - DescriptorParser.len; 243 + const header = await (lenExp > 0 ? this.parseDescriptorExpansion(lenExp) : this.parseHeader()); 244 + this.metadata.setAudioOnly(); 245 + await this.tokenizer.ignore(header.forwardBytes); 246 + return this.tryParseApeHeader(); 247 + } 248 + async parseTags(footer) { 249 + const keyBuffer = new Uint8Array(256); 250 + let bytesRemaining = footer.size - TagFooter.len; 251 + debug(`Parse APE tags at offset=${this.tokenizer.position}, size=${bytesRemaining}`); 252 + for (let i = 0; i < footer.fields; i++) { 253 + if (bytesRemaining < TagItemHeader.len) { 254 + this.metadata.addWarning(`APEv2 Tag-header: ${footer.fields - i} items remaining, but no more tag data to read.`); 255 + break; 256 + } 257 + const tagItemHeader = await this.tokenizer.readToken(TagItemHeader); 258 + bytesRemaining -= TagItemHeader.len + tagItemHeader.size; 259 + await this.tokenizer.peekBuffer(keyBuffer, { length: Math.min(keyBuffer.length, bytesRemaining) }); 260 + let zero = findZero(keyBuffer); 261 + const key = await this.tokenizer.readToken(new StringType(zero, "ascii")); 262 + await this.tokenizer.ignore(1); 263 + bytesRemaining -= key.length + 1; 264 + switch (tagItemHeader.flags.dataType) { 265 + case DataType.text_utf8: { 266 + const value = await this.tokenizer.readToken(new StringType(tagItemHeader.size, "utf8")); 267 + const values = value.split(/\x00/g); 268 + await Promise.all(values.map((val) => this.metadata.addTag(tagFormat, key, val))); 269 + break; 270 + } 271 + case DataType.binary: 272 + if (this.options.skipCovers) { 273 + await this.tokenizer.ignore(tagItemHeader.size); 274 + } else { 275 + const picData = new Uint8Array(tagItemHeader.size); 276 + await this.tokenizer.readBuffer(picData); 277 + zero = findZero(picData); 278 + const description = textDecode(picData.subarray(0, zero), "utf-8"); 279 + const data = picData.subarray(zero + 1); 280 + await this.metadata.addTag(tagFormat, key, { 281 + description, 282 + data 283 + }); 284 + } 285 + break; 286 + case DataType.external_info: 287 + debug(`Ignore external info ${key}`); 288 + await this.tokenizer.ignore(tagItemHeader.size); 289 + break; 290 + case DataType.reserved: 291 + debug(`Ignore external info ${key}`); 292 + this.metadata.addWarning(`APEv2 header declares a reserved datatype for "${key}"`); 293 + await this.tokenizer.ignore(tagItemHeader.size); 294 + break; 295 + } 296 + } 297 + } 298 + async parseDescriptorExpansion(lenExp) { 299 + await this.tokenizer.ignore(lenExp); 300 + return this.parseHeader(); 301 + } 302 + async parseHeader() { 303 + const header = await this.tokenizer.readToken(Header); 304 + this.metadata.setFormat("lossless", true); 305 + this.metadata.setFormat("container", "Monkey's Audio"); 306 + this.metadata.setFormat("bitsPerSample", header.bitsPerSample); 307 + this.metadata.setFormat("sampleRate", header.sampleRate); 308 + this.metadata.setFormat("numberOfChannels", header.channel); 309 + this.metadata.setFormat("duration", _APEv2Parser.calculateDuration(header)); 310 + if (!this.ape.descriptor) { 311 + throw new ApeContentError("Missing APE descriptor"); 312 + } 313 + return { 314 + forwardBytes: this.ape.descriptor.seekTableBytes + this.ape.descriptor.headerDataBytes + this.ape.descriptor.apeFrameDataBytes + this.ape.descriptor.terminatingDataBytes 315 + }; 316 + } 317 + }; 318 + 319 + export { 320 + FourCcToken, 321 + ApeContentError, 322 + tryParseApeHeader, 323 + APEv2Parser 324 + }; 325 + 326 + //# sourceMappingURL=./chunk-CSVVW572.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-CSVVW572.js.map
··· 1 + {"version":3,"sources":["/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/apev2/APEv2Parser.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/common/FourCC.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/apev2/APEv2Token.js"],"sourcesContent":["import initDebug from 'debug';\nimport * as strtok3 from 'strtok3';\nimport { StringType } from 'token-types';\nimport * as util from '../common/Util.js';\nimport { BasicParser } from '../common/BasicParser.js';\nimport { DataType, DescriptorParser, Header, TagFooter, TagItemHeader } from './APEv2Token.js';\nimport { makeUnexpectedFileContentError } from '../ParseError.js';\nimport { textDecode } from '@borewit/text-codec';\nconst debug = initDebug('music-metadata:parser:APEv2');\nconst tagFormat = 'APEv2';\nconst preamble = 'APETAGEX';\nexport class ApeContentError extends makeUnexpectedFileContentError('APEv2') {\n}\nexport function tryParseApeHeader(metadata, tokenizer, options) {\n const apeParser = new APEv2Parser(metadata, tokenizer, options);\n return apeParser.tryParseApeHeader();\n}\nexport class APEv2Parser extends BasicParser {\n constructor() {\n super(...arguments);\n this.ape = {};\n }\n /**\n * Calculate the media file duration\n * @param ah ApeHeader\n * @return {number} duration in seconds\n */\n static calculateDuration(ah) {\n let duration = ah.totalFrames > 1 ? ah.blocksPerFrame * (ah.totalFrames - 1) : 0;\n duration += ah.finalFrameBlocks;\n return duration / ah.sampleRate;\n }\n /**\n * Calculates the APEv1 / APEv2 first field offset\n * @param tokenizer\n * @param offset\n */\n static async findApeFooterOffset(tokenizer, offset) {\n // Search for APE footer header at the end of the file\n const apeBuf = new Uint8Array(TagFooter.len);\n const position = tokenizer.position;\n if (offset <= TagFooter.len) {\n debug(`Offset is too small to read APE footer: offset=${offset}`);\n return undefined;\n }\n if (offset > TagFooter.len) {\n await tokenizer.readBuffer(apeBuf, { position: offset - TagFooter.len });\n tokenizer.setPosition(position);\n const tagFooter = TagFooter.get(apeBuf, 0);\n if (tagFooter.ID === 'APETAGEX') {\n if (tagFooter.flags.isHeader) {\n debug(`APE Header found at offset=${offset - TagFooter.len}`);\n }\n else {\n debug(`APE Footer found at offset=${offset - TagFooter.len}`);\n offset -= tagFooter.size;\n }\n return { footer: tagFooter, offset };\n }\n }\n }\n static parseTagFooter(metadata, buffer, options) {\n const footer = TagFooter.get(buffer, buffer.length - TagFooter.len);\n if (footer.ID !== preamble)\n throw new ApeContentError('Unexpected APEv2 Footer ID preamble value');\n strtok3.fromBuffer(buffer);\n const apeParser = new APEv2Parser(metadata, strtok3.fromBuffer(buffer), options);\n return apeParser.parseTags(footer);\n }\n /**\n * Parse APEv1 / APEv2 header if header signature found\n */\n async tryParseApeHeader() {\n if (this.tokenizer.fileInfo.size && this.tokenizer.fileInfo.size - this.tokenizer.position < TagFooter.len) {\n debug(\"No APEv2 header found, end-of-file reached\");\n return;\n }\n const footer = await this.tokenizer.peekToken(TagFooter);\n if (footer.ID === preamble) {\n await this.tokenizer.ignore(TagFooter.len);\n return this.parseTags(footer);\n }\n debug(`APEv2 header not found at offset=${this.tokenizer.position}`);\n if (this.tokenizer.fileInfo.size) {\n // Try to read the APEv2 header using just the footer-header\n const remaining = this.tokenizer.fileInfo.size - this.tokenizer.position; // ToDo: take ID3v1 into account\n const buffer = new Uint8Array(remaining);\n await this.tokenizer.readBuffer(buffer);\n return APEv2Parser.parseTagFooter(this.metadata, buffer, this.options);\n }\n }\n async parse() {\n const descriptor = await this.tokenizer.readToken(DescriptorParser);\n if (descriptor.ID !== 'MAC ')\n throw new ApeContentError('Unexpected descriptor ID');\n this.ape.descriptor = descriptor;\n const lenExp = descriptor.descriptorBytes - DescriptorParser.len;\n const header = await (lenExp > 0 ? this.parseDescriptorExpansion(lenExp) : this.parseHeader());\n this.metadata.setAudioOnly();\n await this.tokenizer.ignore(header.forwardBytes);\n return this.tryParseApeHeader();\n }\n async parseTags(footer) {\n const keyBuffer = new Uint8Array(256); // maximum tag key length\n let bytesRemaining = footer.size - TagFooter.len;\n debug(`Parse APE tags at offset=${this.tokenizer.position}, size=${bytesRemaining}`);\n for (let i = 0; i < footer.fields; i++) {\n if (bytesRemaining < TagItemHeader.len) {\n this.metadata.addWarning(`APEv2 Tag-header: ${footer.fields - i} items remaining, but no more tag data to read.`);\n break;\n }\n // Only APEv2 tag has tag item headers\n const tagItemHeader = await this.tokenizer.readToken(TagItemHeader);\n bytesRemaining -= TagItemHeader.len + tagItemHeader.size;\n await this.tokenizer.peekBuffer(keyBuffer, { length: Math.min(keyBuffer.length, bytesRemaining) });\n let zero = util.findZero(keyBuffer);\n const key = await this.tokenizer.readToken(new StringType(zero, 'ascii'));\n await this.tokenizer.ignore(1);\n bytesRemaining -= key.length + 1;\n switch (tagItemHeader.flags.dataType) {\n case DataType.text_utf8: { // utf-8 text-string\n const value = await this.tokenizer.readToken(new StringType(tagItemHeader.size, 'utf8'));\n const values = value.split(/\\x00/g);\n await Promise.all(values.map(val => this.metadata.addTag(tagFormat, key, val)));\n break;\n }\n case DataType.binary: // binary (probably artwork)\n if (this.options.skipCovers) {\n await this.tokenizer.ignore(tagItemHeader.size);\n }\n else {\n const picData = new Uint8Array(tagItemHeader.size);\n await this.tokenizer.readBuffer(picData);\n zero = util.findZero(picData);\n const description = textDecode(picData.subarray(0, zero), 'utf-8');\n const data = picData.subarray(zero + 1);\n await this.metadata.addTag(tagFormat, key, {\n description,\n data\n });\n }\n break;\n case DataType.external_info:\n debug(`Ignore external info ${key}`);\n await this.tokenizer.ignore(tagItemHeader.size);\n break;\n case DataType.reserved:\n debug(`Ignore external info ${key}`);\n this.metadata.addWarning(`APEv2 header declares a reserved datatype for \"${key}\"`);\n await this.tokenizer.ignore(tagItemHeader.size);\n break;\n }\n }\n }\n async parseDescriptorExpansion(lenExp) {\n await this.tokenizer.ignore(lenExp);\n return this.parseHeader();\n }\n async parseHeader() {\n const header = await this.tokenizer.readToken(Header);\n // ToDo before\n this.metadata.setFormat('lossless', true);\n this.metadata.setFormat('container', 'Monkey\\'s Audio');\n this.metadata.setFormat('bitsPerSample', header.bitsPerSample);\n this.metadata.setFormat('sampleRate', header.sampleRate);\n this.metadata.setFormat('numberOfChannels', header.channel);\n this.metadata.setFormat('duration', APEv2Parser.calculateDuration(header));\n if (!this.ape.descriptor) {\n throw new ApeContentError('Missing APE descriptor');\n }\n return {\n forwardBytes: this.ape.descriptor.seekTableBytes + this.ape.descriptor.headerDataBytes +\n this.ape.descriptor.apeFrameDataBytes + this.ape.descriptor.terminatingDataBytes\n };\n }\n}\n","import { textDecode, textEncode } from '@borewit/text-codec';\nimport * as util from './Util.js';\nimport { InternalParserError, FieldDecodingError } from '../ParseError.js';\nconst validFourCC = /^[\\x21-\\x7e©][\\x20-\\x7e\\x00()]{3}/;\n/**\n * Token for read FourCC\n * Ref: https://en.wikipedia.org/wiki/FourCC\n */\nexport const FourCcToken = {\n len: 4,\n get: (buf, off) => {\n const id = textDecode(buf.subarray(off, off + FourCcToken.len), 'latin1');\n if (!id.match(validFourCC)) {\n throw new FieldDecodingError(`FourCC contains invalid characters: ${util.a2hex(id)} \"${id}\"`);\n }\n return id;\n },\n put: (buffer, offset, id) => {\n const str = textEncode(id, 'latin1');\n if (str.length !== 4)\n throw new InternalParserError('Invalid length');\n buffer.set(str, offset);\n return offset + 4;\n }\n};\n","import * as Token from 'token-types';\nimport { FourCcToken } from '../common/FourCC.js';\nexport const DataType = {\n text_utf8: 0,\n binary: 1,\n external_info: 2,\n reserved: 3\n};\n/**\n * APE_DESCRIPTOR: defines the sizes (and offsets) of all the pieces, as well as the MD5 checksum\n */\nexport const DescriptorParser = {\n len: 52,\n get: (buf, off) => {\n return {\n // should equal 'MAC '\n ID: FourCcToken.get(buf, off),\n // versionIndex number * 1000 (3.81 = 3810) (remember that 4-byte alignment causes this to take 4-bytes)\n version: Token.UINT32_LE.get(buf, off + 4) / 1000,\n // the number of descriptor bytes (allows later expansion of this header)\n descriptorBytes: Token.UINT32_LE.get(buf, off + 8),\n // the number of header APE_HEADER bytes\n headerBytes: Token.UINT32_LE.get(buf, off + 12),\n // the number of header APE_HEADER bytes\n seekTableBytes: Token.UINT32_LE.get(buf, off + 16),\n // the number of header data bytes (from original file)\n headerDataBytes: Token.UINT32_LE.get(buf, off + 20),\n // the number of bytes of APE frame data\n apeFrameDataBytes: Token.UINT32_LE.get(buf, off + 24),\n // the high order number of APE frame data bytes\n apeFrameDataBytesHigh: Token.UINT32_LE.get(buf, off + 28),\n // the terminating data of the file (not including tag data)\n terminatingDataBytes: Token.UINT32_LE.get(buf, off + 32),\n // the MD5 hash of the file (see notes for usage... it's a little tricky)\n fileMD5: new Token.Uint8ArrayType(16).get(buf, off + 36)\n };\n }\n};\n/**\n * APE_HEADER: describes all of the necessary information about the APE file\n */\nexport const Header = {\n len: 24,\n get: (buf, off) => {\n return {\n // the compression level (see defines I.E. COMPRESSION_LEVEL_FAST)\n compressionLevel: Token.UINT16_LE.get(buf, off),\n // any format flags (for future use)\n formatFlags: Token.UINT16_LE.get(buf, off + 2),\n // the number of audio blocks in one frame\n blocksPerFrame: Token.UINT32_LE.get(buf, off + 4),\n // the number of audio blocks in the final frame\n finalFrameBlocks: Token.UINT32_LE.get(buf, off + 8),\n // the total number of frames\n totalFrames: Token.UINT32_LE.get(buf, off + 12),\n // the bits per sample (typically 16)\n bitsPerSample: Token.UINT16_LE.get(buf, off + 16),\n // the number of channels (1 or 2)\n channel: Token.UINT16_LE.get(buf, off + 18),\n // the sample rate (typically 44100)\n sampleRate: Token.UINT32_LE.get(buf, off + 20)\n };\n }\n};\n/**\n * APE Tag Header/Footer Version 2.0\n * TAG: describes all the properties of the file [optional]\n */\nexport const TagFooter = {\n len: 32,\n get: (buf, off) => {\n return {\n // should equal 'APETAGEX'\n ID: new Token.StringType(8, 'ascii').get(buf, off),\n // equals CURRENT_APE_TAG_VERSION\n version: Token.UINT32_LE.get(buf, off + 8),\n // the complete size of the tag, including this footer (excludes header)\n size: Token.UINT32_LE.get(buf, off + 12),\n // the number of fields in the tag\n fields: Token.UINT32_LE.get(buf, off + 16),\n // reserved for later use (must be zero),\n flags: parseTagFlags(Token.UINT32_LE.get(buf, off + 20))\n };\n }\n};\n/**\n * APE Tag v2.0 Item Header\n */\nexport const TagItemHeader = {\n len: 8,\n get: (buf, off) => {\n return {\n // Length of assigned value in bytes\n size: Token.UINT32_LE.get(buf, off),\n // reserved for later use (must be zero),\n flags: parseTagFlags(Token.UINT32_LE.get(buf, off + 4))\n };\n }\n};\nexport function parseTagFlags(flags) {\n return {\n containsHeader: isBitSet(flags, 31),\n containsFooter: isBitSet(flags, 30),\n isHeader: isBitSet(flags, 29),\n readOnly: isBitSet(flags, 0),\n dataType: (flags & 6) >> 1\n };\n}\n/**\n * @param num {number}\n * @param bit 0 is least significant bit (LSB)\n * @return {boolean} true if bit is 1; otherwise false\n */\nexport function isBitSet(num, bit) {\n return (num & 1 << bit) !== 0;\n}\n"],"mappings":"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","names":["initDebug"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-CSVVW572.js.map"}
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-DNOJCDYS.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-DNOJCDYS.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-DNOJCDYS.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-DNOJCDYS.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-DR6IVCFO.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-DR6IVCFO.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-DR6IVCFO.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-DR6IVCFO.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-EA2BHPCN.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-EA2BHPCN.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-EA2BHPCN.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-EA2BHPCN.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-ETGVMC2T.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-ETGVMC2T.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-ETGVMC2T.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-ETGVMC2T.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-FGRUWWG5.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-FGRUWWG5.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-FGRUWWG5.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-FGRUWWG5.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-FIMGEMH3.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-FIMGEMH3.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-FIMGEMH3.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-FIMGEMH3.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-FJZTCILJ.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-FJZTCILJ.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-FJZTCILJ.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-FJZTCILJ.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-FQF7EPH6.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-FQF7EPH6.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-FQF7EPH6.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-FQF7EPH6.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-FXE6KMVX.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-FXE6KMVX.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-FXE6KMVX.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-FXE6KMVX.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-G2LBW36E.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-G2LBW36E.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-G2LBW36E.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-G2LBW36E.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-GWH5LC2W.js
··· 1 + ../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/chunk-GWH5LC2W.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-GWH5LC2W.js.map
··· 1 + ../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/chunk-GWH5LC2W.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-I4QT5UNG.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-I4QT5UNG.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-I4QT5UNG.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-I4QT5UNG.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-IMYGW2WM.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-IMYGW2WM.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-IMYGW2WM.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-IMYGW2WM.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-J7D6CDIP.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-J7D6CDIP.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-J7D6CDIP.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-J7D6CDIP.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-JIV2BMIF.js
··· 1 + ../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/chunk-JIV2BMIF.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-JIV2BMIF.js.map
··· 1 + ../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/chunk-JIV2BMIF.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-KM7A6C4E.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-KM7A6C4E.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-KM7A6C4E.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-KM7A6C4E.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-L3PGUTA5.js
··· 1 + ../bafybeih2s36bol7uisrik77ciyli5rhge2bikg7ezv7g43reykdd4jkaiq/chunk-L3PGUTA5.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-L3PGUTA5.js.map
··· 1 + ../bafybeih2s36bol7uisrik77ciyli5rhge2bikg7ezv7g43reykdd4jkaiq/chunk-L3PGUTA5.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-N5CHD32K.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-N5CHD32K.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-N5CHD32K.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-N5CHD32K.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-N6PLTDUY.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-N6PLTDUY.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-N6PLTDUY.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-N6PLTDUY.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-NEVFYBXS.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-NEVFYBXS.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-NEVFYBXS.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-NEVFYBXS.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-NUCRFIN6.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-NUCRFIN6.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-NUCRFIN6.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-NUCRFIN6.js.map
+12
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-OS4QRJDG.js
··· 1 + import { 2 + config 3 + } from "./chunk-UT643YRI.js"; 4 + 5 + // common/constituents/default/config.js 6 + var config_default = config(); 7 + 8 + export { 9 + config_default 10 + }; 11 + 12 + //# sourceMappingURL=./chunk-OS4QRJDG.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-OS4QRJDG.js.map
··· 1 + {"version":3,"sources":["/common/constituents/default/config.js"],"sourcesContent":["import { config } from \"../default.js\";\n\nexport default config();\n"],"mappings":";;;;;AAEA,IAAO,iBAAQ,OAAO;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-OS4QRJDG.js.map"}
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-OSIZG2BO.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-OSIZG2BO.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-OSIZG2BO.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-OSIZG2BO.js.map
+628
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-QOFAJIKO.js
··· 1 + import { 2 + Genres 3 + } from "./chunk-Z6RWJW2M.js"; 4 + import { 5 + AttachedPictureType, 6 + ExtendedHeader, 7 + ID3v2Header, 8 + SyncTextHeader, 9 + TextEncodingToken, 10 + TextHeader, 11 + UINT32SYNCSAFE 12 + } from "./chunk-SGG7NSCF.js"; 13 + import { 14 + decodeString, 15 + decodeUintBE, 16 + findZero, 17 + getBit 18 + } from "./chunk-6AX6SYMQ.js"; 19 + import { 20 + UINT24_BE, 21 + UINT32_BE, 22 + UINT8, 23 + Uint8ArrayType, 24 + makeUnexpectedFileContentError, 25 + require_src, 26 + textDecode 27 + } from "./chunk-ETGVMC2T.js"; 28 + import { 29 + __name, 30 + __toESM 31 + } from "./chunk-7IARE43G.js"; 32 + 33 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/id3v2/FrameParser.js 34 + var import_debug = __toESM(require_src()); 35 + var debug = (0, import_debug.default)("music-metadata:id3v2:frame-parser"); 36 + var defaultEnc = "latin1"; 37 + var urlEnc = { encoding: defaultEnc, bom: false }; 38 + function parseGenre(origVal) { 39 + const genres = []; 40 + let code; 41 + let word = ""; 42 + for (const c of origVal) { 43 + if (typeof code === "string") { 44 + if (c === "(" && code === "") { 45 + word += "("; 46 + code = void 0; 47 + } else if (c === ")") { 48 + if (word !== "") { 49 + genres.push(word); 50 + word = ""; 51 + } 52 + const genre = parseGenreCode(code); 53 + if (genre) { 54 + genres.push(genre); 55 + } 56 + code = void 0; 57 + } else 58 + code += c; 59 + } else if (c === "(") { 60 + code = ""; 61 + } else { 62 + word += c; 63 + } 64 + } 65 + if (word) { 66 + if (genres.length === 0 && word.match(/^\d*$/)) { 67 + word = parseGenreCode(word); 68 + } 69 + if (word) { 70 + genres.push(word); 71 + } 72 + } 73 + return genres; 74 + } 75 + __name(parseGenre, "parseGenre"); 76 + function parseGenreCode(code) { 77 + if (code === "RX") 78 + return "Remix"; 79 + if (code === "CR") 80 + return "Cover"; 81 + if (code.match(/^\d*$/)) { 82 + return Genres[Number.parseInt(code, 10)]; 83 + } 84 + } 85 + __name(parseGenreCode, "parseGenreCode"); 86 + var FrameParser = class _FrameParser { 87 + static { 88 + __name(this, "FrameParser"); 89 + } 90 + /** 91 + * Create id3v2 frame parser 92 + * @param major - Major version, e.g. (4) for id3v2.4 93 + * @param warningCollector - Used to collect decode issue 94 + */ 95 + constructor(major, warningCollector) { 96 + this.major = major; 97 + this.warningCollector = warningCollector; 98 + } 99 + readData(uint8Array, type, includeCovers) { 100 + if (uint8Array.length === 0) { 101 + this.warningCollector.addWarning(`id3v2.${this.major} header has empty tag type=${type}`); 102 + return; 103 + } 104 + const { encoding, bom } = TextEncodingToken.get(uint8Array, 0); 105 + const length = uint8Array.length; 106 + let offset = 0; 107 + let output = []; 108 + const nullTerminatorLength = _FrameParser.getNullTerminatorLength(encoding); 109 + let fzero; 110 + debug(`Parsing tag type=${type}, encoding=${encoding}, bom=${bom}`); 111 + switch (type !== "TXXX" && type[0] === "T" ? "T*" : type) { 112 + case "T*": 113 + // 4.2.1. Text information frames - details 114 + case "GRP1": 115 + // iTunes-specific ID3v2 grouping field 116 + case "IPLS": 117 + // v2.3: Involved people list 118 + case "MVIN": 119 + case "MVNM": 120 + case "PCS": 121 + case "PCST": { 122 + let text; 123 + try { 124 + text = _FrameParser.trimNullPadding(decodeString(uint8Array.subarray(1), encoding)); 125 + } catch (error) { 126 + if (error instanceof Error) { 127 + this.warningCollector.addWarning(`id3v2.${this.major} type=${type} header has invalid string value: ${error.message}`); 128 + break; 129 + } 130 + throw error; 131 + } 132 + switch (type) { 133 + case "TMCL": 134 + // Musician credits list 135 + case "TIPL": 136 + // Involved people list 137 + case "IPLS": 138 + output = _FrameParser.functionList(this.splitValue(type, text)); 139 + break; 140 + case "TRK": 141 + case "TRCK": 142 + case "TPOS": 143 + output = text; 144 + break; 145 + case "TCOM": 146 + case "TEXT": 147 + case "TOLY": 148 + case "TOPE": 149 + case "TPE1": 150 + case "TSRC": 151 + output = this.splitValue(type, text); 152 + break; 153 + case "TCO": 154 + case "TCON": 155 + output = this.splitValue(type, text).map((v) => parseGenre(v)).reduce((acc, val) => acc.concat(val), []); 156 + break; 157 + case "PCS": 158 + case "PCST": 159 + output = this.major >= 4 ? this.splitValue(type, text) : [text]; 160 + output = Array.isArray(output) && output[0] === "" ? 1 : 0; 161 + break; 162 + default: 163 + output = this.major >= 4 ? this.splitValue(type, text) : [text]; 164 + } 165 + break; 166 + } 167 + case "TXXX": { 168 + const idAndData = _FrameParser.readIdentifierAndData(uint8Array.subarray(1), encoding); 169 + const textTag = { 170 + description: idAndData.id, 171 + text: this.splitValue(type, decodeString(idAndData.data, encoding).replace(/\x00+$/, "")) 172 + }; 173 + output = textTag; 174 + break; 175 + } 176 + case "PIC": 177 + case "APIC": 178 + if (includeCovers) { 179 + const pic = {}; 180 + uint8Array = uint8Array.subarray(1); 181 + switch (this.major) { 182 + case 2: 183 + pic.format = decodeString(uint8Array.subarray(0, 3), "latin1"); 184 + uint8Array = uint8Array.subarray(3); 185 + break; 186 + case 3: 187 + case 4: 188 + fzero = findZero(uint8Array, defaultEnc); 189 + pic.format = decodeString(uint8Array.subarray(0, fzero), defaultEnc); 190 + uint8Array = uint8Array.subarray(fzero + 1); 191 + break; 192 + default: 193 + throw makeUnexpectedMajorVersionError(this.major); 194 + } 195 + pic.format = _FrameParser.fixPictureMimeType(pic.format); 196 + pic.type = AttachedPictureType[uint8Array[0]]; 197 + uint8Array = uint8Array.subarray(1); 198 + fzero = findZero(uint8Array, encoding); 199 + pic.description = decodeString(uint8Array.subarray(0, fzero), encoding); 200 + uint8Array = uint8Array.subarray(fzero + nullTerminatorLength); 201 + pic.data = uint8Array; 202 + output = pic; 203 + } 204 + break; 205 + case "CNT": 206 + case "PCNT": 207 + output = decodeUintBE(uint8Array); 208 + break; 209 + case "SYLT": { 210 + const syltHeader = SyncTextHeader.get(uint8Array, 0); 211 + uint8Array = uint8Array.subarray(SyncTextHeader.len); 212 + const result = { 213 + descriptor: "", 214 + language: syltHeader.language, 215 + contentType: syltHeader.contentType, 216 + timeStampFormat: syltHeader.timeStampFormat, 217 + syncText: [] 218 + }; 219 + let readSyllables = false; 220 + while (uint8Array.length > 0) { 221 + const nullStr = _FrameParser.readNullTerminatedString(uint8Array, syltHeader.encoding); 222 + uint8Array = uint8Array.subarray(nullStr.len); 223 + if (readSyllables) { 224 + const timestamp = UINT32_BE.get(uint8Array, 0); 225 + uint8Array = uint8Array.subarray(UINT32_BE.len); 226 + result.syncText.push({ 227 + text: nullStr.text, 228 + timestamp 229 + }); 230 + } else { 231 + result.descriptor = nullStr.text; 232 + readSyllables = true; 233 + } 234 + } 235 + output = result; 236 + break; 237 + } 238 + case "ULT": 239 + case "USLT": 240 + case "COM": 241 + case "COMM": { 242 + const textHeader = TextHeader.get(uint8Array, offset); 243 + offset += TextHeader.len; 244 + const descriptorStr = _FrameParser.readNullTerminatedString(uint8Array.subarray(offset), textHeader.encoding); 245 + offset += descriptorStr.len; 246 + const textStr = _FrameParser.readNullTerminatedString(uint8Array.subarray(offset), textHeader.encoding); 247 + const comment = { 248 + language: textHeader.language, 249 + descriptor: descriptorStr.text, 250 + text: textStr.text 251 + }; 252 + output = comment; 253 + break; 254 + } 255 + case "UFID": { 256 + const ufid = _FrameParser.readIdentifierAndData(uint8Array, defaultEnc); 257 + output = { owner_identifier: ufid.id, identifier: ufid.data }; 258 + break; 259 + } 260 + case "PRIV": { 261 + const priv = _FrameParser.readIdentifierAndData(uint8Array, defaultEnc); 262 + output = { owner_identifier: priv.id, data: priv.data }; 263 + break; 264 + } 265 + case "POPM": { 266 + uint8Array = uint8Array.subarray(offset); 267 + const emailStr = _FrameParser.readNullTerminatedString(uint8Array, urlEnc); 268 + const email = emailStr.text; 269 + uint8Array = uint8Array.subarray(emailStr.len); 270 + if (uint8Array.length === 0) { 271 + this.warningCollector.addWarning(`id3v2.${this.major} type=${type} POPM frame missing rating byte`); 272 + output = { email, rating: 0, counter: void 0 }; 273 + break; 274 + } 275 + const rating = UINT8.get(uint8Array, 0); 276 + const counterBytes = uint8Array.subarray(UINT8.len); 277 + output = { 278 + email, 279 + rating, 280 + counter: counterBytes.length > 0 ? decodeUintBE(counterBytes) : void 0 281 + }; 282 + break; 283 + } 284 + case "GEOB": { 285 + const encoding2 = TextEncodingToken.get(uint8Array, 0); 286 + uint8Array = uint8Array.subarray(1); 287 + const mimeTypeStr = _FrameParser.readNullTerminatedString(uint8Array, urlEnc); 288 + const mimeType = mimeTypeStr.text; 289 + uint8Array = uint8Array.subarray(mimeTypeStr.len); 290 + const filenameStr = _FrameParser.readNullTerminatedString(uint8Array, encoding2); 291 + const filename = filenameStr.text; 292 + uint8Array = uint8Array.subarray(filenameStr.len); 293 + const descriptionStr = _FrameParser.readNullTerminatedString(uint8Array, encoding2); 294 + const description = descriptionStr.text; 295 + uint8Array = uint8Array.subarray(descriptionStr.len); 296 + const geob = { 297 + type: mimeType, 298 + filename, 299 + description, 300 + data: uint8Array 301 + }; 302 + output = geob; 303 + break; 304 + } 305 + // W-Frames: 306 + case "WCOM": 307 + case "WCOP": 308 + case "WOAF": 309 + case "WOAR": 310 + case "WOAS": 311 + case "WORS": 312 + case "WPAY": 313 + case "WPUB": 314 + output = _FrameParser.readNullTerminatedString(uint8Array, urlEnc).text; 315 + break; 316 + case "WXXX": { 317 + const encoding2 = TextEncodingToken.get(uint8Array, 0); 318 + uint8Array = uint8Array.subarray(1); 319 + const descriptionStr = _FrameParser.readNullTerminatedString(uint8Array, encoding2); 320 + const description = descriptionStr.text; 321 + uint8Array = uint8Array.subarray(descriptionStr.len); 322 + output = { description, url: _FrameParser.trimNullPadding(decodeString(uint8Array, defaultEnc)) }; 323 + break; 324 + } 325 + case "WFD": 326 + case "WFED": { 327 + const encoding2 = TextEncodingToken.get(uint8Array, 0); 328 + uint8Array = uint8Array.subarray(1); 329 + output = _FrameParser.readNullTerminatedString(uint8Array, encoding2).text; 330 + break; 331 + } 332 + case "MCDI": { 333 + output = uint8Array.subarray(0, length); 334 + break; 335 + } 336 + default: 337 + debug(`Warning: unsupported id3v2-tag-type: ${type}`); 338 + break; 339 + } 340 + return output; 341 + } 342 + static readNullTerminatedString(uint8Array, encoding) { 343 + const bomSize = encoding.bom ? 2 : 0; 344 + const originalLen = uint8Array.length; 345 + const valueArray = uint8Array.subarray(bomSize); 346 + const zeroIndex = findZero(valueArray, encoding.encoding); 347 + if (zeroIndex >= valueArray.length) { 348 + return { 349 + text: decodeString(valueArray, encoding.encoding), 350 + len: originalLen 351 + }; 352 + } 353 + const txt = valueArray.subarray(0, zeroIndex); 354 + return { 355 + text: decodeString(txt, encoding.encoding), 356 + len: bomSize + zeroIndex + _FrameParser.getNullTerminatorLength(encoding.encoding) 357 + }; 358 + } 359 + static fixPictureMimeType(pictureType) { 360 + pictureType = pictureType.toLocaleLowerCase(); 361 + switch (pictureType) { 362 + case "jpg": 363 + return "image/jpeg"; 364 + case "png": 365 + return "image/png"; 366 + } 367 + return pictureType; 368 + } 369 + /** 370 + * Converts TMCL (Musician credits list) or TIPL (Involved people list) 371 + * @param entries 372 + */ 373 + static functionList(entries) { 374 + const res = {}; 375 + for (let i = 0; i + 1 < entries.length; i += 2) { 376 + const names = entries[i + 1].split(","); 377 + res[entries[i]] = res[entries[i]] ? res[entries[i]].concat(names) : names; 378 + } 379 + return res; 380 + } 381 + /** 382 + * id3v2.4 defines that multiple T* values are separated by 0x00 383 + * id3v2.3 defines that TCOM, TEXT, TOLY, TOPE & TPE1 values are separated by / 384 + * @param tag - Tag name 385 + * @param text - Concatenated tag value 386 + * @returns Split tag value 387 + */ 388 + splitValue(tag, text) { 389 + let values; 390 + if (this.major < 4) { 391 + values = text.split(/\x00/g); 392 + if (values.length > 1) { 393 + this.warningCollector.addWarning(`ID3v2.${this.major} ${tag} uses non standard null-separator.`); 394 + } else { 395 + values = text.split(/\//g); 396 + } 397 + } else { 398 + values = text.split(/\x00/g); 399 + } 400 + return _FrameParser.trimArray(values); 401 + } 402 + static trimArray(values) { 403 + return values.map((value) => _FrameParser.trimNullPadding(value).trim()); 404 + } 405 + static trimNullPadding(value) { 406 + let end = value.length; 407 + while (end > 0 && value.charCodeAt(end - 1) === 0) { 408 + end--; 409 + } 410 + return end === value.length ? value : value.slice(0, end); 411 + } 412 + static readIdentifierAndData(uint8Array, encoding) { 413 + const idStr = _FrameParser.readNullTerminatedString(uint8Array, { encoding, bom: false }); 414 + return { id: idStr.text, data: uint8Array.subarray(idStr.len) }; 415 + } 416 + static getNullTerminatorLength(enc) { 417 + return enc.startsWith("utf-16") ? 2 : 1; 418 + } 419 + }; 420 + var Id3v2ContentError = class extends makeUnexpectedFileContentError("id3v2") { 421 + static { 422 + __name(this, "Id3v2ContentError"); 423 + } 424 + }; 425 + function makeUnexpectedMajorVersionError(majorVer) { 426 + throw new Id3v2ContentError(`Unexpected majorVer: ${majorVer}`); 427 + } 428 + __name(makeUnexpectedMajorVersionError, "makeUnexpectedMajorVersionError"); 429 + 430 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/id3v2/FrameHeader.js 431 + function getFrameHeaderLength(majorVer) { 432 + switch (majorVer) { 433 + case 2: 434 + return 6; 435 + case 3: 436 + case 4: 437 + return 10; 438 + default: 439 + throw makeUnexpectedMajorVersionError2(majorVer); 440 + } 441 + } 442 + __name(getFrameHeaderLength, "getFrameHeaderLength"); 443 + function readFrameFlags(b) { 444 + return { 445 + status: { 446 + tag_alter_preservation: getBit(b, 0, 6), 447 + file_alter_preservation: getBit(b, 0, 5), 448 + read_only: getBit(b, 0, 4) 449 + }, 450 + format: { 451 + grouping_identity: getBit(b, 1, 7), 452 + compression: getBit(b, 1, 3), 453 + encryption: getBit(b, 1, 2), 454 + unsynchronisation: getBit(b, 1, 1), 455 + data_length_indicator: getBit(b, 1, 0) 456 + } 457 + }; 458 + } 459 + __name(readFrameFlags, "readFrameFlags"); 460 + function readFrameHeader(uint8Array, majorVer, warningCollector) { 461 + switch (majorVer) { 462 + case 2: 463 + return parseFrameHeaderV22(uint8Array, majorVer, warningCollector); 464 + case 3: 465 + case 4: 466 + return parseFrameHeaderV23V24(uint8Array, majorVer, warningCollector); 467 + default: 468 + throw makeUnexpectedMajorVersionError2(majorVer); 469 + } 470 + } 471 + __name(readFrameHeader, "readFrameHeader"); 472 + function parseFrameHeaderV22(uint8Array, majorVer, warningCollector) { 473 + const header = { 474 + id: textDecode(uint8Array.subarray(0, 3), "ascii"), 475 + length: UINT24_BE.get(uint8Array, 3) 476 + }; 477 + if (!header.id.match(/^[A-Z0-9]{3}$/)) { 478 + warningCollector.addWarning(`Invalid ID3v2.${majorVer} frame-header-ID: ${header.id}`); 479 + } 480 + return header; 481 + } 482 + __name(parseFrameHeaderV22, "parseFrameHeaderV22"); 483 + function parseFrameHeaderV23V24(uint8Array, majorVer, warningCollector) { 484 + const header = { 485 + id: textDecode(uint8Array.subarray(0, 4), "ascii"), 486 + length: (majorVer === 4 ? UINT32SYNCSAFE : UINT32_BE).get(uint8Array, 4), 487 + flags: readFrameFlags(uint8Array.subarray(8, 10)) 488 + }; 489 + if (!header.id.match(/^[A-Z0-9]{4}$/)) { 490 + warningCollector.addWarning(`Invalid ID3v2.${majorVer} frame-header-ID: ${header.id}`); 491 + } 492 + return header; 493 + } 494 + __name(parseFrameHeaderV23V24, "parseFrameHeaderV23V24"); 495 + function makeUnexpectedMajorVersionError2(majorVer) { 496 + throw new Id3v2ContentError(`Unexpected majorVer: ${majorVer}`); 497 + } 498 + __name(makeUnexpectedMajorVersionError2, "makeUnexpectedMajorVersionError"); 499 + 500 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/id3v2/ID3v2Parser.js 501 + var ID3v2Parser = class _ID3v2Parser { 502 + static { 503 + __name(this, "ID3v2Parser"); 504 + } 505 + constructor() { 506 + this.tokenizer = void 0; 507 + this.id3Header = void 0; 508 + this.metadata = void 0; 509 + this.headerType = void 0; 510 + this.options = void 0; 511 + } 512 + static removeUnsyncBytes(buffer) { 513 + let readI = 0; 514 + let writeI = 0; 515 + while (readI < buffer.length - 1) { 516 + if (readI !== writeI) { 517 + buffer[writeI] = buffer[readI]; 518 + } 519 + readI += buffer[readI] === 255 && buffer[readI + 1] === 0 ? 2 : 1; 520 + writeI++; 521 + } 522 + if (readI < buffer.length) { 523 + buffer[writeI++] = buffer[readI]; 524 + } 525 + return buffer.subarray(0, writeI); 526 + } 527 + static readFrameData(uint8Array, frameHeader, majorVer, includeCovers, warningCollector) { 528 + const frameParser = new FrameParser(majorVer, warningCollector); 529 + switch (majorVer) { 530 + case 2: 531 + return frameParser.readData(uint8Array, frameHeader.id, includeCovers); 532 + case 3: 533 + case 4: 534 + if (frameHeader.flags?.format.unsynchronisation) { 535 + uint8Array = _ID3v2Parser.removeUnsyncBytes(uint8Array); 536 + } 537 + if (frameHeader.flags?.format.data_length_indicator) { 538 + uint8Array = uint8Array.subarray(4, uint8Array.length); 539 + } 540 + return frameParser.readData(uint8Array, frameHeader.id, includeCovers); 541 + default: 542 + throw makeUnexpectedMajorVersionError3(majorVer); 543 + } 544 + } 545 + /** 546 + * Create a combined tag key, of tag & description 547 + * @param tag e.g.: COM 548 + * @param description e.g. iTunPGAP 549 + * @returns string e.g. COM:iTunPGAP 550 + */ 551 + static makeDescriptionTagName(tag, description) { 552 + return tag + (description ? `:${description}` : ""); 553 + } 554 + async parse(metadata, tokenizer, options) { 555 + this.tokenizer = tokenizer; 556 + this.metadata = metadata; 557 + this.options = options; 558 + const id3Header = await this.tokenizer.readToken(ID3v2Header); 559 + if (id3Header.fileIdentifier !== "ID3") { 560 + throw new Id3v2ContentError("expected ID3-header file-identifier 'ID3' was not found"); 561 + } 562 + this.id3Header = id3Header; 563 + this.headerType = `ID3v2.${id3Header.version.major}`; 564 + return id3Header.flags.isExtendedHeader ? this.parseExtendedHeader() : this.parseId3Data(id3Header.size); 565 + } 566 + async parseExtendedHeader() { 567 + const extendedHeader = await this.tokenizer.readToken(ExtendedHeader); 568 + const dataRemaining = extendedHeader.size - ExtendedHeader.len; 569 + return dataRemaining > 0 ? this.parseExtendedHeaderData(dataRemaining, extendedHeader.size) : this.parseId3Data(this.id3Header.size - extendedHeader.size); 570 + } 571 + async parseExtendedHeaderData(dataRemaining, extendedHeaderSize) { 572 + await this.tokenizer.ignore(dataRemaining); 573 + return this.parseId3Data(this.id3Header.size - extendedHeaderSize); 574 + } 575 + async parseId3Data(dataLen) { 576 + const uint8Array = await this.tokenizer.readToken(new Uint8ArrayType(dataLen)); 577 + for (const tag of this.parseMetadata(uint8Array)) { 578 + switch (tag.id) { 579 + case "TXXX": 580 + if (tag.value) { 581 + await this.handleTag(tag, tag.value.text, () => tag.value.description); 582 + } 583 + break; 584 + default: 585 + await (Array.isArray(tag.value) ? Promise.all(tag.value.map((value) => this.addTag(tag.id, value))) : this.addTag(tag.id, tag.value)); 586 + } 587 + } 588 + } 589 + async handleTag(tag, values, descriptor, resolveValue = (value) => value) { 590 + await Promise.all(values.map((value) => this.addTag(_ID3v2Parser.makeDescriptionTagName(tag.id, descriptor(value)), resolveValue(value)))); 591 + } 592 + async addTag(id, value) { 593 + await this.metadata.addTag(this.headerType, id, value); 594 + } 595 + parseMetadata(data) { 596 + let offset = 0; 597 + const tags = []; 598 + while (true) { 599 + if (offset === data.length) 600 + break; 601 + const frameHeaderLength = getFrameHeaderLength(this.id3Header.version.major); 602 + if (offset + frameHeaderLength > data.length) { 603 + this.metadata.addWarning("Illegal ID3v2 tag length"); 604 + break; 605 + } 606 + const frameHeaderBytes = data.subarray(offset, offset + frameHeaderLength); 607 + offset += frameHeaderLength; 608 + const frameHeader = readFrameHeader(frameHeaderBytes, this.id3Header.version.major, this.metadata); 609 + const frameDataBytes = data.subarray(offset, offset + frameHeader.length); 610 + offset += frameHeader.length; 611 + const values = _ID3v2Parser.readFrameData(frameDataBytes, frameHeader, this.id3Header.version.major, !this.options.skipCovers, this.metadata); 612 + if (values) { 613 + tags.push({ id: frameHeader.id, value: values }); 614 + } 615 + } 616 + return tags; 617 + } 618 + }; 619 + function makeUnexpectedMajorVersionError3(majorVer) { 620 + throw new Id3v2ContentError(`Unexpected majorVer: ${majorVer}`); 621 + } 622 + __name(makeUnexpectedMajorVersionError3, "makeUnexpectedMajorVersionError"); 623 + 624 + export { 625 + ID3v2Parser 626 + }; 627 + 628 + //# sourceMappingURL=./chunk-QOFAJIKO.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-QOFAJIKO.js.map
··· 1 + {"version":3,"sources":["/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/id3v2/FrameParser.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/id3v2/FrameHeader.js","/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/id3v2/ID3v2Parser.js"],"sourcesContent":["import initDebug from 'debug';\nimport * as Token from 'token-types';\nimport * as util from '../common/Util.js';\nimport { AttachedPictureType, SyncTextHeader, TextEncodingToken, TextHeader } from './ID3v2Token.js';\nimport { Genres } from '../id3v1/ID3v1Parser.js';\nimport { makeUnexpectedFileContentError } from '../ParseError.js';\nimport { decodeUintBE } from '../common/Util.js';\nconst debug = initDebug('music-metadata:id3v2:frame-parser');\nconst defaultEnc = 'latin1'; // latin1 == iso-8859-1;\nconst urlEnc = { encoding: defaultEnc, bom: false };\nexport function parseGenre(origVal) {\n // match everything inside parentheses\n const genres = [];\n let code;\n let word = '';\n for (const c of origVal) {\n if (typeof code === 'string') {\n if (c === '(' && code === '') {\n word += '(';\n code = undefined;\n }\n else if (c === ')') {\n if (word !== '') {\n genres.push(word);\n word = '';\n }\n const genre = parseGenreCode(code);\n if (genre) {\n genres.push(genre);\n }\n code = undefined;\n }\n else\n code += c;\n }\n else if (c === '(') {\n code = '';\n }\n else {\n word += c;\n }\n }\n if (word) {\n if (genres.length === 0 && word.match(/^\\d*$/)) {\n word = parseGenreCode(word);\n }\n if (word) {\n genres.push(word);\n }\n }\n return genres;\n}\nfunction parseGenreCode(code) {\n if (code === 'RX')\n return 'Remix';\n if (code === 'CR')\n return 'Cover';\n if (code.match(/^\\d*$/)) {\n return Genres[Number.parseInt(code, 10)];\n }\n}\nexport class FrameParser {\n /**\n * Create id3v2 frame parser\n * @param major - Major version, e.g. (4) for id3v2.4\n * @param warningCollector - Used to collect decode issue\n */\n constructor(major, warningCollector) {\n this.major = major;\n this.warningCollector = warningCollector;\n }\n readData(uint8Array, type, includeCovers) {\n if (uint8Array.length === 0) {\n this.warningCollector.addWarning(`id3v2.${this.major} header has empty tag type=${type}`);\n return;\n }\n const { encoding, bom } = TextEncodingToken.get(uint8Array, 0);\n const length = uint8Array.length;\n let offset = 0;\n let output = []; // ToDo\n const nullTerminatorLength = FrameParser.getNullTerminatorLength(encoding);\n let fzero;\n debug(`Parsing tag type=${type}, encoding=${encoding}, bom=${bom}`);\n switch (type !== 'TXXX' && type[0] === 'T' ? 'T*' : type) {\n case 'T*': // 4.2.1. Text information frames - details\n case 'GRP1': // iTunes-specific ID3v2 grouping field\n case 'IPLS': // v2.3: Involved people list\n case 'MVIN':\n case 'MVNM':\n case 'PCS':\n case 'PCST': {\n let text;\n try {\n text = FrameParser.trimNullPadding(util.decodeString(uint8Array.subarray(1), encoding));\n }\n catch (error) {\n if (error instanceof Error) {\n this.warningCollector.addWarning(`id3v2.${this.major} type=${type} header has invalid string value: ${error.message}`);\n break;\n }\n throw error;\n }\n switch (type) {\n case 'TMCL': // Musician credits list\n case 'TIPL': // Involved people list\n case 'IPLS': // Involved people list\n output = FrameParser.functionList(this.splitValue(type, text));\n break;\n case 'TRK':\n case 'TRCK':\n case 'TPOS':\n output = text;\n break;\n case 'TCOM':\n case 'TEXT':\n case 'TOLY':\n case 'TOPE':\n case 'TPE1':\n case 'TSRC':\n // id3v2.3 defines that TCOM, TEXT, TOLY, TOPE & TPE1 values are separated by /\n output = this.splitValue(type, text);\n break;\n case 'TCO':\n case 'TCON':\n output = this.splitValue(type, text).map(v => parseGenre(v)).reduce((acc, val) => acc.concat(val), []);\n break;\n case 'PCS':\n case 'PCST':\n // TODO: Why `default` not results `1` but `''`?\n output = this.major >= 4 ? this.splitValue(type, text) : [text];\n output = (Array.isArray(output) && output[0] === '') ? 1 : 0;\n break;\n default:\n output = this.major >= 4 ? this.splitValue(type, text) : [text];\n }\n break;\n }\n case 'TXXX': {\n const idAndData = FrameParser.readIdentifierAndData(uint8Array.subarray(1), encoding);\n const textTag = {\n description: idAndData.id,\n text: this.splitValue(type, util.decodeString(idAndData.data, encoding).replace(/\\x00+$/, ''))\n };\n output = textTag;\n break;\n }\n case 'PIC':\n case 'APIC':\n if (includeCovers) {\n const pic = {};\n uint8Array = uint8Array.subarray(1);\n switch (this.major) {\n case 2:\n pic.format = util.decodeString(uint8Array.subarray(0, 3), 'latin1'); // 'latin1'; // latin1 == iso-8859-1;\n uint8Array = uint8Array.subarray(3);\n break;\n case 3:\n case 4:\n fzero = util.findZero(uint8Array, defaultEnc);\n pic.format = util.decodeString(uint8Array.subarray(0, fzero), defaultEnc);\n uint8Array = uint8Array.subarray(fzero + 1);\n break;\n default:\n throw makeUnexpectedMajorVersionError(this.major);\n }\n pic.format = FrameParser.fixPictureMimeType(pic.format);\n pic.type = AttachedPictureType[uint8Array[0]];\n uint8Array = uint8Array.subarray(1);\n fzero = util.findZero(uint8Array, encoding);\n pic.description = util.decodeString(uint8Array.subarray(0, fzero), encoding);\n uint8Array = uint8Array.subarray(fzero + nullTerminatorLength);\n pic.data = uint8Array;\n output = pic;\n }\n break;\n case 'CNT':\n case 'PCNT':\n output = decodeUintBE(uint8Array);\n break;\n case 'SYLT': {\n const syltHeader = SyncTextHeader.get(uint8Array, 0);\n uint8Array = uint8Array.subarray(SyncTextHeader.len);\n const result = {\n descriptor: '',\n language: syltHeader.language,\n contentType: syltHeader.contentType,\n timeStampFormat: syltHeader.timeStampFormat,\n syncText: []\n };\n let readSyllables = false;\n while (uint8Array.length > 0) {\n const nullStr = FrameParser.readNullTerminatedString(uint8Array, syltHeader.encoding);\n uint8Array = uint8Array.subarray(nullStr.len);\n if (readSyllables) {\n const timestamp = Token.UINT32_BE.get(uint8Array, 0);\n uint8Array = uint8Array.subarray(Token.UINT32_BE.len);\n result.syncText.push({\n text: nullStr.text,\n timestamp\n });\n }\n else {\n result.descriptor = nullStr.text;\n readSyllables = true;\n }\n }\n output = result;\n break;\n }\n case 'ULT':\n case 'USLT':\n case 'COM':\n case 'COMM': {\n const textHeader = TextHeader.get(uint8Array, offset);\n offset += TextHeader.len;\n const descriptorStr = FrameParser.readNullTerminatedString(uint8Array.subarray(offset), textHeader.encoding);\n offset += descriptorStr.len;\n const textStr = FrameParser.readNullTerminatedString(uint8Array.subarray(offset), textHeader.encoding);\n const comment = {\n language: textHeader.language,\n descriptor: descriptorStr.text,\n text: textStr.text\n };\n output = comment;\n break;\n }\n case 'UFID': {\n const ufid = FrameParser.readIdentifierAndData(uint8Array, defaultEnc);\n output = { owner_identifier: ufid.id, identifier: ufid.data };\n break;\n }\n case 'PRIV': { // private frame\n const priv = FrameParser.readIdentifierAndData(uint8Array, defaultEnc);\n output = { owner_identifier: priv.id, data: priv.data };\n break;\n }\n case 'POPM': { // Popularimeter\n uint8Array = uint8Array.subarray(offset);\n const emailStr = FrameParser.readNullTerminatedString(uint8Array, urlEnc);\n const email = emailStr.text;\n uint8Array = uint8Array.subarray(emailStr.len);\n if (uint8Array.length === 0) {\n this.warningCollector.addWarning(`id3v2.${this.major} type=${type} POPM frame missing rating byte`);\n output = { email, rating: 0, counter: undefined };\n break;\n }\n const rating = Token.UINT8.get(uint8Array, 0);\n const counterBytes = uint8Array.subarray(Token.UINT8.len);\n output = {\n email,\n rating,\n counter: counterBytes.length > 0 ? decodeUintBE(counterBytes) : undefined\n };\n break;\n }\n case 'GEOB': { // General encapsulated object\n // [encoding] <MIME> 0x00 <filename> 0x00/0x00 0x00 <description> 0x00/0x00 0x00 <data>\n const encoding = TextEncodingToken.get(uint8Array, 0);\n uint8Array = uint8Array.subarray(1);\n const mimeTypeStr = FrameParser.readNullTerminatedString(uint8Array, urlEnc);\n const mimeType = mimeTypeStr.text;\n uint8Array = uint8Array.subarray(mimeTypeStr.len);\n const filenameStr = FrameParser.readNullTerminatedString(uint8Array, encoding);\n const filename = filenameStr.text;\n uint8Array = uint8Array.subarray(filenameStr.len);\n const descriptionStr = FrameParser.readNullTerminatedString(uint8Array, encoding);\n const description = descriptionStr.text;\n uint8Array = uint8Array.subarray(descriptionStr.len);\n const geob = {\n type: mimeType,\n filename,\n description,\n data: uint8Array\n };\n output = geob;\n break;\n }\n // W-Frames:\n case 'WCOM':\n case 'WCOP':\n case 'WOAF':\n case 'WOAR':\n case 'WOAS':\n case 'WORS':\n case 'WPAY':\n case 'WPUB':\n // Decode URL\n output = FrameParser.readNullTerminatedString(uint8Array, urlEnc).text;\n break;\n case 'WXXX': {\n // [encoding] <description> 0x00/0x00 0x00 <url>\n const encoding = TextEncodingToken.get(uint8Array, 0);\n uint8Array = uint8Array.subarray(1);\n const descriptionStr = FrameParser.readNullTerminatedString(uint8Array, encoding);\n const description = descriptionStr.text;\n uint8Array = uint8Array.subarray(descriptionStr.len);\n // URL is always ISO-8859-1\n output = { description, url: FrameParser.trimNullPadding(util.decodeString(uint8Array, defaultEnc)) };\n break;\n }\n case 'WFD':\n case 'WFED': {\n const encoding = TextEncodingToken.get(uint8Array, 0);\n uint8Array = uint8Array.subarray(1);\n output = FrameParser.readNullTerminatedString(uint8Array, encoding).text;\n break;\n }\n case 'MCDI': {\n // Music CD identifier\n output = uint8Array.subarray(0, length);\n break;\n }\n default:\n debug(`Warning: unsupported id3v2-tag-type: ${type}`);\n break;\n }\n return output;\n }\n static readNullTerminatedString(uint8Array, encoding) {\n const bomSize = encoding.bom ? 2 : 0;\n const originalLen = uint8Array.length;\n const valueArray = uint8Array.subarray(bomSize);\n const zeroIndex = util.findZero(valueArray, encoding.encoding);\n if (zeroIndex >= valueArray.length) {\n // No terminator found, decode full buffer remainder\n return {\n text: util.decodeString(valueArray, encoding.encoding),\n len: originalLen\n };\n }\n const txt = valueArray.subarray(0, zeroIndex);\n return {\n text: util.decodeString(txt, encoding.encoding),\n len: bomSize + zeroIndex + FrameParser.getNullTerminatorLength(encoding.encoding)\n };\n }\n static fixPictureMimeType(pictureType) {\n pictureType = pictureType.toLocaleLowerCase();\n switch (pictureType) {\n case 'jpg':\n return 'image/jpeg';\n case 'png':\n return 'image/png';\n }\n return pictureType;\n }\n /**\n * Converts TMCL (Musician credits list) or TIPL (Involved people list)\n * @param entries\n */\n static functionList(entries) {\n const res = {};\n for (let i = 0; i + 1 < entries.length; i += 2) {\n const names = entries[i + 1].split(',');\n res[entries[i]] = res[entries[i]] ? res[entries[i]].concat(names) : names;\n }\n return res;\n }\n /**\n * id3v2.4 defines that multiple T* values are separated by 0x00\n * id3v2.3 defines that TCOM, TEXT, TOLY, TOPE & TPE1 values are separated by /\n * @param tag - Tag name\n * @param text - Concatenated tag value\n * @returns Split tag value\n */\n splitValue(tag, text) {\n let values;\n if (this.major < 4) {\n values = text.split(/\\x00/g);\n if (values.length > 1) {\n this.warningCollector.addWarning(`ID3v2.${this.major} ${tag} uses non standard null-separator.`);\n }\n else {\n values = text.split(/\\//g);\n }\n }\n else {\n values = text.split(/\\x00/g);\n }\n return FrameParser.trimArray(values);\n }\n static trimArray(values) {\n return values.map(value => FrameParser.trimNullPadding(value).trim());\n }\n static trimNullPadding(value) {\n let end = value.length;\n while (end > 0 && value.charCodeAt(end - 1) === 0) {\n end--;\n }\n return end === value.length ? value : value.slice(0, end);\n }\n static readIdentifierAndData(uint8Array, encoding) {\n const idStr = FrameParser.readNullTerminatedString(uint8Array, { encoding, bom: false });\n return { id: idStr.text, data: uint8Array.subarray(idStr.len) };\n }\n static getNullTerminatorLength(enc) {\n return enc.startsWith('utf-16') ? 2 : 1;\n }\n}\nexport class Id3v2ContentError extends makeUnexpectedFileContentError('id3v2') {\n}\nfunction makeUnexpectedMajorVersionError(majorVer) {\n throw new Id3v2ContentError(`Unexpected majorVer: ${majorVer}`);\n}\n","// lib/id3v2/FrameHeader.ts\nimport * as Token from 'token-types';\nimport * as util from '../common/Util.js';\nimport { UINT32SYNCSAFE } from './ID3v2Token.js';\nimport { textDecode } from '@borewit/text-codec';\nimport { Id3v2ContentError } from './FrameParser.js';\n/**\n * Frame header length (bytes) depending on ID3v2 major version.\n */\nexport function getFrameHeaderLength(majorVer) {\n switch (majorVer) {\n case 2: return 6;\n case 3:\n case 4: return 10;\n default: throw makeUnexpectedMajorVersionError(majorVer);\n }\n}\nfunction readFrameFlags(b) {\n return {\n status: {\n tag_alter_preservation: util.getBit(b, 0, 6),\n file_alter_preservation: util.getBit(b, 0, 5),\n read_only: util.getBit(b, 0, 4)\n },\n format: {\n grouping_identity: util.getBit(b, 1, 7),\n compression: util.getBit(b, 1, 3),\n encryption: util.getBit(b, 1, 2),\n unsynchronisation: util.getBit(b, 1, 1),\n data_length_indicator: util.getBit(b, 1, 0)\n }\n };\n}\n/**\n * Factory: parse a frame header from its header bytes (6 for v2.2, 10 for v2.3/v2.4).\n *\n * Note: It only *parses* and does light validation. It does not read payload bytes.\n */\nexport function readFrameHeader(uint8Array, majorVer, warningCollector) {\n switch (majorVer) {\n case 2:\n return parseFrameHeaderV22(uint8Array, majorVer, warningCollector);\n case 3:\n case 4:\n return parseFrameHeaderV23V24(uint8Array, majorVer, warningCollector);\n default:\n throw makeUnexpectedMajorVersionError(majorVer);\n }\n}\nfunction parseFrameHeaderV22(uint8Array, majorVer, warningCollector) {\n const header = {\n id: textDecode(uint8Array.subarray(0, 3), 'ascii'),\n length: Token.UINT24_BE.get(uint8Array, 3)\n };\n if (!header.id.match(/^[A-Z0-9]{3}$/)) {\n warningCollector.addWarning(`Invalid ID3v2.${majorVer} frame-header-ID: ${header.id}`);\n }\n return header;\n}\nfunction parseFrameHeaderV23V24(uint8Array, majorVer, warningCollector) {\n const header = {\n id: textDecode(uint8Array.subarray(0, 4), 'ascii'),\n length: (majorVer === 4 ? UINT32SYNCSAFE : Token.UINT32_BE).get(uint8Array, 4),\n flags: readFrameFlags(uint8Array.subarray(8, 10))\n };\n if (!header.id.match(/^[A-Z0-9]{4}$/)) {\n warningCollector.addWarning(`Invalid ID3v2.${majorVer} frame-header-ID: ${header.id}`);\n }\n return header;\n}\nfunction makeUnexpectedMajorVersionError(majorVer) {\n throw new Id3v2ContentError(`Unexpected majorVer: ${majorVer}`);\n}\n","import * as Token from 'token-types';\nimport { FrameParser, Id3v2ContentError } from './FrameParser.js';\nimport { ExtendedHeader, ID3v2Header } from './ID3v2Token.js';\nimport { getFrameHeaderLength, readFrameHeader } from './FrameHeader.js';\nexport class ID3v2Parser {\n constructor() {\n this.tokenizer = undefined;\n this.id3Header = undefined;\n this.metadata = undefined;\n this.headerType = undefined;\n this.options = undefined;\n }\n static removeUnsyncBytes(buffer) {\n let readI = 0;\n let writeI = 0;\n while (readI < buffer.length - 1) {\n if (readI !== writeI) {\n buffer[writeI] = buffer[readI];\n }\n readI += (buffer[readI] === 0xFF && buffer[readI + 1] === 0) ? 2 : 1;\n writeI++;\n }\n if (readI < buffer.length) {\n buffer[writeI++] = buffer[readI];\n }\n return buffer.subarray(0, writeI);\n }\n static readFrameData(uint8Array, frameHeader, majorVer, includeCovers, warningCollector) {\n const frameParser = new FrameParser(majorVer, warningCollector);\n switch (majorVer) {\n case 2:\n return frameParser.readData(uint8Array, frameHeader.id, includeCovers);\n case 3:\n case 4:\n if (frameHeader.flags?.format.unsynchronisation) {\n uint8Array = ID3v2Parser.removeUnsyncBytes(uint8Array);\n }\n if (frameHeader.flags?.format.data_length_indicator) {\n uint8Array = uint8Array.subarray(4, uint8Array.length);\n }\n return frameParser.readData(uint8Array, frameHeader.id, includeCovers);\n default:\n throw makeUnexpectedMajorVersionError(majorVer);\n }\n }\n /**\n * Create a combined tag key, of tag & description\n * @param tag e.g.: COM\n * @param description e.g. iTunPGAP\n * @returns string e.g. COM:iTunPGAP\n */\n static makeDescriptionTagName(tag, description) {\n return tag + (description ? `:${description}` : '');\n }\n async parse(metadata, tokenizer, options) {\n this.tokenizer = tokenizer;\n this.metadata = metadata;\n this.options = options;\n const id3Header = await this.tokenizer.readToken(ID3v2Header);\n if (id3Header.fileIdentifier !== 'ID3') {\n throw new Id3v2ContentError('expected ID3-header file-identifier \\'ID3\\' was not found');\n }\n this.id3Header = id3Header;\n this.headerType = (`ID3v2.${id3Header.version.major}`);\n return id3Header.flags.isExtendedHeader ? this.parseExtendedHeader() : this.parseId3Data(id3Header.size);\n }\n async parseExtendedHeader() {\n const extendedHeader = await this.tokenizer.readToken(ExtendedHeader);\n const dataRemaining = extendedHeader.size - ExtendedHeader.len;\n return dataRemaining > 0 ? this.parseExtendedHeaderData(dataRemaining, extendedHeader.size) : this.parseId3Data(this.id3Header.size - extendedHeader.size);\n }\n async parseExtendedHeaderData(dataRemaining, extendedHeaderSize) {\n await this.tokenizer.ignore(dataRemaining);\n return this.parseId3Data(this.id3Header.size - extendedHeaderSize);\n }\n async parseId3Data(dataLen) {\n const uint8Array = await this.tokenizer.readToken(new Token.Uint8ArrayType(dataLen));\n for (const tag of this.parseMetadata(uint8Array)) {\n switch (tag.id) {\n case 'TXXX':\n if (tag.value) {\n await this.handleTag(tag, tag.value.text, () => tag.value.description);\n }\n break;\n default:\n await (Array.isArray(tag.value) ? Promise.all(tag.value.map(value => this.addTag(tag.id, value))) : this.addTag(tag.id, tag.value));\n }\n }\n }\n async handleTag(tag, values, descriptor, resolveValue = value => value) {\n await Promise.all(values.map(value => this.addTag(ID3v2Parser.makeDescriptionTagName(tag.id, descriptor(value)), resolveValue(value))));\n }\n async addTag(id, value) {\n await this.metadata.addTag(this.headerType, id, value);\n }\n parseMetadata(data) {\n let offset = 0;\n const tags = [];\n while (true) {\n if (offset === data.length)\n break;\n const frameHeaderLength = getFrameHeaderLength(this.id3Header.version.major);\n if (offset + frameHeaderLength > data.length) {\n this.metadata.addWarning('Illegal ID3v2 tag length');\n break;\n }\n const frameHeaderBytes = data.subarray(offset, offset + frameHeaderLength);\n offset += frameHeaderLength;\n const frameHeader = readFrameHeader(frameHeaderBytes, this.id3Header.version.major, this.metadata);\n const frameDataBytes = data.subarray(offset, offset + frameHeader.length);\n offset += frameHeader.length;\n const values = ID3v2Parser.readFrameData(frameDataBytes, frameHeader, this.id3Header.version.major, !this.options.skipCovers, this.metadata);\n if (values) {\n tags.push({ id: frameHeader.id, value: values });\n }\n }\n return tags;\n }\n}\nfunction makeUnexpectedMajorVersionError(majorVer) {\n throw new Id3v2ContentError(`Unexpected majorVer: ${majorVer}`);\n}\n"],"mappings":"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","names":["initDebug","encoding","makeUnexpectedMajorVersionError","makeUnexpectedMajorVersionError"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-QOFAJIKO.js.map"}
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-R72UCYY5.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-R72UCYY5.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-R72UCYY5.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-R72UCYY5.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-RYKCUUD7.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-RYKCUUD7.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-RYKCUUD7.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-RYKCUUD7.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-SGG7NSCF.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-SGG7NSCF.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-SGG7NSCF.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-SGG7NSCF.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-SRUOXJB6.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-SRUOXJB6.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-SRUOXJB6.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-SRUOXJB6.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-T3A2JWMA.js
··· 1 + ../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/chunk-T3A2JWMA.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-T3A2JWMA.js.map
··· 1 + ../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/chunk-T3A2JWMA.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-T7ZRMWZE.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-T7ZRMWZE.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-T7ZRMWZE.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-T7ZRMWZE.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-TBEAZQZQ.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-TBEAZQZQ.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-TBEAZQZQ.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-TBEAZQZQ.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-UBNX6MK2.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-UBNX6MK2.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-UBNX6MK2.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-UBNX6MK2.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-UDP6MTZR.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-UDP6MTZR.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-UDP6MTZR.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-UDP6MTZR.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-US7RU3UC.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-US7RU3UC.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-US7RU3UC.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-US7RU3UC.js.map
+188
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-UT643YRI.js
··· 1 + import { 2 + element_default as element_default6 3 + } from "./chunk-I4QT5UNG.js"; 4 + import { 5 + element_default as element_default11 6 + } from "./chunk-NEVFYBXS.js"; 7 + import { 8 + element_default as element_default13 9 + } from "./chunk-5U6EFMUU.js"; 10 + import { 11 + element_default 12 + } from "./chunk-UBNX6MK2.js"; 13 + import { 14 + element_default as element_default7 15 + } from "./chunk-IMYGW2WM.js"; 16 + import { 17 + element_default as element_default8 18 + } from "./chunk-WYFYW7EG.js"; 19 + import { 20 + element_default as element_default9 21 + } from "./chunk-G2LBW36E.js"; 22 + import { 23 + element_default as element_default10 24 + } from "./chunk-VTFKOL5E.js"; 25 + import { 26 + element_default as element_default12 27 + } from "./chunk-FIMGEMH3.js"; 28 + import { 29 + element_default as element_default4 30 + } from "./chunk-DR6IVCFO.js"; 31 + import { 32 + element_default as element_default5 33 + } from "./chunk-3SOBXJU4.js"; 34 + import { 35 + element_default as element_default2 36 + } from "./chunk-7J35BYGY.js"; 37 + import { 38 + element_default as element_default3 39 + } from "./chunk-N6PLTDUY.js"; 40 + import { 41 + __name 42 + } from "./chunk-7IARE43G.js"; 43 + 44 + // common/constituents/default.js 45 + var GROUP = "constituents"; 46 + function config() { 47 + const input = new element_default4(); 48 + input.setAttribute("group", GROUP); 49 + input.setAttribute("id", "input"); 50 + document.body.append(input); 51 + const output = new element_default5(); 52 + output.setAttribute("group", GROUP); 53 + output.setAttribute("id", "output"); 54 + document.body.append(output); 55 + const metadata = new element_default6(); 56 + metadata.setAttribute("group", GROUP); 57 + document.body.append(metadata); 58 + const opt = new element_default7(); 59 + opt.setAttribute("group", GROUP); 60 + opt.setAttribute("input-selector", input.selector); 61 + opt.setAttribute("output-selector", output.selector); 62 + opt.setAttribute("metadata-processor-selector", metadata.selector); 63 + opt.toggleAttribute("process-when-ready"); 64 + document.body.append(opt); 65 + function audio() { 66 + const a = new element_default2(); 67 + a.setAttribute("group", GROUP); 68 + addToBodyIfNeeded(a); 69 + return a; 70 + } 71 + __name(audio, "audio"); 72 + function queue() { 73 + const q = new element_default3(); 74 + q.setAttribute("group", GROUP); 75 + addToBodyIfNeeded(q); 76 + return q; 77 + } 78 + __name(queue, "queue"); 79 + function artwork() { 80 + const a = new element_default(); 81 + a.setAttribute("group", GROUP); 82 + addToBodyIfNeeded(a); 83 + return a; 84 + } 85 + __name(artwork, "artwork"); 86 + function search() { 87 + const s = new element_default11(); 88 + s.setAttribute("group", GROUP); 89 + addToBodyIfNeeded(s); 90 + return s; 91 + } 92 + __name(search, "search"); 93 + function queueAudio() { 94 + const a = audio(); 95 + const q = queue(); 96 + const oqa = new element_default8(); 97 + oqa.setAttribute("group", GROUP); 98 + oqa.setAttribute("audio-engine-selector", a.selector); 99 + oqa.setAttribute("input-selector", input.selector); 100 + oqa.setAttribute("queue-engine-selector", q.selector); 101 + addToBodyIfNeeded(oqa); 102 + return oqa; 103 + } 104 + __name(queueAudio, "queueAudio"); 105 + function queueTracks() { 106 + const q = queue(); 107 + const oqt = new element_default9(); 108 + oqt.setAttribute("group", GROUP); 109 + oqt.setAttribute("input-selector", input.selector); 110 + oqt.setAttribute("output-selector", output.selector); 111 + oqt.setAttribute("queue-engine-selector", q.selector); 112 + addToBodyIfNeeded(oqt); 113 + return oqt; 114 + } 115 + __name(queueTracks, "queueTracks"); 116 + function repeatShuffle() { 117 + const q = queue(); 118 + const ors = new element_default10(); 119 + ors.setAttribute("group", GROUP); 120 + ors.setAttribute("queue-engine-selector", q.selector); 121 + addToBodyIfNeeded(ors); 122 + return ors; 123 + } 124 + __name(repeatShuffle, "repeatShuffle"); 125 + function searchTracks() { 126 + const s = search(); 127 + const ost = new element_default12(); 128 + ost.setAttribute("group", GROUP); 129 + ost.setAttribute("input-selector", input.selector); 130 + ost.setAttribute("output-selector", output.selector); 131 + ost.setAttribute("search-processor-selector", s.selector); 132 + addToBodyIfNeeded(ost); 133 + return ost; 134 + } 135 + __name(searchTracks, "searchTracks"); 136 + function sources() { 137 + const so = new element_default13(); 138 + so.setAttribute("group", GROUP); 139 + so.setAttribute("input-selector", input.selector); 140 + so.setAttribute("output-selector", output.selector); 141 + addToBodyIfNeeded(so); 142 + return so; 143 + } 144 + __name(sources, "sources"); 145 + return { 146 + GROUP, 147 + engine: {}, 148 + orchestrator: { 149 + input, 150 + output, 151 + processTracks: opt 152 + }, 153 + processor: { 154 + metadata 155 + }, 156 + lazy: { 157 + engine: { 158 + audio, 159 + queue 160 + }, 161 + orchestrator: { 162 + queueAudio, 163 + queueTracks, 164 + repeatShuffle, 165 + searchTracks, 166 + sources 167 + }, 168 + processor: { 169 + artwork, 170 + search 171 + } 172 + } 173 + }; 174 + } 175 + __name(config, "config"); 176 + function addToBodyIfNeeded(element) { 177 + const alreadyAdded = document.body.querySelector(element.selector); 178 + if (!alreadyAdded) document.body.append(element); 179 + } 180 + __name(addToBodyIfNeeded, "addToBodyIfNeeded"); 181 + 182 + export { 183 + GROUP, 184 + config, 185 + addToBodyIfNeeded 186 + }; 187 + 188 + //# sourceMappingURL=./chunk-UT643YRI.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-UT643YRI.js.map
··· 1 + {"version":3,"sources":["/common/constituents/default.js"],"sourcesContent":["import ArtworkProcessor from \"@components/processor/artwork/element.js\";\nimport AudioEngine from \"@components/engine/audio/element.js\";\nimport Queue from \"@components/engine/queue/element.js\";\nimport InputOrchestrator from \"@components/orchestrator/input/element.js\";\nimport OutputOrchestrator from \"@components/orchestrator/output/element.js\";\nimport MetadataProcessor from \"@components/processor/metadata/element.js\";\nimport ProcessTracksOrchestrator from \"@components/orchestrator/process-tracks/element.js\";\nimport QueueAudioOrchestrator from \"@components/orchestrator/queue-audio/element.js\";\nimport QueueTracksOrchestrator from \"@components/orchestrator/queue-tracks/element.js\";\nimport RepeatShuffleOrchestrator from \"@components/orchestrator/repeat-shuffle/element.js\";\nimport SearchProcessor from \"@components/processor/search/element.js\";\nimport SearchTracksOrchestrator from \"@components/orchestrator/search-tracks/element.js\";\nimport SourcesOrchestrator from \"@components/orchestrator/sources/element.js\";\n\n/**\n * @import { DiffuseElement } from \"@toko/diffuse/common/element.js\";\n */\n\nexport const GROUP = \"constituents\";\n\n/**\n * Default config for constituents.\n */\nexport function config() {\n // Input\n const input = new InputOrchestrator();\n input.setAttribute(\"group\", GROUP);\n input.setAttribute(\"id\", \"input\");\n\n document.body.append(input);\n\n // Output\n const output = new OutputOrchestrator();\n output.setAttribute(\"group\", GROUP);\n output.setAttribute(\"id\", \"output\");\n\n document.body.append(output);\n\n // Processors\n const metadata = new MetadataProcessor();\n metadata.setAttribute(\"group\", GROUP);\n\n document.body.append(metadata);\n\n // Orchestrators\n const opt = new ProcessTracksOrchestrator();\n opt.setAttribute(\"group\", GROUP);\n opt.setAttribute(\"input-selector\", input.selector);\n opt.setAttribute(\"output-selector\", output.selector);\n opt.setAttribute(\"metadata-processor-selector\", metadata.selector);\n opt.toggleAttribute(\"process-when-ready\");\n\n document.body.append(opt);\n\n // LAZY\n // ----\n\n // Engines\n function audio() {\n const a = new AudioEngine();\n a.setAttribute(\"group\", GROUP);\n\n addToBodyIfNeeded(a);\n return a;\n }\n\n function queue() {\n const q = new Queue();\n q.setAttribute(\"group\", GROUP);\n\n addToBodyIfNeeded(q);\n return q;\n }\n\n // Processors\n function artwork() {\n const a = new ArtworkProcessor();\n a.setAttribute(\"group\", GROUP);\n\n addToBodyIfNeeded(a);\n return a;\n }\n\n function search() {\n const s = new SearchProcessor();\n s.setAttribute(\"group\", GROUP);\n\n addToBodyIfNeeded(s);\n return s;\n }\n\n // Orchestrators\n function queueAudio() {\n const a = audio();\n const q = queue();\n\n const oqa = new QueueAudioOrchestrator();\n oqa.setAttribute(\"group\", GROUP);\n oqa.setAttribute(\"audio-engine-selector\", a.selector);\n oqa.setAttribute(\"input-selector\", input.selector);\n oqa.setAttribute(\"queue-engine-selector\", q.selector);\n\n addToBodyIfNeeded(oqa);\n return oqa;\n }\n\n function queueTracks() {\n const q = queue();\n\n const oqt = new QueueTracksOrchestrator();\n oqt.setAttribute(\"group\", GROUP);\n oqt.setAttribute(\"input-selector\", input.selector);\n oqt.setAttribute(\"output-selector\", output.selector);\n oqt.setAttribute(\"queue-engine-selector\", q.selector);\n\n addToBodyIfNeeded(oqt);\n return oqt;\n }\n\n function repeatShuffle() {\n const q = queue();\n\n const ors = new RepeatShuffleOrchestrator();\n ors.setAttribute(\"group\", GROUP);\n ors.setAttribute(\"queue-engine-selector\", q.selector);\n\n addToBodyIfNeeded(ors);\n return ors;\n }\n\n function searchTracks() {\n const s = search();\n\n const ost = new SearchTracksOrchestrator();\n ost.setAttribute(\"group\", GROUP);\n ost.setAttribute(\"input-selector\", input.selector);\n ost.setAttribute(\"output-selector\", output.selector);\n ost.setAttribute(\"search-processor-selector\", s.selector);\n\n addToBodyIfNeeded(ost);\n return ost;\n }\n\n function sources() {\n const so = new SourcesOrchestrator();\n so.setAttribute(\"group\", GROUP);\n so.setAttribute(\"input-selector\", input.selector);\n so.setAttribute(\"output-selector\", output.selector);\n\n addToBodyIfNeeded(so);\n return so;\n }\n\n // Return elements\n return {\n GROUP,\n\n engine: {},\n orchestrator: {\n input,\n output,\n processTracks: opt,\n },\n processor: {\n metadata,\n },\n\n lazy: {\n engine: {\n audio,\n queue,\n },\n orchestrator: {\n queueAudio,\n queueTracks,\n repeatShuffle,\n searchTracks,\n sources,\n },\n processor: {\n artwork,\n search,\n },\n },\n };\n}\n\n/**\n * @param {DiffuseElement} element\n */\nexport function addToBodyIfNeeded(element) {\n const alreadyAdded = document.body.querySelector(element.selector);\n if (!alreadyAdded) document.body.append(element);\n}\n"],"mappings":"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","names":["element_default"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-UT643YRI.js.map"}
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-UWEF6NCQ.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-UWEF6NCQ.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-UWEF6NCQ.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-UWEF6NCQ.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-VBRRMXMF.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-VBRRMXMF.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-VBRRMXMF.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-VBRRMXMF.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-VHBDVMZU.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-VHBDVMZU.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-VHBDVMZU.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-VHBDVMZU.js.map
+77
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-VTFKOL5E.js
··· 1 + import { 2 + BroadcastableDiffuseElement, 3 + query 4 + } from "./chunk-AFAFCDHW.js"; 5 + import { 6 + signal 7 + } from "./chunk-SRUOXJB6.js"; 8 + import { 9 + __name 10 + } from "./chunk-7IARE43G.js"; 11 + 12 + // components/orchestrator/repeat-shuffle/element.js 13 + var RepeatShuffleOrchestrator = class extends BroadcastableDiffuseElement { 14 + static { 15 + __name(this, "RepeatShuffleOrchestrator"); 16 + } 17 + static NAME = "diffuse/orchestrator/repeat-shuffle"; 18 + // SIGNALS 19 + #repeat = signal(false); 20 + #shuffle = signal(false); 21 + repeat = this.#repeat.get; 22 + shuffle = this.#shuffle.get; 23 + // LIFECYCLE 24 + /** 25 + * @override 26 + */ 27 + async connectedCallback() { 28 + if (this.hasAttribute("group")) { 29 + this.broadcast(this.nameWithGroup, {}); 30 + } 31 + super.connectedCallback(); 32 + const queue = query(this, "queue-engine-selector"); 33 + this.queue = queue; 34 + const storagePrefix = `${this.constructor.prototype.constructor.NAME}/${this.group}/`; 35 + this.#repeat.value = localStorage.getItem(`${storagePrefix}/repeat`) === "true" ? true : false; 36 + this.#shuffle.value = localStorage.getItem(`${storagePrefix}/shuffle`) === "true" ? true : false; 37 + await customElements.whenDefined(queue.localName); 38 + this.effect(() => { 39 + const trigger = queue.now(); 40 + const _other_trigger = queue.supplyFingerprint(); 41 + this.isLeader().then((isLeader) => { 42 + if (!isLeader) return; 43 + queue.fill({ amount: 10, shuffled: this.#shuffle.value }); 44 + if (!trigger) queue.shift(); 45 + }); 46 + }); 47 + this.effect( 48 + () => localStorage.setItem( 49 + `${storagePrefix}/repeat`, 50 + this.#repeat.value ? "true" : "false" 51 + ) 52 + ); 53 + this.effect( 54 + () => localStorage.setItem( 55 + `${storagePrefix}/shuffle`, 56 + this.#shuffle.value ? "true" : "false" 57 + ) 58 + ); 59 + } 60 + // ACTIONS 61 + /** @param {boolean} bool */ 62 + setRepeat = /* @__PURE__ */ __name((bool) => this.#repeat.value = bool, "setRepeat"); 63 + /** @param {boolean} bool */ 64 + setShuffle = /* @__PURE__ */ __name((bool) => this.#shuffle.value = bool, "setShuffle"); 65 + }; 66 + var element_default = RepeatShuffleOrchestrator; 67 + var CLASS = RepeatShuffleOrchestrator; 68 + var NAME = "do-repeat-shuffle"; 69 + customElements.define(NAME, CLASS); 70 + 71 + export { 72 + element_default, 73 + CLASS, 74 + NAME 75 + }; 76 + 77 + //# sourceMappingURL=./chunk-VTFKOL5E.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-VTFKOL5E.js.map
··· 1 + {"version":3,"sources":["/components/orchestrator/repeat-shuffle/element.js"],"sourcesContent":["import { BroadcastableDiffuseElement, query } from \"@common/element.js\";\nimport { signal } from \"@common/signal.js\";\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\nclass RepeatShuffleOrchestrator extends BroadcastableDiffuseElement {\n static NAME = \"diffuse/orchestrator/repeat-shuffle\";\n\n // SIGNALS\n\n #repeat = signal(false);\n #shuffle = signal(false);\n\n repeat = this.#repeat.get;\n shuffle = this.#shuffle.get;\n\n // LIFECYCLE\n\n /**\n * @override\n */\n async connectedCallback() {\n // Broadcast if needed\n if (this.hasAttribute(\"group\")) {\n // TODO: Replicate state (repeat & shuffle)\n this.broadcast(this.nameWithGroup, {});\n }\n\n // Super\n super.connectedCallback();\n\n /** @type {import(\"@components/engine/queue/element.js\").CLASS} */\n const queue = query(this, \"queue-engine-selector\");\n\n // Assign to self\n this.queue = queue;\n\n // Signals\n const storagePrefix =\n `${this.constructor.prototype.constructor.NAME}/${this.group}/`;\n\n this.#repeat.value =\n localStorage.getItem(`${storagePrefix}/repeat`) === \"true\" ? true : false;\n this.#shuffle.value =\n localStorage.getItem(`${storagePrefix}/shuffle`) === \"true\"\n ? true\n : false;\n\n // Wait until defined\n await customElements.whenDefined(queue.localName);\n\n // Effects\n this.effect(() => {\n const trigger = queue.now();\n const _other_trigger = queue.supplyFingerprint();\n\n this.isLeader().then((isLeader) => {\n if (!isLeader) return;\n // TODO: What happens when shuffle changes here? Need to reset queue probably.\n queue.fill({ amount: 10, shuffled: this.#shuffle.value });\n if (!trigger) queue.shift();\n });\n });\n\n this.effect(() =>\n localStorage.setItem(\n `${storagePrefix}/repeat`,\n this.#repeat.value ? \"true\" : \"false\",\n )\n );\n\n this.effect(() =>\n localStorage.setItem(\n `${storagePrefix}/shuffle`,\n this.#shuffle.value ? \"true\" : \"false\",\n )\n );\n }\n\n // ACTIONS\n\n /** @param {boolean} bool */\n setRepeat = (bool) => this.#repeat.value = bool;\n\n /** @param {boolean} bool */\n setShuffle = (bool) => this.#shuffle.value = bool;\n}\n\nexport default RepeatShuffleOrchestrator;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = RepeatShuffleOrchestrator;\nexport const NAME = \"do-repeat-shuffle\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":";;;;;;;;;;;;AAOA,IAAM,4BAAN,cAAwC,4BAA4B;AAAA,EAPpE,OAOoE;AAAA;AAAA;AAAA,EAClE,OAAO,OAAO;AAAA;AAAA,EAId,UAAU,OAAO,KAAK;AAAA,EACtB,WAAW,OAAO,KAAK;AAAA,EAEvB,SAAS,KAAK,QAAQ;AAAA,EACtB,UAAU,KAAK,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAOxB,MAAM,oBAAoB;AAExB,QAAI,KAAK,aAAa,OAAO,GAAG;AAE9B,WAAK,UAAU,KAAK,eAAe,CAAC,CAAC;AAAA,IACvC;AAGA,UAAM,kBAAkB;AAGxB,UAAM,QAAQ,MAAM,MAAM,uBAAuB;AAGjD,SAAK,QAAQ;AAGb,UAAM,gBACJ,GAAG,KAAK,YAAY,UAAU,YAAY,IAAI,IAAI,KAAK,KAAK;AAE9D,SAAK,QAAQ,QACX,aAAa,QAAQ,GAAG,aAAa,SAAS,MAAM,SAAS,OAAO;AACtE,SAAK,SAAS,QACZ,aAAa,QAAQ,GAAG,aAAa,UAAU,MAAM,SACjD,OACA;AAGN,UAAM,eAAe,YAAY,MAAM,SAAS;AAGhD,SAAK,OAAO,MAAM;AAChB,YAAM,UAAU,MAAM,IAAI;AAC1B,YAAM,iBAAiB,MAAM,kBAAkB;AAE/C,WAAK,SAAS,EAAE,KAAK,CAAC,aAAa;AACjC,YAAI,CAAC,SAAU;AAEf,cAAM,KAAK,EAAE,QAAQ,IAAI,UAAU,KAAK,SAAS,MAAM,CAAC;AACxD,YAAI,CAAC,QAAS,OAAM,MAAM;AAAA,MAC5B,CAAC;AAAA,IACH,CAAC;AAED,SAAK;AAAA,MAAO,MACV,aAAa;AAAA,QACX,GAAG,aAAa;AAAA,QAChB,KAAK,QAAQ,QAAQ,SAAS;AAAA,MAChC;AAAA,IACF;AAEA,SAAK;AAAA,MAAO,MACV,aAAa;AAAA,QACX,GAAG,aAAa;AAAA,QAChB,KAAK,SAAS,QAAQ,SAAS;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA,EAKA,YAAY,wBAAC,SAAS,KAAK,QAAQ,QAAQ,MAA/B;AAAA;AAAA,EAGZ,aAAa,wBAAC,SAAS,KAAK,SAAS,QAAQ,MAAhC;AACf;AAEA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,KAAK;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-VTFKOL5E.js.map"}
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-W4NIMENU.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-W4NIMENU.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-W4NIMENU.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-W4NIMENU.js.map
+76
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-WBWWX4CZ.js
··· 1 + import { 2 + ID3v2Parser 3 + } from "./chunk-QOFAJIKO.js"; 4 + import { 5 + ID3v1Parser 6 + } from "./chunk-Z6RWJW2M.js"; 7 + import { 8 + ID3v2Header 9 + } from "./chunk-SGG7NSCF.js"; 10 + import { 11 + EndOfStreamError 12 + } from "./chunk-FGRUWWG5.js"; 13 + import { 14 + BasicParser, 15 + require_src 16 + } from "./chunk-ETGVMC2T.js"; 17 + import { 18 + __name, 19 + __toESM 20 + } from "./chunk-7IARE43G.js"; 21 + 22 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/id3v2/AbstractID3Parser.js 23 + var import_debug = __toESM(require_src()); 24 + var debug = (0, import_debug.default)("music-metadata:parser:ID3"); 25 + var AbstractID3Parser = class extends BasicParser { 26 + static { 27 + __name(this, "AbstractID3Parser"); 28 + } 29 + constructor() { 30 + super(...arguments); 31 + this.id3parser = new ID3v2Parser(); 32 + } 33 + static async startsWithID3v2Header(tokenizer) { 34 + return (await tokenizer.peekToken(ID3v2Header)).fileIdentifier === "ID3"; 35 + } 36 + async parse() { 37 + try { 38 + await this.parseID3v2(); 39 + } catch (err) { 40 + if (err instanceof EndOfStreamError) { 41 + debug("End-of-stream"); 42 + } else { 43 + throw err; 44 + } 45 + } 46 + } 47 + finalize() { 48 + return; 49 + } 50 + async parseID3v2() { 51 + await this.tryReadId3v2Headers(); 52 + debug("End of ID3v2 header, go to MPEG-parser: pos=%s", this.tokenizer.position); 53 + await this.postId3v2Parse(); 54 + if (this.options.skipPostHeaders && this.metadata.hasAny()) { 55 + this.finalize(); 56 + } else { 57 + const id3v1parser = new ID3v1Parser(this.metadata, this.tokenizer, this.options); 58 + await id3v1parser.parse(); 59 + this.finalize(); 60 + } 61 + } 62 + async tryReadId3v2Headers() { 63 + const id3Header = await this.tokenizer.peekToken(ID3v2Header); 64 + if (id3Header.fileIdentifier === "ID3") { 65 + debug("Found ID3v2 header, pos=%s", this.tokenizer.position); 66 + await this.id3parser.parse(this.metadata, this.tokenizer, this.options); 67 + return this.tryReadId3v2Headers(); 68 + } 69 + } 70 + }; 71 + 72 + export { 73 + AbstractID3Parser 74 + }; 75 + 76 + //# sourceMappingURL=./chunk-WBWWX4CZ.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-WBWWX4CZ.js.map
··· 1 + {"version":3,"sources":["/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/id3v2/AbstractID3Parser.js"],"sourcesContent":["import { EndOfStreamError } from 'strtok3';\nimport initDebug from 'debug';\nimport { ID3v2Header } from './ID3v2Token.js';\nimport { ID3v2Parser } from './ID3v2Parser.js';\nimport { ID3v1Parser } from '../id3v1/ID3v1Parser.js';\nimport { BasicParser } from '../common/BasicParser.js';\nconst debug = initDebug('music-metadata:parser:ID3');\n/**\n * Abstract parser which tries take ID3v2 and ID3v1 headers.\n */\nexport class AbstractID3Parser extends BasicParser {\n constructor() {\n super(...arguments);\n this.id3parser = new ID3v2Parser();\n }\n static async startsWithID3v2Header(tokenizer) {\n return (await tokenizer.peekToken(ID3v2Header)).fileIdentifier === 'ID3';\n }\n async parse() {\n try {\n await this.parseID3v2();\n }\n catch (err) {\n if (err instanceof EndOfStreamError) {\n debug(\"End-of-stream\");\n }\n else {\n throw err;\n }\n }\n }\n finalize() {\n return;\n }\n async parseID3v2() {\n await this.tryReadId3v2Headers();\n debug('End of ID3v2 header, go to MPEG-parser: pos=%s', this.tokenizer.position);\n await this.postId3v2Parse();\n if (this.options.skipPostHeaders && this.metadata.hasAny()) {\n this.finalize();\n }\n else {\n const id3v1parser = new ID3v1Parser(this.metadata, this.tokenizer, this.options);\n await id3v1parser.parse();\n this.finalize();\n }\n }\n async tryReadId3v2Headers() {\n const id3Header = await this.tokenizer.peekToken(ID3v2Header);\n if (id3Header.fileIdentifier === 'ID3') {\n debug('Found ID3v2 header, pos=%s', this.tokenizer.position);\n await this.id3parser.parse(this.metadata, this.tokenizer, this.options);\n return this.tryReadId3v2Headers();\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AACA,mBAAsB;AAKtB,IAAM,YAAQ,aAAAA,SAAU,2BAA2B;AAI5C,IAAM,oBAAN,cAAgC,YAAY;AAAA,EAVnD,OAUmD;AAAA;AAAA;AAAA,EAC/C,cAAc;AACV,UAAM,GAAG,SAAS;AAClB,SAAK,YAAY,IAAI,YAAY;AAAA,EACrC;AAAA,EACA,aAAa,sBAAsB,WAAW;AAC1C,YAAQ,MAAM,UAAU,UAAU,WAAW,GAAG,mBAAmB;AAAA,EACvE;AAAA,EACA,MAAM,QAAQ;AACV,QAAI;AACA,YAAM,KAAK,WAAW;AAAA,IAC1B,SACO,KAAK;AACR,UAAI,eAAe,kBAAkB;AACjC,cAAM,eAAe;AAAA,MACzB,OACK;AACD,cAAM;AAAA,MACV;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,WAAW;AACP;AAAA,EACJ;AAAA,EACA,MAAM,aAAa;AACf,UAAM,KAAK,oBAAoB;AAC/B,UAAM,kDAAkD,KAAK,UAAU,QAAQ;AAC/E,UAAM,KAAK,eAAe;AAC1B,QAAI,KAAK,QAAQ,mBAAmB,KAAK,SAAS,OAAO,GAAG;AACxD,WAAK,SAAS;AAAA,IAClB,OACK;AACD,YAAM,cAAc,IAAI,YAAY,KAAK,UAAU,KAAK,WAAW,KAAK,OAAO;AAC/E,YAAM,YAAY,MAAM;AACxB,WAAK,SAAS;AAAA,IAClB;AAAA,EACJ;AAAA,EACA,MAAM,sBAAsB;AACxB,UAAM,YAAY,MAAM,KAAK,UAAU,UAAU,WAAW;AAC5D,QAAI,UAAU,mBAAmB,OAAO;AACpC,YAAM,8BAA8B,KAAK,UAAU,QAAQ;AAC3D,YAAM,KAAK,UAAU,MAAM,KAAK,UAAU,KAAK,WAAW,KAAK,OAAO;AACtE,aAAO,KAAK,oBAAoB;AAAA,IACpC;AAAA,EACJ;AACJ;","names":["initDebug"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-WBWWX4CZ.js.map"}
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-WYFYW7EG.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-WYFYW7EG.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-WYFYW7EG.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-WYFYW7EG.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-Y3JXXCWQ.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-Y3JXXCWQ.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-Y3JXXCWQ.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-Y3JXXCWQ.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-YSZE43XE.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-YSZE43XE.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-YSZE43XE.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-YSZE43XE.js.map
+321
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-Z6RWJW2M.js
··· 1 + import { 2 + APEv2Parser 3 + } from "./chunk-CSVVW572.js"; 4 + import { 5 + trimRightNull 6 + } from "./chunk-6AX6SYMQ.js"; 7 + import { 8 + BasicParser, 9 + StringType, 10 + UINT8, 11 + require_src, 12 + textDecode 13 + } from "./chunk-ETGVMC2T.js"; 14 + import { 15 + __name, 16 + __toESM 17 + } from "./chunk-7IARE43G.js"; 18 + 19 + // ../node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/id3v1/ID3v1Parser.js 20 + var import_debug = __toESM(require_src()); 21 + var debug = (0, import_debug.default)("music-metadata:parser:ID3v1"); 22 + var Genres = [ 23 + "Blues", 24 + "Classic Rock", 25 + "Country", 26 + "Dance", 27 + "Disco", 28 + "Funk", 29 + "Grunge", 30 + "Hip-Hop", 31 + "Jazz", 32 + "Metal", 33 + "New Age", 34 + "Oldies", 35 + "Other", 36 + "Pop", 37 + "R&B", 38 + "Rap", 39 + "Reggae", 40 + "Rock", 41 + "Techno", 42 + "Industrial", 43 + "Alternative", 44 + "Ska", 45 + "Death Metal", 46 + "Pranks", 47 + "Soundtrack", 48 + "Euro-Techno", 49 + "Ambient", 50 + "Trip-Hop", 51 + "Vocal", 52 + "Jazz+Funk", 53 + "Fusion", 54 + "Trance", 55 + "Classical", 56 + "Instrumental", 57 + "Acid", 58 + "House", 59 + "Game", 60 + "Sound Clip", 61 + "Gospel", 62 + "Noise", 63 + "Alt. Rock", 64 + "Bass", 65 + "Soul", 66 + "Punk", 67 + "Space", 68 + "Meditative", 69 + "Instrumental Pop", 70 + "Instrumental Rock", 71 + "Ethnic", 72 + "Gothic", 73 + "Darkwave", 74 + "Techno-Industrial", 75 + "Electronic", 76 + "Pop-Folk", 77 + "Eurodance", 78 + "Dream", 79 + "Southern Rock", 80 + "Comedy", 81 + "Cult", 82 + "Gangsta Rap", 83 + "Top 40", 84 + "Christian Rap", 85 + "Pop/Funk", 86 + "Jungle", 87 + "Native American", 88 + "Cabaret", 89 + "New Wave", 90 + "Psychedelic", 91 + "Rave", 92 + "Showtunes", 93 + "Trailer", 94 + "Lo-Fi", 95 + "Tribal", 96 + "Acid Punk", 97 + "Acid Jazz", 98 + "Polka", 99 + "Retro", 100 + "Musical", 101 + "Rock & Roll", 102 + "Hard Rock", 103 + "Folk", 104 + "Folk/Rock", 105 + "National Folk", 106 + "Swing", 107 + "Fast-Fusion", 108 + "Bebob", 109 + "Latin", 110 + "Revival", 111 + "Celtic", 112 + "Bluegrass", 113 + "Avantgarde", 114 + "Gothic Rock", 115 + "Progressive Rock", 116 + "Psychedelic Rock", 117 + "Symphonic Rock", 118 + "Slow Rock", 119 + "Big Band", 120 + "Chorus", 121 + "Easy Listening", 122 + "Acoustic", 123 + "Humour", 124 + "Speech", 125 + "Chanson", 126 + "Opera", 127 + "Chamber Music", 128 + "Sonata", 129 + "Symphony", 130 + "Booty Bass", 131 + "Primus", 132 + "Porn Groove", 133 + "Satire", 134 + "Slow Jam", 135 + "Club", 136 + "Tango", 137 + "Samba", 138 + "Folklore", 139 + "Ballad", 140 + "Power Ballad", 141 + "Rhythmic Soul", 142 + "Freestyle", 143 + "Duet", 144 + "Punk Rock", 145 + "Drum Solo", 146 + "A Cappella", 147 + "Euro-House", 148 + "Dance Hall", 149 + "Goa", 150 + "Drum & Bass", 151 + "Club-House", 152 + "Hardcore", 153 + "Terror", 154 + "Indie", 155 + "BritPop", 156 + "Negerpunk", 157 + "Polsk Punk", 158 + "Beat", 159 + "Christian Gangsta Rap", 160 + "Heavy Metal", 161 + "Black Metal", 162 + "Crossover", 163 + "Contemporary Christian", 164 + "Christian Rock", 165 + "Merengue", 166 + "Salsa", 167 + "Thrash Metal", 168 + "Anime", 169 + "JPop", 170 + "Synthpop", 171 + "Abstract", 172 + "Art Rock", 173 + "Baroque", 174 + "Bhangra", 175 + "Big Beat", 176 + "Breakbeat", 177 + "Chillout", 178 + "Downtempo", 179 + "Dub", 180 + "EBM", 181 + "Eclectic", 182 + "Electro", 183 + "Electroclash", 184 + "Emo", 185 + "Experimental", 186 + "Garage", 187 + "Global", 188 + "IDM", 189 + "Illbient", 190 + "Industro-Goth", 191 + "Jam Band", 192 + "Krautrock", 193 + "Leftfield", 194 + "Lounge", 195 + "Math Rock", 196 + "New Romantic", 197 + "Nu-Breakz", 198 + "Post-Punk", 199 + "Post-Rock", 200 + "Psytrance", 201 + "Shoegaze", 202 + "Space Rock", 203 + "Trop Rock", 204 + "World Music", 205 + "Neoclassical", 206 + "Audiobook", 207 + "Audio Theatre", 208 + "Neue Deutsche Welle", 209 + "Podcast", 210 + "Indie Rock", 211 + "G-Funk", 212 + "Dubstep", 213 + "Garage Rock", 214 + "Psybient" 215 + ]; 216 + var Iid3v1Token = { 217 + len: 128, 218 + /** 219 + * @param buf Buffer possibly holding the 128 bytes ID3v1.1 metadata header 220 + * @param off Offset in buffer in bytes 221 + * @returns ID3v1.1 header if first 3 bytes equals 'TAG', otherwise null is returned 222 + */ 223 + get: /* @__PURE__ */ __name((buf, off) => { 224 + const header = new Id3v1StringType(3).get(buf, off); 225 + return header === "TAG" ? { 226 + header, 227 + title: new Id3v1StringType(30).get(buf, off + 3), 228 + artist: new Id3v1StringType(30).get(buf, off + 33), 229 + album: new Id3v1StringType(30).get(buf, off + 63), 230 + year: new Id3v1StringType(4).get(buf, off + 93), 231 + comment: new Id3v1StringType(28).get(buf, off + 97), 232 + // ID3v1.1 separator for track 233 + zeroByte: UINT8.get(buf, off + 127), 234 + // track: ID3v1.1 field added by Michael Mutschler 235 + track: UINT8.get(buf, off + 126), 236 + genre: UINT8.get(buf, off + 127) 237 + } : null; 238 + }, "get") 239 + }; 240 + var Id3v1StringType = class { 241 + static { 242 + __name(this, "Id3v1StringType"); 243 + } 244 + constructor(len) { 245 + this.len = len; 246 + this.stringType = new StringType(len, "latin1"); 247 + } 248 + get(buf, off) { 249 + let value = this.stringType.get(buf, off); 250 + value = trimRightNull(value); 251 + value = value.trim(); 252 + return value.length > 0 ? value : void 0; 253 + } 254 + }; 255 + var ID3v1Parser = class _ID3v1Parser extends BasicParser { 256 + static { 257 + __name(this, "ID3v1Parser"); 258 + } 259 + constructor(metadata, tokenizer, options) { 260 + super(metadata, tokenizer, options); 261 + this.apeHeader = options.apeHeader; 262 + } 263 + static getGenre(genreIndex) { 264 + if (genreIndex < Genres.length) { 265 + return Genres[genreIndex]; 266 + } 267 + return void 0; 268 + } 269 + async parse() { 270 + if (!this.tokenizer.fileInfo.size) { 271 + debug("Skip checking for ID3v1 because the file-size is unknown"); 272 + return; 273 + } 274 + if (this.apeHeader) { 275 + this.tokenizer.ignore(this.apeHeader.offset - this.tokenizer.position); 276 + const apeParser = new APEv2Parser(this.metadata, this.tokenizer, this.options); 277 + await apeParser.parseTags(this.apeHeader.footer); 278 + } 279 + const offset = this.tokenizer.fileInfo.size - Iid3v1Token.len; 280 + if (this.tokenizer.position > offset) { 281 + debug("Already consumed the last 128 bytes"); 282 + return; 283 + } 284 + const header = await this.tokenizer.readToken(Iid3v1Token, offset); 285 + if (header) { 286 + debug("ID3v1 header found at: pos=%s", this.tokenizer.fileInfo.size - Iid3v1Token.len); 287 + const props = ["title", "artist", "album", "comment", "track", "year"]; 288 + for (const id of props) { 289 + if (header[id] && header[id] !== "") 290 + await this.addTag(id, header[id]); 291 + } 292 + const genre = _ID3v1Parser.getGenre(header.genre); 293 + if (genre) 294 + await this.addTag("genre", genre); 295 + } else { 296 + debug("ID3v1 header not found at: pos=%s", this.tokenizer.fileInfo.size - Iid3v1Token.len); 297 + } 298 + } 299 + async addTag(id, value) { 300 + await this.metadata.addTag("ID3v1", id, value); 301 + } 302 + }; 303 + async function hasID3v1Header(tokenizer) { 304 + if (tokenizer.fileInfo.size >= 128) { 305 + const tag = new Uint8Array(3); 306 + const position = tokenizer.position; 307 + await tokenizer.readBuffer(tag, { position: tokenizer.fileInfo.size - 128 }); 308 + tokenizer.setPosition(position); 309 + return textDecode(tag, "latin1") === "TAG"; 310 + } 311 + return false; 312 + } 313 + __name(hasID3v1Header, "hasID3v1Header"); 314 + 315 + export { 316 + Genres, 317 + ID3v1Parser, 318 + hasID3v1Header 319 + }; 320 + 321 + //# sourceMappingURL=./chunk-Z6RWJW2M.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-Z6RWJW2M.js.map
··· 1 + {"version":3,"sources":["/node_modules/.deno/music-metadata@11.10.6/node_modules/music-metadata/lib/id3v1/ID3v1Parser.js"],"sourcesContent":["import initDebug from 'debug';\nimport { StringType, UINT8 } from 'token-types';\nimport * as util from '../common/Util.js';\nimport { BasicParser } from '../common/BasicParser.js';\nimport { APEv2Parser } from '../apev2/APEv2Parser.js';\nimport { textDecode } from '@borewit/text-codec';\nconst debug = initDebug('music-metadata:parser:ID3v1');\n/**\n * ID3v1 Genre mappings\n * Ref: https://de.wikipedia.org/wiki/Liste_der_ID3v1-Genres\n */\nexport const Genres = [\n 'Blues', 'Classic Rock', 'Country', 'Dance', 'Disco', 'Funk', 'Grunge', 'Hip-Hop',\n 'Jazz', 'Metal', 'New Age', 'Oldies', 'Other', 'Pop', 'R&B', 'Rap', 'Reggae', 'Rock',\n 'Techno', 'Industrial', 'Alternative', 'Ska', 'Death Metal', 'Pranks', 'Soundtrack',\n 'Euro-Techno', 'Ambient', 'Trip-Hop', 'Vocal', 'Jazz+Funk', 'Fusion', 'Trance',\n 'Classical', 'Instrumental', 'Acid', 'House', 'Game', 'Sound Clip', 'Gospel', 'Noise',\n 'Alt. Rock', 'Bass', 'Soul', 'Punk', 'Space', 'Meditative', 'Instrumental Pop',\n 'Instrumental Rock', 'Ethnic', 'Gothic', 'Darkwave', 'Techno-Industrial',\n 'Electronic', 'Pop-Folk', 'Eurodance', 'Dream', 'Southern Rock', 'Comedy', 'Cult',\n 'Gangsta Rap', 'Top 40', 'Christian Rap', 'Pop/Funk', 'Jungle', 'Native American',\n 'Cabaret', 'New Wave', 'Psychedelic', 'Rave', 'Showtunes', 'Trailer', 'Lo-Fi', 'Tribal',\n 'Acid Punk', 'Acid Jazz', 'Polka', 'Retro', 'Musical', 'Rock & Roll', 'Hard Rock',\n 'Folk', 'Folk/Rock', 'National Folk', 'Swing', 'Fast-Fusion', 'Bebob', 'Latin', 'Revival',\n 'Celtic', 'Bluegrass', 'Avantgarde', 'Gothic Rock', 'Progressive Rock', 'Psychedelic Rock',\n 'Symphonic Rock', 'Slow Rock', 'Big Band', 'Chorus', 'Easy Listening', 'Acoustic', 'Humour',\n 'Speech', 'Chanson', 'Opera', 'Chamber Music', 'Sonata', 'Symphony', 'Booty Bass', 'Primus',\n 'Porn Groove', 'Satire', 'Slow Jam', 'Club', 'Tango', 'Samba', 'Folklore',\n 'Ballad', 'Power Ballad', 'Rhythmic Soul', 'Freestyle', 'Duet', 'Punk Rock', 'Drum Solo',\n 'A Cappella', 'Euro-House', 'Dance Hall', 'Goa', 'Drum & Bass', 'Club-House',\n 'Hardcore', 'Terror', 'Indie', 'BritPop', 'Negerpunk', 'Polsk Punk', 'Beat',\n 'Christian Gangsta Rap', 'Heavy Metal', 'Black Metal', 'Crossover', 'Contemporary Christian',\n 'Christian Rock', 'Merengue', 'Salsa', 'Thrash Metal', 'Anime', 'JPop', 'Synthpop',\n 'Abstract', 'Art Rock', 'Baroque', 'Bhangra', 'Big Beat', 'Breakbeat', 'Chillout',\n 'Downtempo', 'Dub', 'EBM', 'Eclectic', 'Electro', 'Electroclash', 'Emo', 'Experimental',\n 'Garage', 'Global', 'IDM', 'Illbient', 'Industro-Goth', 'Jam Band', 'Krautrock',\n 'Leftfield', 'Lounge', 'Math Rock', 'New Romantic', 'Nu-Breakz', 'Post-Punk', 'Post-Rock',\n 'Psytrance', 'Shoegaze', 'Space Rock', 'Trop Rock', 'World Music', 'Neoclassical', 'Audiobook',\n 'Audio Theatre', 'Neue Deutsche Welle', 'Podcast', 'Indie Rock', 'G-Funk', 'Dubstep',\n 'Garage Rock', 'Psybient'\n];\n/**\n * Spec: http://id3.org/ID3v1\n * Wiki: https://en.wikipedia.org/wiki/ID3\n */\nconst Iid3v1Token = {\n len: 128,\n /**\n * @param buf Buffer possibly holding the 128 bytes ID3v1.1 metadata header\n * @param off Offset in buffer in bytes\n * @returns ID3v1.1 header if first 3 bytes equals 'TAG', otherwise null is returned\n */\n get: (buf, off) => {\n const header = new Id3v1StringType(3).get(buf, off);\n return header === 'TAG' ? {\n header,\n title: new Id3v1StringType(30).get(buf, off + 3),\n artist: new Id3v1StringType(30).get(buf, off + 33),\n album: new Id3v1StringType(30).get(buf, off + 63),\n year: new Id3v1StringType(4).get(buf, off + 93),\n comment: new Id3v1StringType(28).get(buf, off + 97),\n // ID3v1.1 separator for track\n zeroByte: UINT8.get(buf, off + 127),\n // track: ID3v1.1 field added by Michael Mutschler\n track: UINT8.get(buf, off + 126),\n genre: UINT8.get(buf, off + 127)\n } : null;\n }\n};\nclass Id3v1StringType {\n constructor(len) {\n this.len = len;\n this.stringType = new StringType(len, 'latin1');\n }\n get(buf, off) {\n let value = this.stringType.get(buf, off);\n value = util.trimRightNull(value);\n value = value.trim();\n return value.length > 0 ? value : undefined;\n }\n}\nexport class ID3v1Parser extends BasicParser {\n constructor(metadata, tokenizer, options) {\n super(metadata, tokenizer, options);\n this.apeHeader = options.apeHeader;\n }\n static getGenre(genreIndex) {\n if (genreIndex < Genres.length) {\n return Genres[genreIndex];\n }\n return undefined; // ToDO: generate warning\n }\n async parse() {\n if (!this.tokenizer.fileInfo.size) {\n debug('Skip checking for ID3v1 because the file-size is unknown');\n return;\n }\n if (this.apeHeader) {\n this.tokenizer.ignore(this.apeHeader.offset - this.tokenizer.position);\n const apeParser = new APEv2Parser(this.metadata, this.tokenizer, this.options);\n await apeParser.parseTags(this.apeHeader.footer);\n }\n const offset = this.tokenizer.fileInfo.size - Iid3v1Token.len;\n if (this.tokenizer.position > offset) {\n debug('Already consumed the last 128 bytes');\n return;\n }\n const header = await this.tokenizer.readToken(Iid3v1Token, offset);\n if (header) {\n debug('ID3v1 header found at: pos=%s', this.tokenizer.fileInfo.size - Iid3v1Token.len);\n const props = ['title', 'artist', 'album', 'comment', 'track', 'year'];\n for (const id of props) {\n if (header[id] && header[id] !== '')\n await this.addTag(id, header[id]);\n }\n const genre = ID3v1Parser.getGenre(header.genre);\n if (genre)\n await this.addTag('genre', genre);\n }\n else {\n debug('ID3v1 header not found at: pos=%s', this.tokenizer.fileInfo.size - Iid3v1Token.len);\n }\n }\n async addTag(id, value) {\n await this.metadata.addTag('ID3v1', id, value);\n }\n}\nexport async function hasID3v1Header(tokenizer) {\n if (tokenizer.fileInfo.size >= 128) {\n const tag = new Uint8Array(3);\n const position = tokenizer.position;\n await tokenizer.readBuffer(tag, { position: tokenizer.fileInfo.size - 128 });\n tokenizer.setPosition(position); // Restore tokenizer position\n return textDecode(tag, 'latin1') === 'TAG';\n }\n return false;\n}\n"],"mappings":"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","names":["initDebug"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-Z6RWJW2M.js.map"}
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-ZB6F4LGA.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-ZB6F4LGA.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-ZB6F4LGA.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-ZB6F4LGA.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-ZBNFP3DI.js
··· 1 + ../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/chunk-ZBNFP3DI.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-ZBNFP3DI.js.map
··· 1 + ../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/chunk-ZBNFP3DI.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-ZHEXXLC7.js
··· 1 + ../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/chunk-ZHEXXLC7.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-ZHEXXLC7.js.map
··· 1 + ../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/chunk-ZHEXXLC7.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-ZMAPA42U.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-ZMAPA42U.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/chunk-ZMAPA42U.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/chunk-ZMAPA42U.js.map
+50
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/common/constituents/default.js
··· 1 + import { 2 + GROUP, 3 + addToBodyIfNeeded, 4 + config 5 + } from "../../chunk-UT643YRI.js"; 6 + import "../../chunk-I4QT5UNG.js"; 7 + import "../../chunk-NEVFYBXS.js"; 8 + import "../../chunk-5U6EFMUU.js"; 9 + import "../../chunk-UBNX6MK2.js"; 10 + import "../../chunk-IMYGW2WM.js"; 11 + import "../../chunk-WYFYW7EG.js"; 12 + import "../../chunk-G2LBW36E.js"; 13 + import "../../chunk-VTFKOL5E.js"; 14 + import "../../chunk-FIMGEMH3.js"; 15 + import "../../chunk-DR6IVCFO.js"; 16 + import "../../chunk-US7RU3UC.js"; 17 + import "../../chunk-W4NIMENU.js"; 18 + import "../../chunk-VHBDVMZU.js"; 19 + import "../../chunk-DNOJCDYS.js"; 20 + import "../../chunk-T3A2JWMA.js"; 21 + import "../../chunk-3SOBXJU4.js"; 22 + import "../../chunk-EA2BHPCN.js"; 23 + import "../../chunk-FXE6KMVX.js"; 24 + import "../../chunk-T7ZRMWZE.js"; 25 + import "../../chunk-Y3JXXCWQ.js"; 26 + import "../../chunk-TBEAZQZQ.js"; 27 + import "../../chunk-7IE47WTB.js"; 28 + import "../../chunk-7J35BYGY.js"; 29 + import "../../chunk-ZMAPA42U.js"; 30 + import "../../chunk-N6PLTDUY.js"; 31 + import "../../chunk-UWEF6NCQ.js"; 32 + import "../../chunk-BGA2NGTF.js"; 33 + import "../../chunk-ZBNFP3DI.js"; 34 + import "../../chunk-AN7CZG6F.js"; 35 + import "../../chunk-J7D6CDIP.js"; 36 + import "../../chunk-2X53XAU6.js"; 37 + import "../../chunk-AFAFCDHW.js"; 38 + import "../../chunk-5PUD235R.js"; 39 + import "../../chunk-SRUOXJB6.js"; 40 + import "../../chunk-KM7A6C4E.js"; 41 + import "../../chunk-OSIZG2BO.js"; 42 + import "../../chunk-UDP6MTZR.js"; 43 + import "../../chunk-7IARE43G.js"; 44 + export { 45 + GROUP, 46 + addToBodyIfNeeded, 47 + config 48 + }; 49 + 50 + //# sourceMappingURL=./default.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/common/constituents/default.js.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/common/constituents/default.js.map
+47
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/common/constituents/default/config.js
··· 1 + import { 2 + config_default 3 + } from "../../../chunk-OS4QRJDG.js"; 4 + import "../../../chunk-UT643YRI.js"; 5 + import "../../../chunk-I4QT5UNG.js"; 6 + import "../../../chunk-NEVFYBXS.js"; 7 + import "../../../chunk-5U6EFMUU.js"; 8 + import "../../../chunk-UBNX6MK2.js"; 9 + import "../../../chunk-IMYGW2WM.js"; 10 + import "../../../chunk-WYFYW7EG.js"; 11 + import "../../../chunk-G2LBW36E.js"; 12 + import "../../../chunk-VTFKOL5E.js"; 13 + import "../../../chunk-FIMGEMH3.js"; 14 + import "../../../chunk-DR6IVCFO.js"; 15 + import "../../../chunk-US7RU3UC.js"; 16 + import "../../../chunk-W4NIMENU.js"; 17 + import "../../../chunk-VHBDVMZU.js"; 18 + import "../../../chunk-DNOJCDYS.js"; 19 + import "../../../chunk-T3A2JWMA.js"; 20 + import "../../../chunk-3SOBXJU4.js"; 21 + import "../../../chunk-EA2BHPCN.js"; 22 + import "../../../chunk-FXE6KMVX.js"; 23 + import "../../../chunk-T7ZRMWZE.js"; 24 + import "../../../chunk-Y3JXXCWQ.js"; 25 + import "../../../chunk-TBEAZQZQ.js"; 26 + import "../../../chunk-7IE47WTB.js"; 27 + import "../../../chunk-7J35BYGY.js"; 28 + import "../../../chunk-ZMAPA42U.js"; 29 + import "../../../chunk-N6PLTDUY.js"; 30 + import "../../../chunk-UWEF6NCQ.js"; 31 + import "../../../chunk-BGA2NGTF.js"; 32 + import "../../../chunk-ZBNFP3DI.js"; 33 + import "../../../chunk-AN7CZG6F.js"; 34 + import "../../../chunk-J7D6CDIP.js"; 35 + import "../../../chunk-2X53XAU6.js"; 36 + import "../../../chunk-AFAFCDHW.js"; 37 + import "../../../chunk-5PUD235R.js"; 38 + import "../../../chunk-SRUOXJB6.js"; 39 + import "../../../chunk-KM7A6C4E.js"; 40 + import "../../../chunk-OSIZG2BO.js"; 41 + import "../../../chunk-UDP6MTZR.js"; 42 + import "../../../chunk-7IARE43G.js"; 43 + export { 44 + config_default as default 45 + }; 46 + 47 + //# sourceMappingURL=./config.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/common/constituents/default/config.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/common/constituents/default/config.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/common/element.js
··· 1 + ../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/common/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/common/element.js.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/common/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/common/signal.js
··· 1 + ../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/common/signal.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/common/signal.js.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/common/signal.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/common/utils.js
··· 1 + ../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/common/utils.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/common/utils.js.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/common/utils.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/common/worker.js
··· 1 + ../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/common/worker.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/common/worker.js.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/common/worker.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/common/worker/rpc.js
··· 1 + ../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/common/worker/rpc.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/common/worker/rpc.js.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/common/worker/rpc.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/configurator/input/element.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/configurator/input/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/configurator/input/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/configurator/input/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/configurator/input/worker.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/configurator/input/worker.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/configurator/input/worker.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/configurator/input/worker.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/configurator/output/element.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/configurator/output/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/configurator/output/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/configurator/output/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/engine/audio/element.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/engine/audio/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/engine/audio/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/engine/audio/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/engine/queue/element.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/engine/queue/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/engine/queue/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/engine/queue/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/engine/queue/worker.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/engine/queue/worker.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/engine/queue/worker.js.map
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/engine/queue/worker.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/input/common.js
··· 1 + ../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/input/common.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/input/common.js.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/common.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/input/opensubsonic/common.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/input/opensubsonic/common.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/input/opensubsonic/common.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/opensubsonic/common.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/input/opensubsonic/constants.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/input/opensubsonic/constants.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/input/opensubsonic/constants.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/opensubsonic/constants.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/input/opensubsonic/element.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/input/opensubsonic/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/input/opensubsonic/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/opensubsonic/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/input/opensubsonic/worker.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/input/opensubsonic/worker.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/input/opensubsonic/worker.js.map
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/input/opensubsonic/worker.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/input/s3/common.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/input/s3/common.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/input/s3/common.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/s3/common.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/input/s3/constants.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/input/s3/constants.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/input/s3/constants.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/s3/constants.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/input/s3/element.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/input/s3/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/input/s3/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/s3/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/input/s3/worker.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/input/s3/worker.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/input/s3/worker.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/s3/worker.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/orchestrator/input/element.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/orchestrator/input/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/orchestrator/input/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/input/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/orchestrator/output/element.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/orchestrator/output/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/orchestrator/output/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/output/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/orchestrator/process-tracks/element.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/orchestrator/process-tracks/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/orchestrator/process-tracks/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/process-tracks/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/orchestrator/process-tracks/worker.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/orchestrator/process-tracks/worker.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/orchestrator/process-tracks/worker.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/process-tracks/worker.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/orchestrator/queue-audio/element.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/orchestrator/queue-audio/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/orchestrator/queue-audio/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/queue-audio/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/orchestrator/queue-tracks/element.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/orchestrator/queue-tracks/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/orchestrator/queue-tracks/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/queue-tracks/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/orchestrator/queue-tracks/worker.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/orchestrator/queue-tracks/worker.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/orchestrator/queue-tracks/worker.js.map
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/orchestrator/queue-tracks/worker.js.map
+19
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/orchestrator/repeat-shuffle/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-VTFKOL5E.js"; 6 + import "../../../chunk-AFAFCDHW.js"; 7 + import "../../../chunk-5PUD235R.js"; 8 + import "../../../chunk-SRUOXJB6.js"; 9 + import "../../../chunk-KM7A6C4E.js"; 10 + import "../../../chunk-OSIZG2BO.js"; 11 + import "../../../chunk-UDP6MTZR.js"; 12 + import "../../../chunk-7IARE43G.js"; 13 + export { 14 + CLASS, 15 + NAME, 16 + element_default as default 17 + }; 18 + 19 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/orchestrator/repeat-shuffle/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/repeat-shuffle/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/orchestrator/search-tracks/element.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/orchestrator/search-tracks/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/orchestrator/search-tracks/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/search-tracks/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/orchestrator/search-tracks/worker.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/orchestrator/search-tracks/worker.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/orchestrator/search-tracks/worker.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/search-tracks/worker.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/orchestrator/sources/element.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/orchestrator/sources/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/orchestrator/sources/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/sources/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/output/common.js
··· 1 + ../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/output/common.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/output/common.js.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/output/common.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/output/polymorphic/indexed-db/constants.js
··· 1 + ../../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/output/polymorphic/indexed-db/constants.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/output/polymorphic/indexed-db/constants.js.map
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/output/polymorphic/indexed-db/constants.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/output/polymorphic/indexed-db/element.js
··· 1 + ../../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/output/polymorphic/indexed-db/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/output/polymorphic/indexed-db/element.js.map
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/output/polymorphic/indexed-db/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/output/polymorphic/indexed-db/worker.js
··· 1 + ../../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/output/polymorphic/indexed-db/worker.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/output/polymorphic/indexed-db/worker.js.map
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/output/polymorphic/indexed-db/worker.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/processor/artwork/constants.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/processor/artwork/constants.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/processor/artwork/constants.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/artwork/constants.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/processor/artwork/element.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/processor/artwork/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/processor/artwork/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/artwork/element.js.map
+173
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/processor/artwork/worker.js
··· 1 + import { 2 + musicMetadataTags 3 + } from "../../../chunk-6WU6XF6M.js"; 4 + import "../../../chunk-L3PGUTA5.js"; 5 + import "../../../chunk-7OCWG5AW.js"; 6 + import "../../../chunk-Z6RWJW2M.js"; 7 + import "../../../chunk-SGG7NSCF.js"; 8 + import "../../../chunk-CSVVW572.js"; 9 + import "../../../chunk-6AX6SYMQ.js"; 10 + import "../../../chunk-FGRUWWG5.js"; 11 + import "../../../chunk-ETGVMC2T.js"; 12 + import { 13 + IDB_ARTWORK_PREFIX 14 + } from "../../../chunk-JIV2BMIF.js"; 15 + import { 16 + get, 17 + set 18 + } from "../../../chunk-DNOJCDYS.js"; 19 + import "../../../chunk-BGA2NGTF.js"; 20 + import "../../../chunk-AN7CZG6F.js"; 21 + import "../../../chunk-J7D6CDIP.js"; 22 + import { 23 + ostiary, 24 + rpc 25 + } from "../../../chunk-OSIZG2BO.js"; 26 + import "../../../chunk-UDP6MTZR.js"; 27 + import { 28 + __name 29 + } from "../../../chunk-7IARE43G.js"; 30 + 31 + // components/processor/artwork/worker.js 32 + var queue = []; 33 + async function artwork(request) { 34 + const art = await processRequest(request); 35 + return art; 36 + } 37 + __name(artwork, "artwork"); 38 + function supply(items) { 39 + const exe = !queue[0]; 40 + queue = [...queue, ...items]; 41 + if (exe) shiftQueue(); 42 + } 43 + __name(supply, "supply"); 44 + ostiary((context) => { 45 + rpc(context, { 46 + artwork, 47 + supply 48 + }); 49 + }); 50 + function escapeLucene(str) { 51 + return [].map.call(str, (char) => { 52 + if (char === "+" || char === "-" || char === "&" || char === "|" || char === "!" || char === "(" || char === ")" || char === "{" || char === "}" || char === "[" || char === "]" || char === "^" || char === '"' || char === "~" || char === "*" || char === "?" || char === ":" || char === "\\" || char === "/") { 53 + return "\\" + char; 54 + } else return char; 55 + }).join(""); 56 + } 57 + __name(escapeLucene, "escapeLucene"); 58 + async function lastFm(req) { 59 + if (!navigator.onLine) return []; 60 + const query = req.tags?.artist; 61 + return await fetch( 62 + `https://ws.audioscrobbler.com/2.0/?method=album.search&album=${query}&api_key=4f0fe85b67baef8bb7d008a8754a95e5&format=json` 63 + ).then((r) => r.json()).then((r) => lastFmCover(r.results.albummatches.album)).catch((err) => { 64 + console.error(err); 65 + return []; 66 + }); 67 + } 68 + __name(lastFm, "lastFm"); 69 + async function lastFmCover(remainingMatches) { 70 + const album = remainingMatches[0]; 71 + const url = album ? album.image[album.image.length - 1]["#text"] : null; 72 + return url && url !== "" ? await fetch(url).then((r) => r.blob()).then(async (b) => [ 73 + { 74 + bytes: await b.arrayBuffer().then((buf) => new Uint8Array(buf)), 75 + mime: b.type 76 + } 77 + ]).catch((err) => { 78 + return lastFmCover(remainingMatches.slice(1)); 79 + }) : album ? lastFmCover(remainingMatches.slice(1)) : []; 80 + } 81 + __name(lastFmCover, "lastFmCover"); 82 + async function musicBrainz(req) { 83 + const artist = req.tags?.artist; 84 + const album = req.tags?.album; 85 + if (!navigator.onLine) return []; 86 + if (!album && !artist) return []; 87 + const query = `release:"${escapeLucene(album || "")}"` + (req.variousArtists ? `` : ` AND artistname:"${escapeLucene(artist || "")}"`); 88 + const encodedQuery = encodeURIComponent(query); 89 + return await fetch( 90 + `https://musicbrainz.org/ws/2/release/?query=${encodedQuery}&fmt=json` 91 + ).then((r) => r.json()).then((r) => { 92 + if (r.releases.length === 0 && !req.variousArtists) { 93 + return musicBrainz({ ...req, variousArtists: true }); 94 + } else { 95 + return musicBrainzCover(r.releases, req); 96 + } 97 + }).catch((err) => { 98 + return []; 99 + }); 100 + } 101 + __name(musicBrainz, "musicBrainz"); 102 + async function musicBrainzCover(remainingReleases, req) { 103 + const release = remainingReleases[0]; 104 + if (!release) return []; 105 + const credit = release?.["artist-credit"]?.[0]?.name; 106 + if (req.variousArtists && credit !== "Various Artists" && credit !== req.tags?.artist) return []; 107 + return await fetch( 108 + `https://coverartarchive.org/release/${release.id}/front-1200` 109 + ).then((r) => r.blob()).then(async (b) => { 110 + if (b.type.startsWith("image/")) { 111 + return [{ 112 + bytes: await b.arrayBuffer().then((buf) => new Uint8Array(buf)), 113 + mime: b.type 114 + }]; 115 + } else { 116 + return musicBrainzCover(remainingReleases.slice(1), req); 117 + } 118 + }).catch((err) => { 119 + console.error(err); 120 + return musicBrainzCover(remainingReleases.slice(1), req); 121 + }); 122 + } 123 + __name(musicBrainzCover, "musicBrainzCover"); 124 + async function processRequest(req) { 125 + const cache = await get(`${IDB_ARTWORK_PREFIX}/${req.cacheId}`); 126 + if (cache && Array.isArray(cache) && cache.length) return cache; 127 + if (req.tags?.artist?.toUpperCase() === "VA") { 128 + req.variousArtists = true; 129 + } 130 + let art = []; 131 + const meta = await musicMetadataTags({ ...req, includeArtwork: true }).catch( 132 + /** @param {Error} err */ 133 + (err) => { 134 + console.error("music-metadata error", err); 135 + const extraction = {}; 136 + return extraction; 137 + } 138 + ); 139 + if (!req.tags && meta.tags) req.tags = meta.tags; 140 + const fromMeta = meta.artwork?.map( 141 + /** 142 + * @param {IPicture} a 143 + */ 144 + (a) => { 145 + return { bytes: a.data, mime: a.format }; 146 + } 147 + ) || []; 148 + art.push(...fromMeta); 149 + if (art.length === 0) { 150 + const fromMusicBrainz = await musicBrainz(req); 151 + art.push(...fromMusicBrainz); 152 + } 153 + if (art.length === 0) { 154 + const fromLastFm = await lastFm(req); 155 + art.push(...fromLastFm); 156 + } 157 + await set(`${IDB_ARTWORK_PREFIX}/${req.cacheId}`, art); 158 + return art; 159 + } 160 + __name(processRequest, "processRequest"); 161 + async function shiftQueue() { 162 + const next = queue.shift(); 163 + if (!next) return; 164 + await processRequest(next); 165 + await shiftQueue(); 166 + } 167 + __name(shiftQueue, "shiftQueue"); 168 + export { 169 + artwork, 170 + supply 171 + }; 172 + 173 + //# sourceMappingURL=./worker.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/processor/artwork/worker.js.map
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/processor/artwork/worker.js.map
+20
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/processor/metadata/common.js
··· 1 + import { 2 + musicMetadataTags 3 + } from "../../../chunk-6WU6XF6M.js"; 4 + import "../../../chunk-L3PGUTA5.js"; 5 + import "../../../chunk-7OCWG5AW.js"; 6 + import "../../../chunk-Z6RWJW2M.js"; 7 + import "../../../chunk-SGG7NSCF.js"; 8 + import "../../../chunk-CSVVW572.js"; 9 + import "../../../chunk-6AX6SYMQ.js"; 10 + import "../../../chunk-FGRUWWG5.js"; 11 + import "../../../chunk-ETGVMC2T.js"; 12 + import "../../../chunk-BGA2NGTF.js"; 13 + import "../../../chunk-AN7CZG6F.js"; 14 + import "../../../chunk-J7D6CDIP.js"; 15 + import "../../../chunk-7IARE43G.js"; 16 + export { 17 + musicMetadataTags 18 + }; 19 + 20 + //# sourceMappingURL=./common.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/processor/metadata/common.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/metadata/common.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/processor/metadata/element.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/processor/metadata/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/processor/metadata/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/metadata/element.js.map
+47
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/processor/metadata/worker.js
··· 1 + import { 2 + musicMetadataTags 3 + } from "../../../chunk-6WU6XF6M.js"; 4 + import "../../../chunk-L3PGUTA5.js"; 5 + import "../../../chunk-7OCWG5AW.js"; 6 + import "../../../chunk-Z6RWJW2M.js"; 7 + import "../../../chunk-SGG7NSCF.js"; 8 + import "../../../chunk-CSVVW572.js"; 9 + import "../../../chunk-6AX6SYMQ.js"; 10 + import "../../../chunk-FGRUWWG5.js"; 11 + import "../../../chunk-ETGVMC2T.js"; 12 + import "../../../chunk-BGA2NGTF.js"; 13 + import "../../../chunk-AN7CZG6F.js"; 14 + import "../../../chunk-J7D6CDIP.js"; 15 + import { 16 + ostiary, 17 + rpc 18 + } from "../../../chunk-OSIZG2BO.js"; 19 + import "../../../chunk-UDP6MTZR.js"; 20 + import { 21 + __name 22 + } from "../../../chunk-7IARE43G.js"; 23 + 24 + // components/processor/metadata/worker.js 25 + async function supply(args) { 26 + return await musicMetadataTags(args).catch( 27 + /** 28 + * @param {Error} err 29 + * @returns {Extraction} 30 + */ 31 + (err) => { 32 + console.warn("Metadata processor error:", err, args); 33 + return {}; 34 + } 35 + ); 36 + } 37 + __name(supply, "supply"); 38 + ostiary((context) => { 39 + rpc(context, { 40 + supply 41 + }); 42 + }); 43 + export { 44 + supply 45 + }; 46 + 47 + //# sourceMappingURL=./worker.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/processor/metadata/worker.js.map
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/processor/metadata/worker.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/processor/search/constants.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/processor/search/constants.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/processor/search/constants.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/search/constants.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/processor/search/element.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/processor/search/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/processor/search/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/search/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/processor/search/worker.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/processor/search/worker.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/processor/search/worker.js.map
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/processor/search/worker.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/transformer/output/base.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/transformer/output/base.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/transformer/output/base.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/transformer/output/base.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/transformer/output/bytes/automerge/constants.js
··· 1 + ../../../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/transformer/output/bytes/automerge/constants.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/transformer/output/bytes/automerge/constants.js.map
··· 1 + ../../../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/transformer/output/bytes/automerge/constants.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/transformer/output/bytes/automerge/element.js
··· 1 + ../../../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/transformer/output/bytes/automerge/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/transformer/output/bytes/automerge/element.js.map
··· 1 + ../../../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/transformer/output/bytes/automerge/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/transformer/output/bytes/automerge/utils.js
··· 1 + ../../../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/transformer/output/bytes/automerge/utils.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/transformer/output/bytes/automerge/utils.js.map
··· 1 + ../../../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/transformer/output/bytes/automerge/utils.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/transformer/output/bytes/json/element.js
··· 1 + ../../../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/transformer/output/bytes/json/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/transformer/output/bytes/json/element.js.map
··· 1 + ../../../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/transformer/output/bytes/json/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/transformer/output/refiner/default/element.js
··· 1 + ../../../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/transformer/output/refiner/default/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/transformer/output/refiner/default/element.js.map
··· 1 + ../../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/transformer/output/refiner/default/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/transformer/output/string/json/element.js
··· 1 + ../../../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/transformer/output/string/json/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/components/transformer/output/string/json/element.js.map
··· 1 + ../../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/transformer/output/string/json/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/definitions/index.ts
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/definitions/index.ts
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/definitions/output/tracks.json
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/definitions/output/tracks.json
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/favicon-16x16.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/favicon-16x16.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/favicon-32x32.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/favicon-32x32.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/favicon.ico
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/favicon.ico
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/fonts/CommitMonoVariable.woff2

This is a binary file and will not be displayed.

+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/fonts/InterVariable-Italic.woff2
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/fonts/InterVariable-Italic.woff2
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/fonts/InterVariable.woff2
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/fonts/InterVariable.woff2
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/fonts/ms_sans_serif.woff2
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/ms_sans_serif.woff2
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/fonts/ms_sans_serif_bold.woff2
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/ms_sans_serif_bold.woff2
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/1.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/1.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/10.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/10.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/11.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/11.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/12.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/12.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/13.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/13.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/14.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/14.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/15.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/15.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/16.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/16.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/17.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/17.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/18.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/18.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/19.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/19.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/2.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/2.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/20.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/20.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/21.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/21.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/22.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/22.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/23.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/23.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/24.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/24.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/25.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/25.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/26.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/26.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/27.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/27.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/28.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/28.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/29.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/29.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/3.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/3.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/30.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/30.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/4.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/4.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/5.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/5.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/6.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/6.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/7.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/7.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/8.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/8.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/9.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/9.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/1.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/1.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/10.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/10.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/11.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/11.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/12.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/12.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/13.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/13.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/14.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/14.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/15.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/15.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/16.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/16.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/17.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/17.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/18.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/18.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/19.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/19.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/2.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/2.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/20.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/20.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/21.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/21.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/22.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/22.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/23.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/23.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/24.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/24.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/25.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/25.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/26.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/26.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/27.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/27.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/28.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/28.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/29.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/29.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/3.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/3.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/30.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/30.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/4.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/4.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/5.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/5.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/6.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/6.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/7.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/7.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/8.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/8.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/background/thumbnails/9.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/9.jpg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/diffuse-current.svg
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/diffuse-current.svg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/diffuse-dark.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse-dark.svg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/diffuse-grey.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse-grey.svg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/diffuse-light.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse-light.svg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/diffuse__icon-dark.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse__icon-dark.svg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/diffuse__icon-grey.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse__icon-grey.svg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/diffuse__icon-light.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse__icon-light.svg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icon-square-ws.png
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/icon-square-ws.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icon-square.png
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/icon-square.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icon.png
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/icon.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/catalog-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/catalog-1.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/cd_audio_cd_a-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_audio_cd_a-0.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/cd_audio_cd_a-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_audio_cd_a-2.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/cd_audio_cd_a-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_audio_cd_a-3.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/cd_audio_cd_a-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_audio_cd_a-4.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/cd_drive-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_drive-0.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/cd_drive_purple-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_drive_purple-3.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/channels-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/channels-2.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/check-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/check-0.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/computer_sound-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/computer_sound-0.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/computer_user_pencil-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/computer_user_pencil-0.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/connected_world-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/connected_world-0.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/directory_admin_tools-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_admin_tools-3.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/directory_admin_tools-5.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_admin_tools-5.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/directory_channels-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_channels-2.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/directory_channels-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_channels-3.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/directory_closed-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_closed-3.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/directory_closed-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_closed-4.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/directory_control_panel-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_control_panel-2.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/directory_control_panel-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_control_panel-3.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/directory_explorer-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_explorer-4.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/directory_explorer-5.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_explorer-5.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/directory_favorites-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_favorites-2.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/directory_favorites-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_favorites-4.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/directory_net_web-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_net_web-3.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/directory_net_web-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_net_web-4.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/directory_network_conn-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_network_conn-3.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/directory_network_conn-5.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_network_conn-5.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/directory_open_file_mydocs_2k-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_open_file_mydocs_2k-3.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/directory_open_file_mydocs_2k-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_open_file_mydocs_2k-4.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/gears-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/gears-0.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/globe_map-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/globe_map-0.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/help_book_big-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/help_book_big-0.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/installer-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/installer-3.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/installer_generic_old-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/installer_generic_old-0.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/loudspeaker_wave-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/loudspeaker_wave-0.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/magnifying_glass-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/magnifying_glass-0.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/magnifying_glass_4-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/magnifying_glass_4-1.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/media_player-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/media_player-0.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/media_player_stream_no.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/media_player_stream_no.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/ms_dos-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/ms_dos-1.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/msg_error-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/msg_error-0.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/msg_information-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/msg_information-0.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/msg_question-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/msg_question-0.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/msg_warning-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/msg_warning-0.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/multimedia-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/multimedia-4.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/network_drive_world-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/network_drive_world-0.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/no-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/no-1.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/restrict-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/restrict-1.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/search_computer-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/search_computer-0.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/search_server-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/search_server-1.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/search_web-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/search_web-0.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/settings_gear-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/settings_gear-0.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/settings_gear-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/settings_gear-2.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/tip.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/tip.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/utopia_smiley.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/utopia_smiley.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/winamp2-32x32.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/winamp2-32x32.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/windows-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/windows-0.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/world-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/world-2.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/world-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/world-4.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/images/icons/windows_98/world_network_directories-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/world_network_directories-3.png
+566
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/index.html
··· 1 + <html lang="en"> 2 + <head> 3 + <meta charset="UTF-8" /> 4 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 5 + 6 + <title>Diffuse</title> 7 + 8 + <!-- Base --> 9 + <base href="./" /> 10 + 11 + <!-- Favicons & Mobile --> 12 + <link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon.png" /> 13 + <link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png" /> 14 + <link rel="icon" type="image/png" sizes="16x16" href="favicon-16x16.png" /> 15 + <!-- TODO: <link rel="manifest" href="site.webmanifest" />--> 16 + <link rel="mask-icon" href="safari-pinned-tab.svg" color="#8a90a9" /> 17 + <meta name="msapplication-TileColor" content="#8a90a9" /> 18 + <meta name="theme-color" content="#8a90a9" /> 19 + 20 + <!-- Styles --> 21 + <link rel="stylesheet" href="styles/base.css" /> 22 + <link rel="stylesheet" href="styles/diffuse/page.css" /> 23 + <link rel="stylesheet" href="styles/vendor/phosphor/fill/style.css" /> 24 + 25 + <!-- Scripts --> 26 + <script src="index.js" type="module"></script> 27 + </head> 28 + <body> 29 + <header> 30 + <div> 31 + <h1 class="diffuse-logo"> 32 + <svg viewBox="0 0 902 134" width="160"> 33 + <title>Diffuse</title> 34 + <use 35 + xlink:href="images/diffuse-current.svg#diffuse" 36 + href="images/diffuse-current.svg#diffuse"></use> 37 + </svg> 38 + 39 + </h1> 40 + <p class="construct dither-mask"> 41 + Construct your audio player. 42 + </p> 43 + <p> 44 + Diffuse is a collection of components and software that make it possible to listen to audio from various sources on your devices and the web, and to create the ideal digital 45 + audio listening experience for you. 46 + </p> 47 + <p style="align-items: center; display: flex; gap: var(--space-2xs); opacity: 0.55;"> 48 + <i class="ph-fill ph-crane"></i> 49 + <strong style="font-weight: 700;">WORK IN PROGRESS</strong> 50 + </p> 51 + <ul class="table-of-contents"> 52 + <li><a href="#usage">Usage</a></li> 53 + <li><a href="#demo">Demo</a></li> 54 + <li><a href="#themes">Themes</a></li> 55 + <li><a href="#constituents">Constituents</a></li> 56 + <li><a href="#take-control">Take control</a></li> 57 + <li><a href="#elements">Elements</a></li> 58 + <li><a href="#definitions">Definitions</a></li> 59 + </ul> 60 + <p> 61 + <small>Built by <a href="https://tokono.ma">tokono.ma</a></small> 62 + </p> 63 + </div> 64 + <div class="dither-mask filler"></div> 65 + </header> 66 + <main> 67 + <div class="columns"> 68 + <!-- USAGE --> 69 + <section> 70 + <h2 id="usage">Usage</h2> 71 + 72 + <p> 73 + The easiest way to start is by exploring the software. If you prefer a traditional pre&shy;packaged web application approach, you can check out <a href="#themes">themes</a>. 74 + </p> 75 + 76 + <p> 77 + Alternatively, there's <a href="#constituents">constituents</a> which allows you to use any component from any theme interchange&shy;ably, each in a separate browser tab. Each tab talks to each other, so you can for example browse audio in one tab and play it in another. 78 + </p> 79 + 80 + <p> 81 + The goal is for every user, no matter their experience with web software, to have agency over their software. One can start with making small changes and gradually progress to making big changes. 82 + </p> 83 + </section> 84 + 85 + <!-- DEMO --> 86 + <section> 87 + <h2 id="demo">Demo</h2> 88 + 89 + <p>Diffuse is not your typical streaming service, you have to add sources of audio. This button here adds a few sample audio files.</p> 90 + 91 + <p> 92 + <button id="add-sample-content"> 93 + <span>Add sample content</span> 94 + </button> 95 + </p> 96 + 97 + <p> 98 + Next, select any <a href="#themes">theme</a> from below to play the audio. Or any of the other options suggested in the usage section. 99 + </p> 100 + </section> 101 + </div> 102 + <div class="columns"> 103 + <!-- THEMES --> 104 + <section> 105 + <h2 id="themes">Themes</h2> 106 + 107 + <p> 108 + Themes are element compositions and provide a traditional browser web application way of 109 + using them. In other words, pretty much the whole thing, besides your data, lives inside a single browser tab. 110 + </p> 111 + 112 + <p> 113 + <small> 114 + <strong><i class="ph-fill ph-info"></i></strong> 115 + Each theme is unique, not just a skin; each one might have a totally different feature set. 116 + </small> 117 + </p> 118 + 119 + <ul> 120 + <li> 121 + <span class="todo">[todo]</span> 122 + <span>Blur</span> 123 + <div class="list-description"><strong>A theme with an Apple-inspired playback view.</strong> Features two audio players instead of the usual one.</div> 124 + </li> 125 + <li> 126 + <span class="todo">[todo]</span> 127 + <span>Loader</span> 128 + <div class="list-description"><strong>A theme that loads other themes!</strong> Load a theme from a URL, text snippet or from your user data output. <em>If you're taking the first steps to customize, checkout the <a href="#constituents">constituents loader</a> first!</em></div> 129 + </li> 130 + <li> 131 + <a href="themes/webamp/">Webamp</a> 132 + <div class="list-description"><strong>Winamp 2 + Windows 98</strong>. Uses Webamp as the audio player connected to various Diffuse elements. Also features a desktop-like Windows 98 environment in which you can open &quot;programs&quot; that control the used Diffuse elements.</div> 133 + </li> 134 + </ul> 135 + 136 + </section> 137 + 138 + <!-- CONSTITUENTS --> 139 + <section> 140 + <h2 id="constituents">Constituents</h2> 141 + 142 + <p> 143 + Constituents are various interface components each loaded in their own web page. Every used component is configured so that it operates in broadcast mode, making all the pages communicate with each other. 144 + </p> 145 + 146 + <p> 147 + <small> 148 + <strong><i class="ph-fill ph-info"></i></strong> 149 + It also allows non-browser web environments, such as WebViews, to display UI components separately. For example, to enable moveable web views on the desktop. 150 + </small> 151 + </p> 152 + 153 + <ul> 154 + <li> 155 + <a href="themes/blur/artwork-controller/">Blur / Artwork controller</a> 156 + <div class="list-description">Audio playback controller with artwork display.</div> 157 + </li> 158 + <li> 159 + <span class="todo">[todo]</span> 160 + <span>Loader</span> 161 + <div class="list-description"><strong>A constituent that loads other constituents!</strong> Load a constituent from a URL, text snippet or from your user data output.</div> 162 + </li> 163 + <li> 164 + <a href="themes/webamp/browser/">Webamp / Browser</a> 165 + <div class="list-description">Collection browser + search in a retro, win98, look.</div> 166 + </li> 167 + <li> 168 + <a href="themes/webamp/configurators/input/">Webamp / Input Configurator</a> 169 + <div class="list-description">Windows 98 styled input configurator where you can add music sources.</div> 170 + </li> 171 + </ul> 172 + 173 + </section> 174 + </div> 175 + 176 + <!-- TAKE CONTROL --> 177 + <section> 178 + <h2 id="take-control">Take control</h2> 179 + 180 + <p> 181 + <em>Diffuse ranges from “eating out at a great restaurant” all the way to “making your favourite meal at home”</em> 182 + </p> 183 + 184 + <ul class="columns"> 185 + <div class="element"> 186 + <!-- 1 --> 187 + <li> 188 + <p> 189 + <i class="ph-fill ph-storefront"></i> <strong>Level 1</strong>: Pick your restaurant, food comes in all shapes and sizes. The equivalent of choosing a Diffuse <a href="#themes">theme</a>. 190 + </p> 191 + </li> 192 + <!-- 2 --> 193 + <li> 194 + <p> 195 + <i class="ph-fill ph-basket"></i> <strong>Level 2</strong>: Take out food from various places, eg. cheese shop + bakery. You choose how you combine the foods and from where you order them. That's <a href="#constituents">constituents</a>. 196 + </p> 197 + </li> 198 + <!-- 3 --> 199 + <li> 200 + <p> 201 + <i class="ph-fill ph-pepper"></i> <strong>Level 3</strong>: Now that you know which food is good and how to make combinations, you might make a slight customization, add a little something of your own (eg. add some spice). However, you're not quite confident enough which spice to pick, so you hire some help. 202 + </p> 203 + <p> 204 + This can be done using the <a href="#constituents-loader">constituents loader</a> which allows you to build on top of a familiar preconfigured foundation and load custom constituents. People might share their own, or maybe you use an LLM to generate something for you (eg. an album art gallery). 205 + </p> 206 + </li> 207 + <!-- 4 --> 208 + <li> 209 + <p> 210 + <i class="ph-fill ph-knife"></i> <strong>Level 4</strong>: You learned a bit from watching and talking to the help you hired, so you decide to take things in your own hands. 211 + </p> 212 + <p> 213 + You continue to use the <a href="#constituents-loader">constituents loader</a> but learn a bit of <a href="https://htmlforpeople.com">HTML</a>, <a href="https://javascript.info">Javascript</a> and <a href="https://htmlforpeople.com/css-basics/">CSS</a>; so you're able to write your own constituent. 214 + </p> 215 + </li> 216 + </div> 217 + <div class="element"> 218 + <!-- 5 --> 219 + <li> 220 + <p> 221 + <i class="ph-fill ph-cooking-pot"></i> <strong>Level 5</strong>: At this point you're confident enough to make a meal from scratch. You can start very simple, eg. just throwing a steak in the pan with some butter and some salt to it. Then later add some baked potatoes and go from there. 222 + </p> 223 + <p> 224 + A similar tool comes into play here, the <a href="#themes-loader">themes loader</a>. Same concept as the constituents loader, but now you need to specify the foundation yourself. You can use the <a href="#elements">elements</a> listed below to do so. The code for these is available from this website or through the <a href="https://jsr.io/@toko/diffuse">Javascript package</a>. 225 + </p> 226 + </li> 227 + <!-- 6 --> 228 + <li> 229 + <p> 230 + <i class="ph-fill ph-storefront"></i> <strong>Level 6</strong>: You open your own restaurant. 231 + </p> 232 + <p> 233 + You can host the theme you made on any web server, it's only HTML after all. Only difference is that you'll have to create the entire HTML tree, not just the body element, as is the case with the theme loader. 234 + </p> 235 + </li> 236 + <!-- 7 --> 237 + <li> 238 + <p> 239 + <i class="ph-fill ph-chef-hat"></i> <strong>Level 7</strong>: You got promoted to master chef. Time to open your own restaurant chain. 240 + </p> 241 + <p> 242 + You can self-host Diffuse, it's <a href="https://tangled.org/tokono.ma/diffuse/blob/v4/">open-source</a>! Or you present your own collection of elements. 243 + </p> 244 + </li> 245 + </div> 246 + </ul> 247 + </section> 248 + 249 + <!-- ELEMENTS --> 250 + <section> 251 + <h2 id="elements">Elements</h2> 252 + 253 + <p> 254 + The (web) components of the system. These custom elements are then recombined into an entire music player experience, or whatever you want to build. 255 + </p> 256 + 257 + <div class="columns"> 258 + <div class="element"> 259 + <h3>Configurators</h3> 260 + 261 + <p> 262 + <em> 263 + Elements that serve as an intermediate in order to make a particular kind of element configurable. In other words, these allow for an element to be swapped out with another that takes the same set of the actions and data output. 264 + </em> 265 + </p> 266 + 267 + <ul> 268 + <li> 269 + <a href="components/configurator/input/element.js">Input</a> 270 + <div class="list-description">Allows for multiple inputs to be used at once.</div> 271 + </li> 272 + <li> 273 + <a href="components/configurator/output/element.js">Output</a> 274 + <div class="list-description">Enables the user to configure a specific output. If no default output is set, it creates a temporary session by storing everything in memory.</div> 275 + </li> 276 + <li> 277 + <span class="todo">[todo]</span> 278 + <span>Scrobbles</span> 279 + <div class="list-description">Configure multiple scrobblers (music trackers).</div> 280 + </li> 281 + </ul> 282 + 283 + </div> 284 + 285 + 286 + <div class="element"> 287 + <h3>Engines</h3> 288 + 289 + <p> 290 + <em> 291 + Elements with each a singular purpose and don't have any UI. There are specialised UI and orchestrator elements that control these. 292 + </em> 293 + </p> 294 + 295 + <ul> 296 + <li> 297 + <a href="components/engine/audio/element.js">Audio</a> 298 + <div class="list-description">Plays audio through audio elements.</div> 299 + </li> 300 + <li> 301 + <a href="components/engine/queue/element.js">Queue</a> 302 + <div class="list-description">A simple queue for tracks.</div> 303 + </li> 304 + </ul> 305 + 306 + </div> 307 + 308 + 309 + <div class="element"> 310 + <h3>Input</h3> 311 + 312 + <p> 313 + <em> 314 + Inputs are sources of audio tracks. Each track is an entry in the list of possible items to play. These can be files or streams, static or dynamic. 315 + </em> 316 + </p> 317 + 318 + <ul> 319 + <li> 320 + <a href="components/input/opensubsonic/element.js">Opensubsonic</a> 321 + <div class="list-description">Add any (open)subsonic server.</div> 322 + </li> 323 + <li> 324 + <span class="todo">[todo]</span> 325 + <span>HTTPS (Raw)</span> 326 + <div class="list-description">Enables usage of tracks with a HTTPS URI.</div> 327 + </li> 328 + <li> 329 + <span class="todo">[todo]</span> 330 + <span>HTTPS (JSON)</span> 331 + <div class="list-description">Generate tracks based on HTTPS servers that provide JSON (directory) listings.</div> 332 + </li> 333 + <li> 334 + <a href="components/input/s3/element.js">S3</a> 335 + <div class="list-description">AWS S3 and services that provide the same surface API such as Cloudflare R2.</div> 336 + </li> 337 + <li> 338 + <span class="todo">[todo]</span> 339 + <span>Soundcloud</span> 340 + <div class="list-description">Add items from your Soundcloud feed.</div> 341 + </li> 342 + <li> 343 + <span class="todo">[todo]</span> 344 + <span>WebDAV</span> 345 + <div class="list-description">Add any WebDAV server.</div> 346 + </li> 347 + </ul> 348 + 349 + </div> 350 + 351 + 352 + <div class="element"> 353 + <h3>Orchestrators</h3> 354 + 355 + <p> 356 + <em> 357 + These too are element compositions. However, unlike themes, these are purely logical. Mostly exist in order to construct sensible defaults to use across themes and other compositions. 358 + </em> 359 + </p> 360 + 361 + <ul> 362 + <li> 363 + <a href="components/orchestrator/input/element.js">Input</a> 364 + <div class="list-description"><strong>A default input configuration.</strong> Contains all the inputs provided here.</div> 365 + </li> 366 + <li> 367 + <a href="components/orchestrator/output/element.js">Output</a> 368 + <div class="list-description"><strong>A default output configuration.</strong> Contains all the outputs provided here along with the relevant transformers.</div> 369 + </li> 370 + <li> 371 + <a href="components/orchestrator/process-tracks/element.js">Process inputs into tracks</a> 372 + <div class="list-description">Whenever the cached tracks are initially loaded through the passed output element it will list tracks by using the passed input element. Afterwards it loops over all tracks and checks if metadata needs to be fetched. If anything has changed, it'll pass the results to the output element.</div> 373 + </li> 374 + <li> 375 + <a href="components/orchestrator/queue-audio/element.js">Queue ⭤ Audio</a> 376 + <div class="list-description">Connects the given queue engine to the given audio engine.</div> 377 + </li> 378 + <li> 379 + <a href="components/orchestrator/queue-tracks/element.js">Queue ⭤ Tracks</a> 380 + <div class="list-description">Sets the given queue element pool whenever the tracks signal from the given output changes.</div> 381 + </li> 382 + <li> 383 + <a href="components/orchestrator/repeat-shuffle/element.js">Repeat & Shuffle</a> 384 + <div class="list-description">An opinionated way to setup repeat &amp; shuffle.</div> 385 + </li> 386 + <li> 387 + <a href="components/orchestrator/sources/element.js">Sources</a> 388 + <div class="list-description">Monitor tracks from the given output to form a list of sources based on the input's sources return value.</div> 389 + </li> 390 + <li> 391 + <a href="components/orchestrator/search-tracks/element.js">Search ⭤ Tracks</a> 392 + <div class="list-description">Supplies tracks to the given search processor whenever the tracks collection changes.</div> 393 + </li> 394 + </ul> 395 + 396 + </div> 397 + 398 + 399 + <div class="element"> 400 + <h3>Output</h3> 401 + 402 + <p> 403 + <em> 404 + Output is application-derived data such as playlists. These elements can receive such data and keep it around. These are categorised by the type of data they ingest, or many types in the case of polymorphic. Optionally use transformers to convert output into the expected format. 405 + </em> 406 + </p> 407 + 408 + <ul> 409 + <li> 410 + <span class="todo">[todo]</span> 411 + <span>Bytes / Automerge Repo</span> 412 + <div class="list-description">Sync with an Automerge repo <a href="https://github.com/automerge/automerge-repo-sync-server/tree/main">sync server</a>.</div> 413 + </li> 414 + <li> 415 + <a href="components/output/polymorphic/indexed-db/element.js">Polymorphic / IndexedDB</a> 416 + <div class="list-description">Stores output into the local indexedDB. Supports any type of data that indexedDB supports.</div> 417 + </li> 418 + <li> 419 + <span class="todo">[todo]</span> 420 + <span>Raw / AT Protocol</span> 421 + <div class="list-description">Store your user data on the storage associated with your ATProtocol identity. Data is lexicon shaped by default so this element takes in that data directly without any transformations.</div> 422 + </li> 423 + </ul> 424 + 425 + </div> 426 + 427 + 428 + <div class="element"> 429 + <h3>Processors</h3> 430 + 431 + <p> 432 + <em> 433 + These elements work with the output generated by the input elements to add more data to them, or process them in some other way. 434 + </em> 435 + </p> 436 + 437 + <ul> 438 + <li> 439 + <a href="components/processor/artwork/element.js">Artwork</a> 440 + <div class="list-description">Fetches cover art for a given set of tracks, stored locally in indexedDB. Checks the audio metadata first, then MusicBrainz and uses Last.fm as the fallback.</div> 441 + </li> 442 + <li> 443 + <a href="components/processor/metadata/element.js">Metadata</a> 444 + <div class="list-description">Fetch audio metadata for a given set of tracks, adding to the <code>Track</code> object.</div> 445 + </li> 446 + <li> 447 + <a href="components/processor/search/element.js">Search</a> 448 + <div class="list-description">Provides a way to search through a collection of tracks, powered by orama.js</div> 449 + </li> 450 + </ul> 451 + 452 + </div> 453 + 454 + 455 + <div class="element"> 456 + <h3>Supplements</h3> 457 + 458 + <p> 459 + <em> 460 + Additional elements, such as scrobblers. 461 + </em> 462 + </p> 463 + 464 + <ul> 465 + <li> 466 + <span class="todo">[todo]</span> 467 + <span>Last.fm scrobbler</span> 468 + </li> 469 + <li> 470 + <span class="todo">[todo]</span> 471 + <span>ListenBrainz scrobbler</span> 472 + </li> 473 + <li> 474 + <span class="todo">[todo]</span> 475 + <span>Rocksky scrobbler</span> 476 + </li> 477 + <li> 478 + <span class="todo">[todo]</span> 479 + <span>Teal.fm scrobbler</span> 480 + </li> 481 + </ul> 482 + 483 + </div> 484 + 485 + 486 + <div class="element"> 487 + <h3>Transformers</h3> 488 + 489 + <p> 490 + <em> 491 + Transform data from one format or schema into another. See schema section below for more information. Just as configurators, these are intermediates and require to have the same set of actions as the element it targets. 492 + </em> 493 + </p> 494 + 495 + <ul> 496 + <li> 497 + <a href="components/transformer/output/bytes/automerge/element.js">Output / Bytes / Automerge</a> 498 + <div class="list-description">Translate data to and from an Automerge CRDT.</div> 499 + </li> 500 + <li> 501 + <span class="todo">[todo]</span> 502 + <span>Output / Bytes / Cambria lenses</span> 503 + <div class="list-description">Uses the Cambria library to seamlessly translate between data schemas so that no data migration is needed.</div> 504 + </li> 505 + <li> 506 + <a href="components/transformer/output/bytes/json/element.js">Output / Bytes / JSON</a> 507 + <div class="list-description">Raw data schema output ⇄ JSON Uint8Array.</div> 508 + </li> 509 + <li> 510 + <a href="components/transformer/output/refiner/default/element.js">Output / Refiner / Default</a> 511 + <div class="list-description">The task of a refiner transformer is to remove the output state that is not meant to be saved to storage. For example, ephemeral tracks; this transformer will keep them in memory, but they will not be present in the output. <strong>Ideally this is part of every theme, but you may swap it out with another transformer that might provide better defaults.</strong></div> 512 + </li> 513 + <li> 514 + <a href="components/transformer/output/string/json/element.js">Output / String / JSON</a> 515 + <div class="list-description">Raw data schema output ⇄ JSON UTF8 string.</div> 516 + </li> 517 + </ul> 518 + 519 + </div> 520 + 521 + </div> 522 + </section> 523 + 524 + <!-- DEFINITIONS --> 525 + <section> 526 + <h2 id="definitions">Definitions</h2> 527 + 528 + <p>All of the elements here are built with these data definitions in mind. That said, you can mix elements that use different definitions; you just have to put a transformer between them in order to translate between them, if needed.</p> 529 + 530 + <ul> 531 + <li> 532 + <span class="todo">[todo]</span> 533 + <span>Output / Constituent</span> 534 + <div class="list-description">Custom constituents to keep around.</div> 535 + </li> 536 + <li> 537 + <span class="todo">[todo]</span> 538 + <span>Output / Favourites</span> 539 + <div class="list-description">Indicate a user's favourite audio. Not a property of a track because tracks are associated with a specific source. Favourites may match with multiple tracks. Specified using the audio's title and artist.</div> 540 + </li> 541 + <li> 542 + <span class="todo">[todo]</span> 543 + <span>Output / Playlist</span> 544 + <div class="list-description">Just like favourites, does not refer to specific tracks. Unlike favourites, must also specify the album. Can also be considered a collection which is basically an unordered playlist.</div> 545 + </li> 546 + <li> 547 + <span class="todo">[todo]</span> 548 + <span>Output / Progress</span> 549 + <div class="list-description">Used to track progress of (long) audio playback.</div> 550 + </li> 551 + <li> 552 + <span class="todo">[todo]</span> 553 + <span>Output / Theme</span> 554 + <div class="list-description">Custom theme to keep around.</div> 555 + </li> 556 + <li> 557 + <a href="definitions/output/tracks.json">Output / Tracks</a> 558 + <div class="list-description">Represents audio that can be played, or a placeholder for a source of tracks. Contains a URI that will resolve to the audio. This object may be cached if convenient.</div> 559 + </li> 560 + </ul> 561 + 562 + </section> 563 + </main> 564 + 565 + </body> 566 + </html>
+94
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/index.js
··· 1 + import { 2 + GROUP 3 + } from "./chunk-UT643YRI.js"; 4 + import { 5 + element_default as element_default4 6 + } from "./chunk-I4QT5UNG.js"; 7 + import "./chunk-NEVFYBXS.js"; 8 + import "./chunk-5U6EFMUU.js"; 9 + import "./chunk-UBNX6MK2.js"; 10 + import { 11 + element_default as element_default5 12 + } from "./chunk-IMYGW2WM.js"; 13 + import "./chunk-WYFYW7EG.js"; 14 + import "./chunk-G2LBW36E.js"; 15 + import "./chunk-VTFKOL5E.js"; 16 + import "./chunk-FIMGEMH3.js"; 17 + import "./chunk-DR6IVCFO.js"; 18 + import "./chunk-US7RU3UC.js"; 19 + import { 20 + element_default as element_default2 21 + } from "./chunk-W4NIMENU.js"; 22 + import "./chunk-VHBDVMZU.js"; 23 + import "./chunk-DNOJCDYS.js"; 24 + import "./chunk-T3A2JWMA.js"; 25 + import { 26 + element_default as element_default3 27 + } from "./chunk-3SOBXJU4.js"; 28 + import "./chunk-EA2BHPCN.js"; 29 + import "./chunk-FXE6KMVX.js"; 30 + import "./chunk-T7ZRMWZE.js"; 31 + import "./chunk-Y3JXXCWQ.js"; 32 + import "./chunk-TBEAZQZQ.js"; 33 + import "./chunk-7IE47WTB.js"; 34 + import "./chunk-7J35BYGY.js"; 35 + import "./chunk-ZMAPA42U.js"; 36 + import "./chunk-N6PLTDUY.js"; 37 + import "./chunk-UWEF6NCQ.js"; 38 + import "./chunk-BGA2NGTF.js"; 39 + import "./chunk-ZBNFP3DI.js"; 40 + import "./chunk-AN7CZG6F.js"; 41 + import "./chunk-J7D6CDIP.js"; 42 + import { 43 + element_default 44 + } from "./chunk-2X53XAU6.js"; 45 + import "./chunk-AFAFCDHW.js"; 46 + import "./chunk-5PUD235R.js"; 47 + import "./chunk-SRUOXJB6.js"; 48 + import "./chunk-KM7A6C4E.js"; 49 + import "./chunk-OSIZG2BO.js"; 50 + import "./chunk-UDP6MTZR.js"; 51 + import { 52 + __name 53 + } from "./chunk-7IARE43G.js"; 54 + 55 + // index.js 56 + var s3 = new element_default2(); 57 + var input = new element_default(); 58 + input.setAttribute("group", GROUP); 59 + input.append(s3); 60 + var output = new element_default3(); 61 + output.setAttribute("group", GROUP); 62 + var metadataProcessor = new element_default4(); 63 + metadataProcessor.setAttribute("group", GROUP); 64 + document.body.append(input, output, metadataProcessor); 65 + var pto = new element_default5(); 66 + pto.setAttribute("group", GROUP); 67 + pto.setAttribute("input-selector", input.selector); 68 + pto.setAttribute("output-selector", output.selector); 69 + pto.setAttribute("metadata-processor-selector", metadataProcessor.selector); 70 + document.body.append(pto); 71 + var addDemoBtn = document.querySelector("#add-sample-content"); 72 + async function addSampleContent() { 73 + if (!addDemoBtn) return; 74 + addDemoBtn.setAttribute("disabled", ""); 75 + addDemoBtn.innerHTML = `<span> 76 + <i class="ph-fill ph-hourglass-medium"></i> 77 + Adding source 78 + </span>`; 79 + const demo = await s3.demo(); 80 + const tracks = output.tracks.collection(); 81 + await output.tracks.save([...tracks, demo.track]); 82 + addDemoBtn.innerHTML = `<span> 83 + <i class="ph-fill ph-hourglass-medium"></i> 84 + Processing source 85 + </span>`; 86 + await pto.process(); 87 + addDemoBtn.innerHTML = `<span> 88 + <i class="ph-fill ph-check-fat"></i> Added 89 + </span>`; 90 + } 91 + __name(addSampleContent, "addSampleContent"); 92 + addDemoBtn?.addEventListener("click", addSampleContent); 93 + 94 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/index.js.map
··· 1 + {"version":3,"sources":["/index.js"],"sourcesContent":["import { GROUP } from \"@common/constituents/default.js\";\n\nimport InputConfigurator from \"@components/configurator/input/element.js\";\nimport MetadataProcessor from \"@components/processor/metadata/element.js\";\nimport OutputOrchestrator from \"@components/orchestrator/output/element.js\";\nimport ProcessTracksOrchestrator from \"@components/orchestrator/process-tracks/element.js\";\nimport S3Input from \"@components/input/s3/element.js\";\n\n// Add components to DOM\nconst s3 = new S3Input();\nconst input = new InputConfigurator();\ninput.setAttribute(\"group\", GROUP);\ninput.append(s3);\n\nconst output = new OutputOrchestrator();\noutput.setAttribute(\"group\", GROUP);\n\nconst metadataProcessor = new MetadataProcessor();\nmetadataProcessor.setAttribute(\"group\", GROUP);\n\ndocument.body.append(input, output, metadataProcessor);\n\nconst pto = new ProcessTracksOrchestrator();\npto.setAttribute(\"group\", GROUP);\npto.setAttribute(\"input-selector\", input.selector);\npto.setAttribute(\"output-selector\", output.selector);\npto.setAttribute(\"metadata-processor-selector\", metadataProcessor.selector);\n\ndocument.body.append(pto);\n\n// Demo\nconst addDemoBtn = document.querySelector(\"#add-sample-content\");\n\nasync function addSampleContent() {\n if (!addDemoBtn) return;\n\n addDemoBtn.setAttribute(\"disabled\", \"\");\n addDemoBtn.innerHTML = `<span>\n <i class=\"ph-fill ph-hourglass-medium\"></i>\n Adding source\n </span>`;\n\n const demo = await s3.demo();\n const tracks = output.tracks.collection();\n\n await output.tracks.save([...tracks, demo.track]);\n\n addDemoBtn.innerHTML = `<span>\n <i class=\"ph-fill ph-hourglass-medium\"></i>\n Processing source\n </span>`;\n\n await pto.process();\n\n addDemoBtn.innerHTML = `<span>\n <i class=\"ph-fill ph-check-fat\"></i> Added\n </span>`;\n}\n\naddDemoBtn?.addEventListener(\"click\", addSampleContent);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,IAAM,KAAK,IAAIA,iBAAQ;AACvB,IAAM,QAAQ,IAAI,gBAAkB;AACpC,MAAM,aAAa,SAAS,KAAK;AACjC,MAAM,OAAO,EAAE;AAEf,IAAM,SAAS,IAAIA,iBAAmB;AACtC,OAAO,aAAa,SAAS,KAAK;AAElC,IAAM,oBAAoB,IAAIA,iBAAkB;AAChD,kBAAkB,aAAa,SAAS,KAAK;AAE7C,SAAS,KAAK,OAAO,OAAO,QAAQ,iBAAiB;AAErD,IAAM,MAAM,IAAIA,iBAA0B;AAC1C,IAAI,aAAa,SAAS,KAAK;AAC/B,IAAI,aAAa,kBAAkB,MAAM,QAAQ;AACjD,IAAI,aAAa,mBAAmB,OAAO,QAAQ;AACnD,IAAI,aAAa,+BAA+B,kBAAkB,QAAQ;AAE1E,SAAS,KAAK,OAAO,GAAG;AAGxB,IAAM,aAAa,SAAS,cAAc,qBAAqB;AAE/D,eAAe,mBAAmB;AAChC,MAAI,CAAC,WAAY;AAEjB,aAAW,aAAa,YAAY,EAAE;AACtC,aAAW,YAAY;AAAA;AAAA;AAAA;AAKvB,QAAM,OAAO,MAAM,GAAG,KAAK;AAC3B,QAAM,SAAS,OAAO,OAAO,WAAW;AAExC,QAAM,OAAO,OAAO,KAAK,CAAC,GAAG,QAAQ,KAAK,KAAK,CAAC;AAEhD,aAAW,YAAY;AAAA;AAAA;AAAA;AAKvB,QAAM,IAAI,QAAQ;AAElB,aAAW,YAAY;AAAA;AAAA;AAGzB;AAxBe;AA0Bf,YAAY,iBAAiB,SAAS,gBAAgB;","names":["element_default"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/index.js.map"}
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/mstile-150x150.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/mstile-150x150.png
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/node_crypto-RCDOXNVG.js
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/node_crypto-RCDOXNVG.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/node_crypto-RCDOXNVG.js.map
··· 1 + ../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/node_crypto-RCDOXNVG.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/safari-pinned-tab.svg
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/safari-pinned-tab.svg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/animations.css
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/animations.css
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/animations.css.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/animations.css.map
+336
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/base.css
··· 1 + *, 2 + *::before, 3 + *::after { 4 + box-sizing: border-box; 5 + } 6 + 7 + * { 8 + margin: 0; 9 + } 10 + 11 + html, 12 + :host { 13 + font-family: ui-sans-serif, system-ui, sans-serif; 14 + font-synthesis: none; 15 + line-height: 1.5; 16 + -webkit-text-size-adjust: 100%; 17 + -webkit-tap-highlight-color: transparent; 18 + } 19 + 20 + body { 21 + line-height: inherit; 22 + } 23 + 24 + img, 25 + picture, 26 + video, 27 + canvas, 28 + svg { 29 + display: block; 30 + max-width: 100%; 31 + } 32 + 33 + input, 34 + button, 35 + textarea, 36 + select { 37 + font: inherit; 38 + } 39 + 40 + p, 41 + h1, 42 + h2, 43 + h3, 44 + h4, 45 + h5, 46 + h6 { 47 + overflow-wrap: break-word; 48 + } 49 + 50 + p { 51 + text-wrap: pretty; 52 + } 53 + 54 + h1, 55 + h2, 56 + h3, 57 + h4, 58 + h5, 59 + h6 { 60 + text-wrap: balance; 61 + } 62 + 63 + #root, 64 + #__next { 65 + isolation: isolate; 66 + } 67 + 68 + small { 69 + font-size: 80%; 70 + } 71 + 72 + progress { 73 + vertical-align: baseline; 74 + } 75 + 76 + /* 77 + 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) 78 + 2. Set the default placeholder color to a semi-transparent version of the current text color. 79 + */ 80 + 81 + ::placeholder { 82 + opacity: 1; /* 1 */ 83 + color: color-mix(in oklab, currentColor 50%, transparent); /* 2 */ 84 + } 85 + 86 + /* 87 + Remove the inner padding in Chrome and Safari on macOS. 88 + */ 89 + 90 + ::-webkit-search-decoration { 91 + -webkit-appearance: none; 92 + } 93 + 94 + /* 95 + Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) 96 + */ 97 + 98 + :-moz-ui-invalid { 99 + box-shadow: none; 100 + } 101 + 102 + /* 103 + Correct the inability to style the border radius in iOS Safari. 104 + */ 105 + 106 + button, 107 + input:where([type="button"], [type="reset"], [type="submit"]), 108 + ::file-selector-button { 109 + appearance: button; 110 + } 111 + 112 + /* 113 + Correct the cursor style of increment and decrement buttons in Safari. 114 + */ 115 + 116 + ::-webkit-inner-spin-button, 117 + ::-webkit-outer-spin-button { 118 + height: auto; 119 + } 120 + 121 + :root { 122 + /* Font scales */ 123 + --fs-3xs: clamp(0.41rem, -0.06vi + 0.42rem, 0.38rem); 124 + --fs-2xs: clamp(0.51rem, -0.02vi + 0.52rem, 0.5rem); 125 + --fs-xs: clamp(0.64rem, 0.05vi + 0.63rem, 0.67rem); 126 + --fs-sm: clamp(0.8rem, 0.17vi + 0.76rem, 0.89rem); 127 + --fs-base: clamp(1rem, 0.34vi + 0.91rem, 1.19rem); 128 + --fs-md: clamp(1.25rem, 0.61vi + 1.1rem, 1.58rem); 129 + --fs-lg: clamp(1.56rem, 1vi + 1.31rem, 2.11rem); 130 + --fs-xl: clamp(1.95rem, 1.56vi + 1.56rem, 2.81rem); 131 + --fs-2xl: clamp(2.44rem, 2.38vi + 1.85rem, 3.75rem); 132 + --fs-3xl: clamp(3.05rem, 3.54vi + 2.17rem, 5rem); 133 + 134 + /* Space scales */ 135 + --space-3xs: clamp(0.25rem, 0.2216rem + 0.1136vw, 0.3125rem); 136 + --space-2xs: clamp(0.5rem, 0.4432rem + 0.2273vw, 0.625rem); 137 + --space-xs: clamp(0.75rem, 0.6932rem + 0.2273vw, 0.875rem); 138 + --space-sm: clamp(1rem, 0.9148rem + 0.3409vw, 1.1875rem); 139 + --space-md: clamp(1.5rem, 1.358rem + 0.5682vw, 1.8125rem); 140 + --space-lg: clamp(2rem, 1.8295rem + 0.6818vw, 2.375rem); 141 + --space-xl: clamp(3rem, 2.7443rem + 1.0227vw, 3.5625rem); 142 + --space-2xl: clamp(4rem, 3.6591rem + 1.3636vw, 4.75rem); 143 + --space-3xl: clamp(6rem, 5.4886rem + 2.0455vw, 7.125rem); 144 + 145 + /* Border-radius */ 146 + --radius-xs: 0.125rem; 147 + --radius-sm: 0.25rem; 148 + --radius-md: 0.375rem; 149 + --radius-lg: 0.5rem; 150 + --radius-xl: 0.75rem; 151 + --radius-2xl: 1rem; 152 + --radius-3xl: 1.5rem; 153 + --radius-4xl: 2rem; 154 + 155 + /* Containers */ 156 + --container-3xs: 16rem; 157 + --container-2xs: 18rem; 158 + --container-xs: 20rem; 159 + --container-sm: 24rem; 160 + --container-md: 28rem; 161 + --container-lg: 32rem; 162 + --container-xl: 36rem; 163 + --container-2xl: 42rem; 164 + --container-3xl: 48rem; 165 + --container-4xl: 56rem; 166 + --container-5xl: 64rem; 167 + --container-6xl: 72rem; 168 + --container-7xl: 80rem; 169 + --container-8xl: 88rem; 170 + --container-9xl: 96rem; 171 + 172 + /* Letter-spacing */ 173 + --tracking-tighter: -0.05em; 174 + --tracking-tight: -0.025em; 175 + --tracking-normal: 0em; 176 + --tracking-wide: 0.025em; 177 + --tracking-wider: 0.05em; 178 + --tracking-widest: 0.1em; 179 + 180 + /* Line-height */ 181 + --leading-tight: 1.25; 182 + --leading-snug: 1.375; 183 + --leading-normal: 1.5; 184 + --leading-relaxed: 1.625; 185 + --leading-loose: 2; 186 + 187 + /* Shadows */ 188 + --box-shadow-2xs: 0 1px rgb(0 0 0 / 0.05); 189 + --box-shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05); 190 + --box-shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); 191 + --box-shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); 192 + --box-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); 193 + --box-shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); 194 + --box-shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25); 195 + 196 + --text-shadow-2xs: 0px 1px 0px rgb(0 0 0 / 0.15); 197 + --text-shadow-xs: 0px 1px 1px rgb(0 0 0 / 0.2); 198 + --text-shadow-sm: 199 + 0px 1px 0px rgb(0 0 0 / 0.075), 0px 1px 1px rgb(0 0 0 / 0.075), 0px 2px 2px rgb(0 0 0 / 0.075); 200 + --text-shadow-md: 201 + 0px 1px 1px rgb(0 0 0 / 0.1), 0px 1px 2px rgb(0 0 0 / 0.1), 0px 2px 4px rgb(0 0 0 / 0.1); 202 + --text-shadow-lg: 203 + 0px 1px 2px rgb(0 0 0 / 0.1), 0px 3px 2px rgb(0 0 0 / 0.1), 0px 4px 8px rgb(0 0 0 / 0.1); 204 + } 205 + 206 + @font-face { 207 + font-display: swap; 208 + font-family: CommitMonoVariable; 209 + font-style: normal; 210 + font-weight: 100 900; 211 + src: url("../fonts/CommitMonoVariable.woff2") format("woff2"); 212 + } 213 + 214 + @font-face { 215 + font-display: swap; 216 + font-family: InterVariable; 217 + font-style: normal; 218 + font-weight: 100 900; 219 + src: url("../fonts/InterVariable.woff2") format("woff2"); 220 + } 221 + 222 + @font-face { 223 + font-display: swap; 224 + font-family: InterVariable; 225 + font-style: italic; 226 + font-weight: 100 900; 227 + src: url("../fonts/InterVariable-Italic.woff2") format("woff2"); 228 + } 229 + 230 + :root { 231 + --animate-spin: spin 1s linear infinite; 232 + --animate-ping: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite; 233 + --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; 234 + --animate-bounce: bounce 1s infinite; 235 + } 236 + 237 + .animate-spin { 238 + animation: var(--animate-spin); 239 + } 240 + 241 + .animate-ping { 242 + animation: var(--animate-ping); 243 + } 244 + 245 + .animate-pulse { 246 + animation: var(--animate-pulse); 247 + } 248 + 249 + .animate-bounce { 250 + animation: var(--animate-bounce); 251 + } 252 + 253 + @keyframes spin { 254 + to { 255 + transform: rotate(360deg); 256 + } 257 + } 258 + 259 + @keyframes ping { 260 + 75%, 261 + 100% { 262 + transform: scale(2); 263 + opacity: 0; 264 + } 265 + } 266 + 267 + @keyframes pulse { 268 + 50% { 269 + opacity: 0.5; 270 + } 271 + } 272 + 273 + @keyframes bounce { 274 + 0%, 275 + 100% { 276 + transform: translateY(-25%); 277 + animation-timing-function: cubic-bezier(0.8, 0, 1, 1); 278 + } 279 + 50% { 280 + transform: none; 281 + animation-timing-function: cubic-bezier(0, 0, 0.2, 1); 282 + } 283 + } 284 + 285 + :root { 286 + /* Colors */ 287 + --color-1: oklch(4.1308% 0.25306 109.22); 288 + --color-2: oklch(98.369% 0.01834 67.664); 289 + --color-3: oklch(26.787% 0.00168 186.65); 290 + 291 + /* Orange/Red */ 292 + /*--accent: oklch(86.947% 0.25527 28.789);*/ 293 + /*--accent: hsl(51, 100%, 50%);*/ 294 + /*--accent: #9e86b8;*/ 295 + 296 + /* Green */ 297 + /*--accent: hsl(120, 73.4%, 74.9%);*/ 298 + --accent: hsl(82, 39%, 30.2%); 299 + /*--accent: hsl(80, 60.5%, 34.7%);*/ 300 + 301 + /* Blue */ 302 + /*--accent: hsl(203, 92%, 75.5%);*/ 303 + 304 + --bg-color: var(--color-2); 305 + --text-color: var(--color-1); 306 + } 307 + 308 + @media (prefers-color-scheme: dark) { 309 + :root { 310 + --bg-color: var(--color-3); 311 + --text-color: var(--color-2); 312 + 313 + --accent: #9e86b8; 314 + } 315 + } 316 + 317 + :root { 318 + font-family: "Inter", sans-serif; 319 + font-size: var(--fs-base); 320 + } 321 + 322 + @supports (font-variation-settings: normal) { 323 + :root { 324 + font-family: "InterVariable", sans-serif; 325 + font-feature-settings: 326 + /* "zero" 2, */ "ss03" 2; 327 + font-optical-sizing: auto; 328 + } 329 + } 330 + 331 + .monospace-font, 332 + code { 333 + font-family: CommitMonoVariable, "Commit Mono", monospace; 334 + } 335 + 336 + /*# sourceMappingURL=./base.css.map */
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/base.css.map
··· 1 + {"version":3,"sources":["/src/styles/reset.css","/src/styles/variables.css","/src/styles/font-faces.css","/src/styles/animations.css","/src/styles/diffuse/colors.css","/src/styles/diffuse/fonts.css"],"names":[],"mappings":"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","file":"/styles/base.css.map","sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n* {\n margin: 0;\n}\n\nhtml,\n:host {\n font-family: ui-sans-serif, system-ui, sans-serif;\n font-synthesis: none;\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: transparent;\n}\n\nbody {\n line-height: inherit;\n}\n\nimg,\npicture,\nvideo,\ncanvas,\nsvg {\n display: block;\n max-width: 100%;\n}\n\ninput,\nbutton,\ntextarea,\nselect {\n font: inherit;\n}\n\np,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n overflow-wrap: break-word;\n}\n\np {\n text-wrap: pretty;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n text-wrap: balance;\n}\n\n#root,\n#__next {\n isolation: isolate;\n}\n\nsmall {\n font-size: 80%;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n/*\n 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n 2. Set the default placeholder color to a semi-transparent version of the current text color.\n*/\n\n::placeholder {\n opacity: 1; /* 1 */\n color: color-mix(in oklab, currentColor 50%, transparent); /* 2 */\n}\n\n/*\n Remove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/*\n Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n/*\n Correct the inability to style the border radius in iOS Safari.\n*/\n\nbutton,\ninput:where([type=\"button\"], [type=\"reset\"], [type=\"submit\"]),\n::file-selector-button {\n appearance: button;\n}\n\n/*\n Correct the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n",":root {\n /* Font scales */\n --fs-3xs: clamp(0.41rem, -0.06vi + 0.42rem, 0.38rem);\n --fs-2xs: clamp(0.51rem, -0.02vi + 0.52rem, 0.5rem);\n --fs-xs: clamp(0.64rem, 0.05vi + 0.63rem, 0.67rem);\n --fs-sm: clamp(0.8rem, 0.17vi + 0.76rem, 0.89rem);\n --fs-base: clamp(1rem, 0.34vi + 0.91rem, 1.19rem);\n --fs-md: clamp(1.25rem, 0.61vi + 1.1rem, 1.58rem);\n --fs-lg: clamp(1.56rem, 1vi + 1.31rem, 2.11rem);\n --fs-xl: clamp(1.95rem, 1.56vi + 1.56rem, 2.81rem);\n --fs-2xl: clamp(2.44rem, 2.38vi + 1.85rem, 3.75rem);\n --fs-3xl: clamp(3.05rem, 3.54vi + 2.17rem, 5rem);\n\n /* Space scales */\n --space-3xs: clamp(0.25rem, 0.2216rem + 0.1136vw, 0.3125rem);\n --space-2xs: clamp(0.5rem, 0.4432rem + 0.2273vw, 0.625rem);\n --space-xs: clamp(0.75rem, 0.6932rem + 0.2273vw, 0.875rem);\n --space-sm: clamp(1rem, 0.9148rem + 0.3409vw, 1.1875rem);\n --space-md: clamp(1.5rem, 1.358rem + 0.5682vw, 1.8125rem);\n --space-lg: clamp(2rem, 1.8295rem + 0.6818vw, 2.375rem);\n --space-xl: clamp(3rem, 2.7443rem + 1.0227vw, 3.5625rem);\n --space-2xl: clamp(4rem, 3.6591rem + 1.3636vw, 4.75rem);\n --space-3xl: clamp(6rem, 5.4886rem + 2.0455vw, 7.125rem);\n\n /* Border-radius */\n --radius-xs: 0.125rem;\n --radius-sm: 0.25rem;\n --radius-md: 0.375rem;\n --radius-lg: 0.5rem;\n --radius-xl: 0.75rem;\n --radius-2xl: 1rem;\n --radius-3xl: 1.5rem;\n --radius-4xl: 2rem;\n\n /* Containers */\n --container-3xs: 16rem;\n --container-2xs: 18rem;\n --container-xs: 20rem;\n --container-sm: 24rem;\n --container-md: 28rem;\n --container-lg: 32rem;\n --container-xl: 36rem;\n --container-2xl: 42rem;\n --container-3xl: 48rem;\n --container-4xl: 56rem;\n --container-5xl: 64rem;\n --container-6xl: 72rem;\n --container-7xl: 80rem;\n --container-8xl: 88rem;\n --container-9xl: 96rem;\n\n /* Letter-spacing */\n --tracking-tighter: -0.05em;\n --tracking-tight: -0.025em;\n --tracking-normal: 0em;\n --tracking-wide: 0.025em;\n --tracking-wider: 0.05em;\n --tracking-widest: 0.1em;\n\n /* Line-height */\n --leading-tight: 1.25;\n --leading-snug: 1.375;\n --leading-normal: 1.5;\n --leading-relaxed: 1.625;\n --leading-loose: 2;\n\n /* Shadows */\n --box-shadow-2xs: 0 1px rgb(0 0 0 / 0.05);\n --box-shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --box-shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --box-shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --box-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --box-shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --box-shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);\n\n --text-shadow-2xs: 0px 1px 0px rgb(0 0 0 / 0.15);\n --text-shadow-xs: 0px 1px 1px rgb(0 0 0 / 0.2);\n --text-shadow-sm:\n 0px 1px 0px rgb(0 0 0 / 0.075), 0px 1px 1px rgb(0 0 0 / 0.075), 0px 2px 2px rgb(0 0 0 / 0.075);\n --text-shadow-md:\n 0px 1px 1px rgb(0 0 0 / 0.1), 0px 1px 2px rgb(0 0 0 / 0.1), 0px 2px 4px rgb(0 0 0 / 0.1);\n --text-shadow-lg:\n 0px 1px 2px rgb(0 0 0 / 0.1), 0px 3px 2px rgb(0 0 0 / 0.1), 0px 4px 8px rgb(0 0 0 / 0.1);\n}\n","@font-face {\n font-display: swap;\n font-family: CommitMonoVariable;\n font-style: normal;\n font-weight: 100 900;\n src: url(\"../fonts/CommitMonoVariable.woff2\") format(\"woff2\");\n}\n\n@font-face {\n font-display: swap;\n font-family: InterVariable;\n font-style: normal;\n font-weight: 100 900;\n src: url(\"../fonts/InterVariable.woff2\") format(\"woff2\");\n}\n\n@font-face {\n font-display: swap;\n font-family: InterVariable;\n font-style: italic;\n font-weight: 100 900;\n src: url(\"../fonts/InterVariable-Italic.woff2\") format(\"woff2\");\n}\n",":root {\n --animate-spin: spin 1s linear infinite;\n --animate-ping: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;\n --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n --animate-bounce: bounce 1s infinite;\n}\n\n.animate-spin {\n animation: var(--animate-spin);\n}\n\n.animate-ping {\n animation: var(--animate-ping);\n}\n\n.animate-pulse {\n animation: var(--animate-pulse);\n}\n\n.animate-bounce {\n animation: var(--animate-bounce);\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes ping {\n 75%,\n 100% {\n transform: scale(2);\n opacity: 0;\n }\n}\n\n@keyframes pulse {\n 50% {\n opacity: 0.5;\n }\n}\n\n@keyframes bounce {\n 0%,\n 100% {\n transform: translateY(-25%);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n 50% {\n transform: none;\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n}\n",":root {\n /* Colors */\n --color-1: oklch(4.1308% 0.25306 109.22);\n --color-2: oklch(98.369% 0.01834 67.664);\n --color-3: oklch(26.787% 0.00168 186.65);\n\n /* Orange/Red */\n /*--accent: oklch(86.947% 0.25527 28.789);*/\n /*--accent: hsl(51, 100%, 50%);*/\n /*--accent: #9e86b8;*/\n\n /* Green */\n /*--accent: hsl(120, 73.4%, 74.9%);*/\n --accent: hsl(82, 39%, 30.2%);\n /*--accent: hsl(80, 60.5%, 34.7%);*/\n\n /* Blue */\n /*--accent: hsl(203, 92%, 75.5%);*/\n\n --bg-color: var(--color-2);\n --text-color: var(--color-1);\n}\n\n@media (prefers-color-scheme: dark) {\n :root {\n --bg-color: var(--color-3);\n --text-color: var(--color-2);\n\n --accent: #9e86b8;\n }\n}\n",":root {\n font-family: \"Inter\", sans-serif;\n font-size: var(--fs-base);\n}\n\n@supports (font-variation-settings: normal) {\n :root {\n font-family: \"InterVariable\", sans-serif;\n font-feature-settings:\n /* \"zero\" 2, */ \"ss03\" 2;\n font-optical-sizing: auto;\n }\n}\n\n.monospace-font,\ncode {\n font-family: CommitMonoVariable, \"Commit Mono\", monospace;\n}\n"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse"}
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/diffuse/colors.css
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/diffuse/colors.css
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/diffuse/colors.css.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/diffuse/colors.css.map
+20
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/diffuse/fonts.css
··· 1 + :root { 2 + font-family: "Inter", sans-serif; 3 + font-size: var(--fs-base); 4 + } 5 + 6 + @supports (font-variation-settings: normal) { 7 + :root { 8 + font-family: "InterVariable", sans-serif; 9 + font-feature-settings: 10 + /* "zero" 2, */ "ss03" 2; 11 + font-optical-sizing: auto; 12 + } 13 + } 14 + 15 + .monospace-font, 16 + code { 17 + font-family: CommitMonoVariable, "Commit Mono", monospace; 18 + } 19 + 20 + /*# sourceMappingURL=./fonts.css.map */
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/diffuse/fonts.css.map
··· 1 + {"version":3,"sources":["/src/styles/diffuse/fonts.css"],"names":[],"mappings":"AAAA;EACE,gCAAgC;EAChC,yBAAyB;AAC3B;;AAEA;EACE;IACE,wCAAwC;IACxC;8BAC0B;IAC1B,yBAAyB;EAC3B;AACF;;AAEA;;EAEE,yDAAyD;AAC3D","file":"/styles/diffuse/fonts.css.map","sourcesContent":[":root {\n font-family: \"Inter\", sans-serif;\n font-size: var(--fs-base);\n}\n\n@supports (font-variation-settings: normal) {\n :root {\n font-family: \"InterVariable\", sans-serif;\n font-feature-settings:\n /* \"zero\" 2, */ \"ss03\" 2;\n font-optical-sizing: auto;\n }\n}\n\n.monospace-font,\ncode {\n font-family: CommitMonoVariable, \"Commit Mono\", monospace;\n}\n"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse"}
+276
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/diffuse/page.css
··· 1 + body { 2 + background-color: var(--bg-color); 3 + color: var(--text-color); 4 + } 5 + 6 + [id] { 7 + scroll-margin-top: var(--space-md); 8 + } 9 + 10 + /** 11 + * Containers 12 + */ 13 + 14 + p, 15 + ul, 16 + ol { 17 + margin: var(--space-sm) 0; 18 + max-width: var(--container-sm); 19 + } 20 + 21 + header { 22 + display: flex; 23 + gap: var(--space-lg); 24 + } 25 + 26 + header, 27 + main { 28 + margin: var(--space-md) auto; 29 + max-width: var(--container-7xl); 30 + padding: 0 var(--space-lg); 31 + } 32 + 33 + main { 34 + margin-bottom: var(--space-lg); 35 + } 36 + 37 + .columns { 38 + display: flex; 39 + flex-wrap: wrap; 40 + gap: 0 var(--space-3xl); 41 + } 42 + 43 + ul.columns { 44 + list-style: none; 45 + padding: 0; 46 + max-width: 100%; 47 + 48 + li { 49 + margin-bottom: var(--space-xl); 50 + } 51 + 52 + li::marker { 53 + content: none; 54 + } 55 + 56 + li i.ph-fill { 57 + opacity: 0.4; 58 + } 59 + } 60 + 61 + .filler { 62 + background: oklch(from var(--accent) l c h / 0.2); 63 + flex: 1; 64 + } 65 + 66 + .flex { 67 + flex: 1; 68 + margin-bottom: var(--space-xs); 69 + min-width: var(--container-3xs); 70 + } 71 + 72 + /** 73 + * Forms 74 + */ 75 + 76 + textarea { 77 + background: transparent; 78 + border: 3px solid oklch(from currentColor l c h / 0.25); 79 + border-radius: var(--radius-md); 80 + color: inherit; 81 + font-size: var(--fs-sm); 82 + height: var(--container-xs); 83 + padding: var(--space-xs); 84 + resize: none; 85 + width: 100%; 86 + } 87 + 88 + /** 89 + * Headers 90 + */ 91 + 92 + .construct { 93 + color: var(--accent); 94 + font-size: var(--fs-3xl); 95 + font-weight: 900; 96 + image-rendering: pixelated; 97 + letter-spacing: -0.0125em; 98 + line-height: 0.775em; 99 + line-height: 1.05cap; 100 + margin-bottom: var(--space-md); 101 + max-width: var(--container-xl); 102 + text-transform: uppercase; 103 + } 104 + 105 + h2 { 106 + /* color: oklch(from var(--bg-color) calc(l - 0.25) c h); */ 107 + color: var(--accent); 108 + 109 + font-size: var(--fs-xl); 110 + font-weight: 900; 111 + letter-spacing: -0.0125em; 112 + line-height: 1; 113 + margin: var(--space-2xl) 0 var(--space-md); 114 + text-transform: uppercase; 115 + } 116 + 117 + h3 { 118 + font-size: var(--fs-md); 119 + font-weight: 800; 120 + line-height: 1; 121 + margin: var(--space-xl) 0 var(--space-sm); 122 + text-transform: uppercase; 123 + } 124 + 125 + h2 + h3 { 126 + margin-top: var(--space-md); 127 + } 128 + 129 + /** 130 + * Inline 131 + */ 132 + 133 + a { 134 + color: inherit; 135 + text-underline-offset: 6px; 136 + } 137 + 138 + button { 139 + background: var(--accent); 140 + border: 0; 141 + border-radius: var(--radius-md); 142 + color: var(--bg-color); 143 + cursor: pointer; 144 + font-family: inherit; 145 + font-weight: 500; 146 + line-height: var(--leading-tight); 147 + padding: var(--space-2xs) var(--space-xs); 148 + transition-duration: 500ms; 149 + transition-property: opacity; 150 + 151 + &[disabled] { 152 + cursor: not-allowed; 153 + opacity: 0.5; 154 + } 155 + 156 + & > span { 157 + align-items: center; 158 + display: inline-flex; 159 + gap: var(--space-3xs); 160 + padding-top: 1px; 161 + } 162 + } 163 + 164 + small { 165 + font-size: var(--fs-xs); 166 + } 167 + 168 + .button-row { 169 + display: inline-flex; 170 + gap: var(--space-2xs); 171 + } 172 + 173 + .todo { 174 + font-size: var(--fs-sm); 175 + font-weight: 600; 176 + opacity: 0.4; 177 + } 178 + 179 + .with-icon { 180 + align-items: center; 181 + display: inline-flex; 182 + gap: var(--space-3xs); 183 + } 184 + 185 + /** 186 + * Lists 187 + */ 188 + 189 + ul, 190 + ol { 191 + padding-left: var(--space-md); 192 + } 193 + 194 + ul li::marker { 195 + color: oklch(from currentColor l c h / 0.4); 196 + content: "◦ "; 197 + } 198 + 199 + .element { 200 + min-width: min(var(--container-xs), 100%); 201 + width: 32.5%; 202 + } 203 + 204 + .list-description { 205 + font-size: var(--fs-xs); 206 + margin-bottom: var(--space-xs); 207 + margin-top: var(--space-2xs); 208 + opacity: 0.6; 209 + 210 + a { 211 + text-underline-offset: 3px; 212 + } 213 + } 214 + 215 + .table-of-contents { 216 + font-weight: 300; 217 + list-style: none; 218 + padding: 0; 219 + 220 + & li { 221 + display: flex; 222 + gap: var(--space-3xs); 223 + white-space: nowrap; 224 + } 225 + 226 + & li:after { 227 + content: " ............................................................................................................................................................................"; 228 + direction: rtl; 229 + flex: 1; 230 + opacity: 0.4; 231 + overflow: hidden; 232 + text-align: right; 233 + text-overflow: ellipsis; 234 + } 235 + 236 + & a { 237 + text-decoration: none; 238 + } 239 + } 240 + 241 + /** 242 + * Logo 243 + */ 244 + 245 + .diffuse-logo { 246 + font-size: var(--fs-lg); 247 + margin: var(--space-lg) 0 var(--space-xl); 248 + padding-top: var(--space-2xs); 249 + 250 + svg { 251 + fill: oklch(from var(--bg-color) calc(l - 0.5) c h); 252 + opacity: 0.2; 253 + width: 4.25em; 254 + 255 + @media (prefers-color-scheme: dark) { 256 + fill: var(--text-color); 257 + opacity: 0.25; 258 + } 259 + } 260 + } 261 + 262 + /** 263 + * 😶‍🌫️ 264 + */ 265 + 266 + .dither-mask, 267 + h2 { 268 + -webkit-mask: 269 + url("data:image/png;base64,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"), 270 + radial-gradient(circle at 50% 0, transparent 45%, oklab(0 0 0 / 0.65) 85%) 0 0/50% 100%; 271 + mask: 272 + url("data:image/png;base64,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"), 273 + radial-gradient(circle at 50% 0, transparent 45%, oklab(0 0 0 / 0.65) 85%) 0 0/50% 100%; 274 + } 275 + 276 + /*# sourceMappingURL=./page.css.map */
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/diffuse/page.css.map
··· 1 + {"version":3,"sources":["/src/styles/diffuse/page.css"],"names":[],"mappings":"AAAA;EACE,iCAAiC;EACjC,wBAAwB;AAC1B;;AAEA;EACE,kCAAkC;AACpC;;AAEA;;EAEE;;AAEF;;;EAGE,yBAAyB;EACzB,8BAA8B;AAChC;;AAEA;EACE,aAAa;EACb,oBAAoB;AACtB;;AAEA;;EAEE,4BAA4B;EAC5B,+BAA+B;EAC/B,0BAA0B;AAC5B;;AAEA;EACE,8BAA8B;AAChC;;AAEA;EACE,aAAa;EACb,eAAe;EACf,uBAAuB;AACzB;;AAEA;EACE,gBAAgB;EAChB,UAAU;EACV,eAAe;;EAEf;IACE,8BAA8B;EAChC;;EAEA;IACE,aAAa;EACf;;EAEA;IACE,YAAY;EACd;AACF;;AAEA;EACE,iDAAiD;EACjD,OAAO;AACT;;AAEA;EACE,OAAO;EACP,8BAA8B;EAC9B,+BAA+B;AACjC;;AAEA;;EAEE;;AAEF;EACE,uBAAuB;EACvB,uDAAuD;EACvD,+BAA+B;EAC/B,cAAc;EACd,uBAAuB;EACvB,2BAA2B;EAC3B,wBAAwB;EACxB,YAAY;EACZ,WAAW;AACb;;AAEA;;EAEE;;AAEF;EACE,oBAAoB;EACpB,wBAAwB;EACxB,gBAAgB;EAChB,0BAA0B;EAC1B,yBAAyB;EACzB,oBAAoB;EACpB,oBAAoB;EACpB,8BAA8B;EAC9B,8BAA8B;EAC9B,yBAAyB;AAC3B;;AAEA;EACE,2DAA2D;EAC3D,oBAAoB;;EAEpB,uBAAuB;EACvB,gBAAgB;EAChB,yBAAyB;EACzB,cAAc;EACd,0CAA0C;EAC1C,yBAAyB;AAC3B;;AAEA;EACE,uBAAuB;EACvB,gBAAgB;EAChB,cAAc;EACd,yCAAyC;EACzC,yBAAyB;AAC3B;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;;EAEE;;AAEF;EACE,cAAc;EACd,0BAA0B;AAC5B;;AAEA;EACE,yBAAyB;EACzB,SAAS;EACT,+BAA+B;EAC/B,sBAAsB;EACtB,eAAe;EACf,oBAAoB;EACpB,gBAAgB;EAChB,iCAAiC;EACjC,yCAAyC;EACzC,0BAA0B;EAC1B,4BAA4B;;EAE5B;IACE,mBAAmB;IACnB,YAAY;EACd;;EAEA;IACE,mBAAmB;IACnB,oBAAoB;IACpB,qBAAqB;IACrB,gBAAgB;EAClB;AACF;;AAEA;EACE,uBAAuB;AACzB;;AAEA;EACE,oBAAoB;EACpB,qBAAqB;AACvB;;AAEA;EACE,uBAAuB;EACvB,gBAAgB;EAChB,YAAY;AACd;;AAEA;EACE,mBAAmB;EACnB,oBAAoB;EACpB,qBAAqB;AACvB;;AAEA;;EAEE;;AAEF;;EAEE,6BAA6B;AAC/B;;AAEA;EACE,2CAA2C;EAC3C,cAAc;AAChB;;AAEA;EACE,yCAAyC;EACzC,YAAY;AACd;;AAEA;EACE,uBAAuB;EACvB,8BAA8B;EAC9B,4BAA4B;EAC5B,YAAY;;EAEZ;IACE,0BAA0B;EAC5B;AACF;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;EAChB,UAAU;;EAEV;IACE,aAAa;IACb,qBAAqB;IACrB,mBAAmB;EACrB;;EAEA;IACE,wLAAwL;IACxL,cAAc;IACd,OAAO;IACP,YAAY;IACZ,gBAAgB;IAChB,iBAAiB;IACjB,uBAAuB;EACzB;;EAEA;IACE,qBAAqB;EACvB;AACF;;AAEA;;EAEE;;AAEF;EACE,uBAAuB;EACvB,yCAAyC;EACzC,6BAA6B;;EAE7B;IACE,mDAAmD;IACnD,YAAY;IACZ,aAAa;;IAEb;MACE,uBAAuB;MACvB,aAAa;IACf;EACF;AACF;;AAEA;;EAEE;;AAEF;;EAEE;;2FAEyF;UAFzF;;2FAEyF;AAC3F","file":"/styles/diffuse/page.css.map","sourcesContent":["body {\n background-color: var(--bg-color);\n color: var(--text-color);\n}\n\n[id] {\n scroll-margin-top: var(--space-md);\n}\n\n/**\n * Containers\n */\n\np,\nul,\nol {\n margin: var(--space-sm) 0;\n max-width: var(--container-sm);\n}\n\nheader {\n display: flex;\n gap: var(--space-lg);\n}\n\nheader,\nmain {\n margin: var(--space-md) auto;\n max-width: var(--container-7xl);\n padding: 0 var(--space-lg);\n}\n\nmain {\n margin-bottom: var(--space-lg);\n}\n\n.columns {\n display: flex;\n flex-wrap: wrap;\n gap: 0 var(--space-3xl);\n}\n\nul.columns {\n list-style: none;\n padding: 0;\n max-width: 100%;\n\n li {\n margin-bottom: var(--space-xl);\n }\n\n li::marker {\n content: none;\n }\n\n li i.ph-fill {\n opacity: 0.4;\n }\n}\n\n.filler {\n background: oklch(from var(--accent) l c h / 0.2);\n flex: 1;\n}\n\n.flex {\n flex: 1;\n margin-bottom: var(--space-xs);\n min-width: var(--container-3xs);\n}\n\n/**\n * Forms\n */\n\ntextarea {\n background: transparent;\n border: 3px solid oklch(from currentColor l c h / 0.25);\n border-radius: var(--radius-md);\n color: inherit;\n font-size: var(--fs-sm);\n height: var(--container-xs);\n padding: var(--space-xs);\n resize: none;\n width: 100%;\n}\n\n/**\n * Headers\n */\n\n.construct {\n color: var(--accent);\n font-size: var(--fs-3xl);\n font-weight: 900;\n image-rendering: pixelated;\n letter-spacing: -0.0125em;\n line-height: 0.775em;\n line-height: 1.05cap;\n margin-bottom: var(--space-md);\n max-width: var(--container-xl);\n text-transform: uppercase;\n}\n\nh2 {\n /* color: oklch(from var(--bg-color) calc(l - 0.25) c h); */\n color: var(--accent);\n\n font-size: var(--fs-xl);\n font-weight: 900;\n letter-spacing: -0.0125em;\n line-height: 1;\n margin: var(--space-2xl) 0 var(--space-md);\n text-transform: uppercase;\n}\n\nh3 {\n font-size: var(--fs-md);\n font-weight: 800;\n line-height: 1;\n margin: var(--space-xl) 0 var(--space-sm);\n text-transform: uppercase;\n}\n\nh2 + h3 {\n margin-top: var(--space-md);\n}\n\n/**\n * Inline\n */\n\na {\n color: inherit;\n text-underline-offset: 6px;\n}\n\nbutton {\n background: var(--accent);\n border: 0;\n border-radius: var(--radius-md);\n color: var(--bg-color);\n cursor: pointer;\n font-family: inherit;\n font-weight: 500;\n line-height: var(--leading-tight);\n padding: var(--space-2xs) var(--space-xs);\n transition-duration: 500ms;\n transition-property: opacity;\n\n &[disabled] {\n cursor: not-allowed;\n opacity: 0.5;\n }\n\n & > span {\n align-items: center;\n display: inline-flex;\n gap: var(--space-3xs);\n padding-top: 1px;\n }\n}\n\nsmall {\n font-size: var(--fs-xs);\n}\n\n.button-row {\n display: inline-flex;\n gap: var(--space-2xs);\n}\n\n.todo {\n font-size: var(--fs-sm);\n font-weight: 600;\n opacity: 0.4;\n}\n\n.with-icon {\n align-items: center;\n display: inline-flex;\n gap: var(--space-3xs);\n}\n\n/**\n * Lists\n */\n\nul,\nol {\n padding-left: var(--space-md);\n}\n\nul li::marker {\n color: oklch(from currentColor l c h / 0.4);\n content: \"◦ \";\n}\n\n.element {\n min-width: min(var(--container-xs), 100%);\n width: 32.5%;\n}\n\n.list-description {\n font-size: var(--fs-xs);\n margin-bottom: var(--space-xs);\n margin-top: var(--space-2xs);\n opacity: 0.6;\n\n a {\n text-underline-offset: 3px;\n }\n}\n\n.table-of-contents {\n font-weight: 300;\n list-style: none;\n padding: 0;\n\n & li {\n display: flex;\n gap: var(--space-3xs);\n white-space: nowrap;\n }\n\n & li:after {\n content: \" ............................................................................................................................................................................\";\n direction: rtl;\n flex: 1;\n opacity: 0.4;\n overflow: hidden;\n text-align: right;\n text-overflow: ellipsis;\n }\n\n & a {\n text-decoration: none;\n }\n}\n\n/**\n * Logo\n */\n\n.diffuse-logo {\n font-size: var(--fs-lg);\n margin: var(--space-lg) 0 var(--space-xl);\n padding-top: var(--space-2xs);\n\n svg {\n fill: oklch(from var(--bg-color) calc(l - 0.5) c h);\n opacity: 0.2;\n width: 4.25em;\n\n @media (prefers-color-scheme: dark) {\n fill: var(--text-color);\n opacity: 0.25;\n }\n }\n}\n\n/**\n * 😶‍🌫️\n */\n\n.dither-mask,\nh2 {\n mask:\n url(\"data:image/png;base64,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\"),\n radial-gradient(circle at 50% 0, transparent 45%, oklab(0 0 0 / 0.65) 85%) 0 0/50% 100%;\n}\n"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse"}
+25
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/font-faces.css
··· 1 + @font-face { 2 + font-display: swap; 3 + font-family: CommitMonoVariable; 4 + font-style: normal; 5 + font-weight: 100 900; 6 + src: url("../fonts/CommitMonoVariable.woff2") format("woff2"); 7 + } 8 + 9 + @font-face { 10 + font-display: swap; 11 + font-family: InterVariable; 12 + font-style: normal; 13 + font-weight: 100 900; 14 + src: url("../fonts/InterVariable.woff2") format("woff2"); 15 + } 16 + 17 + @font-face { 18 + font-display: swap; 19 + font-family: InterVariable; 20 + font-style: italic; 21 + font-weight: 100 900; 22 + src: url("../fonts/InterVariable-Italic.woff2") format("woff2"); 23 + } 24 + 25 + /*# sourceMappingURL=./font-faces.css.map */
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/font-faces.css.map
··· 1 + {"version":3,"sources":["/src/styles/font-faces.css"],"names":[],"mappings":"AAAA;EACE,kBAAkB;EAClB,+BAA+B;EAC/B,kBAAkB;EAClB,oBAAoB;EACpB,6DAA6D;AAC/D;;AAEA;EACE,kBAAkB;EAClB,0BAA0B;EAC1B,kBAAkB;EAClB,oBAAoB;EACpB,wDAAwD;AAC1D;;AAEA;EACE,kBAAkB;EAClB,0BAA0B;EAC1B,kBAAkB;EAClB,oBAAoB;EACpB,+DAA+D;AACjE","file":"/styles/font-faces.css.map","sourcesContent":["@font-face {\n font-display: swap;\n font-family: CommitMonoVariable;\n font-style: normal;\n font-weight: 100 900;\n src: url(\"../fonts/CommitMonoVariable.woff2\") format(\"woff2\");\n}\n\n@font-face {\n font-display: swap;\n font-family: InterVariable;\n font-style: normal;\n font-weight: 100 900;\n src: url(\"../fonts/InterVariable.woff2\") format(\"woff2\");\n}\n\n@font-face {\n font-display: swap;\n font-family: InterVariable;\n font-style: italic;\n font-weight: 100 900;\n src: url(\"../fonts/InterVariable-Italic.woff2\") format(\"woff2\");\n}\n"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse"}
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/reset.css
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/reset.css
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/reset.css.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/reset.css.map
+86
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/variables.css
··· 1 + :root { 2 + /* Font scales */ 3 + --fs-3xs: clamp(0.41rem, -0.06vi + 0.42rem, 0.38rem); 4 + --fs-2xs: clamp(0.51rem, -0.02vi + 0.52rem, 0.5rem); 5 + --fs-xs: clamp(0.64rem, 0.05vi + 0.63rem, 0.67rem); 6 + --fs-sm: clamp(0.8rem, 0.17vi + 0.76rem, 0.89rem); 7 + --fs-base: clamp(1rem, 0.34vi + 0.91rem, 1.19rem); 8 + --fs-md: clamp(1.25rem, 0.61vi + 1.1rem, 1.58rem); 9 + --fs-lg: clamp(1.56rem, 1vi + 1.31rem, 2.11rem); 10 + --fs-xl: clamp(1.95rem, 1.56vi + 1.56rem, 2.81rem); 11 + --fs-2xl: clamp(2.44rem, 2.38vi + 1.85rem, 3.75rem); 12 + --fs-3xl: clamp(3.05rem, 3.54vi + 2.17rem, 5rem); 13 + 14 + /* Space scales */ 15 + --space-3xs: clamp(0.25rem, 0.2216rem + 0.1136vw, 0.3125rem); 16 + --space-2xs: clamp(0.5rem, 0.4432rem + 0.2273vw, 0.625rem); 17 + --space-xs: clamp(0.75rem, 0.6932rem + 0.2273vw, 0.875rem); 18 + --space-sm: clamp(1rem, 0.9148rem + 0.3409vw, 1.1875rem); 19 + --space-md: clamp(1.5rem, 1.358rem + 0.5682vw, 1.8125rem); 20 + --space-lg: clamp(2rem, 1.8295rem + 0.6818vw, 2.375rem); 21 + --space-xl: clamp(3rem, 2.7443rem + 1.0227vw, 3.5625rem); 22 + --space-2xl: clamp(4rem, 3.6591rem + 1.3636vw, 4.75rem); 23 + --space-3xl: clamp(6rem, 5.4886rem + 2.0455vw, 7.125rem); 24 + 25 + /* Border-radius */ 26 + --radius-xs: 0.125rem; 27 + --radius-sm: 0.25rem; 28 + --radius-md: 0.375rem; 29 + --radius-lg: 0.5rem; 30 + --radius-xl: 0.75rem; 31 + --radius-2xl: 1rem; 32 + --radius-3xl: 1.5rem; 33 + --radius-4xl: 2rem; 34 + 35 + /* Containers */ 36 + --container-3xs: 16rem; 37 + --container-2xs: 18rem; 38 + --container-xs: 20rem; 39 + --container-sm: 24rem; 40 + --container-md: 28rem; 41 + --container-lg: 32rem; 42 + --container-xl: 36rem; 43 + --container-2xl: 42rem; 44 + --container-3xl: 48rem; 45 + --container-4xl: 56rem; 46 + --container-5xl: 64rem; 47 + --container-6xl: 72rem; 48 + --container-7xl: 80rem; 49 + --container-8xl: 88rem; 50 + --container-9xl: 96rem; 51 + 52 + /* Letter-spacing */ 53 + --tracking-tighter: -0.05em; 54 + --tracking-tight: -0.025em; 55 + --tracking-normal: 0em; 56 + --tracking-wide: 0.025em; 57 + --tracking-wider: 0.05em; 58 + --tracking-widest: 0.1em; 59 + 60 + /* Line-height */ 61 + --leading-tight: 1.25; 62 + --leading-snug: 1.375; 63 + --leading-normal: 1.5; 64 + --leading-relaxed: 1.625; 65 + --leading-loose: 2; 66 + 67 + /* Shadows */ 68 + --box-shadow-2xs: 0 1px rgb(0 0 0 / 0.05); 69 + --box-shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05); 70 + --box-shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); 71 + --box-shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); 72 + --box-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); 73 + --box-shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); 74 + --box-shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25); 75 + 76 + --text-shadow-2xs: 0px 1px 0px rgb(0 0 0 / 0.15); 77 + --text-shadow-xs: 0px 1px 1px rgb(0 0 0 / 0.2); 78 + --text-shadow-sm: 79 + 0px 1px 0px rgb(0 0 0 / 0.075), 0px 1px 1px rgb(0 0 0 / 0.075), 0px 2px 2px rgb(0 0 0 / 0.075); 80 + --text-shadow-md: 81 + 0px 1px 1px rgb(0 0 0 / 0.1), 0px 1px 2px rgb(0 0 0 / 0.1), 0px 2px 4px rgb(0 0 0 / 0.1); 82 + --text-shadow-lg: 83 + 0px 1px 2px rgb(0 0 0 / 0.1), 0px 3px 2px rgb(0 0 0 / 0.1), 0px 4px 8px rgb(0 0 0 / 0.1); 84 + } 85 + 86 + /*# sourceMappingURL=./variables.css.map */
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/variables.css.map
··· 1 + {"version":3,"sources":["/src/styles/variables.css"],"names":[],"mappings":"AAAA;EACE,gBAAgB;EAChB,oDAAoD;EACpD,mDAAmD;EACnD,kDAAkD;EAClD,iDAAiD;EACjD,iDAAiD;EACjD,iDAAiD;EACjD,+CAA+C;EAC/C,kDAAkD;EAClD,mDAAmD;EACnD,gDAAgD;;EAEhD,iBAAiB;EACjB,4DAA4D;EAC5D,0DAA0D;EAC1D,0DAA0D;EAC1D,wDAAwD;EACxD,yDAAyD;EACzD,uDAAuD;EACvD,wDAAwD;EACxD,uDAAuD;EACvD,wDAAwD;;EAExD,kBAAkB;EAClB,qBAAqB;EACrB,oBAAoB;EACpB,qBAAqB;EACrB,mBAAmB;EACnB,oBAAoB;EACpB,kBAAkB;EAClB,oBAAoB;EACpB,kBAAkB;;EAElB,eAAe;EACf,sBAAsB;EACtB,sBAAsB;EACtB,qBAAqB;EACrB,qBAAqB;EACrB,qBAAqB;EACrB,qBAAqB;EACrB,qBAAqB;EACrB,sBAAsB;EACtB,sBAAsB;EACtB,sBAAsB;EACtB,sBAAsB;EACtB,sBAAsB;EACtB,sBAAsB;EACtB,sBAAsB;EACtB,sBAAsB;;EAEtB,mBAAmB;EACnB,2BAA2B;EAC3B,0BAA0B;EAC1B,sBAAsB;EACtB,wBAAwB;EACxB,wBAAwB;EACxB,wBAAwB;;EAExB,gBAAgB;EAChB,qBAAqB;EACrB,qBAAqB;EACrB,qBAAqB;EACrB,wBAAwB;EACxB,kBAAkB;;EAElB,YAAY;EACZ,yCAAyC;EACzC,8CAA8C;EAC9C,8EAA8E;EAC9E,iFAAiF;EACjF,mFAAmF;EACnF,oFAAoF;EACpF,qDAAqD;;EAErD,gDAAgD;EAChD,8CAA8C;EAC9C;kGACgG;EAChG;4FAC0F;EAC1F;4FAC0F;AAC5F","file":"/styles/variables.css.map","sourcesContent":[":root {\n /* Font scales */\n --fs-3xs: clamp(0.41rem, -0.06vi + 0.42rem, 0.38rem);\n --fs-2xs: clamp(0.51rem, -0.02vi + 0.52rem, 0.5rem);\n --fs-xs: clamp(0.64rem, 0.05vi + 0.63rem, 0.67rem);\n --fs-sm: clamp(0.8rem, 0.17vi + 0.76rem, 0.89rem);\n --fs-base: clamp(1rem, 0.34vi + 0.91rem, 1.19rem);\n --fs-md: clamp(1.25rem, 0.61vi + 1.1rem, 1.58rem);\n --fs-lg: clamp(1.56rem, 1vi + 1.31rem, 2.11rem);\n --fs-xl: clamp(1.95rem, 1.56vi + 1.56rem, 2.81rem);\n --fs-2xl: clamp(2.44rem, 2.38vi + 1.85rem, 3.75rem);\n --fs-3xl: clamp(3.05rem, 3.54vi + 2.17rem, 5rem);\n\n /* Space scales */\n --space-3xs: clamp(0.25rem, 0.2216rem + 0.1136vw, 0.3125rem);\n --space-2xs: clamp(0.5rem, 0.4432rem + 0.2273vw, 0.625rem);\n --space-xs: clamp(0.75rem, 0.6932rem + 0.2273vw, 0.875rem);\n --space-sm: clamp(1rem, 0.9148rem + 0.3409vw, 1.1875rem);\n --space-md: clamp(1.5rem, 1.358rem + 0.5682vw, 1.8125rem);\n --space-lg: clamp(2rem, 1.8295rem + 0.6818vw, 2.375rem);\n --space-xl: clamp(3rem, 2.7443rem + 1.0227vw, 3.5625rem);\n --space-2xl: clamp(4rem, 3.6591rem + 1.3636vw, 4.75rem);\n --space-3xl: clamp(6rem, 5.4886rem + 2.0455vw, 7.125rem);\n\n /* Border-radius */\n --radius-xs: 0.125rem;\n --radius-sm: 0.25rem;\n --radius-md: 0.375rem;\n --radius-lg: 0.5rem;\n --radius-xl: 0.75rem;\n --radius-2xl: 1rem;\n --radius-3xl: 1.5rem;\n --radius-4xl: 2rem;\n\n /* Containers */\n --container-3xs: 16rem;\n --container-2xs: 18rem;\n --container-xs: 20rem;\n --container-sm: 24rem;\n --container-md: 28rem;\n --container-lg: 32rem;\n --container-xl: 36rem;\n --container-2xl: 42rem;\n --container-3xl: 48rem;\n --container-4xl: 56rem;\n --container-5xl: 64rem;\n --container-6xl: 72rem;\n --container-7xl: 80rem;\n --container-8xl: 88rem;\n --container-9xl: 96rem;\n\n /* Letter-spacing */\n --tracking-tighter: -0.05em;\n --tracking-tight: -0.025em;\n --tracking-normal: 0em;\n --tracking-wide: 0.025em;\n --tracking-wider: 0.05em;\n --tracking-widest: 0.1em;\n\n /* Line-height */\n --leading-tight: 1.25;\n --leading-snug: 1.375;\n --leading-normal: 1.5;\n --leading-relaxed: 1.625;\n --leading-loose: 2;\n\n /* Shadows */\n --box-shadow-2xs: 0 1px rgb(0 0 0 / 0.05);\n --box-shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --box-shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --box-shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --box-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --box-shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --box-shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);\n\n --text-shadow-2xs: 0px 1px 0px rgb(0 0 0 / 0.15);\n --text-shadow-xs: 0px 1px 1px rgb(0 0 0 / 0.2);\n --text-shadow-sm:\n 0px 1px 0px rgb(0 0 0 / 0.075), 0px 1px 1px rgb(0 0 0 / 0.075), 0px 2px 2px rgb(0 0 0 / 0.075);\n --text-shadow-md:\n 0px 1px 1px rgb(0 0 0 / 0.1), 0px 1px 2px rgb(0 0 0 / 0.1), 0px 2px 4px rgb(0 0 0 / 0.1);\n --text-shadow-lg:\n 0px 1px 2px rgb(0 0 0 / 0.1), 0px 3px 2px rgb(0 0 0 / 0.1), 0px 4px 8px rgb(0 0 0 / 0.1);\n}\n"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse"}
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/vendor/98.css
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/98.css
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/vendor/98.css.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/98.css.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/vendor/ms_sans_serif.woff2
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/ms_sans_serif.woff2
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/vendor/ms_sans_serif_bold.woff2
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/ms_sans_serif_bold.woff2
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/vendor/phosphor/fill/Phosphor-Fill.svg
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/Phosphor-Fill.svg
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/vendor/phosphor/fill/Phosphor-Fill.ttf
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/Phosphor-Fill.ttf
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/vendor/phosphor/fill/Phosphor-Fill.woff
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/Phosphor-Fill.woff
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/vendor/phosphor/fill/Phosphor-Fill.woff2
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/Phosphor-Fill.woff2
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/vendor/phosphor/fill/style.css
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/style.css
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/vendor/phosphor/fill/style.css.map
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/style.css.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/testing/index.html
··· 1 + ../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/testing/index.html
+32
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/testing/sample/tracks.js
··· 1 + import "../../chunk-7IARE43G.js"; 2 + 3 + // testing/sample/tracks.js 4 + var trackA = { 5 + $type: "sh.diffuse.output.tracks", 6 + id: "sample-a", 7 + uri: "http://example.com/audio-a.mp3", 8 + tags: { 9 + artist: "Artist", 10 + title: "Sample" 11 + } 12 + }; 13 + var trackB = { 14 + $type: "sh.diffuse.output.tracks", 15 + id: "sample-b", 16 + uri: "http://example.com/audio-b.mp3", 17 + tags: { 18 + album: "B-side", 19 + title: "Unknown" 20 + } 21 + }; 22 + var tracks = [ 23 + trackA, 24 + trackB 25 + ]; 26 + export { 27 + trackA, 28 + trackB, 29 + tracks 30 + }; 31 + 32 + //# sourceMappingURL=./tracks.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/testing/sample/tracks.js.map
··· 1 + {"version":3,"sources":["/tracks.js"],"sourcesContent":["/**\n * @import { Track } from \"@definitions/types.d.ts\";\n */\n\n/**\n * @type {Track}\n */\nexport const trackA = {\n $type: \"sh.diffuse.output.tracks\",\n id: \"sample-a\",\n uri: \"http://example.com/audio-a.mp3\",\n tags: {\n artist: \"Artist\",\n title: \"Sample\",\n },\n};\n\n/**\n * @type {Track}\n */\nexport const trackB = {\n $type: \"sh.diffuse.output.tracks\",\n id: \"sample-b\",\n uri: \"http://example.com/audio-b.mp3\",\n tags: {\n album: \"B-side\",\n title: \"Unknown\",\n },\n};\n\nexport const tracks = [\n trackA,\n trackB,\n];\n"],"mappings":";;;AAOO,IAAM,SAAS;AAAA,EACpB,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AACF;AAKO,IAAM,SAAS;AAAA,EACpB,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACF;AAEO,IAAM,SAAS;AAAA,EACpB;AAAA,EACA;AACF;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/testing/sample/tracks.js.map"}
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/blur/artwork-controller/element.css
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/blur/artwork-controller/element.css
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/blur/artwork-controller/element.css.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/blur/artwork-controller/element.css.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/blur/artwork-controller/element.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/themes/blur/artwork-controller/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/blur/artwork-controller/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/blur/artwork-controller/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/blur/artwork-controller/index.html
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/blur/artwork-controller/index.html
+72
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/blur/artwork-controller/index.js
··· 1 + import { 2 + element_default 3 + } from "../../../chunk-2DEWUZFM.js"; 4 + import { 5 + config_default 6 + } from "../../../chunk-OS4QRJDG.js"; 7 + import "../../../chunk-UT643YRI.js"; 8 + import "../../../chunk-I4QT5UNG.js"; 9 + import "../../../chunk-NEVFYBXS.js"; 10 + import "../../../chunk-5U6EFMUU.js"; 11 + import "../../../chunk-UBNX6MK2.js"; 12 + import "../../../chunk-IMYGW2WM.js"; 13 + import "../../../chunk-WYFYW7EG.js"; 14 + import "../../../chunk-G2LBW36E.js"; 15 + import "../../../chunk-VTFKOL5E.js"; 16 + import "../../../chunk-FIMGEMH3.js"; 17 + import "../../../chunk-DR6IVCFO.js"; 18 + import "../../../chunk-US7RU3UC.js"; 19 + import "../../../chunk-W4NIMENU.js"; 20 + import "../../../chunk-VHBDVMZU.js"; 21 + import "../../../chunk-DNOJCDYS.js"; 22 + import "../../../chunk-T3A2JWMA.js"; 23 + import "../../../chunk-3SOBXJU4.js"; 24 + import "../../../chunk-EA2BHPCN.js"; 25 + import "../../../chunk-FXE6KMVX.js"; 26 + import "../../../chunk-T7ZRMWZE.js"; 27 + import "../../../chunk-Y3JXXCWQ.js"; 28 + import "../../../chunk-TBEAZQZQ.js"; 29 + import "../../../chunk-7IE47WTB.js"; 30 + import "../../../chunk-7J35BYGY.js"; 31 + import "../../../chunk-ZMAPA42U.js"; 32 + import "../../../chunk-N6PLTDUY.js"; 33 + import "../../../chunk-UWEF6NCQ.js"; 34 + import "../../../chunk-BGA2NGTF.js"; 35 + import "../../../chunk-ZBNFP3DI.js"; 36 + import "../../../chunk-AN7CZG6F.js"; 37 + import "../../../chunk-J7D6CDIP.js"; 38 + import "../../../chunk-2X53XAU6.js"; 39 + import "../../../chunk-AFAFCDHW.js"; 40 + import "../../../chunk-5PUD235R.js"; 41 + import { 42 + effect 43 + } from "../../../chunk-SRUOXJB6.js"; 44 + import "../../../chunk-KM7A6C4E.js"; 45 + import "../../../chunk-OSIZG2BO.js"; 46 + import "../../../chunk-UDP6MTZR.js"; 47 + import "../../../chunk-7IARE43G.js"; 48 + 49 + // themes/blur/artwork-controller/index.js 50 + var aud = config_default.lazy.engine.audio(); 51 + var queue = config_default.lazy.engine.queue(); 52 + var art = config_default.lazy.processor.artwork(); 53 + var oqa = config_default.lazy.orchestrator.queueAudio(); 54 + var rso = config_default.lazy.orchestrator.repeatShuffle(); 55 + config_default.lazy.orchestrator.queueTracks(); 56 + config_default.lazy.orchestrator.repeatShuffle(); 57 + var dac = new element_default(); 58 + dac.setAttribute("artwork-processor-selector", art.selector); 59 + dac.setAttribute("audio-engine-selector", aud.selector); 60 + dac.setAttribute("input-selector", config_default.orchestrator.input.selector); 61 + dac.setAttribute("queue-engine-selector", queue.selector); 62 + document.body.append(dac); 63 + effect(() => { 64 + const repeat = rso.repeat(); 65 + if (repeat && !oqa.hasAttribute("repeat")) { 66 + oqa.toggleAttribute("repeat"); 67 + } else if (!repeat && oqa.hasAttribute("repeat")) { 68 + oqa.removeAttribute("repeat"); 69 + } 70 + }); 71 + 72 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/blur/artwork-controller/index.js.map
··· 1 + {"version":3,"sources":["/index.js"],"sourcesContent":["import defaults from \"@common/constituents/default/config.js\";\nimport { effect } from \"@common/signal.js\";\n\nimport ArtworkController from \"@themes/blur/artwork-controller/element.js\";\n\n// Prerequisites\nconst aud = defaults.lazy.engine.audio();\nconst queue = defaults.lazy.engine.queue();\n\nconst art = defaults.lazy.processor.artwork();\n\nconst oqa = defaults.lazy.orchestrator.queueAudio();\nconst rso = defaults.lazy.orchestrator.repeatShuffle();\n\ndefaults.lazy.orchestrator.queueTracks();\ndefaults.lazy.orchestrator.repeatShuffle();\n\n// Controller\nconst dac = new ArtworkController();\ndac.setAttribute(\"artwork-processor-selector\", art.selector);\ndac.setAttribute(\"audio-engine-selector\", aud.selector);\ndac.setAttribute(\"input-selector\", defaults.orchestrator.input.selector);\ndac.setAttribute(\"queue-engine-selector\", queue.selector);\n\n// Add to DOM\ndocument.body.append(dac);\n\n// Effect - Link the repeat/shuffle & queue-audio orchestrators\neffect(() => {\n const repeat = rso.repeat();\n\n if (repeat && !oqa.hasAttribute(\"repeat\")) {\n oqa.toggleAttribute(\"repeat\");\n } else if (!repeat && oqa.hasAttribute(\"repeat\")) {\n oqa.removeAttribute(\"repeat\");\n }\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,IAAM,MAAM,eAAS,KAAK,OAAO,MAAM;AACvC,IAAM,QAAQ,eAAS,KAAK,OAAO,MAAM;AAEzC,IAAM,MAAM,eAAS,KAAK,UAAU,QAAQ;AAE5C,IAAM,MAAM,eAAS,KAAK,aAAa,WAAW;AAClD,IAAM,MAAM,eAAS,KAAK,aAAa,cAAc;AAErD,eAAS,KAAK,aAAa,YAAY;AACvC,eAAS,KAAK,aAAa,cAAc;AAGzC,IAAM,MAAM,IAAI,gBAAkB;AAClC,IAAI,aAAa,8BAA8B,IAAI,QAAQ;AAC3D,IAAI,aAAa,yBAAyB,IAAI,QAAQ;AACtD,IAAI,aAAa,kBAAkB,eAAS,aAAa,MAAM,QAAQ;AACvE,IAAI,aAAa,yBAAyB,MAAM,QAAQ;AAGxD,SAAS,KAAK,OAAO,GAAG;AAGxB,OAAO,MAAM;AACX,QAAM,SAAS,IAAI,OAAO;AAE1B,MAAI,UAAU,CAAC,IAAI,aAAa,QAAQ,GAAG;AACzC,QAAI,gBAAgB,QAAQ;AAAA,EAC9B,WAAW,CAAC,UAAU,IAAI,aAAa,QAAQ,GAAG;AAChD,QAAI,gBAAgB,QAAQ;AAAA,EAC9B;AACF,CAAC;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/themes/blur/artwork-controller/index.js.map"}
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/blur/index.css
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/blur/index.css
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/blur/index.css.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/blur/index.css.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/blur/index.html
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/blur/index.html
+70
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/blur/index.js
··· 1 + import "../../chunk-I4QT5UNG.js"; 2 + import "../../chunk-US7RU3UC.js"; 3 + import { 4 + element_exports as element_exports3 5 + } from "../../chunk-3SOBXJU4.js"; 6 + import "../../chunk-EA2BHPCN.js"; 7 + import "../../chunk-FXE6KMVX.js"; 8 + import "../../chunk-T7ZRMWZE.js"; 9 + import "../../chunk-Y3JXXCWQ.js"; 10 + import "../../chunk-TBEAZQZQ.js"; 11 + import "../../chunk-7IE47WTB.js"; 12 + import { 13 + element_exports 14 + } from "../../chunk-7J35BYGY.js"; 15 + import "../../chunk-ZMAPA42U.js"; 16 + import { 17 + element_exports as element_exports2 18 + } from "../../chunk-N6PLTDUY.js"; 19 + import "../../chunk-UWEF6NCQ.js"; 20 + import "../../chunk-BGA2NGTF.js"; 21 + import "../../chunk-ZBNFP3DI.js"; 22 + import { 23 + component 24 + } from "../../chunk-AFAFCDHW.js"; 25 + import "../../chunk-5PUD235R.js"; 26 + import { 27 + effect 28 + } from "../../chunk-SRUOXJB6.js"; 29 + import "../../chunk-KM7A6C4E.js"; 30 + import "../../chunk-OSIZG2BO.js"; 31 + import "../../chunk-UDP6MTZR.js"; 32 + import { 33 + __name 34 + } from "../../chunk-7IARE43G.js"; 35 + 36 + // themes/blur/index.js 37 + var audio = component(element_exports); 38 + var output = component(element_exports3); 39 + var queue = component(element_exports2); 40 + globalThis.audio = audio; 41 + globalThis.output = output; 42 + globalThis.queue = queue; 43 + isLeader().then((bool) => { 44 + if (!bool) return; 45 + import("../../components/orchestrator/process-tracks/element.js"); 46 + import("../../components/orchestrator/queue-audio/element.js"); 47 + import("../../components/orchestrator/queue-tracks/element.js"); 48 + }); 49 + effect(() => { 50 + console.log("Active queue item:", queue.now()); 51 + }); 52 + effect(() => { 53 + console.log("Queue pool hash:", queue.supplyFingerprint()); 54 + }); 55 + effect(() => { 56 + const trigger = queue.now(); 57 + const _other_trigger = queue.supplyFingerprint(); 58 + isLeader().then((bool) => { 59 + if (bool) { 60 + queue.fill({ amount: 10, shuffled: true }); 61 + if (!trigger) queue.shift(); 62 + } 63 + }); 64 + }); 65 + async function isLeader() { 66 + return await audio.isLeader(); 67 + } 68 + __name(isLeader, "isLeader"); 69 + 70 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/blur/index.js.map
··· 1 + {"version":3,"sources":["/index.js"],"sourcesContent":["import \"@components/input/opensubsonic/element.js\";\nimport \"@components/processor/metadata/element.js\";\n\nimport * as Audio from \"@components/engine/audio/element.js\";\nimport * as Output from \"@components/orchestrator/output/element.js\";\nimport * as Queue from \"@components/engine/queue/element.js\";\n\nimport { component } from \"@common/element.js\";\nimport { effect } from \"@common/signal.js\";\n\nconst audio = component(Audio);\nconst output = component(Output);\nconst queue = component(Queue);\n\nglobalThis.audio = audio;\nglobalThis.output = output;\nglobalThis.queue = queue;\n\n// 🚀\n\nisLeader().then((bool) => {\n if (!bool) return;\n\n // Only load these orchestrators if leader\n import(\"@components/orchestrator/process-tracks/element.js\");\n import(\"@components/orchestrator/queue-audio/element.js\");\n import(\"@components/orchestrator/queue-tracks/element.js\");\n});\n\n// EFFECTS\n\neffect(() => {\n console.log(\"Active queue item:\", queue.now());\n});\n\neffect(() => {\n console.log(\"Queue pool hash:\", queue.supplyFingerprint());\n});\n\n/**\n * Make sure there's always some random tracks in the queue.\n */\neffect(() => {\n const trigger = queue.now();\n const _other_trigger = queue.supplyFingerprint();\n\n isLeader().then((bool) => {\n if (bool) {\n queue.fill({ amount: 10, shuffled: true });\n if (!trigger) queue.shift();\n }\n });\n});\n\n// 🛠️\n\nasync function isLeader() {\n return await audio.isLeader();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,IAAM,QAAQ,UAAU,eAAK;AAC7B,IAAM,SAAS,UAAUA,gBAAM;AAC/B,IAAM,QAAQ,UAAUA,gBAAK;AAE7B,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,WAAW,QAAQ;AAInB,SAAS,EAAE,KAAK,CAAC,SAAS;AACxB,MAAI,CAAC,KAAM;AAGX,SAAO,yDAAoD;AAC3D,SAAO,sDAAiD;AACxD,SAAO,uDAAkD;AAC3D,CAAC;AAID,OAAO,MAAM;AACX,UAAQ,IAAI,sBAAsB,MAAM,IAAI,CAAC;AAC/C,CAAC;AAED,OAAO,MAAM;AACX,UAAQ,IAAI,oBAAoB,MAAM,kBAAkB,CAAC;AAC3D,CAAC;AAKD,OAAO,MAAM;AACX,QAAM,UAAU,MAAM,IAAI;AAC1B,QAAM,iBAAiB,MAAM,kBAAkB;AAE/C,WAAS,EAAE,KAAK,CAAC,SAAS;AACxB,QAAI,MAAM;AACR,YAAM,KAAK,EAAE,QAAQ,IAAI,UAAU,KAAK,CAAC;AACzC,UAAI,CAAC,QAAS,OAAM,MAAM;AAAA,IAC5B;AAAA,EACF,CAAC;AACH,CAAC;AAID,eAAe,WAAW;AACxB,SAAO,MAAM,MAAM,SAAS;AAC9B;AAFe;","names":["element_exports"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/themes/blur/index.js.map"}
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/blur/variables.css
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/blur/variables.css
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/blur/variables.css.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/blur/variables.css.map
+148
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/loader/constituent/index.html
··· 1 + <html lang="en"> 2 + <head> 3 + <meta charset="UTF-8" /> 4 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 5 + 6 + <meta name="media-controllable" /> 7 + <meta name="mobile-web-app-capable" content="yes" /> 8 + 9 + <title>Diffuse</title> 10 + 11 + <!-- Base --> 12 + <base href="../../../" /> 13 + 14 + <!-- Favicons & Mobile --> 15 + <link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon.png" /> 16 + <link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png" /> 17 + <link rel="icon" type="image/png" sizes="16x16" href="favicon-16x16.png" /> 18 + <!-- TODO: <link rel="manifest" href="site.webmanifest" />--> 19 + <link rel="mask-icon" href="safari-pinned-tab.svg" color="#8a90a9" /> 20 + <meta name="msapplication-TileColor" content="#8a90a9" /> 21 + <meta name="theme-color" content="#8a90a9" /> 22 + 23 + <!-- Styles --> 24 + <link rel="stylesheet" href="styles/base.css" /> 25 + <link rel="stylesheet" href="styles/diffuse/page.css" /> 26 + <link rel="stylesheet" href="styles/vendor/phosphor/fill/style.css" /> 27 + 28 + <!-- Scripts --> 29 + <script src="index.js" type="module"></script> 30 + </head> 31 + <body> 32 + <header> 33 + <div> 34 + <div> 35 + <a class="diffuse-logo" href="./" style="display: inline-block;"> 36 + <svg viewBox="0 0 902 134" width="160"> 37 + <title>Diffuse</title> 38 + <use 39 + xlink:href="images/diffuse-current.svg#diffuse" 40 + href="images/diffuse-current.svg#diffuse"></use> 41 + </svg> 42 + 43 + </a> 44 + </div> 45 + <p class="construct dither-mask" style="margin-top: 0;"> 46 + Constituent loader ❈ 47 + </p> 48 + <p> 49 + This tool allows you to load a custom <a href="#constituents">constituent</a> besides the <a href="#constituents">existing ones</a>. <strong>If you're missing a feature in Diffuse, this is the place to be!</strong> 50 + </p> 51 + </div> 52 + <div class="dither-mask filler"></div> 53 + </header> 54 + <main> 55 + <!-- COMMUNITY --> 56 + <div class="columns"> 57 + <section> 58 + <h2 id="generate">Generate</h2> 59 + <p> 60 + TODO: Explain how to instruct AI to generate a constituent for you. For example, "I want a nice album overview grouped by the month they were added to my collection" 61 + </p> 62 + </section> 63 + 64 + <section> 65 + <h2 id="community">Community</h2> 66 + <p> 67 + Check out some constituents from the community and load them here. 68 + </p> 69 + <p> 70 + <small><i class="ph-fill ph-info"></i> Nothing here yet, we're still in alpha.</small> 71 + </p> 72 + </section> 73 + </div> 74 + 75 + <!-- CONSTRUCT --> 76 + <section> 77 + <h2 id="construct">Build it yourself</h2> 78 + <!--<p></p>--> 79 + 80 + <div class="columns"> 81 + <div class="flex"> 82 + <p style="margin-top: 0; max-width: 100%;"> 83 + If you know a bit of HTML & Javascript, you can write your own or plug in some code you found elsewhere (be careful what to copy/paste though): 84 + </p> 85 + 86 + <form> 87 + <textarea class="monospace-font" placeholder="<code>goes here</code>"></textarea> 88 + </form> 89 + </div> 90 + 91 + <div class="flex"> 92 + <p style="margin-top: 0"> 93 + Your code here builds on the <a href="themes/loader/constituent/#foundation">foundation</a> listed below, it'll be injected into a <code>&lt;body&gt;</code> element. 94 + </p> 95 + <p style="margin-bottom: 0;"> 96 + <small>Some tips:</small> 97 + </p> 98 + <ul style="margin-top: var(--space-3xs);"> 99 + <li><small>Use <code>type="module"</code> when writing scripts.</small></li> 100 + </ul> 101 + <p> 102 + <span class="button-row"> 103 + <button disabled>Save</button> 104 + <button disabled>Preview</button> 105 + <button disabled>Open in new tab</button> 106 + </span> 107 + </p> 108 + <p> 109 + Add dependencies for: 110 + </p> 111 + <form> 112 + <select> 113 + <option>Playing audio</option> 114 + <option>Adding items to the queue</option> 115 + <option>Browsing collection</option> 116 + </select> 117 + </form> 118 + <p> 119 + <span class="button-row"> 120 + <button disabled>Add code</button> 121 + </span> 122 + </p> 123 + </div> 124 + </div> 125 + </section> 126 + 127 + <!-- FOUNDATION --> 128 + <section> 129 + <h2 id="foundation">Foundation</h2> 130 + <p> 131 + The default configuration for constituents includes the following elements which are loaded automatically: 132 + </p> 133 + <ul> 134 + <li>orchestrator / input</li> 135 + <li>orchestrator / output</li> 136 + <li>orchestrator / process-tracks <small>(process on launch)</small></li> 137 + <li>processor / metadata</li> 138 + </ul> 139 + <p> 140 + Besides this the foundation provides most other elements preconfigured. These are lazy loaded so you do need to call the method in order to load it. For example: 141 + </p> 142 + <pre><code>import defaults from "@common/constituents/default/config.js" 143 + defaults.lazy.engine.audio()</code></pre> 144 + </section> 145 + </main> 146 + 147 + </body> 148 + </html>
+2
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/loader/constituent/index.js
··· 1 + 2 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/loader/constituent/index.js.map
··· 1 + {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/themes/loader/constituent/index.js.map"}
+31
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/loader/constituent/s/index.html
··· 1 + <html lang="en"> 2 + <head> 3 + <meta charset="UTF-8" /> 4 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 5 + 6 + <meta name="media-controllable" /> 7 + <meta name="mobile-web-app-capable" content="yes" /> 8 + 9 + <title>Diffuse</title> 10 + 11 + <!-- Base --> 12 + <base href="../../../../" /> 13 + 14 + <!-- Favicons & Mobile --> 15 + <link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon.png" /> 16 + <link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png" /> 17 + <link rel="icon" type="image/png" sizes="16x16" href="favicon-16x16.png" /> 18 + <!-- TODO: <link rel="manifest" href="site.webmanifest" />--> 19 + <link rel="mask-icon" href="safari-pinned-tab.svg" color="#8a90a9" /> 20 + <meta name="msapplication-TileColor" content="#8a90a9" /> 21 + <meta name="theme-color" content="#8a90a9" /> 22 + 23 + <!-- Styles --> 24 + <link rel="stylesheet" href="styles/base.css" /> 25 + 26 + <!-- Scripts --> 27 + </head> 28 + <body> 29 + 30 + </body> 31 + </html>
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/98-vars.css
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/98-vars.css
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/98-vars.css.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/98-vars.css.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/browser/element.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/themes/webamp/browser/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/browser/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/browser/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/browser/index.html
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/browser/index.html
+60
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/browser/index.js
··· 1 + import { 2 + element_default 3 + } from "../../../chunk-NUCRFIN6.js"; 4 + import "../../../chunk-N5CHD32K.js"; 5 + import { 6 + config_default 7 + } from "../../../chunk-OS4QRJDG.js"; 8 + import "../../../chunk-UT643YRI.js"; 9 + import "../../../chunk-I4QT5UNG.js"; 10 + import "../../../chunk-NEVFYBXS.js"; 11 + import "../../../chunk-5U6EFMUU.js"; 12 + import "../../../chunk-UBNX6MK2.js"; 13 + import "../../../chunk-IMYGW2WM.js"; 14 + import "../../../chunk-WYFYW7EG.js"; 15 + import "../../../chunk-G2LBW36E.js"; 16 + import "../../../chunk-VTFKOL5E.js"; 17 + import "../../../chunk-FIMGEMH3.js"; 18 + import "../../../chunk-DR6IVCFO.js"; 19 + import "../../../chunk-US7RU3UC.js"; 20 + import "../../../chunk-W4NIMENU.js"; 21 + import "../../../chunk-VHBDVMZU.js"; 22 + import "../../../chunk-DNOJCDYS.js"; 23 + import "../../../chunk-T3A2JWMA.js"; 24 + import "../../../chunk-3SOBXJU4.js"; 25 + import "../../../chunk-EA2BHPCN.js"; 26 + import "../../../chunk-FXE6KMVX.js"; 27 + import "../../../chunk-T7ZRMWZE.js"; 28 + import "../../../chunk-Y3JXXCWQ.js"; 29 + import "../../../chunk-TBEAZQZQ.js"; 30 + import "../../../chunk-7IE47WTB.js"; 31 + import "../../../chunk-7J35BYGY.js"; 32 + import "../../../chunk-ZMAPA42U.js"; 33 + import "../../../chunk-N6PLTDUY.js"; 34 + import "../../../chunk-UWEF6NCQ.js"; 35 + import "../../../chunk-BGA2NGTF.js"; 36 + import "../../../chunk-ZBNFP3DI.js"; 37 + import "../../../chunk-AN7CZG6F.js"; 38 + import "../../../chunk-J7D6CDIP.js"; 39 + import "../../../chunk-2X53XAU6.js"; 40 + import "../../../chunk-AFAFCDHW.js"; 41 + import "../../../chunk-5PUD235R.js"; 42 + import "../../../chunk-SRUOXJB6.js"; 43 + import "../../../chunk-KM7A6C4E.js"; 44 + import "../../../chunk-OSIZG2BO.js"; 45 + import "../../../chunk-UDP6MTZR.js"; 46 + import "../../../chunk-7IARE43G.js"; 47 + 48 + // themes/webamp/browser/index.js 49 + var queue = config_default.lazy.engine.queue(); 50 + var search = config_default.lazy.processor.search(); 51 + config_default.lazy.orchestrator.queueTracks(); 52 + config_default.lazy.orchestrator.searchTracks(); 53 + var el = new element_default(); 54 + el.setAttribute("input-selector", config_default.orchestrator.input.selector); 55 + el.setAttribute("output-selector", config_default.orchestrator.output.selector); 56 + el.setAttribute("queue-engine-selector", queue.selector); 57 + el.setAttribute("search-processor-selector", search.selector); 58 + document.querySelector("#placeholder")?.replaceWith(el); 59 + 60 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/browser/index.js.map
··· 1 + {"version":3,"sources":["/index.js"],"sourcesContent":["import defaults from \"@common/constituents/default/config.js\";\nimport BrowserElement from \"@themes/webamp/browser/element.js\";\n\nconst queue = defaults.lazy.engine.queue();\nconst search = defaults.lazy.processor.search();\n\ndefaults.lazy.orchestrator.queueTracks();\ndefaults.lazy.orchestrator.searchTracks();\n\nconst el = new BrowserElement();\nel.setAttribute(\"input-selector\", defaults.orchestrator.input.selector);\nel.setAttribute(\"output-selector\", defaults.orchestrator.output.selector);\nel.setAttribute(\"queue-engine-selector\", queue.selector);\nel.setAttribute(\"search-processor-selector\", search.selector);\n\ndocument.querySelector(\"#placeholder\")?.replaceWith(el);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,IAAM,QAAQ,eAAS,KAAK,OAAO,MAAM;AACzC,IAAM,SAAS,eAAS,KAAK,UAAU,OAAO;AAE9C,eAAS,KAAK,aAAa,YAAY;AACvC,eAAS,KAAK,aAAa,aAAa;AAExC,IAAM,KAAK,IAAI,gBAAe;AAC9B,GAAG,aAAa,kBAAkB,eAAS,aAAa,MAAM,QAAQ;AACtE,GAAG,aAAa,mBAAmB,eAAS,aAAa,OAAO,QAAQ;AACxE,GAAG,aAAa,yBAAyB,MAAM,QAAQ;AACvD,GAAG,aAAa,6BAA6B,OAAO,QAAQ;AAE5D,SAAS,cAAc,cAAc,GAAG,YAAY,EAAE;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/themes/webamp/browser/index.js.map"}
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/common/ui.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/themes/webamp/common/ui.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/common/ui.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/common/ui.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/configurators/input/element.js
··· 1 + ../../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/themes/webamp/configurators/input/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/configurators/input/element.js.map
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/configurators/input/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/configurators/input/index.html
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/configurators/input/index.html
+56
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/configurators/input/index.js
··· 1 + import { 2 + element_default 3 + } from "../../../../chunk-R72UCYY5.js"; 4 + import "../../../../chunk-N5CHD32K.js"; 5 + import { 6 + config_default 7 + } from "../../../../chunk-OS4QRJDG.js"; 8 + import "../../../../chunk-UT643YRI.js"; 9 + import "../../../../chunk-I4QT5UNG.js"; 10 + import "../../../../chunk-NEVFYBXS.js"; 11 + import "../../../../chunk-5U6EFMUU.js"; 12 + import "../../../../chunk-UBNX6MK2.js"; 13 + import "../../../../chunk-IMYGW2WM.js"; 14 + import "../../../../chunk-WYFYW7EG.js"; 15 + import "../../../../chunk-G2LBW36E.js"; 16 + import "../../../../chunk-VTFKOL5E.js"; 17 + import "../../../../chunk-FIMGEMH3.js"; 18 + import "../../../../chunk-DR6IVCFO.js"; 19 + import "../../../../chunk-US7RU3UC.js"; 20 + import "../../../../chunk-W4NIMENU.js"; 21 + import "../../../../chunk-VHBDVMZU.js"; 22 + import "../../../../chunk-DNOJCDYS.js"; 23 + import "../../../../chunk-T3A2JWMA.js"; 24 + import "../../../../chunk-3SOBXJU4.js"; 25 + import "../../../../chunk-EA2BHPCN.js"; 26 + import "../../../../chunk-FXE6KMVX.js"; 27 + import "../../../../chunk-T7ZRMWZE.js"; 28 + import "../../../../chunk-Y3JXXCWQ.js"; 29 + import "../../../../chunk-TBEAZQZQ.js"; 30 + import "../../../../chunk-7IE47WTB.js"; 31 + import "../../../../chunk-7J35BYGY.js"; 32 + import "../../../../chunk-ZMAPA42U.js"; 33 + import "../../../../chunk-N6PLTDUY.js"; 34 + import "../../../../chunk-UWEF6NCQ.js"; 35 + import "../../../../chunk-BGA2NGTF.js"; 36 + import "../../../../chunk-ZBNFP3DI.js"; 37 + import "../../../../chunk-AN7CZG6F.js"; 38 + import "../../../../chunk-J7D6CDIP.js"; 39 + import "../../../../chunk-2X53XAU6.js"; 40 + import "../../../../chunk-AFAFCDHW.js"; 41 + import "../../../../chunk-5PUD235R.js"; 42 + import "../../../../chunk-SRUOXJB6.js"; 43 + import "../../../../chunk-KM7A6C4E.js"; 44 + import "../../../../chunk-OSIZG2BO.js"; 45 + import "../../../../chunk-UDP6MTZR.js"; 46 + import "../../../../chunk-7IARE43G.js"; 47 + 48 + // themes/webamp/configurators/input/index.js 49 + var sources = config_default.lazy.orchestrator.sources(); 50 + var el = new element_default(); 51 + el.setAttribute("input-selector", config_default.orchestrator.input.selector); 52 + el.setAttribute("output-selector", config_default.orchestrator.output.selector); 53 + el.setAttribute("sources-orchestrator-selector", sources.selector); 54 + document.querySelector("#placeholder")?.replaceWith(el); 55 + 56 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/configurators/input/index.js.map
··· 1 + {"version":3,"sources":["/index.js"],"sourcesContent":["import defaults from \"@common/constituents/default/config.js\";\nimport InputConfigElement from \"@themes/webamp/configurators/input/element.js\";\n\nconst sources = defaults.lazy.orchestrator.sources();\n\nconst el = new InputConfigElement();\nel.setAttribute(\"input-selector\", defaults.orchestrator.input.selector);\nel.setAttribute(\"output-selector\", defaults.orchestrator.output.selector);\nel.setAttribute(\"sources-orchestrator-selector\", sources.selector);\n\ndocument.querySelector(\"#placeholder\")?.replaceWith(el);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,IAAM,UAAU,eAAS,KAAK,aAAa,QAAQ;AAEnD,IAAM,KAAK,IAAI,gBAAmB;AAClC,GAAG,aAAa,kBAAkB,eAAS,aAAa,MAAM,QAAQ;AACtE,GAAG,aAAa,mBAAmB,eAAS,aAAa,OAAO,QAAQ;AACxE,GAAG,aAAa,iCAAiC,QAAQ,QAAQ;AAEjE,SAAS,cAAc,cAAc,GAAG,YAAY,EAAE;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/themes/webamp/configurators/input/index.js.map"}
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/configurators/output.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/themes/webamp/configurators/output.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/configurators/output.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/configurators/output.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/constituent.css
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/constituent.css
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/constituent.css.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/constituent.css.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/fonts.css
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/fonts.css
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/fonts.css.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/fonts.css.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/index.css
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/index.css
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/index.css.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/index.css.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/index.html
··· 1 + ../../../bafybeih2s36bol7uisrik77ciyli5rhge2bikg7ezv7g43reykdd4jkaiq/themes/webamp/index.html
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/index.js
··· 1 + ../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/themes/webamp/index.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/index.js.map
··· 1 + ../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/themes/webamp/index.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/webamp/element.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/themes/webamp/webamp/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/webamp/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/webamp/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/window-manager/element.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/themes/webamp/window-manager/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/window-manager/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/window-manager/element.js.map
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/window/element.js
··· 1 + ../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/themes/webamp/window/element.js
+1
artifacts/bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/themes/webamp/window/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/window/element.js.map
+1 -1
artifacts/versions.json
··· 4 4 "version": "3.5.0" 5 5 }, 6 6 "4.0.0-alpha": { 7 - "cid": "bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou", 7 + "cid": "bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da", 8 8 "version": "4.0.0-alpha" 9 9 } 10 10 }