2.3 KiB
QueueCube
QueueCube is a web frontend for mpv.
It allows you to remotely manage mpv's playqueue as well as the ability to search YouTube via a locally running Invidious instance.
Running
The easiest way to run QueueCube is by using Docker. An MPV instance is created in the Docker container, so all you have to do is make it so the MPV instance can access your host's soundcard. On Linux, this is accomplished by mapping the PulseAudio socket to the container:
volumes:
- ~/.config/pulse/cookie:/root/.config/pulse/cookie
- /var/run/user/1000/pulse:/var/run/pulse
Building the Docker image
docker build -t queuecube:latest .
If not using docker-compose, create an instance of the container by using docker create using the volume mapping specified above for mapping the PulseAudio socket:
docker create -p 8080:3000 -v /run/user/1000/pulse:/var/run/pulse -v ~/.config/pulse/cookie:/root/.config/pulse/cookie --name queuecube queuecube:latest
On some systems, you may need to add --security-opt seccomp=unconfined to allow containerized processes to write to your host's PulseAudio socket.
Once running, you should be able to access the UI via http://localhost:8080.
Video
QueueCube supports video as well. Just set the environment variable ENABLE_VIDEO=1.
Video + Docker
When running in a Docker container, there are a few extra steps needed to make this work.
First, make sure you're passing in /dev/dri as a volume in the container. Since mpd is capable of rendering directly to the GPU, this would be the most performant.
volumes:
- /dev/dri:/dev/dri
as well as the X11 socket:
- /tmp/.X11-unix:/tmp/.X11-unix
In order to be able to interact with the X session from the Docker container, you may also need to explicitly allow connections to the host via:
$ xhost +local:
Since the container will also need to be able to access the GPU device, it may be required to run the container in "privileged" mode:
privileged: true
(or --privileged).
On Podman rootless, it seems to be enough to just run it with the "unconfined" security profile (seccomp=unconfined).
