Kandidáti na šéfa ČT chtějí posílit regiony, (ne)vrátit ČT3 a oslovit mladé diváky

16. 6. 2025
Doba čtení: 14 minut

Sdílet

Autor: Koláž Lupa.cz/Česká televize
Nabízíme podrobnou analýzu všech pěti kandidátských projektů na generálního ředitele České televize. Kde jsou jejich silné a slabé stránky?

Funkční období generálního ředitele České televize trvá za běžných okolností šest let. Všichni uchazeči by tedy měli nabídnout strategické pozice a myšlenky do roku 2031. Rada České televize rozhodne o vítězi 18. června. 

Co se dozvíte v článku
  1. Hynek Chudárek (17 hlasů)
  2. Libuše Šmuclerová (15 hlasů)
  3. Miroslav Karas (11 hlasů)
  4. Milan Fridrich (10 hlasů)
  5. Jiří Ponikelský (10 hlasů)

Kandidáti ve středu veřejně okomentují své projekty, které jsou předem ke stažení na webu České televize. Zároveň se už na podzim, po sněmovních volbách, může Česká televize ocitnout ve zcela jiných společenských a politických podmínkách.

V následujícím přehledu jsme projekty seřadili podle počtu hlasů, se kterými je radní poslali do finále. Maximum bylo 17 hlasů.

Hynek Chudárek (17 hlasů)

Hynek Chudárek

Hynek Chudárek

Autor: Česká televize

Jediný z finalistů, který se o funkci generálního ředitele České televize uchází potřetí. Srovnání jeho projektů z let 2009, 2011 a 2025 ukazuje, že jádro jeho kritiky fungování Kavčích hor zůstává po více než dekádu a půl pozoruhodně konzistentní.

Nejvýraznějším a neměnným prvkem Chudárkovy vize je požadavek na snížení vrcholového managementu. Tento motiv se prolíná všemi třemi projekty jako základní předpoklad pro zvýšení efektivity a odpovědnosti. V roce 2009, kdy kandidoval jako externí manažer z komerčního sektoru, navrhoval snížit počet členů vedení z tehdejších 14 na polovinu, což mělo přinést úspory v řádu desítek milionů korun.

O dva roky později, v roce 2011, kritizoval nárůst managementu ze 14 na 17 členů a znovu navrhl štíhlé devítičlenné Kolegium generálního ředitele. A letos předkládá identické řešení, dokonce se zopakováním věty o „naprosto neúnosném počtu členů vrcholového vedení“. Napočítal 19 manažerů na prvním stupni řízení, v nejbližším týmu generálního ředitele jich chce nechat devět. Byli by to ředitelé programu, zpravodajství, financí, sportu, výroby, techniky, digitálních služeb, plus šéfové studií v Brně a v Ostravě. Komunikace nebo obchod by přímo podléhaly generálnímu řediteli.

Už od první kandidatury identifikuje Hynek Chudárek stárnoucí publikum ČT jako existenční hrozbu. V projektu z roku 2011 varuje: „ČT je sledována především staršími diváky, mladí ji nevyhledávají. Pro budoucnost tedy alarmující skutečnost a neradostná vyhlídka“. Totéž trochu jinými slovy opakuje letos: „Česká televize… má dnes převážně starší publikum… má-li ČT naplňovat své veřejnoprávní poslání, musí aktivně oslovovat i mladé publikum a děti“.

Jeho řešení se soustředí na dva hlavní směry. Prvním je posílení tvorby pro děti a mládež prostřednictvím navýšení rozpočtu Déčka. Druhým je rozvoj produkce pro YouTube, která má mladé diváky přivést k obsahu ČT. Mimochodem, za ta léta se nemění ani v některých nápadech. V letošním projektu třeba mluví o návratu rodinných seriálů typu Arabely nebo Návštěvníků. O tomtéž mluvil před čtrnácti lety.

Digitálním platformám věnuje v celém projektu pouhý jeden obecný odstavec. Na jiném místě však slibuje „vytvořit samostatný program s přesným vysílacím schématem ČT sport 2 na digitální platformě“.

