Otazníky kolem českých grantů nejen na výzkum AI. Problémy nemá jen Mikolov, naznačují zkušenosti dalších vědců

23. 4. 2025
Doba čtení: 15 minut

Sdílet

Tomáš Mikolov na konferenci NMI 2018.
Autor: Karel Choc
Tomáš Mikolov na konferenci NMI 2018.
Důvod, proč známý výzkumník na poli umělé inteligence s mezinárodními zkušenostmi Tomáš Mikolov odchází z ČVUT, nastartoval debatu o způsobu, jak se v Česku rozdělují grantové peníze.

Mluvili jsme s profesory i doktorandy z Českého institutu informatiky, robotiky a kybernetiky (CIIRC ČVUT), kde Tomáš Mikolov před svým odchodem působil, i z několika dalších vysokých škol a různých fakult, abychom zjistili, jak rozdělování grantů podle jejich zkušeností funguje. Mnoho z nich se veřejně vyjadřovat nechtělo. 

Je nicméně jasné, že AI expert není jediný, kdo se výsledkům některých grantových žádostí podivuje. Konkrétně v oblasti umělé inteligence podobně jako Mikolov nezískali peníze na výzkum ani Michal Pěchouček (mimo jiné autor víc než 400 impaktovaných publikací, zakladatel několika startupů a iniciativ na podporu AI) nebo Josef Šivic, který podle žebříčku Research.com patří mezi nejlepší informatiky v Česku.

„Jejich žádost o grant na projekt umělé inteligence skončila úplně poslední. Byl to skvěle napsaný projekt,“ říká Václav Hlaváč, vedoucí oddělení robotického strojového vnímání a zástupce ředitele CIIRC. „Tak třeba Josef Šivic to přežije. Ale nepřežije to umělá inteligence v zemi,“ myslí si. „Je to problém celého oboru,“ upozorňuje.

Krátké vlny: Kolik bude stát zavádění a vymáhání Aktu o umělé inteligenci Přečtěte si také:

Krátké vlny: Kolik bude stát zavádění a vymáhání Aktu o umělé inteligenci

Samotný Mikolov už příliš nechce mluvit o tom, co ho k odchodu přimělo. Pro Lupu zmiňuje, že prapodivné příhody při rozdělování grantů kritizoval roky. Pro časopis Wired dříve uvedl, že se peníze investují naprosto nesmyslně nebo končí kdovíkde, rozdělování peněz je netransparentní, bez priorit a cíle. Na síti LinkedIn ještě předtím označil ze své perspektivy fungování vědy v Česku za tragické.

Zmíněný vědec z CIIRC Josef Šivic podobně jako Mikolov strávil roky v zahraničí. Má za sebou doktorské studium na Univerzitě v Oxfordu, postdoktorský pobyt na MIT a práci na francouzském národním výzkumném institutu informatiky. Působí mimo jiné v iniciativě AICzechia, která sdružuje prostřednictvím klíčových odborníků v oblastech umělé inteligence čtyři desítky předních akademických týmů a pracovišť v ČR.

Šivic se sice jiným významným (evropským) grantem pochlubit může, i tak ale souhlasí s tím, že rozdělování by potřebovalo velké změny, a přístup k výzkumu jednotnou a jasnou strategii. „Máme tu velmi kvalitní vědu v oblasti umělé inteligence. To je velká příležitost pro český průmysl a ekonomiku, protože umělá inteligence je motor, který bude zasahovat do všech oblastí vědy a ekonomiky, od biologie, chemie, po robotiku a bankovnictví. Bude to tak významný motor, že pokud mu nebudeme rozumět a nebudeme ho umět sami vyvíjet, budeme prostě pozadu,“ vysvětluje.

Kolega kolegovi

V Česku existuje několik způsobů, jak získat grant na výzkum. Ty velké pocházejí z Technologické agentury ČR (technologicky zaměřená TAČR) a Grantové agentury ČR (GA ČR), jež spravuje také některé mezinárodní výzvy. GA ČR měla loni na vědecké projekty 4,49 miliardy korun. Některé grantové výzvy jsou vedené pod ministerstvem školství, což je také případ evropského Operačního programu Jana Amose Komenského, jehož výsledky v CIIRCu udivily. Právě tam totiž projekt Mikolova pohořel.

Největším problémem financování české vědy je netransparentnost hodnocení grantů v některých případech, říkají zástupci CIIRC. „Někdy o projektech rozhodují úředníci MŠMT bez relevantních odborných posudků. Jaká může být relevance takzvaného konsensuálního hodnocení projektu zaměřeného na umělou inteligenci, pokud se k němu na dálku a bez posudku vyjadřuje odborník v oblasti strojního inženýrství a právnička (konkrétně takto zadalo MŠMT hodnocení našeho CIIRC ČVUT projektu OP JAK projekt č. CZ.02.01.01/00/22_008/0004582). A pokud se odvoláte, o odvolání rozhodnou opět úředníci, nejlépe ti, kteří vás hodnotili. A podobným postupem se v OP JAK rozdělilo více než 12 miliard korun!“ diví se ředitel CIIRC Ondřej Velek.

Hlaváč vysvětluje, že v Česku se posuzovatelé grantů hlásí dobrovolně z řad odborníků, kteří nutně nemusí všem oblastem rozumět na špičkové úrovni. V systému jsou jim pak přiděleny jednotlivé projektové žádosti. A protože v „nabídce“ nemusejí být zrovna ti, kteří jsou na danou problematiku odborníky, stává se, že projekt na umělou inteligenci posuzuje expert na zcela jiné téma. Jména autorů slavných ve svém oboru a výborné žádosti jim tak nemusí nic říct. „Je možné, že je vůbec neznali. Pokud posuzuji cizí projekty já, a v životě jsem to dělal mockrát, také ty lidi neznám. Dají se vyhledat, ale ne každý to musí dělat. Naopak samozřejmě, kdyby mi přišel projekt, který navrhl Michal Pěchouček, už v tu chvíli by mi to přišlo zajímavé. Nutno říct, že bych ho nedostal k posouzení kvůli střetu zájmů. Takhle se na to ale oni asi nemohli dívat, protože to jméno neznali,“ říká Hlaváč.

Na svou teorii získali přes čtvrt miliardy. Startup Equilibre začal stahovat do Prahy světové kapacity na AI Přečtěte si také:

Na svou teorii získali přes čtvrt miliardy. Startup Equilibre začal stahovat do Prahy světové kapacity na AI

Problémy ale můžou být i jinde. „Co se týče posuzování českých grantů, také si myslím, že systém je nastavený špatně, když žádosti v některých případech neposuzují lidé z daných oborů. Často se neposuzuje ani mezinárodní přesah. Stále se tu hraje na to, že se musí prosazovat fakulta a univerzita, ze které člověk je. A výzkumné projekty se tu nekonfrontují se zahraničím. Dokonce si myslím, že pokud hodnotitel dostane žádost od člověka lepšího než je on sám, prostě mu grant nepřidělí,“ uvádí anonymně jeden z doktorandů v oboru politologie na soukromé univerzitě v Česku. 

Jako spolužadatel o granty si užil jak pocit úspěchu, tak neúspěchu. „Komise bývá složená z lidí z mnoha oborů, a protože se v akademické obci mnozí znají, může se stát, že grant přidělí známému nebo zabrání jeho přidělení někomu, koho nemají rádi. Myslím, že když žádal jeden můj kolega o docela zajímavý grant a v žádosti neuvedl několik zdrojů českých kolegů, které mu nepřišly tak důležité jako ty zahraniční, grant právě kvůli tomu nezískal. Skutečně jsem dospěl k závěru, že roli hraje i osobní vztah k žadateli,“ dodává.

Odmítnout žádost je podle něj poměrně jednoduché – vždy se dá úkon vysvětlit tak, že nesplnila kritéria nebo že na projekt nebyly peníze Vysvětlení může být i poměrně vágní. „Kritérium není jasně dané,“ shrnuje doktorand.

„Rozhodování o přidělení grantů by mělo být nezávislé na tom, kdo má kde jakého kamaráda,“ nastiňuje podobně Hlaváč. Na dotaz, zda má dojem, že to tak není, reaguje jednoznačně: „Minimálně na příkladu z umělé inteligence to tak není,“ říká. „Nemusí to být zlý úmysl. Jen to tak třeba někdo nedomyslí,“ doplňuje.

Jen excelentní základní výzkum

„Návrhy projektů zaslané do soutěží Grantové agentury České republiky hodnotí výhradně vědci – odborníci na danou oblast z různých českých i zahraničních vědeckých pracovišť. Jejich minimální kvalifikace je získání titulu Ph.D., nicméně v minulém roce jich dvě třetiny měli kvalifikaci ještě vyšší (36 % profesorů a 30 % docentů). Z nominovaných vědců vybírá hodnotitele komise složená z člena vládní Rady pro výzkum, vývoj a inovace (RVVI), předsednictva GA ČR a vědecké rady GA ČR. Abychom pokryli celou oblast základního výzkumu, v panelech a oborových komisích působí přes 500 vědců, z čehož pro vysoce výběrové soutěže EXPRO a JUNIOR STAR jsou tyto orgány složeny výhradně ze zahraničních vědců,“ přibližuje systém GA ČR Vojtěch Janů z agentury. 

Hodnotitelé podle něj popisují mimo jiné to, jak moc vyřešení navrhované výzkumné otázky posune současné poznání, respektive stav vědy, nebo jestli má tým potenciál otázku vyřešit. Odborníci diskutují a vybírají zhruba polovinu projektů, které postupují do druhé fáze, na ty vypracovávají posudky zahraniční vědci a jejich hodnocení pak experti opět diskutují.

Honza Javorek (Junior Guru): Jenom člověk vám řekne, co ChatGPT poradil špatně Přečtěte si také:

Honza Javorek (Junior Guru): Jenom člověk vám řekne, co ChatGPT poradil špatně

„Grantová agentura České republiky financuje pouze excelentní základní výzkum. Od letošního roku je financováno přibližně 18,5 % návrhů projektů, které se do našich soutěží přihlásily,“ doplňuje Janů s tím, že číslo je malé i v rámci evropského srovnání s obdobnými agenturami. Vzhledem k rozpočtu GA ČR ale víc financovat nemůže. „V minulých letech stagnoval a vzhledem k inflaci se fakticky významně snižoval. Nejsme tak schopni financovat přibližně dalších 10 % projektů, které by si podle našich poradních orgánů financováni zasloužily. I tyto projekty totiž dosahují mezinárodní úrovně, ale zůstávají takzvaně pod čarou,“ říká.

„Velmi nás mrzí každý vědec, který se rozhodne z české vědy odejít. Nedomníváme se však, že by příčina měla být v grantovém financování jako takovém,“ uvádí za agenturu. Kvalitu výzkumu v zemi podle něj pomáhá zvyšovati důkladné promyšlení vědeckých nápadů při přípravě na žádost o grant. 

„Další výhodou grantového financování je, že i pokud není projekt podpořen, je mu poskytnuta zpětná vazba, která může vést k dalšímu zlepšení výzkumu daného badatele. To je samozřejmě možné jen za předpokladu, že je hodnocení provedeno kvalitně. Věříme, že s ohledem na již zmíněné aspekty, jako je vysoká erudice hodnotitelů, zapojení zahraničních vědců i převzetí principů ERC, může Grantová agentura ČR jít ostatním poskytovatelům grantového financování příkladem,“ říká.

Kolik světových průlomů je dostatečné množství?

Mezi reakcemi na to, že Mikolov za pět let nezískal žádný významný grant, zaznívají i skeptičtější názory. Někteří experti zmiňují, že vypracování žádostí mohlo být preciznější. A ještě častěji, že vědecký průlom, díky němuž patří Mikolov mezi nejcitovanější české vědce vůbec, pochází z roky starých prací a i kdyby expert nic dalšího nevyzkoumal, citace se budou nabalovat a své místo mezi nejcitovanějšími si tak i pro další roky udrží. Prostě: Mikolov přinesl jeden velký objev. Ale je to už dávno.

