일반 VAST 변환기 람다

디지털 동영상 광고 제공 템플릿(VAST)은 IAB 디지털 동영상 기술 표준 작업 그룹의 구성원이 개발한 표준입니다. VAST는 동영상 플레이어에 광고를 게재하는 광고 태그를 구성하기 위한 동영상 광고 게재 템플릿입니다. VAST는 XML 스키마를 사용하여 광고 서버에서 비디오 플레이어로 광고에 대한 중요한 메타데이터를 전송합니다.

그것은 2008년부터 있었고 새로운 발명품이 아니며 본질적으로 목적에 잘 부합합니다. 그러나 광고 삽입기 구성 요소가 다른 광고 서버 공급자와 "대화"하는 것만큼 간단하지 않게 만드는 광고 서버별 태그(확장) 또는 표준 해석이 있을 수 있습니다.

광고 삽입기 측(서버 측이든 클라이언트 측이든)에서 광고를 제공하는 각 시스템에 대해 일부 조정을 수행해야 하는 것은 드문 일이 아닙니다. 이를 용이하게 하기 위해 우리는 VAST가 광고 삽입기로 전달되기 전에 VAST를 수정하거나 변환하는 일반적인 방법으로 사용할 수 있는 "프록시"를 개발했습니다.

AVAST Transformer는 Typescript로 작성되었으며 서비스로 배포하거나 예를 들어 AWS Lambda와 같은 서버리스 접근 방식을 사용하여 배포할 수 있습니다. 소스 코드는 오픈 소스로 공개됩니다.



새로운 변환을 적용할 때 실제 프록시 소스 코드를 수정하지 않고도 일반화되도록 설계되어 변환 언어로 XSLT(Extensible Stylesheet Language Transformations)를 사용하기로 했습니다. 꽤 오랫동안 사용되어 온 XML을 변환하는 언어이며 처음에는 복잡해 보일 수 있지만 사용 방법에 대한 많은 문서가 이미 작성되어 있습니다.

광고 삽입기가 광고 서버에서 직접 VAST XML을 가져오는 대신 VAST 변환기 프록시에서 가져옵니다. 적용할 XSLT를 사용할 수 있는 위치를 가리키는 URL 인코딩 쿼리 매개변수와 함께 URL 인코딩 쿼리 매개변수로 원래 광고 서버 엔드포인트를 제공합니다. 예를 들어 다음 URL로 VAST XML을 가져올 수 있는 Test Adserver을 사용하겠습니다.

https://eyevinn.adtest.eyevinn.technology/api/v1/vast?dur=60


URL 인코딩을 하면 다음과 같은 결과를 얻습니다.

https%3A%2F%2Feyevinn.adtest.eyevinn.technology%2Fapi%2Fv1%2Fvast%3Fdur%3D60


그리고 모든 ClickThrough 링크를 제거하는 이 간단한 XSLT를 적용하려고 합니다.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="utf-8" indent="yes"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
  </xsl:template>

  <!-- Drop VideoClicks -->
  <xsl:template match="VideoClicks"></xsl:template>

</xsl:stylesheet>


URL(아래 인코딩됨)에서 사용할 수 있습니다.

http%3A%2F%2Ftestcontent.eyevinn.technology%2Fxslt%2Fremove-click-through.xsl


그러면 광고 삽입기가 다음 URL을 사용하여 VAST Transformer 프록시를 통해 VAST를 가져옵니다.

https://vast-transformer.lambda.eyevinn.technology/transform?vastUrl=https%3A%2F%2Feyevinn.adtest.eyevinn.technology%2Fapi%2Fv1%2Fvast%3Fdur%3D60&xslt=http%3A%2F%2Ftestcontent.eyevinn.technology%2Fxslt%2Fremove-click-through.xsl


쿼리 매개변수vastUrl는 테스트 광고 서버를 가리키고 xslt는 XSLT 파일의 위치를 ​​가리킵니다.

이 구현은 성능이 매우 뛰어나야 하므로 libxslt의 Node.js 바인딩을 사용합니다. 현재 이러한 Node.js 바인딩은 이 게시물 작성 시점에 v16 이상이 아직 지원되지 않으므로 15 미만의 노드 버전에서만 작동합니다.

그 외에도 구현은 본질적으로 매우 간단합니다.

    // fetch the XSLT XML
    const xsltXml = await fetchXslt(xsltUrl);

    // forward all headers except the Host header
    // when fetching the VAST XML
    let headers = {};
    Object.keys(event.headers).forEach(k => {
      if (k !== 'host') {
        headers[k] = event.headers[k];
      }
    });
    const response = await fetch(vastUrl.toString(), {
      headers: headers,
    });

    const vastXml = await response.text(); 
    // apply the XSLT on the VAST XML   
    const outXml = await xsltProcess(vastXml, xsltXml);
    // gzip compress the XML
    const compressed = await compress(Buffer.from(outXml, "utf-8"));
    // as there are limitations in response size
    // from a Lambda
    return {
      statusCode: 200,
      headers: {
        "Content-Type": "application/xml",
        "Content-Encoding": "gzip",
        "Access-Control-Allow-Origin": "*",
        "Access-Control-Allow-Headers": "Content-Type, Origin",
        'Access-Control-Allow-Private-Network': 'true',
      },
      body: compressed.toString("base64"),
      isBase64Encoded: true,
    }

xsltProcess() 함수는 주로 다음으로 구성됩니다.

export const xsltProcess = async (sourceXml: string, xsltXml: string): Promise<string> => {
  return new Promise((resolve, reject) => {
    libxslt.parse(xsltXml, (err, stylesheet) => {
      if (err) {
        reject(err);
      } else {
        stylesheet.apply(sourceXml, {}, (err, result) => {
          if (err) {
            reject(err);
          }
          resolve(result);
        });
      }
    });
  });
}


그리고 그게 다야!

재미로 그리고 이 구현이 얼마나 일반적인지 보여주기 위해 VAST XML을 완전히 사람이 읽을 수 있는 HTML 페이지로 변환하는 XSLT을 작성했습니다.



here 을 클릭하여 결과를 확인하십시오.

아이빈 테크놀로지 소개



Eyevinn Technology는 비디오 및 스트리밍을 전문으로 하는 독립 컨설턴트 회사입니다. 플랫폼이나 기술 공급업체와 상업적으로 연결되어 있지 않은 방식으로 독립적입니다.

Eyevinn에서 모든 소프트웨어 개발자 컨설턴트는 오픈 소스 개발 및 오픈 소스 커뮤니티에 대한 기여를 위해 예약된 전용 예산을 가지고 있습니다. 이것은 우리에게 혁신, 팀 구성 및 개인 역량 개발을 위한 여지를 제공합니다. 또한 회사로서 오픈 소스 커뮤니티에 다시 기여할 수 있는 방법을 제공합니다.

Eyevinn에 대해 더 알고 싶고 여기서 일하는 방법을 알고 싶습니다. [email protected] 로 연락주세요!

좋은 웹페이지 즐겨찾기