From: Mike Lowis Date: Tue, 16 Jan 2024 21:11:19 +0000 (-0500) Subject: added scaffolding for queue management X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=6fd921731b48cd0c84911ff67006b67aebce7ff0;p=proto%2Fatv.git added scaffolding for queue management --- diff --git a/atv/assets/client.js b/atv/assets/client.js index 66ebb7b..b4844fb 100644 --- a/atv/assets/client.js +++ b/atv/assets/client.js @@ -8,9 +8,17 @@ const Client = ((self = {})=>{ ws = new WebSocket( "ws://" + window.location.host + ":3000"); + ws.onopen = (event)=>{ + send("get_items", {}); + } + ws.onmessage = (event)=>{ - self.state = JSON.parse(event.data); - self.onmessage(self.state); + cmd = JSON.parse(event.data); + if (cmd.cmd !== "items") + { + self.state = cmd; + } + self.onmessage(cmd); }; ws.onclose = ()=>{ diff --git a/atv/assets/control.html b/atv/assets/control.html index c4a2f5d..e4deb3c 100644 --- a/atv/assets/control.html +++ b/atv/assets/control.html @@ -60,15 +60,24 @@ + diff --git a/atv/bin/atv b/atv/bin/atv index 008d8c8..26aa8a4 100755 --- a/atv/bin/atv +++ b/atv/bin/atv @@ -20,7 +20,9 @@ end db = ATV::Database.new(ATV_ROOT) channels = [ ATV::Channel.new('Everything', db, - ["Movies", "Shorts", "Shows"]) + ["Movies", "Shorts", "Shows"]), + ATV::Channel.new('Christmas', db, + ["Christmas"]), ] player = ATV::Player.new(db, channels) ATV::Server.start(player) diff --git a/atv/lib/atv/channel.rb b/atv/lib/atv/channel.rb index 1f00781..ef618ff 100644 --- a/atv/lib/atv/channel.rb +++ b/atv/lib/atv/channel.rb @@ -1,6 +1,7 @@ module ATV class Channel def initialize(name, db, selectors = []) + @name = name @time = 0 @index = 0 @db = db @@ -8,15 +9,17 @@ module ATV @items = selectors.map do |sel| files.select {|f| f["path"].start_with? sel } end.flatten.shuffle + @item_map = @items.map{|e| [e["path"], e]}.to_h + @queue = [] + @current = @items[@index] if @items.length > 0 end def update(playing) - return false if @items.length == 0 + return false if !@current || @items.length == 0 @time += 1 if playing - item = @items[@index] - if @time >= item["duration"] then + if @time >= @current["duration"] then next_vid() - pp @items[@index] + pp @current true else false @@ -24,20 +27,35 @@ module ATV end def next_vid() - @index += 1 - if @index >= @items.length - @index = 0 - end @time = 0 + if @queue.length > 0 + @current = @queue.shift + else + @index = ((@index+1) >= @items.length ? 0 : (@index+1)) + @current = @items[@index] + end end def state() next_index = ((@index+1) >= @items.length ? 0 : (@index+1)) + next_item = (@queue.length > 0 ? @queue.first : @items[next_index]) { "time" => @time, - "curr" => @items[@index], - "next" => @items[next_index] + "curr" => @current, + "next" => next_item } end + + def items() + { "items" => @items } + end + + def queue() + @queue + end + + def enqueue(path) + @queue << @item_map[path] if @item_map[path] + end end end diff --git a/atv/lib/atv/player.rb b/atv/lib/atv/player.rb index feb937a..f1c269f 100644 --- a/atv/lib/atv/player.rb +++ b/atv/lib/atv/player.rb @@ -46,5 +46,17 @@ module ATV "playing" => @playing }) end + + def items() + @channels[@channel].items + end + + def queue() + @channels[@channel].queue + end + + def enqueue(item) + @channels[@channel].enqueue(item) + end end end diff --git a/atv/lib/atv/server.rb b/atv/lib/atv/server.rb index 86f6720..d8b7714 100644 --- a/atv/lib/atv/server.rb +++ b/atv/lib/atv/server.rb @@ -30,15 +30,17 @@ module ATV Iodine.publish(:atv, JSON.dump(obj)) end - def client_send(client, obj) - puts "To #{client} #{JSON.dump(obj)}" - client.write JSON.dump(obj) + def client_send(client, cmd, obj) + obj = obj.merge({"cmd" => cmd}) + json = JSON.dump(obj) + puts "To #{client} #{json}" + client.write json end def on_open(client) puts "connect: #{client}" client.subscribe :atv - client_send(client, @@player.state.merge({"cmd" => "play"})) + client_send(client, "play", @@player.state) end def on_close(client) @@ -72,45 +74,9 @@ module ATV @@player.chan_prev end -# def send(client, data) -# client.write JSON.dump(data) -# end -# -# Cmds = { -# "skip" => lambda do |data| -# cfg = $channels[$channel] -# cfg[:play][:start_time] = secs_since_midnight() -# cfg[:play][:curr] = cfg[:play][:next] -# cfg[:play][:next] = next_show($channel) -# update_program() -# end, -# -# "play" => lambda do |data| -# pp data -# end, -# -# "pause" => lambda do |data| -# pp data -# end, -# -# "chan_prev" => lambda do |data| -# $channel -= 1 -# if $channel < 0 -# $channel = $channels.length - 1 -# end -# puts $channel -# update_program() -# end, -# -# "chan_next" => lambda do |data| -# $channel += 1 -# if $channel >= $channels.length -# $channel = 0 -# end -# puts $channel -# update_program() -# end, -# } + def on_get_items(client, data) + client_send(client, "items", @@player.items) + end extend self end