Jump to content

DVBViewer.au3 - Autoit UDF zum COM-Interface


nuts

Recommended Posts

Hey,


anbei mal eine kleine Funktionssammlung zum COM-Interface.
Ist jetzt nur schnell zusammenkopiert und noch massiv ausbaubar.

Solltet ihr was konkretes brauchen könnt ihr das ja hier posten.

Gruß

nuts

edit\ Ein paar einfache Funktionen wurden hinzugefügt smile.gif

edit2\ Wieder ein paar Funktionen hinzugefügt (15.10.2012)

 

edit3\ Neue Funktionen , _XMLDomWrapper.au3 (wird für DVBViewer.au3 benötigt) und Beispielskript hinzugefügt (21.08.2013)

 

Diese Funktionen sind vorhanden:

 

; _Get_dvbv_configdir()
; _Get_DVBV_Path($fullpath = False)
; _SenderID($SID, $VPID, $APID, $tunertyp, $TSID, $orbitalpos, $flag)
; _DVBV_read_XML($sfile, $ssection, $svalue)
; _DVBV_Connect()
; _Get_CurrentChannelNr($oDVBV)
; _SetChannelNr($oDVBV, $i_Nr)
; _Get_CurrentLanguage($oDVBV)
; _Get_LastChannel($oDVBV)
; _Set_Volume($oDVBV, $iVolume)
; _Show_Window($oDVBV, $iWindowID)
; _Aktivate_Shader($oDVBV, $sShader, $sdvbv_path)
; _Get_Aktive_Shader($oDVB)
; _VideoAB($oDVBV, $sMode="A")
; _AudioAB($oDVBV, $sMode="A")
; _Showpopup($oDVB, $stext, $header = '', $Centered = True)
; _Showinfo($oDVBV, $sline1, $sline2, $timeout, $sheader='',$sbuttoncaption="Ok")
; _ShowYesNO($oDVBV, $sheader, $sline1, $sline2, $sline3, $bSelected=false)
; _ShowInfoinTVPic($oDVBV, $sinfo, $itimeout)
; _Sendcommand($oDVB, $ID)
; _is_recording($oDVBV)
; _get_nextrecordingtime($oDVBV)
; _is_timeshift($oDVBV)
; _is_playing($oDVBV)
; _is_mediaplayback($oDVBV)
; _hbbTV_LoadinBrowser($oDVBV, $s_data, $b_flag=0)
; _hbbtv_isvisible($oDVBV, $b_flag=1)
; _stop_instantrec($oDVBV, $b_stopall = True, $i_item = 0)
; _send_instantrec_to_RS($oDVBV, $i_endtimer = 60, $b_sendall = True, $i_item = 0
; _GetTranslation($oDVBV, $svalue)
; _Date_to_Tdate($sdate)
; _Time_to_Ttime($stime)
; _DateTime_toTdatetime($s_datetime)
; _Datamanager_GetValue($oDVB, $svalue)
; _Datamanager_SetValue($oDVB, $svalue, $sdata)

 

Den Thread zur _XMLDomWrapper.au3 findet ihr hier: http://www.autoitscript.com/forum/topic/19848-xml-dom-wrapper-com/

DVBViewer.zip

dvbviewer_au3_example.zip

Edited by nuts
Link to comment
  • 1 year later...

Nein eigentlich nicht.

Die DVBViewer.au3 wird wie ein ganz gewöhnliches include eingebunden.

 

Habe mal eine neuere Version hochgeladen und ein Beispiel hinzugefügt.

Link to comment

...muss noch einmal nachfragen:

 

kann ich die beiden Dateien in den Ordner my_scripts packen und sie dann so wie Dein sehr schönes sendcommand v2 script verwenden?

 

Danke und Grüsse

 

hoto44

Link to comment

Die Dateien werden beim "compilieren" soweiso in die "sendcommand v2.exe" hineinkopiert.

Für die Verwendung vom sendcommand Skript brauchst du nur die .exe

D.h. wenn du selbst nicht skripten willst brauchst du dir um diese Dateien keine Gedanken zu machen.

Link to comment
  • 1 year later...

Hi,

 

ich bin neu in der Programmierung und versuche mit AUTOIT einige Hilfsroutinen selbst zu schreiben. Dabei bin ich auf diesen genialen Forumbeitrag gekommen :original:

 

Für mein Vorhaben möchte ich die nächste Aufnahmezeit des RecordingService herausfinden, bzw. ob in den nächsten 5 Minuten eine Aufnahme ansteht.

 

Wenn ich alles richtig verstanden habe, sieht der Scriptablauf wie folgt aus:

 

1) #include DVBViewer.au3

