Rayman Posted July 27, 2005 Share Posted July 27, 2005 Hallo DVBViewer-Team, ich fände die Möglichkeit das TV-Programm im EPG automatisch mit gespeicherten Bgriffen zu durchsuchen außerordentlich nützlich. Also eine Funktionalität wie man sie vom E-Mail-Erinnerungsservice bei einigen online TV-Zeitschriften kennt. Der Ablauf könnte in etwa folgender sein: - Es lassen sich beliebig viele Begriffe (mit oder ohne Angabe von Kategorie [serie, Film ...]) in eine Suchliste eintragen. - Der DVBViewer scannt von Zeit zu Zeit im Hintergrund das EPG und erinnert über anstehende Sendungen welche zum Suchbegriff passen. Die automatische Mitteilung dass neue Treffer vorliegen muss nicht unbedingt über ein "aufdringliches" Dialogfeld geschehen. Ich könnte mir dafür ein entspechend gekennzeichnetes (rot/blinkend grün) Icon in der Statuszeile oder eine kurzzeitige Texteinblendung am unteren Bildschirmrand via. OSD vorstellen :-) Stefan Quote Link to comment
Benson Posted July 27, 2005 Share Posted July 27, 2005 Das könnte man über die COM Schnittstelle mit der neuen DVBViewer Version auch relativ schnell selber basteln. Passende Code-Schnipsel zum Auslesen der EPG-Daten befinden sich schon im Scripting Bereich dieses Forums. Mit einem PHP Skript wäre auch der E-Mail-Erinnerungsservice kein Problem. :-) Quote Link to comment
Skyscraper Posted July 27, 2005 Share Posted July 27, 2005 (edited) Ne lass mal Ich habe bereits angefangen das als mein erstes Plugin zu basteln... Sage bescheid wenn ich fertig bin (Oder eine Beta fertig hab) MfG Skyscraper EDIT: Wenn ich das gut hinkriege gibs vllt. morgen Abend schon eine Beta Edited July 27, 2005 by Skyscraper Quote Link to comment
Rayman Posted July 28, 2005 Author Share Posted July 28, 2005 (edited) Wenn ich das gut hinkriege gibs vllt. morgen Abend schon eine Beta Großartig!! Bitte hier Bescheid geben, ich bin gerne zu einem umfangreichen Betatest bereit :-) Gruß, Stefan (wünschte hätte mehr Energie/Zeit in der Freizeit noch was zu programmieren ...) Edited July 28, 2005 by Rayman Quote Link to comment
Skyscraper Posted July 28, 2005 Share Posted July 28, 2005 (edited) Grunddesign ist schonmal fertig! Ich versuche es bis heute abend aber das ist da ich das mit einigen Features gestalte sehr aufwendig.... DVBViewer-Plugins ->EPG-Search MfG Skyscraper EDIT: @Rayman: Hast du ICQ? Für Sonderfeatures Edited July 28, 2005 by Skyscraper Quote Link to comment
Rayman Posted July 28, 2005 Author Share Posted July 28, 2005 Grunddesign ist schonmal fertig! Na das sieht schon sehr vielversprechend aus. Allerdings würde ich für den Suchbegriff keine Unterteilung in Sendung/Titel/Beschreibung vornehmen. Der Suchbegriff sollte als Volltextsuche in allen Teilen des EPG gesucht werden, oder? @Rayman: Hast du ICQ? Für Sonderfeatures ICQ-Nr. ist als PM an Dich raus Stefan. Quote Link to comment
Guest Lars_MQ Posted July 28, 2005 Share Posted July 28, 2005 Der Suchbegriff sollte als Volltextsuche in allen Teilen des EPG gesucht werden, oder? Das würde ich zusätzlich einbauen. Es mach schon sinn nur in bestimmten bereichen zu suchen Quote Link to comment
Skyscraper Posted July 28, 2005 Share Posted July 28, 2005 Neue Screens unter DVBViewer-Plugins MfG Skyscraper PS: Bin jetzt gleich ersmal weg bis nacher! Quote Link to comment
yaRincewind Posted July 28, 2005 Share Posted July 28, 2005 Wow. Das sieht ja schon richtig gut aus Wird die Eingabe auch per OSD möglich sein? Quote Link to comment
Skyscraper Posted July 28, 2005 Share Posted July 28, 2005 (edited) Das wird nix mehr mit einer Beta heute Abend! Der Code ist OK aber jetzt kommt das entbuggen Atm hab ich leider noch nicht einmal sauber etwas ausgelesen weil ich Minutenlang 100% CPU-Last hatte Muss ich morgen mit Lars guckn! MfG Skyscraper PS: Ich werd voll verückt hier !!! Ich könnt das Programm EDIT: Ich geh jetzt schlafen . Morgen werden wir dann sehen... Edited July 28, 2005 by Skyscraper Quote Link to comment
Skyscraper Posted July 29, 2005 Share Posted July 29, 2005 (edited) Die Beta der Beta ist fertig! Rayman hat sie zum testen bekommen! MfG Skyscraper Edit: Bereits bei Version 0.1.1.2 Edited July 29, 2005 by Skyscraper Quote Link to comment
JustCute Posted August 2, 2005 Share Posted August 2, 2005 (edited) hab auch schnell so n teil zusammengeschustert in c# Durchsucht das gesamte EPG nach einem Titel, der der Suchanfrage entspricht Zur Suche werden RegEx verwendet, und ist NICHT Casesensitiv. using System; using System.Collections; using System.Drawing; using System.Text.RegularExpressions; using System.Threading; using System.Windows.Forms; using DVBViewerServer; namespace MKW.Tools { /// <summary> /// Description of EpgCrawler. /// </summary> public class EpgCrawler : System.Windows.Forms.Form { private System.Windows.Forms.ListView lv; private System.Windows.Forms.ColumnHeader chName; private System.Windows.Forms.TextBox txtSearch; private System.Windows.Forms.ProgressBar progressBar; private System.Windows.Forms.Button btnAbort; private System.Windows.Forms.ColumnHeader chChannel; private System.Windows.Forms.ColumnHeader chDateFrom; private System.Windows.Forms.Button btnSearch; private System.Windows.Forms.ColumnHeader chTo; #region Datafields private Thread thread; private DateTime from; private DateTime to; private IDVBViewer DVBViewer; #endregion #region Constructor public EpgCrawler() { // // The InitializeComponent() call is required for Windows Forms designer support. // InitializeComponent(); from = new DateTime(1,1,1); to = new DateTime(4000,12,31); } #endregion [STAThread] public static void Main(string[] args) { Application.Run(new EpgCrawler()); } #region Windows Forms Designer generated code /// <summary> /// This method is required for Windows Forms designer support. /// Do not change the method contents inside the source code editor. The Forms designer might /// not be able to load this method if it was changed manually. /// </summary> private void InitializeComponent() { this.chTo = new System.Windows.Forms.ColumnHeader(); this.btnSearch = new System.Windows.Forms.Button(); this.chDateFrom = new System.Windows.Forms.ColumnHeader(); this.chChannel = new System.Windows.Forms.ColumnHeader(); this.btnAbort = new System.Windows.Forms.Button(); this.progressBar = new System.Windows.Forms.ProgressBar(); this.txtSearch = new System.Windows.Forms.TextBox(); this.chName = new System.Windows.Forms.ColumnHeader(); this.lv = new System.Windows.Forms.ListView(); this.SuspendLayout(); // // chTo // this.chTo.Text = "To"; this.chTo.Width = 52; // // btnSearch // this.btnSearch.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnSearch.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnSearch.Location = new System.Drawing.Point(504, 8); this.btnSearch.Name = "btnSearch"; this.btnSearch.Size = new System.Drawing.Size(88, 21); this.btnSearch.TabIndex = 1; this.btnSearch.Text = "Search"; this.btnSearch.Click += new System.EventHandler(this.BtnSearchClick); // // chDateFrom // this.chDateFrom.Text = "Date From"; this.chDateFrom.Width = 85; // // chChannel // this.chChannel.Text = "Channel"; this.chChannel.Width = 96; // // btnAbort // this.btnAbort.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnAbort.Enabled = false; this.btnAbort.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnAbort.Location = new System.Drawing.Point(544, 384); this.btnAbort.Name = "btnAbort"; this.btnAbort.Size = new System.Drawing.Size(48, 20); this.btnAbort.TabIndex = 5; this.btnAbort.Text = "Abort"; this.btnAbort.Click += new System.EventHandler(this.BtnAbort_Click); // // progressBar // this.progressBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.progressBar.Location = new System.Drawing.Point(8, 384); this.progressBar.Name = "progressBar"; this.progressBar.Size = new System.Drawing.Size(528, 20); this.progressBar.Step = 1; this.progressBar.TabIndex = 4; // // txtSearch // this.txtSearch.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.txtSearch.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.txtSearch.Location = new System.Drawing.Point(8, 8); this.txtSearch.Name = "txtSearch"; this.txtSearch.Size = new System.Drawing.Size(488, 20); this.txtSearch.TabIndex = 0; this.txtSearch.Text = ""; // // chName // this.chName.Text = "Name"; this.chName.Width = 321; // // lv // this.lv.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lv.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.lv.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.chChannel, this.chDateFrom, this.chTo, this.chName}); this.lv.FullRowSelect = true; this.lv.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; this.lv.HideSelection = false; this.lv.Location = new System.Drawing.Point(8, 40); this.lv.Name = "lv"; this.lv.Size = new System.Drawing.Size(584, 336); this.lv.TabIndex = 7; this.lv.View = System.Windows.Forms.View.Details; // // EpgCrawler // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(600, 413); this.Controls.Add(this.lv); this.Controls.Add(this.progressBar); this.Controls.Add(this.txtSearch); this.Controls.Add(this.btnSearch); this.Controls.Add(this.btnAbort); this.Name = "EpgCrawler"; this.Text = "EpgCrawler"; this.ResumeLayout(false); } #endregion #region Eventhandling private void BtnSearchClick(object sender, System.EventArgs e) { if (DVBViewer == null) { try { DVBViewer = new DVBViewerClass(); } catch (Exception ex) { MessageBox.Show(ex.Message + "\n" + ex.StackTrace); } } // Checks if (txtSearch.Text.Length < 5) { MessageBox.Show("You must enter at least 5 chars"); } else { thread = new Thread(new ThreadStart(Search)); thread.Start(); btnAbort.Enabled = true; btnSearch.Enabled = false; txtSearch.Enabled = false; } } private void BtnAbort_Click(object sender, System.EventArgs e) { if (thread != null) { try { thread.Abort(); btnAbort.Enabled = false; btnSearch.Enabled = true; txtSearch.Enabled = true; } catch (Exception ex) { MessageBox.Show(ex.StackTrace); } } } #endregion #region Methods private void Search() { // Init IChannelCollection chans = DVBViewer.ChannelManager; IEPGManager epgMgr = DVBViewer.EPGManager; Regex rX; try { rX = new Regex(txtSearch.Text, RegexOptions.IgnoreCase); } catch (Exception ex) { MessageBox.Show(ex.StackTrace); return; } lv.Items.Clear(); // Find Matches for (int i = 0; i < chans.Count; i++) { IChannelItem chan = chans[i]; IEPGCollection epgs = epgMgr.Get(chan.Tuner.SID, chan.Tuner.TransportStreamID, from, to); for (int j = 0; j < epgs.Count; j++) { IEPGItem epg = epgs[j]; if (rX.Match(epg.Title).Success) { ListViewItem lbi = new ListViewItem(chan.Name); lbi.SubItems.Add(epg.Time.ToString("dd.MM ") + epg.Time.ToString("t")); lbi.SubItems.Add(epg.EndTime.ToString("t")); lbi.SubItems.Add(epg.Title); lbi.Tag = epg.Description; lv.Items.Add(lbi); } } this.progressBar.Value = (int)((float)i/(float)chans.Count * 100F); } btnAbort.Enabled = false; txtSearch.Enabled = true; btnSearch.Enabled = true; } #endregion } } kann man über COM neue Record Items hinzufügen? Wenn ja wie Edited August 2, 2005 by JustCute Quote Link to comment
Benson Posted August 3, 2005 Share Posted August 3, 2005 (edited) Das sieht interessant aus. Bloß, gibt es einen frei verfügbaren C# Compiler, mit dem ich das kompilieren kann? Wieso sind die Suchbegriffe auf mindestens 5 Zeichen beschränkt? Hat das einen besonderen Grund? Mir fallen spontan mehrere Sachen ein, die 3 oder 4 Zeichen hätten... Edited August 3, 2005 by Benson Quote Link to comment
Guest Lars_MQ Posted August 3, 2005 Share Posted August 3, 2005 kann man über COM neue Record Items hinzufügen?Wenn ja wie Ja kann man, schau dir einfach mal hier in das script. Dort sieht man auch wie man die timer abfragt, um nix doppelt einzutragen. Gut wäre, wenn du dir über die funktion zum lesen der setup.xml (ist im IDVBViewer) die EPG vor und nachlaufzeiten ziehts und sie gleich zu den zeiten hinzurechnest, da die timer so wie sie sind geschrieben werden und der vor/nachlauf nicht berücksichtigt wird (das wäre zu unflexibel). Quote Link to comment
JustCute Posted August 3, 2005 Share Posted August 3, 2005 Das sieht interessant aus. Bloß, gibt es einen frei verfügbaren C# Compiler, mit dem ich das kompilieren kann? Wieso sind die Suchbegriffe auf mindestens 5 Zeichen beschränkt? Hat das einen besonderen Grund? Mir fallen spontan mehrere Sachen ein, die 3 oder 4 Zeichen hätten... <{POST_SNAPBACK}> Microsoft® .NET Framework SDK Version 1.1 ~100MB evtl. noch SharpDevelop als IDE und nein, hat keinen grund. nur länger als 0 sollte die eingabe schon sein @Lars Danke! Quote Link to comment
Skyscraper Posted August 3, 2005 Share Posted August 3, 2005 (edited) Das versteht ich jetzt nicht?!? Ich bin doch schon dabei das zu proggn! MfG Skyscraper EDIT: @Rayman: Bugs kannst du jetzt über die Page melden (Da wo auch die Screens sind [LINK OBEN] - Danke.) Edited August 3, 2005 by Skyscraper Quote Link to comment
JustCute Posted August 3, 2005 Share Posted August 3, 2005 deswegen poste ich auch nur Code, vielleicht is was brauchbares für dich dabei. Ich brauch ohnehin was eigenes zurück zum Code wir ersetzen: lbi.Tag = epg.Description; durch lbi.Tag = new ExactEpgData(epg, chan); fügen den folgenden Code hinzu: private class ExactEpgData { private IEPGItem epgValue; private IChannelItem chanValue; public ExactEpgData(IEPGItem epg, IChannelItem chan) { this.epgValue = epg; this.chanValue = chan; } public IEPGItem Epg { get { return epgValue; } } public IChannelItem Chan { get { return chanValue; } } } private void Record(ListViewItem lvi) { // Extract Information from ListViewItem ExactEpgData data = (ExactEpgData)lvi.Tag; ITimerCollection timers = DVBViewer.TimerManager; int epgBefore = int.Parse(DVBViewer.GetSetupValue("General", "EPGBefore", "5")); int epgAfter = int.Parse(DVBViewer.GetSetupValue("General", "EPGAfter", "5")); int recAction = int.Parse(DVBViewer.GetSetupValue("General", "DefRecAction", "0")); int afterRecord = int.Parse(DVBViewer.GetSetupValue("General", "DefAfterRecord", "4")); bool disableAV = DVBViewer.GetSetupValue("General", "DefRecAVDisabled", "0") == "0" ? false : true; if (DVBViewer.OSD.ShowYesNo("Record this?", string.Format("Title: {0}", data.Epg.Title), "Date: " + data.Epg.Time.ToString("dd.MM.yy hh:mm"), "", true)) { try { timers.AddItem(data.Chan.Name, data.Epg.Time.Date, data.Epg.Time.AddMinutes(-epgBefore), data.Epg.EndTime.AddMinutes(epgAfter), data.Epg.Title, disableAV, true, recAction, afterRecord, "-------"); } catch { MessageBox.Show("Couldn't create timer :("); } } } und bauen uns einen Button ein der Record(lv.SelectedItems[0]); aufruft Quote Link to comment
Skyscraper Posted August 4, 2005 Share Posted August 4, 2005 (edited) Ähm Für mich ist da nix brauchbares bei - Ich schreibe in Delphi! MfG Skyscraper PS:Komme aber atm trozdem nit weiter! EDIT: Atm bin ich leider auch blockiert weiter zu proggn - Mein Delphi musste ich wegn aufnahmen für meinen Vater auf meine Auslagerplatte verschieben Edited August 4, 2005 by Skyscraper Quote Link to comment
Benson Posted August 4, 2005 Share Posted August 4, 2005 Hat jemand schon Erfahrungen mit JustCutes Code gesammelt? Bei mir läuft es jetzt soweit, allerdings habe ich hier ein etwas merkwürdiges Verhalten. Wenn die Applikation die COM Verbindung herstellen will, taucht im DVBViewer eine Messagebox auf mit "Kann Video nicht rendern...". Diese Messagebox muß man erst mit OK bestätigen, vorher klappt es nicht mit dem Suchen. Bei meinen anderen Skripten (PHP, VBS) interagieren die Skripte ohne Fehlermeldung mit dem DVBViewer. Quote Link to comment
JustCute Posted August 4, 2005 Share Posted August 4, 2005 Hat jemand schon Erfahrungen mit JustCutes Code gesammelt? Bei mir läuft es jetzt soweit, allerdings habe ich hier ein etwas merkwürdiges Verhalten. Wenn die Applikation die COM Verbindung herstellen will, taucht im DVBViewer eine Messagebox auf mit "Kann Video nicht rendern...". Diese Messagebox muß man erst mit OK bestätigen, vorher klappt es nicht mit dem Suchen. Bei meinen anderen Skripten (PHP, VBS) interagieren die Skripte ohne Fehlermeldung mit dem DVBViewer. <{POST_SNAPBACK}> Ja den Fehler hab ich auch. Das die Suche steht ist normal beim OSD, sprich wenn du eine Nachricht 10 sec lang anzeigst, steht die App 10 sec lang. Quote Link to comment
Rayman Posted August 4, 2005 Author Share Posted August 4, 2005 Lässt sich die 'JustCute-Version' bereits compiliert und ausführbar hier her stellen? Oder geht das aus irgendwelchen rechtlichen Dingen nicht? Würde mich freuen, wenn ich das Programm einmal testen könnte; Leider habe ich momentan nicht genügend Zeit, um mich jetzt mit all den C# Compilerdingen rumzuschlagen Stefan Quote Link to comment
Guest Lars_MQ Posted August 4, 2005 Share Posted August 4, 2005 Wenn die Applikation die COM Verbindung herstellen will, taucht im DVBViewer eine Messagebox auf mit "Kann Video nicht rendern...". Diese Messagebox muß man erst mit OK bestätigen, vorher klappt es nicht mit dem Suchen. Bei meinen anderen Skripten (PHP, VBS) interagieren die Skripte ohne Fehlermeldung mit dem DVBViewer. Das liegt daran das JustCute ein CreateObject anstatt eines getactiveobject macht. Leider weiss ich nicht wie das in c# lauten muss. Wie ich auch schon in der Hilfe geschrieben habe, sollte man sich nur mit einer laufenden Instanz des DVBViewer verbinden (er trägt sich ähnlich wie MS-Word in den ROT ein). Das starten per COM macht noch probleme, wie ihr bemerkt habt, christian und ich arbeiten daran, es in den Griff zu bekommen. Quote Link to comment
Guest Lars_MQ Posted August 4, 2005 Share Posted August 4, 2005 Das die Suche steht ist normal beim OSD, sprich wenn du eine Nachricht 10 sec lang anzeigst, steht die App 10 sec lang. Zumindest showinfoinTVPic ist non blocking. Alle dialogboxen sind von natur aus blocking (wait for buttonpress), da sie werte zurückliefen. Man könnte sie auch OSD-Modal nennen [edit]Da dieser Thread doch sehr ans eingemachte geht, hab ich ihn in den COM bereich geschoben, da ist er besser aufgehoben [/edit] Quote Link to comment
JustCute Posted August 4, 2005 Share Posted August 4, 2005 (edited) Lässt sich die 'JustCute-Version' bereits compiliert und ausführbar hier her stellen? Oder geht das aus irgendwelchen rechtlichen Dingen nicht? Würde mich freuen, wenn ich das Programm einmal testen könnte; Leider habe ich momentan nicht genügend Zeit, um mich jetzt mit all den C# Compilerdingen rumzuschlagen <{POST_SNAPBACK}> Rechtlich gibts afaik keine Probleme, hab aber einfach keinen Bock Support zu leisten, deswegen gibts nur Code, den kannst selbst bearbeiten zum compilen: Das ist meine Build.bat @echo off echo --[ Make InterOp Libary ]-- C:\Programme\Microsoft.NET\SDK\v1.1\Bin\TlbImp.exe C:\Programme\DVBViewer3-2-1\DVBViewer.exe /verbose /out:Interop.DVBViewer.dll echo. echo --[ Compile ]-- c:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\csc.exe /target:winexe /reference:Interop.DVBViewer.dll *.cs um GetActiveObject auszuführen, fügen wir im Code bei den usings using System.Runtime.InteropServices; ein. Dann ersetzen wir den try-catch-Block der Initialisierung mit try { DVBViewer = (DVBViewer)Marshal.GetActiveObject("DVBViewerServer.DVBViewer"); } catch { try { DVBViewer = new DVBViewerClass(); } catch (Exception ex) { MessageBox.Show(ex.StackTrace); } } d.h. wenn DVBViewer läuft wird er verwendet, ansonsten wird er gestartet. Damit ist die Basis für den EPG Crawler FAST fertig. Die Timerüberprüfung fehlt noch. Edited August 4, 2005 by JustCute Quote Link to comment
JustCute Posted August 4, 2005 Share Posted August 4, 2005 (edited) Sodala, nun das ganze als CommandLine Tool. Als Parameter MUSS ein Textfile angegeben werden, welches die Pattern enthält, wie z.B. BB|[^B]{2} Jede Pattern einfach in eine Zeile. CS-File using System; using System.Collections; using System.IO; using System.Runtime.InteropServices; using System.Text.RegularExpressions; using Interop.DVBViewer; namespace MKW.Tools { public class PlanRecs : System.Windows.Forms.Form { private static bool gotObject; private static DVBViewer DVBViewer; [STAThread] public static void Main(string[] args) { if (args.Length != 0) { try { PlanRecs.InitDvbViewer(); PlanRecs.Search(args[0]); PlanRecs.ReleaseDVBViewer(); } catch (Exception ex) { Console.WriteLine(ex.StackTrace); } } else { Console.WriteLine("USAGE: PlanRecs <PathOfFileWithPatterns>"); } } #region Methods private static void InitDvbViewer() { try { DVBViewer = (DVBViewer)Marshal.GetActiveObject("DVBViewerServer.DVBViewer"); gotObject = true; } catch { DVBViewer = new DVBViewerClass(); gotObject = false; } } private static void Search(string path) { // Init IChannelCollection chans = DVBViewer.ChannelManager; IEPGManager epgMgr = DVBViewer.EPGManager; DateTime from = new DateTime(1,1,1); DateTime to = new DateTime(4000,12,31); 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[i]; 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); } } private static void Record(IEPGItem epg, IChannelItem chan) { // Get the Timers ITimerCollection timers = DVBViewer.TimerManager; // get the infos from setut.xml int epgBefore = int.Parse(DVBViewer.GetSetupValue("General", "EPGBefore", "5")); int epgAfter = int.Parse(DVBViewer.GetSetupValue("General", "EPGAfter", "5")); int recAction = int.Parse(DVBViewer.GetSetupValue("General", "DefRecAction", "0")); int afterRecord = int.Parse(DVBViewer.GetSetupValue("General", "DefAfterRecord", "4")); bool disableAV = DVBViewer.GetSetupValue("General", "DefRecAVDisabled", "0") == "0" ? false : true; if (DVBViewer.OSD.ShowYesNo("Record this?", string.Format("Title: {0}", epg.Title), "Date: " + epg.Time.ToString("dd.MM.yy hh:mm"), "", true)) { try { timers.AddItem(chan.Name, epg.Time.Date, epg.Time.AddMinutes(-epgBefore), epg.EndTime.AddMinutes(epgAfter), epg.Title, disableAV, true, recAction, afterRecord, "-------"); } catch { Console.WriteLine("Couldn't create timer :("); } } } private static int FindTimerBetween(DateTime start, DateTime end) { ITimerCollection timers = DVBViewer.TimerManager; for (int i = 0; i < timers.Count; i++) { ITimerItem timer = timers[i]; DateTime timerStart = new DateTime(timer.Date.Year, timer.Date.Month, timer.Date.Day, timer.StartTime.Hour, timer.StartTime.Minute, timer.StartTime.Second); DateTime timerEnd = new DateTime(timer.Date.Year, timer.Date.Month, timer.EndTime > timer.StartTime ? timer.Date.Day : timer.Date.AddDays(1).Day , timer.EndTime.Hour, timer.EndTime.Minute, timer.EndTime.Second); if ((start > timerStart && start < timerEnd) || (end > timerStart && end < timerEnd) || (start <= timerStart && end >= timerEnd)) { return i; } } return -1; } private static void ReleaseDVBViewer() { if (gotObject) { Marshal.ReleaseComObject(DVBViewer); } } #endregion } } Build Batchfile @echo off echo --[ Make InterOp Libary ]-- C:\Programme\Microsoft.NET\SDK\v1.1\Bin\TlbImp.exe C:\Programme\DVBViewer3-2-1\DVBViewer.exe /verbose /out:Interop.DVBViewer.dll echo. echo --[ Compile ]-- c:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\csc.exe /debug /target:exe /reference:Interop.DVBViewer.dll *.cs if errorlevel == 1 goto end echo. PlanRecs patterns.txt :end Edit: Regex.Match ausgebessert. <{POST_SNAPBACK}> Edited August 10, 2005 by JustCute Quote Link to comment
Benson Posted August 4, 2005 Share Posted August 4, 2005 Kleine Ergänzungen von mir: DateTime from = new DateTime(1,1,1); DateTime to = new DateTime(4000,12,31); lieber ersetzen durch DateTime from = new DateTime(); from = DateTime.Now; DateTime to = new DateTime(); to = from.AddDays(+5); Ansonsten umfasst die Suche auch Ergebnisse, die in der Vergangenheit liegen könnten. Und statt EPGManager.Get() würde sich EPGManager.GetAsArray() anbieten, da wir ja sowieso alle Daten haben wollen und die 2. Funktion perfomancemäßig wesentlich besser ist. Das habe ich in meinem Code allerdings noch nicht zum Laufen bekommen, kritisch ist da das zurückgelieferte SafeArray... Quote Link to comment
JustCute Posted August 5, 2005 Share Posted August 5, 2005 (edited) Kleine Ergänzungen von mir: DateTime from = new DateTime(1,1,1); DateTime to = new DateTime(4000,12,31); lieber ersetzen durch DateTime from = new DateTime(); from = DateTime.Now; DateTime to = new DateTime(); to = from.AddDays(+5); Ansonsten umfasst die Suche auch Ergebnisse, die in der Vergangenheit liegen könnten. Und statt EPGManager.Get() würde sich EPGManager.GetAsArray() anbieten, da wir ja sowieso alle Daten haben wollen und die 2. Funktion perfomancemäßig wesentlich besser ist. Das habe ich in meinem Code allerdings noch nicht zum Laufen bekommen, kritisch ist da das zurückgelieferte SafeArray... <{POST_SNAPBACK}> Versuchs mal mit object temp; epgMgr.GetAsArray(0, from, to, out temp); object[,] epgs = temp as object[,]; und DateTime from = DateTime.Now; DateTime to = from.AddDays(+5); einmal zuweisen reicht Edited August 5, 2005 by JustCute Quote Link to comment
Skyscraper Posted August 5, 2005 Share Posted August 5, 2005 Jetzt habt ihr den Thread auch noch gemoved?!?!? Und wenn ihr hier soviel Code zum selberbasteln habt , warum soll ich dann meins noch weitermachen Skyscraper Quote Link to comment
erwin Posted August 5, 2005 Share Posted August 5, 2005 Und statt EPGManager.Get() würde sich EPGManager.GetAsArray() anbieten, da wir ja sowieso alle Daten haben wollen und die 2. Funktion perfomancemäßig wesentlich besser ist. Das habe ich in meinem Code allerdings noch nicht zum Laufen bekommen, kritisch ist da das zurückgelieferte SafeArray... <{POST_SNAPBACK}> Kann ich mich nur anschließen: Auch ich erwarte dadurch eine _wesentlich_ gesteigerte Performance. Habe aber wirklich genau die gleichen Probleme: Mit SafeArrayCreate( VT_RECORD ... bekomme ich E_OUTOFMEMORY! Vielleicht hilft das weiter: "BUG: COM Interop: No Built-in Support VARIANT of Type VT_RECORD" http://support.microsoft.com/?kbid=309329 Oder aber wir beide machen etwas grundsätzlich falsch? Vielleicht kann Lars mit einem Code-Schnipsel aushelfen? mfg erwin Quote Link to comment
Guest Lars_MQ Posted August 5, 2005 Share Posted August 5, 2005 Oder aber wir beide machen etwas grundsätzlich falsch? Vielleicht kann Lars mit einem Code-Schnipsel aushelfen? Würde ich ja gerne aber c# hab ich keinen schimmer von. Die Funktionen laufen sowohl unter VB, VBscript und Delphi insofern bin ich mir sicher, das es einen erlaubte COM type zurückliefert. Es wird ein Variant der ein zweidimensionenales safearray of Variant enthält zurückgegeben. Quote Link to comment
erwin Posted August 5, 2005 Share Posted August 5, 2005 Hat jemand schon Erfahrungen mit JustCutes Code gesammelt? Bei mir läuft es jetzt soweit, allerdings habe ich hier ein etwas merkwürdiges Verhalten. Wenn die Applikation die COM Verbindung herstellen will, taucht im DVBViewer eine Messagebox auf mit "Kann Video nicht rendern...". <{POST_SNAPBACK}> Ja habe ich. Zunächst zum angesprochenen Problem. Vielleicht hilft's den Bug-Suchern weiter: Wenn ich dies auf einem PC _ohne_ SkyStar2-Unterstützung (aber mir reinkopierter EPG.DAT) laufen lasse, kommt diese Meldung nicht! Es bleibt dann beim Begrüßungs-Progress stehen und die Suche beginnt. Nun meine Erfahrung mit dem Ding selbst. Gaaaaaaaaanz langsam! über 6-einhalb Minuten. Ist das Normal? @ JustCute. Versuch mal folgendes: Laß die äußere for-Schleife über alle Kanäle weg und rufe Get () mit SID = 0 und TID = 0 auf. Ergibt auch alle Kanäle aber eine Schleife weniger, was bewirkt das epgMgr.Get() nur noch einmal anstatt über 1000-mal aufgerufen wird. Bei mir war die Suche dann nur noch etwa 30 Sek. lang, Schöner Unterschied. 6 Minuten und 30 Sek.. Generell liegt das Problem daran das die COM-Aufrufe furchtbar langsam sind. Also immer so wenig wie möglich (über die Laufzeit-Eentwicklung betrachtet). Hier hat übrigens C# wegen seiner Eleganz ein Problem 'epg.Title' ist ein solcher COM-Aufruf auch wenn mans nicht auf den ersten Blick sieht. Dasselbe müßtes Du mal in C++ sehen! Also sei gewappnet wenn Du die Suche z.B auch auf epg.Description u.s.w ausdehnst. Alles COM! Übrigens ist mein Ansatz etwas anders. Erst alles Auslagern z.B. in Datei und dann in dieser suchen, sonst hast Du bei jedem Suchlauf extra diesen COM-Ballast.! Auch sollte nach Doku-Lage epgMgr.GetAsArray() besonders geignet sein. Bekomms aber nicht zum Laufen. (unter C++). Vielleicht Du? mfg erwin Quote Link to comment
erwin Posted August 5, 2005 Share Posted August 5, 2005 (edited) Oder aber wir beide machen etwas grundsätzlich falsch? Vielleicht kann Lars mit einem Code-Schnipsel aushelfen? Würde ich ja gerne aber c# hab ich keinen schimmer von. Die Funktionen laufen sowohl unter VB, VBscript und Delphi .... <{POST_SNAPBACK}> Kann auch in diesen Sprachen sein. Ich weiß nämlich nicht ob meine Aufruf-Sequenz (unter C++ übrigens) generell richtig ist. Z.B. muß ich das Array vorher kreieren und wenn ja, dann wie? mfg erwin EDIT: Es wird ein Variant der ein zweidimensionenales safearray of Variant enthält zurückgegeben. <{POST_SNAPBACK}> Heißt dies dass alle Elemente VARIANT's sind? Also z.B. List[i,5] := Title; // String ist ein VARIANT vom Type VT_BSTR oder ist ein Originäres BSTR? Edited August 5, 2005 by erwin Quote Link to comment
JustCute Posted August 5, 2005 Share Posted August 5, 2005 (edited) @erwin hast du ... object temp; epgMgr.GetAsArray(0, from, to, out temp); object[,] epgs = temp as object[,]; ... gesehen? evtl auch http://www.delphibasics.co.uk/RTL.asp?Name=Variant Edited August 5, 2005 by JustCute Quote Link to comment
Guest Lars_MQ Posted August 5, 2005 Share Posted August 5, 2005 Ok, also so sieht die Routine auf seiten des DVBViewer aus (gekürzt) function TEPGManager.GetAsArray(ChannelID: Integer; StartTime: TDateTime; EndTime: TDateTime; out List: OleVariant): Integer; var i: Integer; aClass: TEPGClass; alist: Tlist; begin [....] // setup the bounds of the result List. List := VarArrayCreate([0, aList.Count - 1, 0, 8], varVariant); for i := 0 to aList.Count - 1 do //iterate over all search result elements in helper list begin aClass := TEPGClass(aList[i]); //typecast to the correct class List[i, 0] := aClass.EPGChannelID; //all elements are Variant, conversion not needed. List[i, 1] := aClass.EventID; List[i, 2] := aClass.Time; List[i, 3] := aClass.Duration; List[i, 4] := aClass.Event; List[i, 5] := aClass.Title; List[i, 6] := aClass.Description; List[i, 7] := aClass.CharSet; List[i, 8] := aClass.Content; end; [..] das lesen so einer Liste in Delphi (per COM!), wieder auf das wesentliche gekürzt. var i, u: Integer; epgarr: Olevariant; begin if DVBViewer <> nil then begin u := DVBViewer.EPGManager.GetAsArray(strtoint(channellist[sel].ID2), now, 0, epgarr); for i := 0 to u - 1 do memo.lines.add(inttostr(epgarr[i, 0]) + ' - ' + epgarr[i, 5]) end; end; In VBScript ist eh alles Variant, dort wird direkt per epgarr(xx,yy) zugegriffen und VBScript wandelt das um. Quote Link to comment
erwin Posted August 5, 2005 Share Posted August 5, 2005 Jetzt habt ihr den Thread auch noch gemoved?!?!?Und wenn ihr hier soviel Code zum selberbasteln habt , warum soll ich dann meins noch weitermachen Skyscraper <{POST_SNAPBACK}> Vielleicht weil Deins besser wird? Wer weiß das? Verärgert? Die Postings hier in den falschen Rachen gekriegt? Also ich zumindest warte weiter auf Deine Lösung. Und mehrere Lösungsansätze befruchten sich meist gegenseitig. mfG und ein Weiter-machen! erwin Quote Link to comment
erwin Posted August 5, 2005 Share Posted August 5, 2005 Ok, also so sieht die Routine auf seiten des DVBViewer aus (gekürzt) ... In VBScript ist eh alles Variant, dort wird direkt per epgarr(xx,yy) zugegriffen und VBScript wandelt das um. <{POST_SNAPBACK}> Na das ist doch erstmal was! Und das so prompt . Wenn das mal kein Support ist! Danke und mfG erwin Quote Link to comment
erwin Posted August 5, 2005 Share Posted August 5, 2005 @erwinhast du ... object temp; epgMgr.GetAsArray(0, from, to, out temp); object[,] epgs = temp as object[,]; ... gesehen? evtl auch http://www.delphibasics.co.uk/RTL.asp?Name=Variant <{POST_SNAPBACK}> Sorry hab ich nicht. War noch mit Deinem ersten Wurf beschäftigt. Hast Du dies Fragment in Deine Sourcen integriert und läuftst? mfG erwin Quote Link to comment
Guest Lars_MQ Posted August 5, 2005 Share Posted August 5, 2005 Jetzt habt ihr den Thread auch noch gemoved?!?!? Ich hab das weiter oben schon geschrieben. Bei der Menge an Code fragmenten denke ich, dass es besser in der COM-Rubrik aufgehoben ist. Von den Sachen hier profitieren viele, die sich mit COM versuchen möchten, und unter "Wünsche" wird sicher keiner nach sowas suchen. Ich kenne zumindest Teile von Skyscrapers "Plugin" und das zielt in eine etwas andere Richtung wie das JustCute. [Achtung hier kommt die Moral ] Ausserdem sind wir hier in keinem Wettbewerb, wir alle haben das ziel noch mehr aus dem DVBViewer zu machen Quote Link to comment
Skyscraper Posted August 5, 2005 Share Posted August 5, 2005 1.Kann ich leider im Moment eh nicht weiterproggn (steht weiter oben) und 2.Hab ich ein Problem Ich komme nicht weiter weil da irgendwas schiefläuft Skyscraper Quote Link to comment
erwin Posted August 5, 2005 Share Posted August 5, 2005 (edited) Bin jetzt ein Stück weiter. u := DVBViewer.EPGManager.GetAsArray(strtoint(channellist[sel].ID2), now, 0, epgarr); Das 'now' machts. Ich hatte eher sowas aufgerufen: u := DVBViewer.EPGManager.GetAsArray(strtoint(channellist[sel].ID2), 0, 0, epgarr); Siehe Doku! Scheint also buggy für Parameter = 0. Verifiziert das mal. Von den Sachen hier profitieren viele, die sich mit COM versuchen möchten, und unter "Wünsche" wird sicher keiner nach sowas suchen. Denke auch, ab in andere Rubrick! mfG erwin EDIT Genauer: kein Absturz aber Parameterfehler als Errorcode. Edited August 5, 2005 by erwin 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.