Ani vejce nazmar: 7 receptů z vajíček natvrdo

5. 4. 2021

Sdílet

Autor: Shutterstock
Je tu každoroční velikonoční dilema, co s větším množstvím vařených vajec. Nabízíme několik méně známých tipů, třeba kulinářskou specialitu – tzv. skotská vejce, plněná vajíčka, ale také tu nej klasiku – oblíbenou vajíčkovou pomazánku.

Tradice zdobení vajíček je dávná a zachovala se dodnes. K tradici patří i to, že po Velikonočním pondělí se nám nashromáždí tolik vajec natvrdo, že jen tak na chleba s máslem je prostě nesníme. Kuchaři připravili několik tipů, kde můžeme velikonoční vajíčka výborně využít.

Co se dozvíte v článku
  1. Kvalitní bio suroviny
  2. Recept č. 1: Skotská vejce
  3. Recept č. 2: Plněná vejce s hráškovým pyré
  4. Recept č. 3: Lahodná vajíčková pomazánka
  5. Bez plýtvání
  6. Recept č. 4: Vejce ve sladkokyselém nálevu
  7. Recept č. 5: Smetanový hrášek s vejcem
  8. Recept č. 6: Salát z nových brambor s vejci
  9. Netradiční tradice
  10. Recept č. 7: Vajíčkový salát s olivami v pita chlebu

Kvalitní bio suroviny

Při výběru vajec odborníci doporučují zaměřit se na taková, která pocházejí z produkce ekologického zemědělství. Budete mít jistotu, že slepice žily v těch nejlepších přirozených podmínkách. Bio vejce lze koupit jak v supermarketech, tak přímo na ekofarmách. Řada z nich dnes své produkty prodává ve faremních obchodech nebo také pomocí tzv. bedýnkových systémů či přes e-shop.

Vejce z ekologického chovu, stejně jako jiné druhy potravin v bio kvalitě, spolehlivě poznáte jedině podle označení logem biolistu nebo biozebry na obalu, u vajec navíc podle kódu začínajícího číslicí 0 přímo na vajíčku. Právě první číslice na vajíčku označuje, jak byla slepice, která vejce snesla, chována.

I ostatní suroviny vybíráme s péčí, kvalitní surovina dělá dobré jídlo. Tipy, kde hledat, a přehled ekofarem najdete na kamprobio.cz a lovimebio.cz a další informace o ekologickém zemědělství, zajímavosti a tipy k bioprodukci na myjsmebio.cz.

Uvedené recepty pracují většinou se surovinami v bio kvalitě. Chceme-li podpořit lokální ekonomiku, není nám lhostejná příroda a životní prostředí, a navíc myslíme na budoucnost naši i našich dětí, měli bychom na to dbát zejména v uličkách mezi nákupními regály. Vhodným krokem, jak podpořit ekologické zemědělce, kteří přirozeně pečují o půdu, krajinu a hospodářská zvířata s maximální ohleduplností, je totiž nákup jejich bioproduktů. Tím, že zvolíte lokálního dodavatele, máte navíc jistotu, že bioprodukty neputovaly dlouhé kilometry přes půl světa. Distribuční cesty a dojezdové vzdálenosti jsou velmi krátké. To pomůže nejen přírodě, ale rovněž nám i budoucím generacím.

Recept č. 1: Skotská vejce


Autor: Shutterstock
  • 5 ks vajec uvařených natvrdo
  • 150 g mouky
  • 500 g mletého masa
  • špetka muškátového květu
  • špetka soli a pepře
  • 1 ks šalotky
  • hrst nasekané petrželky
  • 1 ks vejce čerstvé
  • 300 g strouhanky
  • brambory nebo chleba jako příloha

Vajíčka uvařená natvrdo oloupeme a obalíme v mouce. Dále si připravíme mleté maso, které okořeníme muškátovým květem, solí a pepřem. Na závěr přidáme šalotku a petrželku nasekané najemno. Masovou směs rozdělíme na 5 stejných dílů, ze kterých tvarujeme placičky. Na každou pak položíme vajíčko a touto masovou směsí ho zabalíme. Vytvarujeme koule, které obalíme v trojobalu tak jako klasické řízky. Koule smažíme namočené v oleji na pánvi nebo ve fritovacím hrnci asi 5 minut dozlatova. Podáváme s bramborem nebo za studena s chlebem a hořčicí.

