;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

É, amigos, a HBO Max nos iludiu

HBO Max finalmente chegou ao Brasil, mas naquelas
HBO Max finalmente chegou ao Brasil, mas naquelas
Getty Images

De Splash, em São Paulo

18/07/2021 04h00

Não dá para negar, as produções originais da HBO, canal que se consagrou na hoje combalida TV a cabo, sempre fizeram valer o marrento slogan:

Não é TV, é HBO.

Séries como "Os Sopranos" e "The Wire" derrubaram o mito da TV como arte menor que o cinema. Filmes premiados como "You Don't Know Jack" (2010), brilhantemente estrelado por Al Pacino, acabaram com o ranço pelos telefilmes. Isso sem falar nos documentários, que já abocanharam mais de 20 Oscars.

Continua depois da publicidade

A HBO foi uma das responsáveis por elevar o patamar da TV e nos transformar nesses loucos por séries, que acompanham tramas com paixão, fogem de spoilers e sofrem por novas temporadas. Ano após ano, suas obras se destacam nas maiores premiações da TV, como o Emmy, e também em nossos corações.

Mas, se o conteúdo salta aos olhos, a forma, ou melhor, a embalagem vem manchando tão gloriosa trajetória.

Quem acompanhou o estouro de "Game of Thrones" não esquece o trauma sofrido nas mãos da HBO Go para conseguir assistir aos episódios da série, último fenômeno da TV.

As noites de domingo tentando conectar o aplicativo faziam os 12 trabalhos de Hércules parecerem uma molezinha.

Guardadas as devidas proporções, claro, estamos falando de espectadores sentados em seus sofás, não de um deus greg... enfim, digressiono.

Com o anúncio da chegada da HBO Max ao Brasil, muita gente pensou que a HBO Go e seu sistema "chocho, capenga, manco, anêmico, frágil e inconsistente" já estavam indo tarde. Não fosse a pandemia, não duvido que se realizasse um grande funeral para enterrar de vez aquele que só nos atrapalhou.

Continua depois da publicidade

Mas... parece que comemoramos cedo demais.

A HBO Max vem se apresentando como uma plataforma quase tão ruim quanto a falecida HBO Go. "Quase", porque realmente não havia como atingir o mesmo nível de ruindade. Mas as falhas técnicas aram de uma para outra como que por DNA.

Depois de pouco mais de duas semanas de testes, a experiência com o serviço —que, ainda por cima, chegou ao Brasil atrasado, com aplicativos faltantes nas lojas dos sistemas operacionais de celulares e TVs—, não tem sido um eio no parque.

Legendas dessincronizadas e descentralizadas na tela (o horror! o horror!), erros de carregamento, pause/play que demoram a funcionar e navegação lentíssima têm sido corriqueiros. Isso sem falar nos buracos do catálogo, que chegou com muito menos que se esperava.

Continua depois da publicidade

Alguns usuários chegaram a relatar queda do sistema —eu mesma, tentando dar seguimento à minha (segunda) maratona de "Os Sopranos", fiquei longos cinco minutos minutos sem conseguir mexer no app.

Queria ver Tony Soprano, recebi três pontinhos roxos pulando na tela.

Há quem diga que a expectativa é a mãe da decepção, é verdade, mas quem jogou essa expectativa toda em nossos colos foi a própria HBO, com suas produções de alto nível, um bote salva-vidas em meio à quarentena sem fim.

O mesmo vale para a decepção: até aqui, a HBO Max não tem ado de um grande e amargo déjà vu da HBO Go.