Neues Modul: 70_Soundcloud.pm - Entwicklung/Ideen Sammlung/Testversion

Begonnen von DeeSPe, 05 November 2016, 14:13:08

Vorheriges Thema - Nächstes Thema

DeeSPe

Hallo Gemeinschaft!

dieses Thema soll der Entwicklung eines Moduls für Soundcloud dienen. Es sollen Ideen gesammelt und (wenn möglich) auch umgesetzt werden. Die aktuelle Testversion gibt es hier auch.
Dafür bitte ich um etwas Mithilfe bei der Weiterentwicklung (z.B. set Befehle der einzelnen Player zur Übergabe der Streaming URI). Aber auch für weitere Ideen bin ich offen.

Vorausetzung um überhaupt mit der Soundcloud API kommunizieren zu können ist ein vorhandener API Key. Diesen bekommt man wenn man bei Soundcloud als angemeldeter Benutzer auf diese Seite geht. Hier kann man eine neue App registrieren und bekommt dann zwei Keys. Benötigt wird dann die "Client ID".
Soundcloud hat es nun seit einiger Zeit etwas schwerer gemacht an einen solchen API Key zu kommen. Man muss sich nun suzusagen dafür anmelden. Als ich vor einiger Zeit den Key registriert hatte war das noch nicht so, da wurde der Key gleich direkt generiert und sofort angezeigt. Also am Besten schnell mal für einen Key registrieren...

Nun aber zum eigentlichen Modul.

Nach einigen Überlegungen, Probieren und internen Umbauten im Modul habe ich mich für eine Master->Client Architektur entschieden, ähnlich wie bei RESIDENTS. Die Idee dahinter ist, dass man nur ein Master Device anlegt, welches im Prinzip erst einmal nur den API Key beherbergt und ein paar übergeordnete Attribute (Default Player, Artwork Size, Player CMDs), welche sich dann noch einmal pro später anzulegendem Soundcloud Client (Benutzer) überschreiben lassen.

Nachdem das Soundcloud Master Device mit "define mySC Soundcloud <YOUR-SOUNDCLOUD-API-KEY>" angelegt wurde kann man im Master die Clients erstellen mit "set mySC createUser <SOUNDCLOUD-USERNAME/ID> [INTERVAL]".
Damit wird ein neuer Client mit dem Namen "sc_user_<name>" und mit "IODev mySC" angelegt. Mit optional übergebenen Interval in Sekunden kann ein automatisches Polling aktiviert werden.
Beim Anlegen des Client werden automatisch die Soundcloud Benutzerinformationen und verfügbaren Tracks abgerufen und als Readings im Client abgelegt. Die Benutzerinfos sind Readings mit normalen Textinhalten. Die Readings für die Tracks (pro Track ein Reading) enthalten das JSON des jeweiligen Tracks.
Ebenso wird beim Anlegen des Clients auch automatisch ein weblink mit Namen "wl_sc_user_<name>_profile" und "wl_sc_user_<name>_tracks" für den Client erzeugt. Diese erstellen eine HTML Ansicht aller Tracks eines Client mit Artwork, Permalink, Downloadlink, Playback count und und und ..... anhand des JSON aus den Track Readings oder eine HTML Ansicht aller User Informationen
Mit "set mySC deleteUser <SOUNDCLOUD-USERNAME/ID>" wird ein Client samt seines verknüpften weblink gelöscht. Der weblink wird auch gelöscht wenn man die Clients normal über FHEM löscht.

Mein FHEM läuft auf der aktuellen Raspbian Version Jessie mit allen Updates und Perl Version v5.20.2.

Des Weiteren muss auf Eurem FHEM Host das Perl Modul JSON installiert sein.
Die Installation geht auf dem RPi mit:
sudo apt-get install libjson-perl

