BeanShell - Textdatei auslesen

Bei Problemen mit der Bedienung von TV-Browser, bitte hier posten.
ds10
Site Admin
Beiträge: 19101
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: BeanShell - Textdatei auslesen

Beitrag von ds10 »

Code: Alles auswählen

ProgramInfoHelper.bitSet(program.getInfo(),Program.INFO_CATEGORIE_SERIES)
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
Sheldon2012
Plugin-Developer
Beiträge: 1206
Registriert: 25 Dez 2012, 07:35

Re: BeanShell - Textdatei auslesen

Beitrag von Sheldon2012 »

Mit 100.000 Einträgen in der CSV-Datei gibt es keine Performance-Probleme.
Mit 1.000.000 Einträgen in der CSV-Datei hängt der TV-Browser beim Start. (Lade Plugins ...) :(
Wenn man ihm die Datei nach dem Start unterschiebt, ist die Performance ok..
ds10
Site Admin
Beiträge: 19101
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: BeanShell - Textdatei auslesen

Beitrag von ds10 »

Möglicherweise reicht der reservierte Speicher von TV-Browser beim Start nicht, wenn du eine Millionen Datensätze einliest, weil gleichzeitig noch andere speicherintensive Operationen laufen. Die sind dann während TV-Browser läuft nicht mehr im Weg und deshalb geht es dann. Vielleicht kommt es auch zu einem Deadlock beim Start, daher wäre dann das hier relevant: http://wiki.tvbrowser.org/index.php/Fehlersuche
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
Sheldon2012
Plugin-Developer
Beiträge: 1206
Registriert: 25 Dez 2012, 07:35

Re: BeanShell - Textdatei auslesen

Beitrag von Sheldon2012 »

Ich schau mal. Aber mit 1 Mio. Einträgen sind wir ntürlich auch schon sehr extrem unterwegs.

Schau mal, ob die Implementierung (Check Serie u. Rel. Pfade) so passt. Kompilieren wäre natürlich auch schön! :wink:

Code: Alles auswählen


/* CSVFilerFilterComponent
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package csvfilefiltercomponent;

import java.awt.BorderLayout;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.HashSet;
import java.lang.util.io.IOUtilities;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import devplugin.PluginsFilterComponent;
import devplugin.Program;
import devplugin.ProgramFieldType;
import devplugin.ProgramInfoHelper;

/**
* FilterComponent class to build a filter based on information from a CSV file.
*
* @author RenAŠ Mach
*/
public class CSVFileFilterComp extends PluginsFilterComponent {
   private String mFile;
   private JTextField mPath;   
   private HashMap<String, Boolean> mPogramStatusMap;
   private BufferedReader br;
   private static final String SEPARATOR = ";";
   private HashMap<String, HashSet<String>> mCSVData;
   
   @Override
   public int getVersion() {
      return 1;   
   }

   @Override
   public boolean accept(Program program) {      
      if(program != null) {
          // Check program status map
          if (mPogramStatusMap.containsKey(program.getUniqueID())) {
              return mPogramStatusMap.get(program.getUniqueID());
         }
       
         // Reading program data
         String title = program.getTextField(ProgramFieldType.TITLE_TYPE);
         String episode = program.getTextField(ProgramFieldType.EPISODE_TYPE);      

         if  (ProgramInfoHelper.bitSet(program.getInfo(),Program.INFO_CATEGORIE_SERIES)){         
            if ((title != null) && (title.trim().length() > 0)){               
               if ((episode == null) || (episode.trim().length() == 0)){
                  episode = program.getTextField(ProgramFieldType.ORIGINAL_EPISODE_TYPE);
               }  
            }else{
               title = program.getTextField(ProgramFieldType.ORIGINAL_TITLE_TYPE);
               episode = program.getTextField(ProgramFieldType.ORIGINAL_EPISODE_TYPE);   
            
               if ((episode == null) || (episode.trim().length() == 0)){
                  episode = program.getTextField(ProgramFieldType.EPISODE_TYPE);
               }             
            }
		 }	else {
			/* 
			!!! IMPORTANT !!! 
			If the program is no series the episode is set equal to title. The program is handled like a special series with one episode. 
			This enables you to handle programs like movies, documentations etc. with this approach.
			This needs to be taken into cosideration at CSV file creation time to guarantee proper matching.
			 */
             if ((title != null) && (title.trim().length() > 0)){ 			 
			    episode = title;  
			 }	
		 }	 
         
         // Program data comparison preparation
         title = prepareForComparison(title);
         episode = prepareForComparison(episode);   
      
         boolean result = false;
 
         // Program data check
         result  = (title != null) && (title.length() > 0) && (episode != null) && (episode.length() > 0) ;
         if (result){
               // Data comparison
               HashSet<String> episodeSet = mCSVData.get(title);      
               result = (episodeSet != null) && (episodeSet.contains(episode)); 
          }   
       
           // Update program status map       
           mPogramStatusMap.put(program.getUniqueID(), result);
           return result; 
      }
     
      // Program check failed    
      return false;
   }

   @Override
   public void read(ObjectInputStream in, int version) throws IOException, ClassNotFoundException {
      mFile = in.readUTF();
	  mFile = translateRelativePath(mFile);
	       
      if(mPogramStatusMap == null) {
        mPogramStatusMap = new HashMap<String, Boolean>();
      }
    
      if(mFile != null){
        readFile();
     }
   }

   @Override
   public void write(ObjectOutputStream out) throws IOException {
      out.writeUTF(checkForRelativePath(mFile));   
   }
   
   @Override
   public String getUserPresentableClassName() {
      return CSVFileFilterComponent.LOCALIZER.msg("compName", "CSV file");
   }

   @Override
   public JPanel getSettingsPanel() {
      JPanel global = new JPanel(new BorderLayout());
      JPanel settings = new JPanel(new BorderLayout(5,5));   
   
       JLabel info = new JLabel(CSVFileFilterComponent.LOCALIZER.msg("settings.info", "Enter path to CSV file:"));
       info.setAlignmentX(JLabel.LEFT_ALIGNMENT);   
       settings.add(info, BorderLayout.NORTH);     
     
      mPath = new JTextField();     
      mPath.setAlignmentX(JTextField.LEFT_ALIGNMENT);
      mPath.setEditable(true);
     
      if(mFile != null) {
        mPath.setText(mFile);
      }
     
      JPanel center = new JPanel(new BorderLayout());
      center.add(mPath, BorderLayout.NORTH);
      settings.add(center, BorderLayout.CENTER);
      global.add(settings, BorderLayout.WEST);
     
      return global;
   }

   @Override
   public void saveSettings() {           
      if((mPath.getText() != null) && (mPath.getText().length() > 0)){
         mFile = mPath.getText();
      }
    
     if(mFile != null){
        readFile();
     }
     
      if(mPogramStatusMap == null) {
        mPogramStatusMap = new HashMap<String, Boolean>();
      }
   }
   
    private void processLine(String line) {
        if(line != null) {
           if(mCSVData == null) {
              mCSVData = new HashMap<String, HashSet<String>>();
           }
           
         String[] parts = line.split(SEPARATOR);         
         String part_0 = prepareForComparison(parts[0]);
         String part_1 = prepareForComparison(parts[1]);
           
            HashSet<String> episodeSet = mCSVData.get(part_0);
           
            if(episodeSet == null) {
                episodeSet = new HashSet<String>();
             
                mCSVData.put(part_0, episodeSet);
            }
           
             episodeSet.add(part_1);
        }
    }
   
   private void readFile() {      
      String line = "";
    
      if (mFile != null){
        File data = new File(mFile);
        
        if(data.isFile()) {
          try{            
            // Read CSV file
             br = new BufferedReader(new FileReader(mFile));
            
            // Clear the map
            if (mCSVData != null){
               mCSVData.clear();
            } 
            
            line = br.readLine();
 
                while (line != null){
               processLine(line);
                line = br.readLine();
            }   
            
            closeReader(br);   
            
          }catch (IOException ioe) {
             closeReader(br);
                 ioe.printStackTrace();
            }
        }
      }   
   }
   
   private String prepareForComparison(String unpreparedString){
      String preparedString = "";
     
      if(unpreparedString != null) {
        preparedString = unpreparedString;
 
        // Set to lower case
        preparedString = preparedString.toLowerCase();
 
        // Special alphabetic character handling
        preparedString = preparedString.replaceAll("\00df", "ss"); // replace ß by ss
        preparedString = preparedString.replaceAll("\00e4", "ae"); // replace ä by ae
        preparedString = preparedString.replaceAll("\00f6", "oe"); // replace ö by oe
        preparedString = preparedString.replaceAll("\00fc", "ue"); // replace ü by ue
 
        // Non-numeric and non-alphabetic character handling
        preparedString = preparedString.replaceAll("[^0-9a-z]", "");
 
        // Trim the string
        preparedString = preparedString.trim();
      }
     
      return preparedString;
   }

   private void closeReader (BufferedReader br) {

       try {
         
         if (br != null) {
         
            br.close();
           
         }
         
      } catch (IOException e) {

         e.printStackTrace();
         
      }
   }     
}



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

Re: BeanShell - Textdatei auslesen

Beitrag von ds10 »

Das ist jetzt aber die letzte Version, die ich kompiliere, falls du noch weitere Änderungen vornehmen möchtest, solltest du dir Eclipse installieren und TV-Browser im Quellcode dort zum Bearbeiten auschecken, um das Plugin direkt bearbeiten und testen zu können.
CSVFileFilterComponent.jar
(9.03 KiB) 90-mal heruntergeladen
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
Sheldon2012
Plugin-Developer
Beiträge: 1206
Registriert: 25 Dez 2012, 07:35

Re: BeanShell - Textdatei auslesen

Beitrag von Sheldon2012 »

Wird gemacht! Ist ja bald Wochenende1 Danke für das Kompilieren! :)
Uups! Diesmal habe ich keinen Fehler gemacht? Erstaunlich!