Na rozdíl od dřívějších dob navrhuje místo propouštění stovek zaměstnanců třeba prověřit všechny smlouvy s dodavatelskými organizacemi s cílem jejich optimalizace. Ve výrobě by využil vícezdrojové financování. Inspiruje se u BBC nebo švédské televize, počítá se zapojením mezinárodních koprodukcí, pobídkami audiovizuálního fondu, evropskými granty (MEDIA, Eurimages) a dalšími formami externího kapitálu.

Zároveň přichází s návrhem zrušit producentský systém tvůrčích skupin a demontovat tak jeden z pilířů éry Petra Dvořáka. Je podle něj „nadbytečný, překonaný a drahý“. Zrušil by i celou divizi vývoje obsahu až na několik jednotlivců podřízených programovému řediteli.

Navrhuje strukturu, která v ČT v minulosti již existovala a byla podle něj funkční: šest dramaturgických center pod programovým ředitelem, zodpovědných za konkrétní žánry. Část výroby, hlavně velkých dramatických pořadů, by vyvedl z České televize zakázkovým výrobcům a nezávislým producentům. Nejméně do roku 2028 nechce obnovit stanici ČT3, protože archivní pořady bude potřebovat pro jiné stanice, než se naplno rozjede výroba.

Zpravodajství České televize by se mělo dočkat nové budovy se zahájením výstavby v roce 2027–2028. Hynek Chudárek navrhuje rozšířit počet investigativních týdeníků na dva, rozvinout servisní a komunální žurnalistiku, posílit zahraniční zpravodajství z Asie, Afriky a Jižní Ameriky nebo vybudovat ekonomickou redakci. Regiony a zahraničí mají tvořit 50 % vysílacího času zpravodajství.

Univerzálním tématem se zdají být napjaté vztahy mezi kontrolním orgánem a generálním ředitelem. V roce 2011 Chudárek mluvil o „změně vztahů mezi managementem a Radou ČT“ a sliboval systematickou a stálou spolupráci. O čtrnáct let později se z Chudárkova projektu dozvídáme, že je „velmi významné… výrazně zlepšit nyní narušené vztahy mezi managementem a Radou ČT“. Potenciálním povolebním změnám se v projektu nevěnuje.

Libuše Šmuclerová (15 hlasů)

Libuše Šmuclerová na společné tiskové konferenci zástupců komerčního sektoru, kde se ohradili proti výchozí podobě velké mediální novely

Autor: AKTV

Projekt zkušené mediální manažerky popisuje ČT jako „zapouzdřený svět Kavčích hor“, kde převládá „myšlení analogu a vyjetých kolejí“ a kde se „kontury veřejnoprávní služby rozpily“. Jako jediná kandidátka z finálové pětice není součástí televize (počítaje v to i Miroslava Karase, který televizi opustil teprve loni).

Jak píše, jejím cílem „není revoluce, ale evoluce změn, které Českou televizi převedou s klidem, zralostí, kultivovaností“ do nové etapy. Lze však psát o hlubokých problémech a zároveň nabídnout pozvolné kroky? Možná je to jen pragmatický přístup a taktický výběr slov, kterým se snaží uklidnit Radu ČT a vyslat dovnitř televize vzkaz, že nezpůsobí chaos a rozvrat. Stejným směrem míří i její návrh na ukončení „zákopové války“ mezi managementem a Radou ČT a na vybudování vztahu založeného na „transparentnosti a dělnosti“.

V oblasti lineárního vysílání navrhuje řadu standardních, avšak potřebných kroků: zpřesnění cílů jednotlivých kanálů, tvorbu tzv. „vlajkových lodí“ (výpravných seriálů, zásadních dokumentů), kreativnější plánování, rozšíření nabídky formátů a větší důraz na živé servisní pořady. Volá po publicistice, která není jen „orlojem sezvaných hostů“, a po skutečném zahrnutí témat z regionů, aby se zamezilo „pražskému vidění světa“.

Silnou částí projektu je strategie pro digitální služby. Libuše Šmuclerová pomocí dubnových dat z NetMonitoru ukazuje, jak dramaticky ČT zaostává v online prostoru. Zatímco na platformách ČT strávili uživatelé 8,7 milionu hodin, na službách Primy to bylo přes 10 milionů, na TikToku 45 milionů a na platformách Googlu (včetně YouTube) dokonce 134,5 milionu hodin. Z toho podle ní plyne, že ČT „proinvestovává potenciál a kapitál, který má“.

Navrhuje tedy integrovat online týmy přímo do výroby pořadů, online storytelling pro klíčové projekty, vybudování silného interního vývojového centra, propojení webů a personalizaci obsahu. Kritizuje současný stav iVysílání jako pouhé „úhledné rovnání knížek do knihovny“ namísto budování moderní služby.

Zároveň platí, že se nyní uchází o řízení instituce, jejíž financování a digitální aktivity aktivně zpochybňovala jako zástupkyně vydavatelů při jednání o mediální novele. V předchozí roli lobbovala, ať se televize v digitálním prostoru moc „neroztahuje“, jako kandidátka na ředitelku naopak navrhuje internetové aktivity ČT akcelerovat. Nenabízí žádné hodnocení, jak má vlastně digitální služba ČT vypadat ve vztahu k jiným subjektům na mediálním trhu.

Návrhy na posílení kybernetické bezpečnosti a uchopení umělé inteligence jsou standardní a nutné. Zajímavá je vize výzkumného oddělení jako „živoucího datacentra“, které by propojilo data o sledovanosti a chování populace s každodenním rozhodováním napříč celou televizí. Výzkum však má silnou pozici už ve stávající struktuře ČT.

Skoro povinná je formulace, že „těžištěm každého obsahu jsou lidé“. Navrhuje konkrétní kroky k omlazení a zkvalitnění personálu: zřízení Rady mladých jako reakci na stárnoucí demografii zaměstnanců (téměř 70 % starších 40 let), budování silných interních expertních týmů (ekonomika, právo, zdravotnictví) a nastavení systému profesního vzdělávání.

Ačkoliv její kandidatura přichází v době, kdy ČT díky velké mediální novele získá stamiliony korun ročně, a její projekt je postaven na efektivitě, ve finanční části je velmi obecný. Navrhuje „kontinuální controlling“ a „prověření workflow“, aby se instituce zbavila „odéru neefektivity“. Projekt neobsahuje žádná konkrétní čísla, žádné cíle pro úspory, žádný návrh na alokaci nově získaných prostředků.

Kdo by měl být generálním ředitelem/generální ředitelkou ČT?

Miroslav Karas (11 hlasů)

Miroslav Karas

Miroslav Karas

Autor: Česká televize

Uznávaný zahraniční zpravodaj působil celý svůj profesní život od ukončení vysoké školy až do loňského roku ve veřejnoprávních médiích. Většinu té doby reportoval z terénu, ať už pro Český rozhlas nebo Českou televizi. Teprve v březnu 2020 se posunul do manažerské funkce, když zvítězil ve výběrovém řízení na ředitele televizního studia v Ostravě. Z televize odešel po vypršení funkčního období na jaře 2024, neboť svou pozici neobhájil a vystřídala ho Gabriela Lefenda.

Letos se chtěl do veřejnoprávního prostředí vrátit alespoň v kontrolní roli, poslancům se představil jako kandidát na volné místo v Radě Českého rozhlasu. Protože poslanci zatím nerozhodli, může se ucházet také o ředitelskou funkci v České televizi.

Jeho projekt se od ostatních liší už formálním pojetím. Je to spíš manifest, ve kterém formuluje hlavní myšlenky, než manažerský projekt s propočty a organizačními schématy. Většina tezí je obecných, chybí u nich konkrétní kroky k jejich naplnění.