2) Objekt erstellen mit _DVBV_Connect()

3) Zeit abfragen mit _get_nextrecordingtime($oDVBV)

 

Ist die Vorgehensweise so richtig? Gibt es einen kürzeren Weg?

Link to comment

wenn ich mit das DVBViewer-Object mit

 

$oDVBViewer = ObjGet ("", "DVBViewerServer.DVBViewer")

 

erstelle, bekomme ich kein Objekt zurück. Warum? Brauche ich für die COM-Schnittstelle noch etwas - oder ist da bei Standardinstallation schon alles dabei?

Edited by Polarfox
Link to comment

Müsste alles dabei sein. Der DVBViewer muss allerdings laufen!

Läuft das Skript im Systemkonto? Dann ist eine Verbindung zum DVBViewer Objekt, das in einem anderen Benutzerkonto läuft, nicht möglich (zumindest wüsste ich nicht wie).

 

Ganz grundsätzlich ist die UDF für die Kommunikation mit dem DVBViewer gedacht.

Du möchtest aber mit dem RS arbeiten.

"_get_nextrecordingtime($oDVBV)" ist nur für lokale, vom DVBViewer selbst verwaltete Aufnahmen. Mit RS Installation hat man die üblicherweise gar nicht.

 

Für den RS brauchst du die webAPI: http://en.DVBViewer.tv/wiki/Recording_Service_API

Hier mal ein Beispielaufruf (nicht lauffähig) über die WinHTTP.au3 (kein Standard include):

; start http request

Local $sHeader, $authorization = _Base64Encode($user & ':' & $pass)

 

Local $hOpen = _WinHttpOpen("Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 GTB7.1")

Local $hConnect = _WinHttpConnect($hOpen, $IP, $port)

Local $hRequest = _WinHttpOpenRequest($hConnect, 'GET', "/api/status.html") ; status.xml Abfragen, du bräuchtest die timer.xml

 

_WinHttpSendRequest($hRequest, 'Authorization: Basic ' & $authorization)

_WinHttpReceiveResponse($hRequest)

 

If _WinHttpQueryDataAvailable($hRequest) Then $sHeader = _WinHttpQueryHeaders($hRequest)

 

Local $sHTML = ''

Do

$sHTML &= _WinHttpReadData($hRequest)

Until @error

 

_WinHttpCloseHandle($hRequest)

_WinHttpCloseHandle($hConnect)

_WinHttpCloseHandle($hOpen)

; http request finished

 

Func _Base64Encode($sData)

; keine Ahnung von wem die Funktion is (nicht von mir)

Local $oXml = ObjCreate("Msxml2.DOMDocument")

If Not IsObj($oXml) Then

SetError(1, 1, 0)

EndIf

 

Local $oElement = $oXml.createElement("b64")

If Not IsObj($oElement) Then

SetError(2, 2, 0)

EndIf

 

$oElement.dataType = "bin.base64"

$oElement.nodeTypedValue = Binary($sData)

Local $sReturn = $oElement.Text

 

If StringLen($sReturn) = 0 Then

SetError(3, 3, 0)

EndIf

 

Return $sReturn

EndFunc ;==>_Base64Encode

Link to comment

... Der DVBViewer muss allerdings laufen! ...

