diff options
| author | RblSb <msrblsb@gmail.com> | 2024-04-29 07:45:10 +0300 |
|---|---|---|
| committer | RblSb <msrblsb@gmail.com> | 2024-04-29 07:45:10 +0300 |
| commit | 5d2375cbb23dbe69a7afe7a691707be48397c6d9 (patch) | |
| tree | 2fe92ab48e83427b3a7e90855545f73c2c8daa3e /src/client | |
| parent | 9d844bbf3ac6be327325b13a91a6b33f73c49c1d (diff) | |
Video item fixes
- Fix youtube fallback, `videoItem.url` is now immutable
- JsApi.setVideoSrc now updates to supported player based on `url` arg
- Fix auto-pause when video is ended (with `requestLeaderOnPause`)
Diffstat (limited to 'src/client')
| -rw-r--r-- | src/client/JsApi.hx | 4 | ||||
| -rw-r--r-- | src/client/Player.hx | 37 | ||||
| -rw-r--r-- | src/client/players/Youtube.hx | 5 |
3 files changed, 24 insertions, 22 deletions
diff --git a/src/client/JsApi.hx b/src/client/JsApi.hx index 637878d..09e6edb 100644 --- a/src/client/JsApi.hx +++ b/src/client/JsApi.hx @@ -104,8 +104,8 @@ class JsApi { } @:expose - public static function setVideoSrc(src:String):Void { - player.changeVideoSrc(src); + public static function setVideoSrc(url:String):Void { + player.changeVideoSrc(url); } /** Returns current page hostname (domain without protocol) **/ diff --git a/src/client/Player.hx b/src/client/Player.hx index 06a8f3e..c250a34 100644 --- a/src/client/Player.hx +++ b/src/client/Player.hx @@ -89,7 +89,7 @@ class Player { setItemElementType(el, videoList.getItem(pos).isTemp); } - public function getCurrentItem():VideoItem { + public function getCurrentItem():Null<VideoItem> { return videoList.currentItem; } @@ -121,10 +121,7 @@ class Player { public function setVideo(i:Int):Void { if (!main.isSyncActive) return; final item = videoList.getItem(i); - var currentPlayer = players.find(p -> p.isSupportedLink(item.url)); - if (currentPlayer != null) setPlayer(currentPlayer); - else if (item.isIframe) setPlayer(iframePlayer); - else setPlayer(rawPlayer); + setSupportedPlayer(item.url, item.isIframe); removeActiveLabel(videoList.pos); videoList.setPos(i); @@ -140,19 +137,18 @@ class Player { ge("#currenttitle").textContent = item.title; } - public function changeVideoSrc(src:String):Void { + function setSupportedPlayer(url:String, isIframe:Bool):Void { + final currentPlayer = players.find(p -> p.isSupportedLink(url)); + if (currentPlayer != null) setPlayer(currentPlayer); + else if (isIframe) setPlayer(iframePlayer); + else setPlayer(rawPlayer); + } + + public function changeVideoSrc(url:String):Void { if (!main.isVideoEnabled) return; - if (player == null) return; - final item = videoList.currentItem ?? return; - player.loadVideo({ - url: src, - title: item.title, - author: item.author, - duration: item.duration, - subs: item.subs, - isTemp: item.isTemp, - isIframe: item.isIframe - }); + final item:VideoItem = videoList.currentItem ?? return; + setSupportedPlayer(url, item.isIframe); + player.loadVideo(item.withUrl(url)); } public function removeVideo():Void { @@ -191,6 +187,13 @@ class Player { } public function onPause():Void { + final item = videoList.currentItem ?? return; + // do not send pause if video is ended + if (getTime() >= item.duration - 0.01) return; + // youtube raw fallback has around one second difference from rounded youtube duration + if (player == rawPlayer && youtube.isSupportedLink(item.url)) { + if (getTime() >= item.duration - 1) return; + } final hasAutoPause = main.hasLeaderOnPauseRequest() && videoList.length > 0 && getTime() > 1; if (hasAutoPause && !main.hasLeader()) { diff --git a/src/client/players/Youtube.hx b/src/client/players/Youtube.hx index 5308b63..7c98b3f 100644 --- a/src/client/players/Youtube.hx +++ b/src/client/players/Youtube.hx @@ -243,6 +243,7 @@ class Youtube implements IPlayer { onError: e -> { // TODO message error codes trace('Error ${e.data}'); + final item = player.getCurrentItem() ?? return; rawSourceFallback(item.url); } } @@ -258,9 +259,7 @@ class Youtube implements IPlayer { trace(info); return; }; - final item = player.getCurrentItem(); - item.url = format.url; - player.refresh(); + player.changeVideoSrc(format.url); }); main.send({ type: GetYoutubeVideoInfo, |
