MIXES & DJS
Un espacio dedicado a las mezclas, minitecas, discplay, DJs, sesiones especiales y programación ligada al entretenimiento. Más música, más cabina, más energía y más fiesta.
MEZCLAS PARA TU DISFRUTE
Disfruta mezclas, sesiones y sets seleccionados para mantener la energía y el ambiente de fiesta durante todo el día.
Ambiente de fiesta y sesión continua
Mixes & DJs es la señal de OR Music Live dedicada a sesiones continuas, minitecas, discplay, mezclas temáticas, invitados, músicos y contenidos vinculados al entretenimiento.
¿Quieres música individual?
También puedes cambiar directamente a Radio 24/7, con clásicos, éxitos actuales, pop, rock, dance, ritmos latinos y música en español e inglés.
¿Quieres ver OR Music Live TV?
Accede a transmisiones, programas, entrevistas, videos y contenido audiovisual de OR Music Live.
(function(){
const API =
"https://video.ormusiclive.com:9444/api/multimedia/output?platform=web&screen=mixes";
const BASE =
"https://video.ormusiclive.com:9444";
const HLS_SRC =
"https://cdn.jsdelivr.net/npm/hls.js@1/dist/hls.min.js";
let stateSignature = "";
let sequenceToken = 0;
let timer = null;
let hls = null;
let hlsPromise = null;
window.OR_MIX_V2_ACTIVE =
false;
function screen(){
return document.getElementById(
"orMixPromoLayer"
);
}
function image(){
return document.getElementById(
"orMixPromoImage"
);
}
function video(){
return document.getElementById(
"orMixPromoVideo"
);
}
function stop(){
if(timer){
clearTimeout(timer);
timer = null;
}
const v = video();
if(v){
v.onended = null;
v.onerror = null;
try{
v.pause();
}catch(e){}
v.classList.remove(
"is-active"
);
try{
v.removeAttribute("src");
v.load();
}catch(e){}
}
const img = image();
if(img){
img.onload = null;
img.onerror = null;
img.classList.remove(
"is-active"
);
img.removeAttribute(
"src"
);
}
if(hls){
try{
hls.destroy();
}catch(e){}
hls = null;
}
}
function normalMode(){
sequenceToken += 1;
window.OR_MIX_V2_ACTIVE =
false;
stop();
const layer = screen();
if(layer){
layer.classList.remove(
"is-active"
);
layer.setAttribute(
"aria-hidden",
"true"
);
}
/*
Recuperar identificación visual
normal del DJ inmediatamente.
*/
try{
if(
typeof orMixUpdateDJImage
=== "function"
){
orMixUpdateDJImage();
}
}catch(e){}
}
function activate(){
const layer = screen();
if(!layer){
return null;
}
window.OR_MIX_V2_ACTIVE =
true;
try{
if(
typeof orMixStopDJMediaRotation
=== "function"
){
orMixStopDJMediaRotation();
}
}catch(e){}
stop();
layer.classList.add(
"is-active"
);
layer.setAttribute(
"aria-hidden",
"false"
);
return layer;
}
function absoluteUrl(value){
if(!value){
return "";
}
try{
return new URL(
value,
BASE
).href;
}catch(e){
return "";
}
}
function loadHls(){
if(window.Hls){
return Promise.resolve(
window.Hls
);
}
if(hlsPromise){
return hlsPromise;
}
hlsPromise =
new Promise(
function(
resolve,
reject
){
const existing =
document.querySelector(
"script[data-or-mix-v2-hls]"
);
if(existing){
existing.addEventListener(
"load",
function(){
resolve(
window.Hls
);
},
{once:true}
);
existing.addEventListener(
"error",
reject,
{once:true}
);
return;
}
const script =
document.createElement(
"script"
);
script.src =
HLS_SRC;
script.async =
true;
script.dataset.orMixV2Hls =
"1";
script.onload =
function(){
if(window.Hls){
resolve(
window.Hls
);
}else{
reject(
new Error(
"HLS no disponible"
)
);
}
};
script.onerror =
reject;
document.head.appendChild(
script
);
}
);
return hlsPromise;
}
function showImage(
item,
seconds,
token,
next
){
if(
token !==
sequenceToken
){
return;
}
if(!activate()){
return;
}
const img = image();
if(!img){
return;
}
img.onload =
function(){
if(
token !==
sequenceToken
){
return;
}
img.classList.add(
"is-active"
);
timer =
setTimeout(
next,
Math.max(
1,
Number(seconds) || 10
) * 1000
);
};
img.onerror =
function(){
timer =
setTimeout(
next,
1000
);
};
img.src =
absoluteUrl(
item.media_url
);
}
async function showVideo(
item,
token,
next
){
if(
token !==
sequenceToken
){
return;
}
if(!activate()){
return;
}
const v = video();
if(!v){
return;
}
/*
El audio de Mixes sigue siendo
el audio principal.
La multimedia visual va muteada.
*/
v.autoplay = true;
v.playsInline = true;
v.preload = "metadata";
v.controls = false;
v.loop = false;
v.muted = true;
v.defaultMuted = true;
let finished = false;
function finish(){
if(finished){
return;
}
finished = true;
if(
token ===
sequenceToken
){
next();
}
}
v.onended = finish;
v.onerror =
function(){
timer =
setTimeout(
finish,
1000
);
};
const url =
absoluteUrl(
item.media_url
);
if(!url){
finish();
return;
}
v.classList.add(
"is-active"
);
/*
Safari
*/
if(
v.canPlayType(
"application/vnd.apple.mpegurl"
)
){
v.src = url;
v.play()
.catch(
function(){}
);
return;
}
/*
Chrome / Firefox
*/
try{
const HlsClass =
await loadHls();
if(
token !==
sequenceToken
){
return;
}
if(
HlsClass
&&
HlsClass.isSupported()
){
hls =
new HlsClass({
enableWorker:true
});
hls.loadSource(url);
hls.attachMedia(v);
hls.on(
HlsClass.Events.MANIFEST_PARSED,
function(){
v.play()
.catch(
function(){}
);
}
);
hls.on(
HlsClass.Events.ERROR,
function(
event,
data
){
if(
data
&&
data.fatal
){
finish();
}
}
);
return;
}
}catch(e){}
finish();
}
function run(data){
const items =
Array.isArray(data.items)
? data.items
: [];
if(
!data.enabled
||
!items.length
){
normalMode();
return;
}
sequenceToken += 1;
const token =
sequenceToken;
let index = 0;
const imageSeconds =
Math.max(
1,
Number(
data.image_duration_seconds
) || 10
);
function next(){
if(
token !==
sequenceToken
){
return;
}
stop();
const item =
items[
index %
items.length
];
index =
(
index + 1
) %
items.length;
if(
item.kind ===
"video"
){
showVideo(
item,
token,
next
);
return;
}
if(
item.kind ===
"image"
){
showImage(
item,
imageSeconds,
token,
next
);
return;
}
timer =
setTimeout(
next,
1000
);
}
next();
}
function signature(data){
return JSON.stringify({
enabled:
!!data.enabled,
duration:
Number(
data.image_duration_seconds
) || 10,
items:
Array.isArray(data.items)
? data.items
: []
});
}
async function refresh(){
try{
const response =
await fetch(
API
+ "&t="
+ Date.now(),
{
cache:"no-store"
}
);
if(!response.ok){
throw new Error(
"HTTP "
+ response.status
);
}
const data =
await response.json();
const nextSignature =
signature(data);
if(
nextSignature !==
stateSignature
){
stateSignature =
nextSignature;
run(data);
}
}catch(e){
if(
stateSignature !==
"NORMAL_FALLBACK"
){
stateSignature =
"NORMAL_FALLBACK";
normalMode();
}
}
}
/*
Detener cualquier promoción antigua
que estuviera corriendo.
*/
try{
if(
typeof orMixStopPromoRotation
=== "function"
){
orMixStopPromoRotation(
true
);
}
}catch(e){}
normalMode();
refresh();
setInterval(
refresh,
5000
);
})();
/* OR_MIXES_TEXTS_V2_20260916 */
(function(){
const API =
"https://video.ormusiclive.com:9444/api/texts/output?platform=web&screen=mixes";
function ensureBox(){
const player =
document.getElementById(
"ormixPlayer"
);
if(!player){
return null;
}
let box =
document.getElementById(
"orMixTextV2"
);
if(box){
return box;
}
box =
document.createElement(
"div"
);
box.id =
"orMixTextV2";
box.setAttribute(
"aria-live",
"polite"
);
const inner =
document.createElement(
"div"
);
inner.id =
"orMixTextV2Inner";
box.appendChild(
inner
);
const controls =
player.querySelector(
".ormix-controls-area"
);
if(controls){
player.insertBefore(
box,
controls
);
}else{
player.appendChild(
box
);
}
return box;
}
function cleanText(value){
return String(
value || ""
)
.split(/\r?\n/)
.map(
function(line){
return line.trim();
}
)
.join("\n");
}
function hide(){
const box =
ensureBox();
if(!box){
return;
}
const inner =
document.getElementById(
"orMixTextV2Inner"
);
box.className =
"";
box.removeAttribute(
"style"
);
if(inner){
inner.textContent =
"";
}
}
function show(message){
const box =
ensureBox();
const inner =
document.getElementById(
"orMixTextV2Inner"
);
if(
!box
||
!inner
||
!message
){
hide();
return;
}
const text =
cleanText(
message.text
);
if(!text.trim()){
hide();
return;
}
const effect =
String(
message.effect
|| "normal"
);
const color =
String(
message.color
|| "#ffffff"
);
const align =
[
"left",
"center",
"right"
].includes(
String(
message.align
|| "center"
)
)
? String(
message.align
|| "center"
)
: "center";
const intensity =
Math.max(
0,
Math.min(
100,
Number(
message.intensity
?? 55
)
)
);
const level =
intensity / 100;
const speeds = {
slow:"1.55s",
medium:"1.05s",
fast:".72s"
};
inner.textContent =
text;
inner.style.textAlign =
align;
box.style.textAlign =
align;
box.style.color =
color;
box.className =
"is-active effect-"
+ effect;
box.style.setProperty(
"--ormix-pulse-speed",
speeds[
String(
message.pulse_speed
|| "medium"
)
]
|| "1.05s"
);
box.style.setProperty(
"--ormix-glow-1",
Math.round(
level * 7
)
+ "px"
);
box.style.setProperty(
"--ormix-glow-2",
Math.round(
level * 22
)
+ "px"
);
box.style.setProperty(
"--ormix-glow-3",
Math.round(
level * 38
)
+ "px"
);
box.style.setProperty(
"--ormix-brightness",
String(
1
+ level * .28
)
);
box.style.setProperty(
"--ormix-saturation",
String(
1
+ level * .25
)
);
box.style.setProperty(
"--ormix-pulse-low-opacity",
String(
.88
- level * .50
)
);
box.style.setProperty(
"--ormix-pulse-high-scale",
String(
1
+ level * .010
)
);
box.style.setProperty(
"--ormix-pulse-low-scale",
String(
1
- level * .005
)
);
}
async function refresh(){
try{
const response =
await fetch(
API
+ "&t="
+ Date.now(),
{
cache:
"no-store"
}
);
if(!response.ok){
throw new Error(
"HTTP "
+ response.status
);
}
const data =
await response.json();
if(
data.enabled
&&
data.message
){
show(
data.message
);
}else{
hide();
}
}catch(error){
hide();
}
}
setTimeout(
refresh,
600
);
setInterval(
refresh,
5000
);
})();