@kenzuya/mediabunny 1.26.0 → 1.28.5

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 (237) hide show
  1. package/README.md +1 -1
  2. package/dist/bundles/{mediabunny.mjs → mediabunny.js} +21963 -21388
  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/node.d.ts +1 -1
  83. package/dist/modules/src/ogg/ogg-demuxer.d.ts +7 -7
  84. package/dist/modules/src/ogg/ogg-demuxer.d.ts.map +1 -1
  85. package/dist/modules/src/ogg/ogg-misc.d.ts +1 -1
  86. package/dist/modules/src/ogg/ogg-misc.d.ts.map +1 -1
  87. package/dist/modules/src/ogg/ogg-muxer.d.ts +5 -5
  88. package/dist/modules/src/ogg/ogg-muxer.d.ts.map +1 -1
  89. package/dist/modules/src/ogg/ogg-reader.d.ts +1 -1
  90. package/dist/modules/src/ogg/ogg-reader.d.ts.map +1 -1
  91. package/dist/modules/src/output-format.d.ts +51 -6
  92. package/dist/modules/src/output-format.d.ts.map +1 -1
  93. package/dist/modules/src/output.d.ts +13 -13
  94. package/dist/modules/src/output.d.ts.map +1 -1
  95. package/dist/modules/src/packet.d.ts +1 -1
  96. package/dist/modules/src/packet.d.ts.map +1 -1
  97. package/dist/modules/src/pcm.d.ts.map +1 -1
  98. package/dist/modules/src/reader.d.ts +2 -2
  99. package/dist/modules/src/reader.d.ts.map +1 -1
  100. package/dist/modules/src/sample.d.ts +57 -15
  101. package/dist/modules/src/sample.d.ts.map +1 -1
  102. package/dist/modules/src/source.d.ts +3 -3
  103. package/dist/modules/src/source.d.ts.map +1 -1
  104. package/dist/modules/src/subtitles.d.ts +1 -1
  105. package/dist/modules/src/subtitles.d.ts.map +1 -1
  106. package/dist/modules/src/target.d.ts +2 -2
  107. package/dist/modules/src/target.d.ts.map +1 -1
  108. package/dist/modules/src/tsconfig.tsbuildinfo +1 -1
  109. package/dist/modules/src/wave/riff-writer.d.ts +1 -1
  110. package/dist/modules/src/wave/riff-writer.d.ts.map +1 -1
  111. package/dist/modules/src/wave/wave-demuxer.d.ts +6 -6
  112. package/dist/modules/src/wave/wave-demuxer.d.ts.map +1 -1
  113. package/dist/modules/src/wave/wave-muxer.d.ts +4 -4
  114. package/dist/modules/src/wave/wave-muxer.d.ts.map +1 -1
  115. package/dist/modules/src/writer.d.ts +1 -1
  116. package/dist/modules/src/writer.d.ts.map +1 -1
  117. package/dist/packages/eac3/eac3.wasm +0 -0
  118. package/dist/packages/eac3/mediabunny-eac3.js +1058 -0
  119. package/dist/packages/eac3/mediabunny-eac3.min.js +44 -0
  120. package/dist/packages/mp3-encoder/mediabunny-mp3-encoder.js +694 -0
  121. package/dist/packages/mp3-encoder/mediabunny-mp3-encoder.min.js +58 -0
  122. package/dist/packages/mpeg4/mediabunny-mpeg4.js +1198 -0
  123. package/dist/packages/mpeg4/mediabunny-mpeg4.min.js +44 -0
  124. package/dist/packages/mpeg4/xvid.wasm +0 -0
  125. package/package.json +18 -57
  126. package/dist/bundles/mediabunny.cjs +0 -26140
  127. package/dist/bundles/mediabunny.min.cjs +0 -147
  128. package/dist/bundles/mediabunny.min.mjs +0 -146
  129. package/dist/mediabunny.d.ts +0 -3319
  130. package/dist/modules/shared/mp3-misc.js +0 -147
  131. package/dist/modules/src/adts/adts-demuxer.js +0 -239
  132. package/dist/modules/src/adts/adts-muxer.js +0 -80
  133. package/dist/modules/src/adts/adts-reader.js +0 -63
  134. package/dist/modules/src/codec-data.js +0 -1730
  135. package/dist/modules/src/codec.js +0 -869
  136. package/dist/modules/src/conversion.js +0 -1459
  137. package/dist/modules/src/custom-coder.js +0 -117
  138. package/dist/modules/src/demuxer.js +0 -12
  139. package/dist/modules/src/encode.js +0 -442
  140. package/dist/modules/src/flac/flac-demuxer.js +0 -504
  141. package/dist/modules/src/flac/flac-misc.js +0 -135
  142. package/dist/modules/src/flac/flac-muxer.js +0 -222
  143. package/dist/modules/src/id3.js +0 -848
  144. package/dist/modules/src/index.js +0 -28
  145. package/dist/modules/src/input-format.js +0 -480
  146. package/dist/modules/src/input-track.js +0 -372
  147. package/dist/modules/src/input.js +0 -188
  148. package/dist/modules/src/isobmff/isobmff-boxes.js +0 -1480
  149. package/dist/modules/src/isobmff/isobmff-demuxer.js +0 -2618
  150. package/dist/modules/src/isobmff/isobmff-misc.js +0 -20
  151. package/dist/modules/src/isobmff/isobmff-muxer.js +0 -966
  152. package/dist/modules/src/isobmff/isobmff-reader.js +0 -72
  153. package/dist/modules/src/matroska/ebml.js +0 -653
  154. package/dist/modules/src/matroska/matroska-demuxer.js +0 -2133
  155. package/dist/modules/src/matroska/matroska-misc.js +0 -20
  156. package/dist/modules/src/matroska/matroska-muxer.js +0 -1017
  157. package/dist/modules/src/media-sink.js +0 -1736
  158. package/dist/modules/src/media-source.js +0 -1825
  159. package/dist/modules/src/metadata.js +0 -193
  160. package/dist/modules/src/misc.js +0 -623
  161. package/dist/modules/src/mp3/mp3-demuxer.js +0 -285
  162. package/dist/modules/src/mp3/mp3-muxer.js +0 -123
  163. package/dist/modules/src/mp3/mp3-reader.js +0 -26
  164. package/dist/modules/src/mp3/mp3-writer.js +0 -78
  165. package/dist/modules/src/muxer.js +0 -50
  166. package/dist/modules/src/node.js +0 -9
  167. package/dist/modules/src/ogg/ogg-demuxer.js +0 -763
  168. package/dist/modules/src/ogg/ogg-misc.js +0 -78
  169. package/dist/modules/src/ogg/ogg-muxer.js +0 -353
  170. package/dist/modules/src/ogg/ogg-reader.js +0 -65
  171. package/dist/modules/src/output-format.js +0 -527
  172. package/dist/modules/src/output.js +0 -300
  173. package/dist/modules/src/packet.js +0 -182
  174. package/dist/modules/src/pcm.js +0 -85
  175. package/dist/modules/src/reader.js +0 -236
  176. package/dist/modules/src/sample.js +0 -1056
  177. package/dist/modules/src/source.js +0 -1182
  178. package/dist/modules/src/subtitles.js +0 -575
  179. package/dist/modules/src/target.js +0 -140
  180. package/dist/modules/src/wave/riff-writer.js +0 -30
  181. package/dist/modules/src/wave/wave-demuxer.js +0 -447
  182. package/dist/modules/src/wave/wave-muxer.js +0 -318
  183. package/dist/modules/src/writer.js +0 -370
  184. package/src/adts/adts-demuxer.ts +0 -331
  185. package/src/adts/adts-muxer.ts +0 -111
  186. package/src/adts/adts-reader.ts +0 -85
  187. package/src/codec-data.ts +0 -2078
  188. package/src/codec.ts +0 -1092
  189. package/src/conversion.ts +0 -2112
  190. package/src/custom-coder.ts +0 -197
  191. package/src/demuxer.ts +0 -24
  192. package/src/encode.ts +0 -739
  193. package/src/flac/flac-demuxer.ts +0 -730
  194. package/src/flac/flac-misc.ts +0 -164
  195. package/src/flac/flac-muxer.ts +0 -320
  196. package/src/id3.ts +0 -925
  197. package/src/index.ts +0 -221
  198. package/src/input-format.ts +0 -541
  199. package/src/input-track.ts +0 -529
  200. package/src/input.ts +0 -235
  201. package/src/isobmff/isobmff-boxes.ts +0 -1719
  202. package/src/isobmff/isobmff-demuxer.ts +0 -3190
  203. package/src/isobmff/isobmff-misc.ts +0 -29
  204. package/src/isobmff/isobmff-muxer.ts +0 -1348
  205. package/src/isobmff/isobmff-reader.ts +0 -91
  206. package/src/matroska/ebml.ts +0 -730
  207. package/src/matroska/matroska-demuxer.ts +0 -2481
  208. package/src/matroska/matroska-misc.ts +0 -29
  209. package/src/matroska/matroska-muxer.ts +0 -1276
  210. package/src/media-sink.ts +0 -2179
  211. package/src/media-source.ts +0 -2243
  212. package/src/metadata.ts +0 -320
  213. package/src/misc.ts +0 -798
  214. package/src/mp3/mp3-demuxer.ts +0 -383
  215. package/src/mp3/mp3-muxer.ts +0 -166
  216. package/src/mp3/mp3-reader.ts +0 -34
  217. package/src/mp3/mp3-writer.ts +0 -120
  218. package/src/muxer.ts +0 -88
  219. package/src/node.ts +0 -11
  220. package/src/ogg/ogg-demuxer.ts +0 -1053
  221. package/src/ogg/ogg-misc.ts +0 -116
  222. package/src/ogg/ogg-muxer.ts +0 -497
  223. package/src/ogg/ogg-reader.ts +0 -93
  224. package/src/output-format.ts +0 -945
  225. package/src/output.ts +0 -488
  226. package/src/packet.ts +0 -263
  227. package/src/pcm.ts +0 -112
  228. package/src/reader.ts +0 -323
  229. package/src/sample.ts +0 -1461
  230. package/src/source.ts +0 -1688
  231. package/src/subtitles.ts +0 -711
  232. package/src/target.ts +0 -204
  233. package/src/tsconfig.json +0 -16
  234. package/src/wave/riff-writer.ts +0 -36
  235. package/src/wave/wave-demuxer.ts +0 -529
  236. package/src/wave/wave-muxer.ts +0 -371
  237. 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
- };