hp / gi_cutscn_viewer.html
daydreamer-json's picture
Add file
5b75b9f verified
<!DOCTYPE html>
<html lang='en'>
<head>
<title>tst</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.00">
<meta name="robots" content="noindex,nofollow,noarchive">
<script src="https://code.jquery.com/jquery-3.6.1.min.js" integrity="sha256-o88AwQnZB+VDvE9tvIXrMQaPlFFSUTR+nldQm1LuPXQ=" crossorigin="anonymous"></script>
<script src="https://cdn.plyr.io/3.7.3/plyr.js"></script>
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest/dist/hls.min.js"></script>
<link rel="stylesheet" href="https://cdn.plyr.io/3.7.3/plyr.css" />
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL,[email protected],100..700,0..1,-50..200" />
<link href="https://cdn.jsdelivr.net/gh/daydreamer-json/SomeFontRepo@main/somefontrepo.css" rel="stylesheet" type="text/css" media="all">
<style>
html, body {
color: #fff;
background: #000;
margin: 0;
line-height: 1;
width: 100vw;
height: 100vh;
font-family: 'A-OTF UD Shin Go Pro', system-ui;
}
.main2 {
display: flex;
flex-direction: column;
height: 100vh;
}
#video, .plyr {
flex-grow: 1;
height: 100%;
width: 100%;
}
</style>
</head>
<body>
<div class="main">
<div class="main2">
<p><span>File:</span><span>
<select id="filePullDownMenu" name="videoName" required>
</select>
</span><span id="audioTrackPullDownRow" hidden><br>
<span>Audio:</span><span>
<select id="audioTrackPullDownMenu" name="audioTrackName" required>
</select>
</span></span></p>
<video id="video" controls crossorigin>
<source type="application/x-mpegURL">
</video>
</div>
</div>
<script>
var default_file = 'Cs_LQ1101502_ShenheBattle_Boy';
var default_hls_pl_type = 'normal';
var videoData_BaseURL = 'https://raw.githubusercontent.com/daydreamer-json/gi_cutscn/main/media/hls/master';
const defaultOptions = {};
document.addEventListener('DOMContentLoaded', () => {
loadDatabase();
var playerElement = document.getElementById('video');
var videoSrc = `${videoData_BaseURL}/${default_hls_pl_type}/${default_file}.m3u8`;
var hls = new Hls();
document.getElementById('filePullDownMenu').addEventListener('change', changeSrc);
document.getElementById('audioTrackPullDownMenu').addEventListener('change', changeAudioTrack);
hlsInitialize(videoSrc, playerElement);
})
function loadDatabase () {
let file_database_url = 'https://raw.githubusercontent.com/daydreamer-json/gi_cutscn/main/cutscn_list.json';
let file_database_req = new XMLHttpRequest();
file_database_req.open('GET', file_database_url);
file_database_req.responseType = 'json';
file_database_req.send();
file_database_req.onload = function () {
const file_database = file_database_req.response;
for (let i = 0; i < file_database.length; i++) {
var temp_option = document.createElement('option');
var temp_textNode = document.createTextNode(file_database[i]);
temp_option.appendChild(temp_textNode);
temp_option.setAttribute('value',file_database[i]);
if (file_database[i] == default_file) {
temp_option.setAttribute('selected',true);
};
document.getElementById('filePullDownMenu').appendChild(temp_option);
};
};
}
function hlsInitialize (sourceURL, element) {
if (hls) {
hls.detachMedia();
};
if (Hls.isSupported()) {
var hls = new Hls();
hls.loadSource(sourceURL);
hls.on(Hls.Events.MANIFEST_PARSED, function (event, data) {
const availableQualities = hls.levels.map((l) => l.height);
availableQualities.unshift(0);
defaultOptions.quality = {
default: 0,
options: availableQualities,
forced: true,
onChange: (e) => updateQuality(e)
};
defaultOptions.i18n = {
qualityLabel: {
0: 'Auto'
}
};
hls.on(Hls.Events.LEVEL_SWITCHED, function (event, data) {
if (hls.autoLevelEnabled) {
document.querySelector(".plyr__menu__container [data-plyr='quality'][value='0'] span").innerHTML = `Auto (${hls.levels[data.level].height}p)`;
} else {
document.querySelector(".plyr__menu__container [data-plyr='quality'][value='0'] span").innerHTML = `Auto`;
}
});
const player = new Plyr(element, defaultOptions);
loadAvailableAudioTracks();
player.on('ready',function () {
if (hls.audioTrack) {
let audioTrackPullDownMenu = document.getElementById('audioTrackPullDownMenu');
audioTrackPullDownMenu.getElementsByTagName('option')[hls.audioTrack].setAttribute('selected',true);
};
});
});
hls.attachMedia(element);
window.hls = hls;
} else if (element.canPlayType('application/vnd.apple.mpegurl')) {
element.getElementsByTagName('source')[0].src = sourceURL;
};
}
function updateQuality (newQuality) {
if (newQuality === 0) {
window.hls.currentLevel = -1;
} else {
window.hls.levels.forEach((level, levelIndex) => {
if (level.height === newQuality) {
console.log("Found quality match with " + newQuality);
window.hls.currentLevel = levelIndex;
}
});
}
}
function changeSrc () {
let selectedFileName = document.getElementById('filePullDownMenu').value;
hlsInitialize(`${videoData_BaseURL}/${default_hls_pl_type}/${selectedFileName}.m3u8`, document.getElementById('video'));
var element = document.getElementById('video');
if (element.canPlayType('application/vnd.apple.mpegurl')) {
element.remove();
var temp_video = document.createElement('video');
temp_video.setAttribute('id', 'video');
temp_video.setAttribute('controls', true);
temp_video.setAttribute('crossorigin', true);
var temp_source = document.createElement('source');
temp_source.setAttribute('type', 'application/x-mpegURL');
temp_source.setAttribute('src', `${videoData_BaseURL}/${default_hls_pl_type}/${selectedFileName}.m3u8`);
temp_video.appendChild(temp_source);
var temp_main2 = document.getElementsByClassName('main2')[0];
temp_main2.appendChild(temp_video);
}
}
function loadAvailableAudioTracks () {
while (document.getElementById('audioTrackPullDownMenu').firstChild) {
document.getElementById('audioTrackPullDownMenu').removeChild(document.getElementById('audioTrackPullDownMenu').firstChild);
}
document.getElementById('audioTrackPullDownRow').removeAttribute('hidden');
let availableAudioTracks = {};
/*
availableAudioTracks.lang = hls.audioTracks.map((l) => l.lang);
availableAudioTracks.name = hls.audioTracks.map((l) => l.name);
*/
availableAudioTracks.lang = ['zh', 'en', 'ja', 'ko'];
availableAudioTracks.name = ['Chinese', 'English', 'Japanese', 'Korean'];
for (let i = 0; i < availableAudioTracks.lang.length; i++) {
var temp_option = document.createElement('option');
var temp_textNode = document.createTextNode(`${availableAudioTracks.lang[i]} (${availableAudioTracks.name[i]})`);
temp_option.appendChild(temp_textNode);
temp_option.setAttribute('value',i);
/*
if (hls.audioTrack == i) {
temp_option.setAttribute('selected',true);
}
*/
document.getElementById('audioTrackPullDownMenu').appendChild(temp_option);
};
}
function changeAudioTrack () {
let selectedAudioTrack = document.getElementById('audioTrackPullDownMenu').value;
if (hls) {
hls.audioTrack = selectedAudioTrack;
}
}
</script>
</body>
</html>