An dem lag es. Hatte den DVBViewer natürlich aus und nur den RS am Laufen.

 

 

...

 

Für den RS brauchst du die webAPI: http://en.DVBViewer.tv/wiki/Recording_Service_API

...

Mit der RS-API habe ich auch schon herumexpirementiert.

Für die Abfrage, ob Aufnahmen laufen habe ich folgenden Quelltext generiert:

 

local $sRS_Status_HTML = _INetGetSource("http://127.0.0.1:8089/api/status.html")

msgbox (0,"Info",$sRS_Status_HTML)

local $aREC_count = _StringBetween($sRS_Status_HTML, '<recordcount>', '</recordcount>') ;in Array!!!

$iREC_count =$aREC_count[0] ;Anzahl der laufenden Aufnahmen in globle Variable

msgbox (0,"Auswertung:","recordcount: " & $iREC_count)

 

Damit bekomme ich die Anzahl der laufenden Aufnahmen. Eigentlich schon ganz gut.

 

Um die nächsten Aufnahme herauszubekommen, habe ich allerdings Schwierigkeiten.

Ich denke die entsprechende RS-API-Funktion ist die ..../API/Timerlist.html.

 

Nur wie werte ich die Antwort aus, um auf die nächste Aufnahme zu kommen. Ist ja alles unsortiert ...

Wie gesagt eigentlich möchte ich nur prüfen, ob z.B. in den nächsten 5 Minuten eine Aufnahme ansteht.

 

Eine Idee?

Edited by Polarfox
Link to comment

Wie sieht die Rückgabe denn aus?
Du wirst aber so oder so jeden Timereintrag durchgehen müssen und diesen mit der Systemzeit vergleichen.

Um die XML mal etwas lesbarer zu machen könntest du das hier versuchen:

StringReplace($s_rückgabe, "><", ">" & @CRLF & "<")
Link to comment

Wie sieht die Rückgabe denn aus?

 

 

so z.B.:

 

<Timers><Timer Type="1" ID="{5D63C62C-98A7-4F36-BF25-8C458F5E6C61}" Enabled="-1" Priority="50" Charset="0" Date="02.11.2014" Start="19:24:00" Dur="27" End="19:51:00" Days="------T" PreEPG="1" PostEPG="1" Action="0" EPGEventID="24709"><Descr>pur+ - Bin ich schön</Descr><Options AdjustPAT="-1"/><Format>2</Format><Folder>D:\01_Aufnahmen\11_Kids</Folder><NameScheme>%year%m%d_%D_%h%M_%name</NameScheme><Source>Web</Source><Channel ID="2359890544166710168|KiKA HD (deu)"/><Executeable>-1</Executeable><Recording>0</Recording><ID>0</ID><GUID>{5D63C62C-98A7-4F36-BF25-8C458F5E6C61}</GUID></Timer><Timer Type="1" ID="{7E14AC8E-B15E-41E2-AD8C-E56E340FA530}" Enabled="-1" Priority="50" Charset="0" Date="28.10.2014" Start="19:49:00" Dur="13" End="20:02:00" Days="TTTT-TT" PreEPG="1" PostEPG="2" Action="0" EPGEventID="24710"><Descr>logo!</Descr><Options AdjustPAT="-1"/><Format>2</Format><Folder>D:\01_Aufnahmen\10_Logo</Folder><NameScheme>%year%m%d_%D_%h%M_%name</NameScheme><Source>Web</Source><Channel ID="2359890544166710168|KiKA HD (deu)"/><Executeable>-1</Executeable><Recording>0</Recording><ID>1</ID><GUID>{7E14AC8E-B15E-41E2-AD8C-E56E340FA530}</GUID></Timer><Timer Type="1" ID="{F5222096-F101-489E-8EE3-AEBAC462910F}" Enabled="-1" Priority="50" Charset="0" Date="31.10.2014" Start="19:24:00" Dur="11" End="19:35:00" Days="----T--" PreEPG="1" PostEPG="5" Action="0" EPGEventID="24813"><Descr>logo!</Descr><Options AdjustPAT="-1"/><Format>2</Format>

