Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use GIF files for effects #477

Merged
merged 9 commits into from
Oct 12, 2017
Merged

Use GIF files for effects #477

merged 9 commits into from
Oct 12, 2017

Conversation

Paulchen-Panther
Copy link
Member

@Paulchen-Panther Paulchen-Panther commented Sep 30, 2017

1. Tell us something about your changes.
Add 2 new effects based on gif files.
Effect Lights from: https://giphy.com/gifs/love-animation-art-xUPGcknoZZseQLFvws
Effect Fire from: https://commons.wikimedia.org/wiki/File:Animated_fire_by_nevit.gif

2. If this changes affect the .conf file. Please provide the changed section
no

3. Reference an issue (optional)

@penfold42
Copy link
Contributor

Brilliant idea !

@brindosch
Copy link
Contributor

Wirklich eine gute Idee!
Die Umwandlung in Python wäre vermutlich auch möglich? Ohne Python plugins macht das aber nur bedingt Spaß. Ich schätze da kommt man später nochmal drauf zurück.

Als Ausblick wäre ein file upload über die json-rpc nicht schlecht (Mit gewissen Restriktionen, der Sicherheit wegen), der dann auch für gif uploads verwendet werden kann.

Längerfristig wird die webui wohl in Hyperion integriert werden müssen und die kritischeren Aktionen sind dann nur noch über login möglich bzw es gibt keine api mehr dafür.

@Paulchen-Panther
Copy link
Member Author

Bin gerade dabei die Python Funktion "getImage()" anzupassen damit diese auch GIF file von URLs annimmt. Somit muss das GIF file nicht zwingend local sein. Der FileUpload macht erst Sinn wenn @redPanther die JSON Komunikation zwischen WebUI und JSON-RPC gefixt hat. Ich sag nur "c:\fakepath"

@tpmodding
Copy link
Collaborator

"c:\fakepath" kommt aber nur bei chrome oder?

@Paulchen-Panther
Copy link
Member Author

Kann ich nicht genau sagen. Dachte das alle Modernen Browser diesen Pfad angeben der Sicherheit wegen. Mal schauen was @brindosch dazu sagt.

@brindosch
Copy link
Contributor

Die Sache mit den URLs dachte ich zuerst ist auch super, als ich dann gesehen habe, wie blöd es ist teilweise die .gif aus diveren Seiten zu extrahieren war mir eher nach file upload von webui zu hyperion fs.
Ausserdem benötigt man eigentlich so oder so ein caching für die gifs. Wenn Internet mal weg ist würde der effekt nicht mehr, ausserdem erzeugt es auch unnötig traffic.
Und du benötigst QNetworkRequest in der Effekt Klasse, das ist auch irgendwie etwas durcheinander. Zusätzlich benötigst du einen QEventLoop der die Funktion während dem http request freezt.

Ich weiß nicht was ihr mit c:/fakepath meint. Ich spreche von der File, FileReader - API
https://developer.mozilla.org/en-US/docs/Web/API/FileReader
Damit kann man Dateien vom Dateisystem in den Browser laden und dann die Daten weiterreichen (siehe dazu auch den config import)
Ich stimme aber zu, ohne funktionierende Websockets wird das nichts (Wobei ich auf die HTTP Json-Rpc des Webservers verweisen möchte, die hat mich noch nie hängen lassen ;) - wäre ein temporäres umgehen)

Den Pfad der Datei spielt keine Rolle, man extrahiert den Dateinamen und reicht den auch weiter damit Hyperion weiß wie Datei heißen soll. Als Ziel würde sich zb rootPath(siehe mein PR)/gifs/ oder ähnliches anbieten. Du kannst von außen den Zielpfad nicht manipulieren, das wäre ein großer exploit.

@Paulchen-Panther
Copy link
Member Author

Die Sache mit den URLs dachte ich zuerst ist auch super, als ich dann gesehen habe, wie blöd es ist teilweise die .gif aus diveren Seiten zu extrahieren war mir eher nach file upload von webui zu hyperion fs.

Na gut. Dann lassen ich das erst mal mit dem URL Support sein.

Ich weiß nicht was ihr mit c:/fakepath meint.

Fakepath

Damit kann man Dateien vom Dateisystem in den Browser laden und dann die Daten weiterreichen (siehe dazu auch den config import)

Geht ganz leicht von der Hand. Fehlt nur der passende Eintrag im GIF Schema.
Siehe hier: #jdorn/json-editor#548

Ich stimme aber zu, ohne funktionierende Websockets wird das nichts (Wobei ich auf die HTTP Json-Rpc des Webservers verweisen möchte, die hat mich noch nie hängen lassen ;) - wäre ein temporäres umgehen)

