První čipové firmy z Tchaj-wanu v ČR, Praha je mezi top destinacemi pro vývojáře, Foursquare končí

25. 10. 2024
Doba čtení: 8 minut

Sdílet

Autor: VUT
Ohrožení Snapdragonu, ARM jde po Qualcommu. Trhliny mezi OpenAI a Microsoftem. Huawei možná zkusila obejít čipové sankce. Konkurence pro iOS a Android. Zprávy z IT, každý pátek na Lupě.

Vždy v pátek připravuje reportér Jan Sedlák výběr zajímavých zpráv ze světa IT. Co se událo v tomto týdnu?

V Česku se usazují první čipové firmy z Tchaj-wanu. Zajímá je Škoda, Onsemi nebo nové polovodičové centrum. V Brně díky financování tchajwanské vlády vzniklo centrum pro vývoj a výzkum pokročilých čipů, což má vytvářet projekty přenositelné do komerčního využití. To Tchaj-wan zajímá, stejně jako investice Onsemi do výroby v Rožnově postavené na karbidu křemíku. Z Rožnova se chystá odebírat koncern Volkswagen včetně Škody Auto a tchajwanské firmy chtějí být blízko zdejšímu automotive.

Praha patří mezi nejlepší evropské lokality se zaměstnáními pro technologické odborníky. Českému hlavnímu městu patří šestá pozice po Londýně, Berlínu, Varšavě, Paříži a Dublinu. Alespoň podle indexu The Pragmatic Engineer.

Izraelská armáda používá v bojích českou technologii. Investovali do ní majitelé Bohemia Interactive či Parlamentních listů. Jde o SDK a API umožňující převod běžných aplikací do rozšířené reality, čehož Izraelci využívají pro mapování bojiště a plánování taktiky.

Bylo nalezeno nové největší prvočíslo. Použit byl distribuovaný výpočet. Jedná se o 2136279841−1.

Vysoká cena nás zarazila, a to jsme zvyklí. Temelín rozjel vlastní mobilní 5G síť, Čínu předem vyloučil Přečtěte si také:

Vysoká cena nás zarazila, a to jsme zvyklí. Temelín rozjel vlastní mobilní 5G síť, Čínu předem vyloučil

OpenAI vydala aplikaci ChatGPT pro Windows. Zatím jde o betaverzi s tím, že plná se má objevit ještě letos. Appka je oproti webové verzi omezenější, neumí například hlasovou komunikaci. OpenAI rovněž v Evropě zpřístupnila hlasové povídání s botem. Advanced Voice (Mode) je součástí aplikací pro iOS a Android.

New York Times popisují trhliny v úzkém a finančně náročném vztahu mezi Microsoftem a OpenAI. Redmond do AI miláčka poslal mnoho miliard dolarů. V OpenAI chtěli změnit podmínky bratrství.

Šéf Baidu, čínské alternativy Googlu, předpovídá, že současný boom kolem AI je pouze bublina, která splaskne. Robin Li předpovídá, že přežije asi procento společností zabývajících se tímto oborem.

Amazon spustil AI pomocníka s nákupem ve stylu ChatGPT, natrénoval ho na produktech či recenzích Přečtěte si také:

Amazon spustil AI pomocníka s nákupem ve stylu ChatGPT, natrénoval ho na produktech či recenzích

Několik správců ovladačů v rámci linuxového jádra bylo odstraněných z důvodů vazeb na Rusko. Souvisí to s obavami spojenými s bezpečnostní situací a také s invazí na Ukrajinu.

Přes 70 procent zranitelností zneužívaných v roce 2023 bylo zero-day. Uvedl to Google, který to označil jako znepokojivé, poměr směrem k zero-day roste.

Aplikace Foursquare končí. Znepřístupněna bude 15. prosince. Samotná společnost bude fungovat dál, zaměří se na appku Swarm. Obě aplikace dříve byly jednou, která sloužila pro checkování v různých lokalitách a jako prostor pro objevování kaváren, restaurací a podobně. Později došlo k rozdělení, kdy Foursquare nadále sloužil jako průvodce a Swarm pro check-iny.

Český konkurent Outlooku koupil amerického rivala. Postbox přechází pod eM Clienta Přečtěte si také:

Český konkurent Outlooku koupil amerického rivala. Postbox přechází pod eM Clienta

