aboutsummaryrefslogtreecommitdiffstats
path: root/src/client
diff options
context:
space:
mode:
authorRblSb <msrblsb@gmail.com>2020-04-03 04:48:36 +0300
committerRblSb <msrblsb@gmail.com>2020-04-03 04:48:36 +0300
commit5f2a3b89eaa1199d9bc2ddd10622f9803cec983f (patch)
treeee9064ee7b683cfe2ac7b504ba81674b490367b6 /src/client
parent62c9be74228549ff888b684a62f77fb056571470 (diff)
Sync playback rate
Diffstat (limited to 'src/client')
-rw-r--r--src/client/IPlayer.hx2
-rw-r--r--src/client/Main.hx11
-rw-r--r--src/client/Player.hx26
-rw-r--r--src/client/players/Iframe.hx6
-rw-r--r--src/client/players/Raw.hx9
-rw-r--r--src/client/players/Youtube.hx13
6 files changed, 66 insertions, 1 deletions
diff --git a/src/client/IPlayer.hx b/src/client/IPlayer.hx
index 4f29512..e414af5 100644
--- a/src/client/IPlayer.hx
+++ b/src/client/IPlayer.hx
@@ -11,4 +11,6 @@ interface IPlayer {
function pause():Void;
function getTime():Float;
function setTime(time:Float):Void;
+ function getPlaybackRate():Float;
+ function setPlaybackRate(rate:Float):Void;
}
diff --git a/src/client/Main.hx b/src/client/Main.hx
index f65640a..780f005 100644
--- a/src/client/Main.hx
+++ b/src/client/Main.hx
@@ -366,6 +366,13 @@ class Main {
player.play();
case GetTime:
+ if (data.getTime.paused == null) data.getTime.paused = false;
+ if (data.getTime.rate == null) data.getTime.rate = 1;
+
+ if (player.getPlaybackRate() != data.getTime.rate) {
+ player.setPlaybackRate(data.getTime.rate);
+ }
+
final newTime = data.getTime.time;
final time = player.getTime();
if (isLeader()) {
@@ -386,6 +393,10 @@ class Main {
if (Math.abs(time - newTime) < synchThreshold) return;
player.setTime(newTime);
+ case SetRate:
+ if (isLeader()) return;
+ player.setPlaybackRate(data.setRate.rate);
+
case Rewind:
player.setTime(data.rewind.time);
diff --git a/src/client/Player.hx b/src/client/Player.hx
index 8e55b25..53a1168 100644
--- a/src/client/Player.hx
+++ b/src/client/Player.hx
@@ -21,6 +21,7 @@ class Player {
var itemPos = 0;
var isLoaded = false;
var skipSetTime = false;
+ var skipSetRate = false;
public function new(main:Main):Void {
this.main = main;
@@ -158,6 +159,19 @@ class Player {
});
}
+ public function onRateChange():Void {
+ if (skipSetRate) {
+ skipSetRate = false;
+ return;
+ }
+ if (!main.isLeader()) return;
+ main.send({
+ type: SetRate, setRate: {
+ rate: getPlaybackRate()
+ }
+ });
+ }
+
public function addVideoItem(item:VideoItem, atEnd:Bool):Void {
final url = item.url.htmlEscape(true);
final itemEl = nodeFromString(
@@ -322,4 +336,16 @@ class Player {
player.setTime(time);
}
+ public function getPlaybackRate():Float {
+ if (player == null) return 1;
+ return player.getPlaybackRate();
+ }
+
+ public function setPlaybackRate(rate:Float, isLocal = true):Void {
+ if (!main.isSyncActive) return;
+ if (player == null) return;
+ skipSetRate = isLocal;
+ player.setPlaybackRate(rate);
+ }
+
}
diff --git a/src/client/players/Iframe.hx b/src/client/players/Iframe.hx
index f0a04c5..d79196b 100644
--- a/src/client/players/Iframe.hx
+++ b/src/client/players/Iframe.hx
@@ -59,4 +59,10 @@ class Iframe implements IPlayer {
public function setTime(time:Float):Void {}
+ public function getPlaybackRate():Float {
+ return 1;
+ }
+
+ public function setPlaybackRate(rate:Float):Void {}
+
}
diff --git a/src/client/players/Raw.hx b/src/client/players/Raw.hx
index c7fa980..cd01a42 100644
--- a/src/client/players/Raw.hx
+++ b/src/client/players/Raw.hx
@@ -67,6 +67,7 @@ class Raw implements IPlayer {
player.onPlay();
}
video.onpause = player.onPause;
+ video.onratechange = player.onRateChange;
playerEl.appendChild(video);
}
@@ -102,4 +103,12 @@ class Raw implements IPlayer {
video.currentTime = time;
}
+ public function getPlaybackRate():Float {
+ return video.playbackRate;
+ }
+
+ public function setPlaybackRate(rate:Float):Void {
+ video.playbackRate = rate;
+ }
+
}
diff --git a/src/client/players/Youtube.hx b/src/client/players/Youtube.hx
index f582ba7..eff407e 100644
--- a/src/client/players/Youtube.hx
+++ b/src/client/players/Youtube.hx
@@ -208,7 +208,10 @@ class Youtube implements IPlayer {
player.onSetTime();
case CUED:
}
- }
+ },
+ onPlaybackRateChange: e -> {
+ player.onRateChange();
+ },
}
});
}
@@ -239,4 +242,12 @@ class Youtube implements IPlayer {
youtube.seekTo(time, true);
}
+ public function getPlaybackRate():Float {
+ return youtube.getPlaybackRate();
+ }
+
+ public function setPlaybackRate(rate:Float):Void {
+ youtube.setPlaybackRate(rate);
+ }
+
}
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage