nuts Posted January 6, 2010 Share Posted January 6, 2010 (edited) Hey, für die EPG Verknüpfung von eurosport und eurosport hd ( http://www.DVBViewer.info/forum/index.php?showtopic=38457 ) könnte vielleicht auch ein Skript mit Hilfe der Com-Schnittstelle sorgen. edit \ So nach langem Kampf ist das Skript fertig. Source & compilierte .exe ist angehängt. Anwendung: Einfach die .exe ausführen (DVBV muss laufen)! Je nach Interessen wären verschiedene Erweiterungen wie OSD-Aufruf über ein Popup-Menü, Auslagern der Sender-ID's usw. möglich. Gruß nuts Update: 0.2 Mehrfach Ausführung verhindert epgtransfer_0.2.zip Edited January 9, 2010 by nuts Quote Link to comment
Lars_MQ Posted January 6, 2010 Share Posted January 6, 2010 Dein Result ist eine IEPGCollection. Ich weiss nicht wie autoit das macht, aber Du musst normalerweise durch die ganze collection loopen und die einzelnen IEPGItems behandeln. Oder Du nimmst die IEPGManager2.GetasArray2 funktion, dort kannst Du die komplette EPGChannelID übergeben und erhält ein zweidimensionales OLEVarArry, über das Du loopen kannst. Quote Link to comment
nuts Posted January 6, 2010 Author Share Posted January 6, 2010 (edited) zu IEPGManager2.GetasArray2: ist die "2" ein Tippfehler oder steht diese Funktion noch nicht in der Com-Doku? Danke soweit schonmal. Edited January 6, 2010 by nuts Quote Link to comment
Lars_MQ Posted January 6, 2010 Share Posted January 6, 2010 Die steht da noch nicht drinne. Sie entspricht der IEPGManager.GetasArray mit dem Unterschied, das als erster Parameter eine Int64 (=EPGChannelID) übergeben wird. Der Rest ist komplett identisch mit der alten Funktion. Quote Link to comment
nuts Posted January 6, 2010 Author Share Posted January 6, 2010 Gibts vielleicht auch noch eine GetEPGChannelID Funktion? Kann nichts finden in der Doku. Quote Link to comment
Lars_MQ Posted January 6, 2010 Share Posted January 6, 2010 Nein, aber die kannst Du Dir doch selber bauen mit dem link in dem anderem thread.... ist eine simple multiplikation und addition... Quote Link to comment
nuts Posted January 6, 2010 Author Share Posted January 6, 2010 Ok das sollte hinzukriegen sein Die Anzahl der Arrayeinträge hab ich schonmal, scheitert nurnoch am Array. Das ist aber wohl ein Autoit/User Problem. Quote Link to comment
Lars_MQ Posted January 6, 2010 Share Posted January 6, 2010 gut, da kenne ich mich nicht aus. Quote Link to comment
nuts Posted January 7, 2010 Author Share Posted January 7, 2010 Klappt noch nicht so richtig. Das steht in der Doku zu GetAsArray. function GetAsArray(ChannelID: Integer; StartTime: TDateTime; EndTime: TDateTime; out List: OleVariant): Integer; Returns a variant SafeArray of EPGItems which meet the criteria. This function is for highspeed data retrieval. The returned array is two dimensional [0..EPGItemCount, 0..EPGItemPropertiescount]. The second dimension is defined as follows: List[i,0] := EPGChannelID; // Longword (unsigned int) List[i,1] := EventID; // Longword (unsigned int) List[i,2] := Time; // Datetime (Double) List[i,3] := Duration; // Datetime (Double) List[i,4] := Event; // String List[i,5] := Title; // String List[i,6] := Description; // String List[i,7] := CharSet; // Byte List[i,8] := Content; // Byte Parameters ChannelID The EPGChannelID as explained in IEPGManager.hasEPG. If you want all channel set this to 0. StartTime The start time and date. If set to 0 it gets all available EPG data till EndTime. EndTime The end time and date. If set to 0 it gets all available EPG data from StartTime till the end of the buffer. If StartTime=EndTime you get all programs running at this point of time. List A Variant to be filled with the data. Returns The count of entries in the array. Entspricht doch der Beschreibung von Lars für IEPGManager2.GetasArray2? Zu IEPGManager2.GetasArray2 (gleicher Aufruf wie in der zitierten Doku) bekomme ich einen Error zurück. Bin leicht verwirrrt. Quote Link to comment
Lars_MQ Posted January 7, 2010 Share Posted January 7, 2010 Hmm ich seh grade, die erweiterungen gehen nicht mit scripting sprachen... Dann musst Du bei der alten GetasArray bleiben... Quote Link to comment
nuts Posted January 7, 2010 Author Share Posted January 7, 2010 (edited) Hm Autoit unterstützt keine Rückgabe-Parameter in Objekten Wäre zu schön gewesen. Bleibt noch die Möglichkeit mit IEPGManager.Get oder eine andere Sprache zu lernen Edited January 7, 2010 by nuts Quote Link to comment
nuts Posted January 7, 2010 Author Share Posted January 7, 2010 (edited) So leider muss ich nochmal nerven. Die EPG-Abfrage funktioniert mittlerweile über IEPGManager.Get Wie ist jetzt die Systematik? IEPGManager.Get -> IEPGCollection.item -> IEPGItem => dort kann jetzt alles von den Items ausgelesen werden Fürs Hinzufügen gehe ich über: IEPGManager.AddEPG -> IEPGAddBuffer.ADD -> Jetzt wird wieder auf IEPGItem verwiesen? Wie wird jetzt das Item hinzugefügt? Edited January 7, 2010 by nuts Quote Link to comment
Lars_MQ Posted January 7, 2010 Share Posted January 7, 2010 Du erzeugst ein neues IEPGItem mit dem aufruf IEPGAddBuffer.NewItem. Dieses musst Du dann mit den Daten des IEPGItems, das Du vorher vom IEPGCollection.item geholt hast, befüllen und mit IEPGAddBuffer.add hinzufügen. Wenn Du alle Items kopierst hast, rufst Du IEPGAddBuffer.commit auf. Quote Link to comment
nuts Posted January 7, 2010 Author Share Posted January 7, 2010 (edited) Okay danke - also es geht voran Für alle autoit'ler hier mal ein weiteres Bsp.: War eher suboptimal (s. Anmekrung von Lars) - Kommt später wieder rein. Edited January 7, 2010 by nuts Quote Link to comment
nuts Posted January 7, 2010 Author Share Posted January 7, 2010 (edited) Wird mir langsam peinlich aber ich hänge schon wieder fest. if you created the EPGItem via IEPGAddBuffer.NewItem you have to set the values Mit welcher Funktion werden die Werte gesetzt? with $DVBViewer;= Objekt $list = .EPGManager.Get(132,6 ,0,0).Item(0).Description() ConsoleWrite($list & @CRLF); Die EPG Daten sind vorhanden und in der Variablen $list gespeichert $new = .EPGManager.AddEPG.Newitem(); tjo wie gehts hier nur weiter ? EndWith IEPGItem (worauf IEPGAddBuffer.NewItem in der Doku verweist) bietet doch gar nichts um Werte zu setzen? Edited January 7, 2010 by nuts Quote Link to comment
Lars_MQ Posted January 7, 2010 Share Posted January 7, 2010 also erstmal mache sowas $list = .EPGManager.Get(132,6 ,0,0).Item(0).Description() niemals. Das bedeutet, das Du die komplette Suche im EPG, das übertragen der Daten usw. für jedes abgefragte property machst. Du holst dir erst die EPG Collection: $List = .EPGManager.Get(132,6 ,0,0) Danach das Item (alles pseudocode!): $Item = List.Item(0) Danach erzeugst Du Dir eine neues Item: $EPGAddBuffer = EPGManager.EPGAdd() $NewItem = EPGAddBuffer.Newitem() Und dann: NewItem.description = Item.Description NewItem.Title = Item.Title NewItem.ChannelID = Neue channelID NewItem.Genre = Item.Genre [...] Wenn alles durch ist machst Du: EPGAddBuffer.additem(NewItem) Das ganze in einer schleife für alle Items in der Collection und zum schluss kommt ein EPGAddBuffer.commit() Quote Link to comment
nuts Posted January 7, 2010 Author Share Posted January 7, 2010 (edited) Habs dank der super Anleitung fast geschafft - hier der Code für alle interessierten: $DVBViewer = ObjGet("", "DVBViewerServer.DVBViewer");Verbindung aufbauen -> klapptIf $DVBViewer = 0 Then; ohne Verbindung das Skript beenden MsgBox(1, "", "Keine Verbindung zum DVBViewer möglich") Exit EndIf $epg = $DVBViewer.EPGManager $get = $epg.Get(132,6 ,0,0) $count = $get.Count() $item = $get.Item(1) $add = $epg.addEPG $newitem = $add.newitem with $item $charset = .Charset; $content = .Content; $Description = .Description; $duration = .Duration; $endtime = .EndTime; $EPGEventID = .EPGEventID; $Event = .Event; $EventID = .EventID; $serviceID = .ServiceID; $Time = .Time; $Title = .Title; $TransportID = .TransportID; ConsoleWrite(VarGetType($duration) & @CRLF) EndWith with $newitem .charset=$charset .content = $content .Description = $Description .Duration=$duration; -> Hier wird ein int oder ein double Vartype erwartet? .time=$Time; -> Hier wird ein int oder ein double Vartype erwartet? .event=$Event .eventID=$EventID .title=$Title EndWith $add.add($newitem) $add.commit() Hab noch ein paar Fragen in den Code gepackt. Gibt scheinbar noch ein paar Probleme mit den Datentypen in autoit. edit \ Die Doku der erwarteten Datentypen stimmt aber oder? Für newitem.Duration konnte ich es wieder zurechtbiegen (String -> Int64 -> Double), die gleiche Vorgehensweise funktioniert komischerweise bei EndTime & Time nicht. with $item $duration = .Duration; -> $duration wird als String interpretiert $endtime = .EndTime; -> string .. $Time = .Time; -> string .. with $newitem .Duration=_WinAPI_IntToFloat(Number($Duration)); -> Geht nach der Wandlung von String to Int to Float .time=_WinAPI_IntToFloat(Number($time)); -> Error .EndTime=_WinAPI_IntToFloat(Number($endtime)); -> Error EndWith ;Erläuterung: _WinAPI_IntToFloat(Number($Duration)) => Number($duration) = Umwandlung in Int anschließend Int to Float (double) Edited January 9, 2010 by nuts Quote Link to comment
Lars_MQ Posted January 8, 2010 Share Posted January 8, 2010 TDateTime entspricht einer Fliesskommazahl (Float wahrscheinlich bei Dir). EPGEventID entspricht der EPGChannelID (wurde zu anfang schlecht benannt und konnte dann nicht mehr geändert werden). Was ist wenn Du die zwischenschritte einfach auslässt? also $Newitem.Duration = $Item.Duration; [...] Quote Link to comment
nuts Posted January 8, 2010 Author Share Posted January 8, 2010 (edited) Das ist z.B. in Autoit ein "double" Datentyp $var = 080110.164600 Damit funktionierts auch. Wundert mich nur das bei Duration nicht gemeckert wird? Edited January 8, 2010 by nuts Quote Link to comment
nuts Posted January 9, 2010 Author Share Posted January 9, 2010 Hm eins noch: Gibt es für ein neues Item Pflichtbestandteile? with $newitem .charset=$charset .content = $content .Description = $Description .Duration = $duration .time=$time .event=$Event .eventID=$EventID .title=$Title .EPGEventID=$EPGID ; EPGChannelID vom neuen Sender (hier eurosport) EndWith Gesetzt werden können diese 9, müssen alle im Buffer sein damit ein Item hinzugefügt werden kann? Mit den Datentypen gibts noch ein paar Autoit spezifische Probleme, ist es ok die Com-Doku an anderer Stelle anzuhängen damit man mir besser helfen kann? Quote Link to comment
Lars_MQ Posted January 9, 2010 Share Posted January 9, 2010 .charset, .content, .Description, .event sind optional. Der rest muss vorhanden sein, sonst wird der Eintrag nicht aufgenommen. Quote Link to comment
nuts Posted January 9, 2010 Author Share Posted January 9, 2010 (edited) Und die Com-Doku? Darf ich die wo anders anhängen? edit \ Eine Frage an die Plugin-Entwickler: Wie bekommt ihr denn so Sachen raus? Einfach ausprobiert? Gibt ja schon einige Plugins die sich mit dem EPG befassen. Edited January 9, 2010 by nuts Quote Link to comment
Lars_MQ Posted January 9, 2010 Share Posted January 9, 2010 Die kannste anhängen oder auf das SDK hier verweisen. Quote Link to comment
nuts Posted January 9, 2010 Author Share Posted January 9, 2010 (edited) So es ist geschafft. Es werden tatsächlich EPG-Items im DVBV erstellt. An dieser Stelle nochmal vielen Dank an Lars für die Geduld. So kann man item.Duration & item.Time per Autoit wieder in ein TDateTime konformes Format bringen: Func _DateStringToDouble($sString) ; Author: Prog@ndy $sString = StringRegExp($sString, "^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$", 1) If @error Then Return SetError(2,0,0.0) Local $iDays = _DateToDayValue($sString[0], $sString[1], $sString[2]) If @error Then Return SetError(1,0,0.0) $iDays -= 2415018.5 ; das Startdatum (30/12/1899) abziehen Local $iTimeInDays = $sString[3] /24 + $sString[4] /1440 + $sString[5] /86400 ;Die Zeit in Teile von Tagen umwandeln Return $iDays+$iTimeInDays EndFunc Besteht grundsätzliches Interesse an einem Eurosport HD EPG -> Eurosport EPG Transferskript? Weil dann könnte man sich Gedanken machen wie man es am sinnvollsten aufrufen kann. Falls nein gibts nur die Möglichkeit, die ich für sinnvoll halte. edit \ Skript und .exe im editierten Startpost anhängt! Edited January 9, 2010 by nuts Quote Link to comment
Tüftler Posted January 9, 2010 Share Posted January 9, 2010 Bevor ich das jetzt ausführe um zu testen noch eine Frage: muss die exe nur einmal ausgeführt werden oder jedes mal? Wenn ersteres zutrifft wie mache ich es wieder Rückgängig? Da ich bei AutoIt nicht durchsehe (man muss ja nicht jede Programmiersprache können ) sei noch die Frage erlaubt was denn wie und wann durch die exe gemacht wird. Quote Link to comment
nuts Posted January 9, 2010 Author Share Posted January 9, 2010 (edited) Das Skript holt sich alle vorhandenen EPG Daten von Eurosport HD und setzt diese Daten bei Eurosport ein. Die Details sind im Skript kommentiert. Wie man das EPG löschen kann weiss ich gar nicht. Kann aber eigentlich nichts schief gehen, werden nur EPG-Daten für eurosport erstellt. Einmal ausführen reicht zunächst. Soll das EPG aktualisiert werden muss es erneut ausgeführt werden. Bei mir wird das Skript vermutlich beim wöchentlichen Reboot eingebunden. edit \ kleines Update im Startpost um die Mehrfachausführung zu verhindern. Edited January 9, 2010 by nuts Quote Link to comment
Tüftler Posted January 9, 2010 Share Posted January 9, 2010 Ging nicht um das EPG löschen sondern darum ob deine exe für immer irgendeine EPG Funktion verändert. Da ich ja auch mit den Betas teste will ich schon sicher gehen das es nicht auf die exe zurückzuführen sein könnte. Bei meinen Scripts kenne ich ja ihre "Eingriffe". Also dürfte dann ja ein Neustart des DVBViewers reichen wenn die exe vorher in Verwendung war, richtig? Quote Link to comment
nuts Posted January 9, 2010 Author Share Posted January 9, 2010 (edited) Ist eigentlich nicht nötig. Das Skript ist in ~3 Sek. fertig und beendet sich selbst. Danach sind die EPG Daten drin (hoffentlich ) Mehr ists auch nicht, keine wackligen Hacks die sich ungefragt erneut einmischen können. edit \ Also es wird keine (gar keine auch nicht zum EPG) Einstellung im DVBV geändert. Die EPG Daten werden alle vom DVBV selbst erzeugt. Kann nix schiegehen, im schlimmsten Fall bricht das Skript mit einem error ab. Edited January 9, 2010 by nuts Quote Link to comment
Tüftler Posted January 9, 2010 Share Posted January 9, 2010 Tut mir leid nuts, aber bei mir gibt es leider keinerlei Fehler und mich muss mich wohl jetzt darum kümmern wie ich es am günstigsten automatisch aktivieren lasse. Danke. Quote Link to comment
nuts Posted January 9, 2010 Author Share Posted January 9, 2010 Juhu es funktioniert Eine Prüfung wie z.B.: Letzter vorhandener EPG Eintrag = currentdate+2 Tage wäre möglich. Eine händische Aktivierung via OSD werde ich vermutlich noch einbauen. Quote Link to comment
Lars_MQ Posted January 9, 2010 Share Posted January 9, 2010 @nuts Das war die pflicht und jetzt kommt die Kür, das ganze per http get/post und XML für den service ;) Quote Link to comment
nuts Posted January 9, 2010 Author Share Posted January 9, 2010 (edited) Hm , so hätte ich als RS Anwender das ja gleich angehen können. Müsste machbar sein und lässt sich gut über den RS automatisieren. edit \ Naja bevor ich hier zuviel verspreche: Erstmal sehn was der RS über einen http Aufruf EPG mäßig so liefert Edited January 9, 2010 by nuts Quote Link to comment
Lars_MQ Posted January 9, 2010 Share Posted January 9, 2010 Das ganze ist tatsächlich ziemlich simpel. Du liest die XML vom service ein, gehst sie durch und änderst nur die EPGChannelID und schickst das ganze wieder zurück an den service. Mein Problem dabei ist ja die zuordnung von quell- zu ziel-sender, das muss irgendwo definiert werden und abgelegt werden (für mehr als einen), damit die software das in einem aufruf von einem processtimer in einem schwung verarbeiten kann... Du hast den vorteil, Du arbeitest an einer ganz spezifischen lösung, würde ich sowas rausgeben, würde eine generische Lösung erwartet, die auch mit Problemen ausserhalb der heilen Astra 19.2 Welt dealt... Quote Link to comment
nuts Posted January 9, 2010 Author Share Posted January 9, 2010 (edited) Jetzt sind wir wieder am Punkt wo ich die Doku nicht lesen kann Wer macht mir dazu mal einen echten Beispielaufruf? url/epg.html?lvl=2[&ch={epgchannelID}][&start={floatDateTime}][&end={floatDateTime}] edit \ Also für den Webbrowser reicht völlig aus. Edited January 9, 2010 by nuts Quote Link to comment
nuts Posted January 10, 2010 Author Share Posted January 10, 2010 (edited) Zum Browseraufruf? edit \ http://www.DVBViewer.info/forum/index.php?...mp;#entry280113? Edited January 11, 2010 by nuts Quote Link to comment
mague Posted February 25, 2012 Share Posted February 25, 2012 Oder Du nimmst die IEPGManager2.GetasArray2 funktion, dort kannst Du die komplette EPGChannelID übergeben und erhält ein zweidimensionales OLEVarArry, über das Du loopen kannst. Hi, dann koennte man die 64bit ID vom FavoritenManager einfach nutzen ? Kann man dafuer die aktuelle DVBViewerServer_TLB.pas bekommen ? Wenigstens alles zu diesem interface, dan kann ich es auch als extra unit einbinden. Abgesehen davon, hat jemand ein Stueck code wie man aus dem vorderen Teil von List[x,2] aus FavoritesManager.GetFavoritesList eine ID fuer die alte GetAsArray Methode eine ID rechnet ? Quote Link to comment
mague Posted February 27, 2012 Share Posted February 27, 2012 Hi, ok. Ich hab den FavoritenManager als Quelle der Basisdaten verworfen und nutze jetzt brav den ChannelManager. Ist halt aufwendiger Relationen zu bilden. Das OLEVarArry was der ChannelManager zurueckliefert hat in der 2ten Dimmension ja sowieso schon 29 records. Da koennte man noch was anfuegen um es den Menschen in Zukunft etwas angenehmer zu machen. Ich wurde vorschlagen noch die EPGid und, falls vorhanden, den Favoriten Ordner anzufuegen. Also List[x,29] EPGid List[x,30] Favoritenorder oder '' Das waere fuer den DVBViewer eine Sekunde Rechenzeit beim Starten. Fuer den plugin und Skript Entwickler waere einiges viel einfacher und wuerde Zeit sparen. Bei plugins auch Speicher und Rechenzeit. Letzteres muss nicht, kann aber die Bedienung des OSD verlangsamen. 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.