@svta/cml-cmaf-ham 0.19.0 → 0.21.0

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 (419) hide show
  1. package/README.md +6 -0
  2. package/dist/index.d.ts +1265 -51
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +1821 -19
  5. package/dist/index.js.map +1 -1
  6. package/package.json +5 -25
  7. package/dist/mapper/Mapper.d.ts +0 -8
  8. package/dist/mapper/Mapper.d.ts.map +0 -1
  9. package/dist/mapper/Mapper.js +0 -2
  10. package/dist/mapper/Mapper.js.map +0 -1
  11. package/dist/mapper/MapperContext.d.ts +0 -14
  12. package/dist/mapper/MapperContext.d.ts.map +0 -1
  13. package/dist/mapper/MapperContext.js +0 -22
  14. package/dist/mapper/MapperContext.js.map +0 -1
  15. package/dist/mapper/dash/DashMapper.d.ts +0 -10
  16. package/dist/mapper/dash/DashMapper.d.ts.map +0 -1
  17. package/dist/mapper/dash/DashMapper.js +0 -23
  18. package/dist/mapper/dash/DashMapper.js.map +0 -1
  19. package/dist/mapper/dash/mapDashToHam/mapDashToHam.d.ts +0 -12
  20. package/dist/mapper/dash/mapDashToHam/mapDashToHam.d.ts.map +0 -1
  21. package/dist/mapper/dash/mapDashToHam/mapDashToHam.js +0 -42
  22. package/dist/mapper/dash/mapDashToHam/mapDashToHam.js.map +0 -1
  23. package/dist/mapper/dash/mapDashToHam/mapSegmentBase.d.ts +0 -13
  24. package/dist/mapper/dash/mapDashToHam/mapSegmentBase.d.ts.map +0 -1
  25. package/dist/mapper/dash/mapDashToHam/mapSegmentBase.js +0 -20
  26. package/dist/mapper/dash/mapDashToHam/mapSegmentBase.js.map +0 -1
  27. package/dist/mapper/dash/mapDashToHam/mapSegmentList.d.ts +0 -12
  28. package/dist/mapper/dash/mapDashToHam/mapSegmentList.d.ts.map +0 -1
  29. package/dist/mapper/dash/mapDashToHam/mapSegmentList.js +0 -25
  30. package/dist/mapper/dash/mapDashToHam/mapSegmentList.js.map +0 -1
  31. package/dist/mapper/dash/mapDashToHam/mapSegmentTemplate.d.ts +0 -15
  32. package/dist/mapper/dash/mapDashToHam/mapSegmentTemplate.d.ts.map +0 -1
  33. package/dist/mapper/dash/mapDashToHam/mapSegmentTemplate.js +0 -27
  34. package/dist/mapper/dash/mapDashToHam/mapSegmentTemplate.js.map +0 -1
  35. package/dist/mapper/dash/mapDashToHam/mapSegments.d.ts +0 -20
  36. package/dist/mapper/dash/mapDashToHam/mapSegments.d.ts.map +0 -1
  37. package/dist/mapper/dash/mapDashToHam/mapSegments.js +0 -37
  38. package/dist/mapper/dash/mapDashToHam/mapSegments.js.map +0 -1
  39. package/dist/mapper/dash/mapDashToHam/mapTracks.d.ts +0 -19
  40. package/dist/mapper/dash/mapDashToHam/mapTracks.d.ts.map +0 -1
  41. package/dist/mapper/dash/mapDashToHam/mapTracks.js +0 -72
  42. package/dist/mapper/dash/mapDashToHam/mapTracks.js.map +0 -1
  43. package/dist/mapper/dash/mapDashToHam/utils/calculateDuration.d.ts +0 -13
  44. package/dist/mapper/dash/mapDashToHam/utils/calculateDuration.d.ts.map +0 -1
  45. package/dist/mapper/dash/mapDashToHam/utils/calculateDuration.js +0 -18
  46. package/dist/mapper/dash/mapDashToHam/utils/calculateDuration.js.map +0 -1
  47. package/dist/mapper/dash/mapDashToHam/utils/getChannels.d.ts +0 -13
  48. package/dist/mapper/dash/mapDashToHam/utils/getChannels.d.ts.map +0 -1
  49. package/dist/mapper/dash/mapDashToHam/utils/getChannels.js +0 -18
  50. package/dist/mapper/dash/mapDashToHam/utils/getChannels.js.map +0 -1
  51. package/dist/mapper/dash/mapDashToHam/utils/getCodec.d.ts +0 -13
  52. package/dist/mapper/dash/mapDashToHam/utils/getCodec.d.ts.map +0 -1
  53. package/dist/mapper/dash/mapDashToHam/utils/getCodec.js +0 -18
  54. package/dist/mapper/dash/mapDashToHam/utils/getCodec.js.map +0 -1
  55. package/dist/mapper/dash/mapDashToHam/utils/getContentType.d.ts +0 -14
  56. package/dist/mapper/dash/mapDashToHam/utils/getContentType.d.ts.map +0 -1
  57. package/dist/mapper/dash/mapDashToHam/utils/getContentType.js +0 -37
  58. package/dist/mapper/dash/mapDashToHam/utils/getContentType.js.map +0 -1
  59. package/dist/mapper/dash/mapDashToHam/utils/getFrameRate.d.ts +0 -16
  60. package/dist/mapper/dash/mapDashToHam/utils/getFrameRate.d.ts.map +0 -1
  61. package/dist/mapper/dash/mapDashToHam/utils/getFrameRate.js +0 -31
  62. package/dist/mapper/dash/mapDashToHam/utils/getFrameRate.js.map +0 -1
  63. package/dist/mapper/dash/mapDashToHam/utils/getGroup.d.ts +0 -3
  64. package/dist/mapper/dash/mapDashToHam/utils/getGroup.d.ts.map +0 -1
  65. package/dist/mapper/dash/mapDashToHam/utils/getGroup.js +0 -6
  66. package/dist/mapper/dash/mapDashToHam/utils/getGroup.js.map +0 -1
  67. package/dist/mapper/dash/mapDashToHam/utils/getInitializationUrl.d.ts +0 -14
  68. package/dist/mapper/dash/mapDashToHam/utils/getInitializationUrl.d.ts.map +0 -1
  69. package/dist/mapper/dash/mapDashToHam/utils/getInitializationUrl.js +0 -32
  70. package/dist/mapper/dash/mapDashToHam/utils/getInitializationUrl.js.map +0 -1
  71. package/dist/mapper/dash/mapDashToHam/utils/getLanguage.d.ts +0 -11
  72. package/dist/mapper/dash/mapDashToHam/utils/getLanguage.d.ts.map +0 -1
  73. package/dist/mapper/dash/mapDashToHam/utils/getLanguage.js +0 -17
  74. package/dist/mapper/dash/mapDashToHam/utils/getLanguage.js.map +0 -1
  75. package/dist/mapper/dash/mapDashToHam/utils/getNumberOfSegments.d.ts +0 -17
  76. package/dist/mapper/dash/mapDashToHam/utils/getNumberOfSegments.d.ts.map +0 -1
  77. package/dist/mapper/dash/mapDashToHam/utils/getNumberOfSegments.js +0 -21
  78. package/dist/mapper/dash/mapDashToHam/utils/getNumberOfSegments.js.map +0 -1
  79. package/dist/mapper/dash/mapDashToHam/utils/getPresentationId.d.ts +0 -13
  80. package/dist/mapper/dash/mapDashToHam/utils/getPresentationId.d.ts.map +0 -1
  81. package/dist/mapper/dash/mapDashToHam/utils/getPresentationId.js +0 -15
  82. package/dist/mapper/dash/mapDashToHam/utils/getPresentationId.js.map +0 -1
  83. package/dist/mapper/dash/mapDashToHam/utils/getSampleRate.d.ts +0 -13
  84. package/dist/mapper/dash/mapDashToHam/utils/getSampleRate.d.ts.map +0 -1
  85. package/dist/mapper/dash/mapDashToHam/utils/getSampleRate.js +0 -18
  86. package/dist/mapper/dash/mapDashToHam/utils/getSampleRate.js.map +0 -1
  87. package/dist/mapper/dash/mapDashToHam/utils/getSar.d.ts +0 -13
  88. package/dist/mapper/dash/mapDashToHam/utils/getSar.d.ts.map +0 -1
  89. package/dist/mapper/dash/mapDashToHam/utils/getSar.js +0 -18
  90. package/dist/mapper/dash/mapDashToHam/utils/getSar.js.map +0 -1
  91. package/dist/mapper/dash/mapDashToHam/utils/getTrackDuration.d.ts +0 -16
  92. package/dist/mapper/dash/mapDashToHam/utils/getTrackDuration.d.ts.map +0 -1
  93. package/dist/mapper/dash/mapDashToHam/utils/getTrackDuration.js +0 -19
  94. package/dist/mapper/dash/mapDashToHam/utils/getTrackDuration.js.map +0 -1
  95. package/dist/mapper/dash/mapDashToHam/utils/getUrlFromTemplate.d.ts +0 -18
  96. package/dist/mapper/dash/mapDashToHam/utils/getUrlFromTemplate.d.ts.map +0 -1
  97. package/dist/mapper/dash/mapDashToHam/utils/getUrlFromTemplate.js +0 -34
  98. package/dist/mapper/dash/mapDashToHam/utils/getUrlFromTemplate.js.map +0 -1
  99. package/dist/mapper/dash/mapHamToDash/mapHamToDash.d.ts +0 -3
  100. package/dist/mapper/dash/mapHamToDash/mapHamToDash.d.ts.map +0 -1
  101. package/dist/mapper/dash/mapHamToDash/mapHamToDash.js +0 -17
  102. package/dist/mapper/dash/mapHamToDash/mapHamToDash.js.map +0 -1
  103. package/dist/mapper/dash/mapHamToDash/presentationsToPeriods.d.ts +0 -4
  104. package/dist/mapper/dash/mapHamToDash/presentationsToPeriods.d.ts.map +0 -1
  105. package/dist/mapper/dash/mapHamToDash/presentationsToPeriods.js +0 -16
  106. package/dist/mapper/dash/mapHamToDash/presentationsToPeriods.js.map +0 -1
  107. package/dist/mapper/dash/mapHamToDash/selectionSetsToAdaptationSet.d.ts +0 -4
  108. package/dist/mapper/dash/mapHamToDash/selectionSetsToAdaptationSet.d.ts.map +0 -1
  109. package/dist/mapper/dash/mapHamToDash/selectionSetsToAdaptationSet.js +0 -22
  110. package/dist/mapper/dash/mapHamToDash/selectionSetsToAdaptationSet.js.map +0 -1
  111. package/dist/mapper/dash/mapHamToDash/trackToSegmentBase.d.ts +0 -4
  112. package/dist/mapper/dash/mapHamToDash/trackToSegmentBase.d.ts.map +0 -1
  113. package/dist/mapper/dash/mapHamToDash/trackToSegmentBase.js +0 -61
  114. package/dist/mapper/dash/mapHamToDash/trackToSegmentBase.js.map +0 -1
  115. package/dist/mapper/dash/mapHamToDash/trackToSegmentList.d.ts +0 -4
  116. package/dist/mapper/dash/mapHamToDash/trackToSegmentList.d.ts.map +0 -1
  117. package/dist/mapper/dash/mapHamToDash/trackToSegmentList.js +0 -27
  118. package/dist/mapper/dash/mapHamToDash/trackToSegmentList.js.map +0 -1
  119. package/dist/mapper/dash/mapHamToDash/tracksToRepresentation.d.ts +0 -4
  120. package/dist/mapper/dash/mapHamToDash/tracksToRepresentation.d.ts.map +0 -1
  121. package/dist/mapper/dash/mapHamToDash/tracksToRepresentation.js +0 -52
  122. package/dist/mapper/dash/mapHamToDash/tracksToRepresentation.js.map +0 -1
  123. package/dist/mapper/dash/mapHamToDash/utils/getFrameRate.d.ts +0 -13
  124. package/dist/mapper/dash/mapHamToDash/utils/getFrameRate.d.ts.map +0 -1
  125. package/dist/mapper/dash/mapHamToDash/utils/getFrameRate.js +0 -25
  126. package/dist/mapper/dash/mapHamToDash/utils/getFrameRate.js.map +0 -1
  127. package/dist/mapper/dash/mapHamToDash/utils/getTimescale.d.ts +0 -16
  128. package/dist/mapper/dash/mapHamToDash/utils/getTimescale.d.ts.map +0 -1
  129. package/dist/mapper/dash/mapHamToDash/utils/getTimescale.js +0 -30
  130. package/dist/mapper/dash/mapHamToDash/utils/getTimescale.js.map +0 -1
  131. package/dist/mapper/hls/HlsMapper.d.ts +0 -10
  132. package/dist/mapper/hls/HlsMapper.d.ts.map +0 -1
  133. package/dist/mapper/hls/HlsMapper.js +0 -17
  134. package/dist/mapper/hls/HlsMapper.js.map +0 -1
  135. package/dist/mapper/hls/mapHamToHls/generateManifestPlaylistPiece.d.ts +0 -8
  136. package/dist/mapper/hls/mapHamToHls/generateManifestPlaylistPiece.d.ts.map +0 -1
  137. package/dist/mapper/hls/mapHamToHls/generateManifestPlaylistPiece.js +0 -26
  138. package/dist/mapper/hls/mapHamToHls/generateManifestPlaylistPiece.js.map +0 -1
  139. package/dist/mapper/hls/mapHamToHls/mapHamToHls.d.ts +0 -4
  140. package/dist/mapper/hls/mapHamToHls/mapHamToHls.d.ts.map +0 -1
  141. package/dist/mapper/hls/mapHamToHls/mapHamToHls.js +0 -29
  142. package/dist/mapper/hls/mapHamToHls/mapHamToHls.js.map +0 -1
  143. package/dist/mapper/hls/mapHamToHls/utils/getByterange.d.ts +0 -14
  144. package/dist/mapper/hls/mapHamToHls/utils/getByterange.d.ts.map +0 -1
  145. package/dist/mapper/hls/mapHamToHls/utils/getByterange.js +0 -22
  146. package/dist/mapper/hls/mapHamToHls/utils/getByterange.js.map +0 -1
  147. package/dist/mapper/hls/mapHamToHls/utils/getPlaylistData.d.ts +0 -14
  148. package/dist/mapper/hls/mapHamToHls/utils/getPlaylistData.d.ts.map +0 -1
  149. package/dist/mapper/hls/mapHamToHls/utils/getPlaylistData.js +0 -16
  150. package/dist/mapper/hls/mapHamToHls/utils/getPlaylistData.js.map +0 -1
  151. package/dist/mapper/hls/mapHamToHls/utils/getSegments.d.ts +0 -13
  152. package/dist/mapper/hls/mapHamToHls/utils/getSegments.d.ts.map +0 -1
  153. package/dist/mapper/hls/mapHamToHls/utils/getSegments.js +0 -23
  154. package/dist/mapper/hls/mapHamToHls/utils/getSegments.js.map +0 -1
  155. package/dist/mapper/hls/mapHamToHls/utils/getUrlInitialization.d.ts +0 -14
  156. package/dist/mapper/hls/mapHamToHls/utils/getUrlInitialization.d.ts.map +0 -1
  157. package/dist/mapper/hls/mapHamToHls/utils/getUrlInitialization.js +0 -16
  158. package/dist/mapper/hls/mapHamToHls/utils/getUrlInitialization.js.map +0 -1
  159. package/dist/mapper/hls/mapHlsToHam/audioGroupsToSwitchingSets.d.ts +0 -16
  160. package/dist/mapper/hls/mapHlsToHam/audioGroupsToSwitchingSets.d.ts.map +0 -1
  161. package/dist/mapper/hls/mapHlsToHam/audioGroupsToSwitchingSets.js +0 -55
  162. package/dist/mapper/hls/mapHlsToHam/audioGroupsToSwitchingSets.js.map +0 -1
  163. package/dist/mapper/hls/mapHlsToHam/mapHlsToHam.d.ts +0 -4
  164. package/dist/mapper/hls/mapHlsToHam/mapHlsToHam.d.ts.map +0 -1
  165. package/dist/mapper/hls/mapHlsToHam/mapHlsToHam.js +0 -41
  166. package/dist/mapper/hls/mapHlsToHam/mapHlsToHam.js.map +0 -1
  167. package/dist/mapper/hls/mapHlsToHam/subtitleGroupsToSwitchingSets.d.ts +0 -4
  168. package/dist/mapper/hls/mapHlsToHam/subtitleGroupsToSwitchingSets.d.ts.map +0 -1
  169. package/dist/mapper/hls/mapHlsToHam/subtitleGroupsToSwitchingSets.js +0 -35
  170. package/dist/mapper/hls/mapHlsToHam/subtitleGroupsToSwitchingSets.js.map +0 -1
  171. package/dist/mapper/hls/mapHlsToHam/utils/formatSegments.d.ts +0 -14
  172. package/dist/mapper/hls/mapHlsToHam/utils/formatSegments.d.ts.map +0 -1
  173. package/dist/mapper/hls/mapHlsToHam/utils/formatSegments.js +0 -23
  174. package/dist/mapper/hls/mapHlsToHam/utils/formatSegments.js.map +0 -1
  175. package/dist/mapper/hls/mapHlsToHam/utils/getByterange.d.ts +0 -13
  176. package/dist/mapper/hls/mapHlsToHam/utils/getByterange.d.ts.map +0 -1
  177. package/dist/mapper/hls/mapHlsToHam/utils/getByterange.js +0 -17
  178. package/dist/mapper/hls/mapHlsToHam/utils/getByterange.js.map +0 -1
  179. package/dist/mapper/hls/mapHlsToHam/utils/getCodec.d.ts +0 -13
  180. package/dist/mapper/hls/mapHlsToHam/utils/getCodec.d.ts.map +0 -1
  181. package/dist/mapper/hls/mapHlsToHam/utils/getCodec.js +0 -31
  182. package/dist/mapper/hls/mapHlsToHam/utils/getCodec.js.map +0 -1
  183. package/dist/mapper/hls/mapHlsToHam/utils/getDuration.d.ts +0 -17
  184. package/dist/mapper/hls/mapHlsToHam/utils/getDuration.d.ts.map +0 -1
  185. package/dist/mapper/hls/mapHlsToHam/utils/getDuration.js +0 -21
  186. package/dist/mapper/hls/mapHlsToHam/utils/getDuration.js.map +0 -1
  187. package/dist/mapper/hls/mapHlsToHam/videoPlaylistsToSwitchingSets.d.ts +0 -5
  188. package/dist/mapper/hls/mapHlsToHam/videoPlaylistsToSwitchingSets.d.ts.map +0 -1
  189. package/dist/mapper/hls/mapHlsToHam/videoPlaylistsToSwitchingSets.js +0 -46
  190. package/dist/mapper/hls/mapHlsToHam/videoPlaylistsToSwitchingSets.js.map +0 -1
  191. package/dist/services/converters/dashToHam.d.ts +0 -20
  192. package/dist/services/converters/dashToHam.d.ts.map +0 -1
  193. package/dist/services/converters/dashToHam.js +0 -25
  194. package/dist/services/converters/dashToHam.js.map +0 -1
  195. package/dist/services/converters/hamToDash.d.ts +0 -21
  196. package/dist/services/converters/hamToDash.d.ts.map +0 -1
  197. package/dist/services/converters/hamToDash.js +0 -25
  198. package/dist/services/converters/hamToDash.js.map +0 -1
  199. package/dist/services/converters/hamToHls.d.ts +0 -21
  200. package/dist/services/converters/hamToHls.d.ts.map +0 -1
  201. package/dist/services/converters/hamToHls.js +0 -25
  202. package/dist/services/converters/hamToHls.js.map +0 -1
  203. package/dist/services/converters/hlsToHam.d.ts +0 -21
  204. package/dist/services/converters/hlsToHam.d.ts.map +0 -1
  205. package/dist/services/converters/hlsToHam.js +0 -33
  206. package/dist/services/converters/hlsToHam.js.map +0 -1
  207. package/dist/services/getters/getTracksFromPresentation.d.ts +0 -13
  208. package/dist/services/getters/getTracksFromPresentation.d.ts.map +0 -1
  209. package/dist/services/getters/getTracksFromPresentation.js +0 -15
  210. package/dist/services/getters/getTracksFromPresentation.js.map +0 -1
  211. package/dist/services/getters/getTracksFromSelectionSet.d.ts +0 -13
  212. package/dist/services/getters/getTracksFromSelectionSet.d.ts.map +0 -1
  213. package/dist/services/getters/getTracksFromSelectionSet.js +0 -15
  214. package/dist/services/getters/getTracksFromSelectionSet.js.map +0 -1
  215. package/dist/services/getters/getTracksFromSwitchingSet.d.ts +0 -13
  216. package/dist/services/getters/getTracksFromSwitchingSet.d.ts.map +0 -1
  217. package/dist/services/getters/getTracksFromSwitchingSet.js +0 -14
  218. package/dist/services/getters/getTracksFromSwitchingSet.js.map +0 -1
  219. package/dist/services/validators/validatePresentation.d.ts +0 -29
  220. package/dist/services/validators/validatePresentation.d.ts.map +0 -1
  221. package/dist/services/validators/validatePresentation.js +0 -36
  222. package/dist/services/validators/validatePresentation.js.map +0 -1
  223. package/dist/services/validators/validateSegment.d.ts +0 -18
  224. package/dist/services/validators/validateSegment.d.ts.map +0 -1
  225. package/dist/services/validators/validateSegment.js +0 -33
  226. package/dist/services/validators/validateSegment.js.map +0 -1
  227. package/dist/services/validators/validateSegments.d.ts +0 -27
  228. package/dist/services/validators/validateSegments.d.ts.map +0 -1
  229. package/dist/services/validators/validateSegments.js +0 -35
  230. package/dist/services/validators/validateSegments.js.map +0 -1
  231. package/dist/services/validators/validateSelectionSet.d.ts +0 -31
  232. package/dist/services/validators/validateSelectionSet.d.ts.map +0 -1
  233. package/dist/services/validators/validateSelectionSet.js +0 -44
  234. package/dist/services/validators/validateSelectionSet.js.map +0 -1
  235. package/dist/services/validators/validateSelectionSets.d.ts +0 -28
  236. package/dist/services/validators/validateSelectionSets.d.ts.map +0 -1
  237. package/dist/services/validators/validateSelectionSets.js +0 -36
  238. package/dist/services/validators/validateSelectionSets.js.map +0 -1
  239. package/dist/services/validators/validateSwitchingSet.d.ts +0 -31
  240. package/dist/services/validators/validateSwitchingSet.d.ts.map +0 -1
  241. package/dist/services/validators/validateSwitchingSet.js +0 -44
  242. package/dist/services/validators/validateSwitchingSet.js.map +0 -1
  243. package/dist/services/validators/validateSwitchingSets.d.ts +0 -28
  244. package/dist/services/validators/validateSwitchingSets.d.ts.map +0 -1
  245. package/dist/services/validators/validateSwitchingSets.js +0 -36
  246. package/dist/services/validators/validateSwitchingSets.js.map +0 -1
  247. package/dist/services/validators/validateTrack.d.ts +0 -32
  248. package/dist/services/validators/validateTrack.d.ts.map +0 -1
  249. package/dist/services/validators/validateTrack.js +0 -140
  250. package/dist/services/validators/validateTrack.js.map +0 -1
  251. package/dist/services/validators/validateTracks.d.ts +0 -28
  252. package/dist/services/validators/validateTracks.d.ts.map +0 -1
  253. package/dist/services/validators/validateTracks.js +0 -47
  254. package/dist/services/validators/validateTracks.js.map +0 -1
  255. package/dist/tsconfig.tsbuildinfo +0 -1
  256. package/dist/types/Validation.d.ts +0 -10
  257. package/dist/types/Validation.d.ts.map +0 -1
  258. package/dist/types/Validation.js +0 -2
  259. package/dist/types/Validation.js.map +0 -1
  260. package/dist/types/manifest/Manifest.d.ts +0 -14
  261. package/dist/types/manifest/Manifest.d.ts.map +0 -1
  262. package/dist/types/manifest/Manifest.js +0 -2
  263. package/dist/types/manifest/Manifest.js.map +0 -1
  264. package/dist/types/manifest/ManifestFormat.d.ts +0 -7
  265. package/dist/types/manifest/ManifestFormat.d.ts.map +0 -1
  266. package/dist/types/manifest/ManifestFormat.js +0 -2
  267. package/dist/types/manifest/ManifestFormat.js.map +0 -1
  268. package/dist/types/mapper/dash/AdaptationSet.d.ts +0 -41
  269. package/dist/types/mapper/dash/AdaptationSet.d.ts.map +0 -1
  270. package/dist/types/mapper/dash/AdaptationSet.js +0 -2
  271. package/dist/types/mapper/dash/AdaptationSet.js.map +0 -1
  272. package/dist/types/mapper/dash/AudioChannelConfiguration.d.ts +0 -12
  273. package/dist/types/mapper/dash/AudioChannelConfiguration.d.ts.map +0 -1
  274. package/dist/types/mapper/dash/AudioChannelConfiguration.js +0 -2
  275. package/dist/types/mapper/dash/AudioChannelConfiguration.js.map +0 -1
  276. package/dist/types/mapper/dash/ContentComponent.d.ts +0 -11
  277. package/dist/types/mapper/dash/ContentComponent.d.ts.map +0 -1
  278. package/dist/types/mapper/dash/ContentComponent.js +0 -2
  279. package/dist/types/mapper/dash/ContentComponent.js.map +0 -1
  280. package/dist/types/mapper/dash/DashManifest.d.ts +0 -20
  281. package/dist/types/mapper/dash/DashManifest.d.ts.map +0 -1
  282. package/dist/types/mapper/dash/DashManifest.js +0 -2
  283. package/dist/types/mapper/dash/DashManifest.js.map +0 -1
  284. package/dist/types/mapper/dash/Initialization.d.ts +0 -12
  285. package/dist/types/mapper/dash/Initialization.d.ts.map +0 -1
  286. package/dist/types/mapper/dash/Initialization.js +0 -2
  287. package/dist/types/mapper/dash/Initialization.js.map +0 -1
  288. package/dist/types/mapper/dash/Period.d.ts +0 -15
  289. package/dist/types/mapper/dash/Period.d.ts.map +0 -1
  290. package/dist/types/mapper/dash/Period.js +0 -2
  291. package/dist/types/mapper/dash/Period.js.map +0 -1
  292. package/dist/types/mapper/dash/Representation.d.ts +0 -30
  293. package/dist/types/mapper/dash/Representation.d.ts.map +0 -1
  294. package/dist/types/mapper/dash/Representation.js +0 -2
  295. package/dist/types/mapper/dash/Representation.js.map +0 -1
  296. package/dist/types/mapper/dash/Role.d.ts +0 -12
  297. package/dist/types/mapper/dash/Role.d.ts.map +0 -1
  298. package/dist/types/mapper/dash/Role.js +0 -2
  299. package/dist/types/mapper/dash/Role.js.map +0 -1
  300. package/dist/types/mapper/dash/SegmentBase.d.ts +0 -15
  301. package/dist/types/mapper/dash/SegmentBase.d.ts.map +0 -1
  302. package/dist/types/mapper/dash/SegmentBase.js +0 -2
  303. package/dist/types/mapper/dash/SegmentBase.js.map +0 -1
  304. package/dist/types/mapper/dash/SegmentList.d.ts +0 -16
  305. package/dist/types/mapper/dash/SegmentList.d.ts.map +0 -1
  306. package/dist/types/mapper/dash/SegmentList.js +0 -2
  307. package/dist/types/mapper/dash/SegmentList.js.map +0 -1
  308. package/dist/types/mapper/dash/SegmentTemplate.d.ts +0 -17
  309. package/dist/types/mapper/dash/SegmentTemplate.d.ts.map +0 -1
  310. package/dist/types/mapper/dash/SegmentTemplate.js +0 -2
  311. package/dist/types/mapper/dash/SegmentTemplate.js.map +0 -1
  312. package/dist/types/mapper/dash/SegmentUrl.d.ts +0 -11
  313. package/dist/types/mapper/dash/SegmentUrl.d.ts.map +0 -1
  314. package/dist/types/mapper/dash/SegmentUrl.js +0 -2
  315. package/dist/types/mapper/dash/SegmentUrl.js.map +0 -1
  316. package/dist/types/mapper/hls/Byterange.d.ts +0 -11
  317. package/dist/types/mapper/hls/Byterange.d.ts.map +0 -1
  318. package/dist/types/mapper/hls/Byterange.js +0 -2
  319. package/dist/types/mapper/hls/Byterange.js.map +0 -1
  320. package/dist/types/mapper/hls/HlsManifest.d.ts +0 -15
  321. package/dist/types/mapper/hls/HlsManifest.d.ts.map +0 -1
  322. package/dist/types/mapper/hls/HlsManifest.js +0 -2
  323. package/dist/types/mapper/hls/HlsManifest.js.map +0 -1
  324. package/dist/types/mapper/hls/MediaGroups.d.ts +0 -22
  325. package/dist/types/mapper/hls/MediaGroups.d.ts.map +0 -1
  326. package/dist/types/mapper/hls/MediaGroups.js +0 -2
  327. package/dist/types/mapper/hls/MediaGroups.js.map +0 -1
  328. package/dist/types/mapper/hls/Playlist.d.ts +0 -18
  329. package/dist/types/mapper/hls/Playlist.d.ts.map +0 -1
  330. package/dist/types/mapper/hls/Playlist.js +0 -2
  331. package/dist/types/mapper/hls/Playlist.js.map +0 -1
  332. package/dist/types/mapper/hls/SegmentHls.d.ts +0 -18
  333. package/dist/types/mapper/hls/SegmentHls.d.ts.map +0 -1
  334. package/dist/types/mapper/hls/SegmentHls.js +0 -2
  335. package/dist/types/mapper/hls/SegmentHls.js.map +0 -1
  336. package/dist/types/model/AlignedSwitchingSet.d.ts +0 -10
  337. package/dist/types/model/AlignedSwitchingSet.d.ts.map +0 -1
  338. package/dist/types/model/AlignedSwitchingSet.js +0 -2
  339. package/dist/types/model/AlignedSwitchingSet.js.map +0 -1
  340. package/dist/types/model/AudioTrack.d.ts +0 -17
  341. package/dist/types/model/AudioTrack.d.ts.map +0 -1
  342. package/dist/types/model/AudioTrack.js +0 -2
  343. package/dist/types/model/AudioTrack.js.map +0 -1
  344. package/dist/types/model/FrameRate.d.ts +0 -14
  345. package/dist/types/model/FrameRate.d.ts.map +0 -1
  346. package/dist/types/model/FrameRate.js +0 -11
  347. package/dist/types/model/FrameRate.js.map +0 -1
  348. package/dist/types/model/Ham.d.ts +0 -11
  349. package/dist/types/model/Ham.d.ts.map +0 -1
  350. package/dist/types/model/Ham.js +0 -2
  351. package/dist/types/model/Ham.js.map +0 -1
  352. package/dist/types/model/Presentation.d.ts +0 -13
  353. package/dist/types/model/Presentation.d.ts.map +0 -1
  354. package/dist/types/model/Presentation.js +0 -2
  355. package/dist/types/model/Presentation.js.map +0 -1
  356. package/dist/types/model/Segment.d.ts +0 -11
  357. package/dist/types/model/Segment.d.ts.map +0 -1
  358. package/dist/types/model/Segment.js +0 -2
  359. package/dist/types/model/Segment.js.map +0 -1
  360. package/dist/types/model/SelectionSet.d.ts +0 -13
  361. package/dist/types/model/SelectionSet.d.ts.map +0 -1
  362. package/dist/types/model/SelectionSet.js +0 -2
  363. package/dist/types/model/SelectionSet.js.map +0 -1
  364. package/dist/types/model/SwitchingSet.d.ts +0 -11
  365. package/dist/types/model/SwitchingSet.d.ts.map +0 -1
  366. package/dist/types/model/SwitchingSet.js +0 -2
  367. package/dist/types/model/SwitchingSet.js.map +0 -1
  368. package/dist/types/model/TextTrack.d.ts +0 -8
  369. package/dist/types/model/TextTrack.d.ts.map +0 -1
  370. package/dist/types/model/TextTrack.js +0 -2
  371. package/dist/types/model/TextTrack.js.map +0 -1
  372. package/dist/types/model/Track.d.ts +0 -32
  373. package/dist/types/model/Track.d.ts.map +0 -1
  374. package/dist/types/model/Track.js +0 -2
  375. package/dist/types/model/Track.js.map +0 -1
  376. package/dist/types/model/TrackType.d.ts +0 -8
  377. package/dist/types/model/TrackType.d.ts.map +0 -1
  378. package/dist/types/model/TrackType.js +0 -2
  379. package/dist/types/model/TrackType.js.map +0 -1
  380. package/dist/types/model/VideoTrack.d.ts +0 -23
  381. package/dist/types/model/VideoTrack.d.ts.map +0 -1
  382. package/dist/types/model/VideoTrack.js +0 -2
  383. package/dist/types/model/VideoTrack.js.map +0 -1
  384. package/dist/utils/constants.d.ts +0 -16
  385. package/dist/utils/constants.d.ts.map +0 -1
  386. package/dist/utils/constants.js +0 -21
  387. package/dist/utils/constants.js.map +0 -1
  388. package/dist/utils/dash/iso8601DurationToNumber.d.ts +0 -2
  389. package/dist/utils/dash/iso8601DurationToNumber.d.ts.map +0 -1
  390. package/dist/utils/dash/iso8601DurationToNumber.js +0 -17
  391. package/dist/utils/dash/iso8601DurationToNumber.js.map +0 -1
  392. package/dist/utils/dash/numberToIso8601Duration.d.ts +0 -2
  393. package/dist/utils/dash/numberToIso8601Duration.d.ts.map +0 -1
  394. package/dist/utils/dash/numberToIso8601Duration.js +0 -13
  395. package/dist/utils/dash/numberToIso8601Duration.js.map +0 -1
  396. package/dist/utils/dash/parseDashManifest.d.ts +0 -22
  397. package/dist/utils/dash/parseDashManifest.d.ts.map +0 -1
  398. package/dist/utils/dash/parseDashManifest.js +0 -24
  399. package/dist/utils/dash/parseDashManifest.js.map +0 -1
  400. package/dist/utils/dash/serializeDashManifest.d.ts +0 -18
  401. package/dist/utils/dash/serializeDashManifest.d.ts.map +0 -1
  402. package/dist/utils/dash/serializeDashManifest.js +0 -20
  403. package/dist/utils/dash/serializeDashManifest.js.map +0 -1
  404. package/dist/utils/hls/parseHlsManifest.d.ts +0 -18
  405. package/dist/utils/hls/parseHlsManifest.d.ts.map +0 -1
  406. package/dist/utils/hls/parseHlsManifest.js +0 -24
  407. package/dist/utils/hls/parseHlsManifest.js.map +0 -1
  408. package/dist/utils/manifest/addMetadataToDash.d.ts +0 -4
  409. package/dist/utils/manifest/addMetadataToDash.d.ts.map +0 -1
  410. package/dist/utils/manifest/addMetadataToDash.js +0 -15
  411. package/dist/utils/manifest/addMetadataToDash.js.map +0 -1
  412. package/dist/utils/manifest/addMetadataToHls.d.ts +0 -3
  413. package/dist/utils/manifest/addMetadataToHls.d.ts.map +0 -1
  414. package/dist/utils/manifest/addMetadataToHls.js +0 -15
  415. package/dist/utils/manifest/addMetadataToHls.js.map +0 -1
  416. package/dist/utils/manifest/getMetadata.d.ts +0 -3
  417. package/dist/utils/manifest/getMetadata.d.ts.map +0 -1
  418. package/dist/utils/manifest/getMetadata.js +0 -5
  419. package/dist/utils/manifest/getMetadata.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,20 +1,1822 @@
