Bubliny jim změnily život. Živí je líp než reklama

13. 11. 2017
Doba čtení: 8 minut

Sdílet

Ilustrační obrázek
Autor: Karel Choc, Internet Info, podle licence: Rights Managed
Ilustrační obrázek
Dá se podnikat s tak obyčejnou a zbytnou věcí, jakou je bublifuk? Ano. A docela dobře. Tvrdí to dvojice, která si vybudovala slušnou živnost na bublinách.

Největší chybou bylo to, že jsme reklamní agenturu neprodali už dřív. Tak mluví Petra s Matějem, kteří se začali živit bublinovou show a prodejem bublifuků.

Na samém začátku tohoto příběhu bylo vystoupení amerického bublináře v Manéži Bolka Polívky. Na show tehdy Matěje upozornil jeho kamarád. Protože v nich zanechala silný dojem, začali se o bubliny zajímat víc a rozhodli se vytvořit nový světový rekord v počtu lidí uzavřených do mýdlové bubliny. Psal se rok 2005, disciplína byla ještě v plenkách a překonání počtu tří lidí v bublině vlastně nebylo nic až tak těžkého. Matěj začal trénovat a po nějaké době dostal na festivalu rekordů a kuriozit do jediné bubliny hned 15 lidí. Ze světového prvenství se ale neradoval dlouho. Po čtvrt roce bylo překonáno jinými nadšenci a zdálo se, že jeho sláva měla stejně dlouhou životnost, jakou mají právě mýdlové bubliny. Jenže Matěj se nehodlal vzdát a společně se svou obchodní partnerkou Petrou se rozhodl věnovat se bublinám dál a mnohem intenzivněji. A vyplatilo se. Dnes mají vlastní agenturu i specializovaný e-shop Megabublina.cz

Bublinová vystoupení měla u lidí úspěch a Matěj s Petrou objížděli jednu kulturní akci za druhou. Vedle toho ale pořád provozovali malou reklamní agenturu. Ve dne jsme se věnovali reklamě a večer vyráželi na vystoupení, ze kterých jsme se vraceli pozdě v noci. Hodně nás to vyčerpávalo, a protože jsme v bublinách viděli budoucnost, jednoho dne jsme se rozhodli věnovat jenom jim, říká Matěj Kodeš. Lidé z jejich blízkosti takové rozhodnutí nechápali a zrazovali je od toho. Jenže Petra s Matějem to viděli jinak. A jak se záhy ukázalo, prodej agentury byl tím nejlepším řešením. Byli jsme jednou z mnoha malých agentur a den co den čelili početné konkurenci. Jen u nás v Lysé nad Labem jsme byli na jedné ulici tři a v podmínkách maloměsta to na žádný velký byznys nevypadalo. Bubliny měly naopak velký potenciál, proto dávalo smysl agenturu pustit a stát se profesionálními umělci, dodává Petra Škývarová.

Na jar zapomeňte, profi směs vzniká v laboratoři

Zatímco dnes se dají triky okoukat z Youtubu a návody načíst na internetu, na začátku nového milénia to tak snadné nebylo. Matěj musel jít vlastní cestou a jednotlivá čísla si vymýšlet. Na to, aby poctivě trénoval a byl kreativní, dohlížela Petra, která se stala řídicí jednotkou dvojice. Starala se o kompletní produkci, vyřizovala objednávky, připravovala promo materiály, spravovala webové stránky. Ne nadarmo se říká, za vším hledej ženu. Matěj tak měl dost času na nácvik i samotná vystoupení. S odstupem času vnímá dvojice právě tuto spolupráci jako velkou výhodu, díky níž získala náskok před ostatními. Lidí, kteří něco umí a chtějí svůj talent prodat, je dost. Spousta z nich ale nezvládá činnost, která se k vystupování logicky váže. Nemají na to čas, mnozí bývají nespolehliví a jejich jednání nemá s profesionalitou vůbec nic společného. My měli hned od začátku své role jasné a díky tomu zvládali všechno tak, jak jsou organizátoři akcí od profesionálních umělců zvyklí, vysvětluje Petra Škývarová.

