|
@ -33,14 +33,52 @@ const printChunks = (chunks: ebml.EBMLElementDetail[], ptr = 0, depth = 0): void |
|
|
} |
|
|
} |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
const findEnclosingTag = (ch: ebml.EBMLElementDetail[], name: string): [number, number] | undefined => { |
|
|
|
|
|
const first = ch.findIndex(e => e.type == 'm' && e.name == name); |
|
|
|
|
|
if (first < 0) |
|
|
|
|
|
return; |
|
|
|
|
|
const second = ch.slice(first).findIndex(e => e.type == 'm' && e.name == name); |
|
|
|
|
|
if (second < 0) |
|
|
|
|
|
return; |
|
|
|
|
|
return [ |
|
|
|
|
|
first, first + second |
|
|
|
|
|
]; |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
const embed = (webm: Buffer, data: Buffer) => { |
|
|
const embed = (webm: Buffer, data: Buffer) => { |
|
|
const dec = new ebml.Decoder(); |
|
|
const dec = new ebml.Decoder(); |
|
|
const chunks = dec.decode(webm); |
|
|
const chunks = dec.decode(webm); |
|
|
const enc = new ebml.Encoder(); |
|
|
const enc = new ebml.Encoder(); |
|
|
const embed = chunks.findIndex(e => e.name == "Targets" && e.type == "m" && e.isEnd); |
|
|
|
|
|
if (embed == -1) |
|
|
let embed = chunks.findIndex(e => e.name == "Tracks" && e.type == "m" && e.isEnd); |
|
|
throw "Cannot embed, no tags section..."; |
|
|
|
|
|
// That's basically budget binary XML
|
|
|
const findOrInsert = (n: string) => { |
|
|
|
|
|
let tags = findEnclosingTag(chunks, n); |
|
|
|
|
|
const stack = []; |
|
|
|
|
|
if (!tags) { |
|
|
|
|
|
stack.push({ |
|
|
|
|
|
type: "m", |
|
|
|
|
|
isEnd: false, |
|
|
|
|
|
name: n, |
|
|
|
|
|
data: Buffer.from('') |
|
|
|
|
|
}); |
|
|
|
|
|
stack.push({ |
|
|
|
|
|
type: "m", |
|
|
|
|
|
isEnd: true, |
|
|
|
|
|
name: n, |
|
|
|
|
|
data: Buffer.from('') |
|
|
|
|
|
}); |
|
|
|
|
|
chunks.splice(embed + 1, 0, ...stack as any); |
|
|
|
|
|
tags = findEnclosingTag(chunks, n); |
|
|
|
|
|
} |
|
|
|
|
|
embed = tags![1]; |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
findOrInsert('Tags'); |
|
|
|
|
|
findOrInsert('Tag'); |
|
|
|
|
|
findOrInsert('Targets'); |
|
|
|
|
|
embed++; |
|
|
|
|
|
|
|
|
chunks.splice(embed + 1, 0, ...[ |
|
|
chunks.splice(embed + 1, 0, ...[ |
|
|
{ |
|
|
{ |
|
|
type: "m", |
|
|
type: "m", |
|
|