Od malého zápichu po velké stromy života. Jak se Katka učila drátenictví?

11. 2. 2025
Doba čtení: 8 minut

Sdílet

Katka bere do ruky kleště a kus drátu každý den a jak přiznává, pořád se má co učit. Nejraději tvoří výrobky s přírodními motivy. Seznamte se s ní.

Kateřina Solčanová se drátkování věnuje už deset let. Svou tvorbu z drátku prezentuje pod názvem Prajzulka. Její výrobky získaly certifikát a právo používat regionální značku OPAVSKÉ SLEZSKO regionální produkt.

Co se dozvíte v článku
  1. Metodou pokus omyl
  2. Náročná práce pro ruce
  3. Zásoba drátů i doplňků
  4. Inspirace v hlavě i od zákazníků
  5. Oblíbené dárky pro štěstí
  6. Sen nejen o dílně
  7. Tip na další příběh

Metodou pokus omyl

Drátkovat začala Kateřina v roce 2014. Od roku 2012 je doma, protože zůstala na invalidním vozíku. S mamkou tehdy v jejím bydlišti začala navštěvovat kurzy tvoření, kde se s holkami domluvily, že je budou pořádat. První kurz, na který se přihlásila, bylo právě drátkování. Vůbec se jí tam tehdy nechtělo. Oplétali jsme sklenice měděným drátkem, který je měkčí než ten černý, tak to vesměs šlo. Ten moment byl rozhodující. To jsem se do toho zamilovala a pak už to šlo nějak samo, říká na úvod s úsměvem.

O drátkování existují knížky, které se už dnes nedají koupit. Naštěstí je mamka knihovnice, takže jsem si je nechávala z opavské knihovny poslat a některé si doma skenovala, přiznává Katka s tím, že v knížkách se nedočtete úplné základy a ani vám je nikdo neřekne. Například jak správně ošetřovat drát. Každý má totiž svůj „fígl“. Ani dráteníci na trzích nechtěli prozradit svá tajemství. Hodně jsem četla, ale spíše o historii a malých základech, jinak to byl pokus omyl a muselo mi to nějak přijít do ruky, dodává.

Jako první Kateřina vyrobila zápich, a to podle papírů. Nakreslila si tvar a poté jej vymodelovala a opletla různě perličkami. Na to si však už moc nepamatuje, ale vybavuje si, jak se dala do většího díla v podobě koše. Udělala jsem takový závěsný koš na květinu. Předminulý rok jsem ho objevila zaprášený ve sklepě. Předtím jsem z toho měla strašnou radost, ale teď jsem se musela hodně smát. Je křivý, ale pěkný, popisuje se smíchem.

Prajzulka je tedy samouk a pořád se něčemu učí. Například dodneška nepřišla na to, jak dostahovat takzvané krucánky. Teorii zná, ale v praxi jí to pořád nejde. Pořád je podle ní v čem se zdokonalovat. Moc bych se chtěla naučit dělat koše, mísy a lucerny. Na to člověk potřebuje víc času, který já nemám. Je to můj sen, prozrazuje.

Náročná práce pro ruce

Co se týče úrazů, Kateřina má naštěstí brýle, takže se nemůže píchnout do oka. Velké úrazy však u drátkování nejsou. Člověka spíš bolí ruce, trpí na karpály nebo se může píchnout. Já jsem si kolikrát vzala drátek k televizi, manžel se díval na film a nadával, že jsem ho píchla drátem do hlavy, říká s úsměvem a doplňuje, že je to nebezpečné spíše pro okolí. Občas tedy může kousek drátu odstřelit, ale je to hlavně těžká práce a zápřah pro ruce. Pro drátenice, které pracují s více perličkami, je to více manuální a titěrné, ale každý si u toho najde svoje. Když je toho moc, tak to můžete odložit a začít dělat třeba jiný výrobek, kdy si ruce odpočinou. Ale já u toho vydržím dlouho, přiznává Katka.