Ich wollte das Plugin dann auch im Wiki vorstellen. Wohl auf der Plugin-Seite, oder?
Ich dachte daran, dort auch den Source-Code (wie beim BeanShell-Filter) einzustellen, damit ich den Unterschied deutlich machen kann und der Zusammenhang deutlich wird. Die Seite zum BeanShell kann man ja dort verlinken.

Ist das von Deiner Seite aus ok?
ds10
Site Admin
Beiträge: 19101
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: BeanShell - Textdatei auslesen

Beitrag von ds10 »

Das kannst du so machen, wie du das möchtest. Ein paar kleinere Fehler waren schon vorhanden, das kannst du ja anhand des beigelegten Quellcode nachvollziehen.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
Sheldon2012
Plugin-Developer
Beiträge: 1206
Registriert: 25 Dez 2012, 07:35

Re: BeanShell - Textdatei auslesen

Beitrag von Sheldon2012 »

Ah! Beim IOUtil war ich mir auch etwas unsicher. Das wurde nicht ganz klar. Danke fürs Korrigieren und Kompilieren.
Sheldon2012
Plugin-Developer
Beiträge: 1206
Registriert: 25 Dez 2012, 07:35

Re: BeanShell - Textdatei auslesen

Beitrag von Sheldon2012 »