1
- export * from './services/converters/dashToHam.js';
2
- export * from './services/converters/hamToDash.js';
3
- export * from './services/converters/hamToHls.js';
4
- export * from './services/converters/hlsToHam.js';
5
- export * from './services/getters/getTracksFromPresentation.js';
6
- export * from './services/getters/getTracksFromSelectionSet.js';
7
- export * from './services/getters/getTracksFromSwitchingSet.js';
8
- export * from './services/validators/validatePresentation.js';
9
- export * from './services/validators/validateSegment.js';
10
- export * from './services/validators/validateSegments.js';
11
- export * from './services/validators/validateSelectionSet.js';
12
- export * from './services/validators/validateSelectionSets.js';
13
- export * from './services/validators/validateSwitchingSet.js';
14
- export * from './services/validators/validateSwitchingSets.js';
15
- export * from './services/validators/validateTrack.js';
16
- export * from './services/validators/validateTracks.js';
17
- export * from './utils/dash/parseDashManifest.js';
18
- export * from './utils/dash/serializeDashManifest.js';
19
- export * from './utils/hls/parseHlsManifest.js';
1
+ //#region src/mapper/dash/mapDashToHam/mapSegmentBase.ts
2
+ /**
3
+ * @internal
4
+ *
5
+ * Maps SegmentBase from dash to Segment list from ham.
6
+ *
7
+ * @param representation - Representation to get the SegmentBase from
8
+ * @param duration - Duration of the segment
9
+ * @returns list of ham segments
10
+ */
11
+ function mapSegmentBase(representation, duration) {
12
+ return representation.SegmentBase?.map((segment) => {
13
+ return {
14
+ duration,
15
+ url: representation.BaseURL?.[0] ?? "",
16
+ byteRange: segment.$.indexRange
17
+ };
18
+ }) ?? [];
19
+ }
20
+
21
+ //#endregion
22
+ //#region src/mapper/dash/mapDashToHam/utils/calculateDuration.ts
23
+ /**
24
+ * @internal
25
+ *
26
+ * Calculates the duration of a segment.
27
+ *
28
+ * segmentDuration = duration / timescale
29
+ *
30
+ * @param duration - Duration of the segment
31
+ * @param timescale - Timescale of the segment
32
+ * @returns Segment duration
33
+ */
34
+ function calculateDuration(duration, timescale) {
35
+ if (!duration || !timescale) return 1;
36
+ return +(duration ?? 1) / +(timescale ?? 1);
37
+ }
38
+
39
+ //#endregion
40
+ //#region src/mapper/dash/mapDashToHam/mapSegmentList.ts
41
+ /**
42
+ * @internal
43
+ *
44
+ * Maps SegmentList from dash to Segment list from ham.
45
+ *
46
+ * @param segmentList - SegmentList list from dash
47
+ * @returns list of ham segments
48
+ */
49
+ function mapSegmentList(segmentList) {
50
+ const segments = [];
51
+ segmentList.map((segment) => {
52
+ if (segment.SegmentURL) return segment.SegmentURL.forEach((segmentURL) => {
53
+ segments.push({
54
+ duration: calculateDuration(segment.$.duration, segment.$.timescale),
55
+ url: segmentURL.$.media ?? ""
56
+ });
57
+ });
58
+ });
59
+ return segments;
60
+ }
61
+
62
+ //#endregion
63
+ //#region src/mapper/dash/mapDashToHam/utils/getNumberOfSegments.ts
64
+ /**
65
+ * @internal
66
+ *
67
+ * Calculates the number of segments that a track has to use SegmentTemplate.
68
+ *
69
+ * Equation used:
70
+ * segments = total duration / (segment duration / timescale)
71
+ *
72
+ * **This equation might be wrong, please double-check it**
73
+ *
74
+ * @param segmentTemplate - SegmentTemplate object
75
+ * @param duration - Total duration of the content
76
+ * @returns Number of segments
77
+ */
78
+ function getNumberOfSegments(segmentTemplate, duration) {
79
+ return Math.round(duration / calculateDuration(segmentTemplate.$.duration, segmentTemplate.$.timescale));
80
+ }
81
+
82
+ //#endregion
83
+ //#region src/mapper/dash/mapDashToHam/utils/getUrlFromTemplate.ts
84
+ /**
85
+ * @internal
86
+ *
87
+ * Create the url from a segment template.
88
+ *
89
+ * Searches for substrings with the format `$value$` and replaces it with the correct value.
90
+ * - RepresentationID: id of the representation
91
+ * - Number: id of the segment. `%0Xd` defines the number `X` of digits it needs to have
92
+ *
93
+ * @param representation - Representation of the template
94
+ * @param segmentTemplate - Segment template
95
+ * @param segmentId - Segment id
96
+ * @returns url from the segment template
97
+ */
98
+ function getUrlFromTemplate(representation, segmentTemplate, segmentId) {
99
+ return segmentTemplate.$.media.replace(/\$(.*?)\$/g, (match) => {
100
+ if (match.includes("RepresentationID")) return representation.$.id;
101
+ /**
102
+ * Number with 4 digits e.g: 0001
103
+ */
104
+ if (match.includes("Number%04d")) return segmentId.toString().padStart(4, "0");
105
+ if (match.includes("Number")) return segmentId;
106
+ console.error(`Unknown property ${match} from the SegmentTemplate on representation ${representation.$.id}`);
107
+ return match;
108
+ });
109
+ }
110
+
111
+ //#endregion
112
+ //#region src/mapper/dash/mapDashToHam/mapSegmentTemplate.ts
113
+ /**
114
+ * @internal
115
+ *
116
+ * Maps SegmentTemplate from dash to Segment list from ham.
117
+ *
118
+ * @param representation - Representation to generate the urls
119
+ * @param duration - Duration of the segments
120
+ * @param segmentTemplate - SegmentTemplate to get the properties from
121
+ * @returns list of ham segments
122
+ */
123
+ function mapSegmentTemplate(representation, duration, segmentTemplate) {
124
+ const numberOfSegments = getNumberOfSegments(segmentTemplate, duration);
125
+ const init = +(segmentTemplate.$.startNumber ?? 0);
126
+ const segments = [];
127
+ for (let id = init; id < numberOfSegments + init; id++) segments.push({
128
+ duration: calculateDuration(segmentTemplate.$.duration, segmentTemplate.$.timescale),
129
+ url: getUrlFromTemplate(representation, segmentTemplate, id)
130
+ });
131
+ return segments;
132
+ }
133
+
134
+ //#endregion
135
+ //#region src/mapper/dash/mapDashToHam/mapSegments.ts
136
+ /**
137
+ * @internal
138
+ *
139
+ * Maps dash segments to ham segment.
140
+ *
141
+ * Checks the type of dash segments used to map them accordingly.
142
+ * @see mapSegmentBase
143
+ * @see mapSegmentList
144
+ * @see mapSegmentTemplate
145
+ *
146
+ * @param adaptationSet - AdaptationSet to get the segments from
147
+ * @param representation - Representation to get the segments from
148
+ * @param duration - Duration of the segments
149
+ * @returns list of ham segments
150
+ */
151
+ function mapSegments(adaptationSet, representation, duration) {
152
+ const segmentTemplate = adaptationSet.SegmentTemplate?.at(0) ?? representation.SegmentTemplate?.at(0);
153
+ const segmentList = adaptationSet.SegmentList ?? representation.SegmentList;
154
+ if (representation.SegmentBase) return mapSegmentBase(representation, duration);
155
+ else if (segmentList) return mapSegmentList(segmentList);
156
+ else if (segmentTemplate) return mapSegmentTemplate(representation, duration, segmentTemplate);
157
+ else {
158
+ console.error(`Representation ${representation.$.id} has no segments`);
159
+ return [];
160
+ }
161
+ }
162
+
163
+ //#endregion
164
+ //#region src/mapper/dash/mapDashToHam/utils/getChannels.ts
165
+ /**
166
+ * @internal
167
+ *
168
+ * Get the channels value (audio). It can be present on adaptationSet or representation.
169
+ *
170
+ * @param adaptationSet - AdaptationSet to try to get the channels from
171
+ * @param representation - Representation to try to get the channels from
172
+ * @returns Channels value
173
+ */
174
+ function getChannels(adaptationSet, representation) {
175
+ const channels = +(adaptationSet.AudioChannelConfiguration?.at(0)?.$.value ?? representation.AudioChannelConfiguration?.at(0)?.$.value ?? 0);
176
+ if (!channels) console.error(`Representation ${representation.$.id} has no channels`);
177
+ return channels;
178
+ }
179
+
180
+ //#endregion
181
+ //#region src/mapper/dash/mapDashToHam/utils/getCodec.ts
182
+ /**
183
+ * @internal
184
+ *
185
+ * Get the codec value (video and audio). It can be present on adaptationSet or representation.
186
+ *
187
+ * @param adaptationSet - AdaptationSet to try to get the codec from
188
+ * @param representation - Representation to try to get the codec from
189
+ * @returns Content codec
190
+ */
191
+ function getCodec(adaptationSet, representation) {
192
+ const codec = representation.$.codecs ?? adaptationSet.$.codecs ?? "";
193
+ if (!codec) console.error(`Representation ${representation.$.id} has no codecs`);
194
+ return codec;
195
+ }
196
+
197
+ //#endregion
198
+ //#region src/mapper/dash/mapDashToHam/utils/getContentType.ts
199
+ /**
200
+ * @internal
201
+ *
202
+ * Get the type of the content. It can be obtained directly from AdaptationSet or Representation
203
+ * or can be inferred with the existing properties.
204
+ *
205
+ * @param adaptationSet - AdaptationSet to get the type from
206
+ * @param representation - Representation to get the type from
207
+ * @returns type of the content
208
+ */
209
+ function getContentType(adaptationSet, representation) {
210
+ if (adaptationSet.$.contentType) return adaptationSet.$.contentType;
211
+ if (adaptationSet.ContentComponent?.at(0)) return adaptationSet.ContentComponent.at(0)?.$.contentType ?? "";
212
+ if (adaptationSet.$.mimeType || representation?.$.mimeType) {
213
+ const type = adaptationSet.$.mimeType?.split("/")[0] || representation?.$.mimeType?.split("/")[0];
214
+ if (type === "audio" || type === "video" || type === "text") return type;
215
+ if (type === "application") return "text";
216
+ }
217
+ if (adaptationSet.$.maxHeight) return "video";
218
+ const adaptationRef = adaptationSet.$.id ?? `group: ${adaptationSet.$.group}, lang: ${adaptationSet.$.lang}`;
219
+ console.error(`Could not find contentType from adaptationSet ${adaptationRef}`);
220
+ console.info("Using \"text\" as default contentType");
221
+ return "text";
222
+ }
223
+
224
+ //#endregion
225
+ //#region src/utils/constants.ts
226
+ const TIMESCALE_48000 = 48e3;
227
+ const VIDEO_SAMPLE_RATE = 9e4;
228
+ const TEXT_SAMPLE_RATE = 1e3;
229
+ const FRAME_RATE_NUMERATOR_30 = 30;
230
+ const WHITE_SPACE = " ";
231
+ const WHITE_SPACE_ENCODED = "%20";
232
+ const HYPHEN_MINUS_SEPARATOR = "-";
233
+ const AT_SEPARATOR = "@";
234
+ const FRAME_RATE_SEPARATOR = "/";
235
+ const NUMERATOR = 0;
236
+ const DENOMINATOR = 1;
237
+ const ZERO = 0;
238
+
239
+ //#endregion
240
+ //#region src/mapper/dash/mapDashToHam/utils/getFrameRate.ts
241
+ /**
242
+ * @internal
243
+ *
244
+ * Get the frame rate from a dash manifest.
245
+ *
246
+ * This functions assumes the adaptationSet and representation set are type video
247
+ *
248
+ * @param adaptationSet - To try to get the frameRate from
249
+ * @param representation - To try to get the frameRate from
250
+ * @returns object containing numerator and denominator
251
+ */
252
+ function getFrameRate(adaptationSet, representation) {
253
+ const frameRateDash = representation.$.frameRate ?? adaptationSet.$.frameRate ?? "";
254
+ if (!frameRateDash) console.error(`Representation ${representation.$.id} has no frame rate`);
255
+ const frameRate = frameRateDash.split(FRAME_RATE_SEPARATOR);
256
+ const frameRateNumerator = parseInt(frameRate.at(NUMERATOR) ?? "");
257
+ const frameRateDenominator = parseInt(frameRate.at(DENOMINATOR) ?? "");
258
+ return {
259
+ frameRateNumerator: isNaN(frameRateNumerator) ? FRAME_RATE_NUMERATOR_30 : frameRateNumerator,
260
+ frameRateDenominator: isNaN(frameRateDenominator) ? ZERO : frameRateDenominator
261
+ };
262
+ }
263
+
264
+ //#endregion
265
+ //#region src/mapper/dash/mapDashToHam/utils/getGroup.ts
266
+ /**
267
+ * @internal
268
+ */
269
+ function getGroup(adaptationSet) {
270
+ return adaptationSet.$.group ?? getContentType(adaptationSet);
271
+ }
272
+
273
+ //#endregion
274
+ //#region src/mapper/dash/mapDashToHam/utils/getLanguage.ts
275
+ /**
276
+ * @internal
277
+ *
278
+ * Get the language from an adaptation set.
279
+ *
280
+ * @param adaptationSet - AdaptationSet to get the language from
281
+ * @returns language of the content
282
+ */
283
+ function getLanguage(adaptationSet) {
284
+ let language = adaptationSet.$.lang;
285
+ if (!language) {
286
+ console.info(`AdaptationSet ${adaptationSet.$.id} has no lang, using "und" as default`);
287
+ language = "und";
288
+ }
289
+ return language;
290
+ }
291
+
292
+ //#endregion
293
+ //#region src/mapper/dash/mapDashToHam/utils/getPresentationId.ts
294
+ /**
295
+ * @internal
296
+ *
297
+ * Generates a presentation id. It uses the period id as default or creates one
298
+ * if none is present.
299
+ *
300
+ * @param period - Period to try to get the id from
301
+ * @param duration - Duration of the content
302
+ * @returns Presentation id
303
+ */
304
+ function getPresentationId(period, duration) {
305
+ return period.$.id ?? `presentation-id-${duration}`;
306
+ }
307
+
308
+ //#endregion
309
+ //#region src/mapper/dash/mapDashToHam/utils/getSampleRate.ts
310
+ /**
311
+ * @internal
312
+ *
313
+ * Get sample rate (audio).
314
+ *
315
+ * @param adaptationSet - AdaptationSet to try to get the sampleRate from
316
+ * @param representation - Representation to try to get the sampleRate from
317
+ * @returns Sample rate. In case it is not presents, it returns 0.
318
+ */
319
+ function getSampleRate(adaptationSet, representation) {
320
+ const sampleRate = +(representation.$.audioSamplingRate ?? adaptationSet.$.audioSamplingRate ?? 0);
321
+ if (!sampleRate) console.error(`Representation ${representation.$.id} has no audioSamplingRate`);
322
+ return sampleRate;
323
+ }
324
+
325
+ //#endregion
326
+ //#region src/mapper/dash/mapDashToHam/utils/getSar.ts
327
+ /**
328
+ * @internal
329
+ *
330
+ * Get the sar value. It can be present on adaptationSet or representation.
331
+ *
332
+ * @param adaptationSet - AdaptationSet to try to get the sar from
333
+ * @param representation - AdaptationSet to try to get the sar from
334
+ * @returns sar value. In case it is not present, returns empty string.
335
+ */
336
+ function getSar(adaptationSet, representation) {
337
+ const sar = representation.$.sar ?? adaptationSet.$.sar ?? "";
338
+ if (!sar) console.error(`Representation ${representation.$.id} has no sar`);
339
+ return sar;
340
+ }
341
+
342
+ //#endregion
343
+ //#region src/mapper/dash/mapDashToHam/utils/getTrackDuration.ts
344
+ /**
345
+ * @internal
346
+ *
347
+ * Calculate the duration of a track.
348
+ *
349
+ * This is calculated using the sum of the duration of all the segments from the
350
+ * track.
351
+ *
352
+ * An alternative to this could be number of segments * duration of a segment.
353
+ *
354
+ * @param segments - Segments to calculate the sum of the durations
355
+ * @returns Duration of the track
356
+ */
357
+ function getTrackDuration(segments) {
358
+ return segments.reduce((acc, segment) => {
359
+ return acc + segment.duration;
360
+ }, 0);
361
+ }
362
+
363
+ //#endregion
364
+ //#region src/mapper/dash/mapHamToDash/utils/getTimescale.ts
365
+ /**
366
+ * @internal
367
+ *
368
+ * This function tries to recreate the timescale value.
369
+ *
370
+ * This value is not stored on the ham object, so it is not possible (for now)
371
+ * to get the original one.
372
+ *
373
+ * Just the audio tracks have this value stored on the `sampleRate` key.
374
+ *
375
+ * @param track - Track to get the timescale from
376
+ * @returns Timescale in numbers
377
+ */
378
+ function getTimescale(track) {
379
+ if (track?.type === "audio") {
380
+ const audioTrack = track;
381
+ return audioTrack.sampleRate !== 0 ? audioTrack.sampleRate : TIMESCALE_48000;
382
+ }
383
+ if (track?.type === "video") return VIDEO_SAMPLE_RATE;
384
+ if (track?.type === "text") return TEXT_SAMPLE_RATE;
385
+ return VIDEO_SAMPLE_RATE;
386
+ }
387
+
388
+ //#endregion
389
+ //#region src/mapper/hls/mapHamToHls/utils/encodeByteRange.ts
390
+ /**
391
+ * @internal
392
+ *
393
+ * Get the byterange in hls format from ham track.
394
+ *
395
+ * @param track - Track to get the byterange from
396
+ * @returns string containing the byterange in the hls format
397
+ *
398
+ * @alpha
399
+ */
400
+ function encodeByteRange(track) {
401
+ if (track.byteRange) return `BYTERANGE:${track.byteRange.replace(HYPHEN_MINUS_SEPARATOR, AT_SEPARATOR)}\n`;
402
+ else if (track.segments?.at(0)?.byteRange) return `BYTERANGE:0@${Number(track.segments.at(0)?.byteRange?.replace(HYPHEN_MINUS_SEPARATOR, AT_SEPARATOR).split(AT_SEPARATOR)[0]) - 1}\n`;
403
+ return "";
404
+ }
405
+
406
+ //#endregion
407
+ //#region src/mapper/hls/mapHamToHls/utils/getUrlInitialization.ts
408
+ /**
409
+ * @internal
410
+ *
411
+ * Get url initialization from ham track.
412
+ *
413
+ * @param track - Track to get the url initialization from
414
+ * @returns string containing the url initialization in the hls format
415
+ *
416
+ * @alpha
417
+ */
418
+ function getUrlInitialization(track) {
419
+ return track.urlInitialization?.replaceAll(WHITE_SPACE, WHITE_SPACE_ENCODED) ?? "";
420
+ }
421
+
422
+ //#endregion
423
+ //#region src/mapper/hls/mapHamToHls/utils/getPlaylistData.ts
424
+ /**
425
+ * @internal
426
+ *
427
+ * Get the playlist data in hls format from ham track.
428
+ *
429
+ * @param track - Track to get the playlist data from
430
+ * @returns string containing the playlist data in the hls format
431
+ *
432
+ * @alpha
433
+ */
434
+ function getPlaylistData(track) {
435
+ return `#EXT-X-MAP:URI="${getUrlInitialization(track)}",${encodeByteRange(track)}\n`;
436
+ }
437
+
438
+ //#endregion
439
+ //#region src/mapper/hls/mapHamToHls/utils/getSegments.ts
440
+ /**
441
+ * @internal
442
+ *
443
+ * Format the ham segments to hls.
444
+ *
445
+ * @param segments - Segments to be formatted
446
+ * @returns string containing the segments in the hls format
447
+ *
448
+ * @alpha
449
+ */
450
+ function getSegments(segments) {
451
+ return segments.map((segment) => {
452
+ const byteRange = segment.byteRange ? `#EXT-X-BYTERANGE:${segment.byteRange.replace(HYPHEN_MINUS_SEPARATOR, AT_SEPARATOR)}\n` : "";
453
+ const url = segment.url.replaceAll(WHITE_SPACE, WHITE_SPACE_ENCODED);
454
+ return `#EXTINF:${segment.duration},\n${byteRange}\n${url}`;
455
+ }).join("\n");
456
+ }
457
+
458
+ //#endregion
459
+ //#region src/mapper/hls/mapHlsToHam/utils/decodeByteRange.ts
460
+ /**
461
+ * @internal
462
+ *
463
+ * Get byterange from HLS Manifest.
464
+ *
465
+ * @param byteRange - Byterange object containing length and offset
466
+ * @returns string containing the byterange. If byterange is undefined, it returns undefined
467
+ *
468
+ * @alpha
469
+ */
470
+ function decodeByteRange(byteRange) {
471
+ if (!byteRange) return "";
472
+ return `${byteRange.length}@${byteRange.offset}`;
473
+ }
474
+
475
+ //#endregion
476
+ //#region src/mapper/hls/mapHlsToHam/utils/formatSegments.ts
477
+ /**
478
+ * @internal
479
+ *
480
+ * Format the hls segments into the ham segments.
481
+ *
482
+ * @param segments - List of HLS segments
483
+ * @returns ham formatted list of segments
484
+ *
485
+ * @alpha
486
+ */
487
+ function formatSegments(segments) {
488
+ return segments?.map((segment) => {
489
+ const byteRange = decodeByteRange(segment?.byterange);
490
+ return {
491
+ duration: segment.duration,
492
+ url: segment.uri,
493
+ ...byteRange && { byteRange }
494
+ };
495
+ }) ?? [];
496
+ }
497
+
498
+ //#endregion
499
+ //#region src/mapper/hls/mapHlsToHam/utils/getDuration.ts
500
+ /**
501
+ * @internal
502
+ *
503
+ * Calculate the duration of a track.
504
+ *
505
+ * `target duration * number of segments`
506
+ *
507
+ * @param manifest - Manifest of the track
508
+ * @param segments - Array of segments in a track
509
+ * @returns duration of a track
510
+ *
511
+ * @alpha
512
+ */
513
+ function getDuration(manifest, segments) {
514
+ if (!manifest?.targetDuration) {
515
+ console.error("Could not calculate duration, manifest is undefined.");
516
+ return null;
517
+ }
518
+ return manifest?.targetDuration * segments.length;
519
+ }
520
+
521
+ //#endregion
522
+ //#region src/mapper/hls/mapHlsToHam/utils/getHlsCodec.ts
523
+ /**
524
+ * @internal
525
+ *
526
+ * Get the codec for a type of content.
527
+ *
528
+ * @param type - Type of the content to get the codecs from
529
+ * @param codecs - String containing multiple codecs separated with commas
530
+ * @returns string containing codec
531
+ *
532
+ * @alpha
533
+ */
534
+ function getHlsCodec(type, codecs) {
535
+ if (type === "audio") return "mp4a.40.2";
536
+ else if (type === "video") return codecs?.split(",").at(0) ?? "";
537
+ else return "";
538
+ }
539
+
540
+ //#endregion
541
+ //#region src/utils/dash/iso8601DurationToNumber.ts
542
+ /**
543
+ * @internal
544
+ */
545
+ function iso8601DurationToNumber(isoDuration) {
546
+ const hours = /(?:([.,\d]+)H)/.exec(isoDuration);
547
+ const minutes = /(?:([.,\d]+)M)/.exec(isoDuration);
548
+ const seconds = /(?:([.,\d]+)S)/.exec(isoDuration);
549
+ let duration = 0;
550
+ if (hours) duration += +hours[1] * 60 * 60;
551
+ if (minutes) duration += +minutes[1] * 60;
552
+ if (seconds) duration += +seconds[1];
553
+ return duration;
554
+ }
555
+
556
+ //#endregion
557
+ //#region src/mapper/dash/mapDashToHam/utils/getInitializationUrl.ts
558
+ /**
559
+ * @internal
560
+ *
561
+ * Get the initialization url. It can be present on AdaptationSet or Representation.
562
+ *
563
+ * Url initialization is present on segments.
564
+ *
565
+ * @param adaptationSet - AdaptationSet to try to get the initialization url from
566
+ * @param representation - Representation to try to get the initialization url from
567
+ */
568
+ function getInitializationUrl(adaptationSet, representation) {
569
+ let initializationUrl;
570
+ if (representation.SegmentBase) initializationUrl = representation.BaseURL?.[0] ?? "";
571
+ else if (adaptationSet.SegmentList || representation.SegmentList) initializationUrl = representation.SegmentList?.at(0)?.Initialization[0].$.sourceURL || adaptationSet.SegmentList?.at(0)?.Initialization[0].$.sourceURL;
572
+ if (adaptationSet.SegmentTemplate || representation.SegmentTemplate) {
573
+ initializationUrl = adaptationSet.SegmentTemplate?.at(0)?.$.initialization || representation.SegmentTemplate?.at(0)?.$.initialization;
574
+ if (initializationUrl?.includes("$RepresentationID$")) initializationUrl = initializationUrl.replace("$RepresentationID$", representation.$.id ?? "");
575
+ }
576
+ return initializationUrl;
577
+ }
578
+
579
+ //#endregion
580
+ //#region src/mapper/dash/mapDashToHam/mapTracks.ts
581
+ /**
582
+ * @internal
583
+ *
584
+ * Map dash components to ham tracks.
585
+ *
586
+ * @param adaptationSet - AdaptationSet of the dash manifest
587
+ * @param representation - Representation of the dash manifest
588
+ * @param segments - Segments from the representation of the dash manifest
589
+ * @param initializationUrl - Initialization url from the track
590
+ * @returns AudioTrack, VideoTrack or TextTrack depending on the type
591
+ */
592
+ function mapTracks(adaptationSet, representation, segments, initializationUrl) {
593
+ if (!adaptationSet) throw new Error("Error: AdaptationSet is undefined");
594
+ const type = getContentType(adaptationSet, representation);
595
+ if (type === "video") return {
596
+ bandwidth: +(representation.$.bandwidth ?? 0),
597
+ codec: getCodec(adaptationSet, representation),
598
+ duration: getTrackDuration(segments),
599
+ frameRate: getFrameRate(adaptationSet, representation),
600
+ height: +(representation.$.height ?? 0),
601
+ id: representation.$.id ?? "",
602
+ language: getLanguage(adaptationSet),
603
+ par: adaptationSet.$.par ?? "",
604
+ sar: getSar(adaptationSet, representation),
605
+ scanType: representation.$.scanType ?? "",
606
+ segments,
607
+ type,
608
+ width: +(representation.$.width ?? 0),
609
+ urlInitialization: initializationUrl
610
+ };
611
+ else if (type === "audio") return {
612
+ bandwidth: +(representation.$.bandwidth ?? 0),
613
+ channels: getChannels(adaptationSet, representation),
614
+ codec: getCodec(adaptationSet, representation),
615
+ duration: getTrackDuration(segments),
616
+ id: representation.$.id ?? "",
617
+ language: getLanguage(adaptationSet),
618
+ sampleRate: getSampleRate(adaptationSet, representation),
619
+ segments,
620
+ type,
621
+ urlInitialization: initializationUrl
622
+ };
623
+ else return {
624
+ bandwidth: +(representation.$.bandwidth ?? 0),
625
+ codec: getCodec(adaptationSet, representation),
626
+ duration: getTrackDuration(segments),
627
+ id: representation.$.id ?? "",
628
+ language: getLanguage(adaptationSet),
629
+ segments,
630
+ type,
631
+ urlInitialization: initializationUrl
632
+ };
633
+ }
634
+
635
+ //#endregion
636
+ //#region src/mapper/dash/mapDashToHam/mapDashToHam.ts
637
+ /**
638
+ * @internal
639
+ *
640
+ * Main function to map dash to ham.
641
+ *
642
+ * @param dash - Dash manifest to map
643
+ * @returns List of presentations in ham
644
+ */
645
+ function mapDashToHam(dash) {
646
+ return dash.MPD.Period.map((period) => {
647
+ const duration = iso8601DurationToNumber(period.$.duration);
648
+ const presentationId = getPresentationId(period, duration);
649
+ const selectionSetGroups = {};
650
+ period.AdaptationSet.map((adaptationSet) => {
651
+ const tracks = adaptationSet.Representation.map((representation) => {
652
+ return mapTracks(adaptationSet, representation, mapSegments(adaptationSet, representation, duration), getInitializationUrl(adaptationSet, representation));
653
+ });
654
+ const group = getGroup(adaptationSet);
655
+ if (!selectionSetGroups[group]) selectionSetGroups[group] = {
656
+ id: group,
657
+ switchingSets: []
658
+ };
659
+ selectionSetGroups[group].switchingSets.push({
660
+ id: adaptationSet.$.id ?? adaptationSet.ContentComponent?.at(0)?.$.id ?? group,
661
+ tracks
662
+ });
663
+ });
664
+ return {
665
+ id: presentationId,
666
+ selectionSets: Object.values(selectionSetGroups)
667
+ };
668
+ });
669
+ }
670
+
671
+ //#endregion
672
+ //#region src/mapper/dash/mapHamToDash/trackToSegmentBase.ts
673
+ function trackToSegmentBase(track) {
674
+ const segments = [];
675
+ if (track.segments.length > 0 && track.byteRange && track.segments[0].byteRange && track.segments[0].byteRange.includes("@")) {
676
+ let firstSegment = void 0;
677
+ const initByteRange = track.byteRange.includes("-") ? track.byteRange.split("-")[1] : track.byteRange.includes("@") ? track.byteRange.split("@")[0] : "";
678
+ const initRange = +initByteRange - 1;
679
+ firstSegment = {
680
+ $: { indexRange: `${initByteRange}-${+(track.segments[0].byteRange.includes("-") ? track.segments[0].byteRange.split("-")[1] : track.segments[0].byteRange.includes("@") ? track.segments[0].byteRange.split("@")[1] : "") - 1}` },
681
+ Initialization: [{ $: { range: `0-${initRange}` } }]
682
+ };
683
+ if (firstSegment && track.type === "audio") {
684
+ const audioTrack = track;
685
+ firstSegment.$.timescale = audioTrack.sampleRate.toString() ?? "";
686
+ }
687
+ if (firstSegment) segments.push(firstSegment);
688
+ } else track.segments.forEach((segment) => {
689
+ let newSegment;
690
+ if (segment.byteRange) {
691
+ const initRange = +segment.byteRange.split("-")[0] - 1;
692
+ newSegment = {
693
+ $: { indexRange: segment.byteRange },
694
+ Initialization: [{ $: { range: `0-${initRange}` } }]
695
+ };
696
+ }
697
+ if (newSegment && track.type === "audio") {
698
+ const audioTrack = track;
699
+ newSegment.$.timescale = audioTrack.sampleRate.toString() ?? "";
700
+ }
701
+ if (newSegment) segments.push(newSegment);
702
+ });
703
+ return segments;
704
+ }
705
+
706
+ //#endregion
707
+ //#region src/mapper/dash/mapHamToDash/trackToSegmentList.ts
708
+ function trackToSegmentList(track) {
709
+ const segmentList = [];
710
+ const segmentURLs = [];
711
+ track.segments.forEach((segment) => {
712
+ segmentURLs.push({ $: { media: segment.url } });
713
+ });
714
+ if (!track.segments.at(0)?.byteRange) {
715
+ const timescale = getTimescale(track);
716
+ segmentList.push({
717
+ $: {
718
+ duration: (track.duration * timescale / segmentURLs.length).toString(),
719
+ timescale: timescale.toString()
720
+ },
721
+ Initialization: [{ $: { sourceURL: track.urlInitialization } }],
722
+ SegmentURL: segmentURLs
723
+ });
724
+ }
725
+ return segmentList;
726
+ }
727
+
728
+ //#endregion
729
+ //#region src/mapper/dash/mapHamToDash/utils/getFrameRate.ts
730
+ /**
731
+ * @internal
732
+ *
733
+ * Get the framerate from a track.
734
+ *
735
+ * If frameRate numerator is not present, it uses 30 as default.
736
+ *
737
+ * @param track - to get the framerate from
738
+ * @returns frame rate as a string formatted as `numerator/denominator`
739
+ */
740
+ function getFrameRate$1(track) {
741
+ let frameRate = void 0;
742
+ if (track?.type === "video") {
743
+ const videoTrack = track;
744
+ frameRate = `${videoTrack.frameRate.frameRateNumerator ?? FRAME_RATE_NUMERATOR_30}`;
745
+ frameRate = videoTrack.frameRate.frameRateDenominator !== ZERO ? `${frameRate}/${videoTrack.frameRate.frameRateDenominator}` : frameRate;
746
+ }
747
+ return frameRate;
748
+ }
749
+
750
+ //#endregion
751
+ //#region src/mapper/dash/mapHamToDash/tracksToRepresentation.ts
752
+ function tracksToRepresentation(tracks) {
753
+ return tracks.map((track) => {
754
+ const representation = {
755
+ $: {
756
+ id: track.id,
757
+ bandwidth: track.bandwidth.toString()
758
+ },
759
+ SegmentBase: trackToSegmentBase(track),
760
+ SegmentList: trackToSegmentList(track)
761
+ };
762
+ representation.$.mimeType = `${track.type}/mp4`;
763
+ if (track.type === "video") {
764
+ const videoTrack = track;
765
+ representation.$ = {
766
+ ...representation.$,
767
+ frameRate: getFrameRate$1(track),
768
+ width: videoTrack.width.toString(),
769
+ height: videoTrack.height.toString(),
770
+ codecs: videoTrack.codec
771
+ };
772
+ if (videoTrack.scanType) representation.$.scanType = videoTrack.scanType;
773
+ }
774
+ if (track.type === "audio") {
775
+ const audioTrack = track;
776
+ representation.$ = {
777
+ ...representation.$,
778
+ audioSamplingRate: audioTrack.sampleRate.toString(),
779
+ codecs: audioTrack.codec
780
+ };
781
+ representation.AudioChannelConfiguration = [{ $: {
782
+ schemeIdUri: "urn:mpeg:dash:23003:3:audio_channel_configuration:2011",
783
+ value: audioTrack.channels.toString() ?? ""
784
+ } }];
785
+ }
786
+ if (track.segments[0]?.byteRange) representation.BaseURL = [track.segments[0].url];
787
+ return representation;
788
+ });
789
+ }
790
+
791
+ //#endregion
792
+ //#region src/mapper/dash/mapHamToDash/selectionSetsToAdaptationSet.ts
793
+ function selectionSetsToAdaptationSet(selectionsSets) {
794
+ return selectionsSets.flatMap((selectionSet) => {
795
+ return selectionSet.switchingSets.map((switchingSet) => {
796
+ const track = switchingSet.tracks[0];
797
+ return {
798
+ $: {
799
+ id: switchingSet.id,
800
+ group: selectionSet.id,
801
+ contentType: track?.type,
802
+ mimeType: `${track?.type}/mp4`,
803
+ frameRate: getFrameRate$1(track),
804
+ lang: track?.language,
805
+ codecs: track?.codec
806
+ },
807
+ Representation: tracksToRepresentation(switchingSet.tracks)
808
+ };
809
+ });
810
+ });
811
+ }
812
+
813
+ //#endregion
814
+ //#region src/utils/dash/numberToIso8601Duration.ts
815
+ /**
816
+ * @internal
817
+ */
818
+ function numberToIso8601Duration(duration) {
819
+ const hours = Math.floor(duration / 3600);
820
+ const minutes = Math.floor(duration % 3600 / 60);
821
+ const seconds = duration % 60;
822
+ if (hours > 0) return `PT${hours}H${minutes}M${seconds}S`;
823
+ else if (minutes > 0) return `PT${minutes}M${seconds}S`;
824
+ return `PT${seconds}S`;
825
+ }
826
+
827
+ //#endregion
828
+ //#region src/mapper/dash/mapHamToDash/presentationsToPeriods.ts
829
+ function presentationsToPeriods(presentations) {
830
+ return presentations.map((presentation) => {
831
+ return {
832
+ $: {
833
+ duration: numberToIso8601Duration(presentation.selectionSets[0].switchingSets[0].tracks[0].duration),
834
+ id: presentation.id,
835
+ start: "PT0S"
836
+ },
837
+ AdaptationSet: selectionSetsToAdaptationSet(presentation.selectionSets)
838
+ };
839
+ });
840
+ }
841
+
842
+ //#endregion
843
+ //#region src/utils/dash/serializeDashManifest.ts
844
+ let xmlSerializer;
845
+ /**
846
+ * @internal
847
+ */
848
+ function setDashSerializer(serializer) {
849
+ xmlSerializer = serializer;
850
+ }
851
+ /**
852
+ * @internal
853
+ */
854
+ function getDashSerializer() {
855
+ return xmlSerializer;
856
+ }
857
+ /**
858
+ * @internal
859
+ */
860
+ function serializeDashManifest(json) {
861
+ return xmlSerializer(json);
862
+ }
863
+
864
+ //#endregion
865
+ //#region src/mapper/dash/mapHamToDash/mapHamToDash.ts
866
+ function mapHamToDash(hamManifests) {
867
+ const periods = presentationsToPeriods(hamManifests);
868
+ return serializeDashManifest({ MPD: {
869
+ $: {
870
+ mediaPresentationDuration: periods[0].$.duration,
871
+ type: "static"
872
+ },
873
+ Period: periods
874
+ } });
875
+ }
876
+
877
+ //#endregion
878
+ //#region src/utils/dash/parseDashManifest.ts
879
+ let dashParser;
880
+ /**
881
+ * @internal
882
+ */
883
+ function setDashParser(parser) {
884
+ dashParser = parser;
885
+ }
886
+ /**
887
+ * @internal
888
+ */
889
+ function getDashParser() {
890
+ return dashParser;
891
+ }
892
+ /**
893
+ * @internal
894
+ * Parse XML to Json
895
+ *
896
+ * @param raw - Raw string containing the xml from the Dash Manifest
897
+ * @returns json with the Dash Manifest structure
898
+ */
899
+ function parseDashManifest(raw) {
900
+ return dashParser(raw);
901
+ }
902
+
903
+ //#endregion
904
+ //#region src/utils/manifest/addMetadataToDash.ts
905
+ function addMetadataToDash(dashManifest, manifest) {
906
+ if (!manifest.metadata) manifest.metadata = /* @__PURE__ */ new Map();
907
+ if (dashManifest.MPD.$ && dashManifest.MPD.$.profiles) manifest.metadata.set("profiles", dashManifest.MPD.$.profiles);
908
+ if (dashManifest.MPD.$ && dashManifest.MPD.$.type) manifest.metadata.set("type", dashManifest.MPD.$.type);
909
+ return manifest;
910
+ }
911
+
912
+ //#endregion
913
+ //#region src/utils/manifest/getMetadata.ts
914
+ function getMetadata(manifest) {
915
+ const metadata = manifest?.metadata;
916
+ return JSON.parse(JSON.stringify(metadata));
917
+ }
918
+
919
+ //#endregion
920
+ //#region src/mapper/dash/DashMapper.ts
921
+ var DashMapper = class {
922
+ getManifestMetadata() {
923
+ return getMetadata(this.manifest);
924
+ }
925
+ toHam(manifest) {
926
+ const dashManifest = parseDashManifest(manifest.manifest);
927
+ if (!dashManifest) return [];
928
+ addMetadataToDash(dashManifest, manifest);
929
+ return mapDashToHam(dashManifest);
930
+ }
931
+ toManifest(presentation) {
932
+ return {
933
+ manifest: mapHamToDash(presentation),
934
+ ancillaryManifests: [],
935
+ type: "dash"
936
+ };
937
+ }
938
+ };
939
+
940
+ //#endregion
941
+ //#region src/mapper/MapperContext.ts
942
+ var MapperContext = class MapperContext {
943
+ static getInstance() {
944
+ if (!MapperContext.instance) MapperContext.instance = new MapperContext();
945
+ return MapperContext.instance;
946
+ }
947
+ setStrategy(strategy) {
948
+ this.strategy = strategy;
949
+ }
950
+ getHamFormat(manifest) {
951
+ return this.strategy.toHam(manifest);
952
+ }
953
+ getManifestFormat(presentation) {
954
+ return this.strategy.toManifest(presentation);
955
+ }
956
+ getManifestMetadata() {
957
+ return this.strategy.getManifestMetadata();
958
+ }
959
+ };
960
+
961
+ //#endregion
962
+ //#region src/services/converters/dashToHam.ts
963
+ /**
964
+ * Convert dash manifest into a ham object.
965
+ *
966
+ * @example
967
+ * Example on how to import the cmaf module and convert the dash `manifest`
968
+ * into the ham manifest.
969
+ * ```ts
970
+ * import cmaf from '@svta/common-media-library/cmaf-ham';
971
+ *
972
+ * const manifest = cmaf.dashToHam(dashManifest);
973
+ * ```
974
+ *
975
+ * @param manifest - String of the XML Dash manifest
976
+ * @returns List of presentations from ham
977
+ *
978
+ * @alpha
979
+ */
980
+ function dashToHam(manifest) {
981
+ const mapperContext = MapperContext.getInstance();
982
+ mapperContext.setStrategy(new DashMapper());
983
+ return mapperContext.getHamFormat({
984
+ manifest,
985
+ type: "dash"
986
+ });
987
+ }
988
+
989
+ //#endregion
990
+ //#region src/services/converters/hamToDash.ts
991
+ /**
992
+ * Convert HAM object into Dash Manifest.
993
+ *
994
+ * @example
995
+ * Example on how to import the cmaf module and convert the ham `presentations`
996
+ * array into the dash manifest.
997
+ * ```ts
998
+ * import cmaf from '@svta/common-media-library/cmaf-ham';
999
+ *
1000
+ * const manifest = cmaf.hamToDash(presentations);
1001
+ * ```
1002
+ *
1003
+ * @param presentation - List of presentations from ham
1004
+ * @returns Manifest object containing the Dash manifest as string
1005
+ *
1006
+ * @alpha
1007
+ */
1008
+ function hamToDash(presentation) {
1009
+ const mapperContext = MapperContext.getInstance();
1010
+ mapperContext.setStrategy(new DashMapper());
1011
+ return mapperContext.getManifestFormat(presentation);
1012
+ }
1013
+
1014
+ //#endregion
1015
+ //#region src/mapper/hls/mapHamToHls/generateManifestPlaylistPiece.ts
1016
+ function generateManifestPlaylistPiece(track) {
1017
+ const mediaSequence = 0;
1018
+ const trackFileName = track.fileName ?? `${track.id}.m3u8`;
1019
+ let mainRef = "";
1020
+ let playlist = `#EXTM3U\n#EXT-X-TARGETDURATION:${track.duration / track.segments.length}\n#EXT-X-PLAYLIST-TYPE:VOD\n#EXT-X-MEDIA-SEQUENCE:${mediaSequence}\n`;
1021
+ if (track.type.toLowerCase() === "video") {
1022
+ const videoTrack = track;
1023
+ mainRef += `#EXT-X-STREAM-INF:BANDWIDTH=${videoTrack.bandwidth},CODECS="${videoTrack.codec}",RESOLUTION=${videoTrack.width}x${videoTrack.height}\n${trackFileName}\n`;
1024
+ playlist += getPlaylistData(videoTrack);
1025
+ } else if (track.type.toLowerCase() === "audio") {
1026
+ const audioTrack = track;
1027
+ mainRef += `#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="${audioTrack.id}",LANGUAGE="${audioTrack.language}",NAME="${audioTrack.id}",URI="${trackFileName}"\n`;
1028
+ playlist += getPlaylistData(audioTrack);
1029
+ } else if (track.type.toLowerCase() === "text") {
1030
+ const textTrack = track;
1031
+ mainRef += `#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="${textTrack.id}",NAME="${textTrack.id}",LANGUAGE="${textTrack.language}",URI="${trackFileName}"\n`;
1032
+ }
1033
+ playlist += `${getSegments(track.segments)}#EXT-X-ENDLIST`;
1034
+ return {
1035
+ mainRef,
1036
+ playlist
1037
+ };
1038
+ }
1039
+
1040
+ //#endregion
1041
+ //#region src/mapper/hls/mapHamToHls/mapHamToHls.ts
1042
+ function mapHamToHls(presentations) {
1043
+ let mainManifest = `#EXTM3U\n#EXT-X-VERSION:7\n\n`;
1044
+ const playlists = [];
1045
+ presentations.map((presentation) => {
1046
+ presentation.selectionSets.map((selectionSet) => {
1047
+ selectionSet.switchingSets.map((switchingSet) => {
1048
+ switchingSet.tracks.map((track) => {
1049
+ const { mainRef, playlist } = generateManifestPlaylistPiece(track);
1050
+ mainManifest += mainRef;
1051
+ const manifestFileName = track.fileName ?? `${track.id}.m3u8`;
1052
+ playlists.push({
1053
+ manifest: playlist,
1054
+ type: "hls",
1055
+ fileName: manifestFileName
1056
+ });
1057
+ });
1058
+ });
1059
+ });
1060
+ });
1061
+ return {
1062
+ manifest: mainManifest,
1063
+ ancillaryManifests: playlists,
1064
+ type: "hls"
1065
+ };
1066
+ }
1067
+
1068
+ //#endregion
1069
+ //#region src/utils/hls/parseHlsManifest.ts
1070
+ let hlsParser;
1071
+ /**
1072
+ * @internal
1073
+ */
1074
+ function setHlsParser(parser) {
1075
+ hlsParser = parser;
1076
+ }
1077
+ /**
1078
+ * @internal
1079
+ */
1080
+ function getHlsParser() {
1081
+ return hlsParser;
1082
+ }
1083
+ /**
1084
+ * @internal
1085
+ */
1086
+ function parseHlsManifest(text) {
1087
+ if (!text) {
1088
+ console.error("Can't parse empty HLS Manifest");
1089
+ return {};
1090
+ }
1091
+ return hlsParser(text);
1092
+ }
1093
+
1094
+ //#endregion
1095
+ //#region src/mapper/hls/mapHlsToHam/audioGroupsToSwitchingSets.ts
1096
+ /**
1097
+ * @internal
1098
+ *
1099
+ * This function is used to convert audio groups to switching sets.
1100
+ *
1101
+ *
1102
+ * @param mediaGroupsAudio - Any
1103
+ * @param manifestPlaylists - Array of Manifest
1104
+ * @returns Array of switchingSet
1105
+ *
1106
+ * @alpha
1107
+ */
1108
+ function audioGroupsToSwitchingSets(mediaGroupsAudio, manifestPlaylists) {
1109
+ const audioSwitchingSets = [];
1110
+ const audioTracks = [];
1111
+ for (const audioEncodings in mediaGroupsAudio) {
1112
+ const encodings = mediaGroupsAudio[audioEncodings];
1113
+ for (const audio in encodings) {
1114
+ const { language, uri } = encodings[audio];
1115
+ const audioParsed = parseHlsManifest(manifestPlaylists.shift()?.manifest);
1116
+ const map = audioParsed?.segments[0]?.map;
1117
+ const segments = formatSegments(audioParsed?.segments);
1118
+ const byteRange = decodeByteRange(map?.byterange);
1119
+ audioTracks.push({
1120
+ id: audio,
1121
+ type: "audio",
1122
+ fileName: uri,
1123
+ codec: getHlsCodec("audio"),
1124
+ duration: getDuration(audioParsed, segments),
1125
+ language,
1126
+ bandwidth: 0,
1127
+ segments,
1128
+ sampleRate: 0,
1129
+ channels: 2,
1130
+ ...byteRange && { byteRange },
1131
+ ...map?.uri && { urlInitialization: map?.uri }
1132
+ });
1133
+ }
1134
+ }
1135
+ audioSwitchingSets.push({
1136
+ id: "audio",
1137
+ tracks: audioTracks
1138
+ });
1139
+ return audioSwitchingSets;
1140
+ }
1141
+
1142
+ //#endregion
1143
+ //#region src/mapper/hls/mapHlsToHam/subtitleGroupsToSwitchingSets.ts
1144
+ function subtitleGroupsToSwitchingSets(mediaGroupsSubtitles, manifestPlaylists) {
1145
+ const subtitleSwitchingSets = [];
1146
+ const textTracks = [];
1147
+ for (const subtitleEncodings in mediaGroupsSubtitles) {
1148
+ const encodings = mediaGroupsSubtitles[subtitleEncodings];
1149
+ for (const subtitle in encodings) {
1150
+ const { language, uri } = encodings[subtitle];
1151
+ const subtitleParsed = parseHlsManifest(manifestPlaylists.shift()?.manifest);
1152
+ const segments = formatSegments(subtitleParsed?.segments);
1153
+ textTracks.push({
1154
+ id: subtitle,
1155
+ type: "text",
1156
+ fileName: uri,
1157
+ codec: getHlsCodec("text"),
1158
+ duration: getDuration(subtitleParsed, segments),
1159
+ language,
1160
+ bandwidth: 0,
1161
+ segments
1162
+ });
1163
+ }
1164
+ }
1165
+ subtitleSwitchingSets.push({
1166
+ id: "text",
1167
+ tracks: textTracks
1168
+ });
1169
+ return subtitleSwitchingSets;
1170
+ }
1171
+
1172
+ //#endregion
1173
+ //#region src/mapper/hls/mapHlsToHam/videoPlaylistsToSwitchingSets.ts
1174
+ function videoPlaylistsToSwitchingSets(playlists, manifestPlaylists) {
1175
+ const switchingSetVideos = [];
1176
+ const videoTracks = [];
1177
+ let videoTrackId = 0;
1178
+ playlists.map((playlist) => {
1179
+ const parsedHlsManifest = parseHlsManifest(manifestPlaylists.shift()?.manifest);
1180
+ const segments = formatSegments(parsedHlsManifest?.segments);
1181
+ const { LANGUAGE, CODECS, BANDWIDTH } = playlist.attributes;
1182
+ const map = parsedHlsManifest?.segments?.at(0)?.map;
1183
+ const byteRange = decodeByteRange(map?.byterange);
1184
+ videoTracks.push({
1185
+ id: `video-${videoTrackId++}`,
1186
+ type: "video",
1187
+ fileName: playlist.uri,
1188
+ codec: getHlsCodec("video", CODECS),
1189
+ duration: getDuration(parsedHlsManifest, segments),
1190
+ language: LANGUAGE ?? "und",
1191
+ bandwidth: BANDWIDTH,
1192
+ segments,
1193
+ width: playlist.attributes.RESOLUTION.width,
1194
+ height: playlist.attributes.RESOLUTION.height,
1195
+ frameRate: {
1196
+ frameRateNumerator: playlist.attributes["FRAME-RATE"] ?? FRAME_RATE_NUMERATOR_30,
1197
+ frameRateDenominator: ZERO
1198
+ },
1199
+ par: "",
1200
+ sar: "",
1201
+ scanType: "",
1202
+ ...byteRange && { byteRange },
1203
+ ...map?.uri && { urlInitialization: map?.uri }
1204
+ });
1205
+ });
1206
+ switchingSetVideos.push({
1207
+ id: `video`,
1208
+ tracks: videoTracks
1209
+ });
1210
+ return switchingSetVideos;
1211
+ }
1212
+
1213
+ //#endregion
1214
+ //#region src/utils/manifest/addMetadataToHls.ts
1215
+ function addMetadataToHls(manifest, manifestParsed) {
1216
+ if (!manifest.metadata) manifest.metadata = /* @__PURE__ */ new Map();
1217
+ if (!manifestParsed.version) manifest.metadata.set("version", manifestParsed.version);
1218
+ if (!manifestParsed.mediaSequence) manifest.metadata.set("mediaSequence", manifestParsed.mediaSequence);
1219
+ return manifest;
1220
+ }
1221
+
1222
+ //#endregion
1223
+ //#region src/mapper/hls/mapHlsToHam/mapHlsToHam.ts
1224
+ function mapHlsToHam(manifest) {
1225
+ const mainManifestParsed = parseHlsManifest(manifest.manifest);
1226
+ const manifestHls = addMetadataToHls(manifest, mainManifestParsed);
1227
+ const selectionSets = [];
1228
+ const manifestPlaylists = manifestHls.ancillaryManifests ? [...manifestHls.ancillaryManifests] : [];
1229
+ const audioSwitchingSets = audioGroupsToSwitchingSets(mainManifestParsed.mediaGroups?.AUDIO, manifestPlaylists);
1230
+ const subtitleSwitchingSets = subtitleGroupsToSwitchingSets(mainManifestParsed.mediaGroups?.SUBTITLES, manifestPlaylists);
1231
+ const videoSwitchingSets = videoPlaylistsToSwitchingSets(mainManifestParsed.playlists, manifestPlaylists);
1232
+ let selectionSetId = 0;
1233
+ if (audioSwitchingSets.length > 0) selectionSets.push({
1234
+ id: (selectionSetId++).toString(),
1235
+ switchingSets: audioSwitchingSets
1236
+ });
1237
+ if (subtitleSwitchingSets.length > 0) selectionSets.push({
1238
+ id: (selectionSetId++).toString(),
1239
+ switchingSets: subtitleSwitchingSets
1240
+ });
1241
+ if (videoSwitchingSets.length > 0) selectionSets.push({
1242
+ id: (selectionSetId++).toString(),
1243
+ switchingSets: videoSwitchingSets
1244
+ });
1245
+ let presentationId = 0;
1246
+ return [{
1247
+ id: (presentationId++).toString(),
1248
+ selectionSets
1249
+ }];
1250
+ }
1251
+
1252
+ //#endregion
1253
+ //#region src/mapper/hls/HlsMapper.ts
1254
+ var HlsMapper = class {
1255
+ getManifestMetadata() {
1256
+ return getMetadata(this.manifest);
1257
+ }
1258
+ toHam(manifest) {
1259
+ const presentations = mapHlsToHam(manifest);
1260
+ this.manifest = manifest;
1261
+ return presentations;
1262
+ }
1263
+ toManifest(presentation) {
1264
+ return mapHamToHls(presentation);
1265
+ }
1266
+ };
1267
+
1268
+ //#endregion
1269
+ //#region src/services/converters/hamToHls.ts
1270
+ /**
1271
+ * Convert ham object into a hls manifest.
1272
+ *
1273
+ * @example
1274
+ * Example on how to import the cmaf module and convert the ham `presentations`
1275
+ * array into the hls manifest.
1276
+ * ```ts
1277
+ * import cmaf from '@svta/common-media-library/cmaf-ham';
1278
+ *
1279
+ * const manifest = cmaf.hamToHls(presentations);
1280
+ * ```
1281
+ *
1282
+ * @param presentation - List of presentations from ham
1283
+ * @returns Manifest object containing the Hls manifest as string and its playlists
1284
+ *
1285
+ * @alpha
1286
+ */
1287
+ function hamToHls(presentation) {
1288
+ const mapperContext = MapperContext.getInstance();
1289
+ mapperContext.setStrategy(new HlsMapper());
1290
+ return mapperContext.getManifestFormat(presentation);
1291
+ }
1292
+
1293
+ //#endregion
1294
+ //#region src/services/converters/hlsToHam.ts
1295
+ /**
1296
+ * Convert hls manifest into a ham object.
1297
+ *
1298
+ * @example
1299
+ * Example on how to import the cmaf module and convert the hls `manifest` and
1300
+ * `ancillaryManifests` array into the ham manifest.
1301
+ * ```ts
1302
+ * import cmaf from '@svta/common-media-library/cmaf-ham';
1303
+ *
1304
+ * const manifest = cmaf.hlsToHam(hlsManifest);
1305
+ * ```
1306
+ *
1307
+ * @param manifest - String of the Main manifest
1308
+ * @param ancillaryManifests - Ancillary Manifests . Must be in order, first audio, subtitle and video
1309
+ * @returns List of presentations from ham
1310
+ *
1311
+ * @alpha
1312
+ */
1313
+ function hlsToHam(manifest, ancillaryManifests) {
1314
+ const mapperContext = MapperContext.getInstance();
1315
+ mapperContext.setStrategy(new HlsMapper());
1316
+ return mapperContext.getHamFormat({
1317
+ manifest,
1318
+ ancillaryManifests: ancillaryManifests.map((ancillaryManifest) => ({
1319
+ manifest: ancillaryManifest,
1320
+ type: "hls"
1321
+ })),
1322
+ type: "hls"
1323
+ });
1324
+ }
1325
+
1326
+ //#endregion
1327
+ //#region src/services/getters/getTracksFromSwitchingSet.ts
1328
+ /**
1329
+ * Get a list of Tracks contained on a SwitchingSet
1330
+ *
1331
+ * @param switchingSet - SwitchingSet object from HAM
1332
+ * @param predicate - Filtering function
1333
+ * @returns Track[]
1334
+ *
1335
+ * @alpha
1336
+ */
1337
+ function getTracksFromSwitchingSet(switchingSet, predicate) {
1338
+ const tracks = switchingSet.tracks;
1339
+ return predicate ? tracks.filter(predicate) : tracks;
1340
+ }
1341
+
1342
+ //#endregion
1343
+ //#region src/services/getters/getTracksFromSelectionSet.ts
1344
+ /**
1345
+ * Get a list of Tracks contained on a SelectionSet
1346
+ *
1347
+ * @param selectionSet - SelectionSet object from HAM
1348
+ * @param predicate - Filtering function
1349
+ * @returns Track[]
1350
+ *
1351
+ * @alpha
1352
+ */
1353
+ function getTracksFromSelectionSet(selectionSet, predicate) {
1354
+ const tracks = selectionSet.switchingSets.flatMap((switchingSet) => getTracksFromSwitchingSet(switchingSet));
1355
+ return predicate ? tracks.filter(predicate) : tracks;
1356
+ }
1357
+
1358
+ //#endregion
1359
+ //#region src/services/getters/getTracksFromPresentation.ts
1360
+ /**
1361
+ * Get a list of Tracks contained on a Presentation
1362
+ *
1363
+ * @param presentation - Presentation object from HAM
1364
+ * @param predicate - Filtering function
1365
+ * @returns Track[]
1366
+ *
1367
+ * @alpha
1368
+ */
1369
+ function getTracksFromPresentation(presentation, predicate) {
1370
+ const tracks = presentation.selectionSets.flatMap((selectionSet) => getTracksFromSelectionSet(selectionSet));
1371
+ return predicate ? tracks.filter(predicate) : tracks;
1372
+ }
1373
+
1374
+ //#endregion
1375
+ //#region src/services/validators/validateSegment.ts
1376
+ /**
1377
+ * Validate a segment.
1378
+ *
1379
+ * Validations:
1380
+ * - segment has duration
1381
+ * - segment has url
1382
+ *
1383
+ * @param segment - Segment from cmaf ham model
1384
+ * @param trackId - Optional: parent track id
1385
+ * @param prevValidation - Optional: validation object from parent previous validate method call
1386
+ * @returns Validation
1387
+ *
1388
+ * @alpha
1389
+ */
1390
+ function validateSegment(segment, trackId, prevValidation) {
1391
+ const validation = prevValidation ?? {
1392
+ status: true,
1393
+ errorMessages: []
1394
+ };
1395
+ const moreInformation = trackId ? ` in the track with id = ${trackId}` : ".";
1396
+ if (!segment.duration) {
1397
+ validation.status = false;
1398
+ validation.errorMessages.push(`Segment duration is undefined${moreInformation}`);
1399
+ }
1400
+ if (!segment.url) {
1401
+ validation.status = false;
1402
+ validation.errorMessages.push(`Segment url is undefined${moreInformation}`);
1403
+ }
1404
+ return validation;
1405
+ }
1406
+
1407
+ //#endregion
1408
+ //#region src/services/validators/validateSegments.ts
1409
+ /**
1410
+ * Validate a list of segments.
1411
+ *
1412
+ * @example
1413
+ * ```ts
1414
+ * import cmaf, { Segment } from '@svta/common-media-library/cmaf-ham';
1415
+ * ...
1416
+ *
1417
+ * // const segments: Segment[] = ...;
1418
+ *
1419
+ * const validation = cmaf.validateSegments(segments);
1420
+ * ```
1421
+ *
1422
+ * Example output: `{ status: true|false, errorMessages: [...] }`
1423
+ *
1424
+ * @param segments - List of Segment from cmaf ham model
1425
+ * @param trackId - Optional: parent track id
1426
+ * @param prevValidation - Optional: validation object from parent previous validate method call
1427
+ * @returns Validation
1428
+ *
1429
+ * @alpha
1430
+ *
1431
+ */
1432
+ function validateSegments(segments, trackId, prevValidation) {
1433
+ const validation = prevValidation ?? {
1434
+ status: true,
1435
+ errorMessages: []
1436
+ };
1437
+ segments.forEach((segment) => {
1438
+ validateSegment(segment, trackId, validation);
1439
+ });
1440
+ return validation;
1441
+ }
1442
+
1443
+ //#endregion
1444
+ //#region src/services/validators/validateTrack.ts
1445
+ /**
1446
+ * Validate a track.
1447
+ * It validates in cascade, calling each child validation method.
1448
+ *
1449
+ * Validations:
1450
+ * - track has id
1451
+ * - Invokes specific audio, video and text validations
1452
+ *
1453
+ * @example
1454
+ * ```ts
1455
+ * import cmaf, { Track } from '@svta/common-media-library/cmaf-ham';
1456
+ * ...
1457
+ *
1458
+ * // const track: Track = ...;
1459
+ *
1460
+ * const validation = cmaf.validateTrack(track);
1461
+ * ```
1462
+ *
1463
+ * Example output: `{ status: true|false, errorMessages: [...] }`
1464
+ *
1465
+ * @param track - Track from cmaf ham model
1466
+ * @param switchingSetId - Optional: parent switching set id
1467
+ * @param prevValidation - Optional: validation object from parent previous validate method call
1468
+ * @returns Validation
1469
+ *
1470
+ * @alpha
1471
+ *
1472
+ */
1473
+ function validateTrack(track, switchingSetId, prevValidation) {
1474
+ const validation = prevValidation ?? {
1475
+ status: true,
1476
+ errorMessages: []
1477
+ };
1478
+ const moreInformation = switchingSetId ? ` in the switching set with id = ${switchingSetId}` : ".";
1479
+ if (!track.id) {
1480
+ validation.status = false;
1481
+ validation.errorMessages.push(`Track id is undefined${moreInformation}`);
1482
+ }
1483
+ switch (track.type) {
1484
+ case "video":
1485
+ _validateVideoTrack(track, switchingSetId, validation);
1486
+ break;
1487
+ case "audio":
1488
+ _validateAudioTrack(track, switchingSetId, validation);
1489
+ break;
1490
+ case "text":
1491
+ _validateTextTrack(track, switchingSetId, validation);
1492
+ break;
1493
+ }
1494
+ validateSegments(track.segments, track.id, validation);
1495
+ return validation;
1496
+ }
1497
+ /**
1498
+ * @internal
1499
+ *
1500
+ * Validate video Track
1501
+ *
1502
+ * Validations:
1503
+ * - track has codec
1504
+ *
1505
+ * @param videoTrack - Video track to validate
1506
+ * @param switchingSetId - Optional: id from the switching set containing the track (Only used for logs)
1507
+ * @param prevValidation - Optional: validation object from parent previous validate method call
1508
+ * @returns Validation object
1509
+ * @see Validation
1510
+ */
1511
+ function _validateVideoTrack(videoTrack, switchingSetId, prevValidation) {
1512
+ const validation = prevValidation ?? {
1513
+ status: true,
1514
+ errorMessages: []
1515
+ };
1516
+ const moreInformation = switchingSetId ? ` in the switching set with id = ${switchingSetId}` : ".";
1517
+ if (!videoTrack.codec) {
1518
+ validation.status = false;
1519
+ validation.errorMessages.push(`VideoTrack with id: ${videoTrack.id} does not have codec${moreInformation}`);
1520
+ }
1521
+ return validation;
1522
+ }
1523
+ /**
1524
+ * @internal
1525
+ *
1526
+ * Validate Audio Track
1527
+ *
1528
+ * Validations:
1529
+ * - track has codec
1530
+ *
1531
+ * @param audioTrack - Audio track to validate
1532
+ * @param switchingSetId - Optional: id from the switching set containing the track (Only used for logs)
1533
+ * @param prevValidation - Optional: validation object from parent previous validate method call
1534
+ * @returns Validation object
1535
+ * @see Validation
1536
+ */
1537
+ function _validateAudioTrack(audioTrack, switchingSetId, prevValidation) {
1538
+ const validation = prevValidation ?? {
1539
+ status: true,
1540
+ errorMessages: []
1541
+ };
1542
+ const moreInformation = switchingSetId ? ` in the switching set with id = ${switchingSetId}` : ".";
1543
+ if (!audioTrack.codec) {
1544
+ validation.status = false;
1545
+ validation.errorMessages.push(`AudioTrack with id: ${audioTrack.id} does not have codec${moreInformation}`);
1546
+ }
1547
+ return validation;
1548
+ }
1549
+ /**
1550
+ * @internal
1551
+ *
1552
+ * Validate Text Track
1553
+ *
1554
+ * Validations:
1555
+ * - track has language
1556
+ *
1557
+ * @param textTrack - Text track to validate
1558
+ * @param switchingSetId - Optional: id from the switching set containing the track (Only used for logs)
1559
+ * @param prevValidation - Optional: validation object from parent previous validate method call
1560
+ * @returns Validation object
1561
+ * @see Validation
1562
+ */
1563
+ function _validateTextTrack(textTrack, switchingSetId, prevValidation) {
1564
+ const validation = prevValidation ?? {
1565
+ status: true,
1566
+ errorMessages: []
1567
+ };
1568
+ const moreInformation = switchingSetId ? ` in the switching set with id = ${switchingSetId}` : ".";
1569
+ if (!textTrack.language) {
1570
+ validation.status = false;
1571
+ validation.errorMessages.push(`TextTrack with id: ${textTrack.id} does not have codec${moreInformation}`);
1572
+ }
1573
+ return validation;
1574
+ }
1575
+
1576
+ //#endregion
1577
+ //#region src/services/validators/validateTracks.ts
1578
+ /**
1579
+ * Validate a list of tracks.
1580
+ * It validates in cascade, calling each child validation method.
1581
+ *
1582
+ * @example
1583
+ * ```ts
1584
+ * import cmaf, { Track } from '@svta/common-media-library/cmaf-ham';
1585
+ * ...
1586
+ *
1587
+ * // const tracks: Track[] = ...;
1588
+ *
1589
+ * const validation = cmaf.validateTracks(tracks);
1590
+ * ```
1591
+ *
1592
+ * Example output: `{ status: true|false, errorMessages: [...] }`
1593
+ *
1594
+ * @param tracks - List of Track from cmaf ham model
1595
+ * @param switchingSetId - Optional: parent switching set id
1596
+ * @param prevValidation - Optional: validation object from parent previous validate method call
1597
+ * @returns Validation
1598
+ *
1599
+ * @alpha
1600
+ *
1601
+ */
1602
+ function validateTracks(tracks, switchingSetId, prevValidation) {
1603
+ const validation = prevValidation ?? {
1604
+ status: true,
1605
+ errorMessages: []
1606
+ };
1607
+ const moreInformation = switchingSetId ? ` in the switching set with id = ${switchingSetId}` : ".";
1608
+ let tracksDuration;
1609
+ tracks.forEach((track) => {
1610
+ if (!tracksDuration) tracksDuration = track.duration;
1611
+ if (tracksDuration !== track.duration) {
1612
+ validation.status = false;
1613
+ validation.errorMessages.push(`All the tracks must have the same duration${moreInformation}`);
1614
+ }
1615
+ validateTrack(track, switchingSetId, validation);
1616
+ });
1617
+ return validation;
1618
+ }
1619
+
1620
+ //#endregion
1621
+ //#region src/services/validators/validateSwitchingSet.ts
1622
+ /**
1623
+ * Validate a switching set.
1624
+ * It validates in cascade, calling each child validation method.
1625
+ *
1626
+ * Validations:
1627
+ * - SwitchingSet has id
1628
+ *
1629
+ * @example
1630
+ * ```ts
1631
+ * import cmaf, { SwitchingSet } from '@svta/common-media-library/cmaf-ham';
1632
+ * ...
1633
+ *
1634
+ * // const switchingSet: SwitchingSet = ...;
1635
+ *
1636
+ * const validation = cmaf.validateSwitchingSet(switchingSet);
1637
+ * ```
1638
+ *
1639
+ * Example output: `{ status: true|false, errorMessages: [...] }`
1640
+ *
1641
+ * @param switchingSet - SwitchingSet from cmaf ham model
1642
+ * @param selectionSetId - Optional: parent selection set id
1643
+ * @param prevValidation - Optional: validation object from parent previous validate method call
1644
+ * @returns Validation
1645
+ *
1646
+ * @alpha
1647
+ *
1648
+ */
1649
+ function validateSwitchingSet(switchingSet, selectionSetId, prevValidation) {
1650
+ const validation = prevValidation ?? {
1651
+ status: true,
1652
+ errorMessages: []
1653
+ };
1654
+ const moreInformation = selectionSetId ? ` in the selection set with id = ${selectionSetId}` : ".";
1655
+ if (!switchingSet.id) {
1656
+ validation.status = false;
1657
+ validation.errorMessages.push(`SwitchingSet id is undefined${moreInformation}`);
1658
+ }
1659
+ validateTracks(switchingSet.tracks, switchingSet.id, validation);
1660
+ return validation;
1661
+ }
1662
+
1663
+ //#endregion
1664
+ //#region src/services/validators/validateSwitchingSets.ts
1665
+ /**
1666
+ * Validate a list of switching set.
1667
+ * It validates in cascade, calling each child validation method.
1668
+ *
1669
+ * @example
1670
+ * ```ts
1671
+ * import cmaf, { SwitchingSet } from '@svta/common-media-library/cmaf-ham';
1672
+ * ...
1673
+ *
1674
+ * // const switchingSets: SwitchingSet[] = ...;
1675
+ *
1676
+ * const validation = cmaf.validateSwitchingSets(switchingSets);
1677
+ * ```
1678
+ *
1679
+ * Example output: `{ status: true|false, errorMessages: [...] }`
1680
+ *
1681
+ * @param switchingSets - List of SwitchingSets from cmaf ham model
1682
+ * @param selectionSetId - Optional: parent selection set id
1683
+ * @param prevValidation - Optional: validation object from parent previous validate method call
1684
+ * @returns Validation
1685
+ *
1686
+ * @alpha
1687
+ *
1688
+ */
1689
+ function validateSwitchingSets(switchingSets, selectionSetId, prevValidation) {
1690
+ const validation = prevValidation ?? {
1691
+ status: true,
1692
+ errorMessages: []
1693
+ };
1694
+ switchingSets.forEach((switchingSet) => {
1695
+ validateSwitchingSet(switchingSet, selectionSetId, validation);
1696
+ });
1697
+ return validation;
1698
+ }
1699
+
1700
+ //#endregion
1701
+ //#region src/services/validators/validateSelectionSet.ts
1702
+ /**
1703
+ * Validate a selection set.
1704
+ * It validates in cascade, calling each child validation method.
1705
+ *
1706
+ * Validations:
1707
+ * - SelectionSet has id
1708
+ *
1709
+ * @example
1710
+ * ```ts
1711
+ * import cmaf, { SelectionSet } from '@svta/common-media-library/cmaf-ham';
1712
+ * ...
1713
+ *
1714
+ * // const selectionSet: SelectionSet = ...;
1715
+ *
1716
+ * const validation = cmaf.validateSelectionSet(selectionSet);
1717
+ * ```
1718
+ *
1719
+ * Example output: `{ status: true|false, errorMessages: [...] }`
1720
+ *
1721
+ * @param selectionSet - SelectionSet from cmaf ham model
1722
+ * @param presentationId - Optional: parent presentation id
1723
+ * @param prevValidation - Optional: validation object from parent previous validate method call
1724
+ * @returns Validation
1725
+ *
1726
+ * @alpha
1727
+ *
1728
+ */
1729
+ function validateSelectionSet(selectionSet, presentationId, prevValidation) {
1730
+ const validation = prevValidation ?? {
1731
+ status: true,
1732
+ errorMessages: []
1733
+ };
1734
+ const moreInformation = presentationId ? ` in the presentation with id = ${presentationId}` : ".";
1735
+ if (!selectionSet.id) {
1736
+ validation.status = false;
1737
+ validation.errorMessages.push(`SelectionSet id is undefined${moreInformation}`);
1738
+ }
1739
+ validateSwitchingSets(selectionSet.switchingSets, selectionSet.id, validation);
1740
+ return validation;
1741
+ }
1742
+
1743
+ //#endregion
1744
+ //#region src/services/validators/validateSelectionSets.ts
1745
+ /**
1746
+ * Validate a list of selection set.
1747
+ * It validates in cascade, calling each child validation method.
1748
+ *
1749
+ * @example
1750
+ * ```ts
1751
+ * import cmaf, { SelectionSet } from '@svta/common-media-library/cmaf-ham';
1752
+ * ...
1753
+ *
1754
+ * // const selectionSets: SelectionSet[] = ...;
1755
+ *
1756
+ * const validation = cmaf.validateSelectionSets(selectionSets);
1757
+ * ```
1758
+ *
1759
+ * Example output: `{ status: true|false, errorMessages: [...] }`
1760
+ *
1761
+ * @param selectionSets - List of SelectionSet from cmaf ham model
1762
+ * @param presentationId - Optional: parent presentation id
1763
+ * @param prevValidation - Optional: validation object from parent previous validate method call
1764
+ * @returns Validation
1765
+ *
1766
+ * @alpha
1767
+ *
1768
+ */
1769
+ function validateSelectionSets(selectionSets, presentationId, prevValidation) {
1770
+ const validation = prevValidation ?? {
1771
+ status: true,
1772
+ errorMessages: []
1773
+ };
1774
+ selectionSets.forEach((selectionSet) => {
1775
+ validateSelectionSet(selectionSet, presentationId, validation);
1776
+ });
1777
+ return validation;
1778
+ }
1779
+
1780
+ //#endregion
1781
+ //#region src/services/validators/validatePresentation.ts
1782
+ /**
1783
+ * Validate a presentation.
1784
+ * It validates in cascade, calling each child validation method.
1785
+ *
1786
+ * Validations:
1787
+ * - Presentation has id
1788
+ *
1789
+ * @example
1790
+ * ```ts
1791
+ * import cmaf, { Presentation } from '@svta/common-media-library/cmaf-ham';
1792
+ * ...
1793
+ *
1794
+ * // const presentation: Presentation = ...;
1795
+ *
1796
+ * const validation = cmaf.validatePresentation(presentation);
1797
+ * ```
1798
+ *
1799
+ * Example output: `{ status: true|false, errorMessages: [...] }`
1800
+ *
1801
+ * @param presentation - Presentation from cmaf ham model
1802
+ * @returns Validation
1803
+ *
1804
+ * @alpha
1805
+ *
1806
+ */
1807
+ function validatePresentation(presentation) {
1808
+ const validation = {
1809
+ status: true,
1810
+ errorMessages: []
1811
+ };
1812
+ if (!presentation.id) {
1813
+ validation.status = false;
1814
+ validation.errorMessages.push("Presentation id is undefined");
1815
+ }
1816
+ validateSelectionSets(presentation.selectionSets, presentation.id, validation);
1817
+ return validation;
1818
+ }
1819
+
1820
+ //#endregion
1821
+ export { calculateDuration, dashToHam, decodeByteRange, encodeByteRange, formatSegments, getChannels, getCodec, getContentType, getDashParser, getDashSerializer, getDuration, getFrameRate, getGroup, getHlsCodec, getHlsParser, getLanguage, getNumberOfSegments, getPlaylistData, getPresentationId, getSampleRate, getSar, getSegments, getTimescale, getTrackDuration, getTracksFromPresentation, getTracksFromSelectionSet, getTracksFromSwitchingSet, getUrlFromTemplate, getUrlInitialization, hamToDash, hamToHls, hlsToHam, iso8601DurationToNumber, mapSegmentBase, mapSegmentList, mapSegmentTemplate, mapSegments, numberToIso8601Duration, parseDashManifest, parseHlsManifest, serializeDashManifest, setDashParser, setDashSerializer, setHlsParser, validatePresentation, validateSegment, validateSegments, validateSelectionSet, validateSelectionSets, validateSwitchingSet, validateSwitchingSets, validateTrack, validateTracks };
20
1822
  //# sourceMappingURL=index.js.map