„O to přeci nejde. Je možné, že takoví lidé třeba s žádným druhým přelomem nepřijdou. Vědec je nejplodnější v postdoktorském období. Ale když jsou jednou schopní, tak jsou schopní i nadále. To je princip vytváření vědecké skupiny, předávání zkušeností, na univerzitách by se mělo toto období podpořit,“ říká Hlaváč. „Vysoké školy jsou nositelem výzkumu,“ upozorňuje.

Leoš Kyša: První recenzi na moji knihu o AI napsala umělá inteligence Přečtěte si také:

Leoš Kyša: První recenzi na moji knihu o AI napsala umělá inteligence

„S Tomášem Mikolovem jsem dlouze mluvil, když za mnou přišel se žádostí o rozvázání pracovního poměru. Lidsky jeho obrovské zklamání chápu. Vrátil se domů, aby zde něco dokázal, vybudoval svůj tým mladých následovníků. Za pět let se mu ale nepodařilo získat jediný významný projekt," dodává ředitel CIIRC Velek

"Když po úspěšném hodnocení v prestižním evropském ERC grantu měl dle pravidel konečně automaticky získat financování z MŠMT ERC-CZ, jako jedinému mu ho dali se 40% spoluúčastí. To je pro základní výzkum likvidační podmínka! Přesto jsme do toho šli i za cenu, že na těchto 40 % se vlastně musí složit ostatní výzkumníci v CIIRC. Rozumím ale Tomášovi, že po pěti letech se cítil tímto stavem unaven. Není důstojné, aby nejcitovanější český vědec ve své rodné zemi neuspěl v získání grantu,“ doplňuje.

Pátí na světě, ale se zpožděním

„Někdy to působí jako klasický vtip – když se to hýbe, zdaňte to, když se to nehýbe, dejte tomu dotace,“ říká s velkou nadsázkou Jiří Chod, když hovoříme o možnosti získat na univerzitní výzkum v Česku granty. 

Chod je emeritním docentem z Fakulty elektrotechnické ČVUT v Praze a zkušenosti s granty má bohaté. Asi deset let v řadě se mu dařilo příspěvky na výzkumnou práci získávat, a i když říká, že administrativa kolem nich byla náročná, nevidí ji jako to nejnegativnější. „Je fakt, že většinou musíte mít k efektivnímu projektovému pokroku tým minimálně pěti lidí a že vykazování výsledků projektu komisi během realizace grantu zabere spoustu času i energie každého člena týmu,“ popisuje. Na tu nejtěžší administrativu mají školy pracovníka, ovšem ten se nemůže vyznat ve specifikách konkrétních projektů, takže část práce zůstává na výzkumnících.

Problém vidí v systému, jak peníze do škol směřují. V některých případech granty vyžadují povinný příspěvek školy, což je pro fakulty na hraně jejich hospodaření. Objem finančního pokrytí běžného technologického výzkumu pak Chod považuje za nedostatečný. „Netroufám si posuzovat koncepci základního výzkumu i celou státní politiku, ale myslím si, že do ‚vzorového‘ postupu nám hodně chybí,“ říká a hovoří o příkladu Finska z minulého století, které si udělalo důkladnou analýzu svých možností, vytipovalo budoucí nadějné směry, mezi které patřila například mobilní komunikace, a po masivních investicích si tak umožnilo vedoucí postavení země v oboru. „Zde nevidím vizi budoucnosti,“ uvádí.

Evropa je v kómatu a potřebuje Muskův úřad DOGE, burcují technologičtí šéfové Přečtěte si také:

Evropa je v kómatu a potřebuje Muskův úřad DOGE, burcují technologičtí šéfové

Jednotnou koncepci postrádají i další vědci a ti z CIIRCu za její nedílnou součást považují umělou inteligenci. „Ačkoliv do umělé inteligence okolní země v Evropě a další státy ve světě investují velké prostředky – a to začíná vždy výzkumem, na který se nabaluje transfer a pak aplikované projekty – u nás zatím jasná dlouhodobá investice do AI výzkumu v implementaci Národní AI strategie chybí,“ říká Šivic.