Nejkonkrétnější a nejradikálnější částí jeho vize jsou pasáže o zpravodajství, které zjevně vnímá jako srdce celé instituce. Navrhuje například rozšířit spektrum hostů, zrušit zpravodajské posty ve Velké Británii a Turecku (nezdůvodňuje, proč zrovna tyto), zkrátit Události na 30 minut, dát větší prostor regionům nebo se zamyslet nad délkou pořadů Máte slovo a Otázky Václava Moravce.

V ostatních klíčových oblastech podnikového řízení, zejména ve finanční strategii, řízení lidských zdrojů v celopodnikovém měřítku a v digitální transformaci, postrádá jeho koncepce srovnatelnou hloubku a konkrétnost. V Ostravě sice získal vhled do rozpočtových, personálních a výrobních procesů uvnitř ČT, nicméně řízení celé sedmimiliardové instituce je úplně jiné měřítko. Navrhuje, že nejvyšší management bude kromě generálního ředitele tvořit osm lidí: šéfové výroby, financí, programu, obsahu, komunikace, zpravodajství a studií v Brně a Ostravě.

„Musíme se zaměřit na diváky a uživatele ve věku do 24 let, kteří dávají přednost mobilním zařízením. Rozvoj technologií, nové generace datových sítí, umělé inteligence, online aktivit, rozvoj HbbTV, hrané tvorby, vstřícnost k handicapovaným občanům, spolupráce s organizacemi FITES, APA, ARAS, Asociací kameramanů, Národním divadlem, Národním muzeem, Národní galerií a dalšími – to vše posune ČT dopředu,“ píše v projektu, aniž by měl představu, jak konkrétně tyto technologie a spolupráce ovlivní přízeň mladého publika i samotnou výrobu pořadů.

Za „legitimní“ označuje debatu o sloučení s Českým rozhlasem a chtěl by k ní založit expertní tým. Ostravskému televiznímu studiu by postavil „novou, moderní, skromnou a funkční“ budovu. 

Podpořil jednotné přihlášení k digitálním službám ČT a „moderní přístup k online archivu odvysílaných pořadů s možností individuálního vyhledávání podle klíčových slov“. Neupřesňuje, v čem bude rozdíl oproti současnému systému. iVysílání by ale mělo být „plnohodnotnou VOD službu nejvyšší kategorie s adekvátními licencemi, personalizací a vysokou kvalitou poskytovaného zážitku“.

Pokud jde o program, nebránil by se návratu stanice ČT3 (jen to ale naznačuje bez termínu nebo upřesnění její podoby). Divákům by dopřál původní tvorbu televizí ze Slovenska, Rakouska, Německa a Polska. Chce vést „věcnou a konstruktivní diskusi“ o pořadech StarDance a Peče celá země, ale neupřesňuje, co má být jejím výsledkem. „Objem výroby hrané tvorby je třeba nastavit tak, aby divák sledoval premiéru dvakrát týdně,“ dodává, ale neujasňuje, co by bylo v programu do doby, než by se vyrobil dostatek nových titulů.

Milan Fridrich (10 hlasů)

Milan Fridrich, programový ředitel ČT

Milan Fridrich, programový ředitel ČT

Autor: Karel Choc, Internet Info

Od října 2011 je programovým ředitelem České televize. Mnozí mu vyčítají, že stvořil vysílací schéma, kde sází na jistotu, zejména ve svátečním programu. Jeho projekt nyní slibuje inovace, originalitu a ochotu riskovat. Promění se teď v šampiona inovací?

Na začátku Milan Fridrich připomíná klíčové neduhy ČT: nedávný pokles důvěry veřejnosti a vnímání objektivity (důvěra klesla z 67 % na 61 %; vnímaná objektivita z 63 % na 55 %). Poukazuje na generační propast v konzumaci médií a uvádí data, podle nichž sledování živého televizního vysílání dominují diváci ve věku 65+, zatímco mladší publikum se nachází jinde, například na TikToku.