S automatickou až rutinní prací versus větším soustředěním je to podle Kateřiny půl na půl. Například u ptáčků si může zapnout seriál a postupuje automaticky. Ale kde je navlékání nebo složitější tvary, tam se musí soustředit. Jako relax a odpočinek to mám pořád. Od toho dennodenního zápřahu, kdy si tady sednu a mám klid. Jsem ráda, že můžu dělat práci, která je koníčkem a není to povinnost. Takovou práci člověk musí dělat od srdce a s radostí, protože na těch výrobcích by to jinak bylo vidět, zdůrazňuje.

Když se při drátkování udělá velký uzel nebo je drát už moc ohnutý a chtěli byste ho narovnat, nejde to. Už nikdy nebude tak rovný a z 80 % se musí vyhodit. Ve většině případů se však, když se něco nepovede, s drátkem dá dále pracovat. Jen výsledek například nebude tak košatý, ale bude úzký. Pokud však chce zákazník určité rozměry, ty je nutné dodržet. Když se udělá chyba, letí výrobek do koše. Nebo si ho nechám bokem, začnu znovu a ten si pak přizpůsobím, jak se mi to líbí, vysvětluje Katka.

Zásoba drátů i doplňků

Základem při drátkování jsou kleště, a to jak štípací, tak ploché nebo kulaté. Katka má také kulatá dřívka různých průměrů, když si potřebuje dělat spirálky. Nebo když potřebuje udělat velký kruh na strom, používá misku, aby to neměla šišaté, a také různé lahve od olejů nebo sprejů. Tedy co doma najde a může si z toho udělat nějakou konstrukci. Tvary si však dělá vždy v ruce.

Dále má Kateřina asi osm druhů drátů, od nejtenčích po nejhrubší. Rozmezí je od 0,5 milimetru až po 2,2 milimetru. Materiál se snažím shánět od českých výrobců. Perličky beru z Jablonce. U nás na Ostravsku jsem sehnala přímo drátovnu, kde si objednávám, co potřebuji, doplňuje. Občas si něco objedná i z Polska. Také používá plastové lístečky na velké stromy, protože jsou lehčí než sklo a mohlo by se to bortit. Navíc skleněný lístek nemá tak pěknou barvu jako ten plastový. U velkých konstrukcí, jako jsou stromy o průměrech 47 nebo 35 centimetrů, si nechává Prajzulka základ dělat přímo u kováře. Ten ho vyrobí z hrubého drátu. Čím větší výrobek, tím je potřeba pevnější konstrukce, a to už je drát, který by v ruce neohnula.

Drátů má Kateřina doma velkou zásobu, a to kolem 100 kilogramů. „Někdy se totiž stane, že když přijdu do drátoven nebo do fabriky, odejdu bez drátů, které jsem potřebovala. Obyčejný černý drát rád rezaví, a když je tam té rzi moc, tak s ním pracovat nejde. Takže se někdy stane, že některé průměry nejsou,“ popisuje s tím, že je poučena a kupuje si velké množství. Manžel mi hodně pomáhá. Když jede z práce, staví se tam a něco vezme. Mám zásoby, aby mi drát nedošel a nemusela jsem odmítat zakázky, dodává.

Také u korálků a lístečků musí mít Katka pořád doma klasickou bílou, červenou a zelenou. Dělá si barevné mixy, protože ne každý má rád růžovou nebo modrou a podobně. Snaží se, aby měla od nějaké barvy tři, čtyři odstíny, ale základ je bílá a červená. Problém je, že na internetu nevidíte odstín korálků. Fotka neukáže skutečnou barvu. Když navštěvuji veletrhy, vždycky se snažím nakupovat to, co se mi líbí, a podle toho si dělám vzorník, prozrazuje Katka. Jablonec má relativně z ruky, a tak se musí spoléhat právě na internet nebo nakupovat na akcích. 

Inspirace v hlavě i od zákazníků