Das ist das Problem wo ich zur Zeit hängen bleibe. Das Image im Base64 format lässt sich zur Zeit nicht über das WebUI an hyperion senden. :-(

@brindosch
Copy link
Contributor

Ich nutzte File.name() siehe https://developer.mozilla.org/en-US/docs/Web/API/File/name und hier https://github.com/hyperion-project/hyperion.ng/blob/master/assets/webconfig/js/content_general.js#L65

Zum Topic:
Als temporärer Workaround kannst du einfach das hier platzieren in der hyperion.js: 6f443a4#diff-b308252fa22a2796e88345f346e7a231L267
Allerdings mit /json-rpc als Ziel
Das kann man dann einfach wieder mit dem websocket ersetzen wenn es läuft.

@Paulchen-Panther
Copy link
Member Author

Paulchen-Panther commented Oct 1, 2017

Bist jetzt haben wir ja noch keine funktion in hyperion die base64 daten in dateien schreiben kann. Soll ich eine erstellen oder fällt die was besseres ein um das gif bild mit der json datei zu speichern. oder doch lieber die base64 daten mit in die json???????????? confuse.
JS ist einfach nicht meine Welt.

@brindosch
Copy link
Contributor

brindosch commented Oct 1, 2017

Achso, also den base64 wirst du nicht in das python script bekommen. @redPanther hatte doch mal versucht von so einer Seite relativ lange rgb daten strings einzuschleußen. Ausserdem bläht das ja sehr den Datenstrom der serverinfo auf wenn da base64 bilder drin sind.

Ich schätze das einzigste was man machen kann ist, die Bilder über die rpc abspeichern (dazu bedarf es einem Feld, das nur sichtbar ist, während das gif schema ausgewählt ist und dann den Dateinamen der Datei in das file Feld eintragen) und dann den Effekt speichern.

Das ist nicht so toll, wüsste aber gerade keinen smarteren weg.

@Paulchen-Panther
Copy link
Member Author

Paulchen-Panther commented Oct 1, 2017

und dann den Dateinamen der Datei in das file Feld eintragen

Das verstehe ich ja aber wie kommst du an den Dateipfad von dem Image um diesen Hyperion mitzuteilen?
Nicht alle Browser geben dir den Dateipfad des Images (fakepath). Bleibt also nur der Datenstrom des Bildes übrig. Also doch wieder Base64 Daten an Hyperion schicken damit dieser wiederum die datei abspeichern kann. Das bläht aber wieder den Datenstrom auf.
Ich glaube wenn du das machst ist das besser. JS ist einfach nicht mein Gebiet.

Die rpc hat doch gar keine funktion zum abspeichern von daten außer json oder sehe ich das falsch?

@brindosch
Copy link
Contributor

Das verstehe ich ja aber wie kommst du an den Dateipfad von dem Image um diesen Hyperion mitzuteilen?

Garnicht, alles was Hyperion wissen muss ist der Dateiname. Du arbeitest ohne Pfade. Du hast die Bild Daten und einen Namen.
Das ist eigentlich fast wie du es gerade mit dem qrc machst. Du liest das Bild ein in dem du den Pfad (Dateinamen) ließt. Das setzt natürlich voraus, dass die json-rpc unter dem selben Pfad abspeichert wo du später das Bild wieder einlesen willst.

@Paulchen-Panther
Copy link
Member Author

Paulchen-Panther commented Oct 1, 2017

Also fehlt noch die json-rpc funktion die die daten abspeichert oder haben wir die schon?

@brindosch
Copy link
Contributor

Nein, die fehlt.

@Paulchen-Panther
Copy link
Member Author

Wenn ich die Funktion schreibe wärst du bitte so nett die JavaScript und WebUI Sachen zu ergänzen?
Ich hängt mich sonst fest am Effektkonfigurator.
Danke.

@Paulchen-Panther
Copy link
Member Author

Dein neuer Namespace "JsonUtils" enhält eine Funktion names "write()".
Diese hier:
spectacle m10248

die wiederum die funktion "FileUtils::writeFile()" aufruft. Genau diese Funktion brauche ich in der "JsonProcessor.cpp" weil die funktion ein QByteArray annimmt.
Wie du aber hier siehst ist die nicht includiert in der "JsonProcessor.cpp":
spectacle v10248

Jetzt meine Frage. Darf ich die "FileUtils.cpp" in deiner "JsonProcessor.cpp" inkludieren oder muss ich eine neue Funktion in der "JsonUtils" schreiben die auf "FileUtils::writeFile()" zeigt?

@brindosch
Copy link
Contributor

brindosch commented Oct 1, 2017

Im Header der JsonUtils ist der include der FileUtils, das heißt du bekommstden namespace FileUtils automatisch dazu

@Paulchen-Panther
Copy link
Member Author

danke

@brindosch
Copy link
Contributor

Wir lassen das jetzt so für den Moment. Die Erweiterung die du begonnen hast aber nicht wegwerfen :)

@brindosch brindosch merged commit 9cc6c75 into hyperion-project:master Oct 12, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants