Recenze Honor Magic6 Pro: právem oceňovaná vlajka s potenciálem zavařit konkurenci

Sdílet

 Autor: Cnews (Dominik Dobrozenský)
Honor po dříve představeném Magic6 Lite uvedl do prodeje i vlajkovou verzi Pro, která se pyšní extra elegantním designem, 180Mpx periskopickým teleobjektivem a potenciálem smést ze stolu všechny letošní vlajkové smartphony ostatních výrobců.

Obsah balení:

Co se dozvíte v článku
  1. Obsah balení:
  2. Parametry:
  3. Vzhled a celkové zpracování:
  4. Displej:
  5. Uživatelské rozhraní:
  6. Výkon:
  7. Výdrž:
  8. Fotoaparát:
  9. Závěr:

Balení nového Honoru Magic6 Pro je natolik prémiové, nakolik vy sami věříte v environmentalismus. V balení tak mimo samotný smartphone najdete pouze metrový USB-C kabel pro nabíjení a případný přenos dat, nějaké ty příručky a špendlíček pro vyjmutí slotu na SIM karty. To je bohužel z balení vše.

Balení je po vzoru Samsungu „prémiové“

Balení je po vzoru Samsungu „prémiové“

Autor: Cnews

Parametry:

Rozměry a hmotnost:

162,5 × 75,8 × 8,9 mm; 225 g

Zpracování:

displej s odolným sklem NanoCrystal Shield, záda z polymeru, rám z hliníku, odolnost IP68

Displej:

6,8" LTPO OLED displej, 2800 × 1280 px, 120 Hz, HDR, jemnost 453 PPI, jas až 5000 nitů

Procesor:

Qualcomm Snapdragon 8 Gen 3 (4 nm), 8jádrový, frekvence až 3,3 GHz, grafický akcelerátor Adreno 750

RAM a paměť:

12 GB RAM + 512 GB vnitřní úložiště

Selfie kamera:

50 Mpx, f/2.0, širokoúhlý, až 4K@30fps, TOF 3D senzor

Zadní fotoaparáty:
  • hlavní: 50 Mpx, 1/1.3, f/1.4–2.0, 23 mm, PDAF, OIS, Laser AF
  • periskopický teleobjektiv: 180 Mpx, 1/1.49,  f/2.6, PDAF, OIS, 2,5násobný optický zoom
  • ultraširokoúhlý: 50 Mpx, f/2.0, 13 mm, 122°, AF
Nahrávání videa:

4K@60/30fps, 1080p@240/60/30fps, gyro-EIS, podpora 10bitového videa a HDR

Baterie a nabíjení:

5600 mAh, rychlonabíjení 80 W, bezdrátové nabíjení 66 W, reverzní drátové a bezdrátové nabíjení 5 W

Operační systém:

Android 14 s nadstavbou MagicOS 8 s Google službami

Konektivita a funkce:
  • 5G, 4G, GSM, Wi-Fi 7, Bluetooth 5.3 (aptX HD)
  • GPS, GLONASS, GALILEO, BDS
  • USB-C 3.2, NFC, infraport, dual nanoSIM, optická čtečka otisku prstů, odemykání obličejem Face ID

Vzhled a celkové zpracování:

Nový Honor Magic6 Pro je vskutku elegán po všech směrech. Stejně jako jeho letošní bratříček Honor Magic6 Lite i prémiové verzi Pro dominuje kulatý fotomodul na zádech, který je podle výrobce inspirován kopulí hvězdné oblohy s hvězdami uvnitř.

Telefon vypadá prémiově nejen na obrázcích, ale i ve skutečnosti

Autor: Cnews

Smartphone je dostupný pouze ve dvou barevných variantách – černé a mnou testované pastelově zelené, která v ruce působí jako opravdový elegán. Záda samotná jsou vyrobena z polymeru příjemného na dotek s jemnou texturou, která nezanechává otisky prstů a celkově napomáhá k příjemnému úchopu.

Zelená varianta budí pozornost
Zelená varianta budí pozornost (zdroj: Cnews)
Detail na mohutný fotomodul na zádech
Detail na mohutný fotomodul na zádech (zdroj: Cnews)

Hlavní dominantou zad je pochopitelně mohutný fotomodul vystupující nad zády o dobrého půl centimetru. Rovněž hmotnost 225 gramů je malinko větší, ovšem vzhledem k výbavě a velké 5600mAh baterii ji výrobci protentokrát promineme.

Jak záda, tak i displej se mírně ve 2,5D efektu sbíhají do kovového rámečku, který nese už poměrně standardní rozložení. Tedy na pravé straně zapínací tlačítko společně s kolébkou pro změnu hlasitosti a napájecí USB-C 3.2 společně s hlasitým reproduktorem a šuplíčkem pro dvojici nanoSIM karet vespod. Do vínku pak Honor přibalil i infraport na vrchní straně telefonu.

