Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
DVBViewer Recording Service - funzt das?
#1
Hallo, habe mir auf der Fahrt ins verlängerte Wochenende ein paar Gedanken gemacht, wie man den DVBViewer Recording Dienst mit LCDHype überwachen könnte. Und daraus mal was gebacken:

1. Was man wissen muss:

a ) Der DVBViewer Recording Service hat einen Webservice, auf den man den Timer auslesen kann.

Der auslesbare Status ist hier nachlesbar: http://en.dvbviewer.tv/wiki/Recording_Se...Timer_list

Die URL lautet am Ende: http://:@:8089/api/timerlist.html?utf8=2

b ) Die Timer-Seite sieht so aus, jeweils mit Zeilennummern:
b1: Kein Auftrag drin:
CODE
1.

b2: Ein Auftrag drin:
CODE
1
2  
3    
4      Beispielsendung
5      
6      1 7      Auto
8      %year-%date_%time_%station_%name
9      Web
10      
11      -1
12      0
13      1
14      {5E768039-2662-492E-9DD1-E10B4E503DD5}
15    

16  


Mehr Aufträge interessieren nicht. Ich will nur den aktuellen auslesen.

2. Aus dem habe ich mal eine Funktion gebastelt, testen kann ich erst wieder daheim:

CODE

#Header
/interne Variablen/
%DefVar(DVBViewer_ip,Local='127.0.0.1')
%DefVar(DVBViewer_user,Local='user')
%DefVar(DVBViewer_pass,Local='pass')
%DefVar(DVBViewer_url,Local='http://'%DVBViewer_user():%DVBViewer_pass'@'%DVBViewer_ip()':8089/api/timerlist.html?utf8=2')
%DefVar(DVBViewer_readline,Local='')

/global im Hauptscript abrufbare Variablen/
%DefVar(DVBViewer_rec,Global='false')
%DefVar(DVBViewer_date,Global='00.00.0000')
%DefVar(DVBViewer_start,Global='00:00')
%DefVar(DVBViewer_end,Global='00:00')
%DefVar(DVBViewer_title,Global='none')
%DefVar(DVBViewer_channel,Global='')