„Jen smutně dodávám, že Tomáš dělá výzkum v oblasti jazykových modelů jako je ChatGPT. Což je oblast, která silně rozhodne o úspěchu a bohatství naší ekonomiky v dalších letech,“ popisuje Velek. „S Tomášem jsme se alespoň domluvili, že bude dále pomáhat svým kolegům, kteří zůstali, a s CIIRC bude i nadále spolupracovat, jen trochu jinak. Jeho odchod z akademické sféry ale vnímáme jako velkou ztrátu pro celou českou, potažmo světovou, vědu,“ doplňuje.

Šivic věří, že by se situace mohla změnit. Před několika dny hovořil o AI v Senátu a uvedl mimo jiné, že české AI zaujímá přední pozice v Evropě a na světě. Předestřel, že ve zpracování přirozeného jazyka a řeči jsme pátí na světě, v počítačovém vidění pátí v Evropě a mimo jiné spoluvyvíjíme tři z pěti nejlepších systémů na strojové učení na světě. 

„V jednaní na MŠMT, MPO a RVVI je teď několik významných programů. Klíčový je program AI Chairs inspirovaný podobnými úspěšnými programy v zahraničí, který by měl podpořit přední české AI vědce, aby do zahraničí neodcházeli, a naopak přitáhnout ze zahraničí další, aby u nás založili své výzkumné skupiny. Tito vědci by spolupracovali ve virtuálním AI institutu, který by propojil přední česká AI pracoviště, fungoval jako katalyzátor přenosu výsledků do aplikací a vychovával špičkové AI odborníky pro vědu a průmysl,“ popisuje.

Je to pozdě, v EU vše trvá. Ale dáme to, říká Čech, který povede vývoj evropské konkurence pro OpenAI či DeepSeek Přečtěte si také:

Je to pozdě, v EU vše trvá. Ale dáme to, říká Čech, který povede vývoj evropské konkurence pro OpenAI či DeepSeek

Pokud by vláda projekt schválila, mohlo by se začít už v roce 2026. „Máme proti ostatním zemím zpoždění, s podobnými programy začínaly před 5 až 7 lety. Věřím ale, že stále není pozdě a je možné, že se jedná o investici, která bude zásadním způsobem ovlivňovat prosperitu země v příštích desetiletích,“ říká Šivic.

Mikolov dlouhodobě mluví o riziku, že Evropa ve vývoji umělé inteligence zaostane za Spojenými státy nebo Čínou. „Evropa si tuto technologii nechala utéct do zahraničí,“ uvedl mimo jiné na předloňské diskusi NetClub (tady najdete její kompletní videozáznam).

„Pokud zaostaneme v současných i odhadovaných trendech technologií budoucnosti, tak jsme ztraceni a budeme podřadným státem. Nebudou lidé, kteří jim budou rozumět, a každý s námi podle toho naloží,“ myslí si Chod.

Rok přípravy na grant

A samotné nastavení grantů? V technologiích je problém už proto, že je nutné projekt dotáhnout do konce bez podstatnějších změn přesně tak, jak se naplánuje na začátku. „Okolnosti mohou změnit realitu vaší práce,“ říká Chod. Vyvíjí se rychlejší zařízení i zcela odlišné systémy. „Jenomže vy nemáte možnost flexibilního přizpůsobení plánů podle aktuálních potřeb trhu nebo objevujících se trendů v oboru, co se týče používaných technologií. Proto někdy skončíte u horších variant hardwaru či softwaru, abyste splnili kritéria stanovená komisemi při schvalování dotací. Přestože svět kolem vás pokračuje a rychle mění svou dynamiku. Takže realizujete svůj nápad, který měl potenciál uspět, ale postupem času pracujete na něčem, co již není zcela aktuální ani relevantní vůči současným standardům technologie, kterou chcete používat,“ říká. Žádosti o změny často nemusí dojít schválení, a tak v případě, že se výzkumníci od plánu významně odchýlí, následují sankce.

Ve většině nemocnic v Česku už se setkáte s AI. Její nasazení roste exponenciálně, hlásí zařízení Přečtěte si také:

Ve většině nemocnic v Česku už se setkáte s AI. Její nasazení roste exponenciálně, hlásí zařízení

Významný čas zabere už příprava výzkumníků na samotné žádosti. „Musí splňovat nejen přísná kritéria vědecké excelence, významného celospolečenského dopadu a kvality implementačního plánu, ale i přísné požadavky na administrativní zpracování. Podání kvalitní žádosti do prestižní výzvy, jakou je např. Teaming for Excellence, představuje přibližně rok intenzivní přípravy,“ přibližuje Velek. „České dotační programy se pak obvykle vyznačují vyšší mírou byrokratické zátěže a formalistického přístupu v hodnocení,“ dodává. 

O podobném čase na přípravu hovoří i Chod. Od zahájení přípravy kostry náplně vlastní činnosti, přes vypsání soutěže grantovou agenturou a podání žádosti až po vyhodnocování různých žádostí, které samotné můžou zabrat zhruba půl roku, může podle něj uplynout 12 až 18 měsíců. „Největší problém je technický pokrok, který za tu dobu uplyne a může zásadně změnit výsledek vašeho snažení. Tam pak kromě božské prozřetelnosti ještě může pomoci konečné jednání těsně před zahájením grantu, to teď není, a je to chyba,“ popisuje.

Jednou z možných cest pro výzkum v Česku je podle něj rizikový kapitál, proti Česku rozšířenější v zahraničí – když výzkumníci přesvědčí soukromé investory, že jejich plán má šanci na úspěch, celý proces je flexibilnější a výsledky nemusejí nutně odpovídat prvotním zadáním a slibům. Během výzkumu se tak dá snáze reagovat i na posun technologií. Podle statistik většina těchto projektů nedojde do zdárného konce. „Ale ten zbytek znamená špičkové řešení, které to vše nepovedené nahradí a obor posune. Otázka však je, jestli tu máme dost takových zdrojů,“ dodává Chod. Další možností jsou podle odborníka granty na menší projekty, tedy na ty, které trvají méně než běžných tři či pět let.

„Hlavní problém je, že se k systému výběru přistupuje úřednicky. Není stanoveno, že by za špičkové výsledky každé oblasti měla individuální zodpovědnost určitá osobnost, na níž by bylo najít cesty, které k takovým výsledkům povedou. Člověk s individuální zodpovědností by mohl odhalit i zvláštnosti nebo směřování systému mimo správnou cestu, která třeba může vyhovovat formálním pravidlům,“ navrhuje Hlaváč.

MM Influenceři

Vysvětluje, že stát má AI za jednu z prioritních oblasti (v rámci NAIS od roku 2019). „Ale když se vypisují velké strategické projekty a žádný z přidělených grantů není z umělé inteligence, je to přeci divné, ne?“ táže se řečnicky. „Pak by měl zasáhnout člověk, který realizuje strategii. Ten kontrolní mechanismus vůbec nezafungoval,“ říká. Podle něj se v Česku obvykle bez problémů přisuzují granty projektům, jejichž základní výzkum splňuje běžné přístupy vědců. „Když je to standard, není to takzvaně myšlení ‚out of the box‘, mimo běžný rámec. Ale Tomáš Mikolov, to není standardní situace,“ říká.

Systém se podle něj nemusí rozbít a postavit celý znovu. „Stačí zařadit mechanismus, který pohlídá, že si někdo všimne, pokud vznikne zvláštnost. Nebo pokud se řítíme někam, kam nechceme, byť to vyhovuje formálním pravidlům. Úředník, který chce z logiky své pozice mít co nejmenší starost, to nechá běžet,“ myslí si.

  • 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ářka, která dává dohromady čísla a příběhy. Do článků se jí dlouhodobě vetřely především technologie a startupy. Pracovala pro Českou televizi, tisk i web.

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