Menu Zavřít

Nádraží, filharmonie, muzeum či stadion. Osm architektonicky zajímavých staveb, které v Česku vzniknou do několika let

17. 6. 2025
Doba čtení: 7 minut
  • V Česku se aktuálně připravuje či staví mnoho zajímavých budov, které jsou pozoruhodné především z architektonického hlediska
  • Patří k nim například Nový koncertní sál v Ostravě, budova Středoevropského fóra Olomouc nebo Horácká multifunkční aréna
  • Zájem veřejnosti ale dlouhodobě budí i plánovaný přesun nádraží v Brně či přestavba hlavního nádraží v Praze

Česká republika má na svém území obrovské množství historických památek, jež každoročně přilákají miliony turistů. Ať už je to Pražský hrad, Lednicko-valtický areál či třeba zámek v Hluboké nad Vltavou, tyto krásné stavby jsou skvělou ukázkou kvalitní architektury, která lidi fascinuje i několik set let od doby realizace.

Nutno nicméně zdůraznit, že působivé stavby vznikají napříč Českem i v současnosti. V posledních letech můžeme zmínit například Národní technickou knihovnu, autobusové nádraží Zvonařka v Brně, Nové divadlo J. K. Tyla v Plzni či Centrum současného umění Dox v pražských Holešovicích. Spousta dalších zajímavých budov je ale teprve ve výstavbě či se zatím jen plánuje. V následujícím článku vám představíme osm architektonicky hodnotných staveb, jež mají v budoucnu zkrášlit významná česká města.

Nový koncertní sál v Ostravě

Třetí největší město v České republice by se už brzy mělo dočkat koncertní haly na světové úrovni. V Ostravě má totiž vzniknout moderní kulturní komplex s hlavním sálem pro 1 300 diváků, dvěma menšími sály pro přibližně 500 lidí, nahrávacím studiem, edukačním centrem a kavárnou. Novostavba bude sloužit především Janáčkově filharmonii Ostrava, ale i různým festivalům či vzdělávacím a komunitním akcím.

Outstream Placeholder

Vítězný architektonický návrh pochází z newyorského studia Steven Holl Architects, které spolupracovalo s pražskými Architecture Acts. Koncertní sál je podle svých autorů koncipován jako „perfektní akustický nástroj v pouzdře“, mnohým laikům ale připomíná spíše vesmírnou loď či dokonce rejnoka. Pro stavbu bude každopádně kromě kvalitní akustiky typická i hra se světlem, takže v různých denních a ročních obdobích bude interiér pokaždé trochu jiný.

Celý projekt už získal stavební povolení a v létě 2024 byl slavnostně poklepán základní kámen. Hlavní stavební práce mají trvat do roku 2027, přičemž celkové náklady se podle současných plánů vyšplhají na zhruba čtyři miliardy korun.

Horácká multifunkční aréna

Novou dominantu Jihlavy se má už brzy stát Horácká multifunkční aréna. Současný sportovní stadion totiž dlouhodobě nestačí rostoucím nárokům, takže město rozhodlo o výstavbě moderního hokejového areálu s kapacitou až 7 500 diváků. Jeho součástí má být kromě samotného kluziště i veřejná tělocvična a posilovna, multifunkční prostory pro koncerty, výstavy, konference nebo veletrhy a venkovní běžecký ovál na střeše.

Vítězný architektonický návrh od studia Chybik + Kristof Architects je zajímavý především svou výraznou vizuální stránkou. Tu zajišťuje fasáda z červeného děrovaného plechu s trojúhelníky, jež odkazují na ježka, kterého má město ve znaku. Kromě hlavní haly s eliptickým tvarem bude ale součástí areálu i přilehlý pavilon s fanshopem, kavárnou, ubytováním, tělocvičnou a gastrozónou.

Od větrné elektrárny po ptačí hnízdo. Sedm nevšedních rozhleden, které mění výhledy na českou krajinu ve skutečné designové zážitky
Přečtěte si také:

Od větrné elektrárny po ptačí hnízdo. Sedm nevšedních rozhleden, které mění výhledy na českou krajinu ve skutečné designové zážitky

Výstavba Horácké arény začala v létě 2023 demolici stávajícího stadionu, během loňska bylo hotovo zastřešení a nyní finišují práce na technologickém vybavení a interiéru. Budova za zhruba dvě miliardy korun by měla být otevřena na podzim letošního roku.

Vltavská filharmonie

Stejně jako Ostrava, i Praha aktuálně postrádá moderní koncertní sál, který by vyhověl nárokům současných orchestrů. Změnit by to měla právě výstavba Vltavské filharmonie, jež má být novým sídlem České filharmonie a Symfonického orchestru hlavního města Prahy FOK. Kromě těchto známých institucí bude ovšem budova sloužit také širší veřejnosti, a to třeba díky střešní terase s restaurací, která má být přístupná všem.

Po mezinárodní soutěži, jíž se účastnilo 115 architektonických týmů, zvítězil koncept od Bjarke Ingels Group. Ten počítá s celkem třemi sály – hlavním sálem s kapacitou 1 800 míst, malým sálem pro komorní hudbu s kapacitou 700 míst a multifunkčním sálem pro ostatní typy akcí s kapacitou až 500 míst. Celý areál se má vyznačovat otevřeností a vysokým propojením s okolím, tedy především s blízkou řekou Vltavou. Velká pozornost byla ovšem věnována i akustice, kterou navrhnul jeden z nejpovolanější odborníků v oboru Jasuhisa Toyota.

Co se týče realizace samotné stavby, ta je naplánovaná mezi lety 2027 a 2032. Celkové náklady na Vltavskou filharmonii mají dosáhnout zhruba 11 až 16 miliard korun, podílet se na nich bude hlavní město Praha, stát i nadační fond.

Moravskoslezská vědecká knihovna

Kromě nového koncertního sálu v Ostravě už delší dobu potřebují také novou budovu pro tamní Moravskoslezskou vědeckou knihovnu. Významná instituce funguje již od roku 1951 v provizorních prostorách, která už kapacitně nestačí. I kvůli tomu by měla vzniknout výjimečná stavba, jež kromě klasických studoven nabídne návštěvníkům rovněž digitální laboratoře, multimediální prostory, kino, kavárny a prostor pro setkávání.

Architektonický návrh Ladislava Kuby a Tomáše Pilaře počítá s výstavbou „Černé kostky“ o rozměrech přibližně 36 × 36 × 42 metrů, kterou bude obklopovat rozsáhlá vodní plocha. Objekt s devíti nadzemními podlažími pojme celkem 1,2 milionu knih, a díky svému unikátnímu vzhledu se má stát novou dominantou města.

Českým arénám se blýská na lepší časy. Nové sportovní haly nejen v Brně a Pardubicích přinášejí špičkovou architekturu i inspiraci z NHL
Přečtěte si také:

Českým arénám se blýská na lepší časy. Nové sportovní haly nejen v Brně a Pardubicích přinášejí špičkovou architekturu i inspiraci z NHL

K zahájení výstavby Černé kostky došlo letos v dubnu, hotovo by mělo být v roce 2027. Projekt financuje Moravskoslezský kraj spolu s městem Ostravou, přičemž celkové náklady dosahují zhruba 2,6 miliardy korun.

Nová Alšova jihočeská galerie

Alšova jihočeská galerie je jednou z nejdůležitějších uměleckých institucí v kraji, dosud ale sídlí v prostorách zámku Hluboká nad Vltavou, které nemají ideální podmínky pro vystavovaní vzácných děl. Právě kvůli tomu má na Senovážném náměstí v Českých Budějovicích vzniknout nová stavba, jež poskytne veřejnosti i odborníkům více výstavních sálů, knihovnu, kavárnu či různé interaktivní prostory.

V mezinárodní soutěži, která proběhla v létě 2024 a přilákala 82 návrhů z Evropy, zvítězil pražský ateliér Marek Chalupa architekti. Jejich koncept přezdívaný „bedna na umění“ je vcelku jednoduchý, na první pohled ale zaujme výrazným žebrováním. To má podle architektů značit, že uvnitř budovy se nachází něco unikátního, co je třeba ochránit. Zároveň je galerie navržena tak, aby se stala novým příjemným místem pro setkávání lidí v historickém jádru města.

Šance na nový život Florenci. Penta zde vybuduje moderní bydlení i kanceláře, do proměny se zapojí architekti z celé Evropy
Přečtěte si také:

Šance na nový život Florenci. Penta zde vybuduje moderní bydlení i kanceláře, do proměny se zapojí architekti z celé Evropy

Podle plánu Jihočeského kraje a Českých Budějovic by nová budova měla stát do roku 2028, kdy se chce město ucházet o titul Evropského hlavního města kultury. Celkové náklady na novostavbu, které zahrnují také podzemní parkování, zelené fasády a úpravy okolního veřejného prostranství, jsou odhadovány na přibližně 800 milionů korun.

Brněnské hlavní nádraží

Brněnské hlavní nádraží je důležitým uzlem městské i dálkové železniční dopravy, kterým každý den projdou tisíce cestujících. Současný komplex ale už kapacitně nestačí, a tak bylo před několika lety rozhodnuto o jeho přesunu do polohy dnešního dolního nádraží u řeky Svratky. Cílem je vytvořit v lokalitě moderní terminál, který zlepší návaznost vlaků, autobusů, tramvají, pěších a cyklistů.

Vítězem veřejné soutěže se stalo nizozemské studio Benthem Crouwel, které spolupracovalo s krajinářskými architekty z West 8 a českým ateliérem A8000. Návrh počítá s prostornou halou krytou „lehkým baldachýnem“, odkud bude vidět katedrála Petrov. V okolí má navíc vzniknout dostatek zelených ploch i pěší promenáda mezi novým nádražím a historickým centrem.

Podle aktuálního harmonogramu bude výstavba hlavních částí probíhat v letech 2028 až 2035. V této době mají vzniknout nová nástupiště, odbavovací prostory i terminály městské a příměstské hromadné dopravy. Celkové náklady na projekt se odhadují okolo 15 miliard korun.

Pražské hlavní nádraží

Pražské hlavní nádraží rozhodně nepatří k místům, na které by byli obyvatelé hlavního města pyšní. Historická Fantova budova sice byla nedávno krásně zrekonstruována, „nová“ odbavovací hala ze 70. let minulého století je na tom ovšem podstatně hůř, a přednádražní Vrchlického sady jsou pak bezpochyby jedním z nejzanedbanějších míst v centru metropole. Správa železnic se proto ve spolupráci s magistrátem rozhodla celý areál přestavět, aby cestujícím poskytoval mnohem vyšší komfort.

Vítězný projekt „Šťastný Hlavák“ od dánského studia Henning Larsen Architects počítá s výstavbou vysoké dřevěné střechy, která má sjednotit Fantovu budovu, moderní odbavovací halu a sousední park. Nový design počítá také se vznikem kaváren a vodních prvků, přičemž do oblasti bude přivedena i tramvajová trať. Přesto se ale projekt setkal s kritikou, která ho přirovnává k pergole, jež neposkytne cestujícím dostatečnou ochranu před zimou.

Podle současných odhadů se má začít stavět v roce 2028, k slavnostnímu otevření by mělo dojít zhruba o tři roky později. Náklady na Šťastný Hlavák dosahují zhruba dvě miliardy korun a uhradí je především stát a pražský magistrát.

Středoevropské fórum Olomouc

Muzeum moderního umění v Olomouci patří mezi nejvýznamnější instituce svého druhu v Česku, a to především díky svým bohatým sbírkám výtvarného umění z 20. a 21. století. Ani tato stavba už ovšem kapacitně nestačí, takže v příštích letech v sousední proluce vyroste nová budova Středoevropského fóra Olomouc (SEFO), která prostory muzea výrazně rozšíří.

bitcoin_smenarna

Poměrně atypická stavba od architekta Jana Šépky má podobu pětice propojených domů, jež na první pohled zaujmou svou betonovou fasádou. Cílem návrhu totiž bylo vytvořit moderně působící prostor, který bude navazovat na okolní historickou zástavbu. Vevnitř budovy by pak měly vzniknout nové výstavní prostory, knihovna, archiv a zázemí pro odbornou práci.

Technická stavba s duší venkova. Studio SOA navrhlo v Dolních Jirčanech hasičskou zbrojnici kombinující funkčnost a moderní architekturu
Přečtěte si také:

Technická stavba s duší venkova. Studio SOA navrhlo v Dolních Jirčanech hasičskou zbrojnici kombinující funkčnost a moderní architekturu

SEFO se dle aktuálních plánů začne stavět v roce 2027, hotovo pak má být do roku 2030, kdy se zároveň otevře i zrekonstruovaná hlavní budova muzea. Náklady na tento ambiciózní projekt v centru Olomouce dosahují přibližně 1,2 miliardy korun.

  • Našli jste v článku chybu?
'; 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'; } }
'; 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 »