Kateřina říká, že inspiraci má pořád v hlavě, akorát není čas na její uskutečnění. Dělá to totiž sama a opravdu to zabírá dost času. Není to tak, jak si spousta lidí myslí, že jen vezmete kousek drátku, vymodelujete to a máte hotovo, že to nic není, podotýká. Hodně ji inspirují zákazníci, kteří něco potřebují, například na narozeniny nebo svatbu. Zákazník řekne, jak by si to představoval, spojí se jeho a moje myšlenky a dáme to do kupy. Vždycky z toho něco pěkného vyjde, dodává. Je tedy ráda, že se může realizovat i tímto způsobem. Je to pro ni i jakýsi hnací motor.

Když je Katka v lese a vidí pěkný klacík, vezme si ho. Později ho třeba použije. Podobně má i mušle. Už mi tu leží druhým rokem mušle nebo klacek, který jsme našli okousaný od bobra. Má krásný tvar. Bude z něj krásný anděl. Ale ještě nebyl čas na realizaci, popisuje. Okurková sezóna, kdy by neměla co dělat, podle ní ještě nepřišla a je za to ráda.

Srdcovkou Prajzulky jsou stromy života. Nabízí je v různých rozměrech a čím jsou větší, tím je na nich více detailů, jako je například houpačka nebo ptáčci. Dělala jsem i jablíčka s červíky, vzpomíná s úsměvem. Má ráda i zvířata, takže často vyrábí ptáky a různé ptačí motivy. To je moje. Někdo má rád anděly, já mám ráda to, co je v přírodě. Hlavně stromy a ptáky, shrnuje.

Oblíbené dárky pro štěstí

Kateřinu Solčanovou mohou lidé často vidět na jarmarcích a nejrůznějších akcích. Tam se potkává jen s pozitivními reakcemi. Dráteníků je podle ní málo. Má radost, že za ní kolikrát zákazníci přijedou. Nejde jen o to, že si něco koupí. Někteří zákazníci přijedou jen na kus řeči. Pochválí mě, že jim ptáček nebo strom dělají radost, že to dostali od někoho jiného. To je nejvíc, dodává nadšeně. Letos už má před sebou několik trhů. Například Velikonoce na zámku v Kravařích nebo akce jako Kreativ v Ostravě. Snažím se trhy obměňovat, ať pořád nejsem každý rok na těch samých, protože se to okouká. A vždycky dávám na internet, kde jsem, upřesňuje Katka.

U zákazníků jdou nejvíc na odbyt andělé a stromy. Katka to vysvětluje právě symbolikou. Anděl znamená štěstí a strom života. Také jsou oblíbení andílci a srdíčka v celofánu pro štěstí. To lidé často nosí na návštěvy jako milou drobnost místo čokolády.

Sen nejen o dílně

Prajzulka v závěru přiznává, že plány úplně nemá, ale moc by ji potěšilo, kdyby si do budoucna mohla otevřít větší dílnu. Vyrábí totiž doma na malém prostoru o několika metrech. Chtěla bych prostor, třeba i s prodejem, a udělat takovou dílnu, kde bych měla k sobě někoho, kdo by mi pomáhal, prozrazuje s tím, že by to chtěla více rozjet, ale je skeptická. Na oko to totiž podle lidí vypadá, že je drátenictví lehká práce, ale drát musí poslouchat vás, nikoliv naopak.

Marketing meeting Influenceři a sociální sítě

Ještě jsem nenašla takovou duši, která by byla jako já. Nebo šikovnou kamarádku, se kterou bychom si řekly, pojďme do toho, budeme spolu a rozjedeme to ve větším, vysvětluje a uzavírá, že by chtěla sociální dílnu, kde by měla někoho k sobě a udělala by tak rodinnou atmosféru a pěkný podnik.

Tip na další příběh

Do lesa nechodí na houby, ale na korálky. Sama vyrábí tradiční skleněné šperky

Práci se sklem má Alena Kyrálová v krvi. Když odešla z brusírny, chtěla dělat něco svého. Zjistěte, co za poklady jí pod rukama vzniká. Více v článku.

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.


Autor článku

Jana Langerová píše o marketingu, podnikatelských příbězích a digitálních trendech.​ Profil autorky →

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