| | |
| | | import de.uhilger.tango.store.FileStorage; |
| | | import de.uhilger.tango.store.Storage; |
| | | import de.uhilger.tango.store.StorageFile; |
| | | import de.uhilger.tango.store.Track; |
| | | import java.io.File; |
| | | import java.io.FileFilter; |
| | | import java.io.IOException; |
| | |
| | | import java.util.Set; |
| | | import java.util.logging.Level; |
| | | 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()); |
| | |
| | | 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. |
| | |
| | | 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) { |
| | |
| | | Object o = extMap.get(ext); |
| | | if(o instanceof String) { |
| | | sf.setTyp(o.toString()); |
| | | getTrack(file, sf); |
| | | getMetadata(file, sf); |
| | | } else { |
| | | sf.setTyp(StorageFile.TYP_FILE); |
| | | } |
| | |
| | | } |
| | | } |
| | | //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(); |
| | |
| | | return text; |
| | | } |
| | | |
| | | private void getTrack(File file, StorageFile sf) { |
| | | private void getMetadata(File file, StorageFile sf) { |
| | | if(sf.getTyp().equalsIgnoreCase(StorageFile.TYP_AUDIO)) { |
| | | Track track = new Track(file); |
| | | sf.setInterpret(track.getArtist()); |
| | | String trackTitel = track.getTitle(); |
| | | if(trackTitel != null && trackTitel.length() > 0) { |
| | | sf.setTitelAnzName(trackTitel); |
| | | try { |
| | | MP3File mp3 = new MP3File(file); |
| | | ID3v1 tag = mp3.getID3v1Tag(); |
| | | 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, "")); |
| | | } |
| | | } catch (IOException ex) { |
| | | Logger.getLogger(ListFileHandler.class.getName()).log(Level.SEVERE, null, ex); |
| | | } catch (TagException ex) { |
| | | Logger.getLogger(ListFileHandler.class.getName()).log(Level.SEVERE, null, ex); |
| | | } |
| | | sf.setAlbum(track.getAlbum()); |
| | | } |
| | | } |
| | | |