Natenoms Wiki

Weil Teilen Spaß macht :)

Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

Übersetzungen dieser Seite:

Navigation



Lizenz dieses Wikis
Über dieses Wiki
Feed des Wikis
Impressum


Was gerade in meinem Blog geschieht:

mumble:audiobots:musikbot_mit_mumble-ruby_mpd

Musikbot für Mumble mit Mumble-Ruby und MPD

Der in dieser Anleitung verwendete Bot wird nicht mehr weiterentwickelt und es kann sein, dass die Anleitung nicht mehr funktioniert.

Es wird empfohlen, den Nachfolder des Bots zu verwenden. Eine Installationsanleitung dafür gibt es unter http://mumble-ruby-pluginbot.readthedocs.io/en/latest/installation_howto.html.

Ziel dieser Anleitung

Übersicht

Pro Mumble-Bot laufen je eine Instanz des MPD (Music Player Daemon), die Musik an eine Named Pipe schickt und ein Mumble-Ruby-Bot, der diesen Stream an den Mumble-Server sendet.

Das großartige daran ist, dass Mumble-Ruby seit kurzem Opus verwendet.

MPD spielt dabei eine definierte Playlist ab, die einzelne Stücke oder auch Radiosender enthalten kann.

Wieso gerade MPD und nicht z. B. mplayer? (anklicken zum Anzeigen):

Wieso gerade MPD und nicht z. B. mplayer? (anklicken zum Anzeigen):

Habe auch mit mplayer experimentiert, was mit entsprechenden Einstellunen auch funktioniert; z. B.

mplayer -ao pcm:file=/tmp/play.fifo -af resample=48000,channels=1 https://streamadresse.tld.

Doch einzelne Stücke lassen sich damit nicht abspielen, weil sich anscheinend mumble-ruby nur solange Musik holt, wie auch aktiv in die Pipe geschrieben wird; jedoch haut mplayer das so schnell wie möglich dort hinein und ist bei einem 2 Minuten Lied nach 10 Sekunden fertig. Nach dieser Zeit stoppt auch die Übertragung von mumble-ruby. Habe zu wenig Wissen um das fachlich zu erklären/verstehen.

Ausserdem beginnt mumble-ruby erst mit der Übertragung, wenn auch Daten anliegen, d. h. man muss mplayer und den Bot jedes Mal neu anweisen, etwas zu senden/lesen.

MPD hat hier den Vorteil, dass es wohl auch „Stille“ sendet, also immer etwas in der Pipe ist, man muss beides also nur einmalig starten und kann zwischendrin beliebig umschalten.

Wenn jemand weiss, wie man das mit mplayer oder einem anderen Programm besser machen kann, so möge er sich bitte melden :)


Mit dem Programm mpc kann man MPD steuern.

Alternativ lässt sic zum Steuern von MPD z. B. der Web-Client Rompr verwenden, diese wird jedoch hier nicht behandelt.

Vorteile dieser Lösung im Vergleich zu bisherigen Audiobots mit echtem Mumble-Client

  • Kein X-Server notwendig, nicht einmal ein virtueller X-Server, wie z. B. bei dieser Variante.
  • RAM-Verbrauch ist geringer als mit normalen Mumble-Clienten.
  • Weniger CPU-Verbrauch, da kein PulseAudio oder Jack notwendig.
  • Auch wenn man MPD komplett beendet und wieder startet, so spielt er nach dem Start sofort bei Dateien dort ab, wo er aufgehört hat und bei Streams startet er diesen automatisch wieder.
  • Es lässt sich komplett automatisieren; auch nach einem Restart des ganzen vServers laufen alle Bots :) – dies geht zwar auch mit normalen Mumble-Clienten, jedoch nicht ganz so einfach.
  • Wenn man die Ruby-Scripte im Hintergrund mit & startet, läuft die Musik nicht, daher werden sie in eine tmux-session eingebettet.

Schema für die einzelnen Bots

Um direkt die Möglichkeit zu haben, mehrere Bots laufen zu lassen, läuft die Konfiguration nach folgendem Schema ab:

  • Alle Bots laufen unter demselben Benuzteraccount namens „botmaster“ und auch innerhalb dessen Heimatverzeichnisses.
  • Die Musik landet in Verzeichnis „/home/botmaster/music/“, auf das alle Bots Zugriff erhalten.
  • Der Port für MPD ist 770<botid>, z. B. 7701 für den Bot 1.
  • Jeder Bot erhält einen eigenen Ordner, in dem sich die komplette Konfiguration für MPD befindet, nach dem Muster „/home/botmaster/mpd<botid>/“, z. B. „/home/botmaster/mpd1/“ für Bot 1.
    • Darin befindet sich immer die Konfigurationsdatei mpd.conf.
    • Auch die named pipe (FiFo-Datei), die per audio_output der mpd.conf angegeben werden muss, liegt in diesem Verzeichnis, z. B. „/home/botmaster/mpd1/mpd.fifo“ für Bot 1.

Verzeichnisstruktur

Folgende Verzeichnisstruktur wird es am Ende dieser Anleitung geben:

/home/botmaster/
├── mpd1
│   ├── playlists
│   ├── mpd1.log
│   ├── mpd.conf
│   ├── mpd.fifo
│   ├── pid
│   ├── state
│   ├── sticker.sql
│   └── tag_cache
├── mumble-ruby
│   └── [...]
├── music
├── scripts
│   ├── mumble-ruby-mpd-bot.rb
│   ├── start-all-mpd.sh
│   └── start-all-mumble-ruby-bots.sh
├── user_certificates
│   └── bot1_test_cert
[...]

Abhängigkeiten installieren

Pakete installieren

Unter Debian müssen folgende Abhängigkeiten als root oder mit sudo installiert werden:

apt-get install mpd mpc tmux bzip2 patch

Die Meldung am Ende über die fehlende Datenbank „/var/lib/mpd/tag_cache“ kann man ignorieren, diese wird später automatisch angelegt.

Da der System-weit installierte MPD nicht benötigt wird, deaktiviert man ihn, indem man als root oder mittels sudo in in der Datei /etc/default/mpd die Variable START_MPD von true nach false ändert; somit wird der Dienst beim nächsten Systemstart nicht mehr gestartet.

Installation von Mumble-Ruby

Benötigte Ruby-Bibliotheken installieren

Ausgehend von der oben genannten Anleitung zur Installation von Mumble-Ruby führt man noch folgende Kommandos zur Vorbereitung aus:

  • Einloggen als botmaster (entfällt, wenn man bereits mit diesem Benutzer eingeloggt ist):
    su - botmaster
  • RVM verwenden:
    source ~/.rvm/scripts/rvm
  • Ruby-Umgebung festlegen:
    rvm use @bots

Nun installiert man die benötigte Ruby-Bibliothek, damit Mumble-Ruby mpd steuern kann:

rvm @bots do gem install ruby-mpd

Ausgabe (anklicken zum Anzeigen):

Ausgabe (anklicken zum Anzeigen):

Fetching: ruby-mpd-0.3.1.gem (100%)
Successfully installed ruby-mpd-0.3.1
Parsing documentation for ruby-mpd-0.3.1
Installing ri documentation for ruby-mpd-0.3.1
Done installing documentation for ruby-mpd after 1 seconds
1 gem installed


Benötigte Verzeichnisse erstellen

  • Verzeichnis für die Scripte erstellen:
    mkdir /home/botmaster/scripts
  • Verzeichnis für Musik erstellen:
    mkdir /home/botmaster/music
  • Verzeichnis für die Zertifikate ertellen:
    mkdir /home/botmaster/user_certificates

MPD einrichten - am Beispiel von Bot 1

Verzeichnis erstellen

Verzeichnisse für Bot 1 erstellen:

mkdir -p /home/botmaster/mpd1/playlists

Konfiguration für MPD (Bot 1)

Konfiguration für Bot 1 herunterladen und an den richtigen Ort ablegen:

wget https://github.com/Natenom/mumble-ruby-related/raw/master/configs/mpd.conf -O ~/mpd1/mpd.conf

Für Bot 1 sind keine Anpassungen notwendig, für jeden weiteren Bot muss jedes Vorkommen der Zahl „1“ durch „2“, usw. ersetzt werden.

Weitere Erklärungen zur Konfiguration (anklicken zum Ansehen):

Weitere Erklärungen zur Konfiguration (anklicken zum Ansehen):

Angucken kann man sich die Datei hier.

Von den Standardeinstellungen für Sound abweichend verwendet man hier statt der Samplingrate von 44100 Hz eine von 48000 Hz, die auch bei Mumble verwendet wird. Außerdem brauchen wir nur ein Mono-Signal.

Der Mixer-Typ ist auf Software eingestellt, damit man im MPD-Clienten die Lautstärke auch ohne Soundkarte verändern kann.


Ruby-Script zum allgemeinen Starten eines Bots – am Beispiel von Bot 1

Das folgende Script wird verwendet, um einen Bot auf den Server zu bringen und automatisch Musik von einer MPD-Instanz senden zu lassen.

Script herunterladen und am passenden Ort ablegen:

wget https://github.com/Natenom/mumble-ruby-related/raw/master/scripts/mumble-ruby-mpd-bot.rb -O ~/scripts/mumble-ruby-mpd-bot.rb

Das Script kann man hier ansehen. Es ist eine angepasste Version von einem der SuperTux's bots, die zusätzlich Parameter kennt.

Die Tastenkombination Strg+C beendet den Bot.

Syntax für das Script:

mumbleserver_host mumbleserver_port mumbleserver_username mumbleserver_userpassword mumbleserver_targetchannel quality_bitrate mpd_fifopath mpd_path mpd_host mpd_port

Für Bot 1:

ruby /home/botmaster/scripts/mumble-ruby-mpd-bot.rb mumble.natenom.com 64738 Bot1_Test "" "Sitzecke" 96000 /home/botmaster/mpd1/mpd.fifo localhost 7701

Ein Start würde jetzt natürlich noch nicht funktionieren, da MPD nicht läuft.

Vorsicht bei der Qualitätsangabe:
Wenn der Server nur eine beschränkte Bandbreite erlaubt 1), dann darf hier maximal die vom Mumble-Server erlaubte Qualität verwendet werden, denn Mumble-Ruby hält sich nicht an angegebene Beschränkungen und sendet mit eingestellter Bandbreite, was dann auf solchen Server dazu führt, dass die Bots beginnen zu stottern.

Erzeugtes Zertifikat:
Für jeden Benutzernamen wird beim Start des Scripts im aktuellen Arbeitspfad ein neues Verzeichnis namens BOTNAME_cert erstellt, welches das automatisch erstellte Client-Zertifikat des Bots enthält. Dieses Verzeichnis kann man nach dem Test löschen.

Bash-Scripte zum Starten aller MPD-Instanzen

In die folgende Datei werden alle MPD-Instanzen eingetragen und dann gestartet:

Script herunterladen und am passenden Ort ablegen:

wget https://github.com/Natenom/mumble-ruby-related/raw/master/scripts/start-all-mpd.sh -O ~/scripts/start-all-mpd.sh

Dann muss man es noch ausführbar machen:

chmod u+x /home/botmaster/scripts/start-all-mpd.sh

Bash-Script zum Starten aller Mumble-Ruby-Bots

Das folgende Bash-Script dient zum Starten aller Mumble-Ruby-Bots. Aufgrund der anfangs genannten Problematik, dass im Hintergrund gestartete Ruby-Scripte keine Musik senden, wird jeder Bot in einer eigenen TMUX-Sesssion gestartet.

Das Script herunterladen und am passenden Ort ablegen:

wget https://github.com/Natenom/mumble-ruby-related/raw/master/scripts/start-all-mumble-ruby-bots.sh -O /home/botmaster/scripts/start-all-mumble-ruby-bots.sh

Ansehen kann man das Script hier.

Es startet nur unseren ersten Bot 1; für weitere Bots einfach das Script entsprechend anpassen.

Das Script muss noch ausführbar gemacht werden:

chmod u+x /home/botmaster/scripts/start-all-mumble-ruby-bots.sh

Testen

Nun kann man alles testen, indem man beide Script nacheinander startet:

/home/botmaster/scripts/start-all-mpd.sh
/home/botmaster/scripts/start-all-mumble-ruby-bots.sh

Jetzt sollte sich auf dem Mumble-Server ein Bot befinden, der Musik von TheRadio.cc abspielt.

Vergiss nicht, im script „/home/botmaster/scripts/start-all-mumble-ruby-bots.sh“ die Daten für den Mumble-Server anzupassen, auch den Kanalnamen.

Alles Automatisch starten lassen

Damit bei einem Reboot alles automatisch startet, trägt man als root Folgendes in die /etc/rc.local ein:

su - botmaster -c "/home/botmaster/scripts/start-all-mpd.sh" &
su - botmaster -c "/home/botmaster/scripts/start-all-mumble-ruby-bots.sh" &

Problemlösungen

SSL-Fehler

Streamabbrüche

Die Streams sind immer wieder abgebrochen, dies ist allerdings ein Problem von mpd; es hilft, wenn man in regelmäßigen Abständen per Cron einfach folgendes ausführt:

refreshmpd.sh
#!/bin/bash
for i in $(seq 1 9); do mpc -p 770${i} play; done

In die crontab fügt man einfach folgende Zeile ein:

*/10 * * * * ./refreshmpd.sh

Keine Sorge, der Stream wird nicht neu gestartet, wenn man play ausführt, während der MPD sendet.

1)
Servereinstellung bandwidth
mumble/audiobots/musikbot_mit_mumble-ruby_mpd.txt · Zuletzt geändert: 2017/11/12 09:48 von Natenom