Was das Modul schon kann:

  • Master anlegen per API Key oder OAuth-Token
  • Clients anlegen mit optionalem Polling Interval
  • Userinfos im Client als Readings anzeigen
  • verfügbare Tracks des angelegten User im Client als Readings anzeigen (JSON) - entfernt da die Readingsliste unendlich lang werden konnte, alle Track Meta Daten sind in den Internals verfügbar
  • Abspielen auf beliebigen streamingfähigen FHEM Device, evtl. muss ein entsprechendes Kommando für das Abspielen des Streams im Attribut scPlayUriCmds hinterlegt werden
  • Abspielen aus dem Soundcloud Client heraus anhand der Track ID
  • Abspielen aus dem weblink - bei jedem Track steht ein Dropdown mit den definierten Playern zur Verfügung und daneben befindet sich ein Play Button
  • automatisches Erzeugen eines von weblinks pro Client zur HTML Anzeige des Benutzerprofils/Track/Favoriten/Playlists
  • Löschen von Clients aus Master heraus (Client und verknüpfte weblinks werden gelöscht)
  • "get <name> update profile" für Clients um die Benutzerinfos manuell zu aktualisieren
  • "get <name> update tracks" für Clients um die Trackinfos des Benutzers manuell zu aktualisieren
  • "get <name> update favorites" für Clients um die Favoritesinfos des Benutzers manuell zu aktualisieren
  • "get <name> update playlists" für Clients um die Playlistinfos des Benutzers manuell zu aktualisieren
  • Attribut scPlayers in Master und Client (Client Attribut hat Vorrang, im Master ist global als Fallback) - zur Angabe von möglichen Playern (kommaseparierte Liste)
  • Attribut scPlayUriCmd in Master und Client (Client Attribut hat Vorrang, im Master ist global als Fallback) - zur Angabe von möglichen PlayURI Kommandos für Player (kommaseparierte Liste, selbe Reihenfolge wie scPlayers)(FEATURE IST NOCH NICHT FERTIG)
  • Attribut scArtworkSize in Master und Client (Client Attribut hat Vorrang, im Master ist global als Fallback) - Voreinstellung der Artwork Größe für den weblink (es wird tatsächlich eine andere Bildgröße geladen, nicht skaliert), ein Dropdown mit allen zur Verfügung stehenden Größen ist vorhanden
  • Attribut scAvatarSize in Master und Client (Client Attribut hat Vorrang, im Master ist global als Fallback) - Voreinstellung der Avatar Größe für den weblink (es wird tatsächlich eine andere Bildgröße geladen, nicht skaliert), ein Dropdown mit allen zur Verfügung stehenden Größen ist vorhanden
  • Attribut scUpdate in Master und Client (Client Attribut hat Vorrang, im Master ist global als Fallback) - damit kann bestimmt werden welche Informationen beim Define/Update eines Users automatisch mit abgerufen werden sollen
  • das Modul ist nonblocking
  • eine aktuelle commandref ist auch mit dabei

Was noch fehlt bzw. verbessert werden soll und Fehler:

  • Feature (coming very soon): besseres rename Handling
  • Playlisten einbinden???
  • ......
  • Abspielen funktioniert noch nicht richtig, zumindest auf Sonos
  • Feature (coming very soon): fehlerhafte Eingaben beim Setzen von Attributen abfangen
  • Feature (coming very soon): Abspielen eines Tracks auf bestimmtem Player aus weblink heraus

Das Device wird so definiert:
define mySC Soundcloud <YOUR-SOUNDCLOUD-API-KEY/OAUTH-TOKEN>

Benutzer anlegen mit optionalem Interval in Sekunden:
set mySC createUser <SOUNDCLOUD-USERNAME/ID> [INTERVAL]

Benutzer löschen (Dropdown verfügbar):
set mySC deleteUser <SOUNDCLOUD-USERNAME/ID>

Würde mich sehr freuen wenn das Modul von dem einen oder der anderen mal getestet wird und entsprechendes Feedback kommt. Sehr gerne auch Ideen zur Entwicklung.

Viel Spaß damit.

Gruß
Dan


UPDATE 1


  • neuer weblink für Profilanzeige - wird automatisch beim createUser mit angelegt und auch gelöscht wenn der User gelöscht wird
  • neues Attribut scAvatarSize
  • Aktualisierung commandref

UPDATE 6.11.2016


  • Abspielen auf Sonos funktioniert nun! Leider dauert es ein paar Sekunden bis der Stream abgespielt wird, da erst nonblocking die wirkliche Adresse des CDN ermittelt wird und diese dann dem Player übergeben wird. Anders funktioniert es leider nicht!
  • beliebige streamingfähige Player können nun benutzt werden sofern sie als FHEM Device zur Verfügung stehen
  • Player Dropdown und Play Button im HTML für jeden Track bereitgestellt, somit kann sofort der jeweilige Track auf dem ausgewählten Player abgespielt werden
  • Eingaben in Attributen werden nun validiert
  • API key wird beim Definieren geprüft ob er valide ist, Master Device nimmt bei validem API Key den STATE connected an
  • Clients/User lassen sich ohne validen API key und ohne Master Device nicht mehr anlegen
  • beim Anlegen von Clients/Usern wird geprüft ob diese wirklich existieren, wenn sie nicht existieren werden sie zwar angelegt, bekommen aber gleich den STATE "resource not found" und es werden auch keine weblinks angelegt
  • Fehler in den Variablenzuweisungen behoben
  • weblinks werden erst angelegt sobald die Readings dafür erstellt wurden, hat der User keine Tracks wird auch kein weblink dafür erstellt
  • set für play wird nun nur noch angezeigt wenn Tracks vorhanden sind und auch mindestens ein Player konfiguriert ist
  • Description im Profil weblink ergänzt
  • Größenangaben für Avatar und Artwork im HTML hinzugefügt
  • Aktualisierung commandref

UPDATE 14.11.2016


  • statt eines API Keys (client_id) kann nun auch ein OAuth-Token zum Anlegen des Master Device benutzt werden
  • Playlists der angelegten Soundcloud User können nun ebenfalls abgerufen werden, ein Reading user_playlists mit den IDs der Playlists wird angelegt
  • alle Metainformationen zu Tracks, Favorites und Playlists werden nun nicht mehr als Readings abgelegt, sondern nur noch in den Internals und sind somit in den Details nicht mehr sichtbar - dieser Schritt war nötig um die Readings nicht nutzlos aufzublähen
  • neues Attribut scUpdate, damit kann bestimmt werden welche Informationen beim Define/Update eines Users automatisch mit abgerufen werden sollen
  • es werden nun automatisch keine weblinks mehr erzeugt, diese können nun im jeweiligen Device mit "set <name> weblinkCreate <weblinkname> [weblinkname]" angelegt werden
  • neue Funktion für weblink Tracklist/Favorites-Mini, stellt eine nummerierte Tabelle aller Track-/Favoritesnamen eines Users dar mit der Tracklänge, den Playern und dem Play Button, der Name ist verlinkt auf die Soundcloud Webseite
  • neue Funktion für weblink Playlists, stellt eine nummerierte Tabelle aller Playlists eines Users dar mit den jeweiligen Tracks, der Tracklänge, den Playern und dem Play Button, der Name ist verlinkt auf die Soundcloud Webseite
  • Sekunden bei Laufzeit ergänzt
  • play Befehle für SB_PLAYER hinzugefügt
  • Player dropdown wird nun ausgeblendet wenn nur ein Player verfügbar ist, es wird nur der Play Button angezeigt
  • in IODev steckt nun der Hash und nicht nur der Name
  • Aktualisierung commandref
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DeeSPe

Hab im ersten Beitrag noch die vergessenen Screenshots angefügt.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DeeSPe

Hab schon das erste kleine Update im ersten Beitrag hochgeladen.
Es wurde die HTML Funktion um eine Profilanzeige erweitert und es wird ein entsprechender weblink beim createUser mit angelegt.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DeeSPe

Das erste große Update für das Modul ist heute noch fertig geworden.
Es handelt sich hauptsächlich um das Abfangen von fehlerhaften Eingaben, aber auch ein paar Features sind dazu gekommen.
Die Modulversion und die Screenshots im ersten Beitrag habe ich aktualisiert.

Changelog:

  • Abspielen auf Sonos funktioniert nun! Leider dauert es ein paar Sekunden bis der Stream abgespielt wird, da erst nonblocking die wirkliche Adresse des CDN ermittelt wird und diese dann dem Player übergeben wird. Anders funktioniert es leider nicht!
  • beliebige streamingfähige Player können nun benutzt werden sofern sie als FHEM Device zur Verfügung stehen
  • Player Dropdown und Play Button im HTML für jeden Track bereitgestellt, somit kann sofort der jeweilige Track auf dem ausgewählten Player abgespielt werden
  • Eingaben in Attributen werden nun validiert
  • API key wird beim Definieren geprüft ob er valide ist, Master Device nimmt bei validem API Key den STATE connected an
  • Clients/User lassen sich ohne validen API key und ohne Master Device nicht mehr anlegen
  • beim Anlegen von Clients/Usern wird geprüft ob diese wirklich existieren, wenn sie nicht existieren werden sie zwar angelegt, bekommen aber gleich den STATE "resource not found" und es werden auch keine weblinks angelegt
  • Fehler in den Variablenzuweisungen behoben
  • weblinks werden erst angelegt sobald die Readings dafür erstellt wurden, hat der User keine Tracks wird auch kein weblink dafür erstellt
  • set für play wird nun nur noch angezeigt wenn Tracks vorhanden sind und auch mindestens ein Player konfiguriert ist
  • Description im Profil weblink ergänzt
  • Größenangaben für Avatar und Artwork im HTML hinzugefügt
  • Aktualisierung commandref

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Syrex-o

So jetzt wird hier weiter diskutiert ;D. Also vor einer weile hab ich mal einen Api Key einfach so bekommen für Squeezecloud. der Link dazu funktioniert auch immer noch. Dadurch habe ich einen Key der genau für Squeezecloud funktioniert. Leider ist der nicht kompatibel für dieses Modul. Bekomme als Antwort: API key not valid?
Die App registrierung dauert dazu leider ewig und es ist nicht garantiert einen key zu bekommen.
Grüße

DeeSPe

