Notebook, tablet nebo stolní počítač? Skládačka Asus Zenbook 17 Fold OLED zvládne vše (recenze)

Sdílet

 Autor: Asus
Asus vždy patřil mezi hardwarové průkopníky a nebál se přicházet se zajímavými inovacemi. Jednou z nejzajímavějších za poslední dobu je Zenbook 17 Fold OLED. Notebook s ohebným displejem, který je možné proměnit v tablet i stolní počítač. Jak se to celé Asusu podařilo?

Vzhled a zpracování:

Fold 17 OLED je (téměř) unikátem svého druhu a pokusem Asusu o vytvoření kompaktního notebooku, který lze zároveň proměnit na plnohodnotnou pracovní stanici. A nutno říci, že se to Asusu vesměs podařilo. Po vybalení z krabičky (spíše z krabice) se dostanete k zařízení, které už od pohledu budí prémiový dojem a stejné pocity máte i při uchopení notebooku do ruky.

V zavřeném stavu vypadá Zenbook 17 Fold OLED jako větší knížka (zdroj: Cnews)
V zavřeném stavu vypadá Zenbook 17 Fold OLED jako větší knížka (zdroj: Cnews)
Spodní/zadní strana s výklopným stojánkem (zdroj: Cnews)
Spodní/zadní strana s výklopným stojánkem (zdroj: Cnews)

V zavřeném stavu působí Fold jako větší knížka s přebalem z hořčíkové slitiny a umělé kůže. Pokud budete chvíli zkoumat záda proti světlu, objevíte i logo Asusu. Druhá část zad (v režimu notebooku ta spodní) obsahuje výklopný stojánek, kterým je možné naklopit displej v rozloženém stavu přibližně na 122°. Toto je bohužel jediný úhel naklopení a pokud vám z jakéhokoliv důvodu nevyhovuje, máte smůlu.

Stojánek nabízí pouze jednu polohu (zdroj: Cnews.cz)
Stojánek nabízí pouze jednu polohu (zdroj: Cnews.cz)
Zadní část odkrývá logo Asusu (zdroj: Cnews.cz)
Zadní část odkrývá logo Asusu (zdroj: Cnews.cz)

Hlavní dominantou je ohebný OLED displej s kloubem, který podle výrobce vydrží až 30 000 otevíracích cyklů. Osobně nehodlám trávit dlouhé dny otevíráním a zavíráním Foldu, nezbývá mi tedy, než Asusu toto tvrzení věřit. Byť může celkový mechanismus v kloubu vypadat složitě, proces otevírání je až překvapivě jednoduchý. Stačí vzít obě poloviny displeje za roh a tlačením od sebe displej otevřít. Vyvarujte se vyvíjením tlaku v místě, kde dochází k ohybu displeje. V opačném případě byste mohli displej nenávratně poškodit.

Po přiložení klávesnice se Fold automaticky změní na kompaktní notebook (zdroj: Cnews)
Po přiložení klávesnice se Fold automaticky změní na kompaktní notebook (zdroj: Cnews)
Rozložením získáte 17,3" pracovní stanici s klávesnicí (zdroj: Cnews)
Rozložením získáte 17,3" pracovní stanici s klávesnicí (zdroj: Cnews)

Na místě je zmínit také hmotnost Zenbooku samotného a bezdrátové klávesnice. Fold 17 bez klávesnice váží přibližně 1,5 kg a připočtením 300g klávesnice tak máte v rukou docela cvalíka. To může znít nepříliš lákavě – pokud ale vezmete v potaz fakt, že i klasické 17" notebooky mají běžně okolo 2 kg i více, rázem získává celková hmotnost Foldu s klávesnicí světlejší ráz. Ještě doplním hmotnost napájecího adaptéru – přibližně 320 g.

Bez magnetické klávesnice se v zavřeném stavu mezeře nevyhnete (zdroj: Cnews)
Bez magnetické klávesnice se v zavřeném stavu mezeře nevyhnete (zdroj: Cnews)
Boky ukrývají čtveřici reproduktorů s Dolby Atmos (zdroj: Cnews)
Boky ukrývají čtveřici reproduktorů s Dolby Atmos (zdroj: Cnews)
Spodní strana v uzavřeném stavu (zdroj: Cnews)
Spodní strana v uzavřeném stavu (zdroj: Cnews)

Parametry:

Displej: OLED panel, 100% DCI-P3, DisplayHDR TrueBlack 500, Pantone, Dolby Vision, až 500 nitů, obnovovací frekvence 60 Hz
  • v rozloženém stavu: 17,3" (4:3), 2560 × 1920 px
  • ve složeném stavu: 12,5" (3:2), 1920 × 1280 px