Also die neue Funktionalität habe ich getestet. Das funktioniert bestens.
Nur bei 1 Mio Datensätze steigt mein Sspeicher aus.

Dann wollen wir das Ding mal hochladen.
Bevor ich da Mist baue, frage ich besser mal nach.
Schau mal bitte, ob das so passt.

Hauptklasse:

csvfilefiltercomponent.CSVFileFilterComponent.class Richtig?

Name (Englisch)

CSV File Filter Component

Name (Deutsch)

CSV-Datei-Filterkomponente

Plugin-Typ:

Datenquelle Software oder Andere? Welches Schweinl hättens denn gern?

Website:

Die gibt es noch nicht. Kann man das später machen ode wie regelt ihr das?

Version

Mein Vorschlag
1.0.0.0 (wie bei Filter-Filterkomponente)
Beta ja oder nein? Ich denke eher nein, oder?

Alle Betriebssysteme (checked)

Dieses Plugin auf der Webseite anzeigen. (checked)
Dieses Plugin innerhalb des TV-Browser zum Download anbieten. (checked)
ds10
Site Admin
Beiträge: 19101
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: BeanShell - Textdatei auslesen

Beitrag von ds10 »

Sheldon2012 hat geschrieben:csvfilefiltercomponent.CSVFileFilterComponent.class Richtig?
Nicht ganz, richtig ist: csvfilefiltercomponent.CSVFileFilterComponent
Sheldon2012 hat geschrieben:Datenquelle Software oder Andere? Welches Schweinl hättens denn gern?
Bietet das Plugin Programmdaten an? Wohl nicht, folglich ist es Andere.
Sheldon2012 hat geschrieben:Die gibt es noch nicht. Kann man das später machen ode wie regelt ihr das?
Kannst du auch später noch nachreichen.
Sheldon2012 hat geschrieben:Mein Vorschlag
1.0.0.0 (wie bei Filter-Filterkomponente)
Beta ja oder nein? Ich denke eher nein, oder?
Sieh einfach in der Plugin-Liste in TV-Browser nach, dort steht die Version. Auf der Plugin-Seite muss es die gleiche sein.
Sheldon2012 hat geschrieben:Alle Betriebssysteme (checked)

