You've already forked RadioPlayer
mirror of
https://github.com/radio95-rnt/RadioPlayer.git
synced 2026-02-26 21:53:54 +01:00
skip next
This commit is contained in:
@@ -21,6 +21,7 @@ class Module(ActiveModifier):
|
|||||||
self.morning_start = self.day_end = 0
|
self.morning_start = self.day_end = 0
|
||||||
self.file_lock = Lock()
|
self.file_lock = Lock()
|
||||||
self.crossfade = 5
|
self.crossfade = 5
|
||||||
|
self.skip_next = False
|
||||||
def on_new_playlist(self, playlist: list[Track], global_args: dict[str, str]):
|
def on_new_playlist(self, playlist: list[Track], global_args: dict[str, str]):
|
||||||
self.playlist = playlist
|
self.playlist = playlist
|
||||||
self.crossfade = float(global_args.get("crossfade", 5.0))
|
self.crossfade = float(global_args.get("crossfade", 5.0))
|
||||||
@@ -108,6 +109,10 @@ class Module(ActiveModifier):
|
|||||||
logger.warning("Skipping track as it the next day")
|
logger.warning("Skipping track as it the next day")
|
||||||
return (None, None), None
|
return (None, None), None
|
||||||
if last_track_duration: logger.info("Track ends at", repr(future))
|
if last_track_duration: logger.info("Track ends at", repr(future))
|
||||||
|
if self.skip_next:
|
||||||
|
logger.info("Skip next flag was on, skipping this song.")
|
||||||
|
self.skip_next = False
|
||||||
|
return (None, None), None
|
||||||
return (self.last_track, next_track), False
|
return (self.last_track, next_track), False
|
||||||
|
|
||||||
def imc(self, imc: InterModuleCommunication) -> None:
|
def imc(self, imc: InterModuleCommunication) -> None:
|
||||||
@@ -136,5 +141,8 @@ class Module(ActiveModifier):
|
|||||||
i += 1
|
i += 1
|
||||||
with open(TOPLAY, "w") as f: f.write(first_line.strip() + "\n")
|
with open(TOPLAY, "w") as f: f.write(first_line.strip() + "\n")
|
||||||
return {"status": "ok", "data": [first_line.strip()]}
|
return {"status": "ok", "data": [first_line.strip()]}
|
||||||
|
elif data.get("action") == "skip_next":
|
||||||
|
if data.get("set", True): self.skip_next = not self.skip_next
|
||||||
|
return {"status": "ok", "data": self.skip_next}
|
||||||
|
|
||||||
activemod = Module()
|
activemod = Module()
|
||||||
@@ -72,9 +72,10 @@
|
|||||||
<div class="small" id="time-label">00:00 / 00:00 (00:00)</div>
|
<div class="small" id="time-label">00:00 / 00:00 (00:00)</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="controls" style="margin-top:10px">
|
<div class="controls" style="margin-top:10px">
|
||||||
<button id="skip-btn" class="btn">⏭ Skip Track</button>
|
<button id="skip-btn" class="btn">⏭ Skip Track</button>
|
||||||
<button id="readd-btn" class="btn">↺ Re-add Selected</button>
|
<button id="readd-btn" class="btn">↺ Re-add Selected</button>
|
||||||
<button id="clear-btn" class="btn">✖ Clear the PUT Queue</button>
|
<button id="clear-btn" class="btn">✖ Clear the PUT Queue</button>
|
||||||
|
<button id="skpn-btn" class="btn">⏭? Toggle skip next</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -135,6 +136,7 @@
|
|||||||
let selectedSubFile = null;
|
let selectedSubFile = null;
|
||||||
let basePath = "";
|
let basePath = "";
|
||||||
let subbasePath = "";
|
let subbasePath = "";
|
||||||
|
let skipNext = false;
|
||||||
|
|
||||||
function connectWs(){
|
function connectWs(){
|
||||||
document.getElementById("server-status").textContent = "connecting...";
|
document.getElementById("server-status").textContent = "connecting...";
|
||||||
@@ -144,6 +146,7 @@
|
|||||||
document.getElementById("server-status").textContent = "connected";
|
document.getElementById("server-status").textContent = "connected";
|
||||||
reconnectDelay = 1000;
|
reconnectDelay = 1000;
|
||||||
ws.send(JSON.stringify({action:"get_toplay"}));
|
ws.send(JSON.stringify({action:"get_toplay"}));
|
||||||
|
ws.send(JSON.stringify({action:"skip_next",set:false}));
|
||||||
});
|
});
|
||||||
|
|
||||||
ws.addEventListener("close", () => {
|
ws.addEventListener("close", () => {
|
||||||
@@ -185,6 +188,10 @@
|
|||||||
renderPutQueue();
|
renderPutQueue();
|
||||||
} else if(msg.event === "request_dir") {
|
} else if(msg.event === "request_dir") {
|
||||||
applySubdir(msg.data || {})
|
applySubdir(msg.data || {})
|
||||||
|
} else if(msg.event === "skip_next") {
|
||||||
|
skip_next = msg.data.data || false;
|
||||||
|
renderPlaylist();
|
||||||
|
renderPutQueue();
|
||||||
} else if(msg.status || msg.response || msg.error) {
|
} else if(msg.status || msg.response || msg.error) {
|
||||||
console.debug("ws ack", msg);
|
console.debug("ws ack", msg);
|
||||||
}
|
}
|
||||||
@@ -277,6 +284,9 @@
|
|||||||
li.classList.add("current");
|
li.classList.add("current");
|
||||||
currentIndex = i;
|
currentIndex = i;
|
||||||
}
|
}
|
||||||
|
if(currentIndex+1 === i && skipNext) {
|
||||||
|
li.style.textDecoration = "line-through";
|
||||||
|
}
|
||||||
ul.appendChild(li);
|
ul.appendChild(li);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -292,6 +302,9 @@
|
|||||||
putQueue.forEach((element, i) => {
|
putQueue.forEach((element, i) => {
|
||||||
const li = document.createElement("li");
|
const li = document.createElement("li");
|
||||||
li.textContent = element;
|
li.textContent = element;
|
||||||
|
if(i === 0 && skipNext) {
|
||||||
|
li.style.textDecoration = "line-through";
|
||||||
|
}
|
||||||
ul.appendChild(li);
|
ul.appendChild(li);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -360,6 +373,10 @@
|
|||||||
if(ws && ws.readyState === WebSocket.OPEN) ws.send(JSON.stringify({action:"skip"}));
|
if(ws && ws.readyState === WebSocket.OPEN) ws.send(JSON.stringify({action:"skip"}));
|
||||||
else console.error("WebSocket not connected.");
|
else console.error("WebSocket not connected.");
|
||||||
});
|
});
|
||||||
|
document.getElementById("skpn-btn").addEventListener("click", () => {
|
||||||
|
if(ws && ws.readyState === WebSocket.OPEN) ws.send(JSON.stringify({action:"skip_next"}));
|
||||||
|
else console.error("WebSocket not connected.");
|
||||||
|
});
|
||||||
|
|
||||||
document.getElementById("readd-btn").addEventListener("click", () => {
|
document.getElementById("readd-btn").addEventListener("click", () => {
|
||||||
if(selectedPlaylistIndex == null){
|
if(selectedPlaylistIndex == null){
|
||||||
|
|||||||
@@ -61,6 +61,10 @@ async def ws_handler(websocket: ServerConnection, shared_data: dict, imc_q: mult
|
|||||||
result = await get_imc("activemod", {"action": "clear_toplay"})
|
result = await get_imc("activemod", {"action": "clear_toplay"})
|
||||||
if result is None: await websocket.send(json.dumps({"error": "timeout", "code": 504}))
|
if result is None: await websocket.send(json.dumps({"error": "timeout", "code": 504}))
|
||||||
else: await websocket.send(json.dumps({"data": result, "event": "toplay"})) # Yes, this is not an accident
|
else: await websocket.send(json.dumps({"data": result, "event": "toplay"})) # Yes, this is not an accident
|
||||||
|
elif action == "skip_next":
|
||||||
|
result = await get_imc("activemod", {"action": "skip_next", "set": msg.get("set",True)})
|
||||||
|
if result is None: await websocket.send(json.dumps({"error": "timeout", "code": 504}))
|
||||||
|
else: await websocket.send(json.dumps({"data": result, "event": "skip_next"}))
|
||||||
elif action == "request_state":
|
elif action == "request_state":
|
||||||
# supports requesting specific parts if provided
|
# supports requesting specific parts if provided
|
||||||
what = msg.get("what", "")
|
what = msg.get("what", "")
|
||||||
|
|||||||
Reference in New Issue
Block a user