chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
package luaplugin
|
||||
|
||||
import lua "github.com/yuin/gopher-lua"
|
||||
|
||||
// registerQueueAPI adds cliamp.queue.* to the cliamp table.
|
||||
//
|
||||
// Reads (list/count/current) need no permission and pull from the StateProvider.
|
||||
// Mutators (add/jump/remove/move) require permissions = {"control"} and route
|
||||
// through the ControlProvider, which dispatches them onto the UI loop.
|
||||
//
|
||||
// All indices are 0-based, matching cliamp.queue.current().
|
||||
func registerQueueAPI(L *lua.LState, cliamp *lua.LTable, state *StateProvider, ctrl *ControlProvider, p *Plugin, logger *pluginLogger) {
|
||||
tbl := L.NewTable()
|
||||
|
||||
// cliamp.queue.list() -> array of {title, artist, album, path, index, queued}
|
||||
L.SetField(tbl, "list", L.NewFunction(func(L *lua.LState) int {
|
||||
out := L.NewTable()
|
||||
if state.QueueList != nil {
|
||||
for i, e := range state.QueueList() {
|
||||
row := L.NewTable()
|
||||
row.RawSetString("title", lua.LString(e.Title))
|
||||
row.RawSetString("artist", lua.LString(e.Artist))
|
||||
row.RawSetString("album", lua.LString(e.Album))
|
||||
row.RawSetString("path", lua.LString(e.Path))
|
||||
row.RawSetString("index", lua.LNumber(e.Index))
|
||||
row.RawSetString("queued", lua.LBool(e.Queued))
|
||||
out.RawSetInt(i+1, row)
|
||||
}
|
||||
}
|
||||
L.Push(out)
|
||||
return 1
|
||||
}))
|
||||
|
||||
// cliamp.queue.count() -> number of tracks
|
||||
L.SetField(tbl, "count", L.NewFunction(func(L *lua.LState) int {
|
||||
n := 0
|
||||
if state.PlaylistCount != nil {
|
||||
n = state.PlaylistCount()
|
||||
}
|
||||
L.Push(lua.LNumber(n))
|
||||
return 1
|
||||
}))
|
||||
|
||||
// cliamp.queue.current() -> 0-based index of the current track
|
||||
L.SetField(tbl, "current", L.NewFunction(func(L *lua.LState) int {
|
||||
idx := 0
|
||||
if state.CurrentIndex != nil {
|
||||
idx = state.CurrentIndex()
|
||||
}
|
||||
L.Push(lua.LNumber(idx))
|
||||
return 1
|
||||
}))
|
||||
|
||||
warned := false
|
||||
guard := func(name string) bool {
|
||||
if !p.perms[PermControl] {
|
||||
if !warned {
|
||||
logger.log(p.Name, "warn", "queue.%s requires permissions = {\"control\"} — further warnings suppressed", name)
|
||||
warned = true
|
||||
}
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// cliamp.queue.add(path) — resolve a file/dir/URL and append to the playlist.
|
||||
L.SetField(tbl, "add", L.NewFunction(func(L *lua.LState) int {
|
||||
path := L.CheckString(1)
|
||||
if guard("add") && ctrl.QueueAdd != nil {
|
||||
ctrl.QueueAdd(path)
|
||||
}
|
||||
return 0
|
||||
}))
|
||||
|
||||
// cliamp.queue.jump(index) — make index the current track and play it.
|
||||
L.SetField(tbl, "jump", L.NewFunction(func(L *lua.LState) int {
|
||||
index := L.CheckInt(1)
|
||||
if guard("jump") && ctrl.QueueJump != nil {
|
||||
ctrl.QueueJump(index)
|
||||
}
|
||||
return 0
|
||||
}))
|
||||
|
||||
// cliamp.queue.remove(index) — remove the track at index.
|
||||
L.SetField(tbl, "remove", L.NewFunction(func(L *lua.LState) int {
|
||||
index := L.CheckInt(1)
|
||||
if guard("remove") && ctrl.QueueRemove != nil {
|
||||
ctrl.QueueRemove(index)
|
||||
}
|
||||
return 0
|
||||
}))
|
||||
|
||||
// cliamp.queue.move(from, to) — reorder a track.
|
||||
L.SetField(tbl, "move", L.NewFunction(func(L *lua.LState) int {
|
||||
from := L.CheckInt(1)
|
||||
to := L.CheckInt(2)
|
||||
if guard("move") && ctrl.QueueMove != nil {
|
||||
ctrl.QueueMove(from, to)
|
||||
}
|
||||
return 0
|
||||
}))
|
||||
|
||||
L.SetField(cliamp, "queue", tbl)
|
||||
}
|
||||
Reference in New Issue
Block a user