{"id":409,"date":"2026-08-21T02:41:18","date_gmt":"2026-08-21T02:41:18","guid":{"rendered":"https:\/\/ormusiclive.com\/?page_id=409"},"modified":"2026-09-17T03:25:05","modified_gmt":"2026-09-17T03:25:05","slug":"mixes-djs","status":"publish","type":"page","link":"https:\/\/ormusiclive.com\/?page_id=409","title":{"rendered":"MIXES &amp; DJs"},"content":{"rendered":"\n<style>\n\n\/* =========================================================\n   OR MUSIC LIVE \u00b7 MIXES & DJS\n   P\u00c1GINA INTERNA SIN MEN\u00da GENERAL\n========================================================= *\/\n\n*{\n  box-sizing:border-box;\n}\n\nhtml,\nbody{\n  margin:0!important;\n  padding:0!important;\n  overflow-x:hidden!important;\n  background:#02030a!important;\n}\n\nbody{\n  color:#fff!important;\n  font-family:Arial,Helvetica,sans-serif!important;\n}\n\n\n\/* =========================================================\n   OCULTAR ELEMENTOS DEL TEMA \/ WORDPRESS\n========================================================= *\/\n\n.entry-title,\n.page-title,\n.wp-block-post-title,\n.entry-header,\n.page-header,\n.site-footer,\nfooter.wp-block-template-part{\n  display:none!important;\n}\n\n\n\/* OCULTAR HEADER \/ MEN\u00da DEL TEMA *\/\n\nheader.wp-block-template-part,\nheader.site-header,\n.site-header,\n#masthead,\n.main-header-bar,\n.main-navigation,\n.primary-navigation,\n.wp-block-navigation,\n.wp-site-blocks > header{\n  display:none!important;\n}\n\n\n\/* EVITAR ESPACIOS VAC\u00cdOS DEL HEADER *\/\n\n.wp-site-blocks,\n.site-content,\n.site-main,\nmain{\n  margin-top:0!important;\n  padding-top:0!important;\n}\n\n\n.wp-block-html{\n  width:100%!important;\n  max-width:none!important;\n  margin:0!important;\n  padding:0!important;\n}\n\n.is-layout-constrained > .wp-block-html{\n  max-width:none!important;\n}\n\n\n\/* =========================================================\n   P\u00c1GINA\n========================================================= *\/\n\n.ormix-page{\n  position:relative!important;\n\n  width:100vw!important;\n  max-width:100vw!important;\n\n  left:50%!important;\n  transform:translateX(-50%)!important;\n\n  min-height:100vh!important;\n\n  margin:0!important;\n  padding:0!important;\n\n  overflow:hidden!important;\n\n  background:\n\n    radial-gradient(\n      circle at 10% 20%,\n      rgba(0,181,255,.15),\n      transparent 28%\n    ),\n\n    radial-gradient(\n      circle at 90% 16%,\n      rgba(255,0,211,.19),\n      transparent 30%\n    ),\n\n    linear-gradient(\n      180deg,\n      #02030a,\n      #080515 55%,\n      #0c0315\n    )!important;\n}\n\n\n\/* REJILLA *\/\n\n.ormix-page::before{\n  content:\"\";\n\n  position:absolute;\n  inset:0;\n\n  pointer-events:none;\n\n  background-image:\n\n    linear-gradient(\n      rgba(255,255,255,.025) 1px,\n      transparent 1px\n    ),\n\n    linear-gradient(\n      90deg,\n      rgba(255,255,255,.025) 1px,\n      transparent 1px\n    );\n\n  background-size:45px 45px;\n\n  opacity:.24;\n}\n\n\n\/* =========================================================\n   PAPEL TAPIZ LOGO\n========================================================= *\/\n\n.ormix-page::after{\n  content:\"\";\n\n  position:absolute;\n  inset:-60px;\n\n  pointer-events:none;\n\n  opacity:.12;\n\n  background-image:\n    url(\"https:\/\/ormusiclive.com\/wp-content\/uploads\/2026\/08\/or-music-logo-final.png\");\n\n  background-repeat:repeat;\n\n  background-size:220px auto;\n\n  background-position:center top;\n\n  filter:\n    saturate(.85)\n    brightness(1.10);\n\n  transform:\n    rotate(-3deg)\n    scale(1.06);\n}\n\n\n\/* =========================================================\n   WRAPPER\n========================================================= *\/\n\n.ormix-wrap{\n  position:relative;\n  z-index:3;\n\n  width:100%;\n  max-width:1520px;\n\n  margin:0 auto;\n\n  padding:\n    22px\n    clamp(14px,3vw,48px)\n    55px;\n}\n\n\n\/* =========================================================\n   CABECERA INTERNA\n========================================================= *\/\n\n.ormix-header{\n  position:relative;\n\n  min-height:88px;\n\n  display:flex;\n\n  align-items:center;\n  justify-content:center;\n\n  padding:\n    13px 150px\n    20px;\n\n  margin-bottom:28px;\n\n  border-bottom:\n    1px solid rgba(255,255,255,.09);\n}\n\n\n\/* ORMUSICLIVE.COM GRANDE *\/\n\n.ormix-domain{\n  margin:0!important;\n\n  color:#fff!important;\n\n  text-align:center!important;\n\n  font-size:\n    clamp(30px,4.2vw,58px)!important;\n\n  line-height:1!important;\n\n  font-weight:900!important;\n\n  letter-spacing:\n    clamp(1px,.35vw,5px)!important;\n\n  text-transform:uppercase;\n\n  text-shadow:\n\n    0 0 18px rgba(255,255,255,.08),\n\n    0 0 30px rgba(73,211,255,.10),\n\n    0 0 45px rgba(255,55,213,.08);\n}\n\n\n\/* BOT\u00d3N INICIO *\/\n\n.ormix-home{\n  position:absolute;\n\n  right:0;\n  top:50%;\n\n  transform:\n    translateY(-50%);\n\n  display:inline-flex;\n\n  align-items:center;\n  justify-content:center;\n\n  min-height:44px;\n\n  padding:\n    10px 19px;\n\n  border-radius:999px;\n\n  color:#fff!important;\n\n  text-decoration:none!important;\n\n  background:\n    rgba(255,255,255,.05);\n\n  border:\n    1px solid rgba(255,255,255,.13);\n\n  box-shadow:\n    0 8px 20px rgba(0,0,0,.18);\n\n  font-size:9px;\n  font-weight:900;\n\n  letter-spacing:1px;\n\n  transition:.2s ease;\n}\n\n\n.ormix-home:hover{\n  color:#71e2ff!important;\n\n  border-color:\n    rgba(79,218,255,.50);\n\n  box-shadow:\n    0 0 20px rgba(0,187,255,.12);\n}\n\n\n\/* =========================================================\n   INTRO\n========================================================= *\/\n\n.ormix-intro{\n  max-width:1050px;\n\n  margin:\n    0 auto\n    32px;\n\n  text-align:center;\n}\n\n\n.ormix-intro small{\n  display:block;\n\n  color:#ff77e6;\n\n  font-size:10px;\n  font-weight:900;\n\n  letter-spacing:3px;\n}\n\n\n.ormix-intro h1{\n  margin:\n    8px 0\n    12px!important;\n\n  font-size:\n    clamp(45px,6vw,80px)!important;\n\n  line-height:.96!important;\n\n  font-weight:900!important;\n\n  background:\n    linear-gradient(\n      90deg,\n      #fff,\n      #73e1ff 26%,\n      #a88aff 54%,\n      #ff6cdf 82%,\n      #fff\n    );\n\n  -webkit-background-clip:text;\n  -webkit-text-fill-color:transparent;\n\n  background-clip:text;\n}\n\n\n.ormix-intro p{\n  max-width:920px;\n\n  margin:0 auto!important;\n\n  color:#b3becf!important;\n\n  font-size:\n    clamp(13px,1.1vw,16px)!important;\n\n  line-height:1.7!important;\n}\n\n\n\/* =========================================================\n   PLAYER + CHAT\n========================================================= *\/\n\n.ormix-main-layout{\n  max-width:1360px;\n\n  margin:0 auto;\n\n  display:grid;\n\n  grid-template-columns:\n    minmax(0,1.45fr)\n    minmax(330px,.55fr);\n\n  gap:22px;\n\n  align-items:stretch;\n}\n\n\n\/* =========================================================\n   PLAYER\n========================================================= *\/\n\n.ormix-player{\n  position:relative;\n\n  overflow:hidden;\n\n  border-radius:30px;\n\n  background:\n    linear-gradient(\n      145deg,\n      rgba(8,11,27,.99),\n      rgba(7,3,18,.99)\n    );\n\n  border:\n    1px solid rgba(255,86,224,.26);\n\n  box-shadow:\n    0 30px 75px rgba(0,0,0,.48);\n\n  transition:.35s ease;\n}\n\n\n.ormix-player.is-playing{\n  border-color:\n    rgba(255,78,224,.90);\n\n  box-shadow:\n\n    0 0 0 1px rgba(255,76,225,.22),\n\n    0 0 28px rgba(255,0,213,.30),\n\n    0 0 65px rgba(89,82,255,.20),\n\n    0 30px 80px rgba(0,0,0,.52);\n}\n\n\n\/* =========================================================\n   LEDs EXTERIORES\n========================================================= *\/\n\n.ormix-led-top,\n.ormix-led-bottom{\n  position:absolute;\n\n  left:6%;\n  right:6%;\n\n  height:3px;\n\n  z-index:30;\n\n  opacity:.32;\n\n  background:\n    linear-gradient(\n      90deg,\n      transparent,\n      #42ddff,\n      #8467ff,\n      #ff46da,\n      transparent\n    );\n}\n\n\n.ormix-led-top{\n  top:0;\n}\n\n\n.ormix-led-bottom{\n  bottom:0;\n}\n\n\n.ormix-player.is-playing\n.ormix-led-top,\n\n.ormix-player.is-playing\n.ormix-led-bottom{\n\n  opacity:1;\n\n  box-shadow:\n    0 0 14px #ff48db,\n    0 0 24px rgba(61,219,255,.35);\n\n  animation:\n    mixLed\n    1.6s ease-in-out infinite;\n}\n\n\n@keyframes mixLed{\n\n  0%,\n  100%{\n    transform:scaleX(.38);\n  }\n\n  50%{\n    transform:scaleX(1);\n  }\n\n}\n\n\n\/* =========================================================\n   PANTALLA PANOR\u00c1MICA\n========================================================= *\/\n\n.ormix-visual{\n  position:relative;\n\n  width:100%;\n\n  aspect-ratio:16 \/ 9;\n\n  overflow:hidden;\n\n  background:#02030a;\n}\n\n\n.ormix-main-image{\n  position:absolute;\n\n  inset:0;\n\n  z-index:2;\n\n  width:100%;\n  height:100%;\n\n  object-fit:cover;\n\n  object-position:center;\n\n  transition:\n    transform 7s ease,\n    filter .4s ease;\n\n  filter:\n    brightness(.98)\n    contrast(1.04)\n    saturate(1.06);\n}\n\n.ormix-main-image.is-dj-art{\n  object-fit:contain;\n  object-position:center center;\n}\n\n\n\n\/* =========================================================\n   PROMOCI\u00d3N MIXES \u00b7 PANEL VISUAL\n   Prioridad: DJ EN VIVO > PROMOCI\u00d3N > MIXES NORMAL\n========================================================= *\/\n\n.ormix-promo-layer{\n  position:absolute;\n  inset:0;\n  z-index:7;\n  display:none;\n  align-items:center;\n  justify-content:center;\n  overflow:hidden;\n  background:#02030a;\n  pointer-events:none;\n}\n\n.ormix-promo-layer.is-active{\n  display:flex;\n}\n\n.ormix-promo-image,\n.ormix-promo-video{\n  position:absolute;\n  inset:0;\n  width:100%;\n  height:100%;\n  display:none;\n  object-fit:contain;\n  object-position:center center;\n  background:#02030a;\n}\n\n.ormix-promo-image.is-active,\n.ormix-promo-video.is-active{\n  display:block;\n}\n\n\n\n\n.ormix-player.is-playing\n.ormix-main-image{\n\n  transform:scale(1.025);\n\n  filter:\n    brightness(1.05)\n    contrast(1.05)\n    saturate(1.12);\n}\n\n\n\/* SOMBREADO *\/\n\n.ormix-image-overlay{\n  position:absolute;\n\n  inset:0;\n\n  z-index:3;\n\n  pointer-events:none;\n\n  background:\n\n    linear-gradient(\n      180deg,\n      rgba(0,0,0,.16) 0%,\n      transparent 28%,\n      transparent 68%,\n      rgba(0,0,0,.52) 100%\n    ),\n\n    radial-gradient(\n      circle at center,\n      transparent 55%,\n      rgba(0,0,0,.12)\n    );\n}\n\n\n\/* =========================================================\n   CABECERA SOBRE IMAGEN\n========================================================= *\/\n\n.ormix-image-top{\n  position:absolute;\n\n  z-index:8;\n\n  left:20px;\n  right:20px;\n  top:18px;\n\n  display:flex;\n\n  align-items:center;\n  justify-content:space-between;\n\n  gap:15px;\n}\n\n\n.ormix-image-title{\n  padding:\n    8px 13px;\n\n  border-radius:999px;\n\n  color:#fff;\n\n  background:\n    rgba(3,5,15,.52);\n\n  backdrop-filter:\n    blur(8px);\n\n  border:\n    1px solid rgba(255,255,255,.13);\n\n  font-size:9px;\n  font-weight:900;\n\n  letter-spacing:1.4px;\n}\n\n\n.ormix-image-live{\n  display:flex;\n\n  align-items:center;\n\n  gap:7px;\n\n  padding:\n    8px 12px;\n\n  border-radius:999px;\n\n  color:#e5ebf4;\n\n  background:\n    rgba(3,5,15,.52);\n\n  border:\n    1px solid rgba(255,255,255,.12);\n\n  backdrop-filter:\n    blur(8px);\n\n  font-size:8px;\n  font-weight:900;\n\n  letter-spacing:1px;\n}\n\n\n\/* =========================================================\n   DJ EN VIVO \u00b7 INDICADOR REAL DE STREAMER\n   Se muestra solo cuando AzuraCast confirma un DJ en directo.\n========================================================= *\/\n.ormix-dj-live-badge{\n  display:none;\n  align-items:center;\n  gap:10px;\n  padding:10px 17px;\n  border-radius:999px;\n  color:#fff;\n  background:rgba(118,8,22,.88);\n  border:1px solid rgba(255,95,112,.82);\n  box-shadow:\n    0 0 0 1px rgba(255,255,255,.05),\n    0 0 20px rgba(255,37,68,.28);\n  backdrop-filter:blur(9px);\n  -webkit-backdrop-filter:blur(9px);\n  font-size:12px;\n  font-weight:950;\n  letter-spacing:1.25px;\n  white-space:nowrap;\n}\n\n.ormix-dj-live-badge.is-live{\n  display:flex;\n}\n\n.ormix-dj-live-badge .ormix-dj-live-dot{\n  width:11px;\n  height:11px;\n  flex:0 0 11px;\n  border-radius:50%;\n  background:#ff314f;\n  box-shadow:\n    0 0 0 3px rgba(255,49,79,.16),\n    0 0 14px rgba(255,49,79,.95);\n  animation:ormixDjLivePulse 1.15s ease-in-out infinite;\n}\n\n@keyframes ormixDjLivePulse{\n  0%,100%{ transform:scale(.82); opacity:.78; }\n  50%{ transform:scale(1.12); opacity:1; }\n}\n\n.ormix-image-live.is-hidden-by-dj-live{\n  display:none;\n}\n\n@media(max-width:620px){\n  .ormix-dj-live-badge{\n    padding:9px 13px;\n    font-size:10px;\n    letter-spacing:1px;\n  }\n  .ormix-dj-live-badge .ormix-dj-live-dot{\n    width:10px;\n    height:10px;\n    flex-basis:10px;\n  }\n}\n\n\n.ormix-image-live span{\n  width:8px;\n  height:8px;\n\n  border-radius:50%;\n\n  background:#58e594;\n\n  box-shadow:\n    0 0 10px rgba(88,229,148,.75);\n}\n\n\n.ormix-player.is-playing\n.ormix-image-live span{\n\n  background:#ff51dc;\n\n  box-shadow:\n    0 0 11px #ff51dc;\n\n  animation:\n    dotPulse\n    .85s ease-in-out infinite;\n}\n\n\n@keyframes dotPulse{\n\n  0%,\n  100%{\n    transform:scale(.75);\n  }\n\n  50%{\n    transform:scale(1.3);\n  }\n\n}\n\n\n\/* =========================================================\n   FRANJA INFERIOR IMAGEN\n========================================================= *\/\n\n\n\n\/* =========================================================\n   LUCES\n========================================================= *\/\n\n.ormix-beam{\n  position:absolute;\n\n  z-index:5;\n\n  top:-100px;\n\n  width:160px;\n  height:470px;\n\n  opacity:.05;\n\n  filter:blur(12px);\n\n  pointer-events:none;\n\n  clip-path:\n    polygon(\n      45% 0,\n      55% 0,\n      100% 100%,\n      0 100%\n    );\n}\n\n\n.ormix-beam.b1{\n  left:1%;\n\n  background:\n    linear-gradient(\n      #4addff,\n      transparent\n    );\n\n  transform:rotate(-18deg);\n}\n\n\n.ormix-beam.b2{\n  left:30%;\n\n  background:\n    linear-gradient(\n      #9561ff,\n      transparent\n    );\n\n  transform:rotate(-7deg);\n}\n\n\n.ormix-beam.b3{\n  right:30%;\n\n  background:\n    linear-gradient(\n      #ff48dd,\n      transparent\n    );\n\n  transform:rotate(7deg);\n}\n\n\n.ormix-beam.b4{\n  right:1%;\n\n  background:\n    linear-gradient(\n      #4addff,\n      transparent\n    );\n\n  transform:rotate(18deg);\n}\n\n\n.ormix-player.is-playing\n.ormix-beam{\n\n  opacity:.38;\n\n  animation:\n    beamMove\n    2.1s ease-in-out infinite alternate;\n}\n\n\n@keyframes beamMove{\n\n  from{\n    filter:\n      blur(14px)\n      brightness(.8);\n  }\n\n  to{\n    filter:\n      blur(5px)\n      brightness(1.35);\n  }\n\n}\n\n\n\/* =========================================================\n   SCAN\n========================================================= *\/\n\n.ormix-scan{\n  position:absolute;\n\n  z-index:6;\n\n  left:5%;\n  right:5%;\n\n  top:18%;\n\n  height:2px;\n\n  opacity:0;\n\n  background:\n    linear-gradient(\n      90deg,\n      transparent,\n      #53e3ff,\n      #ff51dd,\n      transparent\n    );\n}\n\n\n.ormix-player.is-playing\n.ormix-scan{\n\n  opacity:.65;\n\n  box-shadow:\n    0 0 12px rgba(255,75,220,.60);\n\n  animation:\n    scanMove\n    3.3s linear infinite;\n}\n\n\n@keyframes scanMove{\n\n  0%{\n    top:15%;\n  }\n\n  50%{\n    top:85%;\n  }\n\n  100%{\n    top:15%;\n  }\n\n}\n\n\n\/* =========================================================\n   \u00c1REA DE CONTROLES\n========================================================= *\/\n\n.ormix-controls-area{\n  padding:\n    23px 25px 25px;\n\n  display:grid;\n\n  grid-template-columns:\n    minmax(0,1fr)\n    minmax(290px,.70fr);\n\n  gap:23px;\n\n  align-items:center;\n}\n\n\n.ormix-control-copy small{\n  display:block;\n\n  color:#ff79e8;\n\n  font-size:8px;\n  font-weight:900;\n\n  letter-spacing:2px;\n}\n\n\n.ormix-control-copy h2{\n  margin:\n    7px 0\n    8px!important;\n\n  color:#fff!important;\n\n  font-size:\n    clamp(25px,2.2vw,37px)!important;\n\n  line-height:1!important;\n\n  font-weight:900!important;\n}\n\n\n.ormix-control-copy p{\n  margin:0!important;\n\n  max-width:640px;\n\n  color:#aebaca!important;\n\n  font-size:12px!important;\n\n  line-height:1.6!important;\n}\n\n\n\/* =========================================================\n   BOTONES\n========================================================= *\/\n\n.ormix-control-panel{\n  min-width:0;\n}\n\n\n.ormix-buttons{\n  display:grid;\n\n  grid-template-columns:\n    1fr 55px 55px;\n\n  gap:9px;\n}\n\n\n.ormix-play{\n  min-width:0;\n\n  min-height:55px;\n\n  cursor:pointer;\n\n  border-radius:16px;\n\n  color:#fff;\n\n  background:\n    linear-gradient(\n      135deg,\n      #6735e4,\n      #d923a1\n    );\n\n  border:\n    1px solid rgba(255,104,230,.65);\n\n  box-shadow:\n    0 0 23px rgba(255,0,210,.18);\n\n  font-size:10px;\n  font-weight:900;\n\n  letter-spacing:.5px;\n}\n\n\n.ormix-player.is-playing\n.ormix-play{\n\n  background:\n    linear-gradient(\n      135deg,\n      #7447ff,\n      #ff2cc9\n    );\n\n  box-shadow:\n    0 0 24px rgba(255,58,217,.45);\n}\n\n\n.ormix-square{\n  width:55px;\n  height:55px;\n\n  padding:0;\n\n  cursor:pointer;\n\n  border-radius:16px;\n\n  color:#fff;\n\n  background:\n    linear-gradient(\n      180deg,\n      #171425,\n      #090711\n    );\n\n  border:\n    1px solid rgba(255,255,255,.13);\n\n  font-size:19px;\n}\n\n\n.ormix-button-labels{\n  margin-top:5px;\n\n  display:grid;\n\n  grid-template-columns:\n    1fr 55px 55px;\n\n  gap:9px;\n\n  color:#667287;\n\n  text-align:center;\n\n  font-size:7px;\n  font-weight:900;\n}\n\n\n.ormix-button-labels span:first-child{\n  visibility:hidden;\n}\n\n\n\/* =========================================================\n   VOLUMEN\n========================================================= *\/\n\n.ormix-volume{\n  margin-top:10px;\n\n  display:flex;\n\n  align-items:center;\n\n  gap:10px;\n\n  padding:\n    10px 12px;\n\n  border-radius:13px;\n\n  background:\n    rgba(2,4,12,.72);\n\n  border:\n    1px solid rgba(255,255,255,.08);\n}\n\n\n.ormix-volume span{\n  color:#8c99ac;\n\n  font-size:8px;\n  font-weight:900;\n}\n\n\n.ormix-volume input{\n  flex:1;\n\n  min-width:0;\n\n  accent-color:#ed4bda;\n}\n\n\n.ormix-volume strong{\n  width:36px;\n\n  color:#ff76e6;\n\n  text-align:right;\n\n  font-size:8px;\n}\n\n\n\/* =========================================================\n   VENTANA APARTE\n========================================================= *\/\n\n.ormix-secondary{\n  margin-top:9px;\n}\n\n\n.ormix-popup{\n  width:100%;\n\n  min-height:43px;\n\n  display:flex;\n\n  align-items:center;\n  justify-content:center;\n\n  padding:\n    9px 11px;\n\n  cursor:pointer;\n\n  border-radius:999px;\n\n  color:#fff;\n\n  background:\n    rgba(255,255,255,.045);\n\n  border:\n    1px solid rgba(255,255,255,.11);\n\n  font-size:8px;\n  font-weight:900;\n\n  letter-spacing:.45px;\n}\n\n\n\/* =========================================================\n   BOT\u00d3N RADIO 24\/7 ABAJO\n========================================================= *\/\n\n.ormix-other-radio{\n  min-height:45px;\n\n  display:inline-flex;\n\n  align-items:center;\n  justify-content:center;\n\n  padding:\n    10px 18px;\n\n  border-radius:999px;\n\n  color:#fff!important;\n\n  text-decoration:none!important;\n\n  background:\n    linear-gradient(\n      135deg,\n      rgba(0,173,255,.20),\n      rgba(61,89,255,.20)\n    );\n\n  border:\n    1px solid rgba(72,211,255,.30);\n\n  box-shadow:\n    0 0 18px rgba(0,177,255,.08);\n\n  font-size:9px;\n  font-weight:900;\n\n  letter-spacing:.5px;\n}\n\n\n\/* =========================================================\n   CHAT\n========================================================= *\/\n\n.ormix-chat{\n  display:flex;\n\n  flex-direction:column;\n\n  overflow:hidden;\n\n  min-height:100%;\n\n  border-radius:30px;\n\n  background:\n\n    radial-gradient(\n      circle at 75% 10%,\n      rgba(255,0,213,.13),\n      transparent 30%\n    ),\n\n    rgba(7,9,24,.96);\n\n  border:\n    1px solid rgba(156,103,255,.22);\n\n  box-shadow:\n    0 30px 75px rgba(0,0,0,.40);\n}\n\n\n.ormix-chat-head{\n  padding:\n    24px 21px\n    18px;\n\n  border-bottom:\n    1px solid rgba(255,255,255,.08);\n}\n\n\n.ormix-chat-head small{\n  color:#ff77e7;\n\n  font-size:9px;\n  font-weight:900;\n\n  letter-spacing:2px;\n}\n\n\n.ormix-chat-head h2{\n  margin:\n    7px 0\n    8px!important;\n\n  color:#fff!important;\n\n  font-size:27px!important;\n\n  font-weight:900!important;\n}\n\n\n.ormix-chat-head p{\n  margin:0!important;\n\n  color:#9eabbd!important;\n\n  font-size:12px!important;\n\n  line-height:1.55!important;\n}\n\n\n.ormix-chat-frame{\n  position:relative;\n\n  flex:1;\n\n  min-height:450px;\n\n  background:#060814;\n}\n\n\n.ormix-chat-frame iframe{\n  display:block;\n\n  width:100%;\n  height:100%;\n\n  min-height:450px;\n\n  border:0;\n}\n\n\n\/* =========================================================\n   CHAT BLOQUEADO \u00b7 DISE\u00d1O UNIFICADO MAC \/ WINDOWS\n========================================================= *\/\n\n.ormix-chat-frame.is-locked iframe{\n  filter:blur(7px) brightness(.42) saturate(.7);\n  transform:scale(1.035);\n  pointer-events:none;\n  user-select:none;\n}\n\n.ormix-chat-lock{\n  position:absolute;\n  inset:0;\n  z-index:5;\n\n  display:flex;\n  align-items:center;\n  justify-content:center;\n\n  padding:22px;\n\n  background:\n    linear-gradient(\n      180deg,\n      rgba(3,6,16,.18),\n      rgba(3,6,16,.38)\n    );\n\n  backdrop-filter:blur(1.5px);\n  -webkit-backdrop-filter:blur(1.5px);\n}\n\n.ormix-chat-lock-card{\n  width:min(330px,88%);\n\n  padding:30px 25px 26px;\n\n  text-align:center;\n\n  border-radius:24px;\n\n  background:\n    linear-gradient(\n      145deg,\n      rgba(13,18,38,.94),\n      rgba(8,12,27,.96)\n    );\n\n  border:1px solid rgba(255,72,199,.48);\n\n  box-shadow:\n    0 0 0 1px rgba(71,122,255,.16),\n    0 0 26px rgba(255,0,213,.17),\n    0 20px 55px rgba(0,0,0,.48);\n}\n\n.ormix-chat-lock-eyebrow{\n  margin-bottom:12px;\n\n  color:#ff67cf;\n\n  font-size:10px;\n  font-weight:900;\n\n  letter-spacing:1.8px;\n}\n\n.ormix-chat-lock-icon{\n  display:flex;\n  align-items:center;\n  justify-content:center;\n\n  width:72px;\n  height:72px;\n\n  margin:0 auto 16px;\n\n  border-radius:50%;\n\n  color:#ff69df;\n\n  font-size:34px;\n\n  border:1px solid rgba(255,92,225,.72);\n\n  box-shadow:\n    0 0 20px rgba(255,0,213,.26),\n    inset 0 0 18px rgba(72,93,255,.13);\n}\n\n.ormix-chat-lock-title{\n  margin:0 0 13px!important;\n\n  color:#fff!important;\n\n  font-size:27px!important;\n  font-weight:900!important;\n}\n\n.ormix-chat-lock-main{\n  margin:0 0 10px!important;\n\n  color:#fff!important;\n\n  font-size:15px!important;\n  font-weight:800!important;\n\n  line-height:1.45!important;\n}\n\n.ormix-chat-lock-sub{\n  margin:0!important;\n\n  color:#aeb9ca!important;\n\n  font-size:12px!important;\n\n  line-height:1.6!important;\n}\n\n.ormix-chat-lock-status{\n  display:inline-flex;\n  align-items:center;\n  justify-content:center;\n\n  min-height:42px;\n\n  margin-top:19px;\n  padding:0 20px;\n\n  border-radius:999px;\n\n  color:#ff67cf;\n\n  font-size:11px;\n  font-weight:900;\n\n  letter-spacing:.7px;\n\n  border:1px solid rgba(255,72,199,.48);\n\n  background:rgba(255,0,213,.055);\n}\n\n.ormix-chat-unlocked .ormix-chat-lock{\n  display:none;\n}\n\n.ormix-chat-unlocked iframe{\n  filter:none!important;\n  transform:none!important;\n  pointer-events:auto!important;\n}\n\n@media (max-width:760px){\n  .ormix-chat-lock{\n    padding:14px;\n  }\n\n  .ormix-chat-lock-card{\n    width:min(320px,92%);\n    padding:24px 18px 22px;\n    border-radius:20px;\n  }\n\n  .ormix-chat-lock-title{\n    font-size:23px!important;\n  }\n\n  .ormix-chat-lock-icon{\n    width:62px;\n    height:62px;\n    font-size:29px;\n  }\n}\n\n\n.ormix-chat-open{\n  display:flex;\n\n  align-items:center;\n  justify-content:center;\n\n  min-height:46px;\n\n  margin:13px;\n\n  padding:\n    9px 14px;\n\n  border-radius:999px;\n\n  color:#fff!important;\n\n  text-decoration:none!important;\n\n  background:\n    linear-gradient(\n      135deg,\n      rgba(91,62,255,.23),\n      rgba(255,0,213,.20)\n    );\n\n  border:\n    1px solid rgba(255,94,227,.27);\n\n  font-size:8px;\n  font-weight:900;\n}\n\n\n\n\/* =========================================================\n   FICHA DIN\u00c1MICA DEL DJ\n   Solo aparece cuando el perfil tiene descripci\u00f3n.\n========================================================= *\/\n\n.ormix-dj-profile{\n  max-width:1360px;\n  margin:24px auto 0;\n  display:none;\n}\n\n.ormix-dj-profile.is-visible{\n  display:block;\n}\n\n.ormix-dj-profile-card{\n  padding:clamp(23px,3vw,32px);\n  border-radius:24px;\n  background:rgba(8,10,28,.79);\n  border:1px solid rgba(255,255,255,.09);\n  box-shadow:0 18px 40px rgba(0,0,0,.23);\n}\n\n.ormix-dj-profile-name{\n  margin:0 0 12px!important;\n  color:#fff!important;\n  font-size:clamp(22px,2vw,30px)!important;\n  font-weight:900;\n  letter-spacing:.2px;\n}\n\n.ormix-dj-profile-description{\n  margin:0!important;\n  color:#dce5f3!important;\n  font-size:clamp(14px,1.2vw,17px)!important;\n  line-height:1.75!important;\n  white-space:pre-line;\n}\n\n\/* =========================================================\n   INFORMACI\u00d3N INFERIOR\n========================================================= *\/\n\n.ormix-description{\n  max-width:1360px;\n\n  margin:\n    24px auto\n    0;\n\n  display:grid;\n\n  grid-template-columns:\n    1fr 1fr;\n\n  gap:18px;\n}\n\n.ormix-description > .ormix-card:first-child{\n  grid-column:1 \/ -1;\n}\n\n\n.ormix-card{\n  padding:\n    clamp(23px,3vw,32px);\n\n  border-radius:24px;\n\n  background:\n    rgba(8,10,28,.79);\n\n  border:\n    1px solid rgba(255,255,255,.09);\n\n  box-shadow:\n    0 18px 40px rgba(0,0,0,.23);\n}\n\n\n.ormix-card small{\n  display:block;\n\n  color:#ff73e5;\n\n  font-size:8px;\n  font-weight:900;\n\n  letter-spacing:2px;\n}\n\n\n.ormix-card h2{\n  margin:\n    8px 0\n    12px!important;\n\n  color:#fff!important;\n\n  font-size:\n    clamp(22px,2vw,30px)!important;\n\n  font-weight:900!important;\n}\n\n\n.ormix-card p{\n  margin:0!important;\n\n  color:#aab5c6!important;\n\n  font-size:13px!important;\n\n  line-height:1.7!important;\n}\n\n\n.ormix-tags{\n  display:flex;\n\n  flex-wrap:wrap;\n\n  gap:7px;\n\n  margin-top:16px;\n}\n\n\n.ormix-tags span{\n  padding:\n    7px 11px;\n\n  border-radius:999px;\n\n  color:#d8d9e6;\n\n  background:\n    rgba(255,255,255,.045);\n\n  border:\n    1px solid rgba(255,255,255,.09);\n\n  font-size:8px;\n  font-weight:900;\n}\n\n\n\n\/* =========================================================\n   CUADRO OR MUSIC LIVE TV\n========================================================= *\/\n\n.ormix-tv-card{\n  position:relative;\n  overflow:hidden;\n\n  transition:\n    border-color .25s ease,\n    box-shadow .25s ease,\n    transform .25s ease,\n    background .25s ease;\n}\n\n.ormix-tv-card::before{\n  content:\"\";\n\n  position:absolute;\n  inset:0;\n\n  pointer-events:none;\n\n  opacity:0;\n\n  background:\n    radial-gradient(\n      circle at 18% 20%,\n      rgba(64,214,255,.22),\n      transparent 34%\n    ),\n    radial-gradient(\n      circle at 82% 80%,\n      rgba(255,57,213,.24),\n      transparent 38%\n    );\n\n  transition:opacity .25s ease;\n}\n\n.ormix-tv-card > *{\n  position:relative;\n  z-index:2;\n}\n\n.ormix-tv-link{\n  min-height:45px;\n\n  display:inline-flex;\n\n  align-items:center;\n  justify-content:center;\n\n  gap:8px;\n\n  padding:\n    10px 18px;\n\n  border-radius:999px;\n\n  color:#fff!important;\n\n  text-decoration:none!important;\n\n  background:\n    linear-gradient(\n      135deg,\n      rgba(100,69,224,.18),\n      rgba(222,46,184,.18)\n    );\n\n  border:\n    1px solid rgba(255,91,224,.30);\n\n  box-shadow:\n    0 0 18px rgba(255,50,207,.08);\n\n  font-size:9px;\n  font-weight:900;\n\n  letter-spacing:.5px;\n\n  transition:\n    transform .22s ease,\n    filter .22s ease,\n    box-shadow .22s ease,\n    border-color .22s ease;\n}\n\n.ormix-tv-link:hover{\n  transform:translateY(-1px);\n  filter:brightness(1.08);\n}\n\n.ormix-tv-dot{\n  width:8px;\n  height:8px;\n\n  border-radius:50%;\n\n  background:#677386;\n\n  box-shadow:\n    0 0 8px rgba(103,115,134,.35);\n}\n\n\n\/* CUANDO OR MUSIC LIVE TV TIENE SE\u00d1AL ACTIVA *\/\n\n.ormix-tv-card.is-on-air{\n  transform:translateY(-2px);\n\n  background:\n    linear-gradient(\n      145deg,\n      rgba(9,22,40,.92),\n      rgba(42,8,48,.92)\n    );\n\n  border-color:\n    rgba(255,72,216,.75);\n\n  box-shadow:\n    0 0 0 1px rgba(255,76,220,.15),\n    0 0 28px rgba(255,47,210,.34),\n    0 0 52px rgba(68,210,255,.20),\n    0 22px 48px rgba(0,0,0,.30);\n\n  animation:\n    ormixTvCardGlow\n    1.7s ease-in-out infinite;\n}\n\n.ormix-tv-card.is-on-air::before{\n  opacity:1;\n}\n\n.ormix-tv-card.is-on-air small{\n  color:#6ce2ff;\n}\n\n.ormix-tv-card.is-on-air .ormix-tv-link{\n  background:\n    linear-gradient(\n      135deg,\n      #6537dd,\n      #d724aa\n    );\n\n  border-color:\n    rgba(255,104,229,.78);\n\n  box-shadow:\n    0 0 20px rgba(255,48,209,.34);\n}\n\n.ormix-tv-card.is-on-air .ormix-tv-dot{\n  background:#ff47d7;\n\n  box-shadow:\n    0 0 8px #ff47d7,\n    0 0 18px rgba(255,71,215,.95);\n\n  animation:\n    ormixTvDotPulse\n    .9s ease-in-out infinite;\n}\n\n@keyframes ormixTvCardGlow{\n\n  0%,100%{\n    box-shadow:\n      0 0 0 1px rgba(255,76,220,.12),\n      0 0 20px rgba(255,47,210,.24),\n      0 0 38px rgba(68,210,255,.12),\n      0 22px 48px rgba(0,0,0,.28);\n  }\n\n  50%{\n    box-shadow:\n      0 0 0 1px rgba(255,76,220,.28),\n      0 0 34px rgba(255,47,210,.50),\n      0 0 62px rgba(68,210,255,.28),\n      0 24px 52px rgba(0,0,0,.34);\n  }\n\n}\n\n@keyframes ormixTvDotPulse{\n\n  0%,100%{\n    transform:scale(.78);\n    opacity:.70;\n  }\n\n  50%{\n    transform:scale(1.28);\n    opacity:1;\n  }\n\n}\n\n\n\/* =========================================================\n   REDES\n========================================================= *\/\n\n.or-social-info{\n  width:100vw!important;\n\n  margin-left:\n    calc(50% - 50vw)!important;\n\n  margin-right:\n    calc(50% - 50vw)!important;\n\n  padding:\n    48px 22px!important;\n\n  background:\n    linear-gradient(\n      180deg,\n      #020617,\n      #040713\n    )!important;\n}\n\n.or-social-info-inner{\n  max-width:1050px!important;\n\n  margin:0 auto!important;\n\n  display:grid!important;\n\n  grid-template-columns:\n    repeat(3,minmax(0,1fr))!important;\n\n  gap:14px!important;\n}\n\n.or-social-title,\n.or-social-subtitle{\n  grid-column:1\/-1!important;\n\n  text-align:center!important;\n}\n\n.or-social-title{\n  color:#fff!important;\n\n  font-size:23px!important;\n  font-weight:900!important;\n\n  letter-spacing:1.8px!important;\n}\n\n.or-social-subtitle{\n  margin-bottom:15px!important;\n\n  color:#8392a6!important;\n\n  font-size:11px!important;\n}\n\n.or-social-card{\n  padding:17px!important;\n\n  display:flex!important;\n\n  align-items:center!important;\n\n  gap:13px!important;\n\n  border-radius:18px!important;\n\n  background:\n    rgba(8,13,30,.90)!important;\n\n  border:\n    1px solid rgba(255,255,255,.09)!important;\n}\n\n.or-social-logo{\n  width:42px!important;\n  height:42px!important;\n\n  display:flex!important;\n\n  align-items:center!important;\n  justify-content:center!important;\n}\n\n.or-social-logo svg{\n  width:30px!important;\n  height:30px!important;\n\n  fill:none!important;\n  stroke:#fff!important;\n\n  stroke-width:1.6!important;\n}\n\n.or-social-logo path{\n  fill:#fff!important;\n  stroke:none!important;\n}\n\n.or-social-card.tiktok .or-tiktok-mark{\n  width:31px!important;\n  height:31px!important;\n  overflow:visible!important;\n}\n\n.or-social-card.tiktok .or-tiktok-mark path{\n  stroke:none!important;\n}\n\n.or-social-card.tiktok .or-tiktok-mark .tk-cyan{\n  fill:#25F4EE!important;\n  opacity:.92!important;\n}\n\n.or-social-card.tiktok .or-tiktok-mark .tk-pink{\n  fill:#FE2C55!important;\n  opacity:.92!important;\n}\n\n.or-social-card.tiktok .or-tiktok-mark .tk-white{\n  fill:#ffffff!important;\n}\n\n.or-social-copy span{\n  display:block!important;\n\n  color:#7f8da2!important;\n\n  font-size:9px!important;\n  font-weight:900!important;\n\n  text-transform:uppercase!important;\n}\n\n.or-social-copy strong{\n  display:block!important;\n\n  margin-top:3px!important;\n\n  color:#fff!important;\n\n  font-size:13px!important;\n}\n\n\n\n@media(max-width:760px){\n  .or-social-info-inner{\n    grid-template-columns:1fr!important;\n  }\n}\n\n\n\/* =========================================================\n   FOOTER\n========================================================= *\/\n\n.ormix-foot{\n  max-width:1360px;\n\n  margin:\n    27px auto\n    0;\n\n  padding-top:19px;\n\n  border-top:\n    1px solid rgba(255,255,255,.07);\n\n  color:#778297;\n\n  text-align:center;\n\n  font-size:9px;\n\n  letter-spacing:1.3px;\n}\n\n\n\/* =========================================================\n   TABLET\n========================================================= *\/\n\n@media(max-width:1080px){\n\n  .ormix-main-layout{\n    grid-template-columns:1fr;\n  }\n\n\n  .ormix-chat{\n    min-height:570px;\n  }\n\n}\n\n\n\/* =========================================================\n   M\u00d3VIL\n========================================================= *\/\n\n@media(max-width:760px){\n\n  .ormix-controls-area{\n    grid-template-columns:1fr;\n\n    text-align:center;\n  }\n\n\n  .ormix-control-copy p{\n    margin-left:auto!important;\n    margin-right:auto!important;\n  }\n\n\n  .ormix-description{\n    grid-template-columns:1fr;\n  }\n\n}\n\n\n@media(max-width:620px){\n\n  .ormix-wrap{\n    padding:\n      12px 10px\n      35px;\n  }\n\n\n  .ormix-page::after{\n    opacity:.10;\n\n    background-size:\n      165px auto;\n  }\n\n\n  .ormix-header{\n    min-height:112px;\n\n    padding:\n      16px 5px\n      18px;\n\n    flex-direction:column;\n\n    gap:14px;\n  }\n\n\n  .ormix-domain{\n    font-size:31px!important;\n  }\n\n\n  .ormix-home{\n    position:static;\n\n    transform:none;\n\n    min-height:39px;\n\n    padding:\n      8px 16px;\n  }\n\n\n  .ormix-intro h1{\n    font-size:40px!important;\n  }\n\n\n  .ormix-intro p{\n    font-size:13px!important;\n  }\n\n\n  .ormix-player,\n  .ormix-chat{\n    border-radius:21px;\n  }\n\n\n  .ormix-image-top{\n    left:10px;\n    right:10px;\n    top:10px;\n  }\n\n\n  .ormix-image-title{\n    font-size:7px;\n\n    padding:\n      7px 9px;\n  }\n\n\n  .ormix-image-live{\n    font-size:7px;\n\n    padding:\n      7px 9px;\n  }\n\n\n\n\n  .ormix-controls-area{\n    padding:\n      20px 15px;\n  }\n\n\n  .ormix-buttons{\n    grid-template-columns:\n      1fr 52px 52px;\n  }\n\n\n  .ormix-square{\n    width:52px;\n    height:52px;\n  }\n\n\n  .ormix-button-labels{\n    grid-template-columns:\n      1fr 52px 52px;\n  }\n\n\n  .ormix-chat-frame,\n  .ormix-chat-frame iframe{\n    min-height:430px;\n  }\n\n}\n\n<\/style>\n\n\n<!-- OR_MIXES_MUX_PLAYER_GUARD_20260917 -->\n<script>\n(function(){\n\n  const TARGET =\n    \"https:\/\/video.ormusiclive.com:9444\/api\/multimedia\/output?platform=web&screen=mixes\";\n\n  if(!window.__OR_MIX_NATIVE_FETCH){\n    window.__OR_MIX_NATIVE_FETCH =\n      window.fetch.bind(window);\n  }\n\n  if(!window.__OR_MIX_FETCH_GUARD_INSTALLED){\n\n    window.__OR_MIX_FETCH_GUARD_INSTALLED =\n      true;\n\n    const nativeFetch =\n      window.__OR_MIX_NATIVE_FETCH;\n\n    window.fetch =\n      function(input,init){\n\n        let url = \"\";\n\n        try{\n          url =\n            typeof input === \"string\"\n            ? input\n            : (\n                input &&\n                input.url\n                ? String(input.url)\n                : \"\"\n              );\n        }catch(error){}\n\n        if(\n          url.indexOf(TARGET) === 0\n          &&\n          !(\n            init &&\n            init.__orMixMuxPlayerV2 === true\n          )\n        ){\n\n          return Promise.resolve(\n            new Response(\n              JSON.stringify({\n                version:3,\n                platform:\"web\",\n                screen:\"mixes\",\n                enabled:false,\n                image_duration_seconds:10,\n                items:[]\n              }),\n              {\n                status:200,\n                headers:{\n                  \"Content-Type\":\"application\/json\"\n                }\n              }\n            )\n          );\n        }\n\n        return nativeFetch(\n          input,\n          init\n        );\n      };\n\n  }\n\n})();\n<\/script>\n\n\n\n\n<div class=\"ormix-page\">\n\n<div class=\"ormix-wrap\">\n\n\n<!-- =========================================================\n     CABECERA\n========================================================= -->\n\n<div class=\"ormix-header\">\n\n\n  <div class=\"ormix-domain\">\n\n    ORMUSICLIVE.COM\n\n  <\/div>\n\n\n  <a class=\"ormix-home\" href=\"https:\/\/ormusiclive.com\/\" aria-label=\"Ir al inicio\">\n<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n<path d=\"M3 11.2 12 4l9 7.2v8.3a1.5 1.5 0 0 1-1.5 1.5H15v-6H9v6H4.5A1.5 1.5 0 0 1 3 19.5z\"><\/path>\n<\/svg>\n<span>INICIO<\/span>\n<\/a>\n\n\n<\/div>\n\n\n\n<!-- =========================================================\n     INTRO\n========================================================= -->\n\n<div class=\"ormix-intro\">\n\n\n  <small>\n    OR MUSIC LIVE \u00b7 CANAL ESPECIAL\n  <\/small>\n\n\n  <h1>\n    MIXES &amp; DJS\n  <\/h1>\n\n\n  <p>\n\n    Un espacio dedicado a las mezclas,\n    minitecas, discplay, DJs,\n    sesiones especiales\n    y programaci\u00f3n ligada al entretenimiento.\n\n    M\u00e1s m\u00fasica, m\u00e1s cabina,\n    m\u00e1s energ\u00eda y m\u00e1s fiesta.\n\n  <\/p>\n\n\n<\/div>\n\n\n\n<!-- =========================================================\n     PLAYER + CHAT\n========================================================= -->\n\n<div class=\"ormix-main-layout\">\n\n\n<section class=\"ormix-player\" id=\"ormixPlayer\">\n\n\n  <div class=\"ormix-led-top\"><\/div>\n  <div class=\"ormix-led-bottom\"><\/div>\n\n\n\n  <!-- IMAGEN -->\n\n  <div class=\"ormix-visual\">\n\n\n    <img decoding=\"async\" class=\"ormix-main-image\" id=\"ormixMainImage\" src=\"https:\/\/ormusiclive.com\/wp-content\/uploads\/2026\/08\/Imagen-logo-or-con-dj.png\" alt=\"OR Music Live Mixes DJs Minitecas\">\n\n\n    <div class=\"ormix-promo-layer\" id=\"orMixPromoLayer\" aria-hidden=\"true\">\n      <img class=\"ormix-promo-image\" id=\"orMixPromoImage\" alt=\"Promoci\u00f3n OR Music Live Mixes &amp; DJs\">\n      <video class=\"ormix-promo-video\" id=\"orMixPromoVideo\" muted=\"\" playsinline=\"\" preload=\"metadata\"><\/video>\n    <\/div>\n\n\n    <div class=\"ormix-image-overlay\"><\/div>\n\n\n    <span class=\"ormix-beam b1\"><\/span>\n    <span class=\"ormix-beam b2\"><\/span>\n    <span class=\"ormix-beam b3\"><\/span>\n    <span class=\"ormix-beam b4\"><\/span>\n\n\n    \n\n\n\n    <div class=\"ormix-image-top\">\n\n\n      <div class=\"ormix-image-title\">\n\n        OR MUSIC LIVE \u00b7 MIXES &amp; DJS\n\n      <\/div>\n\n\n      <div class=\"ormix-image-live\" id=\"ormixSignalBadge\">\n\n        <span><\/span>\n\n        <b id=\"ormixImageStatus\">\n\n          SE\u00d1AL DISPONIBLE\n\n        <\/b>\n\n      <\/div>\n\n      <div class=\"ormix-dj-live-badge\" id=\"ormixDjLiveBadge\" aria-live=\"polite\">\n        <span class=\"ormix-dj-live-dot\" aria-hidden=\"true\"><\/span>\n        <b>DJ EN VIVO<\/b>\n      <\/div>\n\n\n    <\/div>\n\n\n  <\/div>\n\n\n\n  <!-- CONTROLES -->\n\n  <div class=\"ormix-controls-area\">\n\n\n    <div class=\"ormix-control-copy\">\n\n\n      <small>\n        EXPERIENCIA OR MUSIC LIVE\n      <\/small>\n\n\n      <h2>\n        MEZCLAS PARA TU DISFRUTE\n      <\/h2>\n\n\n      <p>\n\n        Disfruta mezclas,\n        sesiones y sets\n        seleccionados para mantener\n        la energ\u00eda y el ambiente\n        de fiesta durante todo el d\u00eda.\n\n      <\/p>\n\n\n    <\/div>\n\n\n\n    <div class=\"ormix-control-panel\">\n\n\n      <div class=\"ormix-buttons\">\n\n\n        <button type=\"button\" class=\"ormix-play\" id=\"ormixPlay\">\n\n          \u25b6 ESCUCHAR MIXES\n\n        <\/button>\n\n\n        <button type=\"button\" class=\"ormix-square\" id=\"ormixMute\" title=\"Silenciar\">\n\n          \ud83d\udd0a\n\n        <\/button>\n\n\n        <button type=\"button\" class=\"ormix-square\" id=\"ormixReload\" title=\"Recargar se\u00f1al\">\n\n          \u21bb\n\n        <\/button>\n\n\n      <\/div>\n\n\n\n      <div class=\"ormix-button-labels\">\n\n        <span>PLAY<\/span>\n        <span>MUTE<\/span>\n        <span>RECARGAR<\/span>\n\n      <\/div>\n\n\n\n      <div class=\"ormix-volume\">\n\n\n        <span>\n          VOLUMEN\n        <\/span>\n\n\n        <input id=\"ormixVolume\" type=\"range\" min=\"0\" max=\"1\" step=\".01\" value=\".85\">\n\n\n        <strong id=\"ormixVolumeText\">\n\n          85%\n\n        <\/strong>\n\n\n      <\/div>\n\n\n\n      <div class=\"ormix-secondary\">\n\n\n        <button type=\"button\" class=\"ormix-popup\" id=\"ormixPopup\">\n\n          \u2197 ABRIR MIXES EN VENTANA APARTE\n\n        <\/button>\n\n\n      <\/div>\n\n\n    <\/div>\n\n\n  <\/div>\n\n\n<\/section>\n\n\n\n<!-- =========================================================\n     CHAT\n========================================================= -->\n\n<aside class=\"ormix-chat\">\n\n\n  <div class=\"ormix-chat-head\">\n\n\n    <small>\n      COMUNIDAD OR MUSIC LIVE\n    <\/small>\n\n\n    <h2>\n      Chat de oyentes\n    <\/h2>\n\n\n    <p>\n\n      Comenta las sesiones,\n      conversa con otros oyentes\n      y acompa\u00f1a la programaci\u00f3n\n      de Mixes &amp; DJs.\n\n    <\/p>\n\n\n  <\/div>\n\n\n\n  <div class=\"ormix-chat-frame is-locked\" id=\"ormixChatFrame\">\n\n\n    <iframe src=\"https:\/\/organizations.minnit.chat\/247725476591154\/Main\" title=\"Chat OR Music Live\" loading=\"lazy\" allow=\"clipboard-write\">\n    <\/iframe>\n\n\n    <div class=\"ormix-chat-lock\" id=\"ormixChatLock\">\n\n      <div class=\"ormix-chat-lock-card\">\n\n        <div class=\"ormix-chat-lock-eyebrow\">\n          CHAT OR MUSIC LIVE\n        <\/div>\n\n        <div class=\"ormix-chat-lock-icon\" aria-hidden=\"true\">\n          \ud83d\udd12\n        <\/div>\n\n        <h3 class=\"ormix-chat-lock-title\">\n          Chat bloqueado\n        <\/h3>\n\n        <p class=\"ormix-chat-lock-main\">\n          Disponible solo durante transmisiones especiales.\n        <\/p>\n\n        <p class=\"ormix-chat-lock-sub\">\n          Cuando est\u00e9 habilitado podr\u00e1s participar en la conversaci\u00f3n en vivo.\n        <\/p>\n\n        <div class=\"ormix-chat-lock-status\">\n          BLOQUEADO\n        <\/div>\n\n      <\/div>\n\n    <\/div>\n\n\n  <\/div>\n\n\n\n  <div class=\"ormix-chat-open\" id=\"ormixChatStatusBar\" style=\"pointer-events:none;\">\n    CHAT DISPONIBLE DURANTE EVENTOS EN VIVO\n  <\/div>\n\n  <button type=\"button\" id=\"ormixChatPopupButton\" style=\"display:none;width:100%;margin-top:10px;min-height:46px;border:1px solid rgba(118,221,255,.35);border-radius:12px;background:linear-gradient(135deg,#0d2537,#101a2c);color:#fff;font-weight:900;letter-spacing:.5px;cursor:pointer;\">\n    \u2197 ABRIR CHAT GRANDE\n  <\/button>\n\n\n<\/aside>\n\n\n<\/div>\n\n\n\n\n<!-- =========================================================\n     FICHA DIN\u00c1MICA DEL DJ\n     Solo se muestra si existe una descripci\u00f3n en el panel.\n========================================================= -->\n\n<section class=\"ormix-dj-profile\" id=\"ormixDJProfile\" aria-live=\"polite\">\n  <div class=\"ormix-dj-profile-card\">\n    <h2 class=\"ormix-dj-profile-name\" id=\"ormixDJProfileName\"><\/h2>\n\n    <p class=\"ormix-dj-profile-description\" id=\"ormixDJProfileDescription\"><\/p>\n  <\/div>\n<\/section>\n\n\n<!-- =========================================================\n     INFORMACI\u00d3N INFERIOR\n========================================================= -->\n\n<div class=\"ormix-description\">\n\n\n  <div class=\"ormix-card\">\n\n\n    <small>\n      UNA EXPERIENCIA DIFERENTE\n    <\/small>\n\n\n    <h2>\n      Ambiente de fiesta y sesi\u00f3n continua\n    <\/h2>\n\n\n    <p>\n\n      Mixes &amp; DJs es la se\u00f1al\n      de OR Music Live dedicada\n      a sesiones continuas,\n      minitecas, discplay,\n      mezclas tem\u00e1ticas,\n      invitados, m\u00fasicos\n      y contenidos vinculados\n      al entretenimiento.\n\n    <\/p>\n\n\n    <div class=\"ormix-tags\">\n\n      <span>DJ SETS<\/span>\n      <span>MINITECAS<\/span>\n      <span>DISCPLAY<\/span>\n      <span>RETRO<\/span>\n      <span>DANCE<\/span>\n      <span>LATINO<\/span>\n      <span>ESPECIALES<\/span>\n\n    <\/div>\n\n\n  <\/div>\n\n\n\n  <div class=\"ormix-card\">\n\n\n    <small>\n      DOS SE\u00d1ALES \u00b7 UNA MISMA RADIO\n    <\/small>\n\n\n    <h2>\n      \u00bfQuieres m\u00fasica individual?\n    <\/h2>\n\n\n    <p>\n\n      Tambi\u00e9n puedes cambiar\n      directamente a Radio 24\/7,\n      con cl\u00e1sicos,\n      \u00e9xitos actuales,\n      pop, rock,\n      dance, ritmos latinos\n      y m\u00fasica en espa\u00f1ol e ingl\u00e9s.\n\n    <\/p>\n\n\n    <div style=\"margin-top:18px;\">\n\n\n      <a class=\"ormix-other-radio\" href=\"https:\/\/ormusiclive.com\/?page_id=10\">\n\n        \ud83c\udfb5 CAMBIAR A RADIO 24\/7\n\n      <\/a>\n\n\n    <\/div>\n\n\n  <\/div>\n\n\n\n  <div class=\"ormix-card ormix-tv-card\" id=\"ormixTvCard\">\n\n\n    <small id=\"ormixTvEyebrow\">\n      SALA AUDIOVISUAL\n    <\/small>\n\n\n    <h2>\n      \u00bfQuieres ver OR Music Live TV?\n    <\/h2>\n\n\n    <p>\n\n      Accede a transmisiones,\n      programas, entrevistas,\n      videos y contenido audiovisual\n      de OR Music Live.\n\n    <\/p>\n\n\n    <div style=\"margin-top:18px;\">\n\n\n      <a class=\"ormix-tv-link\" id=\"ormixTvLink\" href=\"https:\/\/ormusiclive.com\/?page_id=411\">\n\n        <span class=\"ormix-tv-dot\"><\/span>\n\n        <span id=\"ormixTvLinkText\">\n          \ud83d\udcfa IR A OR MUSIC LIVE TV\n        <\/span>\n\n      <\/a>\n\n\n    <\/div>\n\n\n  <\/div>\n\n\n<\/div>\n\n\n\n<!-- =========================================================\n     REDES\n========================================================= -->\n\n<section class=\"or-social-info\" aria-label=\"Redes sociales y contacto de OR Music Live\">\n\n\n  <div class=\"or-social-info-inner\">\n\n\n    <div class=\"or-social-title\">\n\n      OR MUSIC LIVE \u00b7\n      REDES OFICIALES\n\n    <\/div>\n\n\n    <div class=\"or-social-subtitle\">\n\n      Canales oficiales de la marca \u00b7\n      activaci\u00f3n de enlaces pr\u00f3ximamente\n\n    <\/div>\n\n\n\n    <!-- INSTAGRAM -->\n\n    <div class=\"or-social-card instagram\">\n\n\n      <div class=\"or-social-logo\" aria-hidden=\"true\">\n\n\n        <svg viewBox=\"0 0 24 24\">\n\n\n          <rect x=\"3.5\" y=\"3.5\" width=\"17\" height=\"17\" rx=\"5\">\n          <\/rect>\n\n\n          <circle cx=\"12\" cy=\"12\" r=\"4.2\">\n          <\/circle>\n\n\n          <circle cx=\"17.2\" cy=\"6.8\" r=\"1.1\">\n          <\/circle>\n\n\n        <\/svg>\n\n\n      <\/div>\n\n\n      <div class=\"or-social-copy\">\n\n\n        <span>\n          Instagram\n        <\/span>\n\n\n        <strong>\n          @ormusiclive\n        <\/strong>\n\n\n      <\/div>\n\n\n    <\/div>\n\n\n\n    <!-- TIKTOK -->\n\n    <div class=\"or-social-card tiktok\">\n\n\n      <div class=\"or-social-logo\" aria-hidden=\"true\">\n\n\n        <svg class=\"or-tiktok-mark\" viewBox=\"0 0 24 24\">\n\n\n          <path class=\"tk-cyan\" transform=\"translate(-0.55 0.45)\" d=\"M12.525.02c1.31-.02 2.61-.01 3.91-.02.08 1.53.63 3.09 1.75 4.17 1.12 1.11 2.7 1.62 4.24 1.79v4.03c-1.44-.05-2.89-.35-4.2-.97-.57-.26-1.1-.59-1.62-.93-.01 2.92.01 5.84-.02 8.75-.08 1.4-.54 2.79-1.35 3.94-1.31 1.92-3.58 3.17-5.91 3.21-1.43.08-2.86-.31-4.08-1.03-2.02-1.19-3.44-3.37-3.65-5.72-.02-.5-.03-1-.01-1.49.18-1.9 1.12-3.72 2.58-4.96 1.66-1.44 3.98-2.13 6.15-1.72.02 1.48-.04 2.96-.04 4.44-.99-.32-2.15-.23-3.02.37-.63.41-1.11 1.03-1.36 1.74-.21.51-.15 1.07-.14 1.61.24 1.64 1.82 3.02 3.5 2.87 1.12-.01 2.19-.66 2.77-1.61.19-.33.4-.67.41-1.06.1-1.79.06-3.57.07-5.36.01-4.03-.01-8.05.02-12.07z\"><\/path>\n\n          <path class=\"tk-pink\" transform=\"translate(0.55 -0.35)\" d=\"M12.525.02c1.31-.02 2.61-.01 3.91-.02.08 1.53.63 3.09 1.75 4.17 1.12 1.11 2.7 1.62 4.24 1.79v4.03c-1.44-.05-2.89-.35-4.2-.97-.57-.26-1.1-.59-1.62-.93-.01 2.92.01 5.84-.02 8.75-.08 1.4-.54 2.79-1.35 3.94-1.31 1.92-3.58 3.17-5.91 3.21-1.43.08-2.86-.31-4.08-1.03-2.02-1.19-3.44-3.37-3.65-5.72-.02-.5-.03-1-.01-1.49.18-1.9 1.12-3.72 2.58-4.96 1.66-1.44 3.98-2.13 6.15-1.72.02 1.48-.04 2.96-.04 4.44-.99-.32-2.15-.23-3.02.37-.63.41-1.11 1.03-1.36 1.74-.21.51-.15 1.07-.14 1.61.24 1.64 1.82 3.02 3.5 2.87 1.12-.01 2.19-.66 2.77-1.61.19-.33.4-.67.41-1.06.1-1.79.06-3.57.07-5.36.01-4.03-.01-8.05.02-12.07z\"><\/path>\n\n          <path class=\"tk-white\" d=\"M12.525.02c1.31-.02 2.61-.01 3.91-.02.08 1.53.63 3.09 1.75 4.17 1.12 1.11 2.7 1.62 4.24 1.79v4.03c-1.44-.05-2.89-.35-4.2-.97-.57-.26-1.1-.59-1.62-.93-.01 2.92.01 5.84-.02 8.75-.08 1.4-.54 2.79-1.35 3.94-1.31 1.92-3.58 3.17-5.91 3.21-1.43.08-2.86-.31-4.08-1.03-2.02-1.19-3.44-3.37-3.65-5.72-.02-.5-.03-1-.01-1.49.18-1.9 1.12-3.72 2.58-4.96 1.66-1.44 3.98-2.13 6.15-1.72.02 1.48-.04 2.96-.04 4.44-.99-.32-2.15-.23-3.02.37-.63.41-1.11 1.03-1.36 1.74-.21.51-.15 1.07-.14 1.61.24 1.64 1.82 3.02 3.5 2.87 1.12-.01 2.19-.66 2.77-1.61.19-.33.4-.67.41-1.06.1-1.79.06-3.57.07-5.36.01-4.03-.01-8.05.02-12.07z\"><\/path>\n\n\n        <\/svg>\n\n\n      <\/div>\n\n\n      <div class=\"or-social-copy\">\n\n\n        <span>\n          TikTok\n        <\/span>\n\n\n        <strong>\n          @or.music.live\n        <\/strong>\n\n\n      <\/div>\n\n\n    <\/div>\n\n\n\n    <!-- GMAIL -->\n\n    <div class=\"or-social-card gmail\">\n\n\n      <div class=\"or-social-logo\" aria-hidden=\"true\">\n\n\n        <svg viewBox=\"0 0 24 24\">\n\n\n          <path d=\"M3.5 6.2 12 12.9 20.5 6.2\">\n          <\/path>\n\n\n          <path d=\"M4.2 18.8V7.4l3.8 3v8.4H4.2z\">\n          <\/path>\n\n\n          <path d=\"M19.8 18.8V7.4l-3.8 3v8.4h3.8z\">\n          <\/path>\n\n\n          <path d=\"M8 18.8v-8.4l4 3.2 4-3.2v8.4H8z\">\n          <\/path>\n\n\n        <\/svg>\n\n\n      <\/div>\n\n\n      <div class=\"or-social-copy\">\n\n\n        <span>\n          Gmail\n        <\/span>\n\n\n        <strong>\n          ormusiclive@gmail.com\n        <\/strong>\n\n\n      <\/div>\n\n\n    <\/div>\n\n\n  <\/div>\n\n\n<\/section>\n\n<div class=\"ormix-foot\">\n\n  OR MUSIC LIVE \u00b7\n  RADIO 24\/7 \u00b7\n  MIXES &amp; DJS \u00b7\n  ORMUSICLIVE.COM\n\n<\/div>\n\n\n<\/div>\n\n<\/div>\n\n\n\n<!-- =========================================================\n     AUDIO\n========================================================= -->\n\n<audio id=\"ormixAudio\" src=\"https:\/\/radio.ormusiclive.com\/listen\/ormusiclive-mixes\/radio.mp3\" preload=\"metadata\" playsinline=\"\">\n<\/audio>\n\n\n\n<script>\n\n\/* OR_MIXES_WEB_PROMO_ROTATION_V1 \u00b7 20260911 *\/\n\ndocument.addEventListener(\n\"DOMContentLoaded\",\nfunction(){\n\n\nconst STREAM =\n\"https:\/\/radio.ormusiclive.com\/listen\/ormusiclive-mixes\/radio.mp3\";\n\nconst VIDEO_STATUS_URL =\n\"https:\/\/video.ormusiclive.com:8888\/live\/index.m3u8\";\n\n\n\nconst audio =\ndocument.getElementById(\"ormixAudio\");\n\nconst player =\ndocument.getElementById(\"ormixPlayer\");\n\nconst play =\ndocument.getElementById(\"ormixPlay\");\n\nconst mute =\ndocument.getElementById(\"ormixMute\");\n\nconst reload =\ndocument.getElementById(\"ormixReload\");\n\nconst volume =\ndocument.getElementById(\"ormixVolume\");\n\nconst volumeText =\ndocument.getElementById(\"ormixVolumeText\");\n\nconst popup =\ndocument.getElementById(\"ormixPopup\");\n\nconst imageStatus =\ndocument.getElementById(\"ormixImageStatus\");\n\nconst orMixSignalBadge =\ndocument.getElementById(\"ormixSignalBadge\");\n\nconst orMixDjLiveBadge =\ndocument.getElementById(\"ormixDjLiveBadge\");\n\nconst tvCard =\ndocument.getElementById(\"ormixTvCard\");\n\nconst tvEyebrow =\ndocument.getElementById(\"ormixTvEyebrow\");\n\nconst tvLinkText =\ndocument.getElementById(\"ormixTvLinkText\");\n\n\naudio.volume = 0.85;\n\n\n\/* PLAY *\/\n\nplay.addEventListener(\n\"click\",\nasync function(){\n\n  if(audio.paused){\n\n    imageStatus.textContent =\n    \"CONECTANDO...\";\n\n    try{\n\n      await audio.play();\n\n    }\n    catch(error){\n\n      imageStatus.textContent =\n      \"PULSA RECARGAR\";\n\n    }\n\n  }\n  else{\n\n    audio.pause();\n\n  }\n\n}\n);\n\n\n\/* MUTE *\/\n\nmute.addEventListener(\n\"click\",\nfunction(){\n\n  audio.muted =\n  !audio.muted;\n\n  updateMute();\n\n}\n);\n\n\nfunction updateMute(){\n\n  if(\n    audio.muted ||\n    audio.volume === 0\n  ){\n\n    mute.textContent = \"\ud83d\udd07\";\n\n  }\n  else{\n\n    mute.textContent = \"\ud83d\udd0a\";\n\n  }\n\n}\n\n\n\/* VOLUMEN *\/\n\nvolume.addEventListener(\n\"input\",\nfunction(){\n\n  const value =\n  parseFloat(this.value);\n\n  audio.volume = value;\n\n  if(value > 0){\n\n    audio.muted = false;\n\n  }\n\n  volumeText.textContent =\n  Math.round(value * 100) + \"%\";\n\n  updateMute();\n\n}\n);\n\n\n\/* RECARGAR *\/\n\nreload.addEventListener(\n\"click\",\nasync function(){\n\n  const wasPlaying =\n  !audio.paused;\n\n  audio.pause();\n\n  imageStatus.textContent =\n  \"RECARGANDO...\";\n\n  audio.src =\n  STREAM +\n  \"?t=\" +\n  Date.now();\n\n  audio.load();\n\n\n  if(wasPlaying){\n\n    try{\n\n      await audio.play();\n\n    }\n    catch(error){}\n\n  }\n\n\n  setTimeout(\n  function(){\n\n    if(audio.paused){\n\n      imageStatus.textContent =\n      \"SE\u00d1AL DISPONIBLE\";\n\n    }\n\n  },\n  1000\n  );\n\n}\n);\n\n\n\/* ESTADOS *\/\n\naudio.addEventListener(\n\"playing\",\nfunction(){\n\n  player.classList.add(\n    \"is-playing\"\n  );\n\n  play.textContent =\n  \"\u275a\u275a PAUSAR MIXES\";\n\n  imageStatus.textContent =\n  \"REPRODUCIENDO\";\n\n}\n);\n\n\naudio.addEventListener(\n\"pause\",\nfunction(){\n\n  player.classList.remove(\n    \"is-playing\"\n  );\n\n  play.textContent =\n  \"\u25b6 ESCUCHAR MIXES\";\n\n  if(audio.currentTime > 0){\n\n    imageStatus.textContent =\n    \"SE\u00d1AL EN PAUSA\";\n\n  }\n\n}\n);\n\n\naudio.addEventListener(\n\"waiting\",\nfunction(){\n\n  imageStatus.textContent =\n  \"CONECTANDO...\";\n\n}\n);\n\n\naudio.addEventListener(\n\"canplay\",\nfunction(){\n\n  if(audio.paused){\n\n    imageStatus.textContent =\n    \"SE\u00d1AL DISPONIBLE\";\n\n  }\n\n}\n);\n\n\naudio.addEventListener(\n\"error\",\nfunction(){\n\n  player.classList.remove(\n    \"is-playing\"\n  );\n\n  play.textContent =\n  \"\u25b6 ESCUCHAR MIXES\";\n\n  imageStatus.textContent =\n  \"PULSA RECARGAR\";\n\n}\n);\n\n\n\/* VENTANA APARTE *\/\n\npopup.addEventListener(\n\"click\",\nfunction(){\n\n  audio.pause();\n\n\n  const win =\n  window.open(\n    STREAM,\n    \"ORMusicLiveMixes\"\n  );\n\n\n  if(!win){\n\n    alert(\n      \"Permite las ventanas emergentes para abrir la se\u00f1al.\"\n    );\n\n  }\n\n}\n);\n\n\n\n\/* =========================================================\n   PORTADA DIN\u00c1MICA DE DJ \u00b7 PANEL PRIVADO\n   AzuraCast identifica al DJ mediante el campo \u00c1lbum:\n   dj:identificador\n   Ejemplo: dj:alex_meneses\n========================================================= *\/\n\nconst OR_MIX_DEFAULT_IMAGE =\n\"https:\/\/ormusiclive.com\/wp-content\/uploads\/2026\/08\/Imagen-logo-or-con-dj.png\";\n\nconst OR_MIX_NOWPLAYING_URL =\n\"https:\/\/radio.ormusiclive.com\/api\/nowplaying\/ormusiclive-mixes\";\n\nconst OR_MIX_DJ_IMAGE_BASE =\n\"https:\/\/video.ormusiclive.com:9443\/dj-image\/\";\n\nconst OR_MIX_DJ_PROFILE_BASE =\n\"https:\/\/video.ormusiclive.com:9443\/dj-public\/\";\n\nconst OR_MIX_PROMO_URL = \"\";\n\nconst orMixPromoLayer =\ndocument.getElementById(\"orMixPromoLayer\");\n\nconst orMixPromoImage =\ndocument.getElementById(\"orMixPromoImage\");\n\nconst orMixPromoVideo =\ndocument.getElementById(\"orMixPromoVideo\");\n\nconst orMixDJProfile =\ndocument.getElementById(\"ormixDJProfile\");\n\nconst orMixDJProfileName =\ndocument.getElementById(\"ormixDJProfileName\");\n\nconst orMixDJProfileDescription =\ndocument.getElementById(\"ormixDJProfileDescription\");\n\nlet orMixCurrentProfileIdentifier = \"\";\n\nfunction orMixHideDJProfile(){\n  orMixCurrentProfileIdentifier = \"\";\n\n  if(orMixDJProfile){\n    orMixDJProfile.classList.remove(\"is-visible\");\n  }\n\n  if(orMixDJProfileName){\n    orMixDJProfileName.textContent = \"\";\n  }\n\n  if(orMixDJProfileDescription){\n    orMixDJProfileDescription.textContent = \"\";\n  }\n}\n\nasync function orMixLoadDJProfile(identifier){\n\n  if(\n    !identifier ||\n    !orMixDJProfile ||\n    !orMixDJProfileName ||\n    !orMixDJProfileDescription\n  ){\n    orMixHideDJProfile();\n    return;\n  }\n\n  if(orMixCurrentProfileIdentifier === identifier){\n    return;\n  }\n\n  try{\n    const response =\n      await fetch(\n        OR_MIX_DJ_PROFILE_BASE +\n        encodeURIComponent(identifier) +\n        \"?t=\" +\n        Date.now(),\n        { cache:\"no-store\" }\n      );\n\n    if(!response.ok){\n      throw new Error(\"Perfil no disponible\");\n    }\n\n    const profile = await response.json();\n\n    const name =\n      profile && profile.name\n      ? String(profile.name).trim()\n      : \"\";\n\n    const description =\n      profile && profile.description\n      ? String(profile.description).trim()\n      : \"\";\n\n    \/*\n      Regla acordada:\n      si NO hay descripci\u00f3n, no mostramos ninguna ficha\n      ni dejamos espacio vac\u00edo.\n    *\/\n    if(!description){\n      orMixHideDJProfile();\n      return;\n    }\n\n    orMixCurrentProfileIdentifier = identifier;\n\n    orMixDJProfileName.textContent =\n      name || \"DJ\";\n\n    orMixDJProfileDescription.textContent =\n      description;\n\n    orMixDJProfile.classList.add(\"is-visible\");\n\n  }catch(error){\n    orMixHideDJProfile();\n  }\n}\n\n\nconst orMixMainImage =\ndocument.getElementById(\"ormixMainImage\");\n\nlet orMixCurrentIdentifier = \"\";\n\nfunction orMixShowDefaultImage(){\n\n  if(\n    typeof orMixStopDJMediaRotation\n    === \"function\"\n  ){\n    orMixStopDJMediaRotation();\n  }\n  if(!orMixMainImage) return;\n\n  orMixCurrentIdentifier = \"\";\n  orMixHideDJProfile();\n  orMixMainImage.onerror = null;\n  orMixMainImage.classList.remove(\"is-dj-art\");\n  orMixMainImage.src = OR_MIX_DEFAULT_IMAGE;\n}\n\nfunction orMixShowDJImage(identifier){\n  if(!orMixMainImage || !identifier){\n    orMixShowDefaultImage();\n    return;\n  }\n\n  if(orMixCurrentIdentifier === identifier){\n    return;\n  }\n\n  orMixCurrentIdentifier = identifier;\n\n  orMixMainImage.classList.add(\"is-dj-art\");\n\n  orMixMainImage.onerror = function(){\n    orMixShowDefaultImage();\n  };\n\n  orMixMainImage.src =\n    OR_MIX_DJ_IMAGE_BASE +\n    encodeURIComponent(identifier) +\n    \"?t=\" +\n    Date.now();\n}\n\n\n\/* =========================================================\n   OR MIXES DJ LOGO VIDEO ROTATION V2 \u00b7 20260829\n\n   SET GRABADO DEL DJ:\n   LOGO -> VIDEO -> LOGO -> VIDEO\n========================================================= *\/\n\nvar orMixDJMediaTimer = null;\nvar orMixDJMediaToken = 0;\nvar orMixDJMediaRequestToken = 0;\nvar orMixDJMediaIdentifier = \"\";\nvar orMixDJMediaVideoUrl = \"\";\nvar orMixDJMediaVideo = null;\nvar orMixDJMediaCache = {};\nvar orMixDJMediaMode = \"\";\n\n\nfunction orMixEnsureDJMediaVideo(){\n\n  if(orMixDJMediaVideo){\n    return orMixDJMediaVideo;\n  }\n\n  if(!orMixMainImage){\n    return null;\n  }\n\n  const parent =\n    orMixMainImage.parentElement;\n\n  if(!parent){\n    return null;\n  }\n\n  if(\n    window.getComputedStyle(parent).position\n    === \"static\"\n  ){\n    parent.style.position =\n      \"relative\";\n  }\n\n  const video =\n    document.createElement(\"video\");\n\n  video.id =\n    \"orMixDJMediaVideo\";\n\n  video.muted = true;\n  video.defaultMuted = true;\n  video.autoplay = true;\n  video.playsInline = true;\n  video.controls = false;\n  video.preload = \"metadata\";\n\n  video.setAttribute(\n    \"muted\",\n    \"\"\n  );\n\n  video.setAttribute(\n    \"playsinline\",\n    \"\"\n  );\n\n  video.style.position =\n    \"absolute\";\n\n  video.style.inset =\n    \"0\";\n\n  video.style.width =\n    \"100%\";\n\n  video.style.height =\n    \"100%\";\n\n  video.style.objectFit =\n    \"contain\";\n\n  video.style.background =\n    \"transparent\";\n\n  video.style.display =\n    \"none\";\n\n  video.style.zIndex =\n    \"4\";\n\n  video.style.pointerEvents =\n    \"none\";\n\n  parent.appendChild(\n    video\n  );\n\n  orMixDJMediaVideo =\n    video;\n\n  return video;\n}\n\n\nfunction orMixStopDJMediaRotation(){\n\n  orMixDJMediaToken += 1;\n  orMixDJMediaRequestToken += 1;\n\n  if(orMixDJMediaTimer){\n\n    clearTimeout(\n      orMixDJMediaTimer\n    );\n\n    orMixDJMediaTimer =\n      null;\n  }\n\n  if(orMixDJMediaVideo){\n\n    try{\n      orMixDJMediaVideo.pause();\n    }catch(error){\n    }\n\n    orMixDJMediaVideo.onended =\n      null;\n\n    orMixDJMediaVideo.onerror =\n      null;\n\n    orMixDJMediaVideo.style.display =\n      \"none\";\n\n    orMixDJMediaVideo.removeAttribute(\n      \"src\"\n    );\n\n    try{\n      orMixDJMediaVideo.load();\n    }catch(error){\n    }\n  }\n\n  if(orMixMainImage){\n\n    orMixMainImage.style.visibility =\n      \"\";\n  }\n\n  orMixDJMediaIdentifier =\n    \"\";\n\n  orMixDJMediaVideoUrl =\n    \"\";\n\n  orMixDJMediaMode =\n    \"\";\n}\n\n\nfunction orMixScheduleDJVideo(\n  identifier,\n  videoUrl,\n  token\n){\n\n  if(\n    token !== orMixDJMediaToken ||\n    identifier !== orMixDJMediaIdentifier\n  ){\n    return;\n  }\n\n  orMixDJMediaTimer =\n    setTimeout(\n      function(){\n\n        orMixPlayDJVideo(\n          identifier,\n          videoUrl,\n          token\n        );\n\n      },\n      12000\n    );\n}\n\n\nfunction orMixShowDJLogoPhase(\n  identifier,\n  videoUrl,\n  token\n){\n\n  if(\n    token !== orMixDJMediaToken ||\n    identifier !== orMixDJMediaIdentifier\n  ){\n    return;\n  }\n\n  const video =\n    orMixEnsureDJMediaVideo();\n\n  if(video){\n\n    try{\n      video.pause();\n    }catch(error){\n    }\n\n    video.style.display =\n      \"none\";\n  }\n\n  if(orMixMainImage){\n\n    orMixMainImage.style.visibility =\n      \"\";\n\n    orMixShowDJImage(\n      identifier\n    );\n  }\n\n  orMixScheduleDJVideo(\n    identifier,\n    videoUrl,\n    token\n  );\n}\n\n\nfunction orMixPlayDJVideo(\n  identifier,\n  videoUrl,\n  token\n){\n\n  if(\n    token !== orMixDJMediaToken ||\n    identifier !== orMixDJMediaIdentifier\n  ){\n    return;\n  }\n\n  const video =\n    orMixEnsureDJMediaVideo();\n\n  if(\n    !video ||\n    !orMixMainImage\n  ){\n    return;\n  }\n\n  video.onended =\n    function(){\n\n      if(\n        token !== orMixDJMediaToken ||\n        identifier !== orMixDJMediaIdentifier\n      ){\n        return;\n      }\n\n      orMixShowDJLogoPhase(\n        identifier,\n        videoUrl,\n        token\n      );\n    };\n\n\n  video.onerror =\n    function(){\n\n      if(\n        token !== orMixDJMediaToken\n      ){\n        return;\n      }\n\n      orMixStopDJMediaRotation();\n\n      orMixShowDJImage(\n        identifier\n      );\n    };\n\n\n  video.src =\n    videoUrl\n    + (\n        videoUrl.includes(\"?\")\n        ? \"&\"\n        : \"?\"\n      )\n    + \"t=\"\n    + Date.now();\n\n  video.style.display =\n    \"block\";\n\n  orMixMainImage.style.visibility =\n    \"hidden\";\n\n  try{\n    video.currentTime = 0;\n  }catch(error){\n  }\n\n  const playPromise =\n    video.play();\n\n  if(\n    playPromise &&\n    typeof playPromise.catch === \"function\"\n  ){\n\n    playPromise.catch(\n      function(){\n\n        if(\n          token !== orMixDJMediaToken\n        ){\n          return;\n        }\n\n        orMixStopDJMediaRotation();\n\n        orMixShowDJImage(\n          identifier\n        );\n      }\n    );\n  }\n}\n\n\nfunction orMixStartDJMediaRotation(\n  identifier,\n  videoUrl\n){\n\n  identifier =\n    String(\n      identifier || \"\"\n    )\n    .trim()\n    .toLowerCase();\n\n  videoUrl =\n    String(\n      videoUrl || \"\"\n    )\n    .trim();\n\n  if(\n    !identifier ||\n    !videoUrl\n  ){\n\n    orMixStopDJMediaRotation();\n\n    return;\n  }\n\n  \/*\n    NowPlaying consulta peri\u00f3dicamente.\n    Si ya estamos mostrando este mismo DJ,\n    no reiniciamos el ciclo.\n  *\/\n  if(\n    orMixDJMediaIdentifier === identifier &&\n    orMixDJMediaVideoUrl === videoUrl\n  ){\n    return;\n  }\n\n  orMixStopDJMediaRotation();\n\n  orMixDJMediaIdentifier =\n    identifier;\n\n  orMixDJMediaVideoUrl =\n    videoUrl;\n\n  const token =\n    orMixDJMediaToken;\n\n  orMixShowDJLogoPhase(\n    identifier,\n    videoUrl,\n    token\n  );\n}\n\n\n\nfunction orMixShowDJLogoOnly(\n  identifier\n){\n\n  identifier =\n    String(identifier || \"\")\n    .trim()\n    .toLowerCase();\n\n  if(\n    orMixDJMediaMode === \"images\" &&\n    orMixDJMediaIdentifier === identifier\n  ){\n    return;\n  }\n\n  orMixStopDJMediaRotation();\n\n  orMixDJMediaIdentifier =\n    identifier;\n\n  orMixDJMediaMode =\n    \"images\";\n\n  if(orMixMainImage){\n\n    orMixMainImage.style.visibility =\n      \"\";\n\n    orMixShowDJImage(\n      identifier\n    );\n  }\n}\n\n\nfunction orMixStartDJVideoOnly(\n  identifier,\n  videoUrl\n){\n\n  identifier =\n    String(identifier || \"\")\n    .trim()\n    .toLowerCase();\n\n  videoUrl =\n    String(videoUrl || \"\")\n    .trim();\n\n  if(!identifier || !videoUrl){\n\n    orMixShowDJLogoOnly(\n      identifier\n    );\n\n    return;\n  }\n\n  if(\n    orMixDJMediaMode === \"video\" &&\n    orMixDJMediaIdentifier === identifier &&\n    orMixDJMediaVideoUrl === videoUrl &&\n    orMixDJMediaVideo &&\n    !orMixDJMediaVideo.paused\n  ){\n    return;\n  }\n\n  orMixStopDJMediaRotation();\n\n  orMixDJMediaIdentifier =\n    identifier;\n\n  orMixDJMediaVideoUrl =\n    videoUrl;\n\n  orMixDJMediaMode =\n    \"video\";\n\n  const token =\n    orMixDJMediaToken;\n\n  const video =\n    orMixEnsureDJMediaVideo();\n\n  if(!video || !orMixMainImage){\n\n    orMixShowDJLogoOnly(\n      identifier\n    );\n\n    return;\n  }\n\n  video.loop = true;\n  video.onended = null;\n\n  video.onerror =\n    function(){\n\n      if(token !== orMixDJMediaToken){\n        return;\n      }\n\n      orMixShowDJLogoOnly(\n        identifier\n      );\n    };\n\n  video.src =\n    videoUrl\n    + (\n        videoUrl.includes(\"?\")\n        ? \"&\"\n        : \"?\"\n      )\n    + \"t=\"\n    + Date.now();\n\n  video.style.display =\n    \"block\";\n\n  orMixMainImage.style.visibility =\n    \"hidden\";\n\n  try{\n    video.currentTime = 0;\n  }catch(error){\n  }\n\n  const playPromise =\n    video.play();\n\n  if(\n    playPromise &&\n    typeof playPromise.catch === \"function\"\n  ){\n\n    playPromise.catch(\n      function(){\n\n        if(token !== orMixDJMediaToken){\n          return;\n        }\n\n        orMixShowDJLogoOnly(\n          identifier\n        );\n      }\n    );\n  }\n}\n\n\nfunction orMixStartDJAlternate(\n  identifier,\n  videoUrl\n){\n\n  identifier =\n    String(identifier || \"\")\n    .trim()\n    .toLowerCase();\n\n  videoUrl =\n    String(videoUrl || \"\")\n    .trim();\n\n  if(!identifier || !videoUrl){\n\n    orMixShowDJLogoOnly(\n      identifier\n    );\n\n    return;\n  }\n\n  if(\n    orMixDJMediaMode === \"alternate\" &&\n    orMixDJMediaIdentifier === identifier &&\n    orMixDJMediaVideoUrl === videoUrl\n  ){\n    return;\n  }\n\n  orMixStopDJMediaRotation();\n\n  if(orMixDJMediaVideo){\n    orMixDJMediaVideo.loop = false;\n  }\n\n  orMixStartDJMediaRotation(\n    identifier,\n    videoUrl\n  );\n\n  orMixDJMediaMode =\n    \"alternate\";\n}\n\n\nasync function orMixLoadRecordedDJMedia(\n  identifier\n){\n\n  \/*\n   Si Multimedia V2 manda sobre Mixes,\n   no reproducimos multimedia antigua\n   del perfil DJ por debajo.\n  *\/\n  if(window.OR_MIX_V2_ACTIVE === true){\n\n    if(\n      typeof orMixStopDJMediaRotation\n      === \"function\"\n    ){\n      orMixStopDJMediaRotation();\n    }\n\n    return;\n  }\n\n\n\n  identifier =\n    String(\n      identifier || \"\"\n    )\n    .trim()\n    .toLowerCase();\n\n  if(!identifier){\n\n    orMixStopDJMediaRotation();\n\n    return;\n  }\n\n  \/*\n    Si cambi\u00f3 el DJ, detenemos inmediatamente\n    cualquier video del DJ anterior.\n  *\/\n  if(\n    orMixDJMediaIdentifier &&\n    orMixDJMediaIdentifier !== identifier\n  ){\n    orMixStopDJMediaRotation();\n  }\n\n  \/*\n    Si ya conocemos este perfil en esta carga\n    de p\u00e1gina, no consultamos nuevamente.\n  *\/\n  if(\n    false &&\n    Object.prototype.hasOwnProperty.call(\n      orMixDJMediaCache,\n      identifier\n    )\n  ){\n\n    const cachedUrl =\n      orMixDJMediaCache[\n        identifier\n      ];\n\n    if(cachedUrl){\n\n      orMixStartDJMediaRotation(\n        identifier,\n        cachedUrl\n      );\n\n    }else{\n\n      orMixStopDJMediaRotation();\n\n      orMixShowDJImage(\n        identifier\n      );\n    }\n\n    return;\n  }\n\n  const requestToken =\n    ++orMixDJMediaRequestToken;\n\n  try{\n\n    const response =\n      await fetch(\n        \"https:\/\/video.ormusiclive.com:9443\/dj-public\/\"\n        + encodeURIComponent(identifier)\n        + \"?t=\"\n        + Date.now(),\n        {\n          cache:\"no-store\"\n        }\n      );\n\n    if(\n      requestToken !==\n      orMixDJMediaRequestToken\n    ){\n      return;\n    }\n\n    if(!response.ok){\n\n      orMixDJMediaCache[\n        identifier\n      ] = \"\";\n\n      orMixStopDJMediaRotation();\n\n      orMixShowDJImage(\n        identifier\n      );\n\n      return;\n    }\n\n    const profile =\n      await response.json();\n\n    if(\n      requestToken !==\n      orMixDJMediaRequestToken\n    ){\n      return;\n    }\n\n    const videoUrl =\n      (\n        profile &&\n        profile.has_video === true &&\n        profile.video_url\n      )\n      ? String(\n          profile.video_url\n        ).trim()\n      : \"\";\n\n    const mediaMode =\n      String(\n        (\n          profile &&\n          profile.media_mode\n        )\n        || \"images\"\n      )\n      .trim()\n      .toLowerCase();\n\n    if(mediaMode === \"images\"){\n\n      orMixShowDJLogoOnly(\n        identifier\n      );\n\n    }else if(\n      mediaMode === \"video\" &&\n      videoUrl\n    ){\n\n      orMixStartDJVideoOnly(\n        identifier,\n        videoUrl\n      );\n\n    }else if(\n      mediaMode === \"alternate\" &&\n      videoUrl\n    ){\n\n      orMixStartDJAlternate(\n        identifier,\n        videoUrl\n      );\n\n    }else{\n\n      orMixShowDJLogoOnly(\n        identifier\n      );\n    }\n\n  }\n  catch(error){\n\n    if(\n      requestToken !==\n      orMixDJMediaRequestToken\n    ){\n      return;\n    }\n\n    orMixStopDJMediaRotation();\n\n    orMixShowDJImage(\n      identifier\n    );\n  }\n}\n\n\n\n\/* =========================================================\n   PROMOCI\u00d3N \/ ROTACI\u00d3N MIXES \u00b7 WEB\n   API del panel:\n   \/api\/mixes-rotation-public\n\n   Prioridad:\n   1) DJ EN VIVO\n   2) PROMOCI\u00d3N seleccionada en el panel\n   3) MIXES normal \/ multimedia del DJ grabado\n========================================================= *\/\n\nlet orMixPromoTimer = null;\nlet orMixPromoItems = [];\nlet orMixPromoIndex = 0;\nlet orMixPromoSignature = \"\";\nlet orMixPromoRunToken = \"\";\nlet orMixPromoPlayMode = \"loop\";\nlet orMixPromoImageSeconds = 10;\nlet orMixPromoRunning = false;\nlet orMixPromoOnceFinishedToken = \"\";\n\n\nfunction orMixPromoVersionedUrl(url){\n\n  url = String(url || \"\").trim();\n\n  if(!url){\n    return \"\";\n  }\n\n  const separator =\n    url.includes(\"?\")\n    ? \"&\"\n    : \"?\";\n\n  return (\n    url +\n    separator +\n    \"v=\" +\n    encodeURIComponent(\n      orMixPromoRunToken || Date.now()\n    )\n  );\n}\n\n\nfunction orMixClearPromoTimer(){\n\n  if(orMixPromoTimer){\n\n    clearTimeout(\n      orMixPromoTimer\n    );\n\n    orMixPromoTimer = null;\n  }\n}\n\n\nfunction orMixHidePromoVisual(){\n\n  orMixClearPromoTimer();\n\n  if(orMixPromoVideo){\n\n    orMixPromoVideo.onended = null;\n    orMixPromoVideo.onerror = null;\n\n    try{\n      orMixPromoVideo.pause();\n    }catch(error){}\n\n    orMixPromoVideo.classList.remove(\n      \"is-active\"\n    );\n\n    orMixPromoVideo.removeAttribute(\n      \"src\"\n    );\n\n    try{\n      orMixPromoVideo.load();\n    }catch(error){}\n  }\n\n  if(orMixPromoImage){\n\n    orMixPromoImage.onload = null;\n    orMixPromoImage.onerror = null;\n\n    orMixPromoImage.classList.remove(\n      \"is-active\"\n    );\n\n    orMixPromoImage.removeAttribute(\n      \"src\"\n    );\n  }\n\n  if(orMixPromoLayer){\n\n    orMixPromoLayer.classList.remove(\n      \"is-active\"\n    );\n\n    orMixPromoLayer.setAttribute(\n      \"aria-hidden\",\n      \"true\"\n    );\n  }\n}\n\n\nfunction orMixStopPromoRotation(resetRun){\n\n  orMixHidePromoVisual();\n\n  orMixPromoRunning = false;\n  orMixPromoItems = [];\n  orMixPromoIndex = 0;\n  orMixPromoSignature = \"\";\n\n  if(resetRun){\n    orMixPromoRunToken = \"\";\n  }\n}\n\n\nfunction orMixPromoFinishOnce(){\n\n  orMixPromoOnceFinishedToken =\n    orMixPromoRunToken;\n\n  orMixStopPromoRotation(false);\n\n  \/*\n    Al terminar UNA SOLA VEZ,\n    vuelve inmediatamente a la pantalla normal.\n  *\/\n  orMixShowDefaultImage();\n}\n\n\nfunction orMixPromoNext(){\n\n  if(!orMixPromoRunning){\n    return;\n  }\n\n  orMixPromoIndex += 1;\n\n  if(\n    orMixPromoIndex >=\n    orMixPromoItems.length\n  ){\n\n    if(\n      orMixPromoPlayMode ===\n      \"once\"\n    ){\n\n      orMixPromoFinishOnce();\n\n      return;\n    }\n\n    orMixPromoIndex = 0;\n  }\n\n  orMixShowPromoItem();\n}\n\n\nfunction orMixShowPromoItem(){\n\n  if(\n    !orMixPromoRunning ||\n    !orMixPromoLayer ||\n    !orMixPromoImage ||\n    !orMixPromoVideo ||\n    !orMixPromoItems.length\n  ){\n    return;\n  }\n\n  const item =\n    orMixPromoItems[\n      orMixPromoIndex\n    ];\n\n  if(!item){\n    orMixPromoNext();\n    return;\n  }\n\n  const type =\n    String(\n      item.type || \"\"\n    )\n    .trim()\n    .toLowerCase();\n\n  const url =\n    orMixPromoVersionedUrl(\n      item.media_url\n    );\n\n  if(!url){\n    orMixPromoNext();\n    return;\n  }\n\n  orMixClearPromoTimer();\n\n  orMixPromoImage.onload = null;\n  orMixPromoImage.onerror = null;\n  orMixPromoVideo.onended = null;\n  orMixPromoVideo.onerror = null;\n\n  try{\n    orMixPromoVideo.pause();\n  }catch(error){}\n\n  orMixPromoImage.classList.remove(\n    \"is-active\"\n  );\n\n  orMixPromoVideo.classList.remove(\n    \"is-active\"\n  );\n\n  orMixPromoLayer.classList.add(\n    \"is-active\"\n  );\n\n  orMixPromoLayer.setAttribute(\n    \"aria-hidden\",\n    \"false\"\n  );\n\n\n  if(type === \"image\"){\n\n    orMixPromoImage.onload =\n      function(){\n\n        if(!orMixPromoRunning){\n          return;\n        }\n\n        orMixPromoImage.classList.add(\n          \"is-active\"\n        );\n\n        orMixPromoTimer =\n          setTimeout(\n            orMixPromoNext,\n            orMixPromoImageSeconds * 1000\n          );\n      };\n\n    orMixPromoImage.onerror =\n      function(){\n\n        if(!orMixPromoRunning){\n          return;\n        }\n\n        orMixPromoTimer =\n          setTimeout(\n            orMixPromoNext,\n            800\n          );\n      };\n\n    orMixPromoImage.src = url;\n\n    return;\n  }\n\n\n  if(type === \"video\"){\n\n    orMixPromoVideo.muted = true;\n    orMixPromoVideo.defaultMuted = true;\n    orMixPromoVideo.playsInline = true;\n    orMixPromoVideo.controls = false;\n    orMixPromoVideo.loop = false;\n\n    orMixPromoVideo.onended =\n      function(){\n\n        if(!orMixPromoRunning){\n          return;\n        }\n\n        orMixPromoNext();\n      };\n\n    orMixPromoVideo.onerror =\n      function(){\n\n        if(!orMixPromoRunning){\n          return;\n        }\n\n        orMixPromoTimer =\n          setTimeout(\n            orMixPromoNext,\n            800\n          );\n      };\n\n    orMixPromoVideo.src = url;\n\n    orMixPromoVideo.classList.add(\n      \"is-active\"\n    );\n\n    try{\n      orMixPromoVideo.currentTime = 0;\n    }catch(error){}\n\n    const playPromise =\n      orMixPromoVideo.play();\n\n    if(\n      playPromise &&\n      typeof playPromise.catch ===\n      \"function\"\n    ){\n\n      playPromise.catch(\n        function(){\n\n          if(!orMixPromoRunning){\n            return;\n          }\n\n          orMixPromoTimer =\n            setTimeout(\n              orMixPromoNext,\n              800\n            );\n        }\n      );\n    }\n\n    return;\n  }\n\n\n  orMixPromoTimer =\n    setTimeout(\n      orMixPromoNext,\n      500\n    );\n}\n\n\nfunction orMixStartPromoRotation(data){\n\n  const items =\n    data &&\n    Array.isArray(data.items)\n    ? data.items.filter(\n        function(item){\n\n          return (\n            item &&\n            (\n              item.type === \"image\" ||\n              item.type === \"video\"\n            ) &&\n            item.media_url\n          );\n        }\n      )\n    : [];\n\n  if(!items.length){\n    orMixStopPromoRotation(true);\n    return false;\n  }\n\n  const runToken =\n    String(\n      data.run_token || \"\"\n    ).trim();\n\n  const playMode =\n    String(\n      data.play_mode || \"loop\"\n    )\n    .trim()\n    .toLowerCase() === \"once\"\n    ? \"once\"\n    : \"loop\";\n\n  const imageSeconds =\n    Math.max(\n      3,\n      Math.min(\n        60,\n        parseInt(\n          data.image_seconds || 10,\n          10\n        ) || 10\n      )\n    );\n\n  const signature =\n    [\n      runToken,\n      playMode,\n      imageSeconds,\n      items.map(\n        function(item){\n          return (\n            item.slot +\n            \"|\" +\n            item.type +\n            \"|\" +\n            item.media_url\n          );\n        }\n      ).join(\"||\")\n    ].join(\"::\");\n\n  \/*\n    UNA SOLA VEZ ya termin\u00f3 para esta activaci\u00f3n:\n    no vuelve a empezar hasta un nuevo run_token.\n  *\/\n  if(\n    playMode === \"once\" &&\n    runToken &&\n    orMixPromoOnceFinishedToken ===\n    runToken\n  ){\n    orMixStopPromoRotation(false);\n    return false;\n  }\n\n  \/*\n    Si ya corre exactamente esta selecci\u00f3n,\n    no reiniciamos el video ni la imagen.\n  *\/\n  if(\n    orMixPromoRunning &&\n    orMixPromoSignature ===\n    signature\n  ){\n    orMixHideDJProfile();\n    return true;\n  }\n\n  orMixHidePromoVisual();\n\n  \/*\n    La promoci\u00f3n reemplaza la multimedia\n    de un set grabado, pero NO la se\u00f1al de audio.\n  *\/\n  orMixStopDJMediaRotation();\n  orMixHideDJProfile();\n\n  orMixPromoItems = items;\n  orMixPromoIndex = 0;\n  orMixPromoRunToken = runToken;\n  orMixPromoPlayMode = playMode;\n  orMixPromoImageSeconds =\n    imageSeconds;\n  orMixPromoSignature = signature;\n  orMixPromoRunning = true;\n\n  if(\n    runToken &&\n    orMixPromoOnceFinishedToken &&\n    orMixPromoOnceFinishedToken !==\n    runToken\n  ){\n    orMixPromoOnceFinishedToken = \"\";\n  }\n\n  orMixShowPromoItem();\n\n  return true;\n}\n\n\nasync function orMixRefreshPromo(signal){\n\/*\n     Gesti\u00f3n Multimedia V2 controla\n     ahora la pantalla promocional.\n    *\/\n    return false;\n}\n\n\nlet orMixLiveMisses = 0;\n\nfunction orMixSetDjLiveState(isLive, streamerName){\n  if(!orMixDjLiveBadge || !orMixSignalBadge) return;\n\n  const liveText =\n    orMixDjLiveBadge.querySelector(\"b\");\n\n  if(isLive){\n\n    orMixLiveMisses = 0;\n\n    const cleanName =\n      streamerName &&\n      String(streamerName).trim()\n      ? String(streamerName).trim()\n      : \"DJ\";\n\n    if(liveText){\n      liveText.textContent =\n        cleanName + \" \u00b7 EN VIVO\";\n    }\n\n    orMixDjLiveBadge.classList.add(\"is-live\");\n    orMixSignalBadge.classList.add(\"is-hidden-by-dj-live\");\n\n    return;\n  }\n\n  \/* Evita parpadeos por microcortes o una respuesta tard\u00eda. *\/\n  orMixLiveMisses += 1;\n\n  if(orMixLiveMisses >= 2){\n\n    orMixDjLiveBadge.classList.remove(\"is-live\");\n    orMixSignalBadge.classList.remove(\"is-hidden-by-dj-live\");\n\n    if(liveText){\n      liveText.textContent = \"DJ EN VIVO\";\n    }\n  }\n}\n\nlet orMixDJImageUpdating = false;\n\nasync function orMixUpdateDJImage(){\n  if(orMixDJImageUpdating) return;\n  orMixDJImageUpdating = true;\n\n  \/\/ Una consulta a la vez; una conexi\u00f3n lenta no acumula peticiones.\n  const requestController = new AbortController();\n  const requestTimer = setTimeout(function(){\n    requestController.abort();\n  }, 12000);\n\n  try{\n    const response =\n      await fetch(\n        OR_MIX_NOWPLAYING_URL +\n        \"?t=\" + Date.now(),\n        { cache:\"no-store\", signal:requestController.signal }\n      );\n\n    if(!response.ok){\n      throw new Error(\"Now Playing no disponible\");\n    }\n\n    const data = await response.json();\n\n    const liveObj =\n      data && data.live\n      ? data.live\n      : {};\n\n    const nowObj =\n      data && data.now_playing\n      ? data.now_playing\n      : {};\n\n    \/*\n      La \u00fanica fuente autoritativa para saber si existe una conexi\u00f3n\n      realmente EN VIVO es data.live.is_live de AzuraCast.\n      No usamos now_playing.streamer para decidir el estado porque ese\n      valor puede permanecer unos segundos\/minutos despu\u00e9s de desconectar.\n    *\/\n    const isDjLive = Boolean(\n      liveObj.is_live === true ||\n      liveObj.is_live === 1\n    );\n\n    const liveStreamerName =\n      liveObj.streamer_name ||\n      \"\";\n\n    orMixSetDjLiveState(\n      isDjLive,\n      liveStreamerName\n    );\n\n    \/*\n      Cuando entra una transmisi\u00f3n EN VIVO mantenemos el mismo banco\n      de publicidad \/ rotaci\u00f3n de Mixes. El nombre del perfil seleccionado\n      sigue teniendo prioridad como identificaci\u00f3n del vivo.\n    *\/\n    if(isDjLive){\n\n      \/*\n        AzuraCast confirma que realmente hay transmisi\u00f3n EN VIVO.\n        El panel privado decide qu\u00e9 perfil debemos identificar.\n      *\/\n\n      let selectedIdentifier = \"\";\n      let selectedName = \"\";\n\n      try{\n\n        const selectedResponse =\n          await fetch(\n            \"https:\/\/video.ormusiclive.com:9443\/api\/mixes-current-dj\" +\n            \"?t=\" +\n            Date.now(),\n            {\n              cache:\"no-store\",\n              signal:requestController.signal\n            }\n          );\n\n        if(selectedResponse.ok){\n\n          const selectedData =\n            await selectedResponse.json();\n\n          selectedIdentifier =\n            selectedData &&\n            selectedData.identifier\n            ? String(\n                selectedData.identifier\n              ).trim().toLowerCase()\n            : \"\";\n\n          selectedName =\n            selectedData &&\n            selectedData.name\n            ? String(\n                selectedData.name\n              ).trim()\n            : \"\";\n\n        }\n\n      }catch(error){}\n\n\n      \/*\n        Nombre seleccionado en el panel.\n        Si no existe selecci\u00f3n, usamos el nombre\n        que entrega AzuraCast.\n      *\/\n\n      \/*\n        El nombre visible del EN VIVO viene del perfil seleccionado\n        manualmente en el panel. Nunca mostramos el nombre t\u00e9cnico\n        de la cuenta de conexi\u00f3n (por ejemplo RAM.ORMUSIC).\n      *\/\n      orMixSetDjLiveState(\n        true,\n        selectedName ||\n        \"OR MUSIC LIVE\"\n      );\n\n\n      \/*\n        Durante el EN VIVO intentamos primero mostrar la MISMA publicidad\n        seleccionada en el gestor de Mixes. El badge con el nombre del perfil\n        permanece visible por encima de la rotaci\u00f3n.\n      *\/\n      const livePromoActive =\n        await orMixRefreshPromo(\n          requestController.signal\n        );\n\n      if(livePromoActive){\n        return;\n      }\n\n      \/*\n        Si la publicidad est\u00e1 detenida, usamos la identificaci\u00f3n visual\n        del perfil EN VIVO como respaldo.\n      *\/\n      if(selectedIdentifier){\n\n        orMixShowDJImage(\n          selectedIdentifier\n        );\n\n        orMixLoadDJProfile(\n          selectedIdentifier\n        );\n        orMixLoadRecordedDJMedia(selectedIdentifier);\n\n      }else{\n\n        orMixStopDJMediaRotation();\n        orMixShowDefaultImage();\n\n      }\n\n      return;\n    }\n\n    \/*\n      Sin DJ EN VIVO, la promoci\u00f3n WEB del panel\n      tiene prioridad sobre la multimedia normal de Mixes.\n    *\/\n    const promoActive =\n      await orMixRefreshPromo(\n        requestController.signal\n      );\n\n    if(promoActive){\n      return;\n    }\n\n    \/* OR_MIXES_AUTO_DJ_PANEL_20260903\n      Sin DJ en vivo, el panel identifica el set que suena mediante\n      dj:identificador. No usamos el \u00c1lbum ni la duraci\u00f3n de la API\n      p\u00fablica, porque pueden estar vac\u00edos o desactualizados.\n    *\/\n    const currentResponse = await fetch(\n      \"https:\/\/video.ormusiclive.com:9443\/api\/mixes-current-dj\" +\n      \"?t=\" + Date.now(),\n      { cache:\"no-store\", signal:requestController.signal }\n    );\n\n    if(!currentResponse.ok){\n      throw new Error(\"DJ autom\u00e1tico no disponible\");\n    }\n\n    const currentDJ = await currentResponse.json();\n    const identifier =\n      currentDJ && typeof currentDJ.identifier === \"string\"\n      ? currentDJ.identifier.trim().toLowerCase()\n      : \"\";\n\n    if(identifier){\n      orMixShowDJImage(identifier);\n      orMixLoadDJProfile(identifier);\n      orMixLoadRecordedDJMedia(identifier);\n      return;\n    }\n\n    orMixShowDefaultImage();\n\n  }catch(error){\n    orMixSetDjLiveState(false, \"\");\n    orMixShowDefaultImage();\n  }finally{\n    clearTimeout(requestTimer);\n    orMixDJImageUpdating = false;\n  }\n}\n\norMixUpdateDJImage();\n\nsetInterval(\n  orMixUpdateDJImage,\n  5000\n);\n\n\n\/* =========================================================\n   OR MUSIC LIVE TV \u00b7 DETECTOR DE SE\u00d1AL\n========================================================= *\/\n\nfunction setTvState(active){\n\n  if(\n    !tvCard ||\n    !tvEyebrow ||\n    !tvLinkText\n  ){\n    return;\n  }\n\n\n  if(active){\n\n    tvCard.classList.add(\n      \"is-on-air\"\n    );\n\n    tvEyebrow.textContent =\n    \"TRANSMISI\u00d3N ACTIVA\";\n\n    tvLinkText.textContent =\n    \"\u25cf AL AIRE AHORA \u00b7 VER OR MUSIC LIVE TV\";\n\n  }\n  else{\n\n    tvCard.classList.remove(\n      \"is-on-air\"\n    );\n\n    tvEyebrow.textContent =\n    \"SALA AUDIOVISUAL\";\n\n    tvLinkText.textContent =\n    \"\ud83d\udcfa IR A OR MUSIC LIVE TV\";\n\n  }\n\n}\n\n\nasync function checkTvSignal(){\n\n  try{\n\n    const controller =\n    new AbortController();\n\n    const timer =\n    setTimeout(\n      function(){\n\n        controller.abort();\n\n      },\n      5000\n    );\n\n\n    const response =\n    await fetch(\n      VIDEO_STATUS_URL +\n      \"?check=\" +\n      Date.now(),\n      {\n        cache:\"no-store\",\n        signal:controller.signal\n      }\n    );\n\n\n    clearTimeout(\n      timer\n    );\n\n\n    if(\n      !response.ok\n    ){\n\n      setTvState(false);\n\n      return;\n\n    }\n\n\n    const body =\n    await response.text();\n\n\n    const active =\n    body &&\n    body.indexOf(\n      \"#EXTM3U\"\n    ) !== -1;\n\n\n    setTvState(\n      active\n    );\n\n  }\n  catch(error){\n\n    setTvState(false);\n\n  }\n\n}\n\n\ncheckTvSignal();\n\n\nsetInterval(\n  checkTvSignal,\n  10000\n);\n\n\n\n\/* =========================================================\n   CHAT MIXES \u00b7 CONTROL DESDE PANEL PRIVADO\n   RESTAURADO AL COMPORTAMIENTO ORIGINAL:\n   BLOQUEADO -> CHAT HABILITADO -> ENTRAR AL CHAT -> VENTANA GRANDE\n========================================================= *\/\n\nconst CHAT_STATUS_URL =\n\"https:\/\/video.ormusiclive.com:9443\/api\/chat-status\";\n\nconst CHAT_URL =\n\"https:\/\/organizations.minnit.chat\/247725476591154\/Main\";\n\nconst orMixChatFrame =\ndocument.getElementById(\"ormixChatFrame\");\n\nconst orMixChatLock =\ndocument.getElementById(\"ormixChatLock\");\n\nconst orMixChatStatusBar =\ndocument.getElementById(\"ormixChatStatusBar\");\n\nconst orMixChatPopupButton =\ndocument.getElementById(\"ormixChatPopupButton\");\n\n\/* ACCESO GRANDE: cuando el chat est\u00e1 habilitado,\n   no mostramos el chat peque\u00f1o; mostramos el acceso central. *\/\nconst orMixChatAccess =\ndocument.createElement(\"div\");\n\norMixChatAccess.id = \"orMixChatAccess\";\norMixChatAccess.style.cssText =\n  \"display:none;position:absolute;inset:0;z-index:6;align-items:center;justify-content:center;padding:24px;box-sizing:border-box;background:linear-gradient(145deg,rgba(5,9,20,.97),rgba(10,18,34,.97));\";\n\norMixChatAccess.innerHTML = `\n  <div style=\"width:min(520px,92%);padding:28px 24px;border-radius:18px;border:1px solid rgba(118,221,255,.28);background:rgba(10,18,31,.92);text-align:center;box-shadow:0 20px 55px rgba(0,0,0,.35);\">\n    <div style=\"font-size:11px;letter-spacing:1.8px;color:#76ddff;font-weight:900;margin-bottom:8px;\">CHAT OR MUSIC LIVE<\/div>\n    <div style=\"font-size:26px;font-weight:900;color:#fff;margin-bottom:8px;\">Chat habilitado<\/div>\n    <div style=\"font-size:13px;line-height:1.55;color:#aab4c3;margin-bottom:20px;\">Entra a la sala en una ventana grande para seguir c\u00f3modamente toda la conversaci\u00f3n.<\/div>\n    <button type=\"button\" id=\"orMixChatEnterButton\" style=\"width:100%;min-height:52px;border:0;border-radius:12px;background:linear-gradient(135deg,#0d8db7,#165f9c);color:#fff;font-size:15px;font-weight:900;letter-spacing:.5px;cursor:pointer;\">\u2197 ENTRAR AL CHAT<\/button>\n  <\/div>`;\n\nif(orMixChatFrame){\n  orMixChatFrame.appendChild(orMixChatAccess);\n}\n\nconst orMixChatEnterButton =\ndocument.getElementById(\"orMixChatEnterButton\");\n\nconst orMixChatPopupMode =\nnew URLSearchParams(window.location.search).get(\"or_chat_popup\") === \"mixes\";\n\nfunction orMixRenderLargeChat(){\n  document.body.innerHTML = `\n    <div style=\"min-height:100vh;background:#050914;color:#fff;font-family:Arial,sans-serif;padding:12px;box-sizing:border-box;\">\n      <div style=\"max-width:1500px;margin:0 auto;\">\n        <div style=\"display:flex;justify-content:space-between;align-items:center;gap:12px;margin-bottom:10px;\">\n          <div>\n            <div style=\"font-size:11px;letter-spacing:1.6px;color:#76ddff;font-weight:900;\">OR MUSIC LIVE<\/div>\n            <div style=\"font-size:22px;font-weight:900;\">Chat de oyentes \u00b7 Mixes & DJs<\/div>\n          <\/div>\n          <button type=\"button\" onclick=\"window.close()\" style=\"border:0;border-radius:10px;padding:10px 14px;background:#232b3a;color:#fff;font-weight:900;cursor:pointer;\">CERRAR VENTANA<\/button>\n        <\/div>\n\n        <div id=\"orMixLargeChatNotice\" style=\"display:none;min-height:78vh;border:1px solid rgba(255,255,255,.10);border-radius:16px;align-items:center;justify-content:center;text-align:center;padding:30px;box-sizing:border-box;background:#080d18;\">\n          <div>\n            <div style=\"font-size:40px;margin-bottom:12px;\">\ud83d\udd12<\/div>\n            <div style=\"font-size:24px;font-weight:900;\">Chat cerrado<\/div>\n            <div style=\"margin-top:8px;color:#aab4c3;\">El chat ya no est\u00e1 habilitado en Mixes & DJs.<\/div>\n          <\/div>\n        <\/div>\n\n        <iframe id=\"orMixLargeChatFrame\" src=\"${CHAT_URL}\" title=\"Chat OR Music Live\" allow=\"clipboard-write\" style=\"display:block;width:100%;height:84vh;border:1px solid rgba(255,255,255,.10);border-radius:16px;background:#060814;\"><\/iframe>\n      <\/div>\n    <\/div>`;\n\n  async function checkLargeChat(){\n    try{\n      const r = await fetch(\n        CHAT_STATUS_URL + \"?t=\" + Date.now(),\n        {cache:\"no-store\"}\n      );\n\n      if(!r.ok){\n        throw new Error(\"status\");\n      }\n\n      const d = await r.json();\n      const open = !!(d && d.enabled);\n\n      const frame = document.getElementById(\"orMixLargeChatFrame\");\n      const notice = document.getElementById(\"orMixLargeChatNotice\");\n\n      if(frame){\n        frame.style.display = open ? \"block\" : \"none\";\n      }\n\n      if(notice){\n        notice.style.display = open ? \"none\" : \"flex\";\n      }\n\n    }catch(error){\n      const frame = document.getElementById(\"orMixLargeChatFrame\");\n      const notice = document.getElementById(\"orMixLargeChatNotice\");\n\n      if(frame){\n        frame.style.display = \"none\";\n      }\n\n      if(notice){\n        notice.style.display = \"flex\";\n      }\n    }\n  }\n\n  checkLargeChat();\n  setInterval(checkLargeChat,3000);\n}\n\nif(orMixChatPopupMode){\n  orMixRenderLargeChat();\n  return;\n}\n\nfunction orMixSetChatState(enabled){\n\n  if(!orMixChatFrame || !orMixChatLock){\n    return;\n  }\n\n  const chatIframe =\n    orMixChatFrame.querySelector(\"iframe\");\n\n  if(enabled){\n\n    orMixChatFrame.classList.remove(\"is-locked\");\n    orMixChatFrame.classList.add(\"ormix-chat-unlocked\");\n    orMixChatLock.style.display = \"none\";\n\n    if(chatIframe){\n      chatIframe.style.display = \"none\";\n    }\n\n    if(orMixChatAccess){\n      orMixChatAccess.style.display = \"flex\";\n    }\n\n    if(orMixChatPopupButton){\n      orMixChatPopupButton.style.display = \"none\";\n    }\n\n    if(orMixChatStatusBar){\n      orMixChatStatusBar.textContent =\n        \"CHAT ACTIVO \u00b7 ENTRADA HABILITADA\";\n    }\n\n  }\n  else{\n\n    orMixChatFrame.classList.add(\"is-locked\");\n    orMixChatFrame.classList.remove(\"ormix-chat-unlocked\");\n    orMixChatLock.style.display = \"\";\n\n    if(chatIframe){\n      chatIframe.style.display = \"block\";\n    }\n\n    if(orMixChatAccess){\n      orMixChatAccess.style.display = \"none\";\n    }\n\n    if(orMixChatPopupButton){\n      orMixChatPopupButton.style.display = \"none\";\n    }\n\n    if(orMixChatStatusBar){\n      orMixChatStatusBar.textContent =\n        \"CHAT DISPONIBLE DURANTE EVENTOS EN VIVO\";\n    }\n  }\n}\n\nasync function orMixUpdateChatState(){\n\n  try{\n\n    const response = await fetch(\n      CHAT_STATUS_URL + \"?t=\" + Date.now(),\n      {cache:\"no-store\"}\n    );\n\n    if(!response.ok){\n      throw new Error(\"Estado del chat no disponible\");\n    }\n\n    const data = await response.json();\n\n    orMixSetChatState(\n      !!(data && data.enabled)\n    );\n\n  }\n  catch(error){\n    \/* Seguridad: si falla la consulta, el chat queda bloqueado. *\/\n    orMixSetChatState(false);\n  }\n}\n\nif(orMixChatEnterButton){\n  orMixChatEnterButton.addEventListener(\"click\",function(){\n    const url = new URL(window.location.href);\n    url.searchParams.set(\"or_chat_popup\",\"mixes\");\n\n    window.open(\n      url.toString(),\n      \"ORMusicLiveChatMixes\",\n      \"width=1180,height=850,resizable=yes,scrollbars=yes\"\n    );\n  });\n}\n\nif(orMixChatPopupButton){\n  orMixChatPopupButton.addEventListener(\"click\",function(){\n    const url = new URL(window.location.href);\n    url.searchParams.set(\"or_chat_popup\",\"mixes\");\n\n    window.open(\n      url.toString(),\n      \"ORMusicLiveChatMixes\",\n      \"width=1180,height=850,resizable=yes,scrollbars=yes\"\n    );\n  });\n}\n\norMixUpdateChatState();\n\nsetInterval(\n  orMixUpdateChatState,\n  3000\n);\n\n\nupdateMute();\n\n\n});\n\n<\/script>\n\n<!-- =========================================================\n     OR MIXES \u00b7 MULTIMEDIA V2 \u00b7 MUX PLAYER\n     2026-09-17\n========================================================= -->\n\n<style id=\"or-mixes-mux-player-v2-style\">\n\n#orMixMuxPlayerV2Layer{\n  position:absolute;\n  inset:0;\n  z-index:60;\n  display:none;\n  overflow:hidden;\n  align-items:center;\n  justify-content:center;\n  background:#02030a;\n  pointer-events:none;\n}\n\n#orMixMuxPlayerV2Layer.is-active{\n  display:flex;\n}\n\n#orMixMuxPlayerV2Layer img,\n#orMixMuxPlayerV2Layer mux-player{\n  display:block;\n  width:100%;\n  height:100%;\n  background:#02030a;\n}\n\n#orMixMuxPlayerV2Layer img{\n  object-fit:contain;\n  object-position:center center;\n}\n\n#orMixMuxPlayerV2Layer mux-player{\n  --controls:none;\n  --media-object-fit:contain;\n  --media-object-position:center;\n}\n\nbody.or-mix-v2-mux-active .ormix-promo-layer{\n  display:none!important;\n}\n\nbody.or-mix-v2-mux-active .ormix-image-top{\n  z-index:80!important;\n}\n\n<\/style>\n\n\n<script id=\"or-mixes-mux-player-v2-script\">\n\/* OR_MIXES_MUX_PLAYER_V2_20260917 *\/\n\n(function(){\n\n  const API =\n    \"https:\/\/video.ormusiclive.com:9444\/api\/multimedia\/output?platform=web&screen=mixes\";\n\n  const V2_BASE =\n    \"https:\/\/video.ormusiclive.com:9444\";\n\n  const MUX_PLAYER_SRC =\n    \"https:\/\/cdn.jsdelivr.net\/npm\/@mux\/mux-player@3.13.3\";\n\n  let signature = \"\";\n  let sequenceToken = 0;\n  let phaseTimer = null;\n  let layer = null;\n  let muxPlayerPromise = null;\n\n  const nativeFetch =\n    window.__OR_MIX_NATIVE_FETCH\n    ||\n    window.fetch.bind(window);\n\n\n  function getVisual(){\n    return document.querySelector(\n      \".ormix-visual\"\n    );\n  }\n\n\n  function ensureLayer(){\n\n    const visual =\n      getVisual();\n\n    if(!visual){\n      return null;\n    }\n\n    if(\n      layer\n      &&\n      layer.isConnected\n    ){\n      return layer;\n    }\n\n    layer =\n      document.createElement(\n        \"div\"\n      );\n\n    layer.id =\n      \"orMixMuxPlayerV2Layer\";\n\n    layer.setAttribute(\n      \"aria-hidden\",\n      \"true\"\n    );\n\n    visual.appendChild(\n      layer\n    );\n\n    return layer;\n  }\n\n\n  function stopOldPromoVideo(){\n\n    const oldLayer =\n      document.getElementById(\n        \"orMixPromoLayer\"\n      );\n\n    if(!oldLayer){\n      return;\n    }\n\n    const oldVideo =\n      oldLayer.querySelector(\n        \"video\"\n      );\n\n    if(oldVideo){\n\n      try{\n        oldVideo.pause();\n      }catch(error){}\n\n      try{\n        oldVideo.removeAttribute(\n          \"src\"\n        );\n\n        oldVideo.load();\n\n      }catch(error){}\n    }\n\n    oldLayer.classList.remove(\n      \"is-active\"\n    );\n\n    oldLayer.setAttribute(\n      \"aria-hidden\",\n      \"true\"\n    );\n  }\n\n\n  function stopMedia(){\n\n    if(phaseTimer){\n\n      clearTimeout(\n        phaseTimer\n      );\n\n      phaseTimer = null;\n    }\n\n    if(layer){\n\n      const mux =\n        layer.querySelector(\n          \"mux-player\"\n        );\n\n      if(mux){\n\n        try{\n          mux.pause();\n        }catch(error){}\n      }\n\n      layer.innerHTML = \"\";\n    }\n\n    stopOldPromoVideo();\n  }\n\n\n  function normalMode(){\n\n    sequenceToken += 1;\n\n    stopMedia();\n\n    const screen =\n      ensureLayer();\n\n    if(!screen){\n      return;\n    }\n\n    screen.classList.remove(\n      \"is-active\"\n    );\n\n    screen.setAttribute(\n      \"aria-hidden\",\n      \"true\"\n    );\n\n    document.body.classList.remove(\n      \"or-mix-v2-mux-active\"\n    );\n\n    window.OR_MIX_V2_ACTIVE =\n      false;\n  }\n\n\n  function activateLayer(){\n\n    const screen =\n      ensureLayer();\n\n    if(!screen){\n      return null;\n    }\n\n    stopMedia();\n\n    screen.innerHTML = \"\";\n\n    screen.classList.add(\n      \"is-active\"\n    );\n\n    screen.setAttribute(\n      \"aria-hidden\",\n      \"false\"\n    );\n\n    document.body.classList.add(\n      \"or-mix-v2-mux-active\"\n    );\n\n    window.OR_MIX_V2_ACTIVE =\n      true;\n\n    return screen;\n  }\n\n\n  function absoluteUrl(value){\n\n    if(!value){\n      return \"\";\n    }\n\n    try{\n\n      return new URL(\n        value,\n        V2_BASE\n      ).href;\n\n    }catch(error){\n\n      return \"\";\n    }\n  }\n\n\n  function playbackIdFromItem(item){\n\n    const direct =\n      String(\n        (\n          item &&\n          item.playback_id\n        )\n        || \"\"\n      ).trim();\n\n    if(direct){\n      return direct;\n    }\n\n    const media =\n      String(\n        (\n          item &&\n          item.media_url\n        )\n        || \"\"\n      ).trim();\n\n    const match =\n      media.match(\n        \/stream\\.mux\\.com\\\/([^\/?]+)\\.m3u8\/i\n      );\n\n    return match\n      ? match[1]\n      : \"\";\n  }\n\n\n  function loadMuxPlayer(){\n\n    if(\n      window.customElements\n      &&\n      customElements.get(\n        \"mux-player\"\n      )\n    ){\n\n      return Promise.resolve();\n    }\n\n    if(muxPlayerPromise){\n\n      return muxPlayerPromise;\n    }\n\n    muxPlayerPromise =\n      new Promise(\n        function(resolve,reject){\n\n          let script =\n            document.querySelector(\n              \"script[data-or-mux-player]\"\n            );\n\n          if(!script){\n\n            script =\n              document.createElement(\n                \"script\"\n              );\n\n            script.src =\n              MUX_PLAYER_SRC;\n\n            script.defer =\n              true;\n\n            script.setAttribute(\n              \"data-or-mux-player\",\n              \"1\"\n            );\n\n            document.head.appendChild(\n              script\n            );\n          }\n\n          if(\n            window.customElements\n            &&\n            customElements.get(\n              \"mux-player\"\n            )\n          ){\n\n            resolve();\n\n            return;\n          }\n\n          script.addEventListener(\n            \"load\",\n            function(){\n\n              if(!window.customElements){\n\n                reject(\n                  new Error(\n                    \"Custom Elements no disponible\"\n                  )\n                );\n\n                return;\n              }\n\n              customElements\n              .whenDefined(\n                \"mux-player\"\n              )\n              .then(resolve)\n              .catch(reject);\n\n            },\n            {\n              once:true\n            }\n          );\n\n          script.addEventListener(\n            \"error\",\n            reject,\n            {\n              once:true\n            }\n          );\n\n        }\n      );\n\n    return muxPlayerPromise;\n  }\n\n\n  function showImage(\n    item,\n    seconds,\n    token,\n    next\n  ){\n\n    if(\n      token !==\n      sequenceToken\n    ){\n      return;\n    }\n\n    const screen =\n      activateLayer();\n\n    if(!screen){\n      return;\n    }\n\n    const image =\n      document.createElement(\n        \"img\"\n      );\n\n    image.src =\n      absoluteUrl(\n        item.media_url\n      );\n\n    image.alt =\n      \"OR Music Live\";\n\n    image.onerror =\n      function(){\n\n        phaseTimer =\n          setTimeout(\n            next,\n            1200\n          );\n      };\n\n    screen.appendChild(\n      image\n    );\n\n    phaseTimer =\n      setTimeout(\n        next,\n        Math.max(\n          1,\n          Number(seconds) || 10\n        ) * 1000\n      );\n  }\n\n\n  async function showVideo(\n    item,\n    token,\n    next\n  ){\n\n    if(\n      token !==\n      sequenceToken\n    ){\n      return;\n    }\n\n    const screen =\n      activateLayer();\n\n    if(!screen){\n      return;\n    }\n\n    const playbackId =\n      playbackIdFromItem(\n        item\n      );\n\n    if(!playbackId){\n\n      phaseTimer =\n        setTimeout(\n          next,\n          1200\n        );\n\n      return;\n    }\n\n    try{\n\n      await loadMuxPlayer();\n\n    }catch(error){\n\n      phaseTimer =\n        setTimeout(\n          next,\n          1200\n        );\n\n      return;\n    }\n\n    if(\n      token !==\n      sequenceToken\n    ){\n      return;\n    }\n\n    let done =\n      false;\n\n    function finish(){\n\n      if(done){\n        return;\n      }\n\n      done =\n        true;\n\n      if(\n        token ===\n        sequenceToken\n      ){\n\n        next();\n      }\n    }\n\n    const player =\n      document.createElement(\n        \"mux-player\"\n      );\n\n    player.setAttribute(\n      \"playback-id\",\n      playbackId\n    );\n\n    player.setAttribute(\n      \"stream-type\",\n      \"on-demand\"\n    );\n\n    player.setAttribute(\n      \"autoplay\",\n      \"muted\"\n    );\n\n    player.setAttribute(\n      \"muted\",\n      \"\"\n    );\n\n    player.setAttribute(\n      \"playsinline\",\n      \"\"\n    );\n\n    player.setAttribute(\n      \"preload\",\n      \"auto\"\n    );\n\n    player.setAttribute(\n      \"disable-cookies\",\n      \"\"\n    );\n\n    player.setAttribute(\n      \"nohotkeys\",\n      \"\"\n    );\n\n    player.muted =\n      true;\n\n    player.style.display =\n      \"block\";\n\n    player.style.width =\n      \"100%\";\n\n    player.style.height =\n      \"100%\";\n\n    player.style.background =\n      \"#02030a\";\n\n    player.style.setProperty(\n      \"--controls\",\n      \"none\"\n    );\n\n    player.style.setProperty(\n      \"--media-object-fit\",\n      \"contain\"\n    );\n\n    player.style.setProperty(\n      \"--media-object-position\",\n      \"center\"\n    );\n\n    player.addEventListener(\n      \"ended\",\n      finish,\n      {\n        once:true\n      }\n    );\n\n    player.addEventListener(\n      \"error\",\n      function(){\n\n        phaseTimer =\n          setTimeout(\n            finish,\n            1200\n          );\n      },\n      {\n        once:true\n      }\n    );\n\n    screen.appendChild(\n      player\n    );\n\n    try{\n\n      const result =\n        player.play();\n\n      if(\n        result\n        &&\n        typeof result.catch ===\n        \"function\"\n      ){\n\n        result.catch(\n          function(){}\n        );\n      }\n\n    }catch(error){}\n\n  }\n\n\n  function runSequence(data){\n\n    const items =\n      Array.isArray(\n        data.items\n      )\n      ? data.items\n      : [];\n\n    if(\n      !data.enabled\n      ||\n      !items.length\n    ){\n\n      normalMode();\n\n      return;\n    }\n\n    sequenceToken += 1;\n\n    const token =\n      sequenceToken;\n\n    let index =\n      0;\n\n    const imageSeconds =\n      Math.max(\n        1,\n        Number(\n          data.image_duration_seconds\n        ) || 10\n      );\n\n    function next(){\n\n      if(\n        token !==\n        sequenceToken\n      ){\n        return;\n      }\n\n      stopMedia();\n\n      const item =\n        items[\n          index %\n          items.length\n        ];\n\n      index =\n        (\n          index + 1\n        )\n        % items.length;\n\n      if(\n        item.kind ===\n        \"video\"\n      ){\n\n        showVideo(\n          item,\n          token,\n          next\n        );\n\n        return;\n      }\n\n      if(\n        item.kind ===\n        \"image\"\n      ){\n\n        showImage(\n          item,\n          imageSeconds,\n          token,\n          next\n        );\n\n        return;\n      }\n\n      phaseTimer =\n        setTimeout(\n          next,\n          1000\n        );\n    }\n\n    next();\n  }\n\n\n  function makeSignature(data){\n\n    return JSON.stringify({\n      enabled:\n        !!data.enabled,\n\n      duration:\n        Number(\n          data.image_duration_seconds\n        ) || 10,\n\n      items:\n        Array.isArray(\n          data.items\n        )\n        ? data.items\n        : []\n    });\n  }\n\n\n  async function refresh(){\n\n    try{\n\n      const response =\n        await nativeFetch(\n          API\n          + \"&t=\"\n          + Date.now(),\n          {\n            cache:\n              \"no-store\"\n          }\n        );\n\n      if(!response.ok){\n\n        throw new Error(\n          \"HTTP \"\n          + response.status\n        );\n      }\n\n      const data =\n        await response.json();\n\n      const nextSignature =\n        makeSignature(\n          data\n        );\n\n      if(\n        nextSignature !==\n        signature\n      ){\n\n        signature =\n          nextSignature;\n\n        runSequence(\n          data\n        );\n      }\n\n    }catch(error){\n\n      if(\n        signature !==\n        \"NORMAL_FALLBACK\"\n      ){\n\n        signature =\n          \"NORMAL_FALLBACK\";\n\n        normalMode();\n      }\n    }\n  }\n\n\n  function boot(){\n\n    ensureLayer();\n\n    normalMode();\n\n    refresh();\n\n    setInterval(\n      refresh,\n      5000\n    );\n\n    setInterval(\n      function(){\n\n        if(\n          window.OR_MIX_V2_ACTIVE === true\n        ){\n\n          stopOldPromoVideo();\n        }\n\n      },\n      1500\n    );\n\n  }\n\n\n  if(\n    document.readyState ===\n    \"loading\"\n  ){\n\n    document.addEventListener(\n      \"DOMContentLoaded\",\n      boot,\n      {\n        once:true\n      }\n    );\n\n  }else{\n\n    boot();\n  }\n\n})();\n<\/script>\n\n<!-- =========================================================\n     OR MIXES & DJS \u00b7 TEXTOS \/ AVISOS V2\n     RESTAURADO 2026-09-17\n========================================================= -->\n\n<style id=\"or-mixes-texts-v2-style\">\n\/* OR_MIXES_TEXTS_V2_20260916 *\/\n\n#orMixTextV2{\n    display:none;\n    position:relative;\n    z-index:6;\n    width:calc(100% - 40px);\n    min-height:115px;\n    margin:18px 20px 0;\n    padding:20px 24px;\n    box-sizing:border-box;\n    align-items:center;\n    border-radius:17px;\n    border:1px solid rgba(255,255,255,.12);\n    background:\n        linear-gradient(\n            145deg,\n            rgba(7,11,18,.97),\n            rgba(12,18,29,.97)\n        );\n    color:#fff;\n    font-size:clamp(17px,1.8vw,27px);\n    line-height:1.35;\n    font-weight:900;\n    white-space:pre-wrap;\n    overflow-wrap:break-word;\n    word-break:normal;\n}\n\n#orMixTextV2.is-active{\n    display:flex;\n}\n\n#orMixTextV2Inner{\n    display:block;\n    width:100%;\n    min-width:0;\n    white-space:pre-wrap;\n    overflow-wrap:break-word;\n    word-break:normal;\n}\n\n\/* ILUMINADO *\/\n#orMixTextV2.effect-glow{\n    border:1px solid currentColor;\n    box-shadow:\n        0 0 var(--ormix-glow-1,4px) currentColor,\n        0 0 var(--ormix-glow-2,14px) currentColor,\n        0 0 var(--ormix-glow-3,24px) currentColor;\n    text-shadow:\n        0 0 var(--ormix-glow-1,4px) currentColor,\n        0 0 var(--ormix-glow-2,12px) currentColor;\n    filter:\n        brightness(var(--ormix-brightness,1.15))\n        saturate(var(--ormix-saturation,1.12));\n}\n\n\/* PULSANTE *\/\n#orMixTextV2.effect-pulse{\n    border:1px solid currentColor;\n    animation:\n        orMixTextPulse\n        var(--ormix-pulse-speed,1.05s)\n        ease-in-out\n        infinite;\n    transform-origin:center;\n}\n\n@keyframes orMixTextPulse{\n    0%,\n    100%{\n        opacity:1;\n        transform:scale(var(--ormix-pulse-high-scale,1.006));\n        filter:\n            brightness(var(--ormix-brightness,1.18))\n            saturate(var(--ormix-saturation,1.12));\n        box-shadow:\n            0 0 var(--ormix-glow-1,4px) currentColor,\n            0 0 var(--ormix-glow-2,14px) currentColor,\n            0 0 var(--ormix-glow-3,24px) currentColor;\n        text-shadow:\n            0 0 var(--ormix-glow-1,4px) currentColor,\n            0 0 var(--ormix-glow-2,12px) currentColor;\n    }\n\n    50%{\n        opacity:var(--ormix-pulse-low-opacity,.60);\n        transform:scale(var(--ormix-pulse-low-scale,.997));\n        filter:\n            brightness(.82)\n            saturate(.92);\n        box-shadow:0 0 2px currentColor;\n        text-shadow:0 0 2px currentColor;\n    }\n}\n\n@media(max-width:620px){\n    #orMixTextV2{\n        width:calc(100% - 24px);\n        min-height:95px;\n        margin:12px 12px 0;\n        padding:16px 15px;\n        font-size:clamp(16px,5vw,22px);\n    }\n}\n<\/style>\n\n<script>\n\/* OR_MIXES_TEXTS_V2_20260916 *\/\n\n(function(){\n\n    const API =\n        \"https:\/\/video.ormusiclive.com:9444\/api\/texts\/output?platform=web&screen=mixes\";\n\n    function ensureBox(){\n\n        const player =\n            document.getElementById(\n                \"ormixPlayer\"\n            );\n\n        if(!player){\n            return null;\n        }\n\n        let box =\n            document.getElementById(\n                \"orMixTextV2\"\n            );\n\n        if(box){\n            return box;\n        }\n\n        box =\n            document.createElement(\n                \"div\"\n            );\n\n        box.id =\n            \"orMixTextV2\";\n\n        box.setAttribute(\n            \"aria-live\",\n            \"polite\"\n        );\n\n        const inner =\n            document.createElement(\n                \"div\"\n            );\n\n        inner.id =\n            \"orMixTextV2Inner\";\n\n        box.appendChild(\n            inner\n        );\n\n        const controls =\n            player.querySelector(\n                \".ormix-controls-area\"\n            );\n\n        if(controls){\n\n            player.insertBefore(\n                box,\n                controls\n            );\n\n        }else{\n\n            player.appendChild(\n                box\n            );\n        }\n\n        return box;\n    }\n\n    function cleanText(value){\n\n        return String(\n            value || \"\"\n        )\n        .split(\/\\r?\\n\/)\n        .map(\n            function(line){\n                return line.trim();\n            }\n        )\n        .join(\"\\n\");\n    }\n\n    function hide(){\n\n        const box =\n            ensureBox();\n\n        if(!box){\n            return;\n        }\n\n        const inner =\n            document.getElementById(\n                \"orMixTextV2Inner\"\n            );\n\n        box.className =\n            \"\";\n\n        box.removeAttribute(\n            \"style\"\n        );\n\n        if(inner){\n            inner.textContent =\n                \"\";\n        }\n    }\n\n    function show(message){\n\n        const box =\n            ensureBox();\n\n        const inner =\n            document.getElementById(\n                \"orMixTextV2Inner\"\n            );\n\n        if(\n            !box\n            ||\n            !inner\n            ||\n            !message\n        ){\n            hide();\n            return;\n        }\n\n        const text =\n            cleanText(\n                message.text\n            );\n\n        if(!text.trim()){\n            hide();\n            return;\n        }\n\n        const effect =\n            String(\n                message.effect\n                || \"normal\"\n            );\n\n        const color =\n            String(\n                message.color\n                || \"#ffffff\"\n            );\n\n        const align =\n            [\n                \"left\",\n                \"center\",\n                \"right\"\n            ].includes(\n                String(\n                    message.align\n                    || \"center\"\n                )\n            )\n            ? String(\n                message.align\n                || \"center\"\n            )\n            : \"center\";\n\n        const intensity =\n            Math.max(\n                0,\n                Math.min(\n                    100,\n                    Number(\n                        message.intensity\n                        ?? 55\n                    )\n                )\n            );\n\n        const level =\n            intensity \/ 100;\n\n        const speeds = {\n            slow:\"1.55s\",\n            medium:\"1.05s\",\n            fast:\".72s\"\n        };\n\n        inner.textContent =\n            text;\n\n        inner.style.textAlign =\n            align;\n\n        box.style.textAlign =\n            align;\n\n        box.style.color =\n            color;\n\n        box.className =\n            \"is-active effect-\"\n            + effect;\n\n        box.style.setProperty(\n            \"--ormix-pulse-speed\",\n            speeds[\n                String(\n                    message.pulse_speed\n                    || \"medium\"\n                )\n            ]\n            || \"1.05s\"\n        );\n\n        box.style.setProperty(\n            \"--ormix-glow-1\",\n            Math.round(\n                level * 7\n            )\n            + \"px\"\n        );\n\n        box.style.setProperty(\n            \"--ormix-glow-2\",\n            Math.round(\n                level * 22\n            )\n            + \"px\"\n        );\n\n        box.style.setProperty(\n            \"--ormix-glow-3\",\n            Math.round(\n                level * 38\n            )\n            + \"px\"\n        );\n\n        box.style.setProperty(\n            \"--ormix-brightness\",\n            String(\n                1\n                + level * .28\n            )\n        );\n\n        box.style.setProperty(\n            \"--ormix-saturation\",\n            String(\n                1\n                + level * .25\n            )\n        );\n\n        box.style.setProperty(\n            \"--ormix-pulse-low-opacity\",\n            String(\n                .88\n                - level * .50\n            )\n        );\n\n        box.style.setProperty(\n            \"--ormix-pulse-high-scale\",\n            String(\n                1\n                + level * .010\n            )\n        );\n\n        box.style.setProperty(\n            \"--ormix-pulse-low-scale\",\n            String(\n                1\n                - level * .005\n            )\n        );\n    }\n\n    async function refresh(){\n\n        try{\n\n            const response =\n                await fetch(\n                    API\n                    + \"&t=\"\n                    + Date.now(),\n                    {\n                        cache:\n                            \"no-store\"\n                    }\n                );\n\n            if(!response.ok){\n\n                throw new Error(\n                    \"HTTP \"\n                    + response.status\n                );\n            }\n\n            const data =\n                await response.json();\n\n            if(\n                data.enabled\n                &&\n                data.message\n            ){\n\n                show(\n                    data.message\n                );\n\n            }else{\n\n                hide();\n            }\n\n        }catch(error){\n\n            hide();\n        }\n    }\n\n    setTimeout(\n        refresh,\n        600\n    );\n\n    setInterval(\n        refresh,\n        5000\n    );\n\n})();\n<\/script>\n\n\n<style id=\"or-global-site-background-logo\">\n\/* OR-GLOBAL-SITE-BACKGROUND-LOGO *\/<\/p>\n<p>body{<br \/>\n  background-color:#050607!important;<br \/>\n}<\/p>\n<p>body::before{<br \/>\n  content:\"\";<br \/>\n  position:fixed;<br \/>\n  inset:0;<br \/>\n  background-image:url('https:\/\/ormusiclive.com\/wp-content\/uploads\/2026\/08\/or-music-logo-final.png');<br \/>\n  background-repeat:no-repeat;<br \/>\n  background-position:center 140px;<br \/>\n  background-size:min(1400px, 92vw);<br \/>\n  opacity:0.18;<br \/>\n  pointer-events:none;<br \/>\n  z-index:0;<br \/>\n}<\/p>\n<p>.wp-site-blocks,<br \/>\n.wp-block-post-content,<br \/>\n.entry-content,<br \/>\nmain,<br \/>\n.site-main,<br \/>\n.site-content,<br \/>\n.site,<br \/>\nheader,<br \/>\nfooter{<br \/>\n  position:relative;<br \/>\n  z-index:1;<br \/>\n}<\/p>\n<p>@media (max-width: 768px){<br \/>\n  body::before{<br \/>\n    background-size:115vw;<br \/>\n    background-position:center 100px;<br \/>\n    opacity:0.14;<br \/>\n  }<br \/>\n}<\/p>\n<p>\/* OR INTERNAL HEADER SPACING 409 *\/<\/p>\n<p>.ormix-header{<br \/>\n    width:100% !important;<br \/>\n    display:flex !important;<br \/>\n    align-items:center !important;<br \/>\n    justify-content:space-between !important;<br \/>\n    gap:40px !important;<br \/>\n}<\/p>\n<p>.ormix-domain{<br \/>\n    flex:1 1 auto !important;<br \/>\n    min-width:0 !important;<br \/>\n    margin:0 !important;<br \/>\n}<\/p>\n<p>.ormix-home{<br \/>\n    position:relative !important;<br \/>\n    top:auto !important;<br \/>\n    right:auto !important;<br \/>\n    left:auto !important;<\/p>\n<p>    flex:0 0 auto !important;<br \/>\n    margin-left:auto !important;<br \/>\n    margin-right:0 !important;<br \/>\n}<\/p>\n<p>@media(max-width:900px){<br \/>\n    .ormix-header{<br \/>\n        gap:20px !important;<br \/>\n    }<\/p>\n<p>    .ormix-domain{<br \/>\n        font-size:clamp(28px,6vw,48px) !important;<br \/>\n    }<br \/>\n}<\/p>\n<p>@media(max-width:650px){<br \/>\n    .ormix-header{<br \/>\n        align-items:flex-start !important;<br \/>\n        flex-direction:column !important;<br \/>\n        gap:16px !important;<br \/>\n    }<\/p>\n<p>    .ormix-home{<br \/>\n        align-self:flex-end !important;<br \/>\n    }<br \/>\n}<\/p>\n<p>\/* OR HOME BUTTON FIXED LOWER 409 *\/<\/p>\n<p>.ormix-home{<br \/>\n    transform:translateY(12px) !important;<br \/>\n}<\/p>\n<p>.ormix-home:hover{<br \/>\n    transform:translateY(12px) !important;<br \/>\n}<\/p>\n<p>.ormix-home:active{<br \/>\n    transform:translateY(12px) scale(.98) !important;<br \/>\n}<\/p>\n<p>@media(max-width:700px){<br \/>\n    .ormix-home{<br \/>\n        transform:translateY(7px) !important;<br \/>\n    }<\/p>\n<p>    .ormix-home:hover{<br \/>\n        transform:translateY(7px) !important;<br \/>\n    }<\/p>\n<p>    .ormix-home:active{<br \/>\n        transform:translateY(7px) scale(.98) !important;<br \/>\n    }<br \/>\n}<\/p>\n<\/style>\n<p><!-- OR MIXES CHAT PANEL CONTROL START --><br \/>\n<script><br \/>\n(function(){<\/p>\n<p>  const CHAT_STATUS_URL =<br \/>\n    \"https:\/\/video.ormusiclive.com:9443\/api\/chat-status\";<\/p>\n<p>  const CHAT_URL =<br \/>\n    \"https:\/\/organizations.minnit.chat\/247725476591154\/Main\";<\/p>\n<p>  \/* =========================================================<br \/>\n     VENTANA GRANDE DEL CHAT<br \/>\n  ========================================================= *\/<\/p>\n<p>  const popupMode =<br \/>\n    new URLSearchParams(window.location.search)<br \/>\n      .get(\"or_chat_popup\") === \"mixes\";<\/p>\n<p>  function renderLargeChat(){<\/p>\n<p>    document.body.innerHTML = `<\/p>\n<div style=\"\n        min-height:100vh;\n        background:#050914;\n        color:#fff;\n        font-family:Arial,Helvetica,sans-serif;\n        padding:14px;\n        box-sizing:border-box;\n      \"><\/p>\n<div style=\"\n          width:min(1500px,100%);\n          margin:0 auto;\n        \"><\/p>\n<div style=\"\n            display:flex;\n            justify-content:space-between;\n            align-items:center;\n            gap:15px;\n            margin-bottom:12px;\n          \"><\/p>\n<div>\n<div style=\"\n                font-size:11px;\n                letter-spacing:1.8px;\n                color:#76ddff;\n                font-weight:900;\n              \"><br \/>\n                OR MUSIC LIVE\n              <\/div>\n<div style=\"\n                margin-top:3px;\n                font-size:22px;\n                font-weight:900;\n              \"><br \/>\n                Chat de oyentes \u00b7 Mixes & DJs\n              <\/div>\n<\/p>\n<\/div>\n<p>            <button\n              type=\"button\"\n              onclick=\"window.close()\"\n              style=\"\n                border:1px solid rgba(255,255,255,.15);\n                border-radius:11px;\n                padding:11px 16px;\n                background:#182130;\n                color:#fff;\n                font-weight:900;\n                cursor:pointer;\n              \"\n            ><br \/>\n              CERRAR VENTANA<br \/>\n            <\/button><\/p>\n<\/div>\n<div\n            id=\"orMixLargeChatNotice\"\n            style=\"\n              display:none;\n              min-height:78vh;\n              border:1px solid rgba(255,255,255,.10);\n              border-radius:18px;\n              align-items:center;\n              justify-content:center;\n              text-align:center;\n              padding:30px;\n              background:#080d18;\n            \"\n          ><\/p>\n<div>\n<div style=\"font-size:42px;\">\n                \ud83d\udd12\n              <\/div>\n<div style=\"\n                margin-top:10px;\n                font-size:25px;\n                font-weight:900;\n              \"><br \/>\n                Chat cerrado\n              <\/div>\n<div style=\"\n                margin-top:9px;\n                color:#aab4c3;\n                line-height:1.5;\n              \"><br \/>\n                El chat ya no est\u00e1 habilitado en Mixes & DJs.\n              <\/div>\n<\/p>\n<\/div>\n<\/div>\n<p>          <iframe\n            id=\"orMixLargeChatFrame\"\n            src=\"${CHAT_URL}\"\n            title=\"Chat OR Music Live\"\n            allow=\"clipboard-write\"\n            style=\"\n              display:block;\n              width:100%;\n              height:84vh;\n              border:1px solid rgba(255,255,255,.10);\n              border-radius:18px;\n              background:#060814;\n            \"\n          ><\/iframe><\/p>\n<\/div>\n<\/div>\n<p>    `;<\/p>\n<p>    async function checkLargeChat(){<\/p>\n<p>      try{<\/p>\n<p>        const response = await fetch(<br \/>\n          CHAT_STATUS_URL + \"?t=\" + Date.now(),<br \/>\n          { cache:\"no-store\" }<br \/>\n        );<\/p>\n<p>        if(!response.ok){<br \/>\n          throw new Error(\"status\");<br \/>\n        }<\/p>\n<p>        const data = await response.json();<\/p>\n<p>        const abierto =<br \/>\n          !!(data && data.enabled === true);<\/p>\n<p>        const frame =<br \/>\n          document.getElementById(\"orMixLargeChatFrame\");<\/p>\n<p>        const notice =<br \/>\n          document.getElementById(\"orMixLargeChatNotice\");<\/p>\n<p>        if(frame){<br \/>\n          frame.style.display =<br \/>\n            abierto ? \"block\" : \"none\";<br \/>\n        }<\/p>\n<p>        if(notice){<br \/>\n          notice.style.display =<br \/>\n            abierto ? \"none\" : \"flex\";<br \/>\n        }<\/p>\n<p>      }catch(error){<\/p>\n<p>        const frame =<br \/>\n          document.getElementById(\"orMixLargeChatFrame\");<\/p>\n<p>        const notice =<br \/>\n          document.getElementById(\"orMixLargeChatNotice\");<\/p>\n<p>        if(frame){<br \/>\n          frame.style.display = \"none\";<br \/>\n        }<\/p>\n<p>        if(notice){<br \/>\n          notice.style.display = \"flex\";<br \/>\n        }<\/p>\n<p>      }<\/p>\n<p>    }<\/p>\n<p>    checkLargeChat();<br \/>\n    setInterval(checkLargeChat,3000);<\/p>\n<p>  }<\/p>\n<p>  if(popupMode){<\/p>\n<p>    if(document.readyState === \"loading\"){<\/p>\n<p>      document.addEventListener(<br \/>\n        \"DOMContentLoaded\",<br \/>\n        renderLargeChat<br \/>\n      );<\/p>\n<p>    }else{<\/p>\n<p>      renderLargeChat();<\/p>\n<p>    }<\/p>\n<p>    return;<\/p>\n<p>  }<\/p>\n<p>  \/* =========================================================<br \/>\n     PAGINA NORMAL MIXES & DJS<br \/>\n  ========================================================= *\/<\/p>\n<p>  function startNormalChatControl(){<\/p>\n<p>    const frame =<br \/>\n      document.getElementById(\"ormixChatFrame\");<\/p>\n<p>    const lock =<br \/>\n      document.getElementById(\"ormixChatLock\");<\/p>\n<p>    const bar =<br \/>\n      document.getElementById(\"ormixChatStatusBar\");<\/p>\n<p>    if(!frame || !lock){<br \/>\n      return;<br \/>\n    }<\/p>\n<p>    \/* Crear nuevamente el acceso grande que se hab\u00eda perdido *\/<\/p>\n<p>    let access =<br \/>\n      document.getElementById(\"orMixChatAccess\");<\/p>\n<p>    if(!access){<\/p>\n<p>      access = document.createElement(\"div\");<\/p>\n<p>      access.id = \"orMixChatAccess\";<\/p>\n<p>      access.style.cssText = `<br \/>\n        display:none;<br \/>\n        position:absolute;<br \/>\n        inset:0;<br \/>\n        z-index:6;<br \/>\n        align-items:center;<br \/>\n        justify-content:center;<br \/>\n        padding:24px;<br \/>\n        box-sizing:border-box;<br \/>\n        background:<br \/>\n          linear-gradient(<br \/>\n            145deg,<br \/>\n            rgba(5,9,20,.97),<br \/>\n            rgba(10,18,34,.97)<br \/>\n          );<br \/>\n      `;<\/p>\n<p>      access.innerHTML = `<\/p>\n<div style=\"\n          width:min(520px,92%);\n          padding:30px 25px;\n          border-radius:19px;\n          border:1px solid rgba(118,221,255,.28);\n          background:rgba(10,18,31,.94);\n          text-align:center;\n          box-shadow:0 20px 55px rgba(0,0,0,.38);\n        \"><\/p>\n<div style=\"\n            font-size:11px;\n            letter-spacing:1.8px;\n            color:#76ddff;\n            font-weight:900;\n            margin-bottom:9px;\n          \"><br \/>\n            CHAT OR MUSIC LIVE\n          <\/div>\n<div style=\"\n            font-size:26px;\n            font-weight:900;\n            color:#fff;\n            margin-bottom:9px;\n          \"><br \/>\n            Chat habilitado\n          <\/div>\n<div style=\"\n            font-size:13px;\n            line-height:1.55;\n            color:#aab4c3;\n            margin-bottom:21px;\n          \"><br \/>\n            Entra a la sala en una ventana grande<br \/>\n            para seguir c\u00f3modamente toda la conversaci\u00f3n.\n          <\/div>\n<p>          <button\n            type=\"button\"\n            id=\"orMixChatEnterButton\"\n            style=\"\n              width:100%;\n              min-height:54px;\n              border:1px solid rgba(118,221,255,.35);\n              border-radius:13px;\n              background:\n                linear-gradient(\n                  135deg,\n                  #0d8db7,\n                  #165f9c\n                );\n              color:#fff;\n              font-size:15px;\n              font-weight:900;\n              letter-spacing:.6px;\n              cursor:pointer;\n              box-shadow:\n                0 10px 28px rgba(0,116,170,.20);\n            \"\n          ><br \/>\n            \u2197 ACCEDER AL CHAT<br \/>\n          <\/button><\/p>\n<\/div>\n<p>      `;<\/p>\n<p>      frame.appendChild(access);<\/p>\n<p>    }<\/p>\n<p>    const enterButton =<br \/>\n      document.getElementById(\"orMixChatEnterButton\");<\/p>\n<p>    if(enterButton){<\/p>\n<p>      enterButton.addEventListener(<br \/>\n        \"click\",<br \/>\n        function(){<\/p>\n<p>          const url =<br \/>\n            new URL(window.location.href);<\/p>\n<p>          url.searchParams.set(<br \/>\n            \"or_chat_popup\",<br \/>\n            \"mixes\"<br \/>\n          );<\/p>\n<p>          window.open(<br \/>\n            url.toString(),<br \/>\n            \"ORMusicLiveChatMixes\",<br \/>\n            \"width=1180,height=850,resizable=yes,scrollbars=yes\"<br \/>\n          );<\/p>\n<p>        }<br \/>\n      );<\/p>\n<p>    }<\/p>\n<p>    function setChatState(enabled){<\/p>\n<p>      const iframe =<br \/>\n        frame.querySelector(\"iframe\");<\/p>\n<p>      if(enabled){<\/p>\n<p>        frame.classList.remove(\"is-locked\");<\/p>\n<p>        lock.style.display = \"none\";<\/p>\n<p>        \/*<br \/>\n          El chat peque\u00f1o se oculta.<br \/>\n          Se muestra el bot\u00f3n para entrar al chat grande.<br \/>\n        *\/<br \/>\n        if(iframe){<br \/>\n          iframe.style.display = \"none\";<br \/>\n        }<\/p>\n<p>        access.style.display = \"flex\";<\/p>\n<p>        if(bar){<br \/>\n          bar.textContent =<br \/>\n            \"\u25cf CHAT HABILITADO \u00b7 ACCEDE A LA SALA\";<br \/>\n        }<\/p>\n<p>      }else{<\/p>\n<p>        frame.classList.add(\"is-locked\");<\/p>\n<p>        lock.style.display = \"\";<\/p>\n<p>        \/*<br \/>\n          Cuando est\u00e1 cerrado vuelve el fondo del chat<br \/>\n          debajo del bloqueo, igual que antes.<br \/>\n        *\/<br \/>\n        if(iframe){<br \/>\n          iframe.style.display = \"block\";<br \/>\n        }<\/p>\n<p>        access.style.display = \"none\";<\/p>\n<p>        if(bar){<br \/>\n          bar.textContent =<br \/>\n            \"CHAT DISPONIBLE DURANTE EVENTOS EN VIVO\";<br \/>\n        }<\/p>\n<p>      }<\/p>\n<p>    }<\/p>\n<p>    async function updateChatState(){<\/p>\n<p>      try{<\/p>\n<p>        const response = await fetch(<br \/>\n          CHAT_STATUS_URL + \"?t=\" + Date.now(),<br \/>\n          {<br \/>\n            cache:\"no-store\"<br \/>\n          }<br \/>\n        );<\/p>\n<p>        if(!response.ok){<br \/>\n          throw new Error(\"status\");<br \/>\n        }<\/p>\n<p>        const data =<br \/>\n          await response.json();<\/p>\n<p>        setChatState(<br \/>\n          !!(<br \/>\n            data &&<br \/>\n            data.enabled === true<br \/>\n          )<br \/>\n        );<\/p>\n<p>      }catch(error){<\/p>\n<p>        \/*<br \/>\n          Si el panel no responde,<br \/>\n          por seguridad queda cerrado.<br \/>\n        *\/<br \/>\n        setChatState(false);<\/p>\n<p>      }<\/p>\n<p>    }<\/p>\n<p>    updateChatState();<\/p>\n<p>    setInterval(<br \/>\n      updateChatState,<br \/>\n      3000<br \/>\n    );<\/p>\n<p>  }<\/p>\n<p>  if(document.readyState === \"loading\"){<\/p>\n<p>    document.addEventListener(<br \/>\n      \"DOMContentLoaded\",<br \/>\n      startNormalChatControl<br \/>\n    );<\/p>\n<p>  }else{<\/p>\n<p>    startNormalChatControl();<\/p>\n<p>  }<\/p>\n<p>})();<br \/>\n<\/script><br \/>\n<!-- OR MIXES CHAT PANEL CONTROL END --><\/p>\n<style>\n\/* OR MIXES HOME FINAL START *\/<\/p>\n<p>.ormix-header{<br \/>\n  display:flex !important;<br \/>\n  align-items:flex-start !important;<br \/>\n  justify-content:space-between !important;<br \/>\n  gap:40px !important;<br \/>\n}<\/p>\n<p>.ormix-home{<br \/>\n  position:relative !important;<br \/>\n  display:inline-flex !important;<br \/>\n  align-items:center !important;<br \/>\n  justify-content:center !important;<br \/>\n  gap:10px !important;<\/p>\n<p>  min-width:142px !important;<br \/>\n  height:54px !important;<br \/>\n  padding:0 20px !important;<\/p>\n<p>  margin-left:auto !important;<\/p>\n<p>  border:1px solid rgba(116,220,255,.42) !important;<br \/>\n  border-radius:16px !important;<\/p>\n<p>  background:<br \/>\n    linear-gradient(<br \/>\n      135deg,<br \/>\n      rgba(15,24,42,.96),<br \/>\n      rgba(12,17,31,.96)<br \/>\n    ) !important;<\/p>\n<p>  box-shadow:<br \/>\n    0 8px 28px rgba(0,0,0,.32),<br \/>\n    0 0 18px rgba(77,198,255,.10),<br \/>\n    inset 0 1px 0 rgba(255,255,255,.06) !important;<\/p>\n<p>  color:#ffffff !important;<br \/>\n  text-decoration:none !important;<\/p>\n<p>  font-size:13px !important;<br \/>\n  line-height:1 !important;<br \/>\n  font-weight:900 !important;<br \/>\n  letter-spacing:1.3px !important;<\/p>\n<p>  transform:translateY(12px) !important;<\/p>\n<p>  transition:<br \/>\n    border-color .22s ease,<br \/>\n    box-shadow .22s ease,<br \/>\n    background .22s ease !important;<br \/>\n}<\/p>\n<p>.ormix-home svg{<br \/>\n  width:20px !important;<br \/>\n  height:20px !important;<br \/>\n  flex:0 0 20px !important;<\/p>\n<p>  fill:none !important;<br \/>\n  stroke:#76ddff !important;<br \/>\n  stroke-width:1.9 !important;<br \/>\n  stroke-linecap:round !important;<br \/>\n  stroke-linejoin:round !important;<\/p>\n<p>  filter:<br \/>\n    drop-shadow(0 0 5px rgba(118,221,255,.32)) !important;<br \/>\n}<\/p>\n<p>.ormix-home:hover{<br \/>\n  color:#ffffff !important;<br \/>\n  text-decoration:none !important;<\/p>\n<p>  border-color:rgba(169,117,255,.68) !important;<\/p>\n<p>  background:<br \/>\n    linear-gradient(<br \/>\n      135deg,<br \/>\n      rgba(18,31,52,.98),<br \/>\n      rgba(20,19,42,.98)<br \/>\n    ) !important;<\/p>\n<p>  box-shadow:<br \/>\n    0 10px 32px rgba(0,0,0,.38),<br \/>\n    0 0 22px rgba(83,207,255,.16),<br \/>\n    0 0 18px rgba(155,104,255,.12),<br \/>\n    inset 0 1px 0 rgba(255,255,255,.08) !important;<\/p>\n<p>  transform:translateY(12px) !important;<br \/>\n}<\/p>\n<p>.ormix-home:active{<br \/>\n  transform:translateY(12px) scale(.98) !important;<br \/>\n}<\/p>\n<p>@media(max-width:650px){<\/p>\n<p>  .ormix-header{<br \/>\n    flex-direction:column !important;<br \/>\n    gap:12px !important;<br \/>\n  }<\/p>\n<p>  .ormix-home{<br \/>\n    min-width:124px !important;<br \/>\n    height:48px !important;<br \/>\n    padding:0 17px !important;<\/p>\n<p>    align-self:flex-end !important;<br \/>\n    margin-left:0 !important;<\/p>\n<p>    border-radius:14px !important;<\/p>\n<p>    transform:translateY(7px) !important;<br \/>\n  }<\/p>\n<p>  .ormix-home:hover{<br \/>\n    transform:translateY(7px) !important;<br \/>\n  }<\/p>\n<p>  .ormix-home:active{<br \/>\n    transform:translateY(7px) scale(.98) !important;<br \/>\n  }<\/p>\n<p>  .ormix-home svg{<br \/>\n    width:18px !important;<br \/>\n    height:18px !important;<br \/>\n    flex-basis:18px !important;<br \/>\n  }<\/p>\n<p>}<\/p>\n<p>\/* OR MIXES HOME FINAL END *\/<br \/>\n<\/style>\n<p><!-- =========================================================\n     OR MIXES \u00b7 NOMBRE DJ EN VIVO \u00b7 20260829\n========================================================= --><\/p>\n<style>\n<p>.ormix-dj-live-badge{<br \/>\n  font-size:13px!important;<br \/>\n  letter-spacing:.7px!important;<br \/>\n  max-width:90%;<br \/>\n}<\/p>\n<p>.ormix-dj-live-badge b{<br \/>\n  overflow:hidden;<br \/>\n  text-overflow:ellipsis;<br \/>\n}<\/p>\n<p>@media(max-width:620px){<\/p>\n<p>  .ormix-dj-live-badge{<br \/>\n    font-size:10px!important;<br \/>\n    max-width:96%;<br \/>\n  }<\/p>\n<p>}<\/p>\n<\/style>\n<p><!--\nOR MIXES \u00b7 DJ LIVE SELECCION PANEL \u00b7 20260829\n\nAzuraCast = confirma que existe transmisi\u00f3n.\nPanel privado = selecciona nombre + logo del DJ.\n--><\/p>\n<style id=\"or-mixes-multimedia-v2-style\">\n<p>\/* OR_MIXES_MULTIMEDIA_V2_20260915 *\/<\/p>\n<p>\/*<br \/>\n La pantalla ya es 16:9.<br \/>\n V2 utiliza el cuadro completo.<br \/>\n*\/<\/p>\n<p>#orMixPromoLayer<br \/>\n#orMixPromoImage,<\/p>\n<p>#orMixPromoLayer<br \/>\n#orMixPromoVideo{<\/p>\n<p>    width:100% !important;<br \/>\n    height:100% !important;<\/p>\n<p>    object-fit:cover !important;<br \/>\n    object-position:center center !important;<\/p>\n<p>    background:#02030a !important;<br \/>\n}<\/p>\n<p>\/*<br \/>\n El layer V2 est\u00e1 en z-index 7.<br \/>\n Los indicadores superiores de Mixes<br \/>\n permanecen encima en z-index 8.<br \/>\n*\/<\/p>\n<\/style>\n<p><script><\/p>\n<p>(function(){<\/p>\n<p>    const API =<br \/>\n        \"https:\/\/video.ormusiclive.com:9444\/api\/multimedia\/output?platform=web&screen=mixes\";<\/p>\n<p>    const BASE =<br \/>\n        \"https:\/\/video.ormusiclive.com:9444\";<\/p>\n<p>    const HLS_SRC =<br \/>\n        \"https:\/\/cdn.jsdelivr.net\/npm\/hls.js@1\/dist\/hls.min.js\";<\/p>\n<p>    let stateSignature = \"\";<\/p>\n<p>    let sequenceToken = 0;<\/p>\n<p>    let timer = null;<\/p>\n<p>    let hls = null;<\/p>\n<p>    let hlsPromise = null;<\/p>\n<p>    window.OR_MIX_V2_ACTIVE =<br \/>\n        false;<\/p>\n<p>    function screen(){<\/p>\n<p>        return document.getElementById(<br \/>\n            \"orMixPromoLayer\"<br \/>\n        );<br \/>\n    }<\/p>\n<p>    function image(){<\/p>\n<p>        return document.getElementById(<br \/>\n            \"orMixPromoImage\"<br \/>\n        );<br \/>\n    }<\/p>\n<p>    function video(){<\/p>\n<p>        return document.getElementById(<br \/>\n            \"orMixPromoVideo\"<br \/>\n        );<br \/>\n    }<\/p>\n<p>    function stop(){<\/p>\n<p>        if(timer){<\/p>\n<p>            clearTimeout(timer);<\/p>\n<p>            timer = null;<br \/>\n        }<\/p>\n<p>        const v = video();<\/p>\n<p>        if(v){<\/p>\n<p>            v.onended = null;<br \/>\n            v.onerror = null;<\/p>\n<p>            try{<br \/>\n                v.pause();<br \/>\n            }catch(e){}<\/p>\n<p>            v.classList.remove(<br \/>\n                \"is-active\"<br \/>\n            );<\/p>\n<p>            try{<br \/>\n                v.removeAttribute(\"src\");<br \/>\n                v.load();<br \/>\n            }catch(e){}<br \/>\n        }<\/p>\n<p>        const img = image();<\/p>\n<p>        if(img){<\/p>\n<p>            img.onload = null;<br \/>\n            img.onerror = null;<\/p>\n<p>            img.classList.remove(<br \/>\n                \"is-active\"<br \/>\n            );<\/p>\n<p>            img.removeAttribute(<br \/>\n                \"src\"<br \/>\n            );<br \/>\n        }<\/p>\n<p>        if(hls){<\/p>\n<p>            try{<br \/>\n                hls.destroy();<br \/>\n            }catch(e){}<\/p>\n<p>            hls = null;<br \/>\n        }<br \/>\n    }<\/p>\n<p>    function normalMode(){<\/p>\n<p>        sequenceToken += 1;<\/p>\n<p>        window.OR_MIX_V2_ACTIVE =<br \/>\n            false;<\/p>\n<p>        stop();<\/p>\n<p>        const layer = screen();<\/p>\n<p>        if(layer){<\/p>\n<p>            layer.classList.remove(<br \/>\n                \"is-active\"<br \/>\n            );<\/p>\n<p>            layer.setAttribute(<br \/>\n                \"aria-hidden\",<br \/>\n                \"true\"<br \/>\n            );<br \/>\n        }<\/p>\n<p>        \/*<br \/>\n         Recuperar identificaci\u00f3n visual<br \/>\n         normal del DJ inmediatamente.<br \/>\n        *\/<\/p>\n<p>        try{<\/p>\n<p>            if(<br \/>\n                typeof orMixUpdateDJImage<br \/>\n                === \"function\"<br \/>\n            ){<\/p>\n<p>                orMixUpdateDJImage();<br \/>\n            }<\/p>\n<p>        }catch(e){}<br \/>\n    }<\/p>\n<p>    function activate(){<\/p>\n<p>        const layer = screen();<\/p>\n<p>        if(!layer){<br \/>\n            return null;<br \/>\n        }<\/p>\n<p>        window.OR_MIX_V2_ACTIVE =<br \/>\n            true;<\/p>\n<p>        try{<\/p>\n<p>            if(<br \/>\n                typeof orMixStopDJMediaRotation<br \/>\n                === \"function\"<br \/>\n            ){<\/p>\n<p>                orMixStopDJMediaRotation();<br \/>\n            }<\/p>\n<p>        }catch(e){}<\/p>\n<p>        stop();<\/p>\n<p>        layer.classList.add(<br \/>\n            \"is-active\"<br \/>\n        );<\/p>\n<p>        layer.setAttribute(<br \/>\n            \"aria-hidden\",<br \/>\n            \"false\"<br \/>\n        );<\/p>\n<p>        return layer;<br \/>\n    }<\/p>\n<p>    function absoluteUrl(value){<\/p>\n<p>        if(!value){<br \/>\n            return \"\";<br \/>\n        }<\/p>\n<p>        try{<\/p>\n<p>            return new URL(<br \/>\n                value,<br \/>\n                BASE<br \/>\n            ).href;<\/p>\n<p>        }catch(e){<\/p>\n<p>            return \"\";<br \/>\n        }<br \/>\n    }<\/p>\n<p>    function loadHls(){<\/p>\n<p>        if(window.Hls){<\/p>\n<p>            return Promise.resolve(<br \/>\n                window.Hls<br \/>\n            );<br \/>\n        }<\/p>\n<p>        if(hlsPromise){<\/p>\n<p>            return hlsPromise;<br \/>\n        }<\/p>\n<p>        hlsPromise =<br \/>\n            new Promise(<br \/>\n                function(<br \/>\n                    resolve,<br \/>\n                    reject<br \/>\n                ){<\/p>\n<p>                    const existing =<br \/>\n                        document.querySelector(<br \/>\n                            \"script[data-or-mix-v2-hls]\"<br \/>\n                        );<\/p>\n<p>                    if(existing){<\/p>\n<p>                        existing.addEventListener(<br \/>\n                            \"load\",<br \/>\n                            function(){<br \/>\n                                resolve(<br \/>\n                                    window.Hls<br \/>\n                                );<br \/>\n                            },<br \/>\n                            {once:true}<br \/>\n                        );<\/p>\n<p>                        existing.addEventListener(<br \/>\n                            \"error\",<br \/>\n                            reject,<br \/>\n                            {once:true}<br \/>\n                        );<\/p>\n<p>                        return;<br \/>\n                    }<\/p>\n<p>                    const script =<br \/>\n                        document.createElement(<br \/>\n                            \"script\"<br \/>\n                        );<\/p>\n<p>                    script.src =<br \/>\n                        HLS_SRC;<\/p>\n<p>                    script.async =<br \/>\n                        true;<\/p>\n<p>                    script.dataset.orMixV2Hls =<br \/>\n                        \"1\";<\/p>\n<p>                    script.onload =<br \/>\n                        function(){<\/p>\n<p>                            if(window.Hls){<\/p>\n<p>                                resolve(<br \/>\n                                    window.Hls<br \/>\n                                );<\/p>\n<p>                            }else{<\/p>\n<p>                                reject(<br \/>\n                                    new Error(<br \/>\n                                        \"HLS no disponible\"<br \/>\n                                    )<br \/>\n                                );<br \/>\n                            }<br \/>\n                        };<\/p>\n<p>                    script.onerror =<br \/>\n                        reject;<\/p>\n<p>                    document.head.appendChild(<br \/>\n                        script<br \/>\n                    );<br \/>\n                }<br \/>\n            );<\/p>\n<p>        return hlsPromise;<br \/>\n    }<\/p>\n<p>    function showImage(<br \/>\n        item,<br \/>\n        seconds,<br \/>\n        token,<br \/>\n        next<br \/>\n    ){<\/p>\n<p>        if(<br \/>\n            token !==<br \/>\n            sequenceToken<br \/>\n        ){<br \/>\n            return;<br \/>\n        }<\/p>\n<p>        if(!activate()){<br \/>\n            return;<br \/>\n        }<\/p>\n<p>        const img = image();<\/p>\n<p>        if(!img){<br \/>\n            return;<br \/>\n        }<\/p>\n<p>        img.onload =<br \/>\n            function(){<\/p>\n<p>                if(<br \/>\n                    token !==<br \/>\n                    sequenceToken<br \/>\n                ){<br \/>\n                    return;<br \/>\n                }<\/p>\n<p>                img.classList.add(<br \/>\n                    \"is-active\"<br \/>\n                );<\/p>\n<p>                timer =<br \/>\n                    setTimeout(<br \/>\n                        next,<br \/>\n                        Math.max(<br \/>\n                            1,<br \/>\n                            Number(seconds) || 10<br \/>\n                        ) * 1000<br \/>\n                    );<br \/>\n            };<\/p>\n<p>        img.onerror =<br \/>\n            function(){<\/p>\n<p>                timer =<br \/>\n                    setTimeout(<br \/>\n                        next,<br \/>\n                        1000<br \/>\n                    );<br \/>\n            };<\/p>\n<p>        img.src =<br \/>\n            absoluteUrl(<br \/>\n                item.media_url<br \/>\n            );<br \/>\n    }<\/p>\n<p>    async function showVideo(<br \/>\n        item,<br \/>\n        token,<br \/>\n        next<br \/>\n    ){<\/p>\n<p>        if(<br \/>\n            token !==<br \/>\n            sequenceToken<br \/>\n        ){<br \/>\n            return;<br \/>\n        }<\/p>\n<p>        if(!activate()){<br \/>\n            return;<br \/>\n        }<\/p>\n<p>        const v = video();<\/p>\n<p>        if(!v){<br \/>\n            return;<br \/>\n        }<\/p>\n<p>        \/*<br \/>\n         El audio de Mixes sigue siendo<br \/>\n         el audio principal.<br \/>\n         La multimedia visual va muteada.<br \/>\n        *\/<\/p>\n<p>        v.autoplay = true;<br \/>\n        v.playsInline = true;<br \/>\n        v.preload = \"metadata\";<br \/>\n        v.controls = false;<br \/>\n        v.loop = false;<\/p>\n<p>        v.muted = true;<br \/>\n        v.defaultMuted = true;<\/p>\n<p>        let finished = false;<\/p>\n<p>        function finish(){<\/p>\n<p>            if(finished){<br \/>\n                return;<br \/>\n            }<\/p>\n<p>            finished = true;<\/p>\n<p>            if(<br \/>\n                token ===<br \/>\n                sequenceToken<br \/>\n            ){<br \/>\n                next();<br \/>\n            }<br \/>\n        }<\/p>\n<p>        v.onended = finish;<\/p>\n<p>        v.onerror =<br \/>\n            function(){<\/p>\n<p>                timer =<br \/>\n                    setTimeout(<br \/>\n                        finish,<br \/>\n                        1000<br \/>\n                    );<br \/>\n            };<\/p>\n<p>        const url =<br \/>\n            absoluteUrl(<br \/>\n                item.media_url<br \/>\n            );<\/p>\n<p>        if(!url){<\/p>\n<p>            finish();<\/p>\n<p>            return;<br \/>\n        }<\/p>\n<p>        v.classList.add(<br \/>\n            \"is-active\"<br \/>\n        );<\/p>\n<p>        \/*<br \/>\n         Safari<br \/>\n        *\/<\/p>\n<p>        if(<br \/>\n            v.canPlayType(<br \/>\n                \"application\/vnd.apple.mpegurl\"<br \/>\n            )<br \/>\n        ){<\/p>\n<p>            v.src = url;<\/p>\n<p>            v.play()<br \/>\n            .catch(<br \/>\n                function(){}<br \/>\n            );<\/p>\n<p>            return;<br \/>\n        }<\/p>\n<p>        \/*<br \/>\n         Chrome \/ Firefox<br \/>\n        *\/<\/p>\n<p>        try{<\/p>\n<p>            const HlsClass =<br \/>\n                await loadHls();<\/p>\n<p>            if(<br \/>\n                token !==<br \/>\n                sequenceToken<br \/>\n            ){<br \/>\n                return;<br \/>\n            }<\/p>\n<p>            if(<br \/>\n                HlsClass<br \/>\n                &&<br \/>\n                HlsClass.isSupported()<br \/>\n            ){<\/p>\n<p>                hls =<br \/>\n                    new HlsClass({<br \/>\n                        enableWorker:true<br \/>\n                    });<\/p>\n<p>                hls.loadSource(url);<\/p>\n<p>                hls.attachMedia(v);<\/p>\n<p>                hls.on(<br \/>\n                    HlsClass.Events.MANIFEST_PARSED,<br \/>\n                    function(){<\/p>\n<p>                        v.play()<br \/>\n                        .catch(<br \/>\n                            function(){}<br \/>\n                        );<br \/>\n                    }<br \/>\n                );<\/p>\n<p>                hls.on(<br \/>\n                    HlsClass.Events.ERROR,<br \/>\n                    function(<br \/>\n                        event,<br \/>\n                        data<br \/>\n                    ){<\/p>\n<p>                        if(<br \/>\n                            data<br \/>\n                            &&<br \/>\n                            data.fatal<br \/>\n                        ){<\/p>\n<p>                            finish();<br \/>\n                        }<br \/>\n                    }<br \/>\n                );<\/p>\n<p>                return;<br \/>\n            }<\/p>\n<p>        }catch(e){}<\/p>\n<p>        finish();<br \/>\n    }<\/p>\n<p>    function run(data){<\/p>\n<p>        const items =<br \/>\n            Array.isArray(data.items)<br \/>\n            ? data.items<br \/>\n            : [];<\/p>\n<p>        if(<br \/>\n            !data.enabled<br \/>\n            ||<br \/>\n            !items.length<br \/>\n        ){<\/p>\n<p>            normalMode();<\/p>\n<p>            return;<br \/>\n        }<\/p>\n<p>        sequenceToken += 1;<\/p>\n<p>        const token =<br \/>\n            sequenceToken;<\/p>\n<p>        let index = 0;<\/p>\n<p>        const imageSeconds =<br \/>\n            Math.max(<br \/>\n                1,<br \/>\n                Number(<br \/>\n                    data.image_duration_seconds<br \/>\n                ) || 10<br \/>\n            );<\/p>\n<p>        function next(){<\/p>\n<p>            if(<br \/>\n                token !==<br \/>\n                sequenceToken<br \/>\n            ){<br \/>\n                return;<br \/>\n            }<\/p>\n<p>            stop();<\/p>\n<p>            const item =<br \/>\n                items[<br \/>\n                    index %<br \/>\n                    items.length<br \/>\n                ];<\/p>\n<p>            index =<br \/>\n                (<br \/>\n                    index + 1<br \/>\n                ) %<br \/>\n                items.length;<\/p>\n<p>            if(<br \/>\n                item.kind ===<br \/>\n                \"video\"<br \/>\n            ){<\/p>\n<p>                showVideo(<br \/>\n                    item,<br \/>\n                    token,<br \/>\n                    next<br \/>\n                );<\/p>\n<p>                return;<br \/>\n            }<\/p>\n<p>            if(<br \/>\n                item.kind ===<br \/>\n                \"image\"<br \/>\n            ){<\/p>\n<p>                showImage(<br \/>\n                    item,<br \/>\n                    imageSeconds,<br \/>\n                    token,<br \/>\n                    next<br \/>\n                );<\/p>\n<p>                return;<br \/>\n            }<\/p>\n<p>            timer =<br \/>\n                setTimeout(<br \/>\n                    next,<br \/>\n                    1000<br \/>\n                );<br \/>\n        }<\/p>\n<p>        next();<br \/>\n    }<\/p>\n<p>    function signature(data){<\/p>\n<p>        return JSON.stringify({<br \/>\n            enabled:<br \/>\n                !!data.enabled,<\/p>\n<p>            duration:<br \/>\n                Number(<br \/>\n                    data.image_duration_seconds<br \/>\n                ) || 10,<\/p>\n<p>            items:<br \/>\n                Array.isArray(data.items)<br \/>\n                ? data.items<br \/>\n                : []<br \/>\n        });<br \/>\n    }<\/p>\n<p>    async function refresh(){<\/p>\n<p>        try{<\/p>\n<p>            const response =<br \/>\n                await fetch(<br \/>\n                    API<br \/>\n                    + \"&t=\"<br \/>\n                    + Date.now(),<br \/>\n                    {<br \/>\n                        cache:\"no-store\"<br \/>\n                    }<br \/>\n                );<\/p>\n<p>            if(!response.ok){<\/p>\n<p>                throw new Error(<br \/>\n                    \"HTTP \"<br \/>\n                    + response.status<br \/>\n                );<br \/>\n            }<\/p>\n<p>            const data =<br \/>\n                await response.json();<\/p>\n<p>            const nextSignature =<br \/>\n                signature(data);<\/p>\n<p>            if(<br \/>\n                nextSignature !==<br \/>\n                stateSignature<br \/>\n            ){<\/p>\n<p>                stateSignature =<br \/>\n                    nextSignature;<\/p>\n<p>                run(data);<br \/>\n            }<\/p>\n<p>        }catch(e){<\/p>\n<p>            if(<br \/>\n                stateSignature !==<br \/>\n                \"NORMAL_FALLBACK\"<br \/>\n            ){<\/p>\n<p>                stateSignature =<br \/>\n                    \"NORMAL_FALLBACK\";<\/p>\n<p>                normalMode();<br \/>\n            }<br \/>\n        }<br \/>\n    }<\/p>\n<p>    \/*<br \/>\n     Detener cualquier promoci\u00f3n antigua<br \/>\n     que estuviera corriendo.<br \/>\n    *\/<\/p>\n<p>    try{<\/p>\n<p>        if(<br \/>\n            typeof orMixStopPromoRotation<br \/>\n            === \"function\"<br \/>\n        ){<\/p>\n<p>            orMixStopPromoRotation(<br \/>\n                true<br \/>\n            );<br \/>\n        }<\/p>\n<p>    }catch(e){}<\/p>\n<p>    normalMode();<\/p>\n<p>    refresh();<\/p>\n<p>    setInterval(<br \/>\n        refresh,<br \/>\n        5000<br \/>\n    );<\/p>\n<p>})();<\/p>\n<p><\/script><\/p>\n<style id=\"or-mixes-texts-v2-style\">\n<p>\/* OR_MIXES_TEXTS_V2_20260916 *\/<\/p>\n<p>#orMixTextV2{<\/p>\n<p>    display:none;<\/p>\n<p>    position:relative;<\/p>\n<p>    z-index:6;<\/p>\n<p>    width:<br \/>\n        calc(100% - 40px);<\/p>\n<p>    min-height:115px;<\/p>\n<p>    margin:<br \/>\n        18px 20px 0;<\/p>\n<p>    padding:<br \/>\n        20px 24px;<\/p>\n<p>    box-sizing:border-box;<\/p>\n<p>    align-items:center;<\/p>\n<p>    border-radius:17px;<\/p>\n<p>    border:<br \/>\n        1px solid<br \/>\n        rgba(255,255,255,.12);<\/p>\n<p>    background:<br \/>\n        linear-gradient(<br \/>\n            145deg,<br \/>\n            rgba(7,11,18,.97),<br \/>\n            rgba(12,18,29,.97)<br \/>\n        );<\/p>\n<p>    color:#fff;<\/p>\n<p>    font-size:<br \/>\n        clamp(<br \/>\n            17px,<br \/>\n            1.8vw,<br \/>\n            27px<br \/>\n        );<\/p>\n<p>    line-height:1.35;<\/p>\n<p>    font-weight:900;<\/p>\n<p>    white-space:pre-wrap;<\/p>\n<p>    overflow-wrap:break-word;<\/p>\n<p>    word-break:normal;<br \/>\n}<\/p>\n<p>#orMixTextV2.is-active{<\/p>\n<p>    display:flex;<br \/>\n}<\/p>\n<p>#orMixTextV2Inner{<\/p>\n<p>    display:block;<\/p>\n<p>    width:100%;<\/p>\n<p>    min-width:0;<\/p>\n<p>    white-space:pre-wrap;<\/p>\n<p>    overflow-wrap:break-word;<\/p>\n<p>    word-break:normal;<br \/>\n}<\/p>\n<p>\/* ILUMINADO *\/<\/p>\n<p>#orMixTextV2.effect-glow{<\/p>\n<p>    border:<br \/>\n        1px solid<br \/>\n        currentColor;<\/p>\n<p>    box-shadow:<br \/>\n        0 0<br \/>\n        var(--ormix-glow-1,4px)<br \/>\n        currentColor,<\/p>\n<p>        0 0<br \/>\n        var(--ormix-glow-2,14px)<br \/>\n        currentColor,<\/p>\n<p>        0 0<br \/>\n        var(--ormix-glow-3,24px)<br \/>\n        currentColor;<\/p>\n<p>    text-shadow:<br \/>\n        0 0<br \/>\n        var(--ormix-glow-1,4px)<br \/>\n        currentColor,<\/p>\n<p>        0 0<br \/>\n        var(--ormix-glow-2,12px)<br \/>\n        currentColor;<\/p>\n<p>    filter:<br \/>\n        brightness(<br \/>\n            var(<br \/>\n                --ormix-brightness,<br \/>\n                1.15<br \/>\n            )<br \/>\n        )<\/p>\n<p>        saturate(<br \/>\n            var(<br \/>\n                --ormix-saturation,<br \/>\n                1.12<br \/>\n            )<br \/>\n        );<br \/>\n}<\/p>\n<p>\/* PULSANTE *\/<\/p>\n<p>#orMixTextV2.effect-pulse{<\/p>\n<p>    border:<br \/>\n        1px solid<br \/>\n        currentColor;<\/p>\n<p>    animation:<br \/>\n        orMixTextPulse<br \/>\n        var(<br \/>\n            --ormix-pulse-speed,<br \/>\n            1.05s<br \/>\n        )<br \/>\n        ease-in-out<br \/>\n        infinite;<\/p>\n<p>    transform-origin:center;<br \/>\n}<\/p>\n<p>@keyframes orMixTextPulse{<\/p>\n<p>    0%,<br \/>\n    100%{<\/p>\n<p>        opacity:1;<\/p>\n<p>        transform:<br \/>\n            scale(<br \/>\n                var(<br \/>\n                    --ormix-pulse-high-scale,<br \/>\n                    1.006<br \/>\n                )<br \/>\n            );<\/p>\n<p>        filter:<br \/>\n            brightness(<br \/>\n                var(<br \/>\n                    --ormix-brightness,<br \/>\n                    1.18<br \/>\n                )<br \/>\n            )<br \/>\n            saturate(<br \/>\n                var(<br \/>\n                    --ormix-saturation,<br \/>\n                    1.12<br \/>\n                )<br \/>\n            );<\/p>\n<p>        box-shadow:<br \/>\n            0 0<br \/>\n            var(--ormix-glow-1,4px)<br \/>\n            currentColor,<\/p>\n<p>            0 0<br \/>\n            var(--ormix-glow-2,14px)<br \/>\n            currentColor,<\/p>\n<p>            0 0<br \/>\n            var(--ormix-glow-3,24px)<br \/>\n            currentColor;<\/p>\n<p>        text-shadow:<br \/>\n            0 0<br \/>\n            var(--ormix-glow-1,4px)<br \/>\n            currentColor,<\/p>\n<p>            0 0<br \/>\n            var(--ormix-glow-2,12px)<br \/>\n            currentColor;<br \/>\n    }<\/p>\n<p>    50%{<\/p>\n<p>        opacity:<br \/>\n            var(<br \/>\n                --ormix-pulse-low-opacity,<br \/>\n                .60<br \/>\n            );<\/p>\n<p>        transform:<br \/>\n            scale(<br \/>\n                var(<br \/>\n                    --ormix-pulse-low-scale,<br \/>\n                    .997<br \/>\n                )<br \/>\n            );<\/p>\n<p>        filter:<br \/>\n            brightness(.82)<br \/>\n            saturate(.92);<\/p>\n<p>        box-shadow:<br \/>\n            0 0 2px<br \/>\n            currentColor;<\/p>\n<p>        text-shadow:<br \/>\n            0 0 2px<br \/>\n            currentColor;<br \/>\n    }<\/p>\n<p>}<\/p>\n<p>@media(max-width:620px){<\/p>\n<p>    #orMixTextV2{<\/p>\n<p>        width:<br \/>\n            calc(100% - 24px);<\/p>\n<p>        min-height:95px;<\/p>\n<p>        margin:<br \/>\n            12px 12px 0;<\/p>\n<p>        padding:<br \/>\n            16px 15px;<\/p>\n<p>        font-size:<br \/>\n            clamp(<br \/>\n                16px,<br \/>\n                5vw,<br \/>\n                22px<br \/>\n            );<br \/>\n    }<\/p>\n<p>}<\/p>\n<\/style>\n<p><script><\/p>\n<p>\/* OR_MIXES_TEXTS_V2_20260916 *\/<\/p>\n<p>(function(){<\/p>\n<p>    const API =<br \/>\n        \"https:\/\/video.ormusiclive.com:9444\/api\/texts\/output?platform=web&screen=mixes\";<\/p>\n<p>    function ensureBox(){<\/p>\n<p>        const player =<br \/>\n            document.getElementById(<br \/>\n                \"ormixPlayer\"<br \/>\n            );<\/p>\n<p>        if(!player){<\/p>\n<p>            return null;<br \/>\n        }<\/p>\n<p>        let box =<br \/>\n            document.getElementById(<br \/>\n                \"orMixTextV2\"<br \/>\n            );<\/p>\n<p>        if(box){<\/p>\n<p>            return box;<br \/>\n        }<\/p>\n<p>        box =<br \/>\n            document.createElement(<br \/>\n                \"div\"<br \/>\n            );<\/p>\n<p>        box.id =<br \/>\n            \"orMixTextV2\";<\/p>\n<p>        box.setAttribute(<br \/>\n            \"aria-live\",<br \/>\n            \"polite\"<br \/>\n        );<\/p>\n<p>        const inner =<br \/>\n            document.createElement(<br \/>\n                \"div\"<br \/>\n            );<\/p>\n<p>        inner.id =<br \/>\n            \"orMixTextV2Inner\";<\/p>\n<p>        box.appendChild(<br \/>\n            inner<br \/>\n        );<\/p>\n<p>        const controls =<br \/>\n            player.querySelector(<br \/>\n                \".ormix-controls-area\"<br \/>\n            );<\/p>\n<p>        if(controls){<\/p>\n<p>            player.insertBefore(<br \/>\n                box,<br \/>\n                controls<br \/>\n            );<\/p>\n<p>        }else{<\/p>\n<p>            player.appendChild(<br \/>\n                box<br \/>\n            );<br \/>\n        }<\/p>\n<p>        return box;<br \/>\n    }<\/p>\n<p>    function cleanText(value){<\/p>\n<p>        return String(<br \/>\n            value || \"\"<br \/>\n        )<br \/>\n        .split(\/\\r?\\n\/)<br \/>\n        .map(<br \/>\n            function(line){<\/p>\n<p>                return line.trim();<br \/>\n            }<br \/>\n        )<br \/>\n        .join(\"\\n\");<br \/>\n    }<\/p>\n<p>    function hide(){<\/p>\n<p>        const box =<br \/>\n            ensureBox();<\/p>\n<p>        if(!box){<\/p>\n<p>            return;<br \/>\n        }<\/p>\n<p>        const inner =<br \/>\n            document.getElementById(<br \/>\n                \"orMixTextV2Inner\"<br \/>\n            );<\/p>\n<p>        box.className =<br \/>\n            \"\";<\/p>\n<p>        box.removeAttribute(<br \/>\n            \"style\"<br \/>\n        );<\/p>\n<p>        if(inner){<\/p>\n<p>            inner.textContent =<br \/>\n                \"\";<br \/>\n        }<br \/>\n    }<\/p>\n<p>    function show(message){<\/p>\n<p>        const box =<br \/>\n            ensureBox();<\/p>\n<p>        const inner =<br \/>\n            document.getElementById(<br \/>\n                \"orMixTextV2Inner\"<br \/>\n            );<\/p>\n<p>        if(<br \/>\n            !box<br \/>\n            ||<br \/>\n            !inner<br \/>\n            ||<br \/>\n            !message<br \/>\n        ){<\/p>\n<p>            hide();<\/p>\n<p>            return;<br \/>\n        }<\/p>\n<p>        const text =<br \/>\n            cleanText(<br \/>\n                message.text<br \/>\n            );<\/p>\n<p>        if(!text.trim()){<\/p>\n<p>            hide();<\/p>\n<p>            return;<br \/>\n        }<\/p>\n<p>        const effect =<br \/>\n            String(<br \/>\n                message.effect<br \/>\n                || \"normal\"<br \/>\n            );<\/p>\n<p>        const color =<br \/>\n            String(<br \/>\n                message.color<br \/>\n                || \"#ffffff\"<br \/>\n            );<\/p>\n<p>        const align =<br \/>\n            [<br \/>\n                \"left\",<br \/>\n                \"center\",<br \/>\n                \"right\"<br \/>\n            ].includes(<br \/>\n                String(<br \/>\n                    message.align<br \/>\n                    || \"center\"<br \/>\n                )<br \/>\n            )<br \/>\n            ? String(<br \/>\n                message.align<br \/>\n                || \"center\"<br \/>\n            )<br \/>\n            : \"center\";<\/p>\n<p>        const intensity =<br \/>\n            Math.max(<br \/>\n                0,<br \/>\n                Math.min(<br \/>\n                    100,<br \/>\n                    Number(<br \/>\n                        message.intensity<br \/>\n                        ?? 55<br \/>\n                    )<br \/>\n                )<br \/>\n            );<\/p>\n<p>        const level =<br \/>\n            intensity \/ 100;<\/p>\n<p>        const speeds = {<\/p>\n<p>            slow:\"1.55s\",<\/p>\n<p>            medium:\"1.05s\",<\/p>\n<p>            fast:\".72s\"<br \/>\n        };<\/p>\n<p>        inner.textContent =<br \/>\n            text;<\/p>\n<p>        inner.style.textAlign =<br \/>\n            align;<\/p>\n<p>        box.style.textAlign =<br \/>\n            align;<\/p>\n<p>        box.style.color =<br \/>\n            color;<\/p>\n<p>        box.className =<br \/>\n            \"is-active effect-\"<br \/>\n            + effect;<\/p>\n<p>        box.style.setProperty(<br \/>\n            \"--ormix-pulse-speed\",<\/p>\n<p>            speeds[<br \/>\n                String(<br \/>\n                    message.pulse_speed<br \/>\n                    || \"medium\"<br \/>\n                )<br \/>\n            ]<br \/>\n            || \"1.05s\"<br \/>\n        );<\/p>\n<p>        box.style.setProperty(<br \/>\n            \"--ormix-glow-1\",<\/p>\n<p>            Math.round(<br \/>\n                level * 7<br \/>\n            )<br \/>\n            + \"px\"<br \/>\n        );<\/p>\n<p>        box.style.setProperty(<br \/>\n            \"--ormix-glow-2\",<\/p>\n<p>            Math.round(<br \/>\n                level * 22<br \/>\n            )<br \/>\n            + \"px\"<br \/>\n        );<\/p>\n<p>        box.style.setProperty(<br \/>\n            \"--ormix-glow-3\",<\/p>\n<p>            Math.round(<br \/>\n                level * 38<br \/>\n            )<br \/>\n            + \"px\"<br \/>\n        );<\/p>\n<p>        box.style.setProperty(<br \/>\n            \"--ormix-brightness\",<\/p>\n<p>            String(<br \/>\n                1<br \/>\n                + level * .28<br \/>\n            )<br \/>\n        );<\/p>\n<p>        box.style.setProperty(<br \/>\n            \"--ormix-saturation\",<\/p>\n<p>            String(<br \/>\n                1<br \/>\n                + level * .25<br \/>\n            )<br \/>\n        );<\/p>\n<p>        box.style.setProperty(<br \/>\n            \"--ormix-pulse-low-opacity\",<\/p>\n<p>            String(<br \/>\n                .88<br \/>\n                - level * .50<br \/>\n            )<br \/>\n        );<\/p>\n<p>        box.style.setProperty(<br \/>\n            \"--ormix-pulse-high-scale\",<\/p>\n<p>            String(<br \/>\n                1<br \/>\n                + level * .010<br \/>\n            )<br \/>\n        );<\/p>\n<p>        box.style.setProperty(<br \/>\n            \"--ormix-pulse-low-scale\",<\/p>\n<p>            String(<br \/>\n                1<br \/>\n                - level * .005<br \/>\n            )<br \/>\n        );<br \/>\n    }<\/p>\n<p>    async function refresh(){<\/p>\n<p>        try{<\/p>\n<p>            const response =<br \/>\n                await fetch(<br \/>\n                    API<br \/>\n                    + \"&t=\"<br \/>\n                    + Date.now(),<\/p>\n<p>                    {<br \/>\n                        cache:<br \/>\n                            \"no-store\"<br \/>\n                    }<br \/>\n                );<\/p>\n<p>            if(!response.ok){<\/p>\n<p>                throw new Error(<br \/>\n                    \"HTTP \"<br \/>\n                    + response.status<br \/>\n                );<br \/>\n            }<\/p>\n<p>            const data =<br \/>\n                await response.json();<\/p>\n<p>            if(<br \/>\n                data.enabled<br \/>\n                &&<br \/>\n                data.message<br \/>\n            ){<\/p>\n<p>                show(<br \/>\n                    data.message<br \/>\n                );<\/p>\n<p>            }else{<\/p>\n<p>                hide();<br \/>\n            }<\/p>\n<p>        }catch(error){<\/p>\n<p>            hide();<br \/>\n        }<br \/>\n    }<\/p>\n<p>    setTimeout(<br \/>\n        refresh,<br \/>\n        600<br \/>\n    );<\/p>\n<p>    setInterval(<br \/>\n        refresh,<br \/>\n        5000<br \/>\n    );<\/p>\n<p>})();<\/p>\n<p><\/script><\/p>","protected":false},"excerpt":{"rendered":"<p>ORMUSICLIVE.COM INICIO OR MUSIC LIVE \u00b7 CANAL ESPECIAL MIXES &amp; DJS Un espacio dedicado a las mezclas, minitecas, discplay, DJs, sesiones especiales y programaci\u00f3n ligada al entretenimiento. M\u00e1s m\u00fasica, m\u00e1s cabina, m\u00e1s energ\u00eda y m\u00e1s fiesta. OR MUSIC LIVE \u00b7 MIXES &amp; DJS SE\u00d1AL DISPONIBLE DJ EN VIVO EXPERIENCIA OR MUSIC LIVE MEZCLAS PARA TU [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-409","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/ormusiclive.com\/index.php?rest_route=\/wp\/v2\/pages\/409","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ormusiclive.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ormusiclive.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ormusiclive.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ormusiclive.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=409"}],"version-history":[{"count":5,"href":"https:\/\/ormusiclive.com\/index.php?rest_route=\/wp\/v2\/pages\/409\/revisions"}],"predecessor-version":[{"id":649,"href":"https:\/\/ormusiclive.com\/index.php?rest_route=\/wp\/v2\/pages\/409\/revisions\/649"}],"wp:attachment":[{"href":"https:\/\/ormusiclive.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=409"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}