;(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

Álbum de Olivia Rodrigo é eleito melhor de 2021 pela Billboard; Veja top 50

Capa do álbum "Sour", de Olivia Rodrigo, eleito melhor de 2021 por equipe da Billboard - Reprodução/Amazon
Capa do álbum "Sour", de Olivia Rodrigo, eleito melhor de 2021 por equipe da Billboard Imagem: Reprodução/Amazon

De Splash, em São Paulo

18/12/2021 17h14Atualizada em 18/12/2021 18h50

A equipe da revista norte-americana Billboard elegeu seus 50 álbuns favoritos de 2021. Especializada em informações sobre a indústria musical, a publicação colocou o CD de estreia da cantora Olivia Rodrigo, "Sour", como o melhor lançamento do ano.

Aos 18 anos, a artista lançou o álbum no último mês de maio e alcançou, em apenas uma semana, o topo da Billboard 200, lista semanal realizada também pela publicação, mas levando em conta informações de mercado sobre os 200 álbuns e EPs mais vendidos nos Estados Unidos.

Rodrigo despontou no mundo artístico como protagonista da série High School Musical: The Musical: The Series, do Disney+, e com o novo trabalho ganhou seis indicações ao Grammy 2022.

Acompanhando "Sour" no top 5 melhores álbuns da Billboard estão os últimos trabalhos de Tyler, the Creator, Lil Nas X, Adele e Doja Cat. Confira a lista completa abaixo.

  1. "Sour", Olivia Rodrigo
  2. "Call Me If You Get Lost", Tyler, the Creator
  3. "Montero", Lil Nas X
  4. "30", Adele
  5. "Planet Her", Doja Cat
  6. "If I Can't Have Love I Want Power", Halsey
  7. "An Evening With Silk Sonic", Silk Sonic
  8. "Happier Than Ever", Billie Eilish
  9. "Heaux Tales", Jazmine Sullivan
  10. "El Madrileño", C. Tangana
  11. "The Melodic Blue", Baby Keem
  12. "Inside", Bo Burnham
  13. "Star-Crossed", Kacey Musgraves
  14. "To Hell With It", PinkPantheress
  15. "Collpased Into Sunbeams", Arlo Parks
  16. "Jubilee", Japanese Breakfast
  17. "Still Over It", Summer Walker
  18. "Certified Lover Boy", Drake
  19. "Sometimes I Might Be Introvert", Little Simz
  20. "Valentine", Snail Mail
  21. "The House is Burning", Isaiah Rashad
  22. "'When It's All Said and Done... Take Time", Giveon
  23. "In These Silent Days", Brandi Carlile
  24. "KG0516", Karol G
  25. "Red (Taylor's Version)", Taylor Swift
  26. "If I Could Make It Go Quiet", Girl In Red
  27. "Glow On", Turnstile
  28. "Table For Two", Lucky Daye
  29. "The Lockdown Sessions", Elton John
  30. "Nurture", Porter Robinson
  31. "Inédito", Carin León
  32. "The Off Season", J. Cole
  33. "Seis", Mon Laferte
  34. "Vince Staples", Vince Staples
  35. "29: Written in Stone", Carly Pearce
  36. "Justice", Justin Bieber
  37. "Vice Versa", Rauw Alejandro
  38. "In Defense of My Own Happiness", Joy Oladokun
  39. "Donda", Ye
  40. "I Don't Live Here Anymore", The War on Drugs
  41. "Lately I Feel Everything", Willow
  42. "If Orange Was a Place", Tems
  43. "Life of a Don", Don Toliver
  44. "Actual Life (April 14-December 17 2020)", Fred Again
  45. "Lyke Mike", Myke Towers
  46. "Little Oblivions", Julien Baker
  47. "Times", SG Lewis
  48. "Dum and Dummer 2", Young Dolph & Key Glock
  49. "The Marfa Tapes", Jack Ingram, Miranda Lambert & Jon Randall,
  50. "Sling", Clairo