aboutsummaryrefslogtreecommitdiffstats
path: root/src/client
diff options
context:
space:
mode:
authorRblSb <msrblsb@gmail.com>2020-05-12 04:05:12 +0300
committerRblSb <msrblsb@gmail.com>2020-05-12 04:05:12 +0300
commit9b960a699739c17179cdb1d5c9c9cb3efa912ebe (patch)
treebd8c58a6e282f138dcbf5fd4c0ae4e1968ffb9f6 /src/client
parentddffbe0267cf7b69b5d49825daa4b4bfa9096e6e (diff)
m3u8 support
Diffstat (limited to 'src/client')
-rw-r--r--src/client/JsApi.hx2
-rw-r--r--src/client/players/Raw.hx32
2 files changed, 32 insertions, 2 deletions
diff --git a/src/client/JsApi.hx b/src/client/JsApi.hx
index 8a6315c..071dbee 100644
--- a/src/client/JsApi.hx
+++ b/src/client/JsApi.hx
@@ -36,7 +36,7 @@ class JsApi {
}
@:expose
- static function addScriptToHead(url:String, ?onLoaded:()->Void):Void {
+ public static function addScriptToHead(url:String, ?onLoaded:()->Void):Void {
var script = document.createScriptElement();
script.type = "text/javascript";
script.onload = onLoaded;
diff --git a/src/client/players/Raw.hx b/src/client/players/Raw.hx
index 266f0a2..d8aa57b 100644
--- a/src/client/players/Raw.hx
+++ b/src/client/players/Raw.hx
@@ -1,5 +1,6 @@
package client.players;
+import js.hlsjs.Hls;
import haxe.Timer;
import js.html.Element;
import js.html.VideoElement;
@@ -7,15 +8,18 @@ import js.Browser.document;
import client.Main.ge;
import Types.VideoData;
import Types.VideoItem;
+using StringTools;
class Raw implements IPlayer {
final main:Main;
final player:Player;
final playerEl:Element = ge("#ytapiplayer");
+ final matchName = ~/^(.+)\.(.+)/;
var controlsHider:Timer;
var playAllowed = true;
var video:VideoElement;
+ var isHlsLoaded = false;
public function new(main:Main, player:Player) {
this.main = main;
@@ -28,9 +32,13 @@ class Raw implements IPlayer {
public function getVideoData(url:String, callback:(data:VideoData)->Void):Void {
var title = url.substr(url.lastIndexOf("/") + 1);
- final matchName = ~/^(.+)\./;
if (matchName.match(title)) title = matchName.matched(1);
else title = Lang.get("rawVideo");
+ final isHls = matchName.matched(2).contains("m3u8");
+ if (isHls && !isHlsLoaded) {
+ loadHlsPlugin(() -> getVideoData(url, callback));
+ return;
+ }
final video = document.createVideoElement();
video.src = url;
@@ -46,12 +54,33 @@ class Raw implements IPlayer {
});
}
Utils.prepend(playerEl, video);
+ if (isHls) initHlsSource(video, url);
+ }
+
+ function loadHlsPlugin(callback:()->Void):Void {
+ JsApi.addScriptToHead("https://cdn.jsdelivr.net/npm/hls.js@latest", () -> {
+ isHlsLoaded = true;
+ callback();
+ });
+ }
+
+ function initHlsSource(video:VideoElement, url:String):Void {
+ if (!Hls.isSupported()) return;
+ final hls = new Hls();
+ hls.loadSource(url);
+ hls.attachMedia(video);
}
public function loadVideo(item:VideoItem):Void {
final url = main.tryLocalIp(item.url);
+ final isHls = item.url.contains("m3u8");
+ if (isHls && !isHlsLoaded) {
+ loadHlsPlugin(() -> loadVideo(item));
+ return;
+ }
if (video != null) {
video.src = url;
+ if (isHls) initHlsSource(video, url);
restartControlsHider();
return;
}
@@ -68,6 +97,7 @@ class Raw implements IPlayer {
video.onpause = player.onPause;
video.onratechange = player.onRateChange;
playerEl.appendChild(video);
+ if (isHls) initHlsSource(video, url);
}
function restartControlsHider():Void {
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage