Skip to content

Commit 8784b44

Browse files
committed
feat: Replace segment template utils with CML version
1 parent 0b89d5f commit 8784b44

File tree

8 files changed

+49
-194
lines changed

8 files changed

+49
-194
lines changed

package-lock.json

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@
8484
"yargs": "^17.7.2"
8585
},
8686
"dependencies": {
87-
"@svta/common-media-library": "^0.7.4",
87+
"@svta/common-media-library": "^0.9.0",
8888
"bcp-47-match": "^2.0.3",
8989
"bcp-47-normalize": "^2.3.0",
9090
"codem-isoboxer": "0.3.10",

src/dash/DashHandler.js

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,8 @@ import FragmentRequest from '../streaming/vo/FragmentRequest.js';
3232
import {HTTPRequest} from '../streaming/vo/metrics/HTTPRequest.js';
3333
import FactoryMaker from '../core/FactoryMaker.js';
3434
import MediaPlayerEvents from '../streaming/MediaPlayerEvents.js';
35-
import {
36-
replaceIDForTemplate,
37-
replaceTokenForTemplate,
38-
unescapeDollarsInTemplate
39-
} from './utils/SegmentsUtils.js';
4035
import DashConstants from './constants/DashConstants.js';
36+
import {processUriTemplate} from '@svta/common-media-library/dash/processUriTemplate.js';
4137

4238

4339
const DEFAULT_ADJUST_SEEK_TIME_THRESHOLD = 0.5;
@@ -145,7 +141,7 @@ function DashHandler(config) {
145141
request.representation = representation;
146142

147143
if (_setRequestUrl(request, representation.initialization, representation)) {
148-
request.url = replaceTokenForTemplate(request.url, 'Bandwidth', representation.bandwidth);
144+
request.url = processUriTemplate(request.url, undefined, undefined, undefined, representation.bandwidth);
149145
return request;
150146
}
151147
}
@@ -158,13 +154,14 @@ function DashHandler(config) {
158154
const request = new FragmentRequest();
159155
const representation = segment.representation;
160156
const bandwidth = representation.bandwidth;
161-
let url = segment.media;
162-
163-
url = replaceTokenForTemplate(url, 'Number', segment.replacementNumber);
164-
url = replaceTokenForTemplate(url, 'Time', segment.replacementTime);
165-
url = replaceTokenForTemplate(url, 'Bandwidth', bandwidth);
166-
url = replaceIDForTemplate(url, representation.id);
167-
url = unescapeDollarsInTemplate(url);
157+
const url = processUriTemplate(
158+
segment.media,
159+
representation.id,
160+
segment.replacementNumber,
161+
undefined,
162+
bandwidth,
163+
segment.replacementTime
164+
);
168165

169166
request.mediaType = getType();
170167
request.bandwidth = representation.bandwidth;

src/dash/utils/SegmentsUtils.js

Lines changed: 9 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -29,105 +29,13 @@
2929
* POSSIBILITY OF SUCH DAMAGE.
3030
*/
3131

32+
import {processUriTemplate} from '@svta/common-media-library/dash/processUriTemplate.js';
3233
import Segment from './../vo/Segment.js';
3334

34-
function zeroPadToLength(numStr, minStrLength) {
35-
while (numStr.length < minStrLength) {
36-
numStr = '0' + numStr;
37-
}
38-
return numStr;
39-
}
40-
4135
function getNumberForSegment(segment, segmentIndex) {
4236
return segment.representation.startNumber + segmentIndex;
4337
}
4438

45-
export function unescapeDollarsInTemplate(url) {
46-
return url ? url.split('$$').join('$') : url;
47-
}
48-
49-
export function replaceIDForTemplate(url, value) {
50-
if (!value || !url || url.indexOf('$RepresentationID$') === -1) {
51-
return url;
52-
}
53-
let v = value.toString();
54-
return url.split('$RepresentationID$').join(v);
55-
}
56-
57-
export function replaceTokenForTemplate(url, token, value) {
58-
const formatTag = '%0';
59-
60-
let startPos,
61-
endPos,
62-
formatTagPos,
63-
specifier,
64-
width,
65-
paddedValue;
66-
67-
const tokenLen = token.length;
68-
const formatTagLen = formatTag.length;
69-
70-
if (!url) {
71-
return url;
72-
}
73-
74-
// keep looping round until all instances of <token> have been
75-
// replaced. once that has happened, startPos below will be -1
76-
// and the completed url will be returned.
77-
while (true) {
78-
79-
// check if there is a valid $<token>...$ identifier
80-
// if not, return the url as is.
81-
startPos = url.indexOf('$' + token);
82-
if (startPos < 0) {
83-
return url;
84-
}
85-
86-
// the next '$' must be the end of the identifier
87-
// if there isn't one, return the url as is.
88-
endPos = url.indexOf('$', startPos + tokenLen);
89-
if (endPos < 0) {
90-
return url;
91-
}
92-
93-
// now see if there is an additional format tag suffixed to
94-
// the identifier within the enclosing '$' characters
95-
formatTagPos = url.indexOf(formatTag, startPos + tokenLen);
96-
if (formatTagPos > startPos && formatTagPos < endPos) {
97-
98-
specifier = url.charAt(endPos - 1);
99-
width = parseInt(url.substring(formatTagPos + formatTagLen, endPos - 1), 10);
100-
101-
// support the minimum specifiers required by IEEE 1003.1
102-
// (d, i , o, u, x, and X) for completeness
103-
switch (specifier) {
104-
// treat all int types as uint,
105-
// hence deliberate fallthrough
106-
case 'd':
107-
case 'i':
108-
case 'u':
109-
paddedValue = zeroPadToLength(value.toString(), width);
110-
break;
111-
case 'x':
112-
paddedValue = zeroPadToLength(value.toString(16), width);
113-
break;
114-
case 'X':
115-
paddedValue = zeroPadToLength(value.toString(16), width).toUpperCase();
116-
break;
117-
case 'o':
118-
paddedValue = zeroPadToLength(value.toString(8), width);
119-
break;
120-
default:
121-
return url;
122-
}
123-
} else {
124-
paddedValue = value;
125-
}
126-
127-
url = url.substring(0, startPos) + paddedValue + url.substring(endPos + 1);
128-
}
129-
}
130-
13139
function getSegment(representation, duration, presentationStartTime, mediaStartTime, timelineConverter, presentationEndTime, isDynamic, index) {
13240
let seg = new Segment();
13341

@@ -222,10 +130,14 @@ export function getTimeBasedSegment(timelineConverter, isDynamic, representation
222130
}
223131

224132
seg.replacementTime = tManifest ? tManifest : time;
225-
226-
url = replaceTokenForTemplate(url, 'Number', seg.replacementNumber);
227-
url = replaceTokenForTemplate(url, 'Time', seg.replacementTime);
228-
seg.media = url;
133+
seg.media = processUriTemplate(
134+
url,
135+
undefined,
136+
seg.replacementNumber,
137+
undefined,
138+
undefined,
139+
seg.replacementTime,
140+
);
229141
seg.mediaRange = range;
230142

231143
return seg;

src/dash/utils/TemplateSegmentsGetter.js

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,10 @@
2929
* POSSIBILITY OF SUCH DAMAGE.
3030
*/
3131

32+
import {processUriTemplate} from '@svta/common-media-library/dash/processUriTemplate.js';
3233
import FactoryMaker from '../../core/FactoryMaker.js';
3334
import Constants from '../../streaming/constants/Constants.js';
34-
import {replaceTokenForTemplate, getIndexBasedSegment} from './SegmentsUtils.js';
35+
import {getIndexBasedSegment} from './SegmentsUtils.js';
3536

3637
function TemplateSegmentsGetter(config, isDynamic) {
3738
config = config || {};
@@ -77,11 +78,14 @@ function TemplateSegmentsGetter(config, isDynamic) {
7778
const seg = getIndexBasedSegment(timelineConverter, isDynamic, representation, index);
7879
if (seg) {
7980
seg.replacementTime = Math.round(index * representation.segmentDuration * representation.timescale, 10);
80-
81-
let url = template.media;
82-
url = replaceTokenForTemplate(url, 'Number', seg.replacementNumber);
83-
url = replaceTokenForTemplate(url, 'Time', seg.replacementTime);
84-
seg.media = url;
81+
seg.media = processUriTemplate(
82+
template.media,
83+
undefined,
84+
seg.replacementNumber,
85+
undefined,
86+
undefined,
87+
seg.replacementTime,
88+
);
8589
}
8690

8791
return seg;

src/streaming/thumbnail/ThumbnailController.js

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
import FactoryMaker from '../../core/FactoryMaker.js';
3333
import Thumbnail from '../vo/Thumbnail.js';
3434
import ThumbnailTracks from './ThumbnailTracks.js';
35-
import {replaceTokenForTemplate, unescapeDollarsInTemplate} from '../../dash/utils/SegmentsUtils.js';
35+
import {processUriTemplate} from '@svta/common-media-library/dash/processUriTemplate.js';
3636

3737
function ThumbnailController(config) {
3838

@@ -119,10 +119,15 @@ function ThumbnailController(config) {
119119

120120
function _buildUrlFromTemplate(track, seq) {
121121
const seqIdx = seq + track.startNumber;
122-
let url = replaceTokenForTemplate(track.templateUrl, 'Number', seqIdx);
123-
url = replaceTokenForTemplate(url, 'Time', (seqIdx - 1) * track.segmentDuration * track.timescale);
124-
url = replaceTokenForTemplate(url, 'Bandwidth', track.bandwidth);
125-
return unescapeDollarsInTemplate(url);
122+
const url = processUriTemplate(
123+
track.templateUrl,
124+
undefined,
125+
seqIdx,
126+
undefined,
127+
track.bandwidth,
128+
(seqIdx - 1) * track.segmentDuration * track.timescale,
129+
);
130+
return url;
126131
}
127132

128133
function setTrackByIndex(index) {

src/streaming/thumbnail/ThumbnailTracks.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,12 @@ import DashConstants from '../../dash/constants/DashConstants.js';
3333
import FactoryMaker from '../../core/FactoryMaker.js';
3434
import ThumbnailTrackInfo from '../vo/ThumbnailTrackInfo.js';
3535
import URLUtils from '../../streaming/utils/URLUtils.js';
36-
import {replaceIDForTemplate, getTimeBasedSegment} from '../../dash/utils/SegmentsUtils.js';
36+
import {getTimeBasedSegment} from '../../dash/utils/SegmentsUtils.js';
3737
import BoxParser from '../../streaming/utils/BoxParser.js';
3838
import XHRLoader from '../../streaming/net/XHRLoader.js';
3939
import DashHandler from '../../dash/DashHandler.js';
4040
import SegmentsController from '../../dash/controllers/SegmentsController.js';
41+
import {processUriTemplate} from '@svta/common-media-library/dash/processUriTemplate.js';
4142

4243
function ThumbnailTracks(config) {
4344
const context = this.context;
@@ -260,7 +261,7 @@ function ThumbnailTracks(config) {
260261
return '';
261262
}
262263

263-
return replaceIDForTemplate(templateUrl, representation.id);
264+
return processUriTemplate(templateUrl, representation.id);
264265
}
265266

266267
function getTracks() {

test/unit/test/dash/dash.utils.SegmentUtils.js

Lines changed: 0 additions & 64 deletions
This file was deleted.

0 commit comments

Comments
 (0)