mirror of
https://github.com/arcodange-org/mediabunny.git
synced 2026-10-02 21:33:52 +02:00
Disallow non-Latin-1 strings for WAVE metadata tags
This commit is contained in:
+35
-27
@@ -14,7 +14,7 @@ import { RiffWriter } from './riff-writer';
|
|||||||
import { Writer } from '../writer';
|
import { Writer } from '../writer';
|
||||||
import { EncodedPacket } from '../packet';
|
import { EncodedPacket } from '../packet';
|
||||||
import { WavOutputFormat } from '../output-format';
|
import { WavOutputFormat } from '../output-format';
|
||||||
import { assert, assertNever, keyValueIterator } from '../misc';
|
import { assert, assertNever, isIso88591Compatible, keyValueIterator } from '../misc';
|
||||||
import { MetadataTags, metadataTagsAreEmpty } from '../tags';
|
import { MetadataTags, metadataTagsAreEmpty } from '../tags';
|
||||||
|
|
||||||
export class WaveMuxer extends Muxer {
|
export class WaveMuxer extends Muxer {
|
||||||
@@ -189,20 +189,46 @@ export class WaveMuxer extends Muxer {
|
|||||||
|
|
||||||
const writtenTags = new Set<string>();
|
const writtenTags = new Set<string>();
|
||||||
|
|
||||||
|
const writeInfoTag = (tag: string, value: string) => {
|
||||||
|
if (!isIso88591Compatible(value)) {
|
||||||
|
// No Unicode supported here
|
||||||
|
console.warn(`Didn't write tag '${tag}' because '${value}' is not ISO 8859-1-compatible.`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const size = value.length + 1; // +1 for null terminator
|
||||||
|
const bytes = new Uint8Array(size);
|
||||||
|
|
||||||
|
for (let i = 0; i < value.length; i++) {
|
||||||
|
bytes[i] = value.charCodeAt(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.riffWriter.writeAscii(tag);
|
||||||
|
this.riffWriter.writeU32(size);
|
||||||
|
this.writer.write(bytes);
|
||||||
|
|
||||||
|
// Add padding byte if size is odd
|
||||||
|
if (size & 1) {
|
||||||
|
this.writer.write(new Uint8Array(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
writtenTags.add(tag);
|
||||||
|
};
|
||||||
|
|
||||||
for (const { key, value } of keyValueIterator(metadata)) {
|
for (const { key, value } of keyValueIterator(metadata)) {
|
||||||
switch (key) {
|
switch (key) {
|
||||||
case 'title': {
|
case 'title': {
|
||||||
this.writeInfoTag('INAM', value);
|
writeInfoTag('INAM', value);
|
||||||
writtenTags.add('INAM');
|
writtenTags.add('INAM');
|
||||||
}; break;
|
}; break;
|
||||||
|
|
||||||
case 'artist': {
|
case 'artist': {
|
||||||
this.writeInfoTag('IART', value);
|
writeInfoTag('IART', value);
|
||||||
writtenTags.add('IART');
|
writtenTags.add('IART');
|
||||||
}; break;
|
}; break;
|
||||||
|
|
||||||
case 'album': {
|
case 'album': {
|
||||||
this.writeInfoTag('IPRD', value);
|
writeInfoTag('IPRD', value);
|
||||||
writtenTags.add('IPRD');
|
writtenTags.add('IPRD');
|
||||||
}; break;
|
}; break;
|
||||||
|
|
||||||
@@ -211,22 +237,22 @@ export class WaveMuxer extends Muxer {
|
|||||||
? `${value}/${metadata.tracksTotal}`
|
? `${value}/${metadata.tracksTotal}`
|
||||||
: value.toString();
|
: value.toString();
|
||||||
|
|
||||||
this.writeInfoTag('ITRK', string);
|
writeInfoTag('ITRK', string);
|
||||||
writtenTags.add('ITRK');
|
writtenTags.add('ITRK');
|
||||||
}; break;
|
}; break;
|
||||||
|
|
||||||
case 'genre': {
|
case 'genre': {
|
||||||
this.writeInfoTag('IGNR', value);
|
writeInfoTag('IGNR', value);
|
||||||
writtenTags.add('IGNR');
|
writtenTags.add('IGNR');
|
||||||
}; break;
|
}; break;
|
||||||
|
|
||||||
case 'date': {
|
case 'date': {
|
||||||
this.writeInfoTag('ICRD', value.toISOString().slice(0, 10));
|
writeInfoTag('ICRD', value.toISOString().slice(0, 10));
|
||||||
writtenTags.add('ICRD');
|
writtenTags.add('ICRD');
|
||||||
}; break;
|
}; break;
|
||||||
|
|
||||||
case 'comment': {
|
case 'comment': {
|
||||||
this.writeInfoTag('ICMT', value);
|
writeInfoTag('ICMT', value);
|
||||||
writtenTags.add('ICMT');
|
writtenTags.add('ICMT');
|
||||||
}; break;
|
}; break;
|
||||||
|
|
||||||
@@ -256,7 +282,7 @@ export class WaveMuxer extends Muxer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (typeof value === 'string') {
|
if (typeof value === 'string') {
|
||||||
this.writeInfoTag(key, value);
|
writeInfoTag(key, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -274,24 +300,6 @@ export class WaveMuxer extends Muxer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private writeInfoTag(tag: string, value: string) {
|
|
||||||
const size = value.length + 1; // +1 for null terminator
|
|
||||||
const bytes = new Uint8Array(size);
|
|
||||||
|
|
||||||
for (let i = 0; i < value.length; i++) {
|
|
||||||
bytes[i] = value.charCodeAt(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.riffWriter.writeAscii(tag);
|
|
||||||
this.riffWriter.writeU32(size);
|
|
||||||
this.writer.write(bytes);
|
|
||||||
|
|
||||||
// Add padding byte if size is odd
|
|
||||||
if (size & 1) {
|
|
||||||
this.writer.write(new Uint8Array(1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async finalize() {
|
async finalize() {
|
||||||
const release = await this.mutex.acquire();
|
const release = await this.mutex.acquire();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user