Jump to content

EPG automatisch durchsuchen


Recommended Posts

...

Sorry hab ich nicht. War noch mit Deinem ersten Wurf beschäftigt. Hast Du dies Fragment in Deine Sourcen integriert und läuftst?

...

Nein hab gedacht ich post nur mal so... :bye: SICHER FUNZT DER CODE!

 

und aus unseren object-Array stellen wir nun die Datentypen wieder her:

for (int i = 0; i < count; i++)
{
   int epgChanId = int.Parse(epgs[i,0].ToString());
   int eventId = int.Parse(epgs[i,1].ToString());
   DateTime start = DateTime.Parse(epgs[i,2].ToString());
   TimeSpan duration = DateTime.Parse(epgs[i,3].ToString()).TimeOfDay;
   string category = epgs[i,4].ToString();
   string title = epgs[i,5].ToString();
   string description = epgs[i,6].ToString();
   byte charSet = byte.Parse(epgs[i,7].ToString());
   byte content = byte.Parse(epgs[i,8].ToString());
}

Link to comment

:bye:

Ich hab einfach die Videos aufn RW gebrannt :( (Wollt weitermachen ehe man mein Prog ganz vergisst :D)

Naja also ich habs geschafft! Habe jetzt Version 0.1.1.3 (natürlich immernoch eine Beta) fertig!!!

Noch kann man das nirgendwo runterladen... :bye:

Ich werd morgen sehen, dass ich vllt. das in die MemberArea laden kann!

Ansonsten gehts halt nur auf Anfrage!

 

MfG Skyscraper

PS: Neue Screens und ein Supportsystem unter DVBViewer-Plugins

EDIT: Ein Changelog gibts da auch :bye: (Da die Version 0.1.1.2 eh nur Rayman hatte für euch nicht so interressant)

Edited by Skyscraper
Link to comment

@JustCute

 

Das mit der Objekt / Array Interpretierung hätte ich wohl kaum hinbekommen. Hast du beruflich mit .NET Programmierung zu tun oder wieso kennst du dich mit der Materie so gut aus? Ich habe noch nie C# programmiert, aber dieses von dir geführte Praxistutorial war eine gute erste Erfahrung für mich. :bye:

 

Die Abarbeitung der Suchanfrage geht nun wie erwartet wesentlich flotter mit der GetAsArray() Methode. Den Fortschrittsbalken brauche ich eigentlich gar nicht mehr. Die Suche dauert jetzt durchschnittlich 2-3 Sekunden (vorher schätzungsweise 10-15 Sekunden). Jetzt muß ich nur noch wieder an die Channeldaten kommen, um den Sendernamen und die ChannelID für TimerManager.AddItem() zu haben. Aber das bekomme wohl auch noch hin.

Edited by Benson
Link to comment

@Skyscraper

Herzlichen Glückwunsch :bye:

 

Ich muss jetzt auf eine Hochzeit, dann habe ich etwas Zeit und werde mir dein PlugIn sehr gerne näher angucken :bye:

Link to comment

Jup hab beruflich mit .NET / C# zu tun.

Ich habe noch nie C# programmiert, aber dieses von dir geführte Praxistutorial war eine gute erste Erfahrung für mich.  :(

Ausgezeichnet darum gings :bye:

 

Jetzt muß ich nur noch wieder an die Channeldaten kommen, um den Sendernamen und die ChannelID für TimerManager.AddItem() zu haben. Aber das bekomme wohl auch noch hin.

Das hast sicher schon in den Unterlagen zur COM gefunden

epgChanId = ITuner.SID + ITuner.TransportStreamID * 65536

und das löst man entweder Binär mit & (binäres und) und >> (verschiebt um die angegebenen Bits nach rechts) oder mit % (Modulo) und Division (bei int verschwinden magisch die nachkommastellen :bye: )

sind je 2 zeilen.

 

Dank SID kann man dann von der ChannelCollection mit GetChannelName(sid) den Namen des Chan rausbekommen.

 

Viel Spaß :bye:

Link to comment
Dank SID kann man dann von der ChannelCollection mit GetChannelName(sid) den Namen des Chan rausbekommen.

 

Kann mehrdeutig sein. Insbesondere wenn es mehrere SAT-Positionen in der Liste gibt, können verschiedene Sender die gleiche ServiceID haben. Manchmal auch innerhalb einer SAT-Position, obwohl das eigentlich nicht erlaubt ist. Auf Astra kommt das nicht vor, da herrscht Ordnung, aber z.B. bei Exoten mit Feeds...

 

Deshalb wurde die Transportstream-ID noch mit reingequetscht. Wenn möglich, sollte sie auch benutzt werden.

Link to comment

Das hängt vom Inhalt der Kanalliste und der Reihenfolge der Sender ab (welcher wird zuerst gefunden). Die Anwender haben verschiedene :bye: . Außerdem ist die Frage, wie chans.GetChannelname(sId) implementiert ist - müsste Lars was zu sagen. Ich weiß nicht, ob die Transportstream-ID im HiWord des übergebenen Wertes berücksichtigt wird.

Link to comment

Entschuldigt meine frage:

 

Wird es das tool auch mit einer option

zur automatischen programmierung der "aufnahmeliste"

geben ?

 

So daß der DVBViewer, wenn das epg was neues gefunden hat

(zum beispiel nach dem "abgrasen" aller epg-sender)

sich gleich selbst programmiert und aufnimmt ?

 

Wird es dann auch prioritäten geben und automatisches überschreiben älterer und unwichtigerer aufnahmen (so wie es im VDR möglich ist) ?

 

Oder ist das alles momentan noch nicht aktuell ?

 

One

Link to comment
Wird es das tool auch mit einer option

zur  automatischen programmierung der "aufnahmeliste"

geben ?

 

So daß der DVBViewer, wenn das epg was neues gefunden hat

(zum beispiel nach dem "abgrasen" aller epg-sender)

sich gleich selbst programmiert und aufnimmt ?

 

Wird es dann auch prioritäten geben und automatisches überschreiben älterer und unwichtigerer aufnahmen (so wie es im VDR möglich ist) ?

Macht das CommandLineTool schon, fragt nach ob das gefundene Element aufgenommen werden soll (im DVBViewer) oder wenn es sich mit einer Aufnahme überschneidet, wird in die Console geschrieben, wann die Aufnahme gewesen wäre.

 

Das mit dem überschreiben ist eine eigene Geschichte, da es Timers gibt die mehrmals laufen (z.B. Mo-Fr) die müsste man nachher wieder zurücksetzten.

Link to comment

@one:

 

ich habe da mal ein script geschrieben, dass ein Löschen von alten Aufnahmen bei ungenügendem Speicherplatz auslöst.

Da das ganze letztendlich nur von mir getestet wurde und doch etwas komplex ist, werde ich eine erste alpha demnächst hochladen. Die Möglichkeit zum Löschen nach Datum (heute+x) besteht auch, aber daran müsste noch gefeilt werden :bye:

 

gruß, admi-ral

Link to comment
Wird es das tool auch mit einer option

zur  automatischen programmierung der "aufnahmeliste"

geben ?

 

Ich habe ein solches Script mit VBScript angefangen, es ist aber noch nicht ganz fertig.

 

Das Ganze sollte dann folgendermaßen funktionieren:

 

- das AutoTimer Script wird als täglicher Systemtask eingebunden

- das EPGUpdate Script von mir läuft ebenfalls als täglicher Systemtask, idealerweise direkt vor dem AutoTimer Script

- das AutoTimer Script untersucht dann immer nur die nächsten 24 Stunden

- man kann eine Liste von Suchbegriffen vordefinieren

- die Timer, die aus den Fundergebnissen resultieren, werden automatisch übernommen

 

Es fehlt noch das Verhalten bei Überschneidungen. Richtig cool wäre es natürlich, wenn man hier die Suchbegriffe irgendwie gewichten könnte. So nach dem Motto: "Das ist mir wichtiger als das andere".

 

Da Justcute ja auch ein Beispiel eines C# Kommandozeilen Programms gepostet hat, überlege ich gerade, ob ich die Idee nicht nach C# portiere. VBScript gefällt mir nicht so gut, ich mag die Sprache einfach nicht.

Link to comment

oh um alte RECORDS und nicht Recordeinträge gings :bye:

 

Hab wieder n Stücken Code für euch, was die Files anfindet und aus dem Filenamen die Infos laut DVBViewer Settings ausließt.

TODOs beachten :bye:

public void FindFiles()
{
   string fileFormat = DVBViewer.GetSetupValue("General", "NameScheme", "%date_%time_%station_%event");
   string recordPath = DVBViewer.GetSetupValue("General", "CaptureDir", @"Capture\");
   
   Regex fileRegEx = new Regex(fileFormat.Replace("%date", datePattern).Replace("%time", timePattern)
                                         .Replace("%station", stationPattern).Replace("%event", eventPattern) + @"\..+");

   string[] files = Directory.GetFiles(recordPath);
   ArrayList recordedOn = new ArrayList();
   ArrayList recordedFile = new ArrayList();
   
   // Das Datum der Files auslesen
   for (int i = 0; i < files.Length; i++)
   {
       string file = files[i];
       Match m = fileRegEx.Match(file);
       if (m.Success)
       {
           // TODO: Wenn der Tag in diesem Jahr der Zukunft liegt, gehört das Vorjahr genommen - nun wird buggy ab Neujahr :)
           recordedOn.Add(new DateTime(DateTime.Now.Year, 
                                       int.Parse(m.Groups["month"].Captures[0].Value), 
                                       int.Parse(m.Groups["day"].Captures[0].Value),
                                       int.Parse(m.Groups["hour"].Captures[0].Value), 
                                       int.Parse(m.Groups["minute"].Captures[0].Value), 
                                       int.Parse(m.Groups["second"].Captures[0].Value)));
           recordedFile.Add(file);
       }
   }
   
   // TODO: Ältestes Datum suchen und entfernen
   // File.Delete(files[indexOfOldestFile]); <-- mit try-catch-Block

   IRecordManager recMgr = DVBViewer.RecordManager;
   for (int i = recMgr.Count - 1; i >= 0; i--)
   {
       if (!File.Exists(recMgr[i].Filename))
       {
           recMgr.DeleteEntry(recMgr[i].recID);
       }
   }

}

EDIT: Code Teil hinzugefügt was Lars angesprochen hat (im Post darunter).

Alle nicht mehr vorhandenen Recordings werden nun aus der Datenbank geworfen.

Edited by JustCute
Link to comment
Guest Lars_MQ

Das ist keine so schlaue idee, da es die datenbank nicht berücksichtigt.

Alle aufzeichnungen werden in die Datenbank eingetragen und können per IRecordManager und IRecording ausgelesen / gelöscht werden. Das zu umgehen führt zwar zu keinen problemen, macht aber die datenbanlk und damit die anzeige inkonsistent. Ich rate daher von sowas ab.

 

Abgesehn davon wird sich in naher zukunft das Handling der Recordings wahrscheinlich ändern (multiple aufnahmeverzeichnisse etc)

Link to comment
...

Sorry hab ich nicht. War noch mit Deinem ersten Wurf beschäftigt. Hast Du dies Fragment in Deine Sourcen integriert und läuftst?

...

Nein hab gedacht ich post nur mal so... :blink: SICHER FUNZT DER CODE!

 

O.K., die Frage war blöd formuliert. Mir gings um Folgendes: Die besagte Funktion versuche ich schon eine geraume Zeit unter C++ zu verwenden. Ohne Erfolg. Wie es prinzipiell geht, weiß ich, Ich hatte nun die Vermutung das Du auch nur die prinzipielle Verwendung unter C# skizziert hast. Das es - wenn es richtig verwendet wird - FUNZT, bezweifel ich nicht.

Super dass man bei Dir einen kleinen C# Exkurs bekommt. C# ist auch für mich nicht so geläufig. Wäre es Dir möglich zusätzlich zu Deiner inkrementellen Methode noch den jeweils zuammengefassten Komplettcode zu Posten (als zip). Wenn Du nicht alles public machen willst, mir wäre auch an einer abgespeckten Version in der aber die besagte GetAsArray-Funktion Anwendung findet gelegen. Ich hätte dann ein funktionierenden Referenz-Beispiel.

 

mfG erwin

Link to comment

Sodala damit hoffentlich alle deine Fragen geklärt sind, hier n Stückerl Code das dir helfen sollte.

Folgenden Code schmeißt einfach in die public static void Main Methode

DVBViewer DVBViewer = (DVBViewer)Marshal.GetActiveObject("DVBViewerServer.DVBViewer");
IEPGManager epgMgr = DVBViewer.EPGManager;
object temp;
int count = epgMgr.GetAsArray(0, 
                             DateTime.Now, DateTime.Now.AddDays(5),
                             out temp);
object[,] epgs = temp as object[,];
for (int i = 0; i < count; i++)
{
   int epgChanId = int.Parse(epgs[i,0].ToString());
   int eventId = int.Parse(epgs[i,1].ToString());
   DateTime start = DateTime.Parse(epgs[i,2].ToString());
   TimeSpan duration = DateTime.Parse(epgs[i,3].ToString()).TimeOfDay;
   string category = epgs[i,4].ToString();
   string title = epgs[i,5].ToString();
   string description = epgs[i,6].ToString();
   byte charSet = byte.Parse(epgs[i,7].ToString());
   byte content = byte.Parse(epgs[i,8].ToString());
   // TODO: Verarbeitung der Daten
}

Link to comment

@ JustCute

 

Danke. Hat mir wirklich geholfen. Debugger an, Memory gecheckt und dann fiehls mir wieder ein. Da war doch was mit Pascal/Delphi? Richtig, das Memory-Layout von 2D Arrays ist genau anders herum wie bei C/C++! Bingo!

 

Also an alle C++-Mitleser mit Problemen bei der Anwendung von GetAsArray()! Die normale C/C++-Indizierungsmethode könnt ihr hier NICHT verwenden. Selbstausrechnen der Offsets bei gegebenen Zeilen/Spalten ist angesagt (macht sonst der Compiler).

 

Kaum machts man richtig , schon läufts. Und das schön schnell!.

 

Übrigens JustCute hast Du mir richtig Geschmak auf C# gemacht. Sieht alles so elegant aus. Was Du mit einer Zeile umsetzt geriert, unter C++ zu 5 bis 10 Zeilen! Die ganze VARIANT und COM-Friemelei alles schön verpackt und transparent.

 

 

 

@ Lars

 

Den vermeintlichen von mir gemeldeten Bug weiter oben im Thread kannst Du vergessen. Sorry für die Fehlmeldung.

 

Aber eine neue Frage habe ich. Aus Deinem Code-Schnipsel ist ersichlich wie das Array kreirt wird. Frage: Wer ist eigentlich für die Freigabe der belegten Ressourcen verantwortlich. Ich nehme stark an der Caller! Und wenn das stimmt wie? Unter C gibts 'SafeArrayDestroy( )'. Aber ist das wirklich die zuständige Funktion für unter Delphi-kreeirter SAFEARRAY'S? Wäre wahrscheinlich sicherer Du bietest dafür eine zusätzliche Methode an der COM-Schnittstelle an.

 

mfG erwin

Link to comment
Übrigens JustCute hast Du mir richtig Geschmak auf C# gemacht. Sieht alles so elegant aus. Was Du mit einer Zeile umsetzt geriert, unter C++ zu 5 bis 10 Zeilen!  Die ganze VARIANT und COM-Friemelei alles schön verpackt und transparent.

jo imho beste spache ever :wub:

und beim 2er Framework sind dann auch endlich die "Kinderkrankheiten" beseitig :wacko: aber das dauert noch n bissi...

Link to comment

Das Kommandozeilenprogramm von JustCute, dessen Code er in Post #25 gepostet hat, enthält einen kleinen, aber entscheidenden Fehler.

 

Die Zeile

Regex.Match(patterns[k], epg.Title, RegexOptions.IgnoreCase).Success)

 

muss durch

Regex.Match(epg.Title, patterns[k], RegexOptions.IgnoreCase).Success)

 