Jednou z největších výzev bylo vyvinout ideální bublinovou směs. Ze začátku Matěj postupoval metodou pokus-omyl. Když už vytvořil kapalinu, z níž mohl tvořit opravdu velké bubliny, byla nestálá, rychle se kazila a zapáchala. Jiné směsi zase nefungovaly na akcích, kde organizátoři pro větší efekt dýmili. Dnes už Matěj ani nechápe, jak mohl před lety vystupovat se směsí, která dnes neobstojí ani při workshopech pro děti. A stejně se prý bude divit i za deset let. Vývoj kapaliny je z mnoha důvodů nikdy nekončící proces. Kapalina musí být samozřejmě zdravotně nezávadná. Zároveň nesmí dělat fleky na podlaze ani oblečení. Vystupoval jsem pro jedny z nejbohatších lidí světa, kteří na sobě měli oblečení za statisíce. Nemůžu si dovolit jim ho zničit. A protože jsou bublifuky dětskou hračkou, musíme splňovat i bezpečnostní normy Evropské unie, které se neustále zpřísňují. Do vývoje směsi nás tedy tlačí i legislativa, komentuje Matěj Kodeš. Výroba bublinových směsí je v profesionálním pojetí čistě laboratorní prací a každý bublinář používá svou originální kapalinu. Tu s momentálně nejlepšími vlastnostmi Matěj používá při svých vlastních vystoupeních, jiné pak slouží na workshopech nebo jako náplně bublifuků na prodej.

Nepodcenit přípravu směsi je základ pro každého bublináře. Nebo by mělo být. Matěj vzpomíná na vystoupení v Kataru, kde se setkal s jiným zahraničním kolegou. Ten se mu posmíval, když čekal na dodávku destilované vody, aby si mohl připravit roztok, a upozorňoval pořadatele, že bez ní vystupovat nebude. Lehkomyslný zahraniční bublinář si připravil nekvalitní směs z místní kohoutkové vody a pohořel. Odvedl velice špatné vystoupení a nakonec Matěje žádal o pomoc. Ukázalo se, že přípravě kapaliny vůbec nerozumí a neví, co a proč do ní dává. Prostě jen zkoušel recepturu z internetu. Takových lidí je spousta. Nabízejí se za nižší honoráře, ale jejich vystoupení nemají úroveň. Často je zaskočí i drobnost. Já nesnáším být nepřipravený a vždycky mám v záloze i nějakou nouzovou variantu, dodává český bublinář.

Se svou show už vystupoval na řadě míst doma i ve světě. Nejvíc si užil tříměsíční angažmá v čínském Hongkongu. Udělat denně tři vystoupení bylo sice náročné, ale s odstupem času na to vzpomíná rád. Zažil si život opravdové hvězdy, denně dával rozhovory do televizí a novin, jeho fotkami byla polepená celá jedna linka metra. A asijské publikum bylo nadšené. Asiati jsou úplně jiní než lidé v Evropě a reagují fantasticky. Takové reakce mě nabíjí, kvůli tomu to dělám. Stejně tak si užívám momenty, kdy mě s úžasem sledují generální ředitelé nadnárodních společností a další vysoce postavení lidé, kteří už viděli leccos a jen tak něco už je nepřekvapí, říká Matěj Kodeš s tím, že dvě třetiny vystoupení dělá pro dospělé publikum. A Petra Škývarová dodává: Bubliny jsou vnímány jako pozitivní a uklidňující. Při naší show se jen kocháte a necháváte překvapovat. Není to žádné drama, ale oddychová podívaná. I to je důvod, proč jsou z ní dospělí tak nadšení.

Matěj je držitelem několika světových rekordů, které potvrdila nejen tuzemská Agentura Dobrý den, ale i Guinessova kniha rekordů. Mimo jiné je zapsán jako ten, který do jediné bubliny uzavřel 275 lidí. Takové výkony jsou samozřejmě důkazem profesionality a zvyšují prestiž umělce. Hodně si na to potrpí především v Asii. Samotný zápis do Guinessovy knihy rekordů ale podle Petry a Matěje bývá náročnější než rekordní kousek provést. Vydavatelství knihy si klade množství podmínek a také to není nic laciného. A protože bývají rekordy často překonané, v podstatě se to skoro nevyplatí.

E-shop, který si vyžádali sami zákazníci

