---------------------------------------------------------
Für an der Umsetzung Interessierte
---------------------------------------------------------

*PROGRAMMIERSTIL*
Bisweilen ist mir meine Implementierung ein wenig peinlich, deshalb hier
der Versuch, alles auf das Framework der Shortcuts-App zu schieben…
Und natürlich möchte ich den Code auch ein wenig nachvollziehbarer
machen.

MODULARISIERUNG
Da man in einem Kurzbefehl auch andere Kurzbefehle aufrufen und mit
deren Ergebnissen weiter arbeiten kann, habe ich kurz mit dem Gedanken
gespielt, die einzelnen Bestandteile der Implementierung in einzelne
Kurzbefehle aufzuteilen. Da das Programm dann aber doch noch
einigermaßen überschaubar blieb und jeder Kurzbefehl natürlich in meiner
Liste auftaucht, habe ich darauf verzichtet.

VARIABLEN
    
- Die Belegung von Variablen mit Text ist hier etwas ungewöhnlich: Man
  muss zuerst einen Text in ein Textfeld schreiben und dann eine
  Variable mit diesem Text erstellen.
- Verschiedene Variablen können denselben Namen haben. Wenn man eine
  Variable ein zweites Mal belegt, behandelt Shortcuts sie als zweite
  Variable. Man muss also später aufpassen, auf welche Variable man sich
  bezieht! Dabei hilft aber „Reveal Action“, das einem zeigt, auf
  welchen Baustein gerade Bezug genommen wurde. Nichtsdestotrotz sollte
  man sich aber, wenn mal etwas unerwarteterweise falsch läuft, daran
  erinnern, dass es mehrere Variablen gleichen Namens geben kann. Beim
  Zusammensetzen der Daten musste ich beispielsweise rückwirkend auf ein
  Variable Bezug nehmen, die es zum Zeitpunkt der Erstellung des
  Verkettungsbefehls noch gar nicht gab. Glaube ich...

LISTEN
    
- Man kann komplette Listen leicht erstellen, aber nicht so leicht auf
  einzelne Elemente zugreifen. Das gilt insbesondere, wenn man die
  Dimension der Liste nicht kennt. Greift man dann auf ein Element zu,
  das es nicht gibt. Bricht Shortcuts mit einer Fehlermeldung ab.
- Man kann einzelne Listenelemente im Nachhinein nicht ändern.
- Man kann eine Liste nicht ausgehend von einer existierenden Liste
  erstellen, was für die Parameterliste echt geschickt gewesen wäre. Ich
  musste also die Parameter p0 bis p4 einzeln festlegen, was weniger
  elegant ist.

DICTIONARY (WöRTERBUCH)
Ich kannte Dictionaries bereits aus Perl und Python und ich liebe sie!
    
- Dictionaries sind wie Listen, haben allerdings keine Ganzzahl als
  Index sondern ein Schlüsselwort:   
Code:
--------------------
        {key: value}, z.B. {"method" : "slim.request", "params" : [...]}
--------------------
     JSON arbeitet auch mit Wörterbüchern und der Aufruf über die
  JSONRPC-API erfolgt entsprechend mit den Daten in einem Wörterbuch.
- Dictionaries waren für mich bisweilen die einzige Möglichkeit,
  Inhalte von Variablen abzufragen, da mir die Shortcuts-App bei
  Bedingungen häufig keinen Vergleichsoperator zur Verfügung stellte.

* A u f b a u   d e s   P r o g r a m m s * 
*ÜBERBLICK*
  
- Initialisierung URL, p0 bis p4, data
- Eingabe aus diktiertem Text
- diktierte Anweisungen in Liste speichern
- Anweisungen parsen:
            
  - MAC-Adresse
  - Befehlsparameter
  - Daten    
- Ggf. Daten an richtiger Stelle in Parameterliste einfügen.
- POST abschicken

*PROGRAMMABLAUF* (SCHEMATISCH MIT KOMMENTAREN)
INITIALISIERUNG
• URL=http://IP:Port/jsonrpc.js wird zusammengebaut
• Parameter p0 bis p4, sowie data für variable Inhalte werden
initialisiert

EINGABE
  
- Diktat des Befehls
- In Große Anfangsbuchstaben
- In Liste zerlegen
- Parsen der einzelnen Bestandteile:
            
  - Directory: SB-Name –> MAC-Adresse mac
  - Directory: Befehl –> Parameterliste parameters
  - Sonstiges (Lautstärke, Künstler, Playlist, ...)–> data
        

VERARBEITUNG
Hier muss nun interpretiert werden, an welche Position der Befehlskette
ein eventueller Wert in data gehört. Anweisungen, die variable Daten
benötigen sind:
    
- „Spiele“ <Artist>     ["playlist", "loadalbum", "*", data, "*"] (vierte
  Position)
- „Playlist“ <Name>     ["playlist", "play", data] (dritte Position)
- „Zufall Ende“ ["playlist", "shuffle", 0] (wenn data == “Ende")
- „Wiederholen Ende“    ["playlist", "repeat", 0] (wenn data == “Ende")
- „Lautstärke“ <n>      ["mixer", "volume", data] (dritte Position)
  aber: „Lauter“        ["mixer", "volume", "+10"](ohne data)

Meine Strategie war nun, zuerst die einparametrigen Anweisungen
(„Start“, „Stopp“, „Pause“) zu verarbeiten. Dann kann man beim Rest ohne
Fehler auf den zweiten Parameter zugreifen.
Ich beginne bie diesem Rest mit „Spiele...“, bei dem data an vierter
Position (p3) kommt.

Code:
--------------------
    wenn p2 == "loadalbum"
        dann p3 = data  
        sonst wenn data == ""
                dann p2 = letztes Element von parameters
                        // es gibt nur noch Befehle mit zwei oder drei 
Parametern
                        // überzählige Parameter werden von jsonrpc ignoriert
                sonst wenn data == "Ende" // „Mischen Ende“ oder „Wiederholen 
Ende“
                        dann p2 = 0
                        sonst p2 = data // für „Lautstärke“ <n> oder „Playlist“ 
<Name>
--------------------


AUSGABE
Hier wird nur noch eine POST-Anweisung an URL generiert und abgesetzt:

Code:
--------------------
    curl -X POST -d '{ "method": "slim.request", "params":[mac, [p0, p1, p2, 
p3, p4]]}' URL
--------------------


------------------------------------------------------------------------
karlek's Profile: http://forums.slimdevices.com/member.php?userid=64321
View this thread: http://forums.slimdevices.com/showthread.php?t=112671

_______________________________________________
slimserver-de mailing list
[email protected]
http://lists.slimdevices.com/mailman/listinfo/slimserver-de

Antwort per Email an