Home Reference Source

src/loader/level-details.ts

  1. import { Part } from './fragment';
  2. import type { Fragment } from './fragment';
  3. import type { AttrList } from '../utils/attr-list';
  4.  
  5. const DEFAULT_TARGET_DURATION = 10;
  6.  
  7. export class LevelDetails {
  8. public PTSKnown: boolean = false;
  9. public alignedSliding: boolean = false;
  10. public averagetargetduration?: number;
  11. public endCC: number = 0;
  12. public endSN: number = 0;
  13. public fragments: Fragment[];
  14. public fragmentHint?: Fragment;
  15. public partList: Part[] | null = null;
  16. public initSegment: Fragment | null = null;
  17. public live: boolean = true;
  18. public ageHeader: number = 0;
  19. public advancedDateTime?: number;
  20. public updated: boolean = true;
  21. public advanced: boolean = true;
  22. public availabilityDelay?: number; // Manifest reload synchronization
  23. public misses: number = 0;
  24. public needSidxRanges: boolean = false;
  25. public startCC: number = 0;
  26. public startSN: number = 0;
  27. public startTimeOffset: number | null = null;
  28. public targetduration: number = 0;
  29. public totalduration: number = 0;
  30. public type: string | null = null;
  31. public url: string;
  32. public m3u8: string = '';
  33. public version: number | null = null;
  34. public canBlockReload: boolean = false;
  35. public canSkipUntil: number = 0;
  36. public canSkipDateRanges: boolean = false;
  37. public skippedSegments: number = 0;
  38. public recentlyRemovedDateranges?: string[];
  39. public partHoldBack: number = 0;
  40. public holdBack: number = 0;
  41. public partTarget: number = 0;
  42. public preloadHint?: AttrList;
  43. public renditionReports?: AttrList[];
  44. public tuneInGoal: number = 0;
  45. public deltaUpdateFailed?: boolean;
  46.  
  47. constructor(baseUrl) {
  48. this.fragments = [];
  49. this.url = baseUrl;
  50. }
  51.  
  52. reloaded(previous: LevelDetails | undefined) {
  53. if (!previous) {
  54. this.advanced = true;
  55. this.updated = true;
  56. return;
  57. }
  58. const partSnDiff = this.lastPartSn - previous.lastPartSn;
  59. const partIndexDiff = this.lastPartIndex - previous.lastPartIndex;
  60. this.updated =
  61. this.endSN !== previous.endSN || !!partIndexDiff || !!partSnDiff;
  62. this.advanced =
  63. this.endSN > previous.endSN ||
  64. partSnDiff > 0 ||
  65. (partSnDiff === 0 && partIndexDiff > 0);
  66. if (this.updated || this.advanced) {
  67. this.misses = Math.floor(previous.misses * 0.6);
  68. } else {
  69. this.misses = previous.misses + 1;
  70. }
  71. this.availabilityDelay = previous.availabilityDelay;
  72. }
  73.  
  74. get hasProgramDateTime(): boolean {
  75. if (this.fragments.length) {
  76. return Number.isFinite(
  77. this.fragments[this.fragments.length - 1].programDateTime as number
  78. );
  79. }
  80. return false;
  81. }
  82.  
  83. get levelTargetDuration(): number {
  84. return (
  85. this.averagetargetduration ||
  86. this.targetduration ||
  87. DEFAULT_TARGET_DURATION
  88. );
  89. }
  90.  
  91. get edge(): number {
  92. return this.partEnd || this.fragmentEnd;
  93. }
  94.  
  95. get partEnd(): number {
  96. if (this.partList?.length) {
  97. return this.partList[this.partList.length - 1].end;
  98. }
  99. return this.fragmentEnd;
  100. }
  101.  
  102. get fragmentEnd(): number {
  103. if (this.fragments?.length) {
  104. return this.fragments[this.fragments.length - 1].end;
  105. }
  106. return 0;
  107. }
  108.  
  109. get age(): number {
  110. if (this.advancedDateTime) {
  111. return Math.max(Date.now() - this.advancedDateTime, 0) / 1000;
  112. }
  113. return 0;
  114. }
  115.  
  116. get lastPartIndex(): number {
  117. if (this.partList?.length) {
  118. return this.partList[this.partList.length - 1].index;
  119. }
  120. return -1;
  121. }
  122.  
  123. get lastPartSn(): number {
  124. if (this.partList?.length) {
  125. return this.partList[this.partList.length - 1].fragment.sn as number;
  126. }
  127. return this.endSN;
  128. }
  129. }