Fix ZZZ Opera Music

Fixes the music not playing in the Opera Browser on the Zenless Zone Zero website.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(У мене вже є менеджер скриптів, дайте мені встановити його!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         Fix ZZZ Opera Music
// @namespace    http://tampermonkey.net/
// @version      0.3
// @description  Fixes the music not playing in the Opera Browser on the Zenless Zone Zero website.
// @author       WhiteTapeti
// @match        *://zenless.hoyoverse.com/*
// @exclude      *://zenless.hoyoverse.com/*.*
// @icon         https://animetopbtns.github.io/website/Fix%20ZZZ%20Opera%20Music/fixZZZOperaMusicV3.png
// @grant        none
// ==/UserScript==

var loaded = 0;
var audio = new Audio(
    "https://webstatic.hoyoverse.com/upload/static-resource/2022/04/19/aeefeb96a2a294cf1d7ab7324fd9a492_568718570249589416.mp3",
);
audio.loop = true;
var cAudioV = 1;

var elemDivMusicTooltipMainElem = document.createElement("span");
elemDivMusicTooltipMainElem.classList.add("tooltiptext");
elemDivMusicTooltipMainElem.classList.add("tooltip-bottom");
elemDivMusicTooltipMainElem.onclick = function(e) {
    e.stopPropagation();
};

elemDivMusicTooltipMainElem.innerHTML = `
<div class="slidecontainer">
  <input type="range" min="0" max="100" value="100" class="slider" id="myRange">
  <p style="font-size: medium;">Volume: <span id="demo"></span></p>
</div>
`;

setInterval(function testLoading() {
    if (loaded == 0) {
        if (document.getElementsByClassName("loading").length == 0 || document.getElementsByClassName("loading")[0].attributes.style.nodeValue == "display: none;" || document.body.contains(document.getElementsByClassName("loading")) == false) {
            audio.volume = 0;
            audio.play();
            getSoundAndFadeAudio(1);
            document.body
                .getElementsByClassName("m-audio-player header__bgm")[0]
                .appendChild(elemDivMusicTooltipMainElem);
            var slider = document.getElementById("myRange");
            var output = document.getElementById("demo");
            output.innerHTML = slider.value;

            slider.oninput = function() {
                output.innerHTML = this.value;
                cAudioV = (this.value) / 100;
                audio.volume = cAudioV;
            };
        }
    }
}, 200);

document.addEventListener("click", function(event) {
    if (event.target.classList.contains("m-audio-player__icon--active")) {
        if (!audio.paused) {
            //check audio is playing
            audio.pause();
        }
    } else if (event.target.classList.contains("m-audio-player__icon")) {
        if (audio.paused) {
            //check audio is playing
            audio.volume = 0;
            audio.play();
            getSoundAndFadeAudio(0);
        }
    }
});

function getSoundAndFadeAudio(e) {
    if (e == 1) {
        loaded = 1;
    }
    // Set the point in playback that fadein begins.
    var fadePoint = audio.duration - cAudioV;

    var fadeAudio = setInterval(function() {

        // Only fade if past the fade in point or not at one already
        if ((audio.currentTime <= fadePoint) && (audio.volume !== cAudioV)) {
            audio.volume = Number(audio.volume + 0.01).toFixed(2);
        }
        // When volume at one stop all the intervalling
        if (audio.volume === cAudioV) {
            clearInterval(fadeAudio);
        }
    }, 20);

}
var elemDivMusicTooltipMainStyle = document.createElement("style");

elemDivMusicTooltipMainStyle.innerHTML = `
.header__bgm .tooltiptext {
    visibility: hidden;
    position: absolute;
    width: 120px;
    background-color: #0a0a0a;
    outline: solid #646464;
    color: #fff;
    text-align: center;
    padding: 5px 0;
    border-radius: 6px;
    z-index: 1;
    opacity: 0;
    transition: opacity .6s;
    cursor: auto;
}

.tooltip-bottom {
    top: 135%;
    left: 50%;
    margin-left: -60px;
}

.tooltip-bottom::after {
    content: "";
    position: absolute;
    bottom: 100%;
    left: 50%;
    margin-left: -9px;
    border-width: 9px;
    border-style: solid;
    border-color: transparent transparent #0a0a0a transparent;
}

.tooltip-bottom::before {
    content: "";
    position: absolute;
    bottom: 100%;
    left: 50%;
    margin-left: -13px;
    border-width: 13px;
    border-style: solid;
    border-color: transparent transparent #646464 transparent;
}

.header__bgm:hover .tooltiptext {
    visibility: visible;
    opacity: 1;
    padding: 9px;
}

.slidecontainer {
  width: 100%;
  display: grid !important;
}

.slider {
  -webkit-appearance: none;
  width: 100%;
  height: 15px;
  border-radius: 5px;
  background: #464646;
  outline: none;
  opacity: 0.7;
  -webkit-transition: .2s;
  transition: opacity .2s;
  margin-bottom: 6px;
}

.slider:hover {
  opacity: 1;
}

.slider::-webkit-slider-thumb {
  -webkit-appearance: none;
  appearance: none;
  width: 25px;
  height: 25px;
  border-radius: 50%;
  background: #d8fa00;
  cursor: pointer;
}

.slider::-moz-range-thumb {
  width: 25px;
  height: 25px;
  border-radius: 50%;
  background: #d8fa00;
  cursor: pointer;
}
`;

document.body.append(elemDivMusicTooltipMainStyle);