From 98c1f6fa4ec7537ec979a1ae8d68cb6ec11c3fbf Mon Sep 17 00:00:00 2001 From: RblSb Date: Mon, 27 Sep 2021 20:48:29 +0300 Subject: Rework videolist structure --- src/client/JsApi.hx | 2 +- src/client/Player.hx | 107 ++++++++++++++++++++++++++-------------------- src/client/players/Raw.hx | 1 + 3 files changed, 62 insertions(+), 48 deletions(-) (limited to 'src/client') diff --git a/src/client/JsApi.hx b/src/client/JsApi.hx index d9e6f02..63b98c5 100644 --- a/src/client/JsApi.hx +++ b/src/client/JsApi.hx @@ -66,7 +66,7 @@ class JsApi { } @:expose - static function getVideoItems():VideoList { + static function getVideoItems():Array { final items = player.getItems(); return [ for (item in items) Reflect.copy(item) diff --git a/src/client/Player.hx b/src/client/Player.hx index 4d70526..496c355 100644 --- a/src/client/Player.hx +++ b/src/client/Player.hx @@ -17,11 +17,10 @@ class Player { final players:Array; final iframePlayer:IPlayer; final rawPlayer:IPlayer; - final items = new VideoList(); + final videoList = new VideoList(); final videoItemsEl = ge("#queue"); final playerEl:Element = ge("#ytapiplayer"); var player:Null; - var itemPos = 0; var isLoaded = false; var skipSetTime = false; var skipSetRate = false; @@ -73,23 +72,23 @@ class Player { } public function setNextItem(pos:Int):Void { - itemPos = items.setNextItem(pos, itemPos); + videoList.setNextItem(pos); final next = videoItemsEl.children[pos]; videoItemsEl.removeChild(next); - Utils.insertAtIndex(videoItemsEl, next, itemPos + 1); + Utils.insertAtIndex(videoItemsEl, next, videoList.pos + 1); } public function toggleItemType(pos:Int):Void { - items.toggleItemType(pos); + videoList.toggleItemType(pos); final el = videoItemsEl.children[pos]; - setItemElementType(el, items[pos].isTemp); + setItemElementType(el, videoList.getItem(videoList.pos).isTemp); } function setPlayer(newPlayer:IPlayer):Void { if (player != newPlayer) { if (player != null) { - JsApi.fireVideoRemoveEvents(items[itemPos]); + JsApi.fireVideoRemoveEvents(videoList.getCurrentItem()); player.removeVideo(); } main.blinkTabWithTitle("*Video*"); @@ -113,18 +112,15 @@ class Player { public function setVideo(i:Int):Void { if (!main.isSyncActive) return; - final item = items[i]; + 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); - final childs = videoItemsEl.children; - if (childs[itemPos] != null) { - childs[itemPos].classList.remove("queue_active"); - } - itemPos = i; - childs[itemPos].classList.add("queue_active"); + removeActiveLabel(videoList.pos); + videoList.setPos(i); + addActiveLabel(videoList.pos); isLoaded = false; player.loadVideo(item); @@ -134,7 +130,7 @@ class Player { public function changeVideoSrc(src:String):Void { if (player == null) return; - final item = items[itemPos]; + final item = videoList.getCurrentItem(); if (item == null) return; player.loadVideo({ url: src, @@ -148,7 +144,7 @@ class Player { } public function removeVideo():Void { - JsApi.fireVideoRemoveEvents(items[itemPos]); + JsApi.fireVideoRemoveEvents(videoList.getCurrentItem()); player.removeVideo(); ge("#currenttitle").textContent = Lang.get("nothingPlaying"); setPauseIndicator(true); @@ -175,7 +171,7 @@ class Player { time: getTime() } }); - final hasAutoPause = main.hasLeaderOnPauseRequest() && items.length > 0; + final hasAutoPause = main.hasLeaderOnPauseRequest() && videoList.length > 0; if (hasAutoPause) { // do not remove leader if user cannot request it back final group:Client.ClientGroup = main.isAdmin() ? Admin : User; @@ -184,7 +180,7 @@ class Player { } public function onPause():Void { - final hasAutoPause = main.hasLeaderOnPauseRequest() && items.length > 0 + final hasAutoPause = main.hasLeaderOnPauseRequest() && videoList.length > 0 && getTime() > 1; if (hasAutoPause && !main.hasLeader()) { JsApi.once(SetLeader, event -> { @@ -255,10 +251,10 @@ class Player { ' ); - items.addItem(item, atEnd, itemPos); + videoList.addItem(item, atEnd); setItemElementType(itemEl, item.isTemp); if (atEnd) videoItemsEl.appendChild(itemEl); - else Utils.insertAtIndex(videoItemsEl, itemEl, itemPos + 1); + else Utils.insertAtIndex(videoItemsEl, itemEl, videoList.pos + 1); updateCounters(); } @@ -273,15 +269,15 @@ class Player { public function removeItem(url:String):Void { removeElementItem(url); - var index = items.findIndex(item -> item.url == url); + var index = videoList.findIndex(item -> item.url == url); if (index == -1) return; - final isCurrent = items[itemPos].url == url; - itemPos = items.removeItem(index, itemPos); + final isCurrent = videoList.getCurrentItem().url == url; + videoList.removeItem(index); updateCounters(); - if (isCurrent && items.length > 0) { - setVideo(itemPos); + if (isCurrent && videoList.length > 0) { + setVideo(videoList.pos); } } @@ -295,47 +291,64 @@ class Player { } public function skipItem(url:String):Void { - var index = items.findIndex(item -> item.url == url); - if (index == -1) return; - if (items[index].isTemp) removeElementItem(url); - index = items.skipItem(index); + final pos = videoList.findIndex(item -> item.url == url); + if (pos == -1) return; + removeActiveLabel(videoList.pos); + videoList.setPos(pos); + if (videoList.getCurrentItem().isTemp) removeElementItem(url); + videoList.skipItem(); updateCounters(); - if (items.length == 0) return; - setVideo(index); + if (videoList.length == 0) return; + setVideo(videoList.pos); + } + + function addActiveLabel(pos:Int):Void { + final childs = videoItemsEl.children; + if (childs[videoList.pos] != null) { + childs[videoList.pos].classList.add("queue_active"); + } + } + + function removeActiveLabel(pos:Int):Void { + final childs = videoItemsEl.children; + if (childs[videoList.pos] != null) { + childs[videoList.pos].classList.remove("queue_active"); + } } function updateCounters():Void { - ge("#plcount").textContent = '${items.length} ${Lang.get("videos")}'; + ge("#plcount").textContent = '${videoList.length} ${Lang.get("videos")}'; ge("#pllength").textContent = totalDuration(); } - public function getItems():VideoList { - return items; + public function getItems():Array { + return videoList.getItems(); } public function setItems(list:Array, ?pos:Int):Void { - final currentUrl = itemPos >= items.length ? "" : items[itemPos].url; + final currentUrl = videoList.pos >= videoList.length ? "" : videoList.getCurrentItem() + .url; clearItems(); - if (pos != null) itemPos = pos; + if (pos != null) videoList.setPos(pos); if (list.length == 0) return; for (video in list) { addVideoItem(video, true); } - if (currentUrl != items[itemPos].url) setVideo(itemPos); - else videoItemsEl.children[itemPos].classList.add("queue_active"); + if (currentUrl != videoList.getCurrentItem().url) setVideo(videoList.pos); + else addActiveLabel(videoList.pos); } public function clearItems():Void { - items.resize(0); + videoList.clear(); videoItemsEl.textContent = ""; updateCounters(); } public function refresh():Void { - if (items.length == 0) return; + if (videoList.length == 0) return; final time = getTime(); removeVideo(); - setVideo(itemPos); + setVideo(videoList.pos); // restore server time for leader with next GetTime if (main.isLeader()) { setTime(time); @@ -357,7 +370,7 @@ class Player { function totalDuration():String { var time = 0.0; - for (item in items) { + for (item in videoList.getItems()) { if (item.isIframe) continue; time += item.duration; } @@ -365,15 +378,15 @@ class Player { } public function isListEmpty():Bool { - return items.length == 0; + return videoList.length == 0; } public function itemsLength():Int { - return items.length; + return videoList.length; } public function getItemPos():Int { - return itemPos; + return videoList.pos; } public function hasVideo():Bool { @@ -381,8 +394,8 @@ class Player { } public function getDuration():Float { - if (itemPos >= items.length) return 0; - return items[itemPos].duration; + if (videoList.pos >= videoList.length) return 0; + return videoList.getCurrentItem().duration; } public function isVideoLoaded():Bool { diff --git a/src/client/players/Raw.hx b/src/client/players/Raw.hx index 4b78b0f..dc3aed5 100644 --- a/src/client/players/Raw.hx +++ b/src/client/players/Raw.hx @@ -127,6 +127,7 @@ class Raw implements IPlayer { if (Utils.isTouch()) return; if (controlsHider != null) controlsHider.stop(); controlsHider = Timer.delay(() -> { + if (video == null) return; video.controls = false; }, 3000); video.onmousemove = e -> { -- cgit v1.2.3