From a6081c2b65b0463fdc640875833527f41fa9ded6 Mon Sep 17 00:00:00 2001 From: undisclosed Date: Sun, 22 Jan 2023 16:11:12 +0000 Subject: [PATCH] Erste Version fertig: JavaScript-Player fuer 'hier spielen' bei Abspiellisten --- src/de/uhilger/tango/api/ListFileHandler.java | 82 +++++++++++++++++++++++++++++++++++------ 1 files changed, 70 insertions(+), 12 deletions(-) diff --git a/src/de/uhilger/tango/api/ListFileHandler.java b/src/de/uhilger/tango/api/ListFileHandler.java index 8bde1fc..ed3e0fe 100644 --- a/src/de/uhilger/tango/api/ListFileHandler.java +++ b/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) { -- Gitblit v1.9.3