Zmiňuje také „finanční stabilizaci“, kterou přinesla velká mediální novela. Zvýšené výnosy z televizních poplatků jsou přímým předpokladem pro klíčové investiční návrhy v jeho projektu.

Chtěl by například v roce 2026 vyrobit nový online obsah za 80 milionů Kč. Mladému publiku z generace Z slibuje vytvoření samostatného kanálu inspirovaného německým projektem Funk. Z pohledu systému vývoje a výroby by pak ČT neměla dělat rozdíly mezi tvorbou pro lineární vysílání a nelineární užití. Premiéry pořadů by dokonce měly být především na internetu.

Přímo pro iVysílání by mělo exkluzivně vznikat až pět hraných seriálů ročně, slibuje také až deset dokumentárních sérií pro mladé diváky za rok. iVysílání prý během dvou tří let může díky nasazení algoritmického doporučování obsahu získat 25–30 % nových uživatelů a čas strávený s obsahem na této platformě se za stejnou dobu může zvýšit až o pětinu. Uznává, že obsah ČT musí být i na externích platformách, nic bližšího k tomu ale nepíše.

V tradičním vysílání by v neděli večer mělo být nejméně dvacet premiérových filmů nebo epizod minisérií „s vysokou přidanou hodnotou“. Vyráběly by se dvě vánoční pohádky za rok. Slibuje premiérové seriály ve dvou dalších všedních dnech, zdvojnásobení podpory animovaného filmu a transformaci ČT2 na čistě dokumentární a publicistický kanál. Také by se zvýšil rozpočet kulturního programu ČT art, a to minimálně o 20 procent. Obnovil by stanici ČT3, ale už ne jako čistě archivní kanál, byly by tam i pořady o aktivním životním stylu.

Podobně jako Hynek Chudárek navrhuje změnu producentského systému, i když ne tak radikální. Předělal by ho na kombinovaný systém, v němž by některým žánrům slušelo spíše projektové řízení (commissioning).

Navrhovaná opatření dále zahrnují redesign Událostí po 11 letech, jasné oddělení zpravodajství od publicistiky a komentářů, obnovení specializovaných novinářských pozic, rozšíření sítě zahraničních zpravodajů (Latinská Amerika, Indie, arabské země) a obnovení týdenního souhrnu (ve stylu 168 hodin) a kontaktního pořadu (jako byl Hydepark).

Ve svém projektu dále navrhuje implementaci umělé inteligence napříč televizí. Uvádí konkrétní odhady ročních úspor: 25–35 milionů Kč v postprodukci, 30–40 milionů v administrativě atd., celkem 150–200 milionů Kč.  

Technologie by mohly zvýšit efektivitu a snížit počet zaměstnanců, projekt se ale personálním krokům blíže nevěnuje. Poskytuje jen stručné informace o organizační kultuře, celkové filozofii vedení nebo řízení talentů. Kromě krátké zmínky o mzdách chybí vize, jak z ČT učinit agilnějšího, inovativnějšího a atraktivnějšího zaměstnavatele v konkurenčním mediálním prostředí.

Jiří Ponikelský (10 hlasů)

Ředitel ČT Sport Jiří Ponikelský

Ředitel ČT Sport Jiří Ponikelský

Autor: Karel Choc, Internet Info

Ačkoliv se celý profesní život zabývá sportem, adekvátně popisuje současné výzvy v mediálním sektoru, zejména v oblasti digitalizace, tvorby obsahu a personálního řízení. Jako ředitel sportovního kanálu je od roku 2009 součástí vedení České televize, kde vydržel za Jiřího Janečka, Petra Dvořáka i Jana Součka.

V úvodních i závěrečných pasážích projektu se prezentuje jako lídr, jehož působení je založeno na hodnotách jako „pokora, pracovitost, komunikace a transparentnost“. Opakovaně zdůrazňuje význam týmové práce a jako hlavní důkaz svých schopností předkládá patnáctileté úspěšné vedení programu ČT sport.

