master-wiki/projects/radio-notes/Dev Stack.md
aleidk 0dbbfa46ef Update from obsidian -
Affected files:
....md
.obsidian/workspaces.json
books/El ritual.md
games/axiom-verge.md
games/danganronpa-v3-killing-harmony--1.md
games/sekiro-shadows-die-twice.md
games/wall-e.md
projects/games.md
projects/quests.md
projects/radio-notes/Dev Stack.md
projects/todos-notes/Obsidian for work.md
projects/todos-notes/Tatuaje _ metroidvanias _.md
projects/todos-notes/Update dots.md
projects/todos-notes/Update tmux config.md
2023-10-24 12:50:58 -03:00

3.4 KiB

Project Radio

  • En primera instancia utilizar librerías de apoyo para cosas demasiado complejas, especificas o que requieran mucha investigación para poder tener algo funcional en poco tiempo. Luego ir remplazando estas librerías por código propio

Music Player - Juno

Code name: Juno, like Fuuka's ultimate persona, that she use to communicate with the others

Este servicio debe ser solo un reproductor de música, Debe poder funcionar de manera independiente, y poder integrar distintos frontends para un futuro

Features:

  • Lenguaje: Rust, que sea lo más eficiente posible para manejar posibles colas de miles de elementos y poder modificar estas colas rápidamente.
  • Interacción con MPRIS
  • Audio Input:
    • Local file
    • Remote stream?? -> Youtube lofi re-stream for example
  • Audio Output:
    • Localmente
    • Strimear por red
  • Funcionalidad cliente - servidor dinámica. Al iniciar el proceso, se deberá revisar si el socket provisto (el por defecto o custom) está corriendo ya un servidor de Juno, de ser el caso el proceso se ejecutará en modo "cliente", del contrario se ejecutará en modo "servidor"
  • Modo servidor:
    • Al invocarse abrirá un socket en la máquina, por defecto será un socket de unix a no ser que se especifique (un path para crar un socket en especifico o un puerto para escuchar en red)
    • Por defecto el proceso terminará al terminar de reproducir todos los elementos en la cola, como es un server se pueden añadir más elementos mientras el proceso no haya terminado
    • Debe tener un modo "daemon" en donde el proceso no termine al finalizar la cola y se quede esperando nuevas instrucciones
    • Al iniciar el proceso en modo "daemon", se debe pasar un path (por variable de entorno o como parametro del flag "daemon") para solo poder reproducir canciones dentro de este path. Esto reducirá problemas cuando un cliente quiera agregar elementos
    • El servidor debe tener una manera de entregar las canciones disponibles en el path especificado
  • Modo cliente:
    • Puede ejecutar modificaciones sobre la cola, operaciones básicas de un reproductor de música (play-pause, next, prev, add, remove, etc)
    • "current" que imprima información actual de lo que está sonando, con una opción de "follow" para que sea continuo
  • Comunicación entre cliente - Servidor con gRPC

Cliente, Frontend y orquestador - Fuuka

Code name: Fuuka, the navi of SEES, you can ask her to change the musing in tartarus.

Este servicio será el encargado de orquestrar la música con el servidor.

  • Debido a la funcionalidad de indexación, es necesario un lenguaje de backend eficiente
    • Rust
    • Go
  • Mantener una DB:
    • Debe poder indexar una carpeta y todas las subcarpetas recursivamente para obtener una lista de canciones con su path y otros
    • Si Juno lo soporta, lista de fuentes remotas para re-strimear, con un botón de acceso rápido (como youtube lofi or synthwave streams)
    • Almacenar playlist junto con su programación
  • Scheduler:
    • Correr escaneo e indexación cada x tiempo
    • Ejecutar programación de playlists
  • Se debe maneter el frontend actualizado en todo momento en cuanto cambien los datos del servidor de Juno:
    • NextJS puede realizar actualización de UI dinámicamente, pero esto nos añade un 3 servicio
    • Web sockets creo que deberían bastar, implementados en Vanilla JS del lado del cliente

Stack

Type Tech
DB SQLx

References