self.connect = (onmsg)=>{
self.onmessage = onmsg;
+ self.state = { playing: false };
ws = new WebSocket(
"ws://" + window.location.host + ":3000");
ws.onmessage = (event)=>{
- self.onmessage(JSON.parse(event.data));
+ self.state = JSON.parse(event.data);
+ self.onmessage(self.state);
};
ws.onclose = ()=>{
};
const send = (cmd, data = {})=>{
- const blob = { cmd: cmd, data: data};
+ const blob = Object.assign({ cmd: cmd}, data);
console.log(blob);
ws.send(JSON.stringify(blob));
};
send("skip");
};
- self.play = (data)=>{
- send("play");
+ self.play_pause = (data)=>{
+ if (self.state["playing"])
+ {
+ send("pause");
+ }
+ else
+ {
+ send("play");
+ }
};
self.pause = (data)=>{
width: 100%;
height: 100%;
max-height: 100%;
- background-color: #000;
+ background-color: #eaeaea;
overflow: hidden;
}
+
+ .table {
+ display: block;
+ }
+
+ .row {
+ display: flex;
+ flex: 1 0 auto;
+ border-bottom: 1px solid black;
+ }
+
+ .label {
+ flex-shrink: 1;
+ padding: 1em;
+ width: 8em;
+ border-right: 1px solid black;
+ }
+
+ .item {
+ flex-grow: 1;
+ border-left: 0;
+ padding: 1em;
+ }
+
+ .row input {
+ flex-grow: 1;
+ height: 4em;
+ }
</style>
</head>
<body>
+<div class="row">
+ <div class="label"><strong>Now Playing</strong></div>
+ <div class="item" id="currVid">Some File</div>
+</div>
+<div class="row">
+ <div class="label"><strong>Playing Next</strong></div>
+ <div class="item" id="nextVid">Some Other File</div>
+</div>
+<hr/>
-<input type="button" value="Skip" onclick="javscript:Client.skip()"/>
-<input type="button" value="Play" onclick="javscript:Client.play()"/>
-<input type="button" value="Pause" onclick="javscript:Client.pause()"/>
-<input type="button" value="Chan +" onclick="javscript:Client.chan_next()"/>
-<input type="button" value="Chan -" onclick="javscript:Client.chan_prev()"/>
-
+<div class="row">
+ <input type="button" value="Play" onclick="javscript:Client.play_pause()" id="playBtn"/>
+ <input type="button" value="Skip" onclick="javscript:Client.skip()"/>
+ <input type="button" value="Chan +" onclick="javscript:Client.chan_next()"/>
+ <input type="button" value="Chan -" onclick="javscript:Client.chan_prev()"/>
+</div>
<script type="text/javascript" src="client.js"></script>
<script>
(()=>{
- Client.connect(()=>{});
+ Client.connect((data)=>{
+ console.log(data);
+ currVid.innerText = data["curr"]["path"]
+ nextVid.innerText = data["next"]["path"]
+ playBtn.value = (data["playing"] ? "Pause" : "Play");
+ });
})();
</script>
</body>
if (elapsed >= 0 && elapsed < duration)
{
Video.src = current["curr"]["path"] + "#t=" + Math.floor(elapsed);
- }
-};
-
-const Cmd = {
- play: (data)=>{
- current = data;
- updatePlayer();
+ if (current["playing"])
+ {
+ Video.play();
+ }
+ else
+ {
+ Video.pause();
+ }
}
};
ws.onmessage = (event)=>{
const msg = JSON.parse(event.data);
- Cmd[msg.cmd](msg);
+ current = msg;
+ updatePlayer();
};
ws.onclose = (event)=>{
@items = selectors.map do |sel|
files.select {|f| f["path"].start_with? sel }
end.flatten.shuffle
-# @time = @items[@index]["duration"] - 10
end
def update(playing)
@index = 0
end
@time = 0
-# @time = @items[@index]["duration"] - 10
end
def state()
@channels.each do |c|
updated ||= c.update(@playing)
end
-# puts updated
updated
end
end
def skip()
- @channels[@channel].next
+ @channels[@channel].next_vid
end
def chan_next()
end
def state()
- @channels[@channel].state
+ @channels[@channel].state.merge({
+ "playing" => @playing
+ })
end
end
end
Iodine.listen(service: :http, handler: APP)
Iodine.run_every(1000) do
if player.update
- publish(@@player.state.merge({"cmd" => "play"}))
+ broadcast("play", @@player.state)
end
end
Iodine.threads = 1
Iodine.start
end
+ def broadcast(cmd, data)
+ publish(data.merge({"cmd" => cmd}))
+ end
+
def publish(obj)
puts JSON.dump(obj)
Iodine.publish(:atv, JSON.dump(obj))
def on_message(client, cmd)
cmd = JSON.parse(cmd)
+ pp cmd
send("on_#{cmd["cmd"]}".to_sym, client, cmd)
+ broadcast(cmd["cmd"], @@player.state)
end
def on_skip(client, data)
- puts "skip"
+ @@player.skip
end
def on_play(client, data)
- puts "play"
+ @@player.play
end
def on_pause(client, data)
- puts "pause"
+ @@player.pause
end
def on_chan_next(client, data)
- puts "chan_next"
+ @@player.chan_next
end
def on_chan_prev(client, data)
- puts "chan_prev"
+ @@player.chan_prev
end
# def send(client, data)