Vyzdvihuje potřebu efektivního hospodaření, řízení rizik a optimalizace procesů. Analyzoval by využívání výrobních kapacit a areálů České televize. Zavazuje se k „důkladné kontrole smluv (řešení problematiky začeřňování údajů), odstranění pochybností spojených s tzv. švarcsystémem a trvalému vyřazení těchto témat z veřejného prostoru“.

Zjevně si uvědomuje, že na to Rada České televize slyší, nadměrné začerňování smluv totiž její členové vyčítali Petru Dvořákovi i Janu Součkovi. Léta ovšem byl součástí této praxe. Opakovaně se vynořovaly dotazy, kolik peněz vlastně ČT vydává na sportovní práva, tazatelé však naráželi na obchodní tajemství.

Na Radu České televize Jiří Ponikelský nenápadně „pomrkává“ také příslibem ekonomické a obsahové analýzy nočního živého vysílání ČT24. Toto téma se na zasedání kontrolního orgánu vrací pravidelně, protože část radních má pochyby o přínosu živých zpravodajských relací mezi půlnocí a šestou ráno. Naznačuje možný návrat pořadu 168 hodin s novým autorským týmem. Modernizoval by zpravodajské studio na Kavčích horách.

Plánuje sjednotit veškeré digitální aktivity pod jednu značku „iProstor“ s personalizací obsahu a uživatelskou přívětivostí. Zajímavou zmínkou je navrhovaná spolupráce s konkurenčními VOD platformami, která má vypadat jako tvorba nového obsahu ve spolupráci s externími partnery. Založil by „Klub diváka České televize“ jako prostor pro přímou komunikaci s publikem (z projektu není jasné, zda to má být webový komunikační kanál, nebo jiná forma).

Projekt také klade důraz na posílení původní tvorby (dramatické „s národní tematikou“, dokumentární, pro děti), udržení standardu a objektivity zpravodajství, a podporu české kultury a sportu jako stmelujícího prvku společnosti. Zahájil by diskusi o možném obnovení programu ČT3 nebo „jiné alternativy vysílání pro seniory“ (neupřesňuje jaké). Generaci Z by oslovil „odvážnými projekty“, ani zde však neupřesňuje, co tím myslí. Vzdělávací portál ČT edu by se měl otevřít i směrem k dospělým a seniorům.

Modernizoval by studio SK7 pro sportovní vysílání, které by mělo být kontinuální včetně zpravodajství a publicistiky. Více by využíval vzdálenou režii při přímých přenosech. Sport by měl být pravidelnou součástí Událostí v regionech.

V Ostravě by postavil novou budovu studia, výrobu v Ostravě a Brně by zvýšil nad zákonem požadovaných 20 %. Rozšířil by regionální verze pořadů včetně těch diskusních, ani tady ale není příliš konkrétní.

WT100_25_SE

Česká televize by jako zaměstnavatel měla nabídnout moderní, motivující a férové pracovní prostředí. Od rutinních věcí by měla zaměstnancům ulehčit AI. Jiří Ponikelský výslovně zmiňuje potřebu investovat do rozvoje zaměstnanců a řešit problematické pracovní vztahy (tzv. „švarcsystém“). Cílem je, aby ČT byla vnímána jako prestižní zaměstnavatel.

„Sebereflexi musíme provést interně vlastními silami. Tento krok bude jasným signálem politickému prostředí, že veřejnoprávní média zvládají své poslání bez nutnosti systémových změn,“ nabádá Ponikelský.

  • Chcete mít Lupu bez bannerů?
  • Chcete dostávat speciální týdenní newsletter o zákulisí českého internetu?
  • Chcete mít k dispozici strojové přepisy podcastů?
  • Chcete získat slevu 1 000 Kč na jednu z našich konferencí?

Staňte se naším podporovatelem

Autor článku

Novinář se zaměřením na média. Dlouholetý účastník i pozorovatel českého mediálního cirkusu. Pracoval v Marketing & Media, Hospodářských novinách a Českém rozhlase.

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