Huawei se možná pokouší obejít zákaz výroby čipů u TSMC. Tchajwanská firma sama kontaktovala americkou vládu s tím, že má podezření na podivnou zakázku. Přišla objednávka na výrobu čipů podobajících se modelu Ascend 910B, což je alternativa Huawei pro Nvidii (AI čip). Huawei už nicméně má novinku 910C a měla by být schopná vyrábět doma u SMIC. TSMC ještě před sankcemi pro Huawei předchozí čip vyráběla, a to původní model Ascendu. Reuters doplnila, že se TSMC americkým úřadům ozvala na základě technického rozboru webu TechInsights. Bloomberg dodal, že TSMC odstřihla jednoho zákazníka, který mohl sloužit jako prostředník mezi Huawei a TSMC. Zatím je v tom ale trochu zmatek. Celá záležitost se nyní prošetřuje.

Huawei najíždí do plné produkce s operačním systémem HarmonyOS NEXT. Jde o plnohodnotný systém čistě z dílny Huawei, není postavený na Androidu jako předchozí verze. Firma se k razantnímu kroku rozhodla po zavedení amerických sankcí, což ji odstřihlo od služeb Googlu a zničilo byznys s mobily. NEXT se rozšiřuje doma v Číně a v plánu je zahraniční expanze (už se něco děje třeba ve Spojených arabských emirátech). Různých nativních appek a služeb už prý má být kolem 15 tisíc, na palubu naskakují hlavně čínské společnosti. HarmonyOS míří kromě mobilů i do aut, hodinek a tak dále. Uchycení na obřím čínském trhu a případně na Číně spřízněných trzích by znamenalo, že na světě začne fungovat třetí velká platforma (vedle iOS a Androidu), ale nepředbíhejme.

Zlínský kraj se po Jižní Moravě dostal mezi nejvyspělejší čipové regiony v Evropě Přečtěte si také:

Zlínský kraj se po Jižní Moravě dostal mezi nejvyspělejší čipové regiony v Evropě

AMD už sedmého listopadu vydá procesory Ryzen 9000 s 3D V-Cache. Tyto modely jsou vždy určeny pro hráče, 5800X3D a 7800X3D skutečně měly oproti standardním verzím často výrazně vyšší herní výkon. Uvidíme, co nabídne 9800X3D, u standardní řady 9000 byl mezigenerační nárůst výkonu spíše symbolický. AMD také 9000 zlevňuje, chystá se mimo jiné na Intel Core Ultra 200, tedy Arrow Lake.

Intel a Samsung údajně zvažují spolupráci v čipových továrnách, aby zvládly konkurovat TSMC. Intel má s výrobními procesy problémy dlouhodobě, poslední procesory už vyrábí u TSMC a snaží se vyladit vlastní nový proces. Samsung se v poslední době také plácá na místě a provádí reformu polovodičové sekce. Obě firmy by tak mohly sdílet výzkum, vývoj a výrobní technologie. Problémy Samsungu naznačuje i to, že brzdí s dodávkami zařízení od ASML do své nové továrny v USA. Na moderní výrobu rovněž hledá zákazníky, ti zatím spíše mizí k TSMC.

Qualcomm představil novou vlajkovou loď v mobilních čipech Snapdragon 8 Elite. Má přinést nárůst výkonu CPU až o 45 procent. Vyráběn bude pomocí 3nm procesu TSMC. Dvě velká jádra jsou z kategorie Oryon, která už byla otestována v noteboocích skrze PC ARM čip Snapdragon X. Šest menších jader je rovněž postavených na Oryonu.

Qualcomm se zároveň dostal do značných problémů spojených s ARMem. Ten totiž vypověděl licenční smlouvu. ARM už dříve obvinil Qualcomm z toho, že porušil licenční podmínky při koupi společnosti Nuvia, na jejichž základech vznikla jádra Oryon. Qualcomm měl dle ARMu obnovit licence, které Nuvia měla. Nyní běží lhůta 60 dnů na vyřešení problémů, jinak ARM bude požadovat ukončení prodejů čipů založených na jeho technologii, což by mělo značné dopady na celý technologický svět.

Qualcomm už nebude prodávat vývojový kit pro ARM. Dev Kit s čipem Snapdragon X Elite, který se používá u prvních notebooků, stál 899 dolarů. Qualcomm ale není spokojený s kvalitou a dodávkami, a zřejmě tak tento obor přenechá hardwarovým partnerům.

Google pokračuje v tradici, v Česku opět nezaplatil skoro žádnou daň z příjmu Přečtěte si také:

Google pokračuje v tradici, v Česku opět nezaplatil skoro žádnou daň z příjmu

Microsoft v ostré verzi v Azure nasadil instance s vlastním ARM procesorem Cobalt 100. Doposud šlo o testovací provoz. Instance jsou k dispozici po názvy Dpsv6, Dplsv6 a Epsv6. Využít lze od dvou vCPU a 8 GB RAM po 96 vCPU a 384 GB RAM.

Plány Německa na posílení ve výrobě čipů mají další problém. Americká firma Wolfspeed pozastavila plány na vybudování továrny za tři miliardy eur. Důvodem je mimo jiné chladnoucí evropská poptávka po elektrických autech. Své plány pozastavil také Intel, který měl v plánu postavit fab za 30 miliard eur.

Čínská společnost Loongson oznámila nové procesory, které se prý mají vyrovnat 12. a 13. generaci Intelu. Označení nese 3B6600. Firma využívá vlastní architekturu LoongArch a pracuje na softwarovém ekosystému. Dělat by měla i na vlastní grafice o výkonu zhruba na úrovni Nvidia GeForce RTX 2080. Loongson mimo jiné hledá odbytiště u domácích velkých telco firem. China Telecom koupí dalších 150 tisíc serverů a většina z nich má běžet na domácích procesorech.

Nokia v Číně propustila asi dva tisíce lidí. Jde o pětinu tamních zaměstnanců. Důvodem má být snižování nákladů. Finský podnik už loni oznámil zrušení 14 tisíc pozic. Stále si prochází těžkým obdobím včetně slučování s Alcatel-Lucentem. V Česku se podařila zakázka na 5G core a první projekty v privátních 5G sítích.

Legendární Nokia se v Česku pokouší o comeback, už se dostala do Temelína nebo Škodovky Přečtěte si také:

Legendární Nokia se v Česku pokouší o comeback, už se dostala do Temelína nebo Škodovky

Jižní Korea chystá zavedení silnější ochrany duševního vlastnictví. Důvodem je průmyslová špionáž. V posledních pěti letech bylo zaznamenáno 97 pokusů leaknout tajemství do zahraničí, 40 z nich souviselo s polovodiči. Roli hraje i Čína. Pokud by tyto pokusy uspěly, způsobilo by to škody skoro 17 miliard dolarů.

Severokorejské rakety, které používá Rusko, jsou plné západních čipů a další západní techniky. Sankce jsou tedy vesele nadále obcházeny.

Jakmile Deutsche Telekom vypne 2G, stane se ještě více závislým na Huawei, rozebírá Light Reading. Vlastník českého T-Mobilu dlouhodobě na čínského dodavatele spoléhá a patří mezi bojovníky za to, aby v RAN části sítě mohl zůstat. Zároveň DT rozvíjí velký vývoj kolem openRAN, řeší ho Češi v Praze.

Češi se podílí na tvorbě technologie, která může změnit mobilní sítě a zatopit Huawei, Ericssonu a Nokii Přečtěte si také:

Češi se podílí na tvorbě technologie, která může změnit mobilní sítě a zatopit Huawei, Ericssonu a Nokii

Tento slajd ukazuje, proč se návrháři čipů snaží zbavit starších technologií a zároveň je drahé vyrobit nové. K dispozici je celá prezentace.

SK Hynixu v posledním kvartálu meziročně narostly tržby o 94 procent. Je to díky obřímu zájmu o paměti HBM, které Nvidia či AMD dávají do svých karet pro zpracování AI. SK Hynix tomuto oboru vládne na úkor Samsungu a Micronu. Firma předpovídá, že poptávka bude i nadále vysoká.

MM Influenceři

Sophos za 859 milionů dolarů kupuje firmu Secureworks. Jde o spojování dvou konkurentů. Velká část Secureworks doposud patřila Dellu, který firmu nejdříve koupil a později částečně poslal na burzu. Za Sophosem stojí investoři z Thoma Bravo, kteří jsou častými nakupujícími v IT.

Čtení na Root.cz a Cnews.cz:

  • 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

Neutrální ikona do widgetu na odběr článků ze seriálů

Zajímá vás toto téma? Chcete se o něm dozvědět víc?

Objednejte si upozornění na nově vydané články do vašeho mailu. Žádný článek vám tak neuteče.


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