nuts Posted January 22, 2012 Share Posted January 22, 2012 (edited) 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ßnutsedit\ Ein paar einfache Funktionen wurden hinzugefügt 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 August 21, 2013 by nuts Quote Link to comment
hoto44 Posted August 21, 2013 Share Posted August 21, 2013 Hallo nuts, um die .au3 einzusetzen, muss ich die erst in eine .exe mit AutoIt umwandeln? Viele Grüsse hoto44 Quote Link to comment
nuts Posted August 21, 2013 Author Share Posted August 21, 2013 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. Quote Link to comment
hoto44 Posted August 21, 2013 Share Posted August 21, 2013 ...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 Quote Link to comment
nuts Posted August 21, 2013 Author Share Posted August 21, 2013 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. Quote Link to comment
Polarfox Posted October 28, 2014 Share Posted October 28, 2014 Hi, ich bin neu in der Programmierung und versuche mit AUTOIT einige Hilfsroutinen selbst zu schreiben. Dabei bin ich auf diesen genialen Forumbeitrag gekommen 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? Quote Link to comment
Polarfox Posted October 28, 2014 Share Posted October 28, 2014 (edited) 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 October 28, 2014 by Polarfox Quote Link to comment
nuts Posted October 28, 2014 Author Share Posted October 28, 2014 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 Quote Link to comment
Polarfox Posted October 28, 2014 Share Posted October 28, 2014 (edited) ... 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 October 28, 2014 by Polarfox Quote Link to comment
nuts Posted October 28, 2014 Author Share Posted October 28, 2014 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 & "<") Quote Link to comment
Polarfox Posted October 28, 2014 Share Posted October 28, 2014 (edited) 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 October 28, 2014 by Polarfox Quote Link to comment
nuts Posted October 28, 2014 Author Share Posted October 28, 2014 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 ... Quote Link to comment
Polarfox Posted October 28, 2014 Share Posted October 28, 2014 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... Quote Link to comment
Polarfox Posted October 28, 2014 Share Posted October 28, 2014 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). Quote Link to comment
nuts Posted October 29, 2014 Author Share Posted October 29, 2014 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 anendif$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 anendif Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.