....

 

Diesen Inhalt habe ich nun in einer String-Variablen.

Ich werde wohl den String nach dem nächsten Datum ("=Date") und Uhrzeit ("=Start") durchsuchen müssen. Dabei werde ich alle gefunden Einträge in ein Array schreiben. Damit kann ich dann weiterarbeiten.

Geht's einfacher? Irgendeine geniale AutoIt-Super-String-Funktion?

Edited by Polarfox
Link to comment

StringRegExp (_StringBetween macht auch nichts anderes) mit einem geeigneten Pattern könntest du verwenden um direkt alle gewünschten Angaben in ein Array zu schreiben.

Habe jetzt aber leider nicht die Zeit das zu erklären. Das ist etwas tricky ...

Link to comment

was für eine mächtige Funktion (auch etwas undurchsichtig ... tricky wie du sagst). Guter Tipp.

 

Mit diesem Befehl lässt sich der komplette String in ein Array mit den Timereinträgen zerlegen. Habe noch keine optimale Lösung aber die Zerlegung klappt ... muss mich mal in die Parameter einlesen...

Link to comment

so habe ich es hinbekommen:

 

local $sRS_Timerlist_XML = _INetGetSource("http://127.0.0.1:8089/api/timerlist.html")

;msgbox (0,"Info",$sRS_Timerlist_XML)

;tricky tricky ...

Local $aTimers = StringRegExp($sRS_Timerlist_XML, '(?i)Date=(.*?)Dur', 3) ;Bereich zwischen Date und Duration in Array schreiben
$iAnzahl= ubound($aTimers)
msgbox (0,"Info","Anzahl der Timereinträge: " & $iAnzahl)
if $iAnzahl>0 Then
for $i=0 to $iAnzahl-1
; 12345678901234567890123456789
;Umwandeln von '"DD.MM.YYYY" Start="hh:mm:ss"' in "YYYY/MM/DD hh:mm:ss"
$sOrg = $aTimers [$i]
$sFormat= stringmid($sOrg,8,4) & "/" & stringmid($sOrg,5,2) & "/" & stringmid ($sOrg,2,2) & " " & Stringmid ($sOrg, 21,8)
;msgbox (0, "Kontrolle", "Original: " & $sOrg & @crlf & "Neu: " & $sFormat)
$aTimers [$i] = $sFormat
Next
_arraysort ($aTimers, 0) ; 0 ... Array aufwärts sortieren, jüngster Eintrag in Array [0]
; ausgeben
for $i=0 to $iAnzahl-1
msgbox (0,"Timereintrag" , $aTimers[$i] )

Next
Else
msgbox (0, "Info", "Keine Timereinträge gefunden!")
EndIf

Jetzt steht in dem Array $aTimers mit Index 0, die nächste Aufnahme.

 

Ein kleiner Schönheitsfehler der Funktion:

Aufpassen .... es stehen auch die inaktiven Timereinträge drin, d.h. der nächste Eintrag kann auch deaktivierter sein (es gibt eben viele, viele Möglichkeiten sich auszutricksen).

Link to comment

Etwas einfacher wäre so ca.:

 

 

 

$i_pos=StringinStr($sRS_Timerlist_XML, 'Date="'&@MDAY &"."& @MON &"."& @YEAR & '"')
if $i_pos=0 then
; kein Treffer => es liegt kein Timer am heutigen Tage an
endif
$s_startdate=@year & "/" &@MON & "/" & @MDAY & " " & StringMid($sRS_Timerlist_XML, $i_pos + 8, 8) ; Stringmid nochmal nachzählen :)
if _Datediff('n', $s_startdate, _NowCalc()) < 5 then
; Treffer => es liegt ein Timer in den nächsten 5 Minuten an
endif

Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...