V ČR ubylo pacientů s rakovinou. Důvod k radosti to není

16. 5. 2022

Sdílet

Autor: VZP
Data Všeobecné zdravotní pojišťovny ukazují, že v onkologii za poslední dva roky ubylo preventivních prohlídek i počet léčených pacientů. Pokrok v tomto oboru to ale nezastavilo. Jen loni bylo nově zaregistrováno 27 onkologických léků a letos zdravotní pojišťovny začaly proplácet zkrácenou délku pobytu v nemocnici.

Ve středu 11. května proběhl Český den proti rakovině a s ním i květinový den spojený s veřejnou sbírkou a osvětou. Všeobecná zdravotní pojišťovna (VZP) u této příležitosti analyzovala svá data o onkologické léčbě. Novinářům je prezentovala na pracovní snídani.

Co se dozvíte v článku
  1. Pacientů i preventivních prohlídek ubylo
  2. Varovné signály, jež by vás měly poslat k lékaři
  3. Náklady na onkologickou léčbu rostou
  4. Pojišťovny nově proplácejí krátkou péči i edukaci pacienta
  5. Novinky v onkologické léčbě

Pacientů i preventivních prohlídek ubylo

Mezi nejčastější onkologické diagnózy v ČR dle dat VZP patří nádory kůže (67 tis.), prsu (55 tis.) a mužských pohlavních orgánů (49 tis. pacientů).

Z dat největší tuzemské pojišťovny vyplývá, že lidé v minulých dvou „covidových“ letech navštěvovali méně preventivní prohlídky, které jsou součástí plošných programů. Počet tzv. screeningových prohlídek, které se pravidelně v celé ČR provádějí u karcinomu prsu, děložního hrdla a konečníku, klesl v průběhu pandemie o 227 tisíc.

Výrazný pokles v počtech preventivních kontrol nezávisle na VZP hlásí také Ústav zdravotnických informací a statistiky (ÚZIS). „Zejména v první polovině roku 2020 byl pokles velmi zásadní, například počet provedených screeningových mamografií klesl v ČR meziročně o více než 15 %, v některých regionech až o více než 20 %. Ačkoli se screeningová centra snažila tento propad následně nahradit, úbytek vyšetření dosud nebyl vyrovnán,“ uvedl v tiskové zprávě ministerstva zdravotnictví ředitel ÚZIS Ladislav Dušek.

Podle pojišťovny i ministerstva stojí za poklesem pandemie covidu-19 a obava lidí z nákazy v ordinaci lékaře. Podle ředitele VZP Zdeňka Kabátka klesající čísla nezavdávají důvod k optimismu, ale naopak varovný signál. „Včasný záchyt nemoci je pro efekt léčby klíčový. Je tedy otázka, kolik nádorů jsme kvůli takovému výpadku v prevenci neodhalili,“ přemítá ředitel VZP. Podobně hovoří také Ladislav Dušek: „Klesající pokrytí populace prevencí povede k nárůstu pozdě zachycených vážných onemocnění, u kterých je významně menší šance na vyléčení.

Na pracovní snídani proto s ohledem na pokles preventivních vyšetření zazněl apel, aby lidé věnovali pozornost svému tělu a jeho kondici a nepřehlíželi některé varovné signály.

Varovné signály, jež by vás měly poslat k lékaři

  • Změna kondice – vyšší únava, ospalost, nižší výkonnost v práci apod.,
  • vyhmatání útvaru nebo změny na kůži (např. bulka v prsu, zvětšená uzlina v podpaží, na krku, změna znamének, neobvyklá znaménka),
  • velký úbytek na váze,
  • obtíže spojené s trávicím traktem – nechutenství, obtížné polykání, tlak v oblasti žaludku, problémy s vyprazdňováním, zácpa, průjem či jejich střídání,
  • potíže s močením,
  • otoky,
  • významné noční pocení,
  • krvácení a krev kdekoliv, kde nemá být – v moči, stolici, vykašlaném hlenu.

Zdroj: doc. MUDr. Jana Prausová, PhD., MBA

Kromě snížení počtu prevencí VZP zaznamenala v letech 2020 a 2021 také výrazný pokles počtu onkologických pacientů. U výskytu nejčastějších onkologických diagnóz bylo léčeno každoročně zhruba o 15 tisíc pacientů s rakovinou méně.

Na klesajících počtech onkologických pacientů se podepsalo to, že lidé chodili méně na odborná vyšetření, na jejichž konci je onkologická diagnóza. Roli sehrála i nižší návštěvnost preventivních prohlídek, a tedy i situace, kdy lidé jsou nemocní, ale kvůli absenci preventivní prohlídky o své nemoci zatím nevědí. A částečně se do čísel promítla i oslabená imunita zejména u hematoonkologických pacientů, a tedy i vyšší úmrtnost na covid-19.

Náklady na onkologickou léčbu rostou

Analýza ukázala i další dva trendy. „V předchozích dvou letech nedošlo k poklesu úhrad v rámci léčby těch nejzávažnějších onkologických diagnóz. To znamená léčby v centrech,“ uvádí Zdeněk Kabátek. 

Navíc i přes klesající počet onkologických pacientů rostou náklady na péči. Za posledních pět let o necelých 17 procent. Jedním z důvodů je, že pojišťovny proplácejí některé nové typy diagnostiky nebo nové nákladné léky. Například na hrazenou biologickou léčbu, jež se používá u celé řady onkologických diagnóz, podle předsedkyně České onkologické společnosti Jany Prausové, přednostky Onkologické kliniky 2. lékařské fakulty Univerzity Karlovy a Fakultní nemocnice Motol, dosáhne v současnosti každý pacient, pro kterého je tento typ léčby vhodný.

V roce 2017 VZP vydala za léčbu 10 451 onkologického pacienta biologickými preparáty 3,7 miliardy korun. Od té doby výdaje na ni každým rokem rostou. Loni již pojišťovna uhradila celkem 5,8 miliardy korun, a to 14 616 pacientům.

Galerie: Analýza úhrad v onkologii od VZP

Pojišťovny nově proplácejí krátkou péči i edukaci pacienta

Nižší počet onkologických pacientů a preventivních prohlídek nezbrzdil novinky v úhradách či léčbě. Jana Prausová uvedla, že letos lékaři mohou zdravotním pojišťovnám vykázat dva nové kódy. Díky nim se péče o pacienta opět o něco zlepšila.

Od ledna zdravotní pojišťovny u nových onkologických pacientů poskytovatelům péče proplatí tzv. plán péče. Pro pacienta to znamená, že lékař by měl mít dostatek času i motivaci k tomu, aby pacientovi i jeho rodině vysvětlil, co jeho onemocnění obnáší a jakou léčbu bude vyžadovat, a to ještě před jejím zahájením. Úhrada v tomto případě činí zhruba 500 korun. „Informovaný a dobře poučený pacient = spolupracující pacient, což je nesmírně důležité,“ podotýká onkoložka.

Druhou novinkou letošního roku je půldenní proplacení péče. Jedná se o tzv. „ošetřovací den pro onkologický stacionář s délkou pobytu do 12 hodin“, jehož nově stanovená úhrada činí zhruba 1000 Kč. Díky němu by se více pacientů mělo dostat k léčbě, aniž by museli být byť jen jedinou noc v nemocnici. Pro zdravotnická zařízení jde o větší motivaci poskytovat ambulantní péči. „Z onkologie se stává ambulantní obor – řadu věcí lze řešit mimo nemocniční lůžka. Léčbu, ať už podávanou ústy, nebo do žíly, dokážeme nastavit tak, aby ji pacient mohl absolvovat doma, kde je mu daleko příjemněji,“ podotýká Jana Prausová.

Novinky v onkologické léčbě

To ale není vše. Podle onkoložky pokračuje trend nových léků v onkologii a jednání s pojišťovnami je v současné době vstřícné, takže proplácení nových léků s prokázanou účinností není problém. Jen za loňský rok bylo podle Státního ústavu pro kontrolu léčiv registrováno (tj. vstupují nově na trh) celkem 27 léků, které mají v indikaci onkologické onemocnění. U některých již registrovaných léků pak došlo k rozšíření indikací, což znamená, že lék je hrazen i pacientům, na jejichž chorobu původně úhrady necílily.

Kromě léků pronikají do onkologie nové diagnostické a léčebné metody. „V posledních letech se nám podařilo uvést do života onkologických pacientů mnoho metod z hlediska chirurgických výkonů, radioterapie nebo systémové léčby, které velmi posunuly léčbu i její výsledky,“ dodává lékařka.

Chirurgie, radioterapie a systémová léčba

V oblasti chirurgie patří mezi přínosné novinky například operace pomocí robota, která znamená menší ztrátu krve a rychlejší rekonvalescenci. Takto lze v dnešní době operovat prostatu, ledviny, plíce, ale i gynekologické nádory.

„V oblasti radioterapie dokážeme současnou technikou velmi přesně zacílit na oblast, kterou chceme ozářit, a vyhnout se těm oblastem, které bychom ozářit neměli kvůli nežádoucím účinkům,“ řekla pro server Vitalia.cz Jana Prausová.

Systémovou léčbu posunula třeba éra nových cytostatik, tedy léků, jež ničí nádorové buňky, nebo již zmiňovaná biologická léčba. „U ní je lék cílen na konkrétní strukturu nádorové buňky. Tím snáze nádorovou buňku zabije, ale šetří při tom zdravé buňky,“ popisuje lékařka s tím, že v současné době už prakticky neexistuje onemocnění, u kterého by biologická léčba nebyla použitelná. Důležitým milníkem je také imunoterapie, tedy nastartování vlastní imunity těla a zvýšení obranyschopnosti pacienta vůči nádorovým buňkám, a to manipulací s vlastními buňkami pacienta.

Multidisciplinární týmy lékařů

Podle lékařky například nyní péče o pacienta funguje tak, že stav a léčbu každého pacienta řeší multidisciplinární týmy, na jejichž fungování se podílejí nejen komplexní onkologická centra (KOC), ale i regionální onkologická pracoviště. 

Tým se zabývá každým jednotlivým pacientem a vybere pro něj optimální cestu, jak má diagnostika a léčba probíhat, aby se nedělala zbytečná vyšetření a aby cesta léčby byla co nejrychlejší a nejkratší, protože čas je náš nepřítel,uvádí Jana Prausová s tím, že v současné době se lékaři snaží, aby složitější diagnostika probíhala přímo v KOC. To zamezí tomu, aby se u jednoho pacienta opakovala stejná vyšetření.

Prediktivní testování nádorů

V praxi se také používá takzvané prediktivní testování nádorů, což znamená, že patologické změny se ve tkáni nádoru hledají na úrovni molekul. Provádí jej patolog, který tím de facto určí, jak bude vypadat léčba. Najde v nádoru struktury, do kterých my se umíme léčbou trefit. Predikcí dokážeme vyselektovat léčbu tak, aby pro pacienta byla optimální. Tedy byla účinná, ale nebyla toxická,uvádí Jana Prausová.

Sekvenování nové generace

Léčbu hodně posouvá také použití tzv. sekvenování nové generace. Sekvenování je obecně analýza po jednotlivých genech. Sekvenování nové generace pak zjednodušeně znamená, že genetici mají k dispozici moderní přístroje, jež dokáží rychle analyzovat velké množství genů u několika pacientů najednou. Nedávno jsme psali, jak fascinujícím oborem je v medicíně genetika.

Molekulární vyšetření

Díky využití molekulárního vyšetření u karcinomu endometria, tedy děložní sliznice, má zase část pacientek možnost vyhnout se při léčbě ozařování malé pánve, takže se vyhnou i celé řadě nežádoucích účinků.

Budoucnost patří podle doc. Prausové genové léčbě, která se nyní v onkologii využívá pouze u hematoonkologických pacientů. Zcela jistě pak přijdou také nové technologie v oblasti radioterapie a chirurgické léčby.

Odborná spolupráce:

Doc. MUDr. Jana Prausová, PhD., MBA

Vedoucí Komplexního onkologického centra FN Motol, přednostka Onkologické kliniky 2. LF UK a FN Motol, předsedkyně České onkologické společnosti ČLS JEP.

Autor článku

Redaktorka Vitalia.cz. Vystudovala žurnalistiku a češtinu na Univerzitě Palackého v Olomouci, pracovala v Deníku, na webu TV Nova a iDNES.cz. Píše o zdravotnictví. Je držitelkou novinářských cen Psychiatrické společností ČLS JEP za rok 2021 a 2022. 

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