Persoenliche Mediazentrale
undisclosed
2023-01-22 f9dd4f3a00efe7581e9bd620a9b968f122090f7a
src/de/uhilger/tango/api/ListFileHandler.java
@@ -39,13 +39,55 @@
import java.util.logging.Logger;
import org.farng.mp3.MP3File;
import org.farng.mp3.TagException;
import org.farng.mp3.id3.AbstractID3v2;
import org.farng.mp3.id3.ID3v1;
/**
 *
 * @author ulrich
 * Die Klasse ListFileHandler gibt die Media-Inhalte eines Ablageortes
 * als Liste aus. Audio-Inhalte werden dabei unter Verwendung von
 * Informationen aus ID3-Tags dargestellt, z.B. Artist, Album, Titel,
 * sofern solche vorhanden sind. Zudem werden nur diejenigen Inahlte
 * ausgegeben, die Dateierweiterungen besitzen, wie sie in der FileStorage
 * unter 'Einstellung' unter audioexts, videoexts und imageexts angegeben
 * sind (die Namen der Einstellungen sind ueber das Resource Bundle von
 * Tango ueber RB_AUDIOEXTS, RB_VIDEOEXTS und RB_FOTOEXTS veraenderbar).
 *
 * Ein ListFileHandler gibt dann fuer Ordner den Inhalt als Liste aus und
 * Streamt den Inhalt von Dateien.
 *
 * Der ListFileHandler modelliert das Verhalten, das auf der Bedienoberflaeche
 * von Tango in der Konfiguration als 'Kataloge' angelegt werden kann. Die
 * HTTP Servicepunkte ergeben sich aus den Ablageort-Objekten die fuer
 * Kataloge vom Benutzer in der Konfiguration angelegt werden.
 *
 * Der vom Benutzer gewaehlte URL eines Ablagortes wird vom ListFileHandler zu
 * dem Pfad des Ablageortes hin verknuepft. So ergibt sich fuer jeden
 * ListFileHandler der Endpunkt
 *
 * HTTP GET http://mein-server/tango/[Ablageort-URL]/
 *
 * Ist z.B. Audio und Video unter dem Pfad /media/extssd/mc abgelegt, kann
 * ein Ablageort namens 'AV' den URL /media fuer diesen Pfad definieren. Dann verweist
 *
 * http://mein-server/tango/media/
 *
 * auf den Inhalt unter /media/extssd/mc
 *
 * Hierbei wird der Inhalt unter dem Katalognamen 'AV' in der Bedienoberflaeche von
 * Tango dargestellt, d.h., die Auswahl von 'AV' an der Bedienoberflaeche bewirkt
 * 'unter der Haube' den Abruf von http://mein-server/tango/media/
 *
 * Selbstverstaendlich kann aber dieser URL auch von ueberallher verwendet werden.
 * Die Verknuepfung zwischen Katalogname und URL besteht nur an der Bedienoberflaeche
 * von Tango.
 *
 * @author Ulrich Hilger
 */
public class ListFileHandler extends FileHandler {
  public static final String RB_AUDIOEXTS = "audioexts";
  public static final String RB_VIDEOEXTS = "videoexts";
  public static final String RB_FOTOEXTS = "imageexts";
  
  /* Der Logger fuer diesen ListFileHandler */
  private static final Logger logger = Logger.getLogger(ListFileHandler.class.getName());
@@ -53,9 +95,13 @@
  private static final String[] specialChars = {new String("\u00c4"), new String("\u00d6"), 
      new String("\u00dc"), new String("\u00e4"), new String("\u00f6"), new String("\u00fc"), new String("\u00df")};
  
  public static final String UNWANTED_PATTERN = "[^a-zA-Z_0-9 ]";
  Map extMap = new HashMap();
  
  public ListFileHandler(String absoluteDirectoryPathAndName) {
  private String conf;
  public ListFileHandler(String absoluteDirectoryPathAndName, String conf) {
    super(absoluteDirectoryPathAndName);
    /*
      Ermittlung von Dateifiltern. 
@@ -63,9 +109,10 @@
      jeweils als Dateierweiterungen mit Komma getrennt
      z.B. "mp4,m4v"
    */
    FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF)));
    initMap(fs, App.getRs(App.RB_AUDIOEXTS), StorageFile.TYP_AUDIO);
    initMap(fs, App.getRs(App.RB_VIDEOEXTS), StorageFile.TYP_VIDEO);
    FileStorage fs = new FileStorage(conf);
    initMap(fs, getResString(RB_AUDIOEXTS), StorageFile.TYP_AUDIO);
    initMap(fs, getResString(RB_VIDEOEXTS), StorageFile.TYP_VIDEO);
    initMap(fs, getResString(RB_FOTOEXTS), StorageFile.TYP_FOTO);
  }
  private void initMap(Storage s, String key, String typ) {
@@ -123,7 +170,8 @@
        }
      }
      //Collections.sort(list);
      String json = escapeHtml(jsonWithCustomType(list, "Medialiste"));
      String rawjson = jsonWithCustomType(list, "Medialiste");
      String json = escapeHtml(rawjson);
      
      logger.fine(json);
      Headers headers = e.getResponseHeaders();
@@ -163,12 +211,22 @@
      try {
        MP3File mp3 = new MP3File(file);
        ID3v1 tag = mp3.getID3v1Tag();
        sf.setInterpret(tag.getArtist());
        String trackTitel = tag.getTitle();
        if(trackTitel != null && trackTitel.length() > 0) {
          sf.setTitelAnzName(trackTitel);
        if(tag == null) {
          AbstractID3v2 tag2 = mp3.getID3v2Tag();
          sf.setInterpret(tag2.getLeadArtist().replaceAll(UNWANTED_PATTERN, ""));
          String trackTitel = tag2.getSongTitle().replaceAll(UNWANTED_PATTERN, "");
          if(trackTitel != null && trackTitel.length() > 0) {
            sf.setTitelAnzName(trackTitel);
          }
          sf.setAlbum(tag2.getAlbumTitle().replaceAll(UNWANTED_PATTERN, ""));
        } else {
          sf.setInterpret(tag.getArtist().replaceAll(UNWANTED_PATTERN, ""));
          String trackTitel = tag.getTitle().replaceAll(UNWANTED_PATTERN, "");
          if(trackTitel != null && trackTitel.length() > 0) {
            sf.setTitelAnzName(trackTitel);
          }
          sf.setAlbum(tag.getAlbumTitle().replaceAll(UNWANTED_PATTERN, ""));
        }
        sf.setAlbum(tag.getAlbumTitle());
      } catch (IOException ex) {
        Logger.getLogger(ListFileHandler.class.getName()).log(Level.SEVERE, null, ex);
      } catch (TagException ex) {