Procesor: Intel Core i7-1250U (Alder Lake), turbo až 4,7 GHz, 10 jader (2/8), 12 MB cache, TDP 9 W (max. 29 W)
Grafický čip: Intel Iris Xe, až 1,25 GHz
Operační paměť: 16 GB LPDDR5 (integrované)
Disk: 1 TB SSD M.2 NVMe PCIe 4.0 (Samsung PM9A1)
Klávesnice: bezdrátová Bluetooth 5.1, ANSI, bez podsvícení, bez numerického bloku, US layout, zdvih 1,4 mm
Porty:
  • 2× Trunderbolt 4 (rychlost až 40 Gb/s, DisplayPort a Power Delivery)
  • kombinovaný 3,5mm audio jack
Sítě: Wi-Fi 6E (802.11ax), Bluetooth 5.2
Akumulátor: 75 Wh Li-Ion
Operační systém: Windows 11 Pro
Výbava a funkce:
  • Intel Evo
  • 5Mpx webkamera s IR senzory, AdaptiveLock
  • 4 reproduktory harman/kardon s Dolby Atmos a inteligentním zesilovačem
  • odolnost MIL-STD 810H
  • senzor pro automatické řízení jasu a teploty barev
Rozměry a hmotnost:

37,9 × 28,8 × 0,9 až 1,3 cm

hmotnost 1,5 kg (bez klávesnice), 1,8 kg (s klávenicí)

Materiál: tělo z hořčíkové slitiny a umělé kůže, klávesnice z odolného plastu

Displej:

Asus se rozhodl pro použití OLED panelu a výsledek opravdu stojí za to. Ať už se rozhodnete na notebooku dělat cokoliv, vždy se budete dívat na nádherně živý displej s vynikajícími barvami. Připočtěte k tomu certifikaci DisplayHDR True Black 500, 100% barevný gamut DCI-P3, validaci pro zobrazení barev Pantone a výsledkem je špičkový displej stvořený nejen pro digitální kresbu a práci s fotografiemi. Vynikající je také maximální jas až 500 nitů.

Asi nikoho nepřekvapí, že hlavním tahounem nového Foldu je ohebný OLED displej. Ten je už nějakou dobu známý ve světě smartphonů, na poli notebooků se o něco podobného pokusilo zatím jen Lenovo, byť ne úplně úspěšně.

 

 

V hlavní roli ohebný 17,3" OLED panel (zdroj: Cnews)
V hlavní roli ohebný 17,3" OLED panel (zdroj: Cnews)
Pokud nemáte po ruce bezdrátovou klávesnici přichází na řadu virtuální (zdroj: Cnews.cz)
Pokud nemáte po ruce bezdrátovou klávesnici přichází na řadu virtuální (zdroj: Cnews.cz)

Asus vždy rád experimentoval a pouštěl se do dosud neprobádaných vod a zdá se, Fold 17 OLED není výjimkou. Použitím ohebného displeje získáváte dle Asusu hned 6 pracovních režimů (tím se chlubí pomalu každý notebook s otočným displejem). Osobně mi však nedává nejméně polovina z nich vůbec smysl a reálně využitelný je hlavně klasický režim notebooku s 12,5" displejem, režim tabletu a konečně PC režim, kdy kompletním rozložením získáte velký 17,3" displej.

OLED panel nabízí hned několik certifikací OLED panel nabízí hned několik certifikací (zdroj: Asus.com)

Osobně jsem notebook nejčastěji při práci používal v rozloženém stavu, kdy jsem se díval na 17,3" displej s rozlišením 2560 × 1920 a poměrem stran 4:3. Pokud bylo potřeba, položením magnetické klávesnice na polovinu displeje jsem se dostal do klasického režimu notebooku s 12,3" displejem s rozlišením 1920 × 1280 px a poměrem stran 3:2.

Nastavení barevného zobrazení v MyAsus (zdroj: Cnews)
Nastavení barevného zobrazení v MyAsus (zdroj: Cnews)
Nastavení funkce AdaptiveLock v MyAsus (zdroj: Cnews)
Nastavení funkce AdaptiveLock v MyAsus (zdroj: Cnews)

K displeji se pojí také dvě funkce, konkrétně funkce Adaptive Lock a barevný senzor. První funkce dokáže snížit jas nebo uzamknout notebook v případě vašeho odchodu od počítače za účelem šetření baterie a automaticky jej opět zvýší a přihlásí vás, pokud se vrátíte zpět před displej. Celé to v podstatě funguje až na pár výjimek dobře. To samé bohužel nemohu říci o barevném senzoru, který má mít za úkol automatickou úpravu jasu a teploty barev obrazovky na základě okolního osvětlení. Často mi notebook sám od sebe změnil barevný odstín displeje hned několikrát, byť denní světlo v místnosti jasně indikovalo krásné slunečné dopoledne. Nezbývá než doufat, že v nějaké z budoucích aktualizací Asus tento problém vyřeší.