%DefFunc(DVBViewer_Status,Global=
/läuft der Dienst?/
%If( %System.GetProcessID('dvbservice.exe') > 0 ) then {
  'true'  /wenn ja dann Auftrag ermitteln/
  /Ist ein Auftrag da oder nicht?/
  %If((%String.Pos('',%System.ReadFile(%DVBViewer_url()) <1) Then {
     /es ist ein Auftrag vorhanden/
     %Assign(DVBViewer_readline,%System.ReadFile(%DVBViewer_url(),4,UTF8,'')
     %Assign(DVBViewer_title,%String.Copy(%DVBViewer_readline(),%Inc(%String.Pos('',%DVBViewer_readline()),30),7)))
     %Assign(DVBViewer_readline,%System.ReadFile(%DVBViewer_url(),3,UTF8)
     %Assign(DVBViewer_date(),%String.Copy(%DVBViewer_readline(),%Inc(%String.Pos('Date="'%DVBViewer_readline()),10))) /tt.mm.jjjj/
     %Assign(DVBViewer_start(),%String.Copy(%DVBViewer_readline(),%Inc(%String.Pos('Start="',%DVBViewer_readline()),5))) /hh:mm/
     %Assign(DVBViewer_end(),%String.Copy(%DVBViewer_readline(),%Inc(%String.Pos('End="',%DVBViewer_readline()),5))) /hh:mm/
     %Assign(DVBViewer_readline,%System.ReadFile(%DVBViewer_url(),10,UTF8,'"/>')
     %Assign(DVBViewer_channel,%String.Copy(%DVBViewer_readline(),%Inc(%String.Pos('|'%DVBViewer_readline()),1)))
     %Assign(DVBViewer_readline,%System.ReadFile(%DVBViewer_url(),12,UTF8,'')
     %If(%String.Copy(%DVBViewer_readline(),11,1)='1')Then { /Aufnahme läuft gerade/
         %Assign(DVBViewer_rec,'true')}
     Else {
         %Assign(DVBViewer_rec,'false')}
  } Else { /kein Auftrag/
     %Assign(%DVBViewer_rec,'false'
     %Assign(%DVBViewer_title,'none' }
} Else { /Dienst läuft nicht/
  'false'
  %Assign(%DVBViewer_rec,'false'}
)

%Common.ChangeScreen(0, Hauptscript)
#EndHeader


Die Funktion an sich soll zurückliefern, ob der Recordingservice läuft oder nicht (true,false), und wenn ja, ob eine Aufzeichnung läuft (DVBViewer_rec=true,false), und wenn ja in den anderen Variablen wann/wo/was, und falls Aufzeichnung in Zukunft, dann auch wann/wo/was. Falls keine Aufnahme geplant ist, soll in title "none" stehen. Diese Informationen werden dann im Hauptscreen ausgewertet und dargestellt.

Könnte das so funktionieren, oder mache ich einen (oder mehrere?) Denkfehler? Wenn es funzt, gibts demnächst ein erweitertes Script fürs DM140GINK.

Eine Vereinfachung habe ich drin, beim Auslesen des Sendungstitels lese ich 30 Zeichen, ohne Rücksicht zu nehmen, wie lange der String ist, klappt das, oder nicht? Ansonsten müsste ich die 30 durch einen Ausdruck mit String.Length und der Startposition ersetzen.
#2
Die Funktion hatte einige Fehler, falsch gesetzte Klammern, Syntax, usw. Einiges bereinigt, läuft aber noch nicht:

CODE
%DefFunc(DVBViewer_getpos,Global,String,Offset=
%If(String.Pos(%String(),%DVBViewer_readline())>0) Then {
 %Inc(%Inc(%String.Pos(%String(),%DVBViewer_readline()),%String.Length(%String())),%Offset())
}Else{False}
)

%DefFunc(DVBViewer_Status,Global=
%If(%DVBViewer_lastcheck() ! %System.GetDateTime(hh:nn)) Then { /aus Performancegründen nur einmal pro Minute/
 %Assign(DVBViewer_lastcheck,%System.GetDateTime(hh:nn))
 /läuft der Dienst?/
 %LCD.SetSymbol(%LCD_DVD(), 1)
 %If(%System.GetProcessID('DVBVservice.exe') > 0 ) Then
  {
  /wenn ja dann Auftrag ermitteln/
  %LCD.SetSymbol(%LCD_mute(), 0)
  %Assign(DVBViewer_readline,%System.ReadFile(%DVBViewer_url(),2,UTF8))  
  %If(%DVBViewer_getpos('Timer Type',-15) = 1) Then
   {
   /es ist ein Auftrag vorhanden/
   %Assign(DVBViewer_date,%String.Copy(%DVBViewer_readline(),%DVBViewer_getpos('Date=',1),10)) /tt.mm.jjjj/
   %Assign(DVBViewer_start,%String.Copy(%DVBViewer_readline(),%DVBViewer_getpos('Start=',1),5)) /hh:mm/
   %Assign(DVBViewer_end,%String.Copy(%DVBViewer_readline(),%DVBViewer_getpos('End=',1),5)) /mm/
   %Assign(DVBViewer_readline,%System.ReadFile(%DVBViewer_url(),3,UTF8))
   %Assign(DVBViewer_title,%String.Copy(%DVBViewer_readline(),%DVBViewer_getpos('',0),30))
   %Assign(DVBViewer_readline,%System.ReadFile(%DVBViewer_url(),9,UTF8))
   %Assign(DVBViewer_channel,%String.Copy(%DVBViewer_readline(),%DVBViewer_getpos('|',0),10))
   %Assign(DVBViewer_readline,%System.ReadFile(%DVBViewer_url(),11,UTF8))
   %If(%String.Copy(%DVBViewer_readline(),%DVBViewer_getpos('',0),1)='-')Then {%Assign(DVBViewer_rec,'True')}
   %If(%String.Copy(%DVBViewer_readline(),%DVBViewer_getpos('',0),1)='0')Then {%Assign(DVBViewer_rec,'False')}
   }
  Else
   { /kein Auftrag/
/    %Assign(DVBViewer_rec,False)/
/    %Assign(DVBViewer_title,'empty') /
   }
  True
  }
 Else
  { /Dienst läuft nicht/
  False
/   %Assign(DVBViewer_rec,False)/
/   %Assign(DVBViewer_title,'empty')/
  %LCD.SetSymbol(%LCD_mute(), 1)
  }
 %LCD.SetSymbol(%LCD_DVD(), 0)
}
)


Die Haupfunktion DVBVIewer_status() liefert "Else{}Else{}Else{}" zurück... ??? Was ist da falsch?

Aber die ganzen nicht auskommentierten %Assign() Befehle liefern zurück, was erwartet ist. Komisch ist aber, dass sehr oft festgestellt wird, dass kein Auftrag da ist oder der Dienst nicht läuft. Ich versuche das mit dem Setzen der LCD.SetSymbol Befehlen zu tracen. Deswegen sind 4 Assignbefehle derzeit auskommentiert. Aber ich blicke es nicht...
#3
So, ich habe jetzt erstmal eine Version, die etwas liefert, wenn auch noch nicht alles was ich will. Die Lösung war, die ganzen "Else" Statements durch erneute %If() Statements zu ersetzen. Seltsam...

CODE
%DefFunc(DVBViewer_getpos,Global,String,Offset=
%If(String.Pos(%String(),%DVBViewer_readline())>0) Then {
 %Inc(%Inc(%String.Pos(%String(),%DVBViewer_readline()),%String.Length(%String())),%Offset())}
%If(String.Pos(%String(),%DVBViewer_readline())=0) Then{-1}
)

%DefFunc(DVBViewer_Status,Global=
%If(%DVBViewer_lastcheck() ! %System.GetDateTime(hh:nn)) Then {
 %Assign(DVBViewer_lastcheck,%System.GetDateTime(hh:nn))
 %If(%System.GetProcessID('DVBVservice.exe') > 0 ) Then
  {
  %Assign(DVBViewer_readline,%System.ReadFile(%DVBViewer_url(),2,UTF8))  
  %If(%DVBViewer_getpos('Timer Type',-15) = 1) Then
   {
   %Assign(DVBViewer_date,%String.Copy(%DVBViewer_readline(),%DVBViewer_getpos('Date=',1),10))
   %Assign(DVBViewer_start,%String.Copy(%DVBViewer_readline(),%DVBViewer_getpos('Start=',1),5))
   %Assign(DVBViewer_end,%String.Copy(%DVBViewer_readline(),%DVBViewer_getpos('End=',1),5))
   %Assign(DVBViewer_readline,%System.ReadFile(%DVBViewer_url(),3,UTF8))
   %Assign(DVBViewer_title,%String.Copy(%DVBViewer_readline(),%DVBViewer_getpos('',0),30))
   %Assign(DVBViewer_readline,%System.ReadFile(%DVBViewer_url(),9,UTF8))
   %Assign(DVBViewer_channel,%String.Copy(%DVBViewer_readline(),%DVBViewer_getpos('|',0),10))
   %Assign(DVBViewer_readline,%System.ReadFile(%DVBViewer_url(),11,UTF8))
   %If(%String.Copy(%DVBViewer_readline(),%DVBViewer_getpos('',0),1)='-')Then {%Assign(DVBViewer_rec,'True')}
   %If(%String.Copy(%DVBViewer_readline(),%DVBViewer_getpos('',0),1)='0')Then {%Assign(DVBViewer_rec,'False')}
   }
  %Assign(DVBViewer_readline,%System.ReadFile(%DVBViewer_url(),2,UTF8))  
  %If(%DVBViewer_getpos('Timer Type',-15) < 1) Then
   {
   %Assign(DVBViewer_rec,False)
   %Assign(DVBViewer_title,'none')
   }
  }
 %If(%System.GetProcessID('DVBVservice.exe') = 0 ) Then
  {
  %Assign(DVBViewer_rec,False2)
  %Assign(DVBViewer_title,'none')
  }
}
)


Allerdings gelint es mir noch nicht, die Funktion als solches ein "True" oder "False" zurückliefern zu lassen. Dann muss ich halt wohl die Auswertung im Hauptscript mit DVBViewer_title = 'none' erledigen. Wenn da mit dem Rückgabewert der Funktion DVBViewer_Status() jemand eine Idee hat, wäre ich sehr verbunden... Gute Nacht erstmal.
#4
So, habe noch weiter dran rumgebastelt. Ich kann zwar immer noch keinen Rückgabewert der Funktion erzwingen, aber ich komme jetzt auch ohne aus. Ansonsten geht alles und ich habe auch schon einen Anzeige-Screem gebastelt, der bei WMC zumindestens anzeigt, wenn was aufgezeichnet wird, und bei DVBViewer Recordign Service wird Datum, Uhrzeit Ende Sender und Titel agezeigt. Außerdem steuern WMC und der DVBViewer Recording-Service das REC Symbol des Displays an. Mehr demnächst, ich muss bei der Anzeige noch ein bischen an der Optik feilen, diese relative Text-Positionierung mit dem %Format.Offset() Befehl kann einem den letzten Nerv rauben.

Anbei zwei Bilder, so sieht der Screen derzeit aus, einmal beide Aufnahmedienste ohne Auftrag, und einmal beide mit Aufnahme. WMC zeigt bisher nur an, dass was aufgenommen wird, mehr nicht, ich weiß auch nicht, ob ich je mehr rausholen kann. DVBViewer Recording-Service zeigt dagegen alles an, was relevant ist.


Attached Files Thumbnail(s)
       
#5
Hallo,

Ich hatte mal ein Plugin erstellt, aber vergessen zu posten.
http://lcdhype.condense.de/index.php?showtopic=5325

Macht die Sache etwas kürzer :-)

Gruß
#6
Danke, aber brauche ich nicht mehr, es funzt prinzipiell bereits. Nur zickt momentan der Rechner allgemein rum, kann deswegen nicht weiter machen...
#7
So, die Rechnerprobleme sind behoben (verursacht durch ein BIOS-Update ,gelöst mit BIOS-Einstellung), jetzt kann ich an dem Anzeige-Script weiter machen. Habe auch schon eine Idee, wie ich es besser und einfacher aufbaue.
#8
So, ich habe jetzt was ansehliches. Die Anzeige folgt nach folgendem Muster:

Uhrzeit | TV-Aufnahmestatus
-----------------------------------
WMC:Wait/REC DVBVrs:Wait/REC/keine datum von-bis sender sendungstitel

Diese zweite Zeile scriollt als Ticker durch. Der Aufbau ist einfacher als in der ersten Version (siehe oben) und benutzt wesentlich mehr Platz für die wirklich wesentlichen Informationen.

Außerdem leuchtet das REC-Symbol des Displays, sobald eine Aufnahme läuft, egal ob WMC oder Recording Service.

Siehe http://lcdhype.condense.de/index.php?showtopic=5311


Forum Jump:


Users browsing this thread: 1 Guest(s)