JSFiddle - React, Tailwind, and code Playground
by Sahil Kashyap
HTML
<link rel="stylesheet" href="https://vjs.zencdn.net/8.6.1/video-js.css">
<script src="https://vjs.zencdn.net/8.6.1/video.min.js"></script>
<!-- partial:index.partial.html -->
<div class="container">
<video id=my-video class="video-js vjs-default-skin " width="640" height="360" controls>
<!-- <source
src="https://content.jwplatform.com/manifests/yp34SRmf.m3u8"
type="application/x-mpegURL"> -->
<!-- <source
src="https://cph-p2p-msl.akamaized.net/hls/live/2000341/test/master.m3u8"
type="application/x-mpegURL"> -->
<source
src="https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps.mpd"
type="application/dash+xml">
<!-- <source
src="https://livesim.dashif.org/livesim/chunkdur_1/ato_7/testpic4_8s/Manifest.mpd"
type="application/dash+xml"> -->
</video>
Works with both mpd and m3u8 links, uncomment the source url from the code
</div>
CSS
body {
font-family: 'Montserrat', sans-serif;
line-height: 1.6;
margin: 0;
min-height: 100vh;
}
ul {
margin: 0;
padding: 0;
list-style: none;
}
h2,
h3,
a {
color: #34495e;
}
a {
text-decoration: none;
}
.logo {
margin: 0;
font-size: 1.45em;
}
.main-nav {
margin-top: 5px;
}
.logo a,
.main-nav a {
padding: 10px 15px;
text-transform: uppercase;
text-align: center;
display: block;
}
.main-nav a {
color: #34495e;
font-size: .99em;
}
.main-nav a:hover {
color: #718daa;
}
.header {
padding-top: .5em;
padding-bottom: .5em;
border: 1px solid #a2a2a2;
background-color: #f4f4f4;
-webkit-box-shadow: 0px 0px 14px 0px rgba(0,0,0,0.75);
-moz-box-shadow: 0px 0px 14px 0px rgba(0,0,0,0.75);
box-shadow: 0px 0px 14px 0px rgba(0,0,0,0.75);
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
}
/* =================================
Media Queries
==================================== */
@media (min-width: 769px) {
.header,
.main-nav {
display: flex;
}
.header {
flex-direction: column;
align-items: center;
.header{
width: 80%;
margin: 0 auto;
max-width: 1150px;
}
}
}
@media (min-width: 1025px) {
.header {
flex-direction: row;
justify-content: space-between;
}
}
.contentMenu {
position: relative;
width: 4em;
}
.contentMenu .icon {
width: 100%;
bottom: 0;
position: absolute;
padding: 10px;
text-align: center;
color: white;
}
.contentMenu .icon:hover {
cursor: pointer;
color: gray;
}
.contentMenu .icon:hover + .menu {
transform: translate(-50%, -30px);
visibility: visible;
opacity: 1;
}
.contentMenu .menu {
position: absolute;
bottom: 20px;
left: 50%;
transition: all 200ms;
display: flex;
justify-content: center;
flex-direction: column-reverse;
width: 100px;
transform: translate(-50%, -20px);
visibility: hidden;
opacity: 0;
}
.contentMenu .menu:hover {
transform: translate(-50%, -30px);
visibility: visible;
opacity: 1;
}
.contentMenu...
JavaScript
videojs.Hls.xhr.beforeRequest = function (options) {
/*
* Modifications to requests that will affect every player.
*/
let newUri = options.uri.includes('.ts') ? options.uri + "?q=test" : options.uri;
return {
...options,
uri: newUri };
};
let player = videojs("my-video", {responsive: true}, () => {
console.log("Start");
player.one("loadedmetadata", () => {
let qualities = player.
tech({ IWillNotUseThisInPlugins: true }).
hls.representations();
console.log('qualities',qualities);
createButtonsQualities({
class: "item",
qualities: qualities,
father: player.controlBar.el_ });
player.play();
// ---------------------------------------------- //
function createAutoQualityButton(params) {
let button = document.createElement("div");
button.id = "auto";
button.innerText = `Auto`;
button.classList.add("selected");
if (params && params.class) button.classList.add(params.class);
button.addEventListener("click", () => {
removeSelected(params);
button.classList.add("selected");
qualities.map(quality => quality.enabled(true));
});
return button;
}
function createButtonsQualities(params) {
let contentMenu = document.createElement('div');
let menu = document.createElement('div');
let icon = document.createElement('div');
let fullscreen = params.father.querySelector('.vjs-fullscreen-control');
contentMenu.appendChild(icon);
contentMenu.appendChild(menu);
fullscreen.before(contentMenu);
menu.classList.add('menu');
icon.classList.add('icon', 'vjs-icon-cog');
contentMenu.classList.add('contentMenu');
let autoButton = createAutoQualityButton(params);
menu.appendChild(autoButton);
qualities.sort((a, b) => {
return a.height > b.height ? 1 : 0;
});
qualities.map(quality => {
let button =...