Persoenliche Mediazentrale
ulrich
2021-04-11 630b44fd74991e2757b2870eb76abbf3ad0f616f
commit | author | age
86bbf7 1 /*
cf6509 2   Mediazentrale - Personal Media Center
U 3   Copyright (C) 2021  Ulrich Hilger
4
5   This program is free software: you can redistribute it and/or modify
6   it under the terms of the GNU Affero General Public License as
7   published by the Free Software Foundation, either version 3 of the
8   License, or (at your option) any later version.
9
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU Affero General Public License for more details.
14
15   You should have received a copy of the GNU Affero General Public License
16   along with this program.  If not, see <https://www.gnu.org/licenses/>.
86bbf7 17  */
U 18 package de.uhilger.mediaz.api;
19
095119 20 import com.sun.net.httpserver.Headers;
86bbf7 21 import com.sun.net.httpserver.HttpExchange;
U 22 import de.uhilger.mediaz.App;
23 import de.uhilger.mediaz.Server;
dce2c7 24 import de.uhilger.mediaz.entity.Einstellung;
U 25 import de.uhilger.mediaz.entity.Entity;
26 import de.uhilger.mediaz.store.FileStorage;
27 import de.uhilger.mediaz.store.Storage;
86bbf7 28 import de.uhilger.mediaz.store.StorageFile;
37eadf 29 import de.uhilger.mediaz.store.Track;
86bbf7 30 import java.io.File;
be4056 31 import java.io.FileFilter;
86bbf7 32 import java.io.IOException;
U 33 import java.io.OutputStream;
34 import java.util.ArrayList;
d4d091 35 import java.util.Arrays;
U 36 import java.util.Collections;
dce2c7 37 import java.util.HashMap;
U 38 import java.util.Map;
be4056 39 import java.util.Set;
dce2c7 40 import java.util.logging.Level;
86bbf7 41 import java.util.logging.Logger;
U 42
43 /**
44  *
45  * @author ulrich
46  */
47 public class ListFileHandler extends FileHandler {
48   
49   /* Der Logger fuer diesen ListFileHandler */
50   private static final Logger logger = Logger.getLogger(ListFileHandler.class.getName());
51   
630b44 52   private static final String[] specialChars = {new String("\u00c4"), new String("\u00d6"), 
U 53       new String("\u00dc"), new String("\u00e4"), new String("\u00f6"), new String("\u00fc"), new String("\u00df")};
54   
dce2c7 55   Map extMap = new HashMap();
U 56   
86bbf7 57   public ListFileHandler(String absoluteDirectoryPathAndName) {
U 58     super(absoluteDirectoryPathAndName);
dce2c7 59     /*
0e9cd3 60       Ermittlung von Dateifiltern. 
dce2c7 61       Sie werden erwartet in den Einstellungen 'audioexts' und 'videoexts'
U 62       jeweils als Dateierweiterungen mit Komma getrennt
63       z.B. "mp4,m4v"
64     */
65     FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF)));
0e9cd3 66     initMap(fs, App.getRs(App.RB_AUDIOEXTS), StorageFile.TYP_AUDIO);
U 67     initMap(fs, App.getRs(App.RB_VIDEOEXTS), StorageFile.TYP_VIDEO);
86bbf7 68   }
U 69
dce2c7 70   private void initMap(Storage s, String key, String typ) {
U 71     Entity e = s.read(Einstellung.class.getSimpleName(), key);
72     if(e instanceof Einstellung) {
73       String[] exts = ((Einstellung) e).getValue().split(",");
74       for(String ext : exts) {
75         extMap.put(ext, typ);
76       }
77     }
78   }
79   
86bbf7 80   @Override
U 81   public void handle(HttpExchange e) throws IOException {
82     String path = e.getRequestURI().toString();
83     logger.fine(path);
0e9cd3 84     if(path.endsWith(Server.SLASH)) {
86bbf7 85       String fName = getFileName(e);
U 86       logger.fine(fName);
87       File dir = new File(fileBase, fName);
88       logger.fine(dir.getAbsolutePath());
be4056 89       File[] files = dir.listFiles(new FileFilter() {
U 90         @Override
91         public boolean accept(File pathname) {
92           Set keys = extMap.keySet();
93           String fname = pathname.getName();
94           int pos = fname.lastIndexOf(".");
95           String ext = fname.substring(pos+1);          
96           return keys.contains(ext) || pathname.isDirectory();
97         }
98       });
d4d091 99       Arrays.sort(files);      
86bbf7 100       ArrayList list = new ArrayList();
U 101       if(files != null) {
102         for(File file : files) {
103           StorageFile sf = new StorageFile();
7c22a2 104           String fname = file.getName();
U 105           sf.setName(fname);
b56bb3 106           sf.setTitelAnzName(fname);
86bbf7 107           if(file.isDirectory()) {
822ddf 108             sf.setTyp(StorageFile.TYP_FOLDER);
86bbf7 109           } else {
dce2c7 110             int pos = fname.lastIndexOf(".");
U 111             String ext = fname.substring(pos+1);
112             logger.log(Level.FINE, "ext: {0}", ext);
113             Object o = extMap.get(ext);
114             if(o instanceof String) {
115               sf.setTyp(o.toString());
37eadf 116               getTrack(file, sf);
7c22a2 117             } else {
U 118               sf.setTyp(StorageFile.TYP_FILE);
119             }
86bbf7 120           }
U 121           list.add(sf);
122         }
123       }
d4d091 124       //Collections.sort(list);
630b44 125       String json = escapeHtml(jsonWithCustomType(list, "Medialiste"));
U 126       
86bbf7 127       logger.fine(json);
095119 128       Headers headers = e.getResponseHeaders();
630b44 129       headers.add("Content-Type", "application/json; charset=UTF-8");
86bbf7 130       e.sendResponseHeaders(200, json.length());
U 131       OutputStream os = e.getResponseBody();
132       os.write(json.getBytes());
133       os.close();        
134     } else {
135       super.handle(e);
136     }
137   }
138   
630b44 139   public String escapeHtml(String text) {
U 140     text = text.replace(specialChars[0], "Ae");
141     text = text.replace(specialChars[1], "Oe");
142     text = text.replace(specialChars[2], "Ue");
143     text = text.replace(specialChars[3], "ae");
144     text = text.replace(specialChars[4], "oe");
145     text = text.replace(specialChars[5], "ue");
146     text = text.replace(specialChars[6], "ss");
147     
148     /*
149     text = text.replace(specialChars[0], "&Auml;");
150     text = text.replace(specialChars[1], "&Ouml;");
151     text = text.replace(specialChars[2], "&Uuml;");
152     text = text.replace(specialChars[3], "&auml;");
153     text = text.replace(specialChars[4], "&ouml;");
154     text = text.replace(specialChars[5], "&uuml;");
155     text = text.replace(specialChars[6], "&szlig;");
156     */
157     return text;
158   }
159   
37eadf 160   private void getTrack(File file, StorageFile sf) {
U 161     if(sf.getTyp().equalsIgnoreCase(StorageFile.TYP_AUDIO)) {
162       Track track = new Track(file);
163       sf.setInterpret(track.getArtist());
b56bb3 164       String trackTitel = track.getTitle();
U 165       if(trackTitel != null && trackTitel.length() > 0) {
166         sf.setTitelAnzName(trackTitel);
167       }
37eadf 168       sf.setAlbum(track.getAlbum());
U 169     }
170   }
86bbf7 171   
U 172 }