stream: let listeners queue a yt-dlp URL on request
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
Add an input in the queue tab to enqueue a yt-dlp URL: a single track, or a whole playlist/album. Requests are a priority lane in the ingest queue — pop_next serves them before the auto radio, so the next /next plays the request without cutting the current track. They download lazily (a few ahead), so a large playlist queues instantly and bypasses anti-repeat. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
ef1a19504e
commit
493e55ed18
5 changed files with 225 additions and 22 deletions
|
|
@ -290,6 +290,32 @@ harbor.http.register(
|
|||
end
|
||||
)
|
||||
|
||||
# Mettre une URL yt-dlp en file d'attente (piste seule, ou playlist/album
|
||||
# entier). Le player n'a pas accès au réseau interne : on relaie la demande vers
|
||||
# l'ingest, qui résout l'URL et la place en file prioritaire (le prochain /next
|
||||
# la servira). On renvoie tel quel son code et son corps JSON ({queued: N} ou
|
||||
# une erreur). Timeout large : résoudre une grosse playlist peut prendre du
|
||||
# temps. NB : la variable locale s'appelle `link`, pas `url`, pour ne pas
|
||||
# masquer le module `url` (url.encode).
|
||||
ingest_enqueue_url = "http://ingest:8080/enqueue"
|
||||
harbor.http.register(
|
||||
port=8000, method="POST", "/enqueue",
|
||||
fun(req, resp) -> begin
|
||||
link = list.assoc(default="", "url", req.query)
|
||||
if link == "" then
|
||||
resp.status_code(400)
|
||||
resp.data("missing url")
|
||||
else
|
||||
body = http.post(
|
||||
data="", timeout=60.0, "#{ingest_enqueue_url}?url=#{url.encode(link)}"
|
||||
)
|
||||
resp.status_code(body.status_code)
|
||||
resp.content_type("application/json; charset=utf-8")
|
||||
resp.data(string.trim(body) ^ "\n")
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
# Passer au morceau suivant : on saute le morceau en cours sur la source
|
||||
# diffusée. request.dynamic a déjà préchargé le suivant, donc l'enchaînement
|
||||
# est immédiat (le prochain /next est demandé au daemon dans la foulée).
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue