Persoenliche Mediazentrale
ulrich
2022-05-11 3866a756db6c85e36d1896af8461682c8c19a2ec
commit | author | age
86bbf7 1 /*
94b1c2 2   Tango - Personal Media Center
cf6509 3   Copyright (C) 2021  Ulrich Hilger
U 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  */
94b1c2 18 package de.uhilger.tango.api;
86bbf7 19
095119 20 import com.sun.net.httpserver.Headers;
86bbf7 21 import com.sun.net.httpserver.HttpExchange;
94b1c2 22 import de.uhilger.tango.App;
U 23 import de.uhilger.tango.Server;
24 import de.uhilger.tango.entity.Einstellung;
25 import de.uhilger.tango.entity.Entity;
26 import de.uhilger.tango.store.FileStorage;
27 import de.uhilger.tango.store.Storage;
28 import de.uhilger.tango.store.StorageFile;
86bbf7 29 import java.io.File;
be4056 30 import java.io.FileFilter;
86bbf7 31 import java.io.IOException;
U 32 import java.io.OutputStream;
33 import java.util.ArrayList;
d4d091 34 import java.util.Arrays;
dce2c7 35 import java.util.HashMap;
U 36 import java.util.Map;
be4056 37 import java.util.Set;
dce2c7 38 import java.util.logging.Level;
86bbf7 39 import java.util.logging.Logger;
a48ca3 40 import org.farng.mp3.MP3File;
U 41 import org.farng.mp3.TagException;
ea73fa 42 import org.farng.mp3.id3.AbstractID3v2;
a48ca3 43 import org.farng.mp3.id3.ID3v1;
86bbf7 44
U 45 /**
46  *
47  * @author ulrich
48  */
49 public class ListFileHandler extends FileHandler {
50   
ad3e2d 51   public static final String RB_AUDIOEXTS = "audioexts";
U 52   public static final String RB_VIDEOEXTS = "videoexts";
a1333d 53   public static final String RB_FOTOEXTS = "imageexts";
ad3e2d 54   
86bbf7 55   /* Der Logger fuer diesen ListFileHandler */
U 56   private static final Logger logger = Logger.getLogger(ListFileHandler.class.getName());
57   
630b44 58   private static final String[] specialChars = {new String("\u00c4"), new String("\u00d6"), 
U 59       new String("\u00dc"), new String("\u00e4"), new String("\u00f6"), new String("\u00fc"), new String("\u00df")};
ea73fa 60   
U 61   public static final String UNWANTED_PATTERN = "[^a-zA-Z_0-9 ]";
630b44 62   
dce2c7 63   Map extMap = new HashMap();
U 64   
f70acb 65   private String conf;
U 66   
67   public ListFileHandler(String absoluteDirectoryPathAndName, String conf) {
86bbf7 68     super(absoluteDirectoryPathAndName);
dce2c7 69     /*
0e9cd3 70       Ermittlung von Dateifiltern. 
dce2c7 71       Sie werden erwartet in den Einstellungen 'audioexts' und 'videoexts'
U 72       jeweils als Dateierweiterungen mit Komma getrennt
73       z.B. "mp4,m4v"
74     */
f70acb 75     FileStorage fs = new FileStorage(conf);
ad3e2d 76     initMap(fs, getResString(RB_AUDIOEXTS), StorageFile.TYP_AUDIO);
U 77     initMap(fs, getResString(RB_VIDEOEXTS), StorageFile.TYP_VIDEO);
a1333d 78     initMap(fs, getResString(RB_FOTOEXTS), StorageFile.TYP_FOTO);
86bbf7 79   }
U 80
dce2c7 81   private void initMap(Storage s, String key, String typ) {
U 82     Entity e = s.read(Einstellung.class.getSimpleName(), key);
83     if(e instanceof Einstellung) {
84       String[] exts = ((Einstellung) e).getValue().split(",");
85       for(String ext : exts) {
86         extMap.put(ext, typ);
87       }
88     }
89   }
90   
86bbf7 91   @Override
U 92   public void handle(HttpExchange e) throws IOException {
93     String path = e.getRequestURI().toString();
94     logger.fine(path);
0e9cd3 95     if(path.endsWith(Server.SLASH)) {
86bbf7 96       String fName = getFileName(e);
U 97       logger.fine(fName);
98       File dir = new File(fileBase, fName);
99       logger.fine(dir.getAbsolutePath());
be4056 100       File[] files = dir.listFiles(new FileFilter() {
U 101         @Override
102         public boolean accept(File pathname) {
103           Set keys = extMap.keySet();
104           String fname = pathname.getName();
105           int pos = fname.lastIndexOf(".");
106           String ext = fname.substring(pos+1);          
107           return keys.contains(ext) || pathname.isDirectory();
108         }
109       });
d4d091 110       Arrays.sort(files);      
86bbf7 111       ArrayList list = new ArrayList();
U 112       if(files != null) {
113         for(File file : files) {
114           StorageFile sf = new StorageFile();
7c22a2 115           String fname = file.getName();
U 116           sf.setName(fname);
b56bb3 117           sf.setTitelAnzName(fname);
86bbf7 118           if(file.isDirectory()) {
822ddf 119             sf.setTyp(StorageFile.TYP_FOLDER);
86bbf7 120           } else {
dce2c7 121             int pos = fname.lastIndexOf(".");
U 122             String ext = fname.substring(pos+1);
123             logger.log(Level.FINE, "ext: {0}", ext);
124             Object o = extMap.get(ext);
125             if(o instanceof String) {
126               sf.setTyp(o.toString());
a48ca3 127               getMetadata(file, sf);
7c22a2 128             } else {
U 129               sf.setTyp(StorageFile.TYP_FILE);
130             }
86bbf7 131           }
U 132           list.add(sf);
133         }
134       }
d4d091 135       //Collections.sort(list);
ea73fa 136       String rawjson = jsonWithCustomType(list, "Medialiste");
U 137       String json = escapeHtml(rawjson);
630b44 138       
86bbf7 139       logger.fine(json);
095119 140       Headers headers = e.getResponseHeaders();
630b44 141       headers.add("Content-Type", "application/json; charset=UTF-8");
86bbf7 142       e.sendResponseHeaders(200, json.length());
U 143       OutputStream os = e.getResponseBody();
144       os.write(json.getBytes());
145       os.close();        
146     } else {
147       super.handle(e);
148     }
149   }
150   
630b44 151   public String escapeHtml(String text) {
U 152     text = text.replace(specialChars[0], "Ae");
153     text = text.replace(specialChars[1], "Oe");
154     text = text.replace(specialChars[2], "Ue");
155     text = text.replace(specialChars[3], "ae");
156     text = text.replace(specialChars[4], "oe");
157     text = text.replace(specialChars[5], "ue");
158     text = text.replace(specialChars[6], "ss");
159     
160     /*
161     text = text.replace(specialChars[0], "&Auml;");
162     text = text.replace(specialChars[1], "&Ouml;");
163     text = text.replace(specialChars[2], "&Uuml;");
164     text = text.replace(specialChars[3], "&auml;");
165     text = text.replace(specialChars[4], "&ouml;");
166     text = text.replace(specialChars[5], "&uuml;");
167     text = text.replace(specialChars[6], "&szlig;");
168     */
169     return text;
170   }
171   
a48ca3 172   private void getMetadata(File file, StorageFile sf) {
37eadf 173     if(sf.getTyp().equalsIgnoreCase(StorageFile.TYP_AUDIO)) {
a48ca3 174       try {
U 175         MP3File mp3 = new MP3File(file);
176         ID3v1 tag = mp3.getID3v1Tag();
ea73fa 177         if(tag == null) {
U 178           AbstractID3v2 tag2 = mp3.getID3v2Tag();
179           sf.setInterpret(tag2.getLeadArtist().replaceAll(UNWANTED_PATTERN, ""));
180           String trackTitel = tag2.getSongTitle().replaceAll(UNWANTED_PATTERN, "");
181           if(trackTitel != null && trackTitel.length() > 0) {
182             sf.setTitelAnzName(trackTitel);
183           }
184           sf.setAlbum(tag2.getAlbumTitle().replaceAll(UNWANTED_PATTERN, ""));
185         } else {
186           sf.setInterpret(tag.getArtist().replaceAll(UNWANTED_PATTERN, ""));
187           String trackTitel = tag.getTitle().replaceAll(UNWANTED_PATTERN, "");
188           if(trackTitel != null && trackTitel.length() > 0) {
189             sf.setTitelAnzName(trackTitel);
190           }
191           sf.setAlbum(tag.getAlbumTitle().replaceAll(UNWANTED_PATTERN, ""));
a48ca3 192         }
U 193       } catch (IOException ex) {
194         Logger.getLogger(ListFileHandler.class.getName()).log(Level.SEVERE, null, ex);
195       } catch (TagException ex) {
196         Logger.getLogger(ListFileHandler.class.getName()).log(Level.SEVERE, null, ex);
b56bb3 197       }
37eadf 198     }
U 199   }
86bbf7 200   
U 201 }