Jak se naučit míchat vlastní koření? Základem je paprika, chilli a kvalitní pepř, říká pražský kořenář

Sdílet

Jan Schneedorfer
Autor: Království chuti
Jan Schneedorfer
Nebojte se experimentovat a namíchejte si svoji směs grilovacího koření, radí kořenář Jan Schneedorfer z Království chuti. Jenže jak se v koření vyznat a jak s mícháním směsí začít?

Když se podíváte v obchodech do sekce s kořením, bude vás přecházet zrak. Jednodruhové střídá směs na kuře, čínu či rybu a na grilovanou zeleninu. Směs sušených bylinek doplňuje koření v bio kvalitě nebo to bez soli. V baleních malých, středních i v mlýnku, v celku i namleté. Vybrat si musí každý. A kdo si nevybere, ten je vítán u Jana Schneedorfera z Království chuti v pražských Nuslích, který dokáže poradit s kdejakou směsí koření. I s takovou, která nám připomene dovolenou v Řecku nebo v Jižní Americe.

Jak koření pro grilování použít, abychom dosáhli nejlepšího výsledku?

Pro perfektní výsledek je důležité koření nespálit, což se při vysokých teplotách při grilování, kdy gril dosahuje teploty i okolo 250 °C, může snadno stát. Grilovací koření je proto ideální použít do marinád nebo až v samém závěru grilování. Minimalizujeme tak riziko, že se nám koření spálí a zhořkne, o což nikdo určitě nestojí.

Jinak je to u barbecue, které spousta lidí bere jako ekvivalent pro grilování. Barbecue je specifický způsob přípravy potravin na grilu, pro něhož je typická nízká teplota a dlouhá doba přípravy, která může trvat i několik hodin. Jídlo se tak víc udí než griluje, a proto má příznačnou kouřovou chuť. V tomto případě o spálení koření mít strach nemusíme.

Jaká je optimální doba pro marinování? Je například jiná doba u ryb a u hovězího?

Maso marinujte v lednici ideálně přes noc, aby stihlo převzít chuť i vůni koření a bylinek, ale nezapomeňte, že maso by mělo být celé ponořené v marinádě. Zhruba hodinu před grilováním maso vyndejte z lednice a zbavte ho přebytečné marinády. Zabráníte teplotnímu šoku a přepalování odkapávající marinády. To neplatí pro ryby a dary moře, ty vyndávejte opravdu těsně před grilováním, toto maso totiž velmi rychle podléhá zkáze. Pro přípravu marinád použijte oleje s vysokým kouřovým bodem (slunečnicový, řepkový, popř. olivový po prvním lisování).

Říká se, že když je dobrý steak, tak si vystačíme s pepřem a solí. Platí to, nebo máte jiný názor?

Když se rozhodneme dělat steaky, tak si zpravidla dopřejeme prvotřídní maso. Podobné smýšlení bychom měli mít o koření. I sůl a pepř lze pořídit ve výběrové kvalitě a chuťově jedinečné podobě. Jen pepřů existují celosvětově stovky druhů. Jednou z mnoha pepřových specialit je například indický Malabar, známý též pod názvem tygří pepř. Jedná se o příjemně pálivý černý pepř s ovocným aroma. Za vyzkoušení stojí určitě i indonéský pepř Lampong, ve kterém objevíte tóny čerstvého dřeva s pryskyřičným pozadím.

Pepřů existují celosvětově stovky druhů, vybírejte z těch kvalitních. Odrazí se to na chuti výsledných jídel

Autor: Království chuti

Výjimečný chuťový zážitek si připravíte i s bourbonským či grapefruitovým vysokohorským pepřem, který patří k nejvzácnějším pepřům světa. V aroma grapefruitového pepře na první ochutnání zaznamenáme kombinaci grapefruitu, limetky, meduňky a pomela, které doplňuje v jemných hořkých tónech mírná kořenitost. Roste v odlehlých oblastech na úpatí Himalájí. Skvěle se hodí k rybám, mořským plodům a drůbeži, ale své uplatnění najde i ve sladké kuchyni pro použití při přípravě dezertů, pečiva, dortů, nebo se jím koření sladké ovoce.

