| | |
| | | */ |
| | | package de.uhilger.mediaz.api; |
| | | |
| | | import com.sun.net.httpserver.Headers; |
| | | import com.sun.net.httpserver.HttpExchange; |
| | | import de.uhilger.mediaz.App; |
| | | import de.uhilger.mediaz.Server; |
| | | import de.uhilger.mediaz.entity.Einstellung; |
| | | import de.uhilger.mediaz.entity.Entity; |
| | | import de.uhilger.mediaz.store.FileStorage; |
| | | import de.uhilger.mediaz.store.Storage; |
| | | import de.uhilger.mediaz.store.StorageFile; |
| | | import de.uhilger.mediaz.store.Track; |
| | | import java.io.File; |
| | | import java.io.FileFilter; |
| | | import java.io.IOException; |
| | | import java.io.OutputStream; |
| | | import java.util.ArrayList; |
| | | import java.util.Arrays; |
| | | import java.util.Collections; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | import java.util.Set; |
| | | import java.util.logging.Level; |
| | | import java.util.logging.Logger; |
| | | |
| | | /** |
| | |
| | | /* 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")}; |
| | | |
| | | Map extMap = new HashMap(); |
| | | |
| | | public ListFileHandler(String absoluteDirectoryPathAndName) { |
| | | super(absoluteDirectoryPathAndName); |
| | | /* |
| | | Ermittlung von Dateifiltern. |
| | | Sie werden erwartet in den Einstellungen 'audioexts' und 'videoexts' |
| | | 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); |
| | | } |
| | | |
| | | private void initMap(Storage s, String key, String typ) { |
| | | Entity e = s.read(Einstellung.class.getSimpleName(), key); |
| | | if(e instanceof Einstellung) { |
| | | String[] exts = ((Einstellung) e).getValue().split(","); |
| | | for(String ext : exts) { |
| | | extMap.put(ext, typ); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void handle(HttpExchange e) throws IOException { |
| | | String path = e.getRequestURI().toString(); |
| | | logger.fine(path); |
| | | if(path.endsWith(App.getRs(Server.RB_SLASH))) { |
| | | if(path.endsWith(Server.SLASH)) { |
| | | String fName = getFileName(e); |
| | | logger.fine(fName); |
| | | File dir = new File(fileBase, fName); |
| | | logger.fine(dir.getAbsolutePath()); |
| | | File[] files = dir.listFiles(); |
| | | File[] files = dir.listFiles(new FileFilter() { |
| | | @Override |
| | | public boolean accept(File pathname) { |
| | | Set keys = extMap.keySet(); |
| | | String fname = pathname.getName(); |
| | | int pos = fname.lastIndexOf("."); |
| | | String ext = fname.substring(pos+1); |
| | | return keys.contains(ext) || pathname.isDirectory(); |
| | | } |
| | | }); |
| | | Arrays.sort(files); |
| | | ArrayList list = new ArrayList(); |
| | | if(files != null) { |
| | | for(File file : files) { |
| | | StorageFile sf = new StorageFile(); |
| | | String fname = file.getName(); |
| | | sf.setName(fname); |
| | | sf.setTitelAnzName(fname); |
| | | if(file.isDirectory()) { |
| | | sf.setTyp(StorageFile.TYP_FOLDER); |
| | | } else { |
| | | if(fname.endsWith(".mp3")) { |
| | | sf.setTyp(StorageFile.TYP_AUDIO); |
| | | } else if(fname.endsWith(".mp4") || fname.endsWith(".m4v")) { |
| | | sf.setTyp(StorageFile.TYP_VIDEO); |
| | | int pos = fname.lastIndexOf("."); |
| | | String ext = fname.substring(pos+1); |
| | | logger.log(Level.FINE, "ext: {0}", ext); |
| | | Object o = extMap.get(ext); |
| | | if(o instanceof String) { |
| | | sf.setTyp(o.toString()); |
| | | getTrack(file, sf); |
| | | } else { |
| | | sf.setTyp(StorageFile.TYP_FILE); |
| | | } |
| | |
| | | list.add(sf); |
| | | } |
| | | } |
| | | String json = jsonWithCustomType(list, "Medialiste"); |
| | | //Collections.sort(list); |
| | | String json = escapeHtml(jsonWithCustomType(list, "Medialiste")); |
| | | |
| | | logger.fine(json); |
| | | Headers headers = e.getResponseHeaders(); |
| | | headers.add("Content-Type", "application/json; charset=UTF-8"); |
| | | e.sendResponseHeaders(200, json.length()); |
| | | OutputStream os = e.getResponseBody(); |
| | | os.write(json.getBytes()); |
| | |
| | | } |
| | | } |
| | | |
| | | public String escapeHtml(String text) { |
| | | text = text.replace(specialChars[0], "Ae"); |
| | | text = text.replace(specialChars[1], "Oe"); |
| | | text = text.replace(specialChars[2], "Ue"); |
| | | text = text.replace(specialChars[3], "ae"); |
| | | text = text.replace(specialChars[4], "oe"); |
| | | text = text.replace(specialChars[5], "ue"); |
| | | text = text.replace(specialChars[6], "ss"); |
| | | |
| | | /* |
| | | text = text.replace(specialChars[0], "Ä"); |
| | | text = text.replace(specialChars[1], "Ö"); |
| | | text = text.replace(specialChars[2], "Ü"); |
| | | text = text.replace(specialChars[3], "ä"); |
| | | text = text.replace(specialChars[4], "ö"); |
| | | text = text.replace(specialChars[5], "ü"); |
| | | text = text.replace(specialChars[6], "ß"); |
| | | */ |
| | | return text; |
| | | } |
| | | |
| | | private void getTrack(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); |
| | | } |
| | | sf.setAlbum(track.getAlbum()); |
| | | } |
| | | } |
| | | |
| | | } |