5Mpx webkamera disponuje podporou Windows Hello a funkcí AdaptiveLock 5Mpx webkamera disponuje podporou Windows Hello a funkcí AdaptiveLock (zdroj: Cnews)

Klávesnice:

Nedílnou součástí Foldu 17 je velmi tenká bezdrátová klávesnice typu ANSI, kterou lze navíc připojit skrze Bluetooth 5.1 až ke dvěma zařízením současně a rychle mezi nimi přepínat. Jen není příliš jasné, co by mělo být tím druhým zařízením.

Klávesnice jako taková nabízí na notebookové poměry poměrně standardní zdvih 1,4 mm a rozteč jednotlivých kláves od sebe asi 19 mm. Nabíjení klávesnice probíhá skrze USB-C konektor na pravé straně, kde se nachází také přepínač pro zapnutí a vypnutí. Současně s notebookem ji nabíjet nejde.

Propojení magnetické klávesnice s notebookem probíhá skrze Bluetooth (zdroj: Cnews)
Propojení magnetické klávesnice s notebookem probíhá skrze Bluetooth (zdroj: Cnews)
Klávesnici s ANSI rozložením by slušelo alespoň bílé podsvícení (zdroj: Cnews)
Klávesnici s ANSI rozložením by slušelo alespoň bílé podsvícení (zdroj: Cnews)

Na klávesnici se dá rychle zvyknout a po pár dnech používání je možné psát rychle a téměř bez překlepů. S čím jsem ale po dobu testování měl problém, byla asi půl vteřinová prodleva mezi počátečním stiskem klávesy po reálné zapsání znaku. Bohužel toto je dáno komunikací klávesnice skrze Bluetooth a je to věc, se kterou se budete muset před pořízením Foldu smířit. Stejnou prodlevou trpí také touchpad, ke kterému jinak nemám výtek. Samotné klávesnici by slušelo také alespoň bílé podsvícení.

Konektivita a zvuk:

Pokud na Foldu čekáte vzhledem k jeho rozměrům bohatou konektivitu, bude pro vás přítomnost pouze kombinovaného 3,5mm audio jacku a dvojice Thunderbolt 4 portů určitým zklamáním. Oba USB-C porty nabízí přenosovou rychlost až 40 Gb/s a podporují napájení notebooku se standardem Power Delivery. Skrze tyto porty také připojíte další monitor alternativním DisplayPort režimem. V balení se nachází také redukce z USB-C na klasické USB 3.2. Z bezdrátové konektivity se Fold pochlubí Wi-Fi 6E (802.11ax) a Bluetooth 5.2.

Klávesnice příjemně zaplní mezeru... (zdroj: Cnews)
Klávesnice příjemně zaplní mezeru... (zdroj: Cnews)
...navíc ji budete mít vždy s sebou. (zdroj: Cnews)
...navíc ji budete mít vždy s sebou. (zdroj: Cnews)
S klávesnicí se připravte na hmotnost přibližně 1,8 kg (zdroj: Cnews)
S klávesnicí se připravte na hmotnost přibližně 1,8 kg (zdroj: Cnews)

Tělo notebooku obývá celkem čtveřice reproduktorů, které jsou navíc zesíleny až 3,5krát pomocí dvoukanálového zesilovače s čipem DSP. Výsledkem je kvalitní a bohatý zvuk, který na poměry notebooků zní opravdu skvěle jak při poslechu hudby, tak i při sledování filmů či seriálů. Záměrné umístění reproduktorů po bocích společně s Dolby Atmos vytváří vcelku uvěřitelný prostorový efekt, za což Asusu náleží palec nahoru.

Nastavení zvukových režimů v MyAsus Nastavení zvukových režimů v MyAsus (zdroj: Cnews)

Procesor a výkon:

Informace o procesoru CPU-Z Informace o procesoru CPU-Z (zdroj: Cnews)

Nový Asus 17 Fold OLED běží na 10jádrovém procesoru Intel Core i7-1250U patřícím do 12. generace mobilních procesorů s kódovým označením Alder Lake vyráběných na 10nm technologii. Tyto procesory mají jako první u Intelu hybridní architekturu – mix dvou typů jader P-Core a E-Core. Zatímco P-Core jádra sahají na špici při jednovláknovém výkonu, jádra E-Core naopak patří k úspornějším a podávají lepších výsledků při multijádrovém výkonu. Čtyři E-Core jádra tak mají přibližně stejný výkon jako dvě P-Core jádra.

Použitý procesor Intel Core i7-1250U má základní spotřebu 9 W, v boostu pak spotřeba stoupá až na 29 W. V základu mají jádra takt 1,1 GHz, v boostu stoupá maximální frekvence u E-Core jader na 3,5 GHz a u P-Core jader až na 4,7 GHz. Procesor disponuje 12 GB L3 cache a integrovanou grafickou kartou Intel Iris Xe 96EU s frekvencí až 1,25 GHz.

V mnou testované konfiguraci doplňuje procesor 16 GB LPDDR5 paměti RAM a 1TB SSD typu M.2 NVMe Samsung PM9A1, které nabízí vysoké přenosové rychlosti díky podpoře PCIe Gen4, o kterých se můžete přesvědčit z výsledků testování.

CrystalDiskMark při zápisu a čtení 1 GB (zdroj: Cnews)
CrystalDiskMark při zápisu a čtení 1 GB (zdroj: Cnews)
CrystalDiskMark při zápisu a čteční 512 MB (zdroj: Cnews)
CrystalDiskMark při zápisu a čteční 512 MB (zdroj: Cnews)
3DMark Storage Benchmark (zdroj: Cnews)
3DMark Storage Benchmark (zdroj: Cnews)
3DMark Time Spy při režimu počítače (zdroj: Cnews)
3DMark Time Spy při režimu počítače (zdroj: Cnews)
3DMark Time Spy při režimu notebooku (zdroj: Cnews)
3DMark Time Spy při režimu notebooku (zdroj: Cnews)
3DMark CPU Profile při režimu počítače (zdroj: Cnews)
3DMark CPU Profile při režimu počítače (zdroj: Cnews)
3DMark CPU profile při režimu notebooku (zdroj: Cnews)
3DMark CPU profile při režimu notebooku (zdroj: Cnews)
Výsledky testování Cinebench R23 (zdroj: Cnews)
Výsledky testování Cinebench R23 (zdroj: Cnews)
PCMark benchmark (zdroj: Cnews)
PCMark benchmark (zdroj: Cnews)

 

Výdrž:

Uvnitř Foldu se nachází 4článková Li-Ion baterie s kapacitou 75 Wh, která při běžném surfování dokáže pohánět notebook přibližně 8 hodin a 16 minut. Vše ale záleží na způsobu používání a na tom, zda využíváte pouze polovinu nebo celou plochu displeje.

K Zenbooku dostanete 65W napájecí adaptér (zdroj: Cnews.cz)
K Zenbooku dostanete 65W napájecí adaptér (zdroj: Cnews.cz)
Detail na napájecí adaptér (zdroj: Cnews.cz)
Detail na napájecí adaptér (zdroj: Cnews.cz)

Při nabíjení skrze dodávaný 65W adaptér zakončený USB-C konektorem se baterie nabila na 50 % kapacity baterie za 42 minut, 70% jí poté trvalo 59 minut a do plna se baterie nabila za hodinu a 58 minut. Notebook je možné díky podpoře Power Delivery nabíjet jakýmkoliv jiným 65W adaptérem.

z 0 na 50% kapacity z 0 na 70 % kapacity z 0 na 100 % kapacity
42 minut 59 minut 1 hodina a 58 minut

Hodnocení:

Testování Zenbooku 17 Fold a koncept ohebného displeje jsem si opravdu užil. Je to unikátní notebook, který i po odeznění prvotního „wow efektu“ nabídne vynikající barvy s OLED displejem, na poměry notebooku nadstandardně kvalitní reproduktory, moderní procesorem s architekturou Alder Lake a spoustou funkcí navíc. Možná bude ale lepší počkat na další generaci, které odstraní nedostatky prvního Foldu a přívětivě zahýbají s cenou.

docker + kubernetes školení s dotací tip

Za to vše si totiž nechá Asus pěkně zaplatit. Pokud byste o Zenbooku 17 Fold OLED přemýšleli, budete muset aktuálně z peněženky vytáhnout 88 tisíc a nějaké drobné. A to skutečně není málo. Pokud vás i přesto Fold zaujal a jste ochotni přehlédnout mírné nedostatky výměnou za unikátní ohebný displej, špatnou koupí určitě nebude.

Líbilo se mi: Nelíbilo se mi:
+ ohebný displej - nefunkční barevný senzor
+ vynikající OLED panel - mírná prodleva klávesnice
+ skloubení malého notebooku s velkým plnohodnotným počítačem - trochu bloatware (McAfee…)
+ Dolby Vision a Dolby Atmos - vysoká cena
+ kvalitní a hlasité reproduktory - pouze jedna poloha výklopného stojánku
+ vysoká výdrž baterie - klávesnice bez podsvícení
+ návyková funkce AdaptiveLock

 

Autor článku

Šéfredaktor portálu Cnews.cz. Zaměřuje se na technologické novinky, recenze spotřební elektroniky, smartphony, 3D tisk, AI a herní novinky. Profil autora →

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