toPlaylists.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { merge } from './utils/object';
  2. import { segmentsFromTemplate } from './segment/segmentTemplate';
  3. import { segmentsFromList } from './segment/segmentList';
  4. import { segmentsFromBase } from './segment/segmentBase';
  5. export const generateSegments = ({ attributes, segmentInfo }) => {
  6. let segmentAttributes;
  7. let segmentsFn;
  8. if (segmentInfo.template) {
  9. segmentsFn = segmentsFromTemplate;
  10. segmentAttributes = merge(attributes, segmentInfo.template);
  11. } else if (segmentInfo.base) {
  12. segmentsFn = segmentsFromBase;
  13. segmentAttributes = merge(attributes, segmentInfo.base);
  14. } else if (segmentInfo.list) {
  15. segmentsFn = segmentsFromList;
  16. segmentAttributes = merge(attributes, segmentInfo.list);
  17. }
  18. const segmentsInfo = {
  19. attributes
  20. };
  21. if (!segmentsFn) {
  22. return segmentsInfo;
  23. }
  24. const segments = segmentsFn(segmentAttributes, segmentInfo.segmentTimeline);
  25. // The @duration attribute will be used to determin the playlist's targetDuration which
  26. // must be in seconds. Since we've generated the segment list, we no longer need
  27. // @duration to be in @timescale units, so we can convert it here.
  28. if (segmentAttributes.duration) {
  29. const { duration, timescale = 1 } = segmentAttributes;
  30. segmentAttributes.duration = duration / timescale;
  31. } else if (segments.length) {
  32. // if there is no @duration attribute, use the largest segment duration as
  33. // as target duration
  34. segmentAttributes.duration = segments.reduce((max, segment) => {
  35. return Math.max(max, Math.ceil(segment.duration));
  36. }, 0);
  37. } else {
  38. segmentAttributes.duration = 0;
  39. }
  40. segmentsInfo.attributes = segmentAttributes;
  41. segmentsInfo.segments = segments;
  42. // This is a sidx box without actual segment information
  43. if (segmentInfo.base && segmentAttributes.indexRange) {
  44. segmentsInfo.sidx = segments[0];
  45. segmentsInfo.segments = [];
  46. }
  47. return segmentsInfo;
  48. };
  49. export const toPlaylists = (representations) => representations.map(generateSegments);