Dieses Plugin auf der Webseite anzeigen. (checked)
Dieses Plugin innerhalb des TV-Browser zum Download anbieten. (checked)
Okay.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
Sheldon2012
Plugin-Developer
Beiträge: 1206
Registriert: 25 Dez 2012, 07:35

Re: BeanShell - Textdatei auslesen

Beitrag von Sheldon2012 »

ds10 hat geschrieben:
Sheldon2012 hat geschrieben:Mein Vorschlag
1.0.0.0 (wie bei Filter-Filterkomponente)
Beta ja oder nein? Ich denke eher nein, oder?
Sieh einfach in der Plugin-Liste in TV-Browser nach, dort steht die Version. Auf der Plugin-Seite muss es die gleiche sein.
In der Plugin-Liste steht es doch noch nicht. Oder meinst Du eine andere als unter Downloads?
Welche Version soll ich denn nehmen?
ds10
Site Admin
Beiträge: 19101
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: BeanShell - Textdatei auslesen

Beitrag von ds10 »

Es gibt in TV-Browser eine Liste mit allen Plugins in den Einstellungen (Extras->Plugins verwalten..).
Außerdem kannst du im Quellcode in CSVFileFilterComponent.java die VERSION sehen (zur Zeit ist es 1.0.3.0, wäre im Entwicklerbereich also mit 1 3 0, keine Beta-Version einzutragen).
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
Sheldon2012
Plugin-Developer
Beiträge: 1206
Registriert: 25 Dez 2012, 07:35

Re: BeanShell - Textdatei auslesen

Beitrag von Sheldon2012 »

Ach so! Die Liste meinst Du. Ok! Dann halt diese Versionsnummer. Danke!
Sheldon2012
Plugin-Developer
Beiträge: 1206
Registriert: 25 Dez 2012, 07:35

Re: BeanShell - Textdatei auslesen

Beitrag von Sheldon2012 »

TV-Browser Version 3.4.1?
Hab ich jetzt einfach so gemacht bevor die Session weg ist. Es ist also vollbracht! :)
Was bedeuten eigentlich die beiden Zahlen (0/0)? Anzahl der Downloads oder so?
Zuletzt geändert von Sheldon2012 am 05 Mär 2015, 17:52, insgesamt 3-mal geändert.
ds10
Site Admin
Beiträge: 19101
Registriert: 23 Jun 2005, 12:36
Kontaktdaten:

Re: BeanShell - Textdatei auslesen

Beitrag von ds10 »

Damit bist du auf der sicheren Seite, theoretisch müsste es aber auch mit 3.3 funktionieren.
"First they ignore you, then they ridicule you, then they fight you, then you win." - Mahatma Gandhi
Unterstütze die Weiterentwicklung von TV-Browser
Antworten