react-native-webview-video
Version:
react-native-webview-video is a React Native library that provides a Video component that renders media content such as videos with custom controls for react-native and react-native-web. Support Youtube and Vimeo.
149 lines (142 loc) • 5.27 kB
HTML
<html>
<head>
<meta name="viewport" content="initial-scale=1, maximum-scale=1">
<title>VideoJS Player Webview</title>
<meta charset="utf-8">
<meta name="author" content="santran686@gmail.com">
<meta name="author" content="chainplatform.net">
<style>
html {
overflow-y: hidden;
overflow-x: hidden;
height: 100%;
}
body {
background-color: transparent;
margin: 0;
padding: 0;
width: 100%;
height: 100%;
}
.embed-container {
position: relative;
aspect-ratio: 16 / 9;
overflow: hidden;
max-width: 100%;
width: 100%;
height: 100%;
}
.embed-container iframe,
.embed-container object,
.embed-container embed {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.embed-container .video-js {
padding-top: 0px;
height: 100%;
position: absolute;
top: 0;
left: 0;
width: 100%;
}
</style>
</head>
<body>
<div class="embed-container">
<video id="player" class="video-js"></video>
</div>
<link href="https://cdnjs.cloudflare.com/ajax/libs/video.js/8.17.1/video-js.min.css" rel="stylesheet">
<script>
const parsedUrl = new URL(window.location.href), videoId = parsedUrl.searchParams.get("videoId"), videoType = parsedUrl.searchParams.get("videoType"), videoSource = parsedUrl.searchParams.get("videoSource");
let jsVersion = typeof parsedUrl.searchParams.get("jsVersion") != "undefined" ? parsedUrl.searchParams.get("jsVersion") : "";
let jsLink = typeof parsedUrl.searchParams.get("jsLink") != "undefined" ? parsedUrl.searchParams.get("jsLink") : "";
jsVersion = jsVersion ? jsVersion : "8.17.1";
jsLink = jsLink ? jsLink : `https://cdnjs.cloudflare.com/ajax/libs/video.js/8.17.1/video.min.js`;
</script>
<script>
function sendMessageToParent(event) {
(window.ReactNativeWebView || window.parent || window).postMessage(JSON.stringify(event), '*');
}
let tag = document.createElement('script');
tag.src = `${jsLink}`;
let lastTimeUpdate = 0;
let player;
let options = {
userActions: {
click: false,
doubleClick: false
},
preload: 'metadata',
hotkeys: false,
autoplay: false,
controls: false,
loop: false,
disablePictureInPicture: true,
experimentalSvgIcons: false,
controlBar: false,
autoSetup: false,
playsinline: true,
sources: [{
src: `${videoId}`,
}]
};
// type: 'videoType'
tag.onload = () => {
player = videojs('player', options, function onPlayerReady() {
sendMessageToParent({ eventType: "playerReady", data: null });
});
player.one("loadedmetadata", () => {
var duration = player.duration();
sendMessageToParent({ eventType: "initialDelivery", data: { duration: duration, currentTime: 0 } });
});
player.on('ended', function () {
sendMessageToParent({ eventType: "playerStateChange", data: 0 });
});
player.on('timeupdate', function () {
var time = Math.floor(this.currentTime());
if (time !== lastTimeUpdate) {
lastTimeUpdate = time;
sendMessageToParent({ eventType: "infoDelivery", data: { currentTime: time } })
}
});
player.on('ratechange', function (infos) {
sendMessageToParent({ eventType: "playbackRateChange", data: infos })
});
player.on('error', function (infos) {
sendMessageToParent({ eventType: "playerError", data: infos })
});
window.addEventListener("message", function (events) {
let infos = events.data;
if (typeof events.data != "object") {
infos = JSON.parse(events.data);
}
switch (infos.event) {
case "playVideo":
player.play();
break;
case "pauseVideo":
player.pause();
break;
case "stopVideo":
player.pause();
break;
case "volumeOff":
player.volume(0);
break;
case "volumeOn":
player.volume(1);
break;
}
})
};
tag.onerror = () => { };
let firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
</script>
</body>
</html>