Vedle vystupování se Petra s Matějem věnují také svému e-shopu s bublifuky. I ten během let prodělal zásadní změny. Na začátku s sebou dvojice vozila na vystoupení jen pár obyčejných bublifuků nakoupených v hračkárnách a prodávala jich pár desítek kusů. V roce 2008 jsme spustili e-shop Bublifuky.cz, kde jsme nabízeli kvalitní bublifuky z Rakouska a Číny. Jenže lidem malé bublifuky nestačily. Ptali se po těch na velké bubliny, nebo aspoň po receptuře na kapalinu. Ne každý má totiž na to, aby si pozval bublináře na soukromou oslavu. A jiní si prostě chtějí pohrát. Objevili jsme díru na trhu a na to konto v roce 2011 udělali upgrade a na doméně Megabublina.cz spustili novou verzi e-shopu. Kromě potřeb na vytváření velkých bublin nabízíme i nejrůznější zajímavé bublifuky, které objevíme na veletrzích. Nevýhodou je, že jde o sezónní zboží. Prodáváme především od dubna do září. Pak poptávka rapidně klesá. V sezóně je ale tak velká, že už na vyřizování objednávek sami nestačíme a museli jsme to přenechat externí firmě. To bylo další skvělé rozhodnutí, protože se objednávky vyřizují profesionálně. Chybovost je v podstatě nulová, což se při odbavování z domova zaručit nedá. V době, kdy jsou zákazníci zvyklí na vysokou úroveň servisu, kterou nastavily Alza nebo Mall, to považuji za velmi důležité i u menšího e-shopu našeho typu, říká Petra Škývarová.

Jak v české, tak slovenské verzi e-shopu je možné objednat si bublifuky na míru s vlastní etiketou. Jejich navrhování se ve volném čase věnuje Matěj. Tisk zajišťuje kamarád, který od Petry s Matějem kdysi převzal reklamní agenturu. Bublifuky jsou k dostání s originální kapalinou, za kterou Petra s Matějem ručí. Podle vlastní receptury si ji nechávají vyrábět a do skladu už dováží hotové naplněné bublifuky. I když o tom přemýšlíme stále častěji, zatím nemáme vlastní výrobní linku. Vyplatí se nám spolupracovat na dálku a výrobu zadat. Naši partneři jsou spolehliví a vždycky od nich dostaneme zboží v perfektní kvalitě. Bylo by asi praktičtější mít vlastní výrobnu, na kterou můžeme dohlížet, ale na druhou stranu bychom na sebe vzali velký závazek v podobě zaměstnanců. Kdyby se bublifuky přestaly prodávat, museli bychom je propouštět. U našich dodavatelů to nehrozí, ti by jen své lidi převedli na jinou práci, říká Matěj Kodeš.

Školení pro účetní - podzimní novinky

Jak je vidět, úspěšně podnikat se dá i s něčím tak postradatelným a jednoduchým, jako je bublifuk. Jen je potřeba to vzít za správný konec a věnovat rozvoji firmy veškeré úsilí. Dnes už jsou Petra s Matějem na takové pozici, že si je na své akce najímají firmy světových jmen i filmové produkce. Práci dokážou dát nejen lidem, kteří pro ně zajišťují výrobu a distribuci bublifuků, ale také partě animátorů obstarávající bublinové workshopy. Díky tomu mají čas na vymýšlení nových a nových triků, komunikaci s produkcemi a tak dále. Svá vystoupení dodávají takzvaně na klíč, mají vlastní světelnou a zvukovou aparaturu, velký stan pro venkovní akce a hlavně chuť a ochotu splnit přání klientů. Ke stále lepší práci nás motivuje i to, že chceme být jedineční a mít díky tomu možnost určovat podmínky. To v reklamě nebylo možné. Zákazníci věděli, že je v tom oboru velká konkurence, tlačili na cenu a 90denní splatnost faktur byla zcela běžná. S bublinovou show je to přesný opak a i díky tomu můžeme neustále investovat a zlepšovat se, říká Petra Škývarová.

Do budoucna mají několik cílů. Rádi by zvedli prodeje bublifuků na takovou míru, aby se už vyplatilo vybudovat vlastní provoz a nemuseli tak být na nikom závislí. A po vzoru umělců z USA by také rádi vytvořili celovečerní show, kterou by pravidelně jednou nebo dvakrát měsíčně předváděli v některém z divadel.

Zajímá vás toto téma? Chcete se o něm dozvědět víc?

Objednejte si upozornění na nově vydané články do vašeho mailu. Žádný článek vám tak neuteče.


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