ersetzt werden.

 

Trotzdem insgesamt sehr brauchbare Vorarbeit von JustCute. :)

Link to comment
  • 2 months later...

Also wenn ich den Thread nochmal wieder hervorkramen darf...

Ich hab jetzt wieder mehr Zeit (weniger Schule :idiot:) und werde jetzt wieder mit meinem EPG-Search weiterprogrammieren...

Ich weiß nicht ob Rayman es noch braucht (*hoff*) aber ich mach trozdem weiter....

Ich habe ja bereits Version 0.1.1.3 fertig... (Angefangen bei 0.1.1.1 ;))

Wer interesse an der 3. Version hat bitte per ICQ (220654215) oder PM melden...

 

MfG Sky

Link to comment
  • 4 months later...

Hallo COM'er :-)

 

ich habe diesen Thread hier letztes Jahr aufgemacht und über die Zeit haben sich hier viele nützliche Informationen zusammengefunden. Allerdings fand sich für meine ursprüngliche Vorstellung keine konkrete Lösung.

 

Da ich beruflich auch gerade mit COM zu tun hatte, musste der der DVBViewer als Trainingsobjekt herhalten ;-)

 

Daraus entstanden ist mein EPGplus-Plugin:

 

http://www.DVBViewer.com/forum/index.php?showtopic=11801

 

