Jump to content
nuts

EPG per Com auslesen

Recommended Posts

nuts

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 by nuts

Share this post


Link to post
Lars_MQ

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.

Share this post


Link to post
nuts

zu IEPGManager2.GetasArray2: ist die "2" ein Tippfehler oder steht diese Funktion noch nicht in der Com-Doku?

 

Danke soweit schonmal.

Edited by nuts

Share this post


Link to post
Lars_MQ

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.

Share this post


Link to post
nuts

Gibts vielleicht auch noch eine GetEPGChannelID Funktion? Kann nichts finden in der Doku. :P

Share this post


Link to post
Lars_MQ

Nein, aber die kannst Du Dir doch selber bauen mit dem link in dem anderem thread.... ist eine simple multiplikation und addition...

Share this post


Link to post
nuts

Ok das sollte hinzukriegen sein :P

Die Anzahl der Arrayeinträge hab ich schonmal, scheitert nurnoch am Array. Das ist aber wohl ein Autoit/User Problem.

Share this post


Link to post
Lars_MQ

gut, da kenne ich mich nicht aus.

Share this post


Link to post
nuts

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.

Share this post


Link to post
Lars_MQ

Hmm ich seh grade, die erweiterungen gehen nicht mit scripting sprachen... Dann musst Du bei der alten GetasArray bleiben...

Share this post


Link to post
nuts

Hm Autoit unterstützt keine Rückgabe-Parameter in Objekten :P

Wäre zu schön gewesen.

Bleibt noch die Möglichkeit mit IEPGManager.Get oder eine andere Sprache zu lernen :P

Edited by nuts

Share this post


Link to post
nuts

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 by nuts

Share this post


Link to post
Lars_MQ

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.

Share this post


Link to post
nuts

Okay danke - also es geht voran :wacko:

 

Für alle autoit'ler hier mal ein weiteres Bsp.:

 

War eher suboptimal (s. Anmekrung von Lars) - Kommt später wieder rein.

Edited by nuts

Share this post


Link to post
nuts

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? :wacko:

Edited by nuts

Share this post


Link to post
Lars_MQ

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()

Share this post


Link to post
nuts

Habs dank der super Anleitung fast geschafft :bye: - hier der Code für alle interessierten:

$DVBViewer = ObjGet("", "DVBViewerServer.DVBViewer");Verbindung aufbauen -> klappt

If $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. :wacko:

 

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 by nuts

Share this post


Link to post
Lars_MQ

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; 
[...]

Share this post


Link to post
nuts

Das ist z.B. in Autoit ein "double" Datentyp :wacko:

$var = 080110.164600

Damit funktionierts auch. Wundert mich nur das bei Duration nicht gemeckert wird? ;)

Edited by nuts

Share this post


Link to post
nuts

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?

Share this post


Link to post
Lars_MQ

.charset, .content, .Description, .event sind optional. Der rest muss vorhanden sein, sonst wird der Eintrag nicht aufgenommen.

Share this post


Link to post
nuts

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 by nuts

Share this post


Link to post
Lars_MQ

Die kannste anhängen oder auf das SDK hier verweisen.

Share this post


Link to post
nuts

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 by nuts

Share this post


Link to post
Tüftler

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.

Share this post


Link to post
nuts

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 by nuts

Share this post


Link to post
Tüftler

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?

Share this post


Link to post
nuts

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 by nuts

Share this post


Link to post
Tüftler

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. ;)

Share this post


Link to post
nuts

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.

Share this post


Link to post
Lars_MQ

@nuts

Das war die pflicht und jetzt kommt die Kür, das ganze per http get/post und XML für den service ;) ;)

Share this post


Link to post
nuts

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 by nuts

Share this post


Link to post
Lars_MQ

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... ;)

Share this post


Link to post
nuts

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 by nuts

Share this post


Link to post
mague

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 ?

Share this post


Link to post
mague

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.

Share this post


Link to post

Join the conversation

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

Guest
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...