Alle Programme suchen

Hier haben Plugin-Entwickler die Möglichkeit, sich auszutauschen.
Benutzeravatar
misi
Plugin-Developer
Beiträge: 20
Registriert: 13 Feb 2006, 22:54

Alle Programme suchen

Beitrag von misi »

Hi,

die Entwicklung eines Plugins ist ja nicht wirklich einfach. Entweder habe ich nicht die richtige Doku gefunden oder man muss sich alle Doku aus dem Sourcecode raus suchen. Naja, bin ja schon recht weit gekommen. :-)

Nun hänge ich aber an einer Stelle und komm nicht so einfach weiter. Ich will alle Programme nacheinander überprüfen, beim Suchen nach den Programmen wird aber nix gefunden. Also hier mein Code:

Code: Alles auswählen

      SearchFormSettings searchFormSettings = new SearchFormSettings("");
      Program[] programs;

      searchFormSettings.setSearcherType(SearchFormSettings.SEARCH_IN_ALL);
      programs = searchFormSettings.createSearcher().search(searchFormSettings.getFieldTypes(), new Date(), 1000, Plugin.getPluginManager().getSubscribedChannels(), true);
      logger.info("Found " + programs.length + " items.");
      for (int i = 0; i < programs.length; i++) {
        Program program = programs[i];

// usw....
      }
Dummerweise gibt der Logger aus, dass er nix gefunden hat. :-(

Könnt ihr mir sagen, was ich falsch mache, bzw. welche Parameter man an die SearchFormSettings übergeben kann. Evtl. reicht mir auch eine Doku aus. Anhand des Sources ist es irgendwie nicht nachvollziehbar.

Danke und Grüße,

Michael
ds10
Site Admin
Beiträge: 19123
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Beitrag von ds10 »

Was willst du denn überprüfen an den Programmen?

Wenn es dir nur darum geht alle Programme zu bekommen kannst du die Mehtoden des PluginManagers verwenden. Falls es das ist was du suchst, lade dir mal das DataViewerPlugin von der Pluginseite und öffne es mit einem Packer und entpacke die Datei DataViewerPlugin.java. Die Methode run() enthält einen Algorithmus zum Finden aller Programmdaten.

Oder:

Code: Alles auswählen

  SearchFormSettings searchFormSettings = new SearchFormSettings(".*");
  Program[] programs;

  searchFormSettings.setSearcherType(PluginManager.SEARCHER_TYPE_REGULAR_EXPRESSION);
  searchFormSettings.setSearchIn(SearchFormSettings.SEARCH_IN_TITLE);

  programs = searchFormSettings.createSearcher().search(searchFormSettings.getFieldTypes(), Date.getCurrentDate(), 1000, getPluginManager().getSubscribedChannels(), true);
  logger.info("Found " + programs.length + " items.");
  
  for (int i = 0; i < programs.length; i++) {
    Program program = programs[i];

// usw....
  }
Benutzeravatar
misi
Plugin-Developer
Beiträge: 20
Registriert: 13 Feb 2006, 22:54

Beitrag von misi »

ds10 hat geschrieben:Was willst du denn überprüfen an den Programmen?
Ich will in allen möglichen Feldern nach unterschiedlichen Informationen suchen.
ds10 hat geschrieben:Wenn es dir nur darum geht alle Programme zu bekommen kannst du die Mehtoden des PluginManagers verwenden. Falls es das ist was du suchst, lade dir mal das DataViewerPlugin von der Pluginseite und öffne es mit einem Packer und entpacke die Datei DataViewerPlugin.java. Die Methode run() enthält einen Algorithmus zum Finden aller Programmdaten.
Hmm, finde ich etwas umständlich.
ds10 hat geschrieben:Oder:
Das ist am Besten und so mache ich es auch. :-)

Trotzdem die Frage: warum gibt es nicht einfach eine Methode getAllPrograms() im PluginManager oder beim Channel?

Danke auf jeden Fall für die schnelle Hilfe.

Michael
ds10
Site Admin
Beiträge: 19123
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Beitrag von ds10 »

misi hat geschrieben:Trotzdem die Frage: warum gibt es nicht einfach eine Methode getAllPrograms() im PluginManager oder beim Channel?
1. es gibt andere Möglichkeiten an die Programme zu kommen
2. wurde bis jetzt nicht gebraucht
Benutzeravatar
misi
Plugin-Developer
Beiträge: 20
Registriert: 13 Feb 2006, 22:54

Beitrag von misi »

ds10 hat geschrieben:2. wurde bis jetzt nicht gebraucht
Wo kann ich den Bedarf anmelden? :-)

Im Ernst:
Wäre schön, wenn es das geben würde. Ich habe aber bereits deine "Oder"-Variante genommen und läuft gut. Daher ist es nicht mehr notwendig.

Nun habe ich das nächste Problem, dass ich nicht heraus bekomme, wie man was in der Plugin-Übersicht einträgt. Einen Punkt habe ich dort schon eingefügt, d.h. canUseProgramTree habe ich überschrieben und somit sehe ich mein Plugin in der Liste. Aber wie bekomme ich da Daten rein? Hab gesehen, dass das irgendwas mit PluginTreeNode zu tun hat. Aber wenn ich da mal manuell was einfüge, wird es nicht angezeigt.
ds10
Site Admin
Beiträge: 19123
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Beitrag von ds10 »

misi hat geschrieben:Wo kann ich den Bedarf anmelden?
Ich hätte an sich nichts gegen eine solche Methode, nur ich kann das nicht alleine entscheiden, die anderen Entwickler müssen dem auch zustimmen.
Und so schnell ändern wir sowas nicht, wenn überhaupt wäre das eine Änderung für ein großes Update. Damit meine ich die Hauptversionsnummer müsste sich dabei schon ändern. :-)
misi hat geschrieben:Nun habe ich das nächste Problem, dass ich nicht heraus bekomme, wie man was in der Plugin-Übersicht einträgt. Einen Punkt habe ich dort schon eingefügt, d.h. canUseProgramTree habe ich überschrieben und somit sehe ich mein Plugin in der Liste. Aber wie bekomme ich da Daten rein? Hab gesehen, dass das irgendwas mit PluginTreeNode zu tun hat. Aber wenn ich da mal manuell was einfüge, wird es nicht angezeigt.
Du musst dir den RootKnoten deines Plugins holen mit:

Code: Alles auswählen

PluginTreeNode node = getRootNode();
Programme fügst du dann ein mit:

Code: Alles auswählen

node.addProgram(p);
Zum Schluss musst du dann den RootKnoten noch updaten mit:

Code: Alles auswählen

node.update();
Danach sind Einträge unter deinem PluginKnoten vorhanden.

Du kannst auch noch zusätzliche Unterknoten einfügen die keine Programme sind, das Zählen der Programme abschalten oder auch die Gruppierung nach Datum abschalten. Aber da würde ich dich auf die Doku verweisen:
http://www.tvbrowser.org/downloads/docs ... .0_doc.zip
oder guck dir den SourceCode von PluginTreeNode an. :-)
Benutzeravatar
bodo
Site Admin
Beiträge: 19635
Registriert: 03 Dez 2003, 19:37
Wohnort: Köln
Kontaktdaten:

Beitrag von bodo »

Also ich finde das Suchen in dem Programmen ziemlich ungeschickt. Ich würde es so machen:

Code: Alles auswählen

Channel[] channels = Plugin.getPluginManager().getSubscribedChannels();

        Date date = new Date();
        for (int d = 0; d < 31; d++) {
            for (int i = 0; i < channels.length; i++) {
                Iterator it = Plugin.getPluginManager().getChannelDayProgram(date, channels[i]);
                while ((it != null) && (it.hasNext())) {
                    Program program = (Program) it.next();
                    // Hier hast du dein Programm
                }
            }

            date = date.addDays(1);
        }
Dadurch bekommst du die Sendungen der nächsten 31 Tage.

Das ist auch die Methode, die man nehmen sollte. Wer weiß, was wir in nächster Zeit so an der suche schrauben...
Benutzeravatar
misi
Plugin-Developer
Beiträge: 20
Registriert: 13 Feb 2006, 22:54

Beitrag von misi »

@ds10: addProgram habe ich getestet, bei mir kam aber nie was dabei heraus. Das update habe ich nie gemacht. Werd es versuchen.

@bodo: die zusätzliche Iteration über den Tag finde ich nicht gut, ist zu umständlich. Ich brauche einfach eine Methode "gib mir alles, was du zu dem speziellen Channel findest".
ds10
Site Admin
Beiträge: 19123
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Beitrag von ds10 »

Wo wir gerade dabei sind, auch ich finde das mit der Suche nicht sonderlich geschickt. Noch dazu verbrauchst du damit unnötige Ressourcen, bei der Suche wird erst die ganze Programmtabelle mit dem RegExSeacher durchsucht und die Programme zrückgegeben. Danach durchsuchst du die Programme nochmal, du hast also einen doppelt so hohen Aufwand wie bei Bodos Variante (die meinem ersten Verschlag entspricht :-)).

Aber du musst selber wissen was du nimmst.
Zuletzt geändert von ds10 am 14 Feb 2006, 12:26, insgesamt 1-mal geändert.
Benutzeravatar
bodo
Site Admin
Beiträge: 19635
Registriert: 03 Dez 2003, 19:37
Wohnort: Köln
Kontaktdaten:

Beitrag von bodo »

Also ich rate hier nochmals davon ab, die Suche zu nutzen. Benutzt bitte die Iteration. Da kannst du dann alles in eine Arraylist packen und fertig. Dann hast du schon das, was du brauchst.
Benutzeravatar
misi
Plugin-Developer
Beiträge: 20
Registriert: 13 Feb 2006, 22:54

Beitrag von misi »

Kaum macht man's richtig, schon funktionierts. :-)

node.update();

hat mir noch gefehlt.

danke für die Hilfe, ich komme evtl. noch mal drauf zurück. ;-)

Michael
MajorTom

Beitrag von MajorTom »

Hallo,

Mein Plan war, mit Hilfe von TV Browser meiner Logitech DiNovo MediaPad Ansteuerung ein paar Sendungsinfos zur Verfügung zu stellen (unter dem Motto Fernseher fernbedienen: was läuft wo?), allerdings (mangels Java Kentnissen :roll: ) in einer anderen Programmiersprache. Ich habe den Code etwas abgwandelt um die Sendungsdaten der nächsten X Tage in eine Datei zu exportieren (mittels dem hier geposteten Code), etwa so:

Code: Alles auswählen

package mpad;

import devplugin.*;
import java.io.*;

public class MPad extends Plugin {
	
	private final int AnzahlTage = 3; 
	
	public PluginInfo getInfo() {
		String name = "MediaPad Exporter";
    String desc = "Exportiert Sendungen für den MediaPad Controller";
    String author = "MajorTom";
    Version version = new Version(0, 1);
    return new PluginInfo(name, desc, author, version);
	}
	
  public void handleTvBrowserStartFinished() {
  	ListeAusgeben();
  }
  
  public void handleTvDataUpdateFinished() {
  	ListeAusgeben();
  }
  
