---------------------------------------------------------
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