Um den API Key beim Anlegen zu validieren rufe ich einmalig die Seite https://api.soundcloud.com/apps?client_id=YOUR_CLIENT_ID auf. Dann prüfe ich ob ein Ergebnis kommt! Wenn kein Ergebnis kommt, dann ist der API Key nicht gültig. So war zumindest meine Herangehensweise. Evtl. kannst Du die URL mal mit deinem Key manuell testen? Bekommst Du dann JSON zurück oder eine leere Seite? Oder was ganz anderes?

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Syrex-o

ZitatUm den API Key beim Anlegen zu validieren rufe ich einmalig die Seite https://api.soundcloud.com/apps?client_id=YOUR_CLIENT_ID auf. Dann prüfe ich ob ein Ergebnis kommt! Wenn kein Ergebnis kommt, dann ist der API Key nicht gültig
Bekomme eine leere Seite zurück. Aber der Key muss ja funktionieren, da er für ein anderes Plugin geht.
Grüße

DeeSPe

Keine Ahnung was Du da für einen Key hast und wie Squeezecloud den benutzt!
Offensichtlich geht das nicht über https://api.soundcloud.com, sonst würde der Key dort funktionieren.

EDIT: Vielleicht muss Dein Key um zu funktionieren einen Referer von Squeezecloud haben...

Gruß
Dan

P.S. Bin gerade am überlegen das, eigentlich schöne, Projekt aufzugeben wenn die sich bei Soundcloud mit den Keys so zieren. Schön ein Modul zu bauen was dann keiner benutzen kann...  :-\
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Syrex-o

ZitatP.S. Bin gerade am überlegen das, eigentlich schöne, Projekt aufzugeben wenn die sich bei Soundcloud mit den Keys so zieren. Schön ein Modul zu bauen was dann keiner benutzen kann...  :-\
Würde ich schade finden. Ich glaube es funktioniert jetzt anders bei Soundcloud. Wenn du eine App hast, dann kann man einen Bereich einrichten, auf dem Keys vergeben werden genau für deine APP.
Jedenfalls ist es bei meinem Squeezecould Beispiel so. In Wahrheit leitet mich der Link für den Api Key auf eine seite von soundcloud weiter und die dann auf Github  ???
Grüße

DeeSPe

Ich möchte gerade auch gar nicht aufhören!
Es funktioniert so gut bisher und ich habe noch ein paar Ideen wie ich noch was umbauen/hinzufügen kann.
Bin gerade an den Favorites und den Playlists dran um die noch elegant verfügbar zu machen.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Syrex-o

Ist ja an und für sich auch Top. Nur uss der Zugriff stimmen.
Wenn du magst kann ich dem Support von Soundcloud ja mal schreiben?
Grüße

DeeSPe

Zitat von: Syrex-o am 07 November 2016, 21:32:52
Ist ja an und für sich auch Top. Nur uss der Zugriff stimmen.
Wenn du magst kann ich dem Support von Soundcloud ja mal schreiben?
Grüße

Das musst Du wissen ob Du die anschrei(b)en willst!  ::)
Wartest ja eigentlich nun lange genug!

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DeeSPe

Favoriten sind nun auch fertig integriert.

Die automatische Erstellung der weblinks habe ich rausgenommen.
Die kann man jetzt, bei Bedarf, aus dem Client Device heraus erzeugen (mehrere stehen zur Auswahl, auch eine mini Version für die Tracks und Favorites).

Ich schaue mir jetzt noch an ob und wie ich die Playlists optisch aufbereiten könnte, das sind pro Playlist eine Menge Daten die jetzt alle pro Playlist in einem Reading stecken... ::)

Sobald ich damit fertig bin werde ich das Modul im ersten Beitrag aktualisieren.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Syrex-o

shoutout to CHrisD für die Nachricht.

@DeepSPe, es ist möglich die Squeezeboxen mit einzubinden, aber .
Die genaue Bezeichnung dafür wäre: set <player> playlist play <url>
Damit solltest du ja schon was anfangen können.
Grüße

DeeSPe

Zitat von: Syrex-o am 08 November 2016, 12:22:59
shoutout to CHrisD für die Nachricht.

Darf man erfahren was für eine Nachricht?

Zitat von: Syrex-o am 08 November 2016, 12:22:59
@DeepSPe, es ist möglich die Squeezeboxen mit einzubinden, aber .
Die genaue Bezeichnung dafür wäre: set <player> playlist play <url>
Damit solltest du ja schon was anfangen können.
Grüße

Damit kann ich schon halbwegs etwas anfangen.
Da es für Squeezebox keinen Eintrag in der commandref gibt, benötige ich noch den genauen Modulnamen. Am besten auch woher Du das Modul hast. Hab nämlich keine Lust mir die Daten für jedes "nicht-offizielle" Modul aus dem Forum zusammen zu suchen.

Danke.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe