@@ -12,8 +12,8 @@ const NET_REVENUE = true;
1212const BANNER_SERVER_ENDPOINT = 'https://ads.yieldmo.com/exchange/prebid' ;
1313const VIDEO_SERVER_ENDPOINT = 'https://ads.yieldmo.com/exchange/prebidvideo' ;
1414const OUTSTREAM_VIDEO_PLAYER_URL = 'https://prebid-outstream.yieldmo.com/bundle.js' ;
15- const OPENRTB_VIDEO_BIDPARAMS = [ 'placement' , 'startdelay' , 'skipafter' ,
16- 'protocols ' , 'api ' , 'playbackmethod ' , 'maxduration ' , 'minduration ' , 'pos ' ] ;
15+ const OPENRTB_VIDEO_BIDPARAMS = [ 'mimes' , 'startdelay' , ' placement', 'startdelay' , 'skipafter' , 'protocols' , 'api ',
16+ 'playbackmethod ' , 'maxduration ' , 'minduration ' , 'pos ' , 'skip ' , 'skippable ' ] ;
1717const OPENRTB_VIDEO_SITEPARAMS = [ 'name' , 'domain' , 'cat' , 'keywords' ] ;
1818const LOCAL_WINDOW = utils . getWindowTop ( ) ;
1919const DEFAULT_PLAYBACK_METHOD = 2 ;
@@ -335,7 +335,6 @@ function openRtbRequest(bidRequests, bidderRequest) {
335335 * @return Object OpenRTB's 'imp' (impression) object
336336 */
337337function openRtbImpression ( bidRequest ) {
338- const videoReq = utils . deepAccess ( bidRequest , 'mediaTypes.video' ) ;
339338 const size = extractPlayerSize ( bidRequest ) ;
340339 const imp = {
341340 id : bidRequest . bidId ,
@@ -347,23 +346,27 @@ function openRtbImpression(bidRequest) {
347346 video : {
348347 w : size [ 0 ] ,
349348 h : size [ 1 ] ,
350- mimes : videoReq . mimes ,
351349 linearity : 1
352350 }
353351 } ;
354352
353+ const mediaTypesParams = utils . deepAccess ( bidRequest , 'mediaTypes.video' ) ;
354+ Object . keys ( mediaTypesParams )
355+ . filter ( param => includes ( OPENRTB_VIDEO_BIDPARAMS , param ) )
356+ . forEach ( param => imp . video [ param ] = mediaTypesParams [ param ] ) ;
357+
355358 const videoParams = utils . deepAccess ( bidRequest , 'params.video' ) ;
356359 Object . keys ( videoParams )
357360 . filter ( param => includes ( OPENRTB_VIDEO_BIDPARAMS , param ) )
358361 . forEach ( param => imp . video [ param ] = videoParams [ param ] ) ;
359362
360- if ( videoParams . skippable ) imp . video . skip = 1 ;
361- if ( videoParams . placement !== 1 ) {
362- imp . video = {
363- ... imp . video ,
364- startdelay : DEFAULT_START_DELAY ,
365- playbackmethod : [ DEFAULT_PLAYBACK_METHOD ]
366- }
363+ if ( imp . video . skippable ) {
364+ imp . video . skip = 1 ;
365+ delete imp . video . skippable ;
366+ }
367+ if ( imp . video . placement !== 1 ) {
368+ imp . video . startdelay = DEFAULT_START_DELAY ;
369+ imp . video . playbackmethod = [ DEFAULT_PLAYBACK_METHOD ] ;
367370 }
368371 return imp ;
369372}
@@ -476,51 +479,68 @@ function validateVideoParams(bid) {
476479
477480 const isDefined = val => typeof val !== 'undefined' ;
478481 const validate = ( fieldPath , validateCb , errorCb , errorCbParam ) => {
479- const value = utils . deepAccess ( bid , fieldPath ) ;
480- if ( ! validateCb ( value ) ) {
481- errorCb ( fieldPath , value , errorCbParam ) ;
482+ if ( fieldPath . includes ( 'video' ) ) {
483+ const valueFieldPath = 'params.' + fieldPath ;
484+ const mediaFieldPath = 'mediaTypes.' + fieldPath ;
485+ const valueParams = utils . deepAccess ( bid , valueFieldPath ) ;
486+ const mediaTypesParams = utils . deepAccess ( bid , mediaFieldPath ) ;
487+ const hasValidValueParams = validateCb ( valueParams ) ;
488+ const hasValidMediaTypesParams = validateCb ( mediaTypesParams ) ;
489+
490+ if ( hasValidValueParams ) return valueParams ;
491+ else if ( hasValidMediaTypesParams ) return hasValidMediaTypesParams ;
492+ else {
493+ if ( ! hasValidValueParams ) errorCb ( valueFieldPath , valueParams , errorCbParam ) ;
494+ else if ( ! hasValidMediaTypesParams ) errorCb ( mediaFieldPath , mediaTypesParams , errorCbParam ) ;
495+ }
496+ return valueParams || mediaTypesParams ;
497+ } else {
498+ const value = utils . deepAccess ( bid , fieldPath ) ;
499+ if ( ! validateCb ( value ) ) {
500+ errorCb ( fieldPath , value , errorCbParam ) ;
501+ }
502+ return value ;
482503 }
483- return value ;
484504 }
485505
486506 try {
507+ validate ( 'video.context' , val => ! utils . isEmpty ( val ) , paramRequired ) ;
508+
487509 validate ( 'params.placementId' , val => ! utils . isEmpty ( val ) , paramRequired ) ;
488510
489- validate ( 'mediaTypes. video.playerSize' , val => utils . isArrayOfNums ( val , 2 ) ||
511+ validate ( 'video.playerSize' , val => utils . isArrayOfNums ( val , 2 ) ||
490512 ( utils . isArray ( val ) && val . every ( v => utils . isArrayOfNums ( v , 2 ) ) ) ,
491513 paramInvalid , 'array of 2 integers, ex: [640,480] or [[640,480]]' ) ;
492514
493- validate ( 'mediaTypes. video.mimes' , val => isDefined ( val ) , paramRequired ) ;
494- validate ( 'mediaTypes. video.mimes' , val => utils . isArray ( val ) && val . every ( v => utils . isStr ( v ) ) , paramInvalid ,
515+ validate ( 'video.mimes' , val => isDefined ( val ) , paramRequired ) ;
516+ validate ( 'video.mimes' , val => utils . isArray ( val ) && val . every ( v => utils . isStr ( v ) ) , paramInvalid ,
495517 'array of strings, ex: ["video/mp4"]' ) ;
496518
497- validate ( 'params.video' , val => ! utils . isEmpty ( val ) , paramRequired ) ;
498-
499- const placement = validate ( 'params.video.placement' , val => isDefined ( val ) , paramRequired ) ;
500- validate ( 'params.video.placement' , val => val >= 1 && val <= 5 , paramInvalid ) ;
519+ const placement = validate ( 'video.placement' , val => isDefined ( val ) , paramRequired ) ;
520+ validate ( 'video.placement' , val => val >= 1 && val <= 5 , paramInvalid ) ;
501521 if ( placement === 1 ) {
502- validate ( 'params. video.startdelay' , val => isDefined ( val ) ,
522+ validate ( 'video.startdelay' , val => isDefined ( val ) ,
503523 ( field , v ) => paramRequired ( field , v , 'placement == 1' ) ) ;
504- validate ( 'params. video.startdelay' , val => utils . isNumber ( val ) , paramInvalid , 'number, ex: 5' ) ;
524+ validate ( 'video.startdelay' , val => utils . isNumber ( val ) , paramInvalid , 'number, ex: 5' ) ;
505525 }
506526
507- validate ( 'params. video.protocols' , val => isDefined ( val ) , paramRequired ) ;
508- validate ( 'params. video.protocols' , val => utils . isArrayOfNums ( val ) && val . every ( v => ( v >= 1 && v <= 6 ) ) ,
527+ validate ( 'video.protocols' , val => isDefined ( val ) , paramRequired ) ;
528+ validate ( 'video.protocols' , val => utils . isArrayOfNums ( val ) && val . every ( v => ( v >= 1 && v <= 6 ) ) ,
509529 paramInvalid , 'array of numbers, ex: [2,3]' ) ;
510530
511- validate ( 'params. video.api' , val => isDefined ( val ) , paramRequired ) ;
512- validate ( 'params. video.api' , val => utils . isArrayOfNums ( val ) && val . every ( v => ( v >= 1 && v <= 6 ) ) ,
531+ validate ( 'video.api' , val => isDefined ( val ) , paramRequired ) ;
532+ validate ( 'video.api' , val => utils . isArrayOfNums ( val ) && val . every ( v => ( v >= 1 && v <= 6 ) ) ,
513533 paramInvalid , 'array of numbers, ex: [2,3]' ) ;
514534
515- validate ( 'params. video.playbackmethod' , val => ! isDefined ( val ) || utils . isArrayOfNums ( val ) , paramInvalid ,
535+ validate ( 'video.playbackmethod' , val => ! isDefined ( val ) || utils . isArrayOfNums ( val ) , paramInvalid ,
516536 'array of integers, ex: [2,6]' ) ;
517537
518- validate ( 'params. video.maxduration' , val => isDefined ( val ) , paramRequired ) ;
519- validate ( 'params. video.maxduration' , val => utils . isInteger ( val ) , paramInvalid ) ;
520- validate ( 'params. video.minduration' , val => ! isDefined ( val ) || utils . isNumber ( val ) , paramInvalid ) ;
521- validate ( 'params. video.skippable' , val => ! isDefined ( val ) || utils . isBoolean ( val ) , paramInvalid ) ;
522- validate ( 'params. video.skipafter' , val => ! isDefined ( val ) || utils . isNumber ( val ) , paramInvalid ) ;
523- validate ( 'params. video.pos' , val => ! isDefined ( val ) || utils . isNumber ( val ) , paramInvalid ) ;
538+ validate ( 'video.maxduration' , val => isDefined ( val ) , paramRequired ) ;
539+ validate ( 'video.maxduration' , val => utils . isInteger ( val ) , paramInvalid ) ;
540+ validate ( 'video.minduration' , val => ! isDefined ( val ) || utils . isNumber ( val ) , paramInvalid ) ;
541+ validate ( 'video.skippable' , val => ! isDefined ( val ) || utils . isBoolean ( val ) , paramInvalid ) ;
542+ validate ( 'video.skipafter' , val => ! isDefined ( val ) || utils . isNumber ( val ) , paramInvalid ) ;
543+ validate ( 'video.pos' , val => ! isDefined ( val ) || utils . isNumber ( val ) , paramInvalid ) ;
524544 validate ( 'params.badv' , val => ! isDefined ( val ) || utils . isArray ( val ) , paramInvalid ,
525545 'array of strings, ex: ["ford.com","pepsi.com"]' ) ;
526546 validate ( 'params.bcat' , val => ! isDefined ( val ) || utils . isArray ( val ) , paramInvalid ,
0 commit comments