Tlačítka mají své místo standardně na pravém boku
Tlačítka mají své místo standardně na pravém boku (zdroj: Cnews)
Spodní strana telefonu
Spodní strana telefonu opět se standardním rozložením (zdroj: Cnews)

Podporu eSIM beru u prémiových telefonů jako samozřejmost, pochvalu však Honor zaslouží za řádnou odolnost IP68 umožňující bezpečné ponoření telefonu do vody.

Displej:

Honor Magic6 Pro se pyšní hned několika DXOMARK oceněními a jedním z nich je i GOLD 2024 ocenění v oblasti displeje. A nutno podotknout, že dost oprávněně. 6,8 LTPO OLED panel nabízí jemné zakřivení s 2,5D efektem po bocích a jeho používání je jedním slovem parádní.

Dominantou je 6,8" LTPO OLED displej
Dominantou je 6,8 LTPO OLED displej (zdroj: Cnews)
Detail na přední selfie a 3D kameru
Detail na přední selfie a 3D kameru (zdroj: Cnews)

Vzhledem k úhlopříčce je dostatečné i rozlišení 2800 × 1280 px a jemnost 453 PPI. Honor v nastavení nabízí nejen možnost volby mezi pevně stanovenou frekvencí a dynamickou pro změnu frekvence v závislosti na zobrazovaném obsahu, nabízí také možnost nastavení pevně daného rozlišení, případně ponechání chytrého rozlišení. V případě chytrého rozlišení telefon mění rozlišení displeje v závislosti na obsahu tak, aby se docílilo maximální efektivity mezi kvalitou displeje a energetickou náročností.

LTPO displej umožňuje nastavení dynamické obnovovací frekvence
LTPO displej umožňuje nastavení dynamické obnovovací frekvence (zdroj: Cnews)
Chytré rozlišení mění rozlišení displeje pro dosažení větší úspory
Chytré rozlišení mění rozlišení displeje pro dosažení větší úspory (zdroj: Cnews)

Na displej je zkrátka radost se dívat i jej používat. Nabízí nádherné barvy, které si můžete v nastavení rovněž mírně poupravit k obrazu svému, a řadu certifikací typu Dolby Vision, HDR Vivid a certifikace TÜV Rheinland. Samozřejmostí je poté Always-on funkce Honorem pojmenovaná jako Vždy na displeji.

Uživatelské rozhraní:

Nastavení domovské obrazovky a mnoho dalšího se ukrývá pod jednou záložkou

Nastavení domovské obrazovky a mnoho dalšího se ukrývá pod jednou záložkou

Autor: Cnews

Honor v případě svých telefonů sahá po vlastní uživatelské nadstavbě MagicOS 8, která nese základy čistého Androidu, avšak obohacuje jej o své ovládací prvky, svůj launcher a přidává do něj své vlastní funkce. Naštěstí se Honor zdržel předinstalovávání všemožného balastu, jako to s oblibou dělá například Xiaomi.

Přepracované uživatelské rozhraní nemusí vyhovovat všem, naštěstí je možné si jej všemožnými nastaveními relativně dost přizpůsobit k obrazu svému. Celý systém však funguje na výbornou a vše běží svižně, plynule a bez jakýchkoliv záseků. Stejně dobře funguje i optická čtečka otisku prstů pod displejem a Face ID odemykání obličejem, které zastává speciální 3D hloubková kamera.

Honor Magic6 Pro se pyšní 4letou podporou velkých aktualizací Androidu a 5 lety bezpečnostních záplat. Pokud tedy Honor dodrží své slovo, Magic6 Pro se dostane až na Android 18.

Výkon:

Informace o procesoru z CPU-Z

Informace o procesoru z CPU-Z

Autor: Cnews

Nikoho moc nepřekvapí, že v oblasti výkonu je nový Magic6 Pro mezi top výsluními telefony. O jeho výkon se totiž stará ten nejmodernější procesor z dílen Qualcommu, konkrétně model Snapdragon 8 Gen 3 vyrobený na 4nm technologii. Procesoru dělá společnost grafický čip Adreno 750 a v našich končinách 12 GB RAM společně s 512 GB vnitřním úložištěm.

S 512 GB si budete muset vystačit, jelikož telefon nedisponuje slotem pro paměťové karty. Nikoho pak moc nepřekvapí, že co se výkonu týče, nemá telefon aktuálně před sebou žádnou konkurenceschopnou hru nebo proces, s kterým by si nedokázal poradit. Testování výkonu ve hrách pozbývá vzhledem k enormní porci výkonu celkem smysl, lépe tak prozradí výkon procesoru čísla samotných benchmarků.

Při testování jsem byl i příjemně překvapen kvalitou chlazení. I při velké zátěži si telefon dokázal zachovat relativně studená záda.

3DMark (Wild Life Extreme)
PCMark (Work 3.0)
PCMark (battery)
Geekbench 6
AnTuTu Benchmark
5197 bodů 15 414 bodů 10 hodin a 26 minut 2014 bodů SC
5375 bodů MC
1 701 432 bodů

Výdrž:

Výdrž už jsem mírně nakousl v kapitole věnující se vzhledu, zde se jí dovolím věnovat malinko podrobněji. Byť se to na první pohled nemusí zdát, Honor Magic6 Pro disponuje 5600mAh baterií, která mu dovoluje poměrně nadstandardní výdrž. Koneckonců baterie je další aspekt, ve kterém Magic6 Pro obdržel GOLD 2024 ocenění v DXOMARK, kde si v kategorii baterie zároveň drží také první místo.

Honor Magic6 Lite: prémiová stylovka pro střední třídu (recenze) Přečtěte si také:

Honor Magic6 Lite: prémiová stylovka pro střední třídu (recenze)

Baterie nabízí při běžném každodenním využití klidně i dvoudenní výdrž, pokud se uskromníte a budete telefon používat jen zřídka, můžete se dostat i na dva a půl dne. 3 dnům a 9 hodinám uvedených v DXOMARK bych pak už moc nedůvěřoval.

Telefon podporuje 80W drátové nabíjení, 66W bezdrátové nabíjení a 5W reverzní drátové i bezdrátové nabíjení. Já jsem pro nabíjení používal moji 120W Motorola a 100W Baseus nabíječku, ani s jednou jsem se však nedokázal dostat na nominálních 80 W a telefon mi při nabíjení vždy ukazoval pouhých 60 W. Je tedy možné, že pro dosažení plné nabíjecí rychlosti musíte smartphone nabíjet originální Honor nabíječkou.

50 % baterie
70 % baterie
100 % baterie

± 23 minut

± 33 minut

± 54 minut

Fotoaparát:

Jestliže vás Magic6 Pro ve všech předchozích oblastech o svých kvalitách nedokázal přesvědčit, fotoaparáty jsou něco, čím určitě zaboduje. Ty jsou totiž další oblastí, ve které dostal smartphone DXOMARK GOLD 2024 ocenění a drží si zlatou medaili v oblasti kamera. A není se moc čemu divit.

Honor Magic6 Pro totiž nabízí prémiovou fotovýbavu prakticky bez kompromisů. Základem je hlavní 50Mpx objektiv s proměnlivou světelností f/1.4–2.0, laserovým ostřením, PDAF a optickou stabilizací. U výsledných fotek je vidět určitá forma saturovanějšího postprocessingu, ne však v takové míře, jako to dělá Samsung. Fotky jsou ale konstantně nádherně ostré, mají svojí charakteristickou dynamičnost a vždy tak akorát nasvícené.

Ultraširokoúhlý 50Mpx fotoaparát
Ultraširokoúhlý 50Mpx fotoaparát (zdroj: Cnews)
Hlavní 50Mpx fotoaparát
Hlavní 50Mpx fotoaparát (zdroj: Cnews)
2,5násobný zoom z 180Mpx teleobjektivu
2,5násobný zoom ze 180Mpx teleobjektivu (zdroj: Cnews)
Ultraširokoúhlý 50Mpx fotoaparát
Ultraširokoúhlý 50Mpx fotoaparát (zdroj: Cnews)
Hlavní 50Mpx fotoaparát
Hlavní 50Mpx fotoaparát (zdroj: Cnews)
2,5násobný zoom z 180Mpx teleobjektivu
2,5násobný zoom ze 180Mpx teleobjektivu (zdroj: Cnews)

Stejně dobře si vede hlavní fotoaparát i v noci, kdy ponechává závěrku déle otevřenou pro nahromadění více světla. Dokonce i v úplné tmě, kdy se o světlo stará jen neonový nápis a jemné světlo z boční chodby (viz fotky), dokáže telefon z fotoaparátů vytřískat maximum a vytvořit fotku, kterou se nebudete muset stydět ukázat svým kamarádům.

Ultraširokoúhlý 50Mpx fotoaparát
Ultraširokoúhlý 50Mpx fotoaparát (zdroj: Cnews)
Hlavní 50Mpx fotoaparát
Hlavní 50Mpx fotoaparát (zdroj: Cnews)
2,5násobný zoom z 180Mpx teleobjektivu
2,5násobný zoom ze 180Mpx teleobjektivu (zdroj: Cnews)
Ultraširokoúhlý 50Mpx fotoaparát
Ultraširokoúhlý 50Mpx fotoaparát (zdroj: Cnews)
Hlavní 50Mpx fotoaparát
Hlavní 50Mpx fotoaparát (zdroj: Cnews)
2,5násobný zoom z 180Mpx teleobjektivu
2,5násobný zoom ze 180Mpx teleobjektivu (zdroj: Cnews)