  public void ListeAusgeben() {
  	
  	Channel[] Kanaele = Plugin.getPluginManager().getSubscribedChannels();
    Date Datum = new Date();
    
    
    String Ende = System.getProperty("line.separator");
  
    try {
      DataOutput Datei = new DataOutputStream(new FileOutputStream("Inhalte.dat"));

      for (int d = 0; d < AnzahlTage; d++) {
        Datei.writeBytes("[DAT]\t" + Integer.toString(Datum.getDayOfMonth()) + "." + Integer.toString(Datum.getMonth()) + "." + Integer.toString(Datum.getYear()) + Ende);
        for (int i = 0; i < Kanaele.length; i++) {
    	   	Datei.writeBytes("[KAN]\t" + Kanaele[i].getName() + Ende); 
          java.util.Iterator it = Plugin.getPluginManager().getChannelDayProgram(Datum, Kanaele[i]);
          while ((it != null) && (it.hasNext())) {
            Program Programm = (Program) it.next();
            String P = Programm.getDescription(); 
            Datei.writeBytes("[ST]\t" + Programm.getTitle() + "\t" + Integer.toString(Programm.getStartTime()) + "\t" + Integer.toString(Programm.getLength()) + "\t" + P + "..." + Ende);
          }
        }
        Datum = Datum.addDays(1);
      }
      Datei = null; Datum = null;
    }  
    catch (Exception e) {
    }
  }

}
Wobei "String P = Programm.getDescription(); " schon Debug ist. Das klappt auch alles super, nur dachte ich mir, das die Programmdescription etwas lang werden kann. Deshalb habe ich vorgehabt, etwas wie "Programm.getDescription().substring(0, 32)" einzubauen. Nur gibt er mir dann lediglich das erste Datum, Sender und Programm aus (also einmal die While schleife und das wars). In den catch Zweig scheint er aber nicht zu kommen! Also das geht:

Code: Alles auswählen

            Program Programm = (Program) it.next();
            String P = Programm.getDescription();
            Datei.writeBytes("[ST]\t" + Programm.getTitle() + "\t" + Integer.toString(Programm.getStartTime()) + "\t" + Integer.toString(Programm.getLength()) + "\t" + P + "..." + Ende);
aber sowas hier:

Code: Alles auswählen

            Program Programm = (Program) it.next();
            String P = Programm.getDescription();

            String R = P.substring(1, 10);

            Datei.writeBytes("[ST]\t" + Programm.getTitle() + "\t" + Integer.toString(Programm.getStartTime()) + "\t" + Integer.toString(Programm.getLength()) + "\t" + R + "..." + Ende);

oder auch sowas:

Code: Alles auswählen

            Program Programm = (Program) it.next();
            String P = Programm.getDescription();

            int R = P.length();

            Datei.writeBytes("[ST]\t" + Programm.getTitle() + "\t" + Integer.toString(Programm.getStartTime()) + "\t" + Integer.toString(Programm.getLength()) + "\t" + P + "..." + Ende);
geht nicht!

Ich krieg hier langsam Würmer in'n Kopp. Kann mir wer helfen?

Besten Dank im Vorraus...
Benutzeravatar
bodo
Site Admin
Beiträge: 19635
Registriert: 03 Dez 2003, 19:37
Wohnort: Köln
Kontaktdaten:

Beitrag von bodo »

Du verstößt gegen die Nutzungsbedingungen des TV-Browsers wenn du die Daten mit einem anderen Programm betrachtest.
MajorTom

Beitrag von MajorTom »

Hoppala, das bedeutet also, wenn ich mir einen Abriss der Daten auf meinem MPad LCD Display anzeigen lasse (um vom Sofa zu gucken was woanders grob läuft), natürlich ausschließlich privat und mit selbst gebasteltem Treiber, der nirgendwo zur Verfügung steht, ist also nicht erlaubt.

Öhm, generell (Die Daten mit was anderem zu betrachten, als direkt auf dem Monitor mit der Software) oder nicht, wenn ich die LCD Ansteuerung als Plugin für den TVB auf JAVA umschreibe?

Wenn generell, dann lass ich natürlich! Ansonsten muss ich mir mal was zwecks DLL's und Keyboard Hook unter Java einfallen lassen (mit meinen "Kentnissen" *autsch* :) )

Besten Dank jedenfalls für die Infos...
Benutzeravatar
bodo
Site Admin
Beiträge: 19635
Registriert: 03 Dez 2003, 19:37
Wohnort: Köln
Kontaktdaten:

Beitrag von bodo »

Also wir bekommen die Daten von den Sendern nur für die Darstellung im TV-Browser. Das ist eine der Bedingungen, die uns gestellt werden, damit wir die Daten kostenlos bekommen.
Antworten