diff --git a/api/ClientRequest.js b/api/ClientRequest.js index d5e8c38..1de4d56 100644 --- a/api/ClientRequest.js +++ b/api/ClientRequest.js @@ -2,6 +2,7 @@ class ClientRequest { // Private fields #consent; #requestedDuration; + #skipoffset; #userId; #operatingSystem; #deviceType; @@ -18,6 +19,7 @@ class ClientRequest { constructor(params) { this.#consent = params.c || null; this.#requestedDuration = params.dur || null; + this.#skipoffset = params.skip || null; this.#userId = params.uid || null; this.#operatingSystem = params.os || null; this.#deviceType = params.dt || null; @@ -41,6 +43,7 @@ class ClientRequest { const properties = { Consent: this.#consent, RequestedDuration: this.#requestedDuration, + Skipoffset: this.#skipoffset, UserId: this.#userId, OperatingSystem: this.#operatingSystem, DeviceType: this.#deviceType, diff --git a/api/Session.js b/api/Session.js index c70ec26..fd9a09b 100644 --- a/api/Session.js +++ b/api/Session.js @@ -43,6 +43,7 @@ class Session { generalVastConfigs: { sessionId: this.sessionId, desiredDuration: params.dur || "0", + skipoffset: params.skip || null, adserverHostname: this.host, maxPodDuration: params.max || null, minPodDuration: params.min || null, @@ -58,6 +59,7 @@ class Session { const vastObj = VastBuilder({ sessionId: this.sessionId, desiredDuration: params.dur || "0", + skipoffset: params.skip || null, adserverHostname: this.host, maxPodDuration: params.max || null, minPodDuration: params.min || null, diff --git a/api/routes.js b/api/routes.js index 01da89b..5aacf9d 100644 --- a/api/routes.js +++ b/api/routes.js @@ -140,6 +140,11 @@ const vastSchema = () => ({ Linear: { type: "object", properties: { + skipoffset: { + type: "string", + example: "00:00:05", + xml: { attribute: true }, + }, Duration: { type: "string", example: "00:00:30", @@ -593,6 +598,11 @@ const schemas = { description: "Desired duration in seconds.", example: "60", }, + skip: { + type: "string", + description: "Skipoffset in seconds or percentage.", + example: "5 or 25%", + }, uid: { type: "string", description: "User ID.", @@ -691,6 +701,11 @@ const schemas = { description: "Desired duration for midroll ad break, in seconds.", example: "60", }, + skip: { + type: "string", + description: "Skipoffset in seconds or percentage.", + example: "5 or 25%", + }, uid: { type: "string", description: "User ID.", diff --git a/utils/vast-maker.js b/utils/vast-maker.js index 4c7d330..4c5b9f2 100644 --- a/utils/vast-maker.js +++ b/utils/vast-maker.js @@ -209,7 +209,7 @@ function AttachPodAds(vast, podAds, params) { ); } mediaNode = mediaNode - .attachLinear() + .attachLinear({skipoffset: getSkipOffsetValue(params.skipoffset)}) // skipoffset does not seem to exist on VAST 2.0 and lower, you could also have skipoffset in percentage .attachTrackingEvents() .addTracking(`http://${params.adserverHostname}/api/v1/sessions/${params.sessionId}/tracking?${adId}=${podAds[i].id}_${i + 1}&progress=0`, { event: "start" }) .addTracking(`http://${params.adserverHostname}/api/v1/sessions/${params.sessionId}/tracking?${adId}=${podAds[i].id}_${i + 1}&progress=25`, { event: "firstQuartile" }) @@ -351,6 +351,27 @@ function indexOfSmallest(a) { return lowest; } +function getSkipOffsetValue(skipoffset) { + // "x%" + const percentageFormatRegex = /^(100|[1-9]?[0-9])%$/; + // "seconds" + const integerSecondsRegex = /^\d+$/; + + if (percentageFormatRegex.test(skipoffset)){ + return skipoffset; + } + // convert seconds to "hh:mm:ss" format + if (integerSecondsRegex.test(skipoffset)) { + const totalSeconds = parseInt(skipoffset, 10); + const hours = String(Math.floor(totalSeconds / 3600)).padStart(2, '0'); + const minutes = String(Math.floor((totalSeconds % 3600) / 60)).padStart(2, '0'); + const seconds = String(totalSeconds % 60).padStart(2, '0'); + + return `${hours}:${minutes}:${seconds}`; + } + return null; +} + function PopulatePod(_size, _min, _max, _ads, _chosenAds, _method, _targetDur) { // Base Case #1: Regardless of current Pod size, return if Pod duration is greater than _max! if (_chosenAds.length > 0) { diff --git a/utils/vmap-maker.js b/utils/vmap-maker.js index a183433..85aaa27 100644 --- a/utils/vmap-maker.js +++ b/utils/vmap-maker.js @@ -80,6 +80,7 @@ function VmapBuilder(params) { const defaultConfigs = { sessionId: GVC.sessionId, desiredDuration: "15", + skipoffset: GVC.skipoffset, adserverHostname: GVC.adserverHostname, maxPodDuration: null, minPodDuration: null,