@kenzuya/mediabunny 1.26.0 → 1.28.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/README.md +1 -1
  2. package/dist/bundles/{mediabunny.mjs → mediabunny.js} +21963 -21390
  3. package/dist/bundles/mediabunny.min.js +490 -0
  4. package/dist/modules/shared/mp3-misc.d.ts.map +1 -1
  5. package/dist/modules/src/adts/adts-demuxer.d.ts +6 -6
  6. package/dist/modules/src/adts/adts-demuxer.d.ts.map +1 -1
  7. package/dist/modules/src/adts/adts-muxer.d.ts +4 -4
  8. package/dist/modules/src/adts/adts-muxer.d.ts.map +1 -1
  9. package/dist/modules/src/adts/adts-reader.d.ts +1 -1
  10. package/dist/modules/src/adts/adts-reader.d.ts.map +1 -1
  11. package/dist/modules/src/avi/avi-demuxer.d.ts +44 -0
  12. package/dist/modules/src/avi/avi-demuxer.d.ts.map +1 -0
  13. package/dist/modules/src/avi/avi-misc.d.ts +88 -0
  14. package/dist/modules/src/avi/avi-misc.d.ts.map +1 -0
  15. package/dist/modules/src/avi/avi-muxer.d.ts +45 -0
  16. package/dist/modules/src/avi/avi-muxer.d.ts.map +1 -0
  17. package/dist/modules/src/avi/riff-writer.d.ts +26 -0
  18. package/dist/modules/src/avi/riff-writer.d.ts.map +1 -0
  19. package/dist/modules/src/codec-data.d.ts +8 -3
  20. package/dist/modules/src/codec-data.d.ts.map +1 -1
  21. package/dist/modules/src/codec.d.ts +10 -10
  22. package/dist/modules/src/codec.d.ts.map +1 -1
  23. package/dist/modules/src/conversion.d.ts +33 -16
  24. package/dist/modules/src/conversion.d.ts.map +1 -1
  25. package/dist/modules/src/custom-coder.d.ts +8 -8
  26. package/dist/modules/src/custom-coder.d.ts.map +1 -1
  27. package/dist/modules/src/demuxer.d.ts +3 -3
  28. package/dist/modules/src/demuxer.d.ts.map +1 -1
  29. package/dist/modules/src/encode.d.ts +8 -8
  30. package/dist/modules/src/encode.d.ts.map +1 -1
  31. package/dist/modules/src/flac/flac-demuxer.d.ts +7 -7
  32. package/dist/modules/src/flac/flac-demuxer.d.ts.map +1 -1
  33. package/dist/modules/src/flac/flac-misc.d.ts +3 -3
  34. package/dist/modules/src/flac/flac-misc.d.ts.map +1 -1
  35. package/dist/modules/src/flac/flac-muxer.d.ts +5 -5
  36. package/dist/modules/src/flac/flac-muxer.d.ts.map +1 -1
  37. package/dist/modules/src/id3.d.ts +3 -3
  38. package/dist/modules/src/id3.d.ts.map +1 -1
  39. package/dist/modules/src/index.d.ts +20 -20
  40. package/dist/modules/src/index.d.ts.map +1 -1
  41. package/dist/modules/src/input-format.d.ts +22 -0
  42. package/dist/modules/src/input-format.d.ts.map +1 -1
  43. package/dist/modules/src/input-track.d.ts +8 -8
  44. package/dist/modules/src/input-track.d.ts.map +1 -1
  45. package/dist/modules/src/input.d.ts +12 -12
  46. package/dist/modules/src/isobmff/isobmff-boxes.d.ts +2 -2
  47. package/dist/modules/src/isobmff/isobmff-boxes.d.ts.map +1 -1
  48. package/dist/modules/src/isobmff/isobmff-demuxer.d.ts +12 -12
  49. package/dist/modules/src/isobmff/isobmff-demuxer.d.ts.map +1 -1
  50. package/dist/modules/src/isobmff/isobmff-misc.d.ts.map +1 -1
  51. package/dist/modules/src/isobmff/isobmff-muxer.d.ts +11 -11
  52. package/dist/modules/src/isobmff/isobmff-muxer.d.ts.map +1 -1
  53. package/dist/modules/src/isobmff/isobmff-reader.d.ts +2 -2
  54. package/dist/modules/src/isobmff/isobmff-reader.d.ts.map +1 -1
  55. package/dist/modules/src/matroska/ebml.d.ts +3 -3
  56. package/dist/modules/src/matroska/ebml.d.ts.map +1 -1
  57. package/dist/modules/src/matroska/matroska-demuxer.d.ts +13 -13
  58. package/dist/modules/src/matroska/matroska-demuxer.d.ts.map +1 -1
  59. package/dist/modules/src/matroska/matroska-input.d.ts +33 -0
  60. package/dist/modules/src/matroska/matroska-input.d.ts.map +1 -0
  61. package/dist/modules/src/matroska/matroska-misc.d.ts.map +1 -1
  62. package/dist/modules/src/matroska/matroska-muxer.d.ts +5 -5
  63. package/dist/modules/src/matroska/matroska-muxer.d.ts.map +1 -1
  64. package/dist/modules/src/media-sink.d.ts +5 -5
  65. package/dist/modules/src/media-sink.d.ts.map +1 -1
  66. package/dist/modules/src/media-source.d.ts +22 -4
  67. package/dist/modules/src/media-source.d.ts.map +1 -1
  68. package/dist/modules/src/metadata.d.ts +2 -2
  69. package/dist/modules/src/metadata.d.ts.map +1 -1
  70. package/dist/modules/src/misc.d.ts +5 -4
  71. package/dist/modules/src/misc.d.ts.map +1 -1
  72. package/dist/modules/src/mp3/mp3-demuxer.d.ts +7 -7
  73. package/dist/modules/src/mp3/mp3-demuxer.d.ts.map +1 -1
  74. package/dist/modules/src/mp3/mp3-muxer.d.ts +4 -4
  75. package/dist/modules/src/mp3/mp3-muxer.d.ts.map +1 -1
  76. package/dist/modules/src/mp3/mp3-reader.d.ts +2 -2
  77. package/dist/modules/src/mp3/mp3-reader.d.ts.map +1 -1
  78. package/dist/modules/src/mp3/mp3-writer.d.ts +1 -1
  79. package/dist/modules/src/mp3/mp3-writer.d.ts.map +1 -1
  80. package/dist/modules/src/muxer.d.ts +4 -4
  81. package/dist/modules/src/muxer.d.ts.map +1 -1
  82. package/dist/modules/src/ogg/ogg-demuxer.d.ts +7 -7
  83. package/dist/modules/src/ogg/ogg-demuxer.d.ts.map +1 -1
  84. package/dist/modules/src/ogg/ogg-misc.d.ts +1 -1
  85. package/dist/modules/src/ogg/ogg-misc.d.ts.map +1 -1
  86. package/dist/modules/src/ogg/ogg-muxer.d.ts +5 -5
  87. package/dist/modules/src/ogg/ogg-muxer.d.ts.map +1 -1
  88. package/dist/modules/src/ogg/ogg-reader.d.ts +1 -1
  89. package/dist/modules/src/ogg/ogg-reader.d.ts.map +1 -1
  90. package/dist/modules/src/output-format.d.ts +51 -6
  91. package/dist/modules/src/output-format.d.ts.map +1 -1
  92. package/dist/modules/src/output.d.ts +13 -13
  93. package/dist/modules/src/output.d.ts.map +1 -1
  94. package/dist/modules/src/packet.d.ts +1 -1
  95. package/dist/modules/src/packet.d.ts.map +1 -1
  96. package/dist/modules/src/pcm.d.ts.map +1 -1
  97. package/dist/modules/src/reader.d.ts +2 -2
  98. package/dist/modules/src/reader.d.ts.map +1 -1
  99. package/dist/modules/src/sample.d.ts +57 -15
  100. package/dist/modules/src/sample.d.ts.map +1 -1
  101. package/dist/modules/src/source.d.ts +3 -3
  102. package/dist/modules/src/source.d.ts.map +1 -1
  103. package/dist/modules/src/subtitles.d.ts +1 -1
  104. package/dist/modules/src/subtitles.d.ts.map +1 -1
  105. package/dist/modules/src/target.d.ts +2 -2
  106. package/dist/modules/src/target.d.ts.map +1 -1
  107. package/dist/modules/src/tsconfig.tsbuildinfo +1 -1
  108. package/dist/modules/src/wave/riff-writer.d.ts +1 -1
  109. package/dist/modules/src/wave/riff-writer.d.ts.map +1 -1
  110. package/dist/modules/src/wave/wave-demuxer.d.ts +6 -6
  111. package/dist/modules/src/wave/wave-demuxer.d.ts.map +1 -1
  112. package/dist/modules/src/wave/wave-muxer.d.ts +4 -4
  113. package/dist/modules/src/wave/wave-muxer.d.ts.map +1 -1
  114. package/dist/modules/src/writer.d.ts +1 -1
  115. package/dist/modules/src/writer.d.ts.map +1 -1
  116. package/dist/packages/eac3/eac3.wasm +0 -0
  117. package/dist/packages/eac3/mediabunny-eac3.js +1058 -0
  118. package/dist/packages/eac3/mediabunny-eac3.min.js +44 -0
  119. package/dist/packages/mp3-encoder/mediabunny-mp3-encoder.js +694 -0
  120. package/dist/packages/mp3-encoder/mediabunny-mp3-encoder.min.js +58 -0
  121. package/dist/packages/mpeg4/mediabunny-mpeg4.js +1198 -0
  122. package/dist/packages/mpeg4/mediabunny-mpeg4.min.js +44 -0
  123. package/dist/packages/mpeg4/xvid.wasm +0 -0
  124. package/package.json +18 -57
  125. package/dist/bundles/mediabunny.cjs +0 -26140
  126. package/dist/bundles/mediabunny.min.cjs +0 -147
  127. package/dist/bundles/mediabunny.min.mjs +0 -146
  128. package/dist/mediabunny.d.ts +0 -3319
  129. package/dist/modules/shared/mp3-misc.js +0 -147
  130. package/dist/modules/src/adts/adts-demuxer.js +0 -239
  131. package/dist/modules/src/adts/adts-muxer.js +0 -80
  132. package/dist/modules/src/adts/adts-reader.js +0 -63
  133. package/dist/modules/src/codec-data.js +0 -1730
  134. package/dist/modules/src/codec.js +0 -869
  135. package/dist/modules/src/conversion.js +0 -1459
  136. package/dist/modules/src/custom-coder.js +0 -117
  137. package/dist/modules/src/demuxer.js +0 -12
  138. package/dist/modules/src/encode.js +0 -442
  139. package/dist/modules/src/flac/flac-demuxer.js +0 -504
  140. package/dist/modules/src/flac/flac-misc.js +0 -135
  141. package/dist/modules/src/flac/flac-muxer.js +0 -222
  142. package/dist/modules/src/id3.js +0 -848
  143. package/dist/modules/src/index.js +0 -28
  144. package/dist/modules/src/input-format.js +0 -480
  145. package/dist/modules/src/input-track.js +0 -372
  146. package/dist/modules/src/input.js +0 -188
  147. package/dist/modules/src/isobmff/isobmff-boxes.js +0 -1480
  148. package/dist/modules/src/isobmff/isobmff-demuxer.js +0 -2618
  149. package/dist/modules/src/isobmff/isobmff-misc.js +0 -20
  150. package/dist/modules/src/isobmff/isobmff-muxer.js +0 -966
  151. package/dist/modules/src/isobmff/isobmff-reader.js +0 -72
  152. package/dist/modules/src/matroska/ebml.js +0 -653
  153. package/dist/modules/src/matroska/matroska-demuxer.js +0 -2133
  154. package/dist/modules/src/matroska/matroska-misc.js +0 -20
  155. package/dist/modules/src/matroska/matroska-muxer.js +0 -1017
  156. package/dist/modules/src/media-sink.js +0 -1736
  157. package/dist/modules/src/media-source.js +0 -1825
  158. package/dist/modules/src/metadata.js +0 -193
  159. package/dist/modules/src/misc.js +0 -623
  160. package/dist/modules/src/mp3/mp3-demuxer.js +0 -285
  161. package/dist/modules/src/mp3/mp3-muxer.js +0 -123
  162. package/dist/modules/src/mp3/mp3-reader.js +0 -26
  163. package/dist/modules/src/mp3/mp3-writer.js +0 -78
  164. package/dist/modules/src/muxer.js +0 -50
  165. package/dist/modules/src/node.d.ts +0 -9
  166. package/dist/modules/src/node.d.ts.map +0 -1
  167. package/dist/modules/src/node.js +0 -9
  168. package/dist/modules/src/ogg/ogg-demuxer.js +0 -763
  169. package/dist/modules/src/ogg/ogg-misc.js +0 -78
  170. package/dist/modules/src/ogg/ogg-muxer.js +0 -353
  171. package/dist/modules/src/ogg/ogg-reader.js +0 -65
  172. package/dist/modules/src/output-format.js +0 -527
  173. package/dist/modules/src/output.js +0 -300
  174. package/dist/modules/src/packet.js +0 -182
  175. package/dist/modules/src/pcm.js +0 -85
  176. package/dist/modules/src/reader.js +0 -236
  177. package/dist/modules/src/sample.js +0 -1056
  178. package/dist/modules/src/source.js +0 -1182
  179. package/dist/modules/src/subtitles.js +0 -575
  180. package/dist/modules/src/target.js +0 -140
  181. package/dist/modules/src/wave/riff-writer.js +0 -30
  182. package/dist/modules/src/wave/wave-demuxer.js +0 -447
  183. package/dist/modules/src/wave/wave-muxer.js +0 -318
  184. package/dist/modules/src/writer.js +0 -370
  185. package/src/adts/adts-demuxer.ts +0 -331
  186. package/src/adts/adts-muxer.ts +0 -111
  187. package/src/adts/adts-reader.ts +0 -85
  188. package/src/codec-data.ts +0 -2078
  189. package/src/codec.ts +0 -1092
  190. package/src/conversion.ts +0 -2112
  191. package/src/custom-coder.ts +0 -197
  192. package/src/demuxer.ts +0 -24
  193. package/src/encode.ts +0 -739
  194. package/src/flac/flac-demuxer.ts +0 -730
  195. package/src/flac/flac-misc.ts +0 -164
  196. package/src/flac/flac-muxer.ts +0 -320
  197. package/src/id3.ts +0 -925
  198. package/src/index.ts +0 -221
  199. package/src/input-format.ts +0 -541
  200. package/src/input-track.ts +0 -529
  201. package/src/input.ts +0 -235
  202. package/src/isobmff/isobmff-boxes.ts +0 -1719
  203. package/src/isobmff/isobmff-demuxer.ts +0 -3190
  204. package/src/isobmff/isobmff-misc.ts +0 -29
  205. package/src/isobmff/isobmff-muxer.ts +0 -1348
  206. package/src/isobmff/isobmff-reader.ts +0 -91
  207. package/src/matroska/ebml.ts +0 -730
  208. package/src/matroska/matroska-demuxer.ts +0 -2481
  209. package/src/matroska/matroska-misc.ts +0 -29
  210. package/src/matroska/matroska-muxer.ts +0 -1276
  211. package/src/media-sink.ts +0 -2179
  212. package/src/media-source.ts +0 -2243
  213. package/src/metadata.ts +0 -320
  214. package/src/misc.ts +0 -798
  215. package/src/mp3/mp3-demuxer.ts +0 -383
  216. package/src/mp3/mp3-muxer.ts +0 -166
  217. package/src/mp3/mp3-reader.ts +0 -34
  218. package/src/mp3/mp3-writer.ts +0 -120
  219. package/src/muxer.ts +0 -88
  220. package/src/node.ts +0 -11
  221. package/src/ogg/ogg-demuxer.ts +0 -1053
  222. package/src/ogg/ogg-misc.ts +0 -116
  223. package/src/ogg/ogg-muxer.ts +0 -497
  224. package/src/ogg/ogg-reader.ts +0 -93
  225. package/src/output-format.ts +0 -945
  226. package/src/output.ts +0 -488
  227. package/src/packet.ts +0 -263
  228. package/src/pcm.ts +0 -112
  229. package/src/reader.ts +0 -323
  230. package/src/sample.ts +0 -1461
  231. package/src/source.ts +0 -1688
  232. package/src/subtitles.ts +0 -711
  233. package/src/target.ts +0 -204
  234. package/src/tsconfig.json +0 -16
  235. package/src/wave/riff-writer.ts +0 -36
  236. package/src/wave/wave-demuxer.ts +0 -529
  237. package/src/wave/wave-muxer.ts +0 -371
  238. package/src/writer.ts +0 -490
