Peppy Player in GUI/Desktop integrieren (7" Raspberry Pi Touch Display) --- stretch/Dürer

  • Vorwort:

    Der Peppy Player ist ein Multimedia-Gerät zum Radio hören, Hörbuch hören, Podcast hören, CD abspielen, ... mit kleinem Touch Display.

    Die Peppy Player Software läuft ohne grafische Oberfläche als einzig sichbare Anwendung auf einem Raspi.

    Deshalb beendet der Ausschalter-Button nicht nur das Programm Peppy Player, sondern "fährt" auf das Betriebssystem sauber herunter.

    Diese Anleitung zeigt, wie man Peppy Player in die grafische Oberfläche (Desktop) integriert.

    Einleitung:

    Diese Anleitung ist nicht für Anfänger gedacht. Man sollte sie komplett durchlesen und verstehen.

    Ich gehe davon aus, daß das 7" Raspberry Pi Touch Display korrekt mit dem Raspi zusammengebaut wurde.

    Handwerkszeug zum "headless" installieren:

    • Windows-Notebook
    • Notepad++ (ein Editor der Windows- und UNIX-Zeilenende kann)
    • Putty
    • RealVNC-Viewer
    • µSD-Karten-"Leser"
    • Internetanschluß

    Das brauche ich für den Peppy Player:

    • Model: RPi 2B, RPi 3B oder RPi3B+
    • Display: 7" Raspberry Pi Touch Display
    • [optional] Bluetooth-USB-Stick (für RPi 2B mit Bluetooth-Lautsprecher)
    • Sound: 3.5mm Klinkenbuchse oder Bluetooth-Lautsprecher.
    • Internet: LAN (wärend der Installation besser) oder WLAN
    • Raspbian Stretch für Desktop
    • Peppy Player (Expert Installation)

    Tutorial:

    1. Raspbian Stretch für Desktop als zip-Datei herunterladen und mit 7zip entpacken.

    2. Die image-Datei (z.B. 2019-04-08-raspbian-stretch.img) mit Win32Imager auf eine 8GB µSD-Karte schreiben.

    3. Änderungen auf der µSD-Karte unter Windows

    3.1 eine leere Datei ssh oder ssh.txt auf der µSD-Karte anlegen. Das aktiviert den ssh-Zugang über Putty.

    3.2 [optional] für WLAN-Zugang folgende Datei (mit UNIX-Zeilenenden) auf µSD-Karte anlegen.

    Code: wpa_supplicant.conf
    country=DE
    ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
    update_config=1
    
    # WPA2
    network={
        ssid="wlan-Name"
        psk="super geheimes Passwort"
        key_mgmt=WPA-PSK
    }

    3.3 Damit der Desktop nicht auf dem Kopf steht, schreibt man (z.B. mit Notepad++) ans Ende der Datei config.txt die Zeile:

    lcd_rotate=2

    4. µSD-Karte aus dem Notebook in den Raspi

    4.1 Mit Windows Funktion: Hardware sicher entfernen, die µSD-Karte abschließen.

    4.2.1 Die µSD-Karte vom Notebook entnehmen und

    4.2.2 in Raspi mit 7"-Display stecken,

    4.3.1 LAN-Kabel in Raspi stecken,

    4.3.2 Netzteil in Raspi stecken und

    4.3.3 Netzteil einschalten

    5. nach dem Booten des Raspi, konfiguriert man mit dem Touch Display

    5.1 Software aktualisiieren

    5.2 Land (für Sprache) und Zeitzone

    5.3 Reboot

    6. Mit Putty nach Host: raspberrypi verbinden, Login (Benutzer: pi Passwort: raspberry)

    7. Peppy Player - Expert-Konfiguration:

    Expert Konfiguration für Dürer Edition

    Entfallen: Configure HiFiBerry Amp2

    Entfallen: Equalizer Configuration

    Entfallen: Peppyalsa Plugin Configuration

    Info: ich benutze keinen Equalizer und auch nicht die Screensaver: VU-Meter oder Spektrum.

    sudo raspi-config -> Interfacing Options -> VNC

    nur noch vnc aktivieren

    pi User Configuration

    In order to run Peppy Player under pi user instead of sudo add pi user to the tty group:

    sudo usermod -a -G tty pi

    Also change access rights to tty device by changing udev rules:

    sudo nano /lib/udev/rules.d/50-udev-default.rules

    change line: SUBSYSTEM=="tty", KERNEL=="tty[0-9]*", GROUP="tty", MODE="0620"

    to: SUBSYSTEM=="tty", KERNEL=="tty[0-9]*", GROUP="tty", MODE="0660"

    Without these changes Pygame will crash with exception Unable to open console when started under pi user.

    Schließlich muß man in Datei ~/Peppy/players.txt das hw durch default ersetzen für vlc oder wenn man mplayer verwendet, auch für mplayer:

    Code: /home/pi/Peppy/players.txt
    ...
    [vlc.linux] 
    server.command = --aout=alsa --alsa-audio-device=default --verbose=-1
    ...
    [mplayer.linux]
    server.folder = /usr/bin
    server.command = mplayer -ao alsa:device=default -idle -slave -quiet -msglevel statusline=6 -msglevel global=6 -softvol
    ...

    Info:

    Die Alsa-Konfigurations-Datei ~/.asoundrc enthält das ausgewählte Audiogerät als "alsa default device". Durch die Auswahl wird diese Datei jedesmal überschrieben (also Finger weg!).

    Audiogerät auswählen: Klicke mit der rechten Maustaste auf das Lautsprecher-Symbol in der Taskleiste und wähle dann das Audiogerät aus.

    8. Peppy Player ins Desktop Menü integrieren

    so geht's

    Die Datei peppy-menu.tgz

    1. auf Windows-Rechner herunterladen (also auf Link klicken ...),

    2. auf den Raspi verschieben und *1

    3. dort entpacken*2 mit Kommando tar -xzf peppy-menu.tgz

    entsteht das Verzeichnis peppy-menu

    4. mit Kommando cd peppy-menu; /bin/sh peppy-menu.sh

    werden Icons und Menu-Eintrag angelegt.

    5. sicherheitshalber Reboot mit sudo shutdown -r now

    *1 z.B. mit WinSCP, z.B. ins Home-Verzeichnis von Benutzer pi

    *2 z.B. mit putty im Home-Verzeichnis von Benutzer pi

    9. Test am 7" Touch Display oder mit VNC Viewer

    mit Klick startet man den Peppy Player

    mit rechts-Klick auf "Peppy Player" kann man ein Desktop-Icon anlegen.


    Achtung:

    1. Egal wie man Peppy Player oder sein Fenster beendet, wird der Raspi heruntergefahren.
    2. Der Peppy Player Window-Title (Taskleiste und Window) ist pygame window

    Beides kann man ändern, siehe Beitrag #2

    10. Getestet mit RPi 2B und Bluetooth-Lautsprecher

    Verbesserungsvorschläge sind erwünscht

    4 Mal editiert, zuletzt von kle (1. Mai 2019 um 17:29)

  • Peppy Player in GUI/Desktop integrieren (7" Raspberry Pi Touch Display) --- stretch/Dürer? Schau mal ob du hier fündig wirst!

  • Peppy Player Optimierung für Desktop/GUI

    1. Weil der Peppy Player eigenlich ein Computer ist, der vor dem Ausschalten heruntergefahren werden muß, wird durch Betätigen von Button oder durch der Raspi heruntergefahren.

    Das ist für die grafische Oberfläche (Desktop/GUI) nicht sinnvoll.

    Peppy Player beenden anstatt "ausschalten"

    vor der Änderung:

    Code: ~/Peppy/peppy.py
                    if self.config[LINUX_PLATFORM]:
                        subprocess.call("sudo poweroff", shell=True)
                    else:
                        if self.config[AUDIO][PLAYER_NAME] == MPD:

    nach der Änderung:

    Code: ~/Peppy/peppy.py
                    if self.config[LINUX_PLATFORM]:
                        #subprocess.call("sudo poweroff", shell=True)
                        sys.exit()
                    else:
                        if self.config[AUDIO][PLAYER_NAME] == MPD:

    Änderung speichern und Editor verlassen.

    Nach dem nächsten Starten, wird Peppy Player beendet, aber nicht mehr der Raspi heruntergefahren.

    2. Auf der grafischen Oberfläche sieht man den Peppy Player in der Task-Leiste und über dem Window als pygame window

    Window Title korrigieren

    vor der Änderung:

    Code: ~/Peppy/util/config.py
            pygame.font.init()
        
            if self.config[LINUX_PLATFORM]:
                pygame.mouse.set_visible(False)
            else:
                pygame.display.set_caption("Peppy")

    nach der Änderung:

    Code: ~/Peppy/util/config.py
            pygame.font.init()
    
            pygame.display.set_caption("Peppy")
            if self.config[LINUX_PLATFORM]:
                pygame.mouse.set_visible(False)
            #else:
            #    pygame.display.set_caption("Peppy")

    Änderung speichern und Editor verlassen.

    Beim nächsten Starten von Peppy Player sieht es so aus:

    Beitrag #1 wurde aktualisiert

    3 Mal editiert, zuletzt von kle (4. Mai 2019 um 11:12) aus folgendem Grund: replace subprocess.call("sudo poweroff",..) with sys.exit()

  • kle, danke für sehr detaillierte Installationsanweisungen. Ich benutze den offiziellen 7-Zoll-Touchscreen nicht selbst,

    hatte jedoch einige Fragen zur Verwendung von Peppy. Es wäre hilfreich, ein Disk-Image für diese Anzeige zu haben,

    um den Konfigurationsprozess zu vereinfachen. Es wäre auch toll, ein anderes Image für die 7 "Anzeige zu haben,

    das auf dem Raspbian Lite basiert. Ich denke Einige Leute konnten es auch konfigurieren.

    Ich werde das Herunterfahren von Linux in der nächsten Version konfigurierbar machen. Die nächste Version wird

    jedoch verschoben da ich gerade an dem neuen Hardwareprojekt arbeite:

    https://www.diyaudio.com/forums/tubes-v…w-tube-amp.html

    Daher können stattdessen Ihre Codeänderungen verwendet werden.

    ---------------------------------------------------------------------------------------------------------------

    kle, thank you for very detailed installation instructions. I don't use the official 7" touchscreen myself but had several

    questions regarding its usage with Peppy. It would be helpful to have a disk image for that display to simplify the

    configuration process. Also it would be great to have another disk image for 7" display but based on the Raspbian Lite.

    I think some people were able to configure it as well.

    I'll make Linux shutdown configurable in the next release. Though the next release will be postponed as I'm currently

    working on the new hardware project:

    https://www.diyaudio.com/forums/tubes-v…w-tube-amp.html

    So your code changes could be used meanwhile.

    Peppy Player Entwickler. Ehemaliger DESY (Hamburg) Entwickler :)

  • peppy.player

    Es wäre hilfreich, ein Disk-Image für diese Anzeige zu haben, um den Konfigurationsprozess zu vereinfachen. Es wäre auch toll, ein anderes Image für die 7 "Anzeige zu haben, das auf dem Raspbian Lite basiert.

    Das Desktop/GUI image für das offizielle 7" Touch Display gibt es schon.

    Für das Raspbian Stretch Lite Image für das offizielle 7" Touch Display muß ich die Kalibrierung ohne Desktop/GUI erkunden.

    Schönen Gruß, kle

  • Fatal Python error: GC object already tracked

    Hallo,

    Ich habe versucht den Peppy Player Dürer Edition (ein Python3 Pygame Skript),

    - auf dem offiziellen 7" Raspberry Pi Touch Display

    - ohne grafische Oberfläche zu starten.

    OS: 2019-04-08-raspbian-stretch-lite.img

    Model: RPi 2B

    Display: offizielles 7" Raspberry Pi Touch Display mit Controller FT5406

    bin nach der Anleitung in Beitrag #1, 3-7 vorgegangen.

    Wenn ich mit putty als user pi:

    cd ~/Peppy; openvt -s -- python3 peppy.py

    eingebe, dann sehe ich auf dem 7" Touch Display das:

    wenn ich mit putty als Benutzer pi:

    cd ~/Peppy; python3 peppy.py

    eingebe, kommt:

    pygame.error: Unable to open a console terminal

    also ich sehe im putty Fenster

    das ist normal so, mit allen mir bekannten Displays.

    Das offizielle 7" Raspberry Pi Touch Display ist capacitive, meine anderen Display sind resistant.

    The nifty thing about capacitive touch screens is that they do not require calibration! The calibration is done 'in chip' on the screen itself. However, we still do need to tell the Pi how to read the capacitive chip.

    Laut adafruit braucht man kapazitive Touchscreens nicht zu kalibrieren.

    ts_test erkennt das Display nicht,

    TSLIB_FBDEVICE=/dev/fb0 TSLIB_TSDEVICE=/dev/input/event0 ts_test

    oder

    TSLIB_TSDEVICE=/dev/input/event0 ts_test

    sagen:

    selected device is not a touchscreen i understand

    wohl aber evtest.

    evtest

    root@raspberrypi:/home/pi/Peppy# evtest

    No device specified, trying to scan all of /dev/input/event*

    Available devices:

    /dev/input/event0: FT5406 memory based driver

    Select the device event number [0-0]: 0

    Input driver version is 1.0.1

    Input device ID: bus 0x0 vendor 0x0 product 0x0 version 0x0

    Input device name: "FT5406 memory based driver"

    Supported events:

    Event type 0 (EV_SYN)

    Event type 1 (EV_KEY)

    Event code 330 (BTN_TOUCH)

    Event type 3 (EV_ABS)

    Event code 0 (ABS_X)

    Value 0

    Min 0

    Max 800

    Event code 1 (ABS_Y)

    Value 0

    Min 0

    Max 480

    Event code 47 (ABS_MT_SLOT)

    Value 0

    Min 0

    Max 9

    Event code 53 (ABS_MT_POSITION_X)

    Value 0

    Min 0

    Max 800

    Event code 54 (ABS_MT_POSITION_Y)

    Value 0

    Min 0

    Max 480

    Event code 57 (ABS_MT_TRACKING_ID)

    Value 0

    Min 0

    Max 65535

    Properties:

    Property type 1 (INPUT_PROP_DIRECT)

    Testing ... (interrupt to exit)

    Event: time 1556817629.525083, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 0

    Event: time 1556817629.525083, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 53

    Event: time 1556817629.525083, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 61

    Event: time 1556817629.525083, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1

    Event: time 1556817629.525083, type 3 (EV_ABS), code 0 (ABS_X), value 53

    Event: time 1556817629.525083, type 3 (EV_ABS), code 1 (ABS_Y), value 61

    Event: time 1556817629.525083, -------------- SYN_REPORT ------------

    Event: time 1556817629.565074, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 58

    Event: time 1556817629.565074, type 3 (EV_ABS), code 0 (ABS_X), value 58

    Event: time 1556817629.565074, -------------- SYN_REPORT ------------

    Event: time 1556817629.605056, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 61

    Event: time 1556817629.605056, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 57

    Event: time 1556817629.605056, type 3 (EV_ABS), code 0 (ABS_X), value 61

    Event: time 1556817629.605056, type 3 (EV_ABS), code 1 (ABS_Y), value 57

    Event: time 1556817629.605056, -------------- SYN_REPORT ------------

    Event: time 1556817629.645070, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value -1

    Event: time 1556817629.645070, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 0

    Event: time 1556817629.645070, -------------- SYN_REPORT ------------

    Event: time 1556817631.125066, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 1

    Event: time 1556817631.125066, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 766

    Event: time 1556817631.125066, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 47

    Event: time 1556817631.125066, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1

    Event: time 1556817631.125066, type 3 (EV_ABS), code 0 (ABS_X), value 766

    Event: time 1556817631.125066, type 3 (EV_ABS), code 1 (ABS_Y), value 47

    Event: time 1556817631.125066, -------------- SYN_REPORT ------------

    Event: time 1556817631.165065, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 765

    Event: time 1556817631.165065, type 3 (EV_ABS), code 0 (ABS_X), value 765

    Event: time 1556817631.165065, -------------- SYN_REPORT ------------

    Event: time 1556817631.205061, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 764

    Event: time 1556817631.205061, type 3 (EV_ABS), code 0 (ABS_X), value 764

    Event: time 1556817631.205061, -------------- SYN_REPORT ------------

    Event: time 1556817631.245062, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 761

    Event: time 1556817631.245062, type 3 (EV_ABS), code 0 (ABS_X), value 761

    Event: time 1556817631.245062, -------------- SYN_REPORT ------------

    Event: time 1556817631.285058, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 758

    Event: time 1556817631.285058, type 3 (EV_ABS), code 0 (ABS_X), value 758

    Event: time 1556817631.285058, -------------- SYN_REPORT ------------

    Event: time 1556817631.365053, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value -1

    Event: time 1556817631.365053, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 0

    Event: time 1556817631.365053, -------------- SYN_REPORT ------------

    Event: time 1556817632.885093, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 2

    Event: time 1556817632.885093, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 52

    Event: time 1556817632.885093, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 422

    Event: time 1556817632.885093, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1

    Event: time 1556817632.885093, type 3 (EV_ABS), code 0 (ABS_X), value 52

    Event: time 1556817632.885093, type 3 (EV_ABS), code 1 (ABS_Y), value 422

    Event: time 1556817632.885093, -------------- SYN_REPORT ------------

    Event: time 1556817632.925059, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 50

    Event: time 1556817632.925059, type 3 (EV_ABS), code 0 (ABS_X), value 50

    Event: time 1556817632.925059, -------------- SYN_REPORT ------------

    Event: time 1556817633.005050, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 49

    Event: time 1556817633.005050, type 3 (EV_ABS), code 0 (ABS_X), value 49

    Event: time 1556817633.005050, -------------- SYN_REPORT ------------

    Event: time 1556817633.045056, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value -1

    Event: time 1556817633.045056, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 0

    Event: time 1556817633.045056, -------------- SYN_REPORT ------------

    Event: time 1556817634.165062, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 3

    Event: time 1556817634.165062, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 740

    Event: time 1556817634.165062, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 436

    Event: time 1556817634.165062, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1

    Event: time 1556817634.165062, type 3 (EV_ABS), code 0 (ABS_X), value 740

    Event: time 1556817634.165062, type 3 (EV_ABS), code 1 (ABS_Y), value 436

    Event: time 1556817634.165062, -------------- SYN_REPORT ------------

    Event: time 1556817634.205065, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 435

    Event: time 1556817634.205065, type 3 (EV_ABS), code 1 (ABS_Y), value 435

    Event: time 1556817634.205065, -------------- SYN_REPORT ------------

    Event: time 1556817634.285053, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value -1

    Event: time 1556817634.285053, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 0

    Event: time 1556817634.285053, -------------- SYN_REPORT ------------

    ^Croot@raspberrypi:/home/pi/Peppy#

    Peppy Player als root aufgerufen

    Peppy Player mit 7" Touchscreen, als Benutzer root aufgerufen:

    root@raspberrypi:/home/pi/Peppy# python3 peppy.py

    Segmentation fault

    vorher mußte ich alle python module die ich für Benutzer pi importiert habe, auch für Benutzer root importieren (mit pip3 import --user ...)

    Schönen Gruß, kle

    Edit 03.05.2019 12:30: der gleiche Fehler passiert mit dem durer-headless.zip, wenn man

    1. den autostart von Peppy Player in /etc/rc.local auskommentiert
      so: #su pi -c 'cd /home/pi/Peppy; openvt -s -- python3 peppy.py'
    2. und in ~/Peppy/config.txt use.headless=False setzt.

    Achtung: manchmal bleibt der Touchscreen schwarz, dann reboot oder Netzteil aus der Steckdose ziehen.

    Ich verfolge mal die Spur, die Koepisch in Peppy WebRadio, Beitrag#119ff gelegt hat.

    Einmal editiert, zuletzt von kle (3. Mai 2019 um 12:41)

  • Hallo,

    bei mir läuft das Februar Peppy Image (ohne GUI Geraffel) nach einigen Anpassungen an Konfiguration und Sourcecode mit dem 7" Display. Am Wochenende werde ich mal Fotos in dem originalen Peppy-Thread einfügen. Alle Programmänderungen an Peppy könnte ich über einen Compare herausfinden - elementar sind da nur die Anpassungen im Bereich der Eventverarbeitung. Die Änderungen an den Konfig-Dateien sind da schon schwieriger, da mir der VORHER-Stand fehlt. Ich muss das dann einzeln durchforsten.

    @peppy.player : Gab es da einen "Fertige Projekte" thread?

    Grüße

    Koepisch

  • Nee, PeppyPlayer hatte mal erwähnt, dass ich Bilder von meinem fertigen Projekt irgendwo ablegen kann. Eine Art Gallerie oder so. Seit dem ich das im Februar fertiggestellt habe, war ich aber überhaupt nicht mehr auf den Peppy Seiten gewesen. Ich werde mir aber auf jeden Fall mal die Releasenotes seit Februar anschauen.

  • Hallo,

    Hier ist der Link zur Galerie:

    https://github.com/project-owner/…oc/wiki/Gallery

    Jeder Peppy-Benutzer ist zur Teilnahme herzlich willkommen. Geben Sie einfach einige Bilder Ihres Projekts an

    und kurze Beschreibung.

    Koepisch, es wäre schön, alle für Peppy erforderlichen Änderungen zu sammeln

    auf dem offiziellen Display ohne grafischen Desktop. Wir könnten diese Änderungen vornehmen

    konfigurierbar und ich könnte sie in die nächste Version aufnehmen. Ich brauche nur Hilfe von

    Ihr Jungs, ich habe diese Anzeige nicht.

    Vielen Dank!

    ---------------------------------------------------------------------------------------------------

    Hi,

    Here is the link to the gallery:

    https://github.com/project-owner/…oc/wiki/Gallery

    Every Peppy user is welcomed to participate. Just provide some images of your project

    and short description.

    Koepisch, it would be great to collect all your changes required to run Peppy

    on the official display without graphical desktop. We could make those changes

    configurable and I could include them to the next release. I'll just need help from

    you guys as I don't have that display.

    Thank you!

    Peppy Player Entwickler. Ehemaliger DESY (Hamburg) Entwickler :)

  • Sie können Ihre Bilder und eine kurze Beschreibung in folgendem Thread posten:

    Peppy WebRadio

    Ich kann es von dort holen und auf der Github Gallery posten. Bitte erwähnen Sie,

    wie Sie in der Galerie angerufen werden möchten.

    Vielen Dank!

    --------------------------------------------------------------------------------------------------------------------

    You can post your images and short description on the following thread:

    Peppy WebRadio

    I can grab it from there and post on the github Gallery. Please mention how you would

    like to be called in the Gallery.

    Thank you!

    Peppy Player Entwickler. Ehemaliger DESY (Hamburg) Entwickler :)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!