Recept č. 2: Plněná vejce s hráškovým pyré


Autor: Shutterstock

8 kusů

  • 4 ks vajec uvařených natvrdo
  • ¼ hrnku hrášku
  • 1 ks česneku
  • 1 lžíce majonézy
  • šťáva z půlky citronu
  • špetka soli a pepře na dochucení

Vajíčka oloupejte, očistěte a vyjměte z nich žloutek. Tyčovým mixérem pak zapracujte hrášek (můžete čerstvý i sterilovaný), postupně přidejte žloutky, česnek nakrájený najemno, lžíci majonézy, citronovou šťávu, sůl a pepř na dochucení. Takto připravený krém dejte do zdobičky a naplňte jím přepůlená vejce.

Recept č. 3: Lahodná vajíčková pomazánka


Autor: Shutterstock
  • 8 ks vajec uvařených natvrdo
  • 120 g másla pokojové teploty
  • 2 lžičky hořčice
  • špetka soli a pepře
  • jarní cibulka a ředkvičky na ozdobení

Vajíčka uvařená natvrdo oloupejte a nakrájejte na drobné kostičky. Přidejte změklé máslo a hořčici. Vše promíchejte a výslednou směs dochuťte solí s pepřem. Před namazáním doporučujeme nechat odležet. Dle chuti můžete navíc přidat také nastrouhaný tvrdý sýr, žervé či trochu majonézy.

Bez plýtvání

Další recepty s vejci natvrdo připravila společnost Penny ve spolupráci s kuchařem Martinem Škodou. Společně se již třetím rokem věnují receptům z potravin, které zbyly a pravděpodobně by jinak skončily vyhozené v odpadkovém koši.

„Naše přebytečná velikonoční vejce ale tento osud díky následujícím třem receptům nepotká. Připravíme si společně vejce v kořeněné zeleninové marinádě, která za čtyři hodiny až čtyři dny natáhnou zajímavou chuť, zkusíme i českou klasiku s hráškem, a to jak v masové, tak vegetariánské variantě, a čeká nás i skvělý salát, který poslouží i jako příloha k masu,“ říká Martin Škoda a připojuje recepty, jak zužitkovat to, co by řada z nás třeba zbytečně vyhodila.

Recept č. 4: Vejce ve sladkokyselém nálevu

s červenou řepou a cibulí


Autor: Penny

4 porce

  • 6–10 vajec, vařených natvrdo

na nálev:

  • 400 ml vody
  • 200 ml octa
  • 4 lžíce krupicového cukru
  • 2 lžíce soli
  • 1 lžička kuliček černého pepře
  • 3 bobkové listy
  • 6 kuliček nového koření
  • snítka čerstvého kopru
  • 2 červené řepy, oloupané, nakrájené na kousky
  • 1 červená cibule, oloupaná, nakrájená na tenké plátky

k podávání:

  • sůl a pepř
  • majonéza nebo smetanový dip
  • snítky kopru
  • pečivo

Do hrnce dejte vodu, ocet, cukr, sůl, všechno koření, přidejte řepu, cibuli a vše krátce povařte. Nálev nechte trochu vychladnout.
Oloupaná vejce vložte do přiměřeně velké nádoby s uzávěrem a zalijte je nálevem. Nádobu zavřete a vejce v ní nechte marinovat aspoň 4 hodiny v lednici, radši ale několik dnů.
Pak vejce vyndejte, podélně rozpůlená rozdělte na talíře, kam přidejte z marinády i červenou řepu a cibuli. Mírně osolte a opepřete. Podávejte s majonézou či dipem, koprem a pečivem.

Recept č. 5: Smetanový hrášek s vejcem

a s máslovými bramborami


Autor: Penny

5 porcí