package/src/metadata.ts DELETED
@@ -1,320 +0,0 @@
1
- /*!
2
- * Copyright (c) 2025-present, Vanilagy and contributors
3
- *
4
- * This Source Code Form is subject to the terms of the Mozilla Public
5
- * License, v. 2.0. If a copy of the MPL was not distributed with this
6
- * file, You can obtain one at https://mozilla.org/MPL/2.0/.
7
- */
8
-
9
- /**
10
- * Represents descriptive (non-technical) metadata about a media file, such as title, author, date, cover art, or other
11
- * attached files. Common tags are normalized by Mediabunny into a uniform format, while the `raw` field can be used to
12
- * directly read or write the underlying metadata tags (which differ by format).
13
- *
14
- * - For MP4/QuickTime files, the metadata refers to the data in `'moov'`-level `'udta'` and `'meta'` atoms.
15
- * - For WebM/Matroska files, the metadata refers to the Tags and Attachments elements whose target is 50 (MOVIE).
16
- * - For MP3 files, the metadata refers to the ID3v2 or ID3v1 tags.
17
- * - For Ogg files, there is no global metadata so instead, the metadata refers to the combined metadata of all tracks,
18
- * in Vorbis-style comment headers.
19
- * - For WAVE files, the metadata refers to the chunks within the RIFF INFO chunk.
20
- * - For ADTS files, there is no metadata.
21
- * - For FLAC files, the metadata lives in Vorbis style in the Vorbis comment block.
22
- *
23
- * @group Metadata tags
24
- * @public
25
- */
26
- export type MetadataTags = {
27
- /** Title of the media (e.g. Gangnam Style, Titanic, etc.) */
28
- title?: string;
29
- /** Short description or subtitle of the media. */
30
- description?: string;
31
- /** Primary artist(s) or creator(s) of the work. */
32
- artist?: string;
33
- /** Album, collection, or compilation the media belongs to. */
34
- album?: string;
35
- /** Main credited artist for the album/collection as a whole. */
36
- albumArtist?: string;
37
- /** Position of this track within its album or collection (1-based). */
38
- trackNumber?: number;
39
- /** Total number of tracks in the album or collection. */
40
- tracksTotal?: number;
41
- /** Disc index if the release spans multiple discs (1-based). */
42
- discNumber?: number;
43
- /** Total number of discs in the release. */
44
- discsTotal?: number;
45
- /** Genre or category describing the media's style or content (e.g. Metal, Horror, etc.) */
46
- genre?: string;
47
- /** Release, recording or creation date of the media. */
48
- date?: Date;
49
- /** Full text lyrics or transcript associated with the media. */
50
- lyrics?: string;
51
- /** Freeform notes, remarks or commentary about the media. */
52
- comment?: string;
53
- /** Embedded images such as cover art, booklet scans, artwork or preview frames. */
54
- images?: AttachedImage[];
55
- /**
56
- * The raw, underlying metadata tags.
57
- *
58
- * This field can be used for both reading and writing. When reading, it represents the original tags that were used
59
- * to derive the normalized fields, and any additional metadata that Mediabunny doesn't understand. When writing, it
60
- * can be used to set arbitrary metadata tags in the output file.
61
- *
62
- * The format of these tags differs per format:
63
- * - MP4/QuickTime: By default, the keys refer to the names of the individual atoms in the `'ilst'` atom inside the
64
- * `'meta'` atom, and the values are derived from the content of the `'data'` atom inside them. When a `'keys'` atom
65
- * is also used, then the keys reflect the keys specified there (such as `'com.apple.quicktime.version'`).
66
- * Additionally, any atoms within the `'udta'` atom are dumped into here, however with unknown internal format
67
- * (`Uint8Array`).
68
- * - WebM/Matroska: `SimpleTag` elements whose target is 50 (MOVIE), either containing string or `Uint8Array`
69
- * values. Additionally, all attached files (such as font files) are included here, where the key corresponds to
70
- * the FileUID and the value is an {@link AttachedFile}.
71
- * - MP3: The ID3v2 tags, or a single `'TAG'` key with the contents of the ID3v1 tag.
72
- * - Ogg: The key-value string pairs from the Vorbis-style comment header (see RFC 7845, Section 5.2).
73
- * Additionally, the `'vendor'` key refers to the vendor string within this header.
74
- * - WAVE: The individual metadata chunks within the RIFF INFO chunk. Values are always ISO 8859-1 strings.
75
- * - FLAC: The key-value string pairs from the vorbis metadata block (see RFC 9639, Section D.2.3).
76
- * Additionally, the `'vendor'` key refers to the vendor string within this header.
77
- */
78
- raw?: Record<string, string | Uint8Array | RichImageData | AttachedFile | null>;
79
- };
80
-
81
- /**
82
- * An embedded image such as cover art, booklet scan, artwork or preview frame.
83
- *
84
- * @group Metadata tags
85
- * @public
86
- */
87
- export type AttachedImage = {
88
- /** The raw image data. */
89
- data: Uint8Array;
90
- /** An RFC 6838 MIME type (e.g. image/jpeg, image/png, etc.) */
91
- mimeType: string;
92
- /** The kind or purpose of the image. */
93
- kind: 'coverFront' | 'coverBack' | 'unknown';
94
- /** The name of the image file. */
95
- name?: string;
96
- /** A description of the image. */
97
- description?: string;
98
- };
99
-
100
- /**
101
- * Image data with additional metadata.
102
- *
103
- * @group Metadata tags
104
- * @public
105
- */
106
- export class RichImageData {
107
- /** Creates a new {@link RichImageData}. */
108
- constructor(
109
- /** The raw image data. */
110
- public data: Uint8Array,
111
- /** An RFC 6838 MIME type (e.g. image/jpeg, image/png, etc.) */
112
- public mimeType: string,
113
- ) {
114
- if (!(data instanceof Uint8Array)) {
115
- throw new TypeError('data must be a Uint8Array.');
116
- }
117
- if (typeof mimeType !== 'string') {
118
- throw new TypeError('mimeType must be a string.');
119
- }
120
- }
121
- }
122
-
123
- /**
124
- * A file attached to a media file.
125
- *
126
- * @group Metadata tags
127
- * @public
128
- */
129
- export class AttachedFile {
130
- /** Creates a new {@link AttachedFile}. */
131
- constructor(
132
- /** The raw file data. */
133
- public data: Uint8Array,
134
- /** An RFC 6838 MIME type (e.g. image/jpeg, image/png, font/ttf, etc.) */
135
- public mimeType?: string,
136
- /** The name of the file. */
137
- public name?: string,
138
- /** A description of the file. */
139
- public description?: string,
140
- ) {
141
- if (!(data instanceof Uint8Array)) {
142
- throw new TypeError('data must be a Uint8Array.');
143
- }
144
- if (mimeType !== undefined && typeof mimeType !== 'string') {
145
- throw new TypeError('mimeType, when provided, must be a string.');
146
- }
147
- if (name !== undefined && typeof name !== 'string') {
148
- throw new TypeError('name, when provided, must be a string.');
149
- }
150
- if (description !== undefined && typeof description !== 'string') {
151
- throw new TypeError('description, when provided, must be a string.');
152
- }
153
- }
154
- };
155
-
156
- export const validateMetadataTags = (tags: MetadataTags) => {
157
- if (!tags || typeof tags !== 'object') {
158
- throw new TypeError('tags must be an object.');
159
- }
160
- if (tags.title !== undefined && typeof tags.title !== 'string') {
161
- throw new TypeError('tags.title, when provided, must be a string.');
162
- }
163
- if (tags.description !== undefined && typeof tags.description !== 'string') {
164
- throw new TypeError('tags.description, when provided, must be a string.');
165
- }
166
- if (tags.artist !== undefined && typeof tags.artist !== 'string') {
167
- throw new TypeError('tags.artist, when provided, must be a string.');
168
- }
169
- if (tags.album !== undefined && typeof tags.album !== 'string') {
170
- throw new TypeError('tags.album, when provided, must be a string.');
171
- }
172
- if (tags.albumArtist !== undefined && typeof tags.albumArtist !== 'string') {
173
- throw new TypeError('tags.albumArtist, when provided, must be a string.');
174
- }
175
- if (tags.trackNumber !== undefined && (!Number.isInteger(tags.trackNumber) || tags.trackNumber <= 0)) {
176
- throw new TypeError('tags.trackNumber, when provided, must be a positive integer.');
177
- }
178
- if (
179
- tags.tracksTotal !== undefined
180
- && (!Number.isInteger(tags.tracksTotal) || tags.tracksTotal <= 0)
181
- ) {
182
- throw new TypeError('tags.tracksTotal, when provided, must be a positive integer.');
183
- }
184
- if (tags.discNumber !== undefined && (!Number.isInteger(tags.discNumber) || tags.discNumber <= 0)) {
185
- throw new TypeError('tags.discNumber, when provided, must be a positive integer.');
186
- }
187
- if (
188
- tags.discsTotal !== undefined
189
- && (!Number.isInteger(tags.discsTotal) || tags.discsTotal <= 0)
190
- ) {
191
- throw new TypeError('tags.discsTotal, when provided, must be a positive integer.');
192
- }
193
- if (tags.genre !== undefined && typeof tags.genre !== 'string') {
194
- throw new TypeError('tags.genre, when provided, must be a string.');
195
- }
196
- if (tags.date !== undefined && (!(tags.date instanceof Date) || Number.isNaN(tags.date.getTime()))) {
197
- throw new TypeError('tags.date, when provided, must be a valid Date.');
198
- }
199
- if (tags.lyrics !== undefined && typeof tags.lyrics !== 'string') {
200
- throw new TypeError('tags.lyrics, when provided, must be a string.');
201
- }
202
- if (tags.images !== undefined) {
203
- if (!Array.isArray(tags.images)) {
204
- throw new TypeError('tags.images, when provided, must be an array.');
205
- }
206
- for (const image of tags.images) {
207
- if (!image || typeof image !== 'object') {
208
- throw new TypeError('Each image in tags.images must be an object.');
209
- }
210
- if (!(image.data instanceof Uint8Array)) {
211
- throw new TypeError('Each image.data must be a Uint8Array.');
212
- }
213
- if (typeof image.mimeType !== 'string') {
214
- throw new TypeError('Each image.mimeType must be a string.');
215
- }
216
- if (!['coverFront', 'coverBack', 'unknown'].includes(image.kind)) {
217
- throw new TypeError('Each image.kind must be \'coverFront\', \'coverBack\', or \'unknown\'.');
218
- }
219
- }
220
- }
221
- if (tags.comment !== undefined && typeof tags.comment !== 'string') {
222
- throw new TypeError('tags.comment, when provided, must be a string.');
223
- }
224
- if (tags.raw !== undefined) {
225
- if (!tags.raw || typeof tags.raw !== 'object') {
226
- throw new TypeError('tags.raw, when provided, must be an object.');
227
- }
228
-
229
- for (const value of Object.values(tags.raw)) {
230
- if (
231
- value !== null
232
- && typeof value !== 'string'
233
- && !(value instanceof Uint8Array)
234
- && !(value instanceof RichImageData)
235
- && !(value instanceof AttachedFile)
236
- ) {
237
- throw new TypeError(
238
- 'Each value in tags.raw must be a string, Uint8Array, RichImageData, AttachedFile, or null.',
239
- );
240
- }
241
- }
242
- }
243
- };
244
-
245
- export const metadataTagsAreEmpty = (tags: MetadataTags) => {
246
- return tags.title === undefined
247
- && tags.description === undefined
248
- && tags.artist === undefined
249
- && tags.album === undefined
250
- && tags.albumArtist === undefined
251
- && tags.trackNumber === undefined
252
- && tags.tracksTotal === undefined
253
- && tags.discNumber === undefined
254
- && tags.discsTotal === undefined
255
- && tags.genre === undefined
256
- && tags.date === undefined
257
- && tags.lyrics === undefined
258
- && (!tags.images || tags.images.length === 0)
259
- && tags.comment === undefined
260
- && (tags.raw === undefined || Object.keys(tags.raw).length === 0);
261
- };
262
-
263
- /**
264
- * Specifies a track's disposition, i.e. information about its intended usage.
265
- * @public
266
- * @group Miscellaneous
267
- */
268
- export type TrackDisposition = {
269
- /**
270
- * Indicates that this track is eligible for automatic selection by a player; that it is the main track among other,
271
- * non-default tracks of the same type.
272
- */
273
- default: boolean;
274
- /**
275
- * Indicates that players should always display this track by default, even if it goes against the user's default
276
- * preferences. For example, a subtitle track only containing translations of foreign-language audio.
277
- */
278
- forced: boolean;
279
- /** Indicates that this track is in the content's original language. */
280
- original: boolean;
281
- /** Indicates that this track contains commentary. */
282
- commentary: boolean;
283
- /** Indicates that this track is intended for hearing-impaired users. */
284
- hearingImpaired: boolean;
285
- /** Indicates that this track is intended for visually-impaired users. */
286
- visuallyImpaired: boolean;
287
- };
288
-
289
- export const DEFAULT_TRACK_DISPOSITION: TrackDisposition = {
290
- default: true,
291
- forced: false,
292
- original: false,
293
- commentary: false,
294
- hearingImpaired: false,
295
- visuallyImpaired: false,
296
- };
297
-
298
- export const validateTrackDisposition = (disposition: Partial<TrackDisposition>) => {
299
- if (!disposition || typeof disposition !== 'object') {
300
- throw new TypeError('disposition must be an object.');
301
- }
302
- if (disposition.default !== undefined && typeof disposition.default !== 'boolean') {
303
- throw new TypeError('disposition.default must be a boolean.');
304
- }
305
- if (disposition.forced !== undefined && typeof disposition.forced !== 'boolean') {
306
- throw new TypeError('disposition.forced must be a boolean.');
307
- }
308
- if (disposition.original !== undefined && typeof disposition.original !== 'boolean') {
309
- throw new TypeError('disposition.original must be a boolean.');
310
- }
311
- if (disposition.commentary !== undefined && typeof disposition.commentary !== 'boolean') {
312
- throw new TypeError('disposition.commentary must be a boolean.');
313
- }
314
- if (disposition.hearingImpaired !== undefined && typeof disposition.hearingImpaired !== 'boolean') {
315
- throw new TypeError('disposition.hearingImpaired must be a boolean.');
316
- }
317
- if (disposition.visuallyImpaired !== undefined && typeof disposition.visuallyImpaired !== 'boolean') {
318
- throw new TypeError('disposition.visuallyImpaired must be a boolean.');
319
- }
320
- };