Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. [Vorlage] Spotify Skript

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.9k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.3k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.5k

[Vorlage] Spotify Skript

Scheduled Pinned Locked Moved Skripten / Logik
javascript
745 Posts 95 Posters 266.1k Views 41 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Offline
    M Offline
    mikiline
    wrote on last edited by
    #394

    ich denke er meint damit das diese nicht "eingeloggt" sein können bei spotify als reiner client. Gleiches habe mit meinem Onkyo. Geht nur wenn ich per Handy Streame…..Allerdings wird er dann auch unter den Devices gelisted.

    1 Reply Last reply
    0
    • twonkyT Offline
      twonkyT Offline
      twonky
      wrote on last edited by
      #395

      Genau was mikiline sagt :)

      @Mic: Ab der Version 0.3.0 gibt es eine Einstellung um das zu umgehen. Es gibt dafür sogar ein älteres Ticket direkt bei Spotify: https://github.com/spotify/web-api/issues/605

      Die neue Version 0.3.0 enthält auch noch folgendes:

      • Die Geräte und Playlisten States bestehen nun aus der Id und nicht mehr aus dem Namen, um besser mit Sonderzeichen umzugehen. (Da werden in Zukunft einige vom ioBroker nicht mehr unterstützt)

      • Neue States um Geräte als SelectBox auszuwählen: devices.deviceList, devices.deviceListIds, devices.deviceListString, devices.availableDeviceListIds, devices.availableDeviceListString

      • Neue States um Playlisten als SelectBox auszuwählen: playlists.playlistList, playlists.playlistListIds, playlists.playlistListString, playlists.yourPlaylistListIds, playlists.yourPlaylistListString

      1 Reply Last reply
      0
      • S Offline
        S Offline
        schubi82
        wrote on last edited by
        #396

        Hi twonky, irgendwie funktioniert das Tracklist-Widget nicht mehr (wahrscheinlich nach dem Update). Hat sich etwas geändert? Die Dateinamen sind meine ich gleich geblieben…

        1 Reply Last reply
        0
        • twonkyT Offline
          twonkyT Offline
          twonky
          wrote on last edited by
          #397

          @schubi82: Geht es etwas genauer? Was meinst du mit Tracklist-Widget? Hast du mal ein VIS Export als Beispiel?

          1 Reply Last reply
          0
          • S Offline
            S Offline
            schubi82
            wrote on last edited by
            #398

            Du hattest mir mal das Skript zur Verfügung gestellt, welches die Titel in einer HTML-Liste anzeigt:

            `createState('javascript.0.spotify-premium.trackListHtml', '', false);
            
            function refreshTrackList() {
            	var current = getState('spotify-premium.0.playbackInfo.playlist.trackList').val;
            	var source = getState('spotify-premium.0.playbackInfo.playlist.trackListArray').val;
            	var html = '';
            
            	for (var i = 0; i < source.length; i++) {
            		html += '';
            		html += '';
            		html += '';
            		html += '';
            	}
            
            	html += '
            
            | ';
            		if(current == i) html += '**';
            		html += source[i].artist;
            		if(current == i) html += '**';
            		html += ' | ';
            		if(current == i) html += '**';
            		html += source[i].title;
            		if(current == i) html += '**';
            		html += ' |
            
            ';
            
            	setState('javascript.0.spotify-premium.trackListHtml', html, true);
            }
            
            on('spotify-premium.0.playbackInfo.playlist.trackList', refreshTrackList);
            on('spotify-premium.0.playbackInfo.playlist.trackListArray', refreshTrackList);
            
            refreshTrackList();
            
            // [{"tpl":"tplHtml","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","refreshInterval":"0","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"html":"{javascript.0.spotify-premium.trackListHtml}"},"style":{"left":"669px","top":"207px","width":"303px","height":"454px"},"widgetSet":"basic"}]`
            
            Und das hatte ich per Widget eingepflegt:
            
            `~~[code]~~[{"tpl":"tplHtml","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","refreshInterval":"0","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"html":"{javascript.0.Spotify.trackListHtml}"},"style":{"left":"669px","top":"207px","width":"303px","height":"454px"},"widgetSet":"basic"}][/code]`
            
            Und irgendwie ist die Liste nun leer...[/i][/i]
            
            1 Reply Last reply
            0
            • twonkyT Offline
              twonkyT Offline
              twonky
              wrote on last edited by
              #399

              Ach das :D In deinem Widget wird die falsche ID abgefragt.

              Dort steht: javascript.0.Spotify.trackListHtml

              Es sollte sein: javascript.0.spotify-premium.trackListHtml

              Und ändere in deinem Skript bitte mal die Zeile:

              html += '';
              
              

              in:

              html += '';
              
              
              1 Reply Last reply
              0
              • Alex1808A Offline
                Alex1808A Offline
                Alex1808
                wrote on last edited by
                #400

                @twonky:

                Und ändere in deinem Skript bitte mal die Zeile: `

                Hallo,

                habe iobroker.spotify-premium adapter auch eine Woche am laufen gehabt, aber seit ein paar tage funktionieren widgets nicht mehr. Zeigen alle "undefined" an.

                Widgetsbeispiele habe ich vom Github. (Adapter v. 0.3.1 (2018.06.20))

                ! 513_screenshot_at_juni_21_09-07-55.png

                Wurde was geändert?

                1 Reply Last reply
                0
                • twonkyT Offline
                  twonkyT Offline
                  twonky
                  wrote on last edited by
                  #401

                  @Alex1808: Was steht bei dir in den States:

                  • spotify-premium.0.playbackInfo.playlist.trackListNumber

                  • spotify-premium.0.playbackInfo.playlist.trackListString

                  • spotify-premium.0.devices.availableDeviceListIds

                  • spotify-premium.0.devices.availableDeviceListString

                  • spotify-premium.0.playlists.playlistListIds

                  • spotify-premium.0.playlists.playlistListString
                    ?

                  Welche VIS Version benutzt du?

                  1 Reply Last reply
                  0
                  • Alex1808A Offline
                    Alex1808A Offline
                    Alex1808
                    wrote on last edited by
                    #402

                    @twonky:

                    @Alex1808: Was steht bei dir in den States: `

                    • spotify-premium.0.playbackInfo.playlist.trackListNumber
                    > Leer
                    
                    • spotify-premium.0.playbackInfo.playlist.trackListString

                      Leer

                    • spotify-premium.0.devices.availableDeviceListIds

                      Leer

                    • spotify-premium.0.devices.availableDeviceListString

                      Leer

                    • spotify-premium.0.playlists.playlistListIds

                      Leer

                    • spotify-premium.0.playlists.playlistListString

                      Leer

                    > Welche VIS Version benutzt du?
                    VIS v1.1.4, admin v3.4.6, Redis v3.2.6, Node v8.11.3, NPM 6.1.0

                    1 Reply Last reply
                    0
                    • twonkyT Offline
                      twonkyT Offline
                      twonky
                      wrote on last edited by
                      #403

                      @Alex1808: Da die States leer sind, kann auch nix angezeigt werden. Ist dein Spotify Adapter denn korrekt authorisiert, also steht der State "spotify-premium.0.authorization.authorized" auf true?

                      Die States spotify-premium.0.devices.availableDeviceList* sollten auf jedenfall was enthalten, wenn du gerade eine Playlist abspielst.

                      1 Reply Last reply
                      0
                      • Alex1808A Offline
                        Alex1808A Offline
                        Alex1808
                        wrote on last edited by
                        #404

                        @twonky:

                        @Alex1808: Da die States leer sind, kann auch nix angezeigt werden. Ist dein Spotify Adapter denn korrekt authorisiert, also steht der State "spotify-premium.0.authorization.authorized" auf true?

                        Die States spotify-premium.0.devices.availableDeviceList* sollten auf jedenfall was enthalten, wenn du gerade eine Playlist abspielst. `

                        Ja, Autorisation ist auf true. Habe auch versucht Autorisierung neu durchzuführen (Erfolgreich)

                        ! 513_screenshot_at_juni_21_22-36-58.png

                        spotify-premium.0.devices.availableDeviceList ist gefühlt

                        ! 513_screenshot_at_juni_21_22-38-09.png

                        ! 513_screenshot_at_juni_21_22-51-04.png

                        Hatt ja auch einige tage funktioniert, nur habe ich bemerkt das beim langem Standby werden Fehler im log angezeigt. Dann habe mit einem Skript im VIS eine taste eingebaut die Instanz ausschaltet/einschaltet. Aber die hat nur Instanz gesteuert.

                        1 Reply Last reply
                        0
                        • B4n4n3B Offline
                          B4n4n3B Offline
                          B4n4n3
                          wrote on last edited by
                          #405

                          Hallo zusammen,

                          ich bin da nun echt nicht so tief drin um wirklich mitreden zu können, aber gibt es was neues bzgl. den Sonos Devices?

                          Die werden bei mir nicht aufgelistet. Ich hab hier allerdings etwas in der API von Spotify gefunden… könnte das helfen?

                          https://developer.spotify.com/documenta ... e-devices/

                          Kann das, sofern noch nicht geschehen, im Spotify Adapter implementiert werden?

                          Bitte steinigt mich nicht, wenn ich etwas falsch verstehe ;-)

                          Grüße B4n4n3

                          1 Reply Last reply
                          0
                          • twonkyT Offline
                            twonkyT Offline
                            twonky
                            wrote on last edited by
                            #406

                            @B4n4n3: Sonos Geräte funktionieren irgendwie anders. Ich kann das leider nicht testen, da ich keins habe. (Ich sollte vielleicht in der Adapter Beschreibung erwähnen, das Sonos Geräte nicht funktionieren.) Der von dir verlinkte API Punkt wird bereits abgefragt, solange die Sonos Geräte dort nicht auftauchen, kann ich auch nix machen.

                            1 Reply Last reply
                            0
                            • B4n4n3B Offline
                              B4n4n3B Offline
                              B4n4n3
                              wrote on last edited by
                              #407

                              Hmm… ok, danke für die Antwort! Das ist sehr schade. Ich hoffe Spotify und Sonos schaffen es bald das die Geräte da auftauchen.

                              1 Reply Last reply
                              0
                              • Alex1808A Offline
                                Alex1808A Offline
                                Alex1808
                                wrote on last edited by
                                #408

                                @twonky:

                                @Alex1808: Da die States leer sind, kann auch nix angezeigt werden. Ist dein Spotify Adapter denn korrekt authorisiert, also steht der State "spotify-premium.0.authorization.authorized" auf true?

                                Die States spotify-premium.0.devices.availableDeviceList* sollten auf jedenfall was enthalten, wenn du gerade eine Playlist abspielst. `

                                Adapter komplet runter und neu installiert. Alle Daten sind wieder da.

                                Jetzt habe alle drei Häkchen bei Einstellungen aktiviert.

                                Werde nach einer Woche berichten :)

                                1 Reply Last reply
                                0
                                • MicM Offline
                                  MicM Offline
                                  Mic
                                  Developer
                                  wrote on last edited by
                                  #409

                                  Hallo,

                                  falls Ihr auch mit der Problematik betroffen seid:

                                  wenn eine Alexa-Gruppe verwendet wird (z.B. "Überall") und ein oder mehrere Alexa dieser Gruppe vom Strom getrennt und wieder angeschlossen werden, so werden diese Geräte teils doppelt als Datenpunkte mit neuen IDs angelegt, ebenso wie die Gruppe(n). Wird in den Adapter-Einstellungen "Nicht mehr vorhandene Geräte löschen" gesetzt, löscht dieser dann auch die doppelten Geräte mit der "alter" ID. Hierbei werden aber auch neue IDs für Alexa-Gruppen (z.B. "Überall") vergeben, so dass man diese nicht mehr per Javascript mit z.B. "spotify-premium.0.devices.d1326ee273282053fe764144b8cd2376e2df5f88.useForPlayback" ansprechen kann, da diese ja nicht mehr vorhanden ist.

                                  Fehlermeldung im Log alle 5 Sekunden: "no playback content".

                                  Mein Workaround hierzu ist folgender:

                                  Ich ermittle über den Namen des Gerätes bzw. der Gruppe die Geräte-ID:

                                      /** 
                                       * Get the device ID from Spotify Premium Adapter for a given Device Name (like "Überall")
                                      */
                                      function spotifyGetDeviceIDfromName(strAlexaDeviceName) {
                                  
                                          // Get Device information string, separated by ";"
                                          var strDeviceIDs = getState("spotify-premium.0.devices.availableDeviceListIds").val;
                                          var strDeviceNames = getState("spotify-premium.0.devices.availableDeviceListString").val;
                                  
                                          // Split into Array
                                          var aDeviceIDs = strDeviceIDs.split(";");
                                          var aDeviceNames = strDeviceNames.split(";");
                                  
                                          // Get Array position of name
                                          var intPos = aDeviceNames.indexOf(strAlexaDeviceName);
                                  
                                          // Get device ID string
                                          var strDevID = aDeviceIDs[intPos];
                                  
                                          return strDevID;
                                  
                                      }
                                  

                                  Dann kann man diese über setState() entsprechend per Geräte-Namen (und nicht neu vergebener ID) steuern:

                                  var strDeviceID = spotifyGetDeviceIDfromName('Überall');
                                  setState("spotify-premium.0.devices." + strDeviceID + ".useForPlayback", true);
                                  
                                  1 Reply Last reply
                                  0
                                  • besterquesterB Offline
                                    besterquesterB Offline
                                    besterquester
                                    Developer
                                    wrote on last edited by
                                    #410

                                    Hallo Zusammen,

                                    Ich habe die Skripts getestet und die laufen bei mir sehr gut. Ich habe auch noch ein paar kleine Änderungen durchgeführt damit man danach noch mit CSS das Layout ändern kann.

                                    `createState('javascript.0.spotify-premium.trackListHtml', '', false);
                                    
                                    function refreshTrackList() {
                                    	var current = getState('spotify-premium.0.playbackInfo.playlist.trackList').val;
                                    	var source = getState('spotify-premium.0.playbackInfo.playlist.trackListArray').val;
                                    
                                    	var html = ' ';
                                    
                                        var strRowClass = '';
                                        var strSelectedClass = '';
                                    
                                        // create caption
                                    	html += '';
                                        html += '';
                                        html += '';
                                        html += '';
                                        html += '';
                                    
                                    	for (var i = 0; i < source.length; i++) {
                                    
                                    	    if ((i%2) === 0) {
                                    	        strRowClass = "idRowOdd";
                                    	    } else {
                                    	        strRowClass = "idRowEven";
                                    	    }
                                    	    if (current == i) {
                                    	       strSelectedClass = "selectedRow";
                                    	    } else {
                                    	       strSelectedClass = "";
                                    	    }
                                    
                                    		html += '';
                                    
                                    		html += '';
                                    
                                    		html += '';
                                    
                                    		html += '';
                                    
                                    		html += '';
                                    	}
                                    
                                    	html += '
                                    
                                    |  Nr  |  Artist  |  Title  |
                                    | ';
                                    		html += i.toString();
                                    	    html += ' | ';
                                    		html += source[i].artist;
                                    		html += ' | ';
                                    		html += source[i].title;
                                    		html += ' |
                                    
                                    ';
                                    
                                    	setState('javascript.0.spotify-premium.trackListHtml', html, true);
                                    }
                                    
                                    on('spotify-premium.0.playbackInfo.playlist.trackList', refreshTrackList);
                                    on('spotify-premium.0.playbackInfo.playlist.trackListArray', refreshTrackList);
                                    
                                    refreshTrackList();` 
                                    
                                    Hier mein Widget welches ich verwende:
                                    `~~[code]~~[{"tpl":"tplHtml","data":{"g_fixed":true,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","refreshInterval":"0","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"html":"{javascript.0.spotify-premium.trackListHtml}","class":"myTextStyle myBoxStyle"},"style":{"left":"576px","top":"178px","width":"674px","height":"465px","overflow-y":"visible"},"widgetSet":"basic"}]
                                    [/code]`
                                    
                                    und hier noch die CSS Codes:
                                    `~~[code]~~.table1  {
                                       width:100%;    
                                    }
                                    
                                    .idRowOdd{
                                        background-color: #3c495e;
                                    }
                                    
                                    .selectedRow {
                                        background-color: #234690;
                                        color: white;
                                    } 
                                    
                                    .idRowEven:hover,
                                    .idRowOdd:hover{
                                        background-color: #f8f8f8;
                                    }
                                    .myBoxStyle div {
                                        border-top-right-radius:8px;
                                        border-top-left-radius:8px;
                                    }
                                    
                                    .myBoxStyle  {
                                         border: #76869e solid 1px !important;
                                         border-radius: 10px !important;
                                         border-color: #a8b3c2;
                                         box-shadow: 0 0 6px 5px #76869e99;
                                         color: #d4d4d4;
                                         background:#111b2c;
                                    }
                                    
                                    .myTextStyle {
                                        color: #a8b3c2;
                                        font-family:Verdana, Geneva, sans-serif
                                    }
                                    [/code]`
                                    
                                    Was mir noch aufgefallen ist, dass im State Playlists auch gelöschte Playlists auftauchen. Kann man da noch etwas machen  :?
                                    
                                    lg BQ[/i][/i]
                                    
                                    D 1 Reply Last reply
                                    0
                                    • Alex1808A Offline
                                      Alex1808A Offline
                                      Alex1808
                                      wrote on last edited by
                                      #411

                                      @besterquester:

                                      Was mir noch aufgefallen ist, dass im State Playlists auch gelöschte Playlists auftauchen. Kann man da noch etwas machen :?

                                      lg BQ `

                                      513_screenshot_at_juni_29_08-36-10.png

                                      1 Reply Last reply
                                      0
                                      • besterquesterB Offline
                                        besterquesterB Offline
                                        besterquester
                                        Developer
                                        wrote on last edited by
                                        #412

                                        @Alex1808: Thanks so einfach :D

                                        1 Reply Last reply
                                        0
                                        • S Offline
                                          S Offline
                                          schubi82
                                          wrote on last edited by
                                          #413

                                          @twonky: Danke, aber das war es nicht (hatte ja auch alles ohne -premium eingerichtet, nun aber wie vorgeschlagen). Die Liste bleibt leer, auch wenn ich Copy/Paste von besterquesters-Skript mache. Im Adapter ist z.B. trackList aber auch leer, muss das so?

                                          1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          824

                                          Online

                                          32.4k

                                          Users

                                          81.6k

                                          Topics

                                          1.3m

                                          Posts
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Home
                                          • Recent
                                          • Tags
                                          • Unread 0
                                          • Categories
                                          • Unreplied
                                          • Popular
                                          • GitHub
                                          • Docu
                                          • Hilfe