Zmiňovaný bourbonský pepř je divoce rostoucí pepř s výraznými oříškově jehličnatými tóny, který vyniká ostře pálivou chutí. Místo klasické kamenné soli bych doporučil použít např. mořskou fleur de sel nebo maldonskou sůl. Tyto soli se skládají z nadýchaných krystalků, které zajímavě vypadají a velmi dobře se dávkují. Nehrozí tak přesolení masa.

Grilování je celosvětově velmi rozšířená úprava. Grilujeme v Česku s jinými druhy koření než třeba v Jižní Americe?

Určitě. Když bych to vzal namátkově podle světadílů. V Argentině byste narazili na asado, které označuje jednak argentinský způsob grilování a jednak i typickou neostrou směs koření, kde v základu nesmí chybět paprika, petržel, cibule, pepř či mrkev. Ke steaku si pak ještě pro podpoření gurmánského zážitku připravte argentinskou omáčku chimichurri. Základ tvoří vinný ocet s olivovým olejem a stejnojmenná směs koření, kde nechybí například petržel, oregano, česnek či pepř.

A s čím grilují například na severu Ameriky?

Velmi rozšířené je tam barbecue, takže by jim určitě přišla vhod směs kouřové barbecue. Směsi koření, jako je paprika sladká, česnek, či černý pepř, korunují kouřové přísady jako kouřové chilli Chipotle, uzená paprika či uzená sůl. Ale kouřového efektu tak dosáhnete, i když grilujete na plynovém či elektrickém grilu.

Napadá mě, zda se griluje i v horkých státech, jako je Afrika nebo Balkán. Mohu chuť jejich jídel přivát i na svoji grilovačku v Česku?

Vyzkoušejte chakalaku. Jedná se o oblíbené zeleninové jídlo černošských horníků v Johannesburgu v polovině 20. století, které se skvěle hodí k opečenému masu. Dušená zelenina s různorodou konzistencí od dipu po polévku se podává jak teplá, tak studená. Receptury se různí, nicméně základem je zelenina jako rajčata, papriky, mrkev a fazole v rajčatové omáčce. Pikantnost dodává velké množství koření, kde nechybí kurkuma, chilli, kmín, zázvor, česnek či koriandr, které doplňuje sušená zelenina.

Závanu Balkánu docílíte směsí koření Čubrica, popř. Adžika, ve které najdete například pískavici, majoránku, bazalku, pálivou a sladkou papriku či koriandr a česnek. Jedná se o směs původem z Gruzie a vynikne na jehněčím nebo ve mletém mase.

Mícháte si vlastní koření?

Když zmiňujete tu pískavici, to je jedno z koření, o němž se říká, že původně pochází z Indie, měl byste pro nás tip i na nějaké orientální koření?

Pro přípravu grilovaných tandoori kuřecích paliček se neobejdete bez Garam Masály a Tandoori Masály. Zatímco v severní Indii má směs Garam Masála především práškovou formu, tak v jižní části Indie se více používá Garam Masála ve formě pasty, kterou si jednoduše připravíte z kombinace octa a kokosového mléka.

Masála se od oblasti k oblasti či dokonce od rodiny k rodině liší. Receptura v základu směsi má velmi často skořici, černý pepř, muškátový ořech, hřebíček, kardamom, chilli, fenykl, bobkový list, kurkumu a koriandr. Ve směsi Tandoori Masály najdete zase třeba koriandr, zázvor, česnek, kurkumu, chilli či římský kmín.

Dovedu si představit, že děti bychom takto kořeněným jídlem nepotěšili, takže jaké jemnější koření vybrat pro nejmenší členy rodiny?

Děti bývají senzitivní na štiplavost a pálivost, tzn. sáhněte po sušené zelenině a nepálivých druzích koření. Pro namíchání grilovací směsi můžete použít sušenou karotku, pastiňák, nať z petržele, kmín, sladkou papriku, cibuli, kurkumu, rozmarýn či oregano. Pokud si směs namícháte sami, tak můžete ovlivnit množství použité soli.

V koření pro děti najdete hlavně sušenou zeleninu a jemnější druhy koření

Autor: Království chuti

To sice ano, ale namíchat si vlastní směs koření stojí dost práce, člověk se musí trochu vyznat, je opravdu lepší si namíchat vlastní koření? Proč, mimo jiné?

Ano, souhlasím, že odhadnout množství jednotlivých přísad, abyste dosáhli harmonického chuťového výsledku a podtrhli specifika daného koření, není tak snadné, jak by se mohlo zdát. Koupením již namíchaných směsí určitě nešlápnete vedle. Ale směsi mohou obsahovat ingredience, které vám nemusí vždy vyhovovat.

Proto bych já osobně preferoval vlastní směs, protože přesně víte, co jste použili za suroviny a v jaké kvalitě a obejdete se bez nadbytečné chemie. Potravináři často konzervanty, stabilizátory, barvivy a umělými aromaty nešetří. Domácí dresinky a čatní vás vyjdou na zlomek ceny těch kupovaných a připravíte si takové množství, které potřebujete. Čatní můžete dokonce i sterilovat a mít uskladněné i několik měsíců.

Jak připravit originální čatní vhodné k masu a sýrům?

Základem originálního indického čatní je rozvařené ovoce či zelenina (papriky, jablka, cukety, švestky, rajčata apod.) a samozřejmě nezbytné koření, kterým se nešetří.

Čatní z červené cibule: červená cibule, česnek, černý pepř Lampong, tymián, cukr a portské víno

  • Na oleji nechte zesklovatět cibuli, přidejte koření, cukr a portské a vařte tak dlouho, až cibule změkne a směs má konzistenci sirupu. Podávejte po vychladnutí.

Mangové čatní: Mango, zázvor, hořčičná semínka, skořice, koriandr, pálivé chilli kroužky, šafrán

  • Na oleji osmahněte koření, přidejte mango a směs rozvařte. Plňte do sklenic a sterilujte, nebo po vychladnutí konzumujte.

(Pro přípravu dresinků vystačíte s bílým jogurtem, zakysanou smetanou či tvarohem, které opět individuálně dochutíte kořením a bylinkami.)

A existuje nějaká snadno zapamatovatelná rada, jak s mícháním koření začít?

Doporučuji začít základem, jako je paprika, chilli (např. Chipotle = červené chilli papričky Jalapeño s kouřovým aroma), nějaký kvalitní pepř (třeba indonéský Lampong), česnek a cibule a postupně přidávat další ingredience. Také doporučuji si psát poměry koření, které do směsi dáváte, abyste v zápalu experimentování neměli chuťově skvělou směs, ale bez receptury.

U nás v obchodě například najdete více než sto dvacet druhů jednodruhového koření, které vám pro začátek určitě bude stačit a pro vaše experimentování u nás můžete kupovat koření na váhu už od 10 g. Navíc máme, troufám si říct, přehledně zpracované složení kořenicích směsí, což může být pro ty, co si chtějí sami směs namíchat, dobrá inspirace, a jsme připraveni s výběrem poradit.

Jan Schneedorfer

Se svojí ženou Michaelou vlastní a provozuje obchod s kořením, kávou a čajem v pražských Nuslích.

Autor článku

Redaktorka serveru Vitalia.cz se zaměřuje zejména na kvalitu potravin a kvalitu jejich prodeje. Věnuje se také zdravotní problematice.

'; 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 »