// Package vast implements IAB VAST 3.0 specification http://www.iab.net/media/file/VASTv3.0.pdf package vast import "encoding/xml" // VAST is the root tag type VAST struct { // The version of the VAST spec (should be either "2.0" or "3.0") Version string `xml:"version,attr"` // One or more Ad elements. Advertisers and video content publishers may // associate an element with a line item video ad defined in contract // documentation, usually an insertion order. These line item ads typically // specify the creative to display, price, delivery schedule, targeting, // and so on. Ads []Ad `xml:"Ad"` // Contains a URI to a tracking resource that the video player should request // upon receiving a “no ad” response Errors []CDATAString `xml:"Error,omitempty"` } // Ad represent an child tag in a VAST document // // Each contains a single element or element (but never both). type Ad struct { // An ad server-defined identifier string for the ad ID string `xml:"id,attr,omitempty"` // A number greater than zero (0) that identifies the sequence in which // an ad should play; all elements with sequence values are part of // a pod and are intended to be played in sequence Sequence int `xml:"sequence,attr,omitempty"` InLine *InLine `xml:",omitempty"` Wrapper *Wrapper `xml:",omitempty"` } // CDATAString ... type CDATAString struct { CDATA string `xml:",cdata"` } // InLine is a vast ad element containing actual ad definition // // The last ad server in the ad supply chain serves an element. // Within the nested elements of an element are all the files and // URIs necessary to display the ad. type InLine struct { // The name of the ad server that returned the ad AdSystem string `xml:",omitempty"` // The common name of the ad AdTitle CDATAString // One or more URIs that directs the video player to a tracking resource file that the // video player should request when the first frame of the ad is displayed Impressions []Impression `xml:"Impression"` // The container for one or more elements Creatives []Creative `xml:"Creatives>Creative"` // A string value that provides a longer description of the ad. Description CDATAString `xml:",omitempty"` // The name of the advertiser as defined by the ad serving party. // This element can be used to prevent displaying ads with advertiser // competitors. Ad serving parties and publishers should identify how // to interpret values provided within this element. As with any optional // elements, the video player is not required to support it. Advertiser string `xml:",omitempty"` // A URI to a survey vendor that could be the survey, a tracking pixel, // or anything to do with the survey. Multiple survey elements can be provided. // A type attribute is available to specify the MIME type being served. // For example, the attribute might be set to type=”text/javascript”. // Surveys can be dynamically inserted into the VAST response as long as // cross-domain issues are avoided. Survey CDATAString `xml:",omitempty"` // A URI representing an error-tracking pixel; this element can occur multiple // times. Errors []CDATAString `xml:"Error,omitempty"` // Provides a value that represents a price that can be used by real-time bidding // (RTB) systems. VAST is not designed to handle RTB since other methods exist, // but this element is offered for custom solutions if needed. Pricing *Pricing `xml:",omitempty"` // XML node for custom extensions, as defined by the ad server. When used, a // custom element should be nested under to help separate custom // XML elements from VAST elements. The following example includes a custom // xml element within the Extensions element. Extensions *[]Extension `xml:"Extensions>Extension,omitempty"` } // Impression is a URI that directs the video player to a tracking resource file that // the video player should request when the first frame of the ad is displayed type Impression struct { ID string `xml:"id,attr,omitempty"` URI string `xml:",cdata"` } // Pricing provides a value that represents a price that can be used by real-time // bidding (RTB) systems. VAST is not designed to handle RTB since other methods // exist, but this element is offered for custom solutions if needed. type Pricing struct { // Identifies the pricing model as one of "cpm", "cpc", "cpe" or "cpv". Model string `xml:"model,attr"` // The 3 letter ISO-4217 currency symbol that identifies the currency of // the value provided Currency string `xml:"currency,attr"` // If the value provided is to be obfuscated/encoded, publishers and advertisers // must negotiate the appropriate mechanism to do so. When included as part of // a VAST Wrapper in a chain of Wrappers, only the value offered in the first // Wrapper need be considered. Value string `xml:",cdata"` } // Wrapper element contains a URI reference to a vendor ad server (often called // a third party ad server). The destination ad server either provides the ad // files within a VAST ad element or may provide a secondary Wrapper // ad, pointing to yet another ad server. Eventually, the final ad server in // the ad supply chain must contain all the necessary files needed to display // the ad. type Wrapper struct { // The name of the ad server that returned the ad AdSystem string `xml:",omitempty"` // URL of ad tag of downstream Secondary Ad Server VASTAdTagURI CDATAString // One or more URIs that directs the video player to a tracking resource file that the // video player should request when the first frame of the ad is displayed Impressions []Impression `xml:"Impression"` // A URI representing an error-tracking pixel; this element can occur multiple // times. Errors []CDATAString `xml:"Error,omitempty"` // The container for one or more elements Creatives []CreativeWrapper `xml:"Creatives>Creative"` // XML node for custom extensions, as defined by the ad server. When used, a // custom element should be nested under to help separate custom // XML elements from VAST elements. The following example includes a custom // xml element within the Extensions element. Extensions []Extension `xml:"Extensions>Extension,omitempty"` FallbackOnNoAd *bool `xml:"fallbackOnNoAd,attr,omitempty"` AllowMultipleAds *bool `xml:"allowMultipleAds,attr,omitempty"` FollowAdditionalWrappers *bool `xml:"followAdditionalWrappers,attr,omitempty"` } // AdSystem contains information about the system that returned the ad type AdSystem struct { Version string `xml:"version,attr,omitempty"` Name string `xml:",cdata"` } // Creative is a file that is part of a VAST ad. type Creative struct { // An ad server-defined identifier for the creative ID string `xml:"id,attr,omitempty"` // The preferred order in which multiple Creatives should be displayed Sequence int `xml:"sequence,attr,omitempty"` // Identifies the ad with which the creative is served AdID string `xml:"AdID,attr,omitempty"` // The technology used for any included API APIFramework string `xml:"apiFramework,attr,omitempty"` // If present, defines a linear creative Linear *Linear `xml:",omitempty"` // If defined, defins companions creatives CompanionAds *CompanionAds `xml:",omitempty"` // If defined, defines non linear creatives NonLinearAds *NonLinearAds `xml:",omitempty"` // If present, provides a VAST 4.x universal ad id UniversalAdID *UniversalAdID `xml:"UniversalAdId,omitempty"` // When an API framework is needed to execute creative, a // element can be added under the . This // extension can be used to load an executable creative with or without using // a media file. // A element is nested under the // (plural) element so that any xml extensions are separated from VAST xml. // Additionally, any xml used in this extension should identify an xml name // space (xmlns) to avoid confusing any of the xml element names with those // of VAST. // The nested includes an attribute for type, which // specifies the MIME type needed to execute the extension. CreativeExtensions *[]Extension `xml:"CreativeExtensions>CreativeExtension,omitempty"` } // CompanionAds contains companions creatives type CompanionAds struct { // Provides information about which companion creative to display. // All means that the player must attempt to display all. Any means the player // must attempt to play at least one. None means all companions are optional Required string `xml:"required,attr,omitempty"` Companions []Companion `xml:"Companion,omitempty"` } // NonLinearAds contains non linear creatives type NonLinearAds struct { TrackingEvents []Tracking `xml:"TrackingEvents>Tracking,omitempty"` // Non linear creatives NonLinears []NonLinear `xml:"NonLinear,omitempty"` } // CreativeWrapper defines wrapped creative's parent trackers type CreativeWrapper struct { // An ad server-defined identifier for the creative ID string `xml:"id,attr,omitempty"` // The preferred order in which multiple Creatives should be displayed Sequence int `xml:"sequence,attr,omitempty"` // Identifies the ad with which the creative is served AdID string `xml:"AdID,attr,omitempty"` // If present, defines a linear creative Linear *LinearWrapper `xml:",omitempty"` // If defined, defines companions creatives CompanionAds *CompanionAdsWrapper `xml:"CompanionAds,omitempty"` // If defined, defines non linear creatives NonLinearAds *NonLinearAdsWrapper `xml:"NonLinearAds,omitempty"` } // CompanionAdsWrapper contains companions creatives in a wrapper type CompanionAdsWrapper struct { // Provides information about which companion creative to display. // All means that the player must attempt to display all. Any means the player // must attempt to play at least one. None means all companions are optional Required string `xml:"required,attr,omitempty"` Companions []CompanionWrapper `xml:"Companion,omitempty"` } // NonLinearAdsWrapper contains non linear creatives in a wrapper type NonLinearAdsWrapper struct { TrackingEvents []Tracking `xml:"TrackingEvents>Tracking,omitempty"` // Non linear creatives NonLinears []NonLinearWrapper `xml:"NonLinear,omitempty"` } // Linear is the most common type of video advertisement trafficked in the // industry is a “linear ad”, which is an ad that displays in the same area // as the content but not at the same time as the content. In fact, the video // player must interrupt the content before displaying a linear ad. // Linear ads are often displayed right before the video content plays. // This ad position is called a “pre-roll” position. For this reason, a linear // ad is often called a “pre-roll.” type Linear struct { // To specify that a Linear creative can be skipped, the ad server must // include the skipoffset attribute in the element. The value // for skipoffset is a time value in the format HH:MM:SS or HH:MM:SS.mmm // or a percentage in the format n%. The .mmm value in the time offset // represents milliseconds and is optional. This skipoffset value // indicates when the skip control should be provided after the creative // begins playing. SkipOffset *Offset `xml:"skipoffset,attr,omitempty"` // Duration in standard time format, hh:mm:ss Duration Duration AdParameters *AdParameters `xml:",omitempty"` Icons *Icons TrackingEvents []Tracking `xml:"TrackingEvents>Tracking,omitempty"` VideoClicks *VideoClicks `xml:",omitempty"` MediaFiles []MediaFile `xml:"MediaFiles>MediaFile,omitempty"` } // LinearWrapper defines a wrapped linear creative type LinearWrapper struct { Icons *Icons TrackingEvents []Tracking `xml:"TrackingEvents>Tracking,omitempty"` VideoClicks *VideoClicks `xml:",omitempty"` } // Companion defines a companion ad type Companion struct { // Optional identifier ID string `xml:"id,attr,omitempty"` // Pixel dimensions of companion slot. Width int `xml:"width,attr,omitempty"` // Pixel dimensions of companion slot. Height int `xml:"height,attr,omitempty"` // Pixel dimensions of the companion asset. AssetWidth int `xml:"assetWidth,attr,omitempty"` // Pixel dimensions of the companion asset. AssetHeight int `xml:"assetHeight,attr,omitempty"` // Pixel dimensions of expanding companion ad when in expanded state. ExpandedWidth int `xml:"expandedWidth,attr,omitempty"` // Pixel dimensions of expanding companion ad when in expanded state. ExpandedHeight int `xml:"expandedHeight,attr,omitempty"` // The apiFramework defines the method to use for communication with the companion. APIFramework string `xml:"apiFramework,attr,omitempty"` // Used to match companion creative to publisher placement areas on the page. AdSlotID string `xml:"adSlotId,attr,omitempty"` // Alt text to be displayed when companion is rendered in HTML environment. AltText string `xml:",omitempty"` // URL to a static file, such as an image or SWF file StaticResource *StaticResource `xml:",omitempty"` // URL source for an IFrame to display the companion element IFrameResource *CDATAString `xml:",omitempty"` // HTML to display the companion element HTMLResource *HTMLResource `xml:",omitempty"` // The creativeView should always be requested when present. For Companions // creativeView is the only supported event. TrackingEvents []Tracking `xml:"TrackingEvents>Tracking,omitempty"` // Data to be passed into the companion ads. The apiFramework defines the method // to use for communication (e.g. “FlashVar”) AdParameters *AdParameters `xml:",omitempty"` // URL to open as destination page when user clicks on the the companion banner ad. CompanionClickThrough *CDATAString `xml:",omitempty"` // URLs to ping when user clicks on the the companion banner ad. CompanionClickTracking []CDATAString `xml:",omitempty"` } // CompanionWrapper defines a companion ad in a wrapper type CompanionWrapper struct { // Optional identifier ID string `xml:"id,attr,omitempty"` // Pixel dimensions of companion slot. Width int `xml:"width,attr"` // Pixel dimensions of companion slot. Height int `xml:"height,attr"` // Pixel dimensions of the companion asset. AssetWidth int `xml:"assetWidth,attr"` // Pixel dimensions of the companion asset. AssetHeight int `xml:"assetHeight,attr"` // Pixel dimensions of expanding companion ad when in expanded state. ExpandedWidth int `xml:"expandedWidth,attr"` // Pixel dimensions of expanding companion ad when in expanded state. ExpandedHeight int `xml:"expandedHeight,attr"` // The apiFramework defines the method to use for communication with the companion. APIFramework string `xml:"apiFramework,attr,omitempty"` // Used to match companion creative to publisher placement areas on the page. AdSlotID string `xml:"adSlotId,attr,omitempty"` // URL to open as destination page when user clicks on the the companion banner ad. CompanionClickThrough CDATAString `xml:",omitempty"` // URLs to ping when user clicks on the the companion banner ad. CompanionClickTracking []CDATAString `xml:",omitempty"` // Alt text to be displayed when companion is rendered in HTML environment. AltText string `xml:",omitempty"` // The creativeView should always be requested when present. For Companions // creativeView is the only supported event. TrackingEvents []Tracking `xml:"TrackingEvents>Tracking,omitempty"` // Data to be passed into the companion ads. The apiFramework defines the method // to use for communication (e.g. “FlashVar”) AdParameters *AdParameters `xml:",omitempty"` // URL to a static file, such as an image or SWF file StaticResource *StaticResource `xml:",omitempty"` // URL source for an IFrame to display the companion element IFrameResource *CDATAString `xml:",omitempty"` // HTML to display the companion element HTMLResource *HTMLResource `xml:",omitempty"` } // NonLinear defines a non linear ad type NonLinear struct { // Optional identifier ID string `xml:"id,attr,omitempty"` // Pixel dimensions of companion. Width int `xml:"width,attr"` // Pixel dimensions of companion. Height int `xml:"height,attr"` // Pixel dimensions of expanding nonlinear ad when in expanded state. ExpandedWidth int `xml:"expandedWidth,attr"` // Pixel dimensions of expanding nonlinear ad when in expanded state. ExpandedHeight int `xml:"expandedHeight,attr"` // Whether it is acceptable to scale the image. Scalable bool `xml:"scalable,attr,omitempty"` // Whether the ad must have its aspect ratio maintained when scales. MaintainAspectRatio bool `xml:"maintainAspectRatio,attr,omitempty"` // Suggested duration to display non-linear ad, typically for animation to complete. // Expressed in standard time format hh:mm:ss. MinSuggestedDuration *Duration `xml:"minSuggestedDuration,attr,omitempty"` // The apiFramework defines the method to use for communication with the nonlinear element. APIFramework string `xml:"apiFramework,attr,omitempty"` // URLs to ping when user clicks on the the non-linear ad. NonLinearClickTracking []CDATAString `xml:",omitempty"` // URL to open as destination page when user clicks on the non-linear ad unit. NonLinearClickThrough CDATAString `xml:",omitempty"` // Data to be passed into the video ad. AdParameters *AdParameters `xml:",omitempty"` // URL to a static file, such as an image or SWF file StaticResource *StaticResource `xml:",omitempty"` // URL source for an IFrame to display the companion element IFrameResource *CDATAString `xml:",omitempty"` // HTML to display the companion element HTMLResource *HTMLResource `xml:",omitempty"` } // NonLinearWrapper defines a non linear ad in a wrapper type NonLinearWrapper struct { // Optional identifier ID string `xml:"id,attr,omitempty"` // Pixel dimensions of companion. Width int `xml:"width,attr"` // Pixel dimensions of companion. Height int `xml:"height,attr"` // Pixel dimensions of expanding nonlinear ad when in expanded state. ExpandedWidth int `xml:"expandedWidth,attr"` // Pixel dimensions of expanding nonlinear ad when in expanded state. ExpandedHeight int `xml:"expandedHeight,attr"` // Whether it is acceptable to scale the image. Scalable bool `xml:"scalable,attr,omitempty"` // Whether the ad must have its aspect ratio maintained when scales. MaintainAspectRatio bool `xml:"maintainAspectRatio,attr,omitempty"` // Suggested duration to display non-linear ad, typically for animation to complete. // Expressed in standard time format hh:mm:ss. MinSuggestedDuration *Duration `xml:"minSuggestedDuration,attr,omitempty"` // The apiFramework defines the method to use for communication with the nonlinear element. APIFramework string `xml:"apiFramework,attr,omitempty"` // The creativeView should always be requested when present. TrackingEvents []Tracking `xml:"TrackingEvents>Tracking,omitempty"` // URLs to ping when user clicks on the the non-linear ad. NonLinearClickTracking []CDATAString `xml:",omitempty"` } type Icons struct { XMLName xml.Name `xml:"Icons,omitempty"` Icon []Icon `xml:"Icon,omitempty"` } // Icon represents advertising industry initiatives like AdChoices. type Icon struct { // Identifies the industry initiative that the icon supports. Program string `xml:"program,attr"` // Pixel dimensions of icon. Width int `xml:"width,attr"` // Pixel dimensions of icon. Height int `xml:"height,attr"` // The horizontal alignment location (in pixels) or a specific alignment. // Must match ([0-9]*|left|right) XPosition string `xml:"xPosition,attr"` // The vertical alignment location (in pixels) or a specific alignment. // Must match ([0-9]*|top|bottom) YPosition string `xml:"yPosition,attr"` // Start time at which the player should display the icon. Expressed in standard time format hh:mm:ss. Offset Offset `xml:"offset,attr"` // duration for which the player must display the icon. Expressed in standard time format hh:mm:ss. Duration Duration `xml:"duration,attr"` // The apiFramework defines the method to use for communication with the icon element APIFramework string `xml:"apiFramework,attr,omitempty"` // URL to open as destination page when user clicks on the icon. IconClickThrough CDATAString `xml:"IconClicks>IconClickThrough,omitempty"` // URLs to ping when user clicks on the the icon. IconClickTrackings []CDATAString `xml:"IconClicks>IconClickTracking,omitempty"` // URL to a static file, such as an image or SWF file StaticResource *StaticResource `xml:",omitempty"` // URL source for an IFrame to display the companion element IFrameResource *CDATAString `xml:",omitempty"` // HTML to display the companion element HTMLResource *HTMLResource `xml:",omitempty"` } // Tracking defines an event tracking URL type Tracking struct { // The name of the event to track for the element. The creativeView should // always be requested when present. // // Possible values are creativeView, start, firstQuartile, midpoint, thirdQuartile, // complete, mute, unmute, pause, rewind, resume, fullscreen, exitFullscreen, expand, // collapse, acceptInvitation, close, skip, progress. Event string `xml:"event,attr"` // The time during the video at which this url should be pinged. Must be present for // progress event. Must match (\d{2}:[0-5]\d:[0-5]\d(\.\d\d\d)?|1?\d?\d(\.?\d)*%) Offset *Offset `xml:"offset,attr,omitempty"` URI string `xml:",cdata"` } // StaticResource is the URL to a static file, such as an image or SWF file type StaticResource struct { // Mime type of static resource CreativeType string `xml:"creativeType,attr,omitempty"` // URL to a static file, such as an image or SWF file URI string `xml:",cdata"` } // HTMLResource is a container for HTML data type HTMLResource struct { // Specifies whether the HTML is XML-encoded XMLEncoded bool `xml:"xmlEncoded,attr,omitempty"` HTML string `xml:",cdata"` } // AdParameters defines arbitrary ad parameters type AdParameters struct { // Specifies whether the parameters are XML-encoded XMLEncoded bool `xml:"xmlEncoded,attr,omitempty"` Parameters string `xml:",cdata"` } // VideoClicks contains types of video clicks type VideoClicks struct { ClickThroughs []VideoClick `xml:"ClickThrough,omitempty"` ClickTrackings []VideoClick `xml:"ClickTracking,omitempty"` CustomClicks []VideoClick `xml:"CustomClick,omitempty"` } // VideoClick defines a click URL for a linear creative type VideoClick struct { ID string `xml:"id,attr,omitempty"` URI string `xml:",cdata"` } // MediaFile defines a reference to a linear creative asset type MediaFile struct { // Optional identifier ID string `xml:"id,attr,omitempty"` // Method of delivery of ad (either "streaming" or "progressive") Delivery string `xml:"delivery,attr"` // MIME type. Popular MIME types include, but are not limited to // “video/x-ms-wmv” for Windows Media, and “video/x-flv” for Flash // Video. Image ads or interactive ads can be included in the // MediaFiles section with appropriate Mime types Type string `xml:"type,attr"` // The codec used to produce the media file. Codec string `xml:"codec,attr,omitempty"` // Bitrate of encoded video in Kbps. If bitrate is supplied, MinBitrate // and MaxBitrate should not be supplied. Bitrate int `xml:"bitrate,attr,omitempty"` // Minimum bitrate of an adaptive stream in Kbps. If MinBitrate is supplied, // MaxBitrate must be supplied and Bitrate should not be supplied. MinBitrate int `xml:"minBitrate,attr,omitempty"` // Maximum bitrate of an adaptive stream in Kbps. If MaxBitrate is supplied, // MinBitrate must be supplied and Bitrate should not be supplied. MaxBitrate int `xml:"maxBitrate,attr,omitempty"` // Pixel dimensions of video. Width int `xml:"width,attr"` // Pixel dimensions of video. Height int `xml:"height,attr"` // Whether it is acceptable to scale the image. Scalable bool `xml:"scalable,attr,omitempty"` // Whether the ad must have its aspect ratio maintained when scales. MaintainAspectRatio bool `xml:"maintainAspectRatio,attr,omitempty"` // The APIFramework defines the method to use for communication if the MediaFile // is interactive. Suggested values for this element are “VPAID”, “FlashVars” // (for Flash/Flex), “initParams” (for Silverlight) and “GetVariables” (variables // placed in key/value pairs on the asset request). APIFramework string `xml:"apiFramework,attr,omitempty"` URI string `xml:",cdata"` } // UniversalAdID describes a VAST 4.x universal ad id. type UniversalAdID struct { IDRegistry string `xml:"idRegistry,attr"` IDValue string `xml:"idValue,attr"` ID string `xml:",cdata"` }