XBMC Übergabe des aktuellen Videos von einem XBMC zum nächsten

Begonnen von siggi85, 20 Juni 2014, 18:50:21

Vorheriges Thema - Nächstes Thema

vbs

Meine letzte Version aus dem Thread sollte etwas gesprächiger sein und da werden auch die JSON-Nachrichten rausgeprintet IIRC (verbose 5).
Ansonsten würde ich erstmal FHEM aus der Gleichung rausnehmen und das ganze mit Browser+XBMC machen. Im XBMC am besten noch das Debug-Log aktivieren. Hier sind Beispiele, wie du JSON mit einem Browser benutzen kannst: http://forum.xbmc.org/showthread.php?tid=157996

Wenn das dann mit Browser funktioniert wie gewünscht, dann versuchen das ganze auch per FHEM zu machen.

siggi85

Alles klar gucke ich mir an! Ich habe irgendwo noch ein Perlskript liegen was einen kompletten JSON Aufruf per GET an XBMC absendet. Aber für den Resumefunktion habe ich schnell "angeblich" funktionierende Beispiele mit google gefunden, welche auch zur Syntax in der API Referenz passen.  :)

Mein Problem war, dass der JSON Aufruf im Modul ja über mehrere Funktionen zusammengebaut wird. Und als ich mehrere Zeilen JSON Code in die jeweilige Variable hinzugefügt habe, konnte ich nicht prüfen wie das nun den endgültigen JSON Request beeinflußt.  ::)
Habe schon überlegt eine NetCat Instanz aufzumachen und die Anfragen per Netzwerk dahin zu schicken, deine Logfunktion ist da natürlich eleganter.  ;)

siggi85

#17
Also der JSON Aufruf per Browser funktioniert super zum testen und auch dein XBMC Modul mit verbose 5 lässt mich die JSON Requests sehen die vom Modul erzeugt werden. Danke dafür!  :D *daumenhoch*
Jedoch komme ich wieder nicht weiter.

Folgender JSON Request separat funktioniert im Browser und öffnet das Video und startet den Resumepoint:
http://192.168.1.20:8088/jsonrpc?request={"params":{"item":{"episodeid":2767},"options":{"resume":true}},"jsonrpc":"2.0","method":"Player.Open"}

Allerdings bekomme ich das nicht im Quellcode hin...  :-\
1. Das true, wird immer in 1 umgewandelt (ich vermute durch das JSON Modul bei der Modulation.
2. Bekomme ich einen Fehler in der Perlsyntax, oder das options=>resume=>true wird im Aufruf falsch positioniert und von XBMC ignoriert. Theoretisch müsste es ca so in die XBMC_Set_Open Subroutine, aber da bekomme ich Fehler in der Perlsyntax
elsif($opt eq 'episode') {
    $params = {
      'item' => {
        'episodeid' => $path + 0
'options' => {
'resume' => true
}
      }
    };
  }


Zusätzlich habe ich noch eine Idee für das Modul! In den SB_Server bzw. SB_Player Modulen gibt es den Set Befehl "cliraw" bei dem man raw die Kommandos an Server und Player senden kann. Eine Art "jsonraw" für das XBMC Modul wäre vielleicht auch ganz nett wenn das jemand einbauen würde... ::) ;) Dann könnte man das sowohl zum testen, als auch für noch nicht implementierte Funktionen nutzen.

EDIT: Ich hoffe ich nerve nicht mit meinen Fragen zum Quellcode...  :o ::)

justme1968

ein json true kannst du mit JSON::true setzen. also so: ...
'resume' => JSON::true
...


gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

siggi85

Zitat von: justme1968 am 04 Juli 2014, 16:56:08
ein json true kannst du mit JSON::true setzen.

Klasse, das und ein Komma hat mir gefehlt, funktioniert nun.  :) Und ich kann es kaum glauben, aber ich habe sogar meine vorgeschlagene "jsonraw" Methode umsetzen können.   :o ;D
Ich wäre froh wenn ein richtiger Entwickler meine Änderungen mal prüfen könnte. Die geänderte Version habe ich im XBMC Modul Thread hochgeladen.

siggi85

#20
Update zu diesem Thema:

Ich nutze seit einiger Zeit diesen Code um die aktuelle Wiedergabe von einer XBMC Instanz auf eine andere zu schieben. Benötigt wird für dieses Skript ein dummy (d_helper) in dem während des Vorgangs ein Reading gesetzt wird. Dies soll verhindern, dass mehrere XBMC Übergänge gleichzeitig durchgeführt werden können. Es sind noch ein paar Verbesserungen notwendig (manchmal wird auf dem neuen System aufgrund von Ladezeiten keine Pause gesetzt, fehl also noch eine Art "do until pause"), aber grundsätzlich funktioniert es.

##########################################################
# XBMC to XBMC
# Aktuelles Video von einem XBMC auf einem anderen XBMC wiedergeben
sub xbmc_to_xbmc($$) {
  my ($qxbmc, $zxbmc) = @_;
  fhem "set $qxbmc statusRequest";
  fhem "set $zxbmc statusRequest";
  my $helper = ReadingsVal("d_helper","xbmc_to_xbmc",0);
  if ( $helper == 1 ) {
    fhem "define at_xbmc_to_xbmc at +00:00:05 {xbmc_to_xbmc(\"$qxbmc\",\"$zxbmc\")}";
    return 0;
  }
  fhem "setreading d_helper xbmc_to_xbmc 1";
  my $qplayStatus = ReadingsVal("$qxbmc","playStatus",0);
 
### Part fur Aktionen wenn es sich um bestimmte Quell oder Ziel XBMC Systeme handelt
    if ( $zxbmc eq "sz_xbmc" ) {
    my $twilight = ReadingsVal("my_twilight","light","6");
    fhem "set $zxbmc on";
    if ( $twilight < 5 ) {
      fhem "set sz_bulb on";
    }
  }
###

  if ( $qplayStatus eq "playing" || $qplayStatus eq "paused" ) {
    fhem "set $qxbmc stop";
  }
  fhem "define at_xbmc_to_xbmc_video at +00:00:05 {xbmc_to_xbmc_video(\"$qxbmc\",\"$zxbmc\")}";
  return 1;
}



sub xbmc_to_xbmc_video($$) {
  my ($qxbmc, $zxbmc) = @_;
  my $qtype = ReadingsVal("$qxbmc","type","nichts");
  if ( $qtype eq "episode" ) {
    my $qid = ReadingsVal("$qxbmc","episodeid",0);
    fhem "set $zxbmc openepisodeid $qid";
    fhem "set $zxbmc pause";
    my $zid = ReadingsVal("$zxbmc","episodeid",0);
      if ( $qid == $zid ) {
        fhem "set $qxbmc msg Weitergabe \"Videoweitergabe erfolgreich\"";
      }
  }
  elsif ( $qtype eq "movie" ) {
    my $qid = ReadingsVal("$qxbmc","movieid",0);
    fhem "set $zxbmc openmovieid $qid";
    fhem "set $zxbmc pause";
    my $zid = ReadingsVal("$zxbmc","movieid",0);
      if ( $qid == $zid ) {
        fhem "set $qxbmc msg Weitergabe \"Videoweitergabe erfolgreich\"";
      }
  }
  else {
    fhem "setreading d_helper xbmc_to_xbmc 0";
    return 0;
  }
  fhem "setreading d_helper xbmc_to_xbmc 0";
  return 1;
}


EDIT:
Achja, aufgerufen wird es folgendermaßen:
{xbmc_to_xbmc("wz_xbmc","sz_xbmc")}