Nejvíce dominantní na zádech je 180Mpx periskopický teleobjektiv se světelností f/2.6, PDAF ostřením, optickou stabilizací obrazu a 2,5násobným optickým zoomem. U něj si dovolím tvrdit, že dokáže aktuálně vytvářet nejlepší zoom fotografie ze všech aktuálně dostupných vlajkových Android smartphonů. Fotky jsou po vzoru hlavního fotoaparátu nádherně ostré, barevně sladěné se zbytkem fotoaparátů a samotnou kvalitou fotky často ani nepoznáte, že jste až tak daleko od fotografovaného objektu.

Ultraširokoúhlý 50Mpx fotoaparát
Ultraširokoúhlý 50Mpx fotoaparát (zdroj: Cnews)
Hlavní 50Mpx fotoaparát
Hlavní 50Mpx fotoaparát (zdroj: Cnews)
2,5násobný zoom z 180Mpx teleobjektivu
2,5násobný zoom ze 180Mpx teleobjektivu (zdroj: Cnews)
Ultraširokoúhlý 50Mpx fotoaparát
Ultraširokoúhlý 50Mpx fotoaparát (zdroj: Cnews)
Hlavní 50Mpx fotoaparát
Hlavní 50Mpx fotoaparát (zdroj: Cnews)
2,5násobný zoom z 180Mpx teleobjektivu
2,5násobný zoom ze 180Mpx teleobjektivu (zdroj: Cnews)

Poslední zadní 50Mpx ultraširokoúhlý objektiv se světelností f/2.0, automatickým ostřením a úhlem záběru 122° je na tom co se kvality týče opět velmi dobře, při bližším zkoumání však už dokážete rozeznat mírné rozmazání po rozích. Tyto nedokonalosti však nejsou nic, kvůli čemu by se fotky daly považovat za vyloženě špatné.

Selfie 50Mpx kamera se světelností f/2.0 je pak darem od Honoru pro vášnivé selfíčkáře, s přehršelem možných filtrů, portrétních režimů a dalších nastavení si pak vyhrají zejména ti, kteří si právě v těchto udělátkách libují.

Makro snímek
Makro snímek
Makro snímek

Samotná fotoaplikace je pak dobře optimalizovaná a její spouštění je bleskové. Mimo klasické režimy nabízí i pár zajímavých typu film, časosběrný režim, režim clona s možností ručního nastavení clony nebo režim malování světlem, kde si můžete skrze čtveřici předpřipravených módů hrát s časosběrnými fotografiemi a světlem.

Honor Magic6 Pro dokáže natáčet videa až ve 4K rozlišení při 60 FPS s aktivní optickou stabilizací. Selfie kamera si také poradí se 4K videem, ovšem pouze při 30 FPS, avšak i zde ponechává optickou stabilizaci obrazu.

Závěr:

Někomu se nemusí líbit vzhled, dominantní fotomodul lehce převažující telefon při držení jednou rukou, nebo prostě jen nemusí značku Honor jako takovou. Jedno však smartphonu upřít nelze. Honor Magic6 Pro je po čertech povedený telefon, kterému vesměs nic nechybí a naopak se má čím chlubit.

Cyber25

Za cenu startující od 26 tisíc dostanete prémiový smartphone s lukrativním designem, dostatek výkonu na mnoho let dopředu, velmi povedený displej a fotovýbavu, která může s klidem konkurovat jiným vlajkám nebo digitálním zrcadlovkám. Zkrátka smartphone má vše, co správná vlajka musí mít.

Pokud bych měl hledat nějaká negativa, jedním z nich může být v porovnání s konkurencí pouze 4letá podpora Androidu nebo malinko slabší ultraširokoúhlý fotoaparát. Někomu také nemusí úplně sednout uživatelské rozhraní MagicOS. Přes to vše se dá však relativně snadno přenést a všechna negativa vymazat všemi přednostmi, které Honor Magic6 Pro definitivně nabízí.

Líbilo se mi:
Nelíbilo se mi:

+ velmi povedený LTPO displej

– rozhraní MagicOS nemusí sednout každému

+ dostatek výkonu na mnoho let dopředu

– oproti konkurenci slabší softwarová podpora

+ nekompromisní fotokombo

vlajkový obsah balení

+ 180 Mpx periskopický teleobjektiv

+ nadprůměrná výdrž baterie

+ pokročilé 3D rozpoznávání obličeje

+ stylový design zad

Autor článku

Šéfredaktor portálu Cnews.cz.

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