Geschrieben habe ich das Plugin komplett in C++ mit gcc (resp. mingw) und der Win32API.

Als GUI-Framework habe ich wxWidgets benutzt, welches ich wärmstens empfehlen kann, da es recht mächtig und sehr komfortabel zu programmieren ist.

 

Die ganze (Zitat erwin) VARIANT-Friemelei *gg* fand ich weniger problematisch als gedacht, da es sowohl in der Win32API und insbesondere in wxWidgets Helfer für das Handling gibt.

 

Vielleicht fühlt sich ja der ein oder andere (C/C++ er) beflügelt den DVBViewer mit weiteren Plugins auszustatten, so schwer ist das nicht und macht eigentlich ziemlich viel Spaß ;-)

 

Viele Grüße,

Stefan.

Link to comment
  • 11 months later...

Hallo,

echt cooler Code der hier gepostet wurde. Ich schreibe gearde ein Programm, welches die EPG Daten aus DVBViewer ausliesst und mir als xmltv Datei speichert. Ich habe unter anderem folgenden Code von hier verwendet. Natürlich habe ich ihn abgeändert. Gibt es hier auch die Möglichkeit die category auszulesen? Die IEPGCollection epgs hat leider keine Methode dafür.

 

Es gibt hier auch ein VBS update script für die EPG Daten. Hat jemand eine Ahnung wie man das in C# realisiert?

 

