From e6420caea472772e5540d0051c02f7524d19fe52 Mon Sep 17 00:00:00 2001 From: Vanilagy <1696106+Vanilagy@users.noreply.github.com> Date: Sat, 23 Aug 2025 15:58:58 +0200 Subject: [PATCH] Add support for LanguageBCP47 --- src/matroska/ebml.ts | 1 + src/matroska/matroska-demuxer.ts | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/matroska/ebml.ts b/src/matroska/ebml.ts index 21f599b..17207f8 100644 --- a/src/matroska/ebml.ts +++ b/src/matroska/ebml.ts @@ -88,6 +88,7 @@ export enum EBMLId { FlagLacing = 0x9c, Name = 0x536e, Language = 0x22b59c, + LanguageBCP47 = 0x22b59d, CodecID = 0x86, CodecPrivate = 0x63a2, CodecDelay = 0x56aa, diff --git a/src/matroska/matroska-demuxer.ts b/src/matroska/matroska-demuxer.ts index 194d35b..86dff1d 100644 --- a/src/matroska/matroska-demuxer.ts +++ b/src/matroska/matroska-demuxer.ts @@ -1014,6 +1014,7 @@ export class MatroskaDemuxer extends Demuxer { case EBMLId.Language: { if (!this.currentTrack) break; + if (this.currentTrack.languageCode) break; // LanguageBCP47 was present, which takes precedence this.currentTrack.languageCode = reader.readAsciiString(size); @@ -1022,6 +1023,23 @@ export class MatroskaDemuxer extends Demuxer { } }; break; + case EBMLId.LanguageBCP47: { + if (!this.currentTrack) break; + + const bcp47 = reader.readAsciiString(size); + const languageSubtag = bcp47.split('-')[0]; + + if (languageSubtag) { + // Technically invalid, for now: The language subtag might be a language code from ISO 639-1, + // ISO 639-2, ISO 639-3, ISO 639-5 or some other thing (source: Wikipedia). But, `languageCode` is + // documented as ISO 639-2. Changing the definition would be a breaking change. This will get + // cleaned up in the future by defining languageCode to be BCP 47 instead. + this.currentTrack.languageCode = languageSubtag; + } else { + this.currentTrack.languageCode = UNDETERMINED_LANGUAGE; + } + }; break; + case EBMLId.Video: { if (this.currentTrack?.info?.type !== 'video') break;