Jump to content
Sign in to follow this  
Rayman

EPG automatisch durchsuchen

Recommended Posts

Rayman

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 :idiot:

Share this post


Link to post
Benson

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

Share this post


Link to post
Skyscraper

Ne lass mal :idiot:

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 :D

Edited by Skyscraper

Share this post


Link to post
Rayman
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 by Rayman

Share this post


Link to post
Skyscraper

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 :idiot:

Edited by Skyscraper

Share this post


Link to post
Rayman
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 :idiot:

 

 

Stefan.

Share this post


Link to post
Guest Lars_MQ
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 :idiot:

Share this post


Link to post
Skyscraper

Neue Screens unter

DVBViewer-Plugins

 

MfG Skyscraper

 

PS: Bin jetzt gleich ersmal weg bis nacher!

Share this post


Link to post
yaRincewind

Wow.

Das sieht ja schon richtig gut aus :idiot:

 

Wird die Eingabe auch per OSD möglich sein?

Share this post


Link to post
Skyscraper

:(

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 :D!!! Ich könnt das Programm :D

 

EDIT: Ich geh jetzt schlafen :). Morgen werden wir dann sehen...

Edited by Skyscraper

Share this post


Link to post
Skyscraper

Die Beta der Beta :D ist fertig!

Rayman hat sie zum testen bekommen!

 

MfG Skyscraper

 

Edit: Bereits bei Version 0.1.1.2 :D

Edited by Skyscraper

Share this post


Link to post
JustCute

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 :D

Edited by JustCute

Share this post


Link to post
Benson

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

Share this post


Link to post
Guest Lars_MQ
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). :(

Share this post


Link to post
JustCute
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...

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!

Share this post


Link to post
Skyscraper

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

Share this post


Link to post
JustCute

deswegen poste ich auch nur Code, vielleicht is was brauchbares für dich dabei.

Ich brauch ohnehin was eigenes :D

 

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

Share this post


Link to post
Skyscraper

Ähm :D

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

Share this post


Link to post
Benson

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.

Share this post


Link to post
JustCute
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.

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.

Share this post


Link to post
Rayman

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 :D

Share this post


Link to post
Guest Lars_MQ
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.

Share this post


Link to post
Guest Lars_MQ
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 :D

 

[edit]Da dieser Thread doch sehr ans eingemachte geht, hab ich ihn in den COM bereich geschoben, da ist er besser aufgehoben :([/edit]

Share this post


Link to post
JustCute
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  :(

Rechtlich gibts afaik keine Probleme, hab aber einfach keinen Bock Support zu leisten, deswegen gibts nur Code, den kannst selbst bearbeiten :D

 

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

Share this post


Link to post
JustCute

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.

Edited by JustCute

Share this post


Link to post
Benson

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

Share this post


Link to post
JustCute
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...

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 :bye:

Edited by JustCute

Share this post


Link to post
Skyscraper

Jetzt habt ihr den Thread auch noch gemoved?!?!?

Und wenn ihr hier soviel Code zum selberbasteln habt :bye: , warum soll ich dann meins noch weitermachen :bye:

 

Skyscraper

Share this post


Link to post
erwin
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...

 

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

Share this post


Link to post
Guest Lars_MQ
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.

Share this post


Link to post
erwin
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...".

 

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

Share this post


Link to post
erwin
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 ....

 

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.

 

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

Share this post


Link to post
JustCute

@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 by JustCute

Share this post


Link to post
Guest Lars_MQ

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.

Share this post


Link to post
erwin
Jetzt habt ihr den Thread auch noch gemoved?!?!?

Und wenn ihr hier soviel Code zum selberbasteln habt :bye: , warum soll ich dann meins noch weitermachen :bye:

 

Skyscraper

 

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

Share this post


Link to post
erwin
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.

 

 

Na das ist doch erstmal was! Und das so prompt . Wenn das mal kein Support ist!

 

Danke und mfG erwin

Share this post


Link to post
erwin
@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

 

 

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

Share this post


Link to post
Guest Lars_MQ
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 :bye: ]

Ausserdem sind wir hier in keinem Wettbewerb, wir alle haben das ziel noch mehr aus dem DVBViewer zu machen :bye:

Share this post


Link to post
Skyscraper

1.Kann ich leider im Moment eh nicht weiterproggn (steht weiter oben) :bye:

und

2.Hab ich ein Problem :bye: Ich komme nicht weiter weil da irgendwas schiefläuft :bye:

 

Skyscraper

Share this post


Link to post
erwin

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

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.

Sign in to follow this  

×
×
  • Create New...