"use strict";(self.webpackChunkmontana_messenger=self.webpackChunkmontana_messenger||[]).push([[3272],{53272(e,t,a){a.r(t),a.d(t,{MP4Parser:()=>Q});var s=a(17833),n=a(4017),r=a(74604),i=a(68191),o=a(5031),l=a(63324),c=a(56185);const d=s("music-metadata:parser:MP4:atom");class h extends((0,l.fO)("MP4")){}const m={len:8,get:(e,t)=>{const a=n.UINT32_BE.get(e,t);if(a<0)throw new h("Invalid atom header length");return{length:BigInt(a),name:new n.StringType(4,"latin1").get(e,t+4)}},put:(e,t,a)=>(n.UINT32_BE.put(e,t,Number(a.length)),o.e.put(e,t+4,a.name))},g=n.UINT64_BE,p={len:4,get:(e,t)=>({type:new n.StringType(4,"ascii").get(e,t)})};class u{constructor(e,t,a){if(et&&d(`Warning: atom ${a} expected to be ${t}, but was actually ${e} bytes long.`),this.len=e}}const f=(e,t)=>{const a=n.UINT32_BE.get(e,t)-2082844800;return new Date(1e3*a)};class T extends u{constructor(e){super(e,24,"mdhd")}get(e,t){return{version:n.UINT8.get(e,t+0),flags:n.UINT24_BE.get(e,t+1),creationTime:f(e,t+4),modificationTime:f(e,t+8),timeScale:n.UINT32_BE.get(e,t+12),duration:n.UINT32_BE.get(e,t+16),language:n.UINT16_BE.get(e,t+20),quality:n.UINT16_BE.get(e,t+22)}}}class k extends u{constructor(e){super(e,100,"mvhd")}get(e,t){return{version:n.UINT8.get(e,t),flags:n.UINT24_BE.get(e,t+1),creationTime:f(e,t+4),modificationTime:f(e,t+8),timeScale:n.UINT32_BE.get(e,t+12),duration:n.UINT32_BE.get(e,t+16),preferredRate:n.UINT32_BE.get(e,t+20),preferredVolume:n.UINT16_BE.get(e,t+24),previewTime:n.UINT32_BE.get(e,t+72),previewDuration:n.UINT32_BE.get(e,t+76),posterTime:n.UINT32_BE.get(e,t+80),selectionTime:n.UINT32_BE.get(e,t+84),selectionDuration:n.UINT32_BE.get(e,t+88),currentTime:n.UINT32_BE.get(e,t+92),nextTrackID:n.UINT32_BE.get(e,t+96)}}}class I{constructor(e){this.len=e}get(e,t){return{type:{set:n.UINT8.get(e,t+0),type:n.UINT24_BE.get(e,t+1)},locale:n.UINT24_BE.get(e,t+4),value:new n.Uint8ArrayType(this.len-8).get(e,t+8)}}}class w{constructor(e){this.len=e}get(e,t){return{version:n.UINT8.get(e,t),flags:n.UINT24_BE.get(e,t+1),name:new n.StringType(this.len-4,"utf-8").get(e,t+4)}}}class N{constructor(e){this.len=e}get(e,t){return{version:n.UINT8.get(e,t),flags:n.UINT24_BE.get(e,t+1),creationTime:f(e,t+4),modificationTime:f(e,t+8),trackId:n.UINT32_BE.get(e,t+12),duration:n.UINT32_BE.get(e,t+20),layer:n.UINT16_BE.get(e,t+24),alternateGroup:n.UINT16_BE.get(e,t+26),volume:n.UINT16_BE.get(e,t+28)}}}class E{constructor(e){this.len=e}get(e,t){const a=this.len-12;return{dataFormat:o.e.get(e,t),dataReferenceIndex:n.UINT16_BE.get(e,t+10),description:a>0?new n.Uint8ArrayType(a).get(e,t+12):void 0}}}class y{constructor(e){this.len=e}get(e,t){const a=((e,t)=>({version:n.UINT8.get(e,t),flags:n.UINT24_BE.get(e,t+1),numberOfEntries:n.UINT32_BE.get(e,t+4)}))(e,t);t+=8;const s=[];for(let r=0;r({version:n.INT16_BE.get(e,t),revision:n.INT16_BE.get(e,t+2),vendor:n.INT32_BE.get(e,t+4)}),S=(e,t)=>({numAudioChannels:n.INT16_BE.get(e,t+0),sampleSize:n.INT16_BE.get(e,t+2),compressionId:n.INT16_BE.get(e,t+4),packetSize:n.INT16_BE.get(e,t+6),sampleRate:n.UINT16_BE.get(e,t+8)+n.UINT16_BE.get(e,t+10)/1e4});class _{constructor(e,t){this.len=e,this.token=t}get(e,t){const a=n.INT32_BE.get(e,t+4);return{version:n.INT8.get(e,t+0),flags:n.INT24_BE.get(e,t+1),numberOfEntries:a,entries:D(e,this.token,t+8,this.len-8,a)}}}const U={len:8,get:(e,t)=>({count:n.INT32_BE.get(e,t+0),duration:n.INT32_BE.get(e,t+4)})};class z extends _{constructor(e){super(e,U)}}const P={len:12,get:(e,t)=>({firstChunk:n.INT32_BE.get(e,t),samplesPerChunk:n.INT32_BE.get(e,t+4),sampleDescriptionId:n.INT32_BE.get(e,t+8)})};class v extends _{constructor(e){super(e,P)}}class C{constructor(e){this.len=e}get(e,t){const a=n.INT32_BE.get(e,t+8);return{version:n.INT8.get(e,t),flags:n.INT24_BE.get(e,t+1),sampleSize:n.INT32_BE.get(e,t+4),numberOfEntries:a,entries:D(e,n.INT32_BE,t+12,this.len-12,a)}}}class A extends _{constructor(e){super(e,n.INT32_BE),this.len=e}}class ${constructor(e){this.len=e}get(e,t){const a=n.INT16_BE.get(e,t+0);return new n.StringType(a,"utf-8").get(e,t+2)}}function D(e,t,a,s,n){if(d(`remainingLen=${s}, numberOfEntries=${n} * token-len=${t.len}`),0===s)return[];if(s!==n*t.len)throw new h("mismatch number-of-entries with remaining atom-length");const r=[];for(let s=0;s=this.len){d("TrackRunBox size mismatch");break}const t={};s.flags.sampleDurationPresent&&(t.sampleDuration=n.UINT32_BE.get(e,r),r+=4),s.flags.sampleSizePresent&&(t.sampleSize=n.UINT32_BE.get(e,r),r+=4),s.flags.sampleFlagsPresent&&(t.sampleFlags=n.UINT32_BE.get(e,r),r+=4),s.flags.sampleCompositionTimeOffsetsPresent&&(t.sampleCompositionTimeOffset=n.UINT32_BE.get(e,r),r+=4),s.samples.push(t)}return s}}class O{constructor(e){this.len=e}get(e,t){const a=new n.StringType(4,"utf-8");return{version:n.INT8.get(e,t),flags:n.UINT24_BE.get(e,t+1),componentType:a.get(e,t+4),handlerType:a.get(e,t+8),componentName:new n.StringType(this.len-28,"utf-8").get(e,t+28)}}}class L{constructor(e){this.len=e}get(e,t){let a=0;const s=[];for(;a0;){const s=await R.readAtom(e,t,this,a);this.children.push(s),a-=0n===s.header.length?a:Number(s.header.length)}}async readData(e,t,a){switch(this.header.name){case"moov":case"udta":case"mdia":case"minf":case"stbl":case"":case"ilst":case"tref":case"moof":return this.readAtoms(e,t,this.getPayloadLength(a));case"meta":{const s="hdlr"===(await e.peekToken(m)).name?0:4;return await e.ignore(s),this.readAtoms(e,t,this.getPayloadLength(a)-s)}default:return t(this,a)}}}var V=a(45207),W=a(78523),j=a(12971);const q=s("music-metadata:parser:MP4"),G={raw:{lossy:!1,format:"raw"},MAC3:{lossy:!0,format:"MACE 3:1"},MAC6:{lossy:!0,format:"MACE 6:1"},ima4:{lossy:!0,format:"IMA 4:1"},ulaw:{lossy:!0,format:"uLaw 2:1"},alaw:{lossy:!0,format:"uLaw 2:1"},Qclp:{lossy:!0,format:"QUALCOMM PureVoice"},".mp3":{lossy:!0,format:"MPEG-1 layer 3"},alac:{lossy:!1,format:"ALAC"},"ac-3":{lossy:!0,format:"AC-3"},mp4a:{lossy:!0,format:"MPEG-4/AAC"},mp4s:{lossy:!0,format:"MP4S"},c608:{lossy:!0,format:"CEA-608"},c708:{lossy:!0,format:"CEA-708"}};function H(e,t,a){return a.indexOf(e)===t}class Q extends r.s{constructor(){super(...arguments),this.tracks=new Map,this.hasVideoTrack=!1,this.hasAudioTrack=!0,this.atomParsers={mvhd:async e=>{const t=await this.tokenizer.readToken(new k(e));this.metadata.setFormat("creationTime",t.creationTime),this.metadata.setFormat("modificationTime",t.modificationTime)},chap:async e=>{const t=this.getTrackDescription(),a=[];for(;e>=n.UINT32_BE.len;)a.push(await this.tokenizer.readNumber(n.UINT32_BE)),e-=n.UINT32_BE.len;t.chapterList=a},mdat:async e=>{if(this.options.includeChapters){const t=[...this.tracks.values()].filter(e=>e.chapterList);if(1===t.length){const a=t[0].chapterList,s=[...this.tracks.values()].filter(e=>-1!==a.indexOf(e.header.trackId));if(1===s.length)return this.parseChapterTrack(s[0],t[0],e)}}await this.tokenizer.ignore(e)},ftyp:async e=>{const t=[];for(;e>0;){const a=await this.tokenizer.readToken(p);e-=p.len;const s=a.type.replace(/\W/g,"");s.length>0&&t.push(s)}q(`ftyp: ${t.join("/")}`);const a=t.filter(H).join("/");this.metadata.setFormat("container",a)},stsd:async e=>{const t=await this.tokenizer.readToken(new y(e));this.getTrackDescription().soundSampleDescription=t.table.map(e=>this.parseSoundSampleDescription(e))},stsz:async e=>{const t=await this.tokenizer.readToken(new C(e)),a=this.getTrackDescription();a.sampleSize=t.sampleSize,a.sampleSizeTable=t.entries},date:async e=>{const t=await this.tokenizer.readToken(new n.StringType(e,"utf-8"));await this.addTag("date",t)}}}static read_BE_Integer(e,t){const a=(t?"INT":"UINT")+8*e.length+(e.length>1?"_BE":""),s=n[a];if(!s)throw new h(`Token for integer type not found: "${a}"`);return Number(s.get(e,0))}async parse(){this.hasVideoTrack=!1,this.hasAudioTrack=!0,this.tracks.clear();let e=this.tokenizer.fileInfo.size||0;for(;!this.tokenizer.fileInfo.size||e>0;){try{if("\0\0\0\0"===(await this.tokenizer.peekToken(m)).name){const e=`Error at offset=${this.tokenizer.position}: box.id=0`;q(e),this.addWarning(e);break}}catch(e){if(!(e instanceof Error))throw e;{const t=`Error at offset=${this.tokenizer.position}: ${e.message}`;q(t),this.addWarning(t)}break}const t=await R.readAtom(this.tokenizer,(e,t)=>this.handleAtom(e,t),null,e);e-=t.header.length===BigInt(0)?e:Number(t.header.length)}const t=[];this.tracks.forEach(e=>{const a=[];e.soundSampleDescription.forEach(e=>{const t={},s=G[e.dataFormat];if(s?(a.push(s.format),t.codecName=s.format):t.codecName=`<${e.dataFormat}>`,e.description){const{description:a}=e;a.sampleRate>0&&(t.type=V.S.audio,t.audio={samplingFrequency:a.sampleRate,bitDepth:a.sampleSize,channels:a.numAudioChannels})}this.metadata.addStreamInfo(t)}),a.length>=1&&t.push(a.join("/"))}),t.length>0&&this.metadata.setFormat("codec",t.filter(H).join("+"));const a=[...this.tracks.values()].filter(e=>e.soundSampleDescription.length>=1&&e.soundSampleDescription[0].description&&e.soundSampleDescription[0].description.numAudioChannels>0);for(const e of a){if(e.media.header&&e.media.header.timeScale>0)if(e.sampleRate=e.media.header.timeScale,e.media.header.duration>0&&(q("Using duration defined on audio track"),e.samples=e.media.header.duration,e.duration=e.samples/e.sampleRate),e.fragments.length>0){q("Calculate duration defined in track fragments");let t=0;e.sizeInBytes=0;for(const a of e.fragments)for(const s of a.trackRun.samples){const n=s.sampleDuration??a.header.defaultSampleDuration??0,r=s.sampleSize??a.header.defaultSampleSize??0;if(0===n)throw new Error("Missing sampleDuration and no defaultSampleDuration in track fragment header");if(0===r)throw new Error("Missing sampleSize and no defaultSampleSize in track fragment header");t+=n,e.sizeInBytes+=r}e.samples||(e.samples=t),e.duration||(e.duration=t/e.sampleRate)}else e.sampleSizeTable.length>0&&(e.sizeInBytes=e.sampleSizeTable.reduce((e,t)=>e+t,0));const t=e.soundSampleDescription[0];if(t.description&&e.media.header&&(this.metadata.setFormat("sampleRate",t.description.sampleRate),this.metadata.setFormat("bitsPerSample",t.description.sampleSize),this.metadata.setFormat("numberOfChannels",t.description.numAudioChannels),0===e.media.header.timeScale&&e.timeToSampleTable.length>0)){const a=e.timeToSampleTable.map(e=>e.count*e.duration).reduce((e,t)=>e+t);e.duration=a/t.description.sampleRate}const a=G[t.dataFormat];a&&this.metadata.setFormat("lossless",!a.lossy)}if(a.length>=1){const e=a[0];e.duration&&(this.metadata.setFormat("duration",e.duration),e.sizeInBytes&&this.metadata.setFormat("bitrate",8*e.sizeInBytes/e.duration))}this.metadata.setFormat("hasAudio",this.hasAudioTrack),this.metadata.setFormat("hasVideo",this.hasVideoTrack)}async handleAtom(e,t){if(e.parent)switch(e.parent.header.name){case"ilst":case"":return this.parseMetadataItemData(e);case"moov":switch(e.header.name){case"trak":case"udta":return this.parseTrackBox(e)}break;case"moof":if("traf"===e.header.name)return this.parseTrackFragmentBox(e)}if(this.atomParsers[e.header.name])return this.atomParsers[e.header.name](t);q(`No parser for atom path=${e.atomPath}, payload-len=${t}, ignoring atom`),await this.tokenizer.ignore(t)}getTrackDescription(){const e=[...this.tracks.values()];return e[e.length-1]}async addTag(e,t){await this.metadata.addTag("iTunes",e,t)}addWarning(e){q(`Warning: ${e}`),this.metadata.addWarning(e)}parseMetadataItemData(e){let t=e.header.name;return e.readAtoms(this.tokenizer,async(e,a)=>{const s=e.getPayloadLength(a);switch(e.header.name){case"data":return this.parseValueAtom(t,e);case"name":case"mean":case"rate":{const e=await this.tokenizer.readToken(new w(s));t+=`:${e.name}`;break}default:{const a=await this.tokenizer.readToken(new n.Uint8ArrayType(s));this.addWarning(`Unsupported meta-item: ${t}[${e.header.name}] => value=${(0,W.EY)(a)} ascii=${(0,j.c)(a,"ascii")}`)}}},e.getPayloadLength(0))}async parseValueAtom(e,t){const a=await this.tokenizer.readToken(new I(Number(t.header.length)-m.len));if(0!==a.type.set)throw new h(`Unsupported type-set != 0: ${a.type.set}`);switch(a.type.type){case 0:switch(e){case"trkn":case"disk":{const t=n.UINT8.get(a.value,3),s=n.UINT8.get(a.value,5);await this.addTag(e,`${t}/${s}`);break}case"gnre":{const t=n.UINT8.get(a.value,1),s=i.jR[t-1];await this.addTag(e,s);break}case"rate":{const t=(0,j.c)(a.value,"ascii");await this.addTag(e,t);break}default:q(`unknown proprietary value type for: ${t.atomPath}`)}break;case 1:case 18:await this.addTag(e,(0,j.c)(a.value));break;case 13:if(this.options.skipCovers)break;await this.addTag(e,{format:"image/jpeg",data:Uint8Array.from(a.value)});break;case 14:if(this.options.skipCovers)break;await this.addTag(e,{format:"image/png",data:Uint8Array.from(a.value)});break;case 21:await this.addTag(e,Q.read_BE_Integer(a.value,!0));break;case 22:await this.addTag(e,Q.read_BE_Integer(a.value,!1));break;case 65:await this.addTag(e,n.UINT8.get(a.value,0));break;case 66:await this.addTag(e,n.UINT16_BE.get(a.value,0));break;case 67:await this.addTag(e,n.UINT32_BE.get(a.value,0));break;default:this.addWarning(`atom key=${e}, has unknown well-known-type (data-type): ${a.type.type}`)}}async parseTrackBox(e){const t={media:{},fragments:[]};await e.readAtoms(this.tokenizer,async(e,a)=>{const s=e.getPayloadLength(a);switch(e.header.name){case"chap":{const e=await this.tokenizer.readToken(new L(a));t.chapterList=e;break}case"tkhd":t.header=await this.tokenizer.readToken(new N(s));break;case"hdlr":t.handler=await this.tokenizer.readToken(new O(s)),t.isAudio=()=>"audi"===t.handler.handlerType||"soun"===t.handler.handlerType,t.isVideo=()=>"vide"===t.handler.handlerType,t.isAudio()?this.hasAudioTrack=!0:t.isVideo()&&(this.hasVideoTrack=!0);break;case"mdhd":{const e=await this.tokenizer.readToken(new T(s));t.media.header=e;break}case"stco":{const e=await this.tokenizer.readToken(new A(s));t.chunkOffsetTable=e.entries;break}case"stsc":{const e=await this.tokenizer.readToken(new v(s));t.sampleToChunkTable=e.entries;break}case"stsd":{const e=await this.tokenizer.readToken(new y(s));t.soundSampleDescription=e.table.map(e=>this.parseSoundSampleDescription(e));break}case"stts":{const e=await this.tokenizer.readToken(new z(s));t.timeToSampleTable=e.entries;break}case"stsz":{const e=await this.tokenizer.readToken(new C(s));t.sampleSize=e.sampleSize,t.sampleSizeTable=e.entries;break}case"dinf":case"vmhd":case"smhd":q(`Ignoring: ${e.header.name}`),await this.tokenizer.ignore(s);break;default:q(`Unexpected track box: ${e.header.name}`),await this.tokenizer.ignore(s)}},e.getPayloadLength(0)),this.tracks.set(t.header.trackId,t)}parseTrackFragmentBox(e){let t;return e.readAtoms(this.tokenizer,async(e,a)=>{const s=e.getPayloadLength(a);switch(e.header.name){case"tfhd":{const s=new x(e.getPayloadLength(a));t=await this.tokenizer.readToken(s);break}case"tfdt":await this.tokenizer.ignore(s);break;case"trun":{const e=new F(s),a=await this.tokenizer.readToken(e);if(t){const e=this.tracks.get(t.trackId);e?.fragments.push({header:t,trackRun:a})}break}default:q(`Unexpected box: ${e.header.name}`),await this.tokenizer.ignore(s)}},e.getPayloadLength(0))}parseSoundSampleDescription(e){const t={dataFormat:e.dataFormat,dataReferenceIndex:e.dataReferenceIndex};let a=0;if(e.description){const s=b(e.description,a);a+=B,0===s.version||1===s.version?t.description=S(e.description,a):q(`Warning: sound-sample-description ${s} not implemented`)}return t}async parseChapterTrack(e,t,a){if(!e.sampleSize&&e.chunkOffsetTable.length!==e.sampleSizeTable.length)throw new Error("Expected equal chunk-offset-table & sample-size-table length.");const s=[];for(let n=0;n0;++n){const r=e.timeToSampleTable.slice(0,n).reduce((e,t)=>e+t.duration,0),i=e.chunkOffsetTable[n]-this.tokenizer.position,o=e.sampleSize>0?e.sampleSize:e.sampleSizeTable[n];if((a-=i+o)<0)throw new h("Chapter chunk exceeding token length");await this.tokenizer.ignore(i);const l=await this.tokenizer.readToken(new $(o));q(`Chapter ${n+1}: ${l}`);const c={title:l,timeScale:e.media.header?e.media.header.timeScale:0,start:r,sampleOffset:this.findSampleOffset(t,this.tokenizer.position)};q(`Chapter title=${c.title}, offset=${c.sampleOffset}/${t.header.duration}`),s.push(c)}this.metadata.setFormat("chapters",s),await this.tokenizer.ignore(a)}findSampleOffset(e,t){let a=0;for(;a=t[a].firstChunk&&e