try

{

StreamReader sr = new StreamReader(path);

string[] patterns = sr.ReadToEnd().Split(new char[] { '\r', '\n' });

 

// Find Matches

for (int i = 0; i < chans.Count; i++)

{

IChannelItem chan = chans;

 

IEPGCollection epgs = epgMgr.Get(chan.Tuner.SID,

chan.Tuner.TransportStreamID,

from, to);

 

for (int j = 0; j < epgs.Count; j++)

{

IEPGItem epg = epgs[j];

 

for (int k = 0; k < patterns.Length; k++)

{

if (patterns[k].Length > 1 &&

Regex.Match(epg.Title, patterns[k], RegexOptions.IgnoreCase).Success)

{

if (FindTimerBetween(epg.Time, epg.EndTime) == -1)

{

Record(epg, chan);

}

else

{

Console.WriteLine("couldn't add -> Chan: '{0}' - Title: '{1}' - Date: '{2}' - Time: '{3}'",

chan.Name,

epg.Title,

epg.Time.ToString("dd.MM.yy"),

epg.Time.ToString("T"));

Console.WriteLine("\tAlready existing record entry");

}

}

}

}

}

}

catch (Exception ex)

{

Console.WriteLine(ex.StackTrace);

}

}

Edited by birder
Link to comment