na hrášek:

  • 50 g hladké mouky
  • 50 g másla
  • 300 ml mléka
  • 500 ml vývaru
  • 250 ml smetany na vaření
  • 1 lžíce krupicového cukru
  • 1 lžíce octa
  • 500 g hrášku, čerstvého nebo mraženého
  • sůl a pepř
  • ½ lžičky mletého muškátového oříšku
  • 1 kg malých nových brambor
  • 60 g másla na omaštění brambor

k podávání:

  • 5 vajec natvrdo, ohřátých před podáváním a pak oloupaných a rozpůlených
  • (5 nožiček párků, nakrájených na kousky)
  • 2 lžíce rostlinného oleje

Nasypte do hrnce mouku a zahřívejte, jakmile se rozvoní, přidejte máslo a vymíchejte jíšku. Přilévejte postupně a za stálého míchání mléko a vývar a nechte probublávat aspoň 40 minut, aby se mouka provařila. Pak přilijte smetanu.
Do rendlíku vsypte cukr a nechte ho zkaramelizovat. Cukr nechte v rendlíku rozpustit na karamel, přilijte k němu ocet a nechte vyvařit na třetinu původního objemu.
Mezitím vsypte do omáčky z jíšky hrášek a nechte lehce provařit. Osolte, opepřete, ochuťte rozvarem z cukru a octa a přisypte muškátový oříšek.
Mezitím vydrhněte a uvařte brambory, slijte je, rozpulte, promíchejte v misce s máslem a osolte. Zahuštěný hrášek rozdělte do misek nebo talířů. Přidejte máslové brambory a vejce. Pokud by vám scházelo maso, opečte si na oleji třeba párky. Můžete ozdobit nasekanou pažitkou či petrželkou.

Recept č. 6: Salát z nových brambor s vejci

s okurkami, sýrem a dresinkem


Autor: Penny

4 porce

na brambory:

  • 1 kg menších nových brambor
  • sůl a čerstvě mletý pepř
  • 3 lžíce oleje
  • 80 g vyzrálého tvrdého sýru, např. Gran Moravia, nastrouhaného

na dresink:

  • 5 lžic oleje
  • 2–3 lžíce vinného octa
  • 1 lžíce tekutého medu
  • 1 lžíce hrubozrnné hořčice
  • 1 lžička dijonské hořčice
  • 10 malých okurek (kornišonů), nakrájených
  • 1 lžíce malých kaparů, nakrájených
  • 5 vajec natvrdo, oloupaných a nakrájených na kousky
  • svazek jarní cibulky, nakrájený na tenká kolečka
  • petrželka, nasekaná
  • pažitka, nasekaná

Uvařte brambory ve slupce v dobře osolené vodě – nikoliv doměkka, ale těsně před dovařením slijte, nechte trochu vychladnout a přepulte je.
Předehřejte troubu na 230 °C. Na plech vyložený pečicím papírem brambory rozprostřete, osolte je, opepřete, zakápněte olejem a pečte v troubě, až zezlátnou a budou křupavé. Nakonec je posypte sýrem a dopékejte, až se sýr rozpustí. Brambory můžete samozřejmě opéct také na grilu. Nemusíte je ani předem vařit, ale syrové se budou péct nejméně 25 minut.
Zatímco se brambory pečou, dejte se do dresinku. Smíchejte v misce olej, ocet, med a obě hořčice dohladka. Pak přidejte okurky, kapary, vejce, jarní cibulku a bylinky. Vše opatrně promíchejte a dochuťte solí a pepřem. Podávejte k bramborům.

Netradiční tradice

Sedmý recept na to, jak využít větší množství vajec (nejen po Velikonocích), pochází od šéfkuchaře Tomáše Kunovského ze Spa hotelu Lanterna ve Velkých Karlovicích. Jeho originální vajíčkový salát je rychlý, jednoduchý, skvěle chutná i vypadá.

„Jestliže chcete využít větší množství vajec uvařených natvrdo, vyzkoušejte jednoduchý recept na vajíčkový salát, který díky přidání chuťově výrazných zelených oliv a naplněním do pita chleba povýšíte na atraktivní pokrm. A pokud vám nevadí tučnější jídla, můžete k jogurtu přidat i trochu majonézy,“ doporučuje šéfkuchař.

Recept č. 7: Vajíčkový salát s olivami v pita chlebu


Autor: Spa hotel Lanterna Velké Karlovice

4 porce

  • 8 vajec uvařených natvrdo
  • 250 g řeckého bílého jogurtu (může být i klasický)
  • 20 ks zelených oliv
  • 3 snítky kopru
  • 2 zelené jarní cibulky
  • 10 ks ředkviček
  • sůl
  • bílý pepř
  • šťáva z ½ citronu
  • 4 ks pita chleba

Vajíčka nakrájíme na menší kostky a smícháme je s jogurtem. Přidáme nadrobno nakrájené olivy, kopr, jarní cibulku a ředkvičky. Osolíme, okořeníme bílým pepřem, jemně dochutíme citronovou šťávou a promícháme.

Hotovým vajíčkovým salátem naplníme pita chleby. Pokud nemáme k dispozici pita chléb, můžeme salát servírovat také na chlebu či bagetě.

Autor článku

Všeobecné dotazy, připomínky a tipy směřujte na adresu [email protected].

Tiskové zprávy zasílejte na e-mail [email protected].

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }
Upozorníme vás na články, které by vám neměly uniknout (maximálně 2x týdně).
'; document.getElementById('outstream-iframe').onload = function () { setupIframe(); } replayScreen = document.getElementById('iinfoOutstreamReplay'); iinfoOutstreamPosition = document.getElementById('iinfoOutstreamPosition'); outstreamContainer = document.getElementsByClassName('outstream-container')[0]; setupReplayScreen(); } function setupIframe() { outstreamDocument = document.getElementById('outstream-iframe').contentWindow.document; let el = outstreamDocument.createElement('style'); outstreamDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:-5px;right:25px}"; videoContent = outstreamDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; if ( location.href.indexOf('rejstriky.finance.cz') !== -1 || location.href.indexOf('finance-rejstrik') !== -1 || location.href.indexOf('firmy.euro.cz') !== -1 || location.href.indexOf('euro-rejstrik') !== -1 || location.href.indexOf('/rejstrik/') !== -1 || location.href.indexOf('/rejstrik-firem/') !== -1) { outstreamDirectPlayed = true; soundAllowed = true; iinfoVastUrlIndex = 0; } if (!outstreamDirectPlayed) { console.log('OUTSTREAM direct'); setUpIMA(true); } else { if (soundAllowed) { const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('OUTSTREAM sound allowed'); setUpIMA(false); }).catch(function () { console.log('OUTSTREAM sound forbidden'); renderBanner(); }); } } else { renderBanner(); } } } function getWrapper() { let articleWrapper = document.querySelector('.rs-outstream-placeholder'); // Outstream Placeholder from RedSys manipulation if (articleWrapper && articleWrapper.style.display !== 'block') { articleWrapper.innerHTML = ""; articleWrapper.style.display = 'block'; } // Don't render OutStream on homepages if (articleWrapper === null) { if (document.querySelector('body.p-index')) { return null; } } if (articleWrapper === null) { articleWrapper = document.getElementById('iinfo-outstream'); } if (articleWrapper === null) { articleWrapper = document.querySelector('.layout-main__content .detail__article p:nth-of-type(6)'); } if (articleWrapper === null) { // Euro, Autobible, Zdravi articleWrapper = document.querySelector('.o-article .o-article__text p:nth-of-type(6)'); } if (articleWrapper === null) { articleWrapper = document.getElementById('sidebar'); } if (!articleWrapper) { console.error("Outstream wrapper of article was not found."); } return articleWrapper; } function setupDimensions() { outstreamWidth = Math.min(iinfoOutstreamPosition.offsetWidth, 480); outstreamHeight = Math.min(iinfoOutstreamPosition.offsetHeight, 320); } /** * Sets up IMA ad display container, ads loader, and makes an ad request. */ function setUpIMA(direct) { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); if (direct) { adsRequest.adTagUrl = directVast; console.log('Outstream DIRECT CAMPAING advert: ' + directVast); videoContent.muted = true; videoContent.volume = 0; outstreamDirectPlayed = true; } else { adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Outstream advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; } // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = outstreamWidth; // adsRequest.linearAdSlotHeight = outstreamHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function setupReplayScreen() { replayScreen.addEventListener('click', function () { iinfoOutstreamPosition.remove(); iinfoVastUrlIndex = 0; outstreamInit(); }); } /** * Sets the 'adContainer' div as the IMA ad display container. */ function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. outstreamDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( outstreamDocument.getElementById('adContainer'), videoContent); } function unmuteAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } } /** * Loads the video content and initializes IMA ad playback. */ function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(outstreamWidth, outstreamHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } /** * Handles the ad manager loading and sets ad event listeners. * @param { !google.ima.AdsManagerLoadedEvent } adsManagerLoadedEvent */ function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } /** * Handles actions taken in response to ad events. * @param { !google.ima.AdEvent } adEvent */ function onAdEvent(adEvent) { // Retrieve the ad from the event. Some events (for example, // ALL_ADS_COMPLETED) don't have ad object associated. const ad = adEvent.getAd(); console.log('Outstream event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: // This is the first event sent for an ad - it is possible to // determine whether the ad is a video ad or an overlay. if (!ad.isLinear()) { // Position AdDisplayContainer correctly for overlay. // Use ad.width and ad.height. videoContent.play(); } outstreamDocument.getElementById('adContainer').style.width = '100%'; outstreamDocument.getElementById('adContainer').style.maxWidth = '640px'; outstreamDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); // This event indicates the ad has started - the video player // can adjust the UI, for example display a pause button and // remaining time. if (ad.isLinear()) { // For a linear ad, a timer can be started to poll for // the remaining time. intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } outstreamDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (outstreamLastError === 303) { if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } } break; case google.ima.AdEvent.Type.COMPLETE: // This event indicates the ad has finished - the video player // can perform appropriate UI actions, such as removing the timer for // remaining time detection. if (ad.isLinear()) { clearInterval(intervalTimer); } if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } break; } } /** * Handles ad errors. * @param { !google.ima.AdErrorEvent } adErrorEvent */ function onAdError(adErrorEvent) { // Handle the error logging. console.log(adErrorEvent.getError()); outstreamLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { renderBanner(); } } function renderBanner() { if (isBanner) { console.log('Outstream: Render Banner'); iinfoOutstreamPosition.innerHTML = ""; iinfoOutstreamPosition.style.height = "330px"; iinfoOutstreamPosition.appendChild(bannerDiv); } else { console.log('Outstream: Banner is not set'); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoOutstreamPosition.remove(); outstreamInit(); } else { return false; } adVolume = 1; return true; } /** * Pauses video content and sets up ad UI. */ function onContentPauseRequested() { videoContent.pause(); // This function is where you should setup UI for showing ads (for example, // display ad timer countdown, disable seeking and more.) // setupUIForAds(); } /** * Resumes video content and removes ad UI. */ function onContentResumeRequested() { videoContent.play(); // This function is where you should ensure that your UI is ready // to play content. It is the responsibility of the Publisher to // implement this function when necessary. // setupUIForContent(); } function onActiveView() { if (outstreamContainer) { const containerOffset = outstreamContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (outstreamPaused) { adsManager.resume(); outstreamPaused = false; } return true; } else { if (!outstreamPaused) { adsManager.pause(); outstreamPaused = true; } } } return false; } let outstreamInitInterval; if (typeof cpexPackage !== "undefined") { outstreamInitInterval = setInterval(tryToInitializeOutstream, 100); } else { const wrapper = getWrapper(); if (wrapper) { let outstreamInitialized = false; window.addEventListener('scroll', () => { if (!outstreamInitialized) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { outstreamInit(); outstreamInitialized = true; } } }); } } function tryToInitializeOutstream() { const wrapper = getWrapper(); if (wrapper) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { if (cpexPackage.adserver.displayed) { clearInterval(outstreamInitInterval); outstreamInit(); } } } else { clearInterval(outstreamInitInterval); } } }
OSZAR »