Aus der COM Interface Doku zu entnehmen:

Interface IEPGItem
...
property Content: Integer; 
The Content (Genre) of the EPG. 
See DVBViewer language files section [Genre] for a list.

 

und Genre aus dem DVBViewer language files

[Genre]
100=Jazz
101=Musical/Oper
102=Ballett
112=Kunst/Kultur
113=Darstellende Kunst
114=Bildende Kunst
115=Religion
116=Volkstümliche/traditionelle Kultur
117=Literatur
118=Film/Kino
119=Experimenteller Film
120=Radio/Fernsehen/Presse
121=Neue Medien
122=Kunst-/Kulturmagazin
123=Mode
128=Soziale/politische/wirtschaftliche Themen
129=Magazin/Reportage/Dokumentation
130=Wirtschaftliche/soziale Beratung
131=Herausragende Persönlichkeiten
144=Bildung/Wissenschaft/Sachthemen
145=Natur/Tiere/Umwelt
146=Technik/Naturwissenschaften
147=Medizin/Psychologie
148=Ferne Länder/Expeditionen
149=Sozial-/Geisteswissenschaften
150=Weiterbildung
151=Sprachen
16=Spielfilm
160=Freizeit/Hobbies
161=Reisen/Tourismus
162=Handarbeit/Kunsthandwerk
163=Auto/Verkehr
164=Gesundheit und Fitness
165=Kochen
166=Werbung/Shopping
167=Garten
17=Krimi/Thriller
176=Originalsprache
177=Schwarz-weiß
178=Erstausstrahlung
179=Liveübertragung
18=Abenteuer/Western/Krieg
19=Science Fiction/Fantasy/Horror
20=Komödie
21=Serie
22=Liebesfilm
23=Ernster/klassischer/religiöser/historischer Film
24=Film für Erwachsene
32=Nachrichten/Aktuelles
33=Nachrichten/Wetter
34=Nachrichten-Magazin
35=Filmbericht/Dokumentarfilm
36=Diskussion/Interview
48=Show/Spielshow
49=Spielshow/Quiz
50=Varieté
51=Talkshow
64=Sport
65=Außerplanmäßige Sportveranstaltung
66=Sport-Magazin
67=Fußball
68=Tennis
69=Mannschaftssport
70=Leichtathletik
71=Motorsport
72=Wassersport
73=Wintersport
74=Reitsport
75=Kampfsport
80=Kinder-/Jugendprogramm
81=Vorschulprogramm
82=Unterhaltung für 6- bis 14-jährige
83=Unterhaltung für 10- bis 16-jährige
84=Lern-/Schulprogramm
85=Zeichentrick/Puppenspiel
96=Musik/Ballet/Tanz
97=Rock/Pop
98=Klassische Musik
99=Volksmusik

 

doku du lesen musst :bye:

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