From a48ca301dc5a00b724cb87492be39df2bb40b6f2 Mon Sep 17 00:00:00 2001
From: ulrich
Date: Mon, 26 Apr 2021 15:36:46 +0000
Subject: [PATCH] Readme beigefuegt, umgestellt auf ID3TagLib

---
 publish/logging.properties                    |    2 
 /dev/null                                     |  255 ------------------------------------------
 www/ui/js/app.js                              |    2 
 src/de/uhilger/tango/api/ListFileHandler.java |   27 +++-
 README.md                                     |   15 ++
 5 files changed, 35 insertions(+), 266 deletions(-)

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..4cdcbbf
--- /dev/null
+++ b/README.md
@@ -0,0 +1,15 @@
+# Tango
+
+Tango streamt Musik und Videos über das Netz und stellt eine einfach verwendbare Bedienoberfläche zur Konfiguration und Steuerung bereit.
+
+Weitere Informationen auf der [Produktseite](https://uhilger.de/data/pg/tango/).
+
+## Abhängigkeiten
+
+Tango nutzt die folgenden Produkte:
+
+[Java](https://adoptopenjdk.net/) - Ablaufumgebung
+[Gson](https://github.com/google/gson) - JSON/Java Serialisierung und Deserialisierung
+[jID3Lib](http://javamusictag.sourceforge.net/) - Java ID3 Tag Library
+[Mustache](http://mustache.github.io/) - "Logic-less templates."
+
diff --git a/publish/logging.properties b/publish/logging.properties
index 09ce6a1..2c13ed1 100644
--- a/publish/logging.properties
+++ b/publish/logging.properties
@@ -55,7 +55,7 @@
 #     <level>: <log message> [<date/time>]
 #
 # java.util.logging.SimpleFormatter.format=%4$s: %5$s [%1$tc]%n
-java.util.logging.SimpleFormatter.format=[%1$tc] %4$s: %5$s %n
+java.util.logging.SimpleFormatter.format=[%1$tc] %4$s: %5$s (%2$s)%n
 
 ############################################################
 # Facility specific properties.
diff --git a/src/de/uhilger/tango/api/ListFileHandler.java b/src/de/uhilger/tango/api/ListFileHandler.java
index ad074e3..8bde1fc 100644
--- a/src/de/uhilger/tango/api/ListFileHandler.java
+++ b/src/de/uhilger/tango/api/ListFileHandler.java
@@ -26,7 +26,6 @@
 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;
@@ -38,6 +37,9 @@
 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.ID3v1;
 
 /**
  *
@@ -112,7 +114,7 @@
             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);
             }
@@ -156,15 +158,22 @@
     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();
+        sf.setInterpret(tag.getArtist());
+        String trackTitel = tag.getTitle();
+        if(trackTitel != null && trackTitel.length() > 0) {
+          sf.setTitelAnzName(trackTitel);
+        }
+        sf.setAlbum(tag.getAlbumTitle());
+      } 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());
     }
   }
   
diff --git a/src/de/uhilger/tango/store/Track.java b/src/de/uhilger/tango/store/Track.java
deleted file mode 100644
index 600d422..0000000
--- a/src/de/uhilger/tango/store/Track.java
+++ /dev/null
@@ -1,255 +0,0 @@
- /*
-    Tango - Central Media Store and Raspberry Pi remote control
-    Copyright (C) 2013, 2014  Ulrich Hilger, http://uhilger.de
-
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU Affero General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU Affero General Public License for more details.
-
-    You should have received a copy of the GNU Affero General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
- */
- 
-
-package de.uhilger.tango.store;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.Map;
-import javax.sound.sampled.AudioFileFormat;
-import javax.sound.sampled.AudioFormat;
-import javax.sound.sampled.AudioSystem;
-import org.tritonus.share.sampled.TAudioFormat;
-import org.tritonus.share.sampled.file.TAudioFileFormat;
-
-/**
- * Class <code>Track</code> models an audio file including ID3 metadata. 
- * 
- * @author Ulrich Hilger, <a href="http://dev.uhilger.de" target="_blank">http://dev.uhilger.de</a>
- * @author Published under the terms and conditions of
- * the <a href="http://www.gnu.org/licenses/" target="_blank">GNU Affero General Public License</a>
- *
- * @version 3, February 19, 2012
- */
-
-public class Track {
-
-  /** reference to file of audio track */
-  private File trackFile;
-  
-  /** the time at which playing this track has started */
-  private long playStart;
-  
-  /** reference to metadata information */
-  private Map<String, Object> properties;
-
-  /**
-   * Create a new object of class <code>Track</code>
-   * @param trackFile  the audio file this track object refers to
-   */
-  public Track(File trackFile) {
-    super();
-    this.playStart = -1;
-    this.trackFile = trackFile;
-  }
-
-  /**
-   * get the time at which the playing of this track has started
-   * @return  number of milliseconds since Jan 1, 1970 denoting the time this tack has 
-   * started playing or -1 if it does not play 
-   */
-  public long getPlayStart() {
-    return playStart;
-  }
-
-  /**
-   * set the time at which the playing of this track has started
-   * @param playStart  number of milliseconds since Jan 1, 1970 denoting the time this tack has 
-   * started playing or -1 if it does not play 
-   */
-  public void setPlayStart(long playStart) {
-    this.playStart = playStart;
-  }
-
-  /**
-   * get the file this track refers to
-   * @return  the audio file reference
-   */
-  public File getTrackFile() {
-    return trackFile;
-  }
-
-  /**
-   * set the file this track refers to
-   * @param trackFile  the audio file reference to set this track to
-   */
-  public void setTrackFile(File trackFile) {
-    this.trackFile = trackFile;
-  }
-
-  /**
-   * get the metadata of a given audio file
-   *
-   * <p>Example<br><pre>
-   * properties: {mp3.frequency.hz=44100, title=All Cried Out, 
-   * mp3.length.bytes=6301706, comment=, mp3.channels=2, date=1984, 
-   * mp3.version.layer=3, mp3.framesize.bytes=414, mp3.id3tag.track=6, 
-   * mp3.version.mpeg=1, mp3.bitrate.nominal.bps=128000, mp3.vbr.scale=0, 
-   * bitrate=128000, mp3.length.frames=15112, mp3.crc=false, mp3.vbr=false, 
-   * album=Alf, mp3.framerate.fps=38.28125, mp3.copyright=false, 
-   * mp3.id3tag.v2=java.io.ByteArrayInputStream@7efa96, mp3.version.encoding=MPEG1L3,
-   * year=1984, mp3.id3tag.genre=Rock, mp3.header.pos=136, mp3.mode=0,
-   * mp3.original=true, vbr=false, mp3.padding=true, duration=394762000, 
-   * author=Alison Moyet}
-   * </pre></p>
-   *
-   * @param file File  the audio file to get metadata for
-   * @return Map  the properties Map with information such as in above example
-   */
-  @SuppressWarnings("unchecked")
-  private Map<String, Object> getMetadata(File file) {
-    Map<String, Object> map = new HashMap<String, Object>();
-    try {
-      AudioFileFormat audioFileFormat = AudioSystem.getAudioFileFormat(file);
-      if (audioFileFormat instanceof TAudioFileFormat) {
-        map.putAll(((TAudioFileFormat) audioFileFormat).properties());
-      }
-      AudioFormat audioFormat = audioFileFormat.getFormat();
-      if (audioFormat instanceof TAudioFormat) {
-        map.putAll(((TAudioFormat) audioFormat).properties());
-      }
-    } catch (Exception ex) {
-      ex.printStackTrace();
-    }
-    return map;
-  }
-
-  /**
-   * get the metadata of the audio file this track refers to
-   *
-   * <p>Example<br><pre>
-   * properties: {mp3.frequency.hz=44100, title=All Cried Out, 
-   * mp3.length.bytes=6301706, comment=, mp3.channels=2, date=1984, 
-   * mp3.version.layer=3, mp3.framesize.bytes=414, mp3.id3tag.track=6, 
-   * mp3.version.mpeg=1, mp3.bitrate.nominal.bps=128000, mp3.vbr.scale=0, 
-   * bitrate=128000, mp3.length.frames=15112, mp3.crc=false, mp3.vbr=false, 
-   * album=Alf, mp3.framerate.fps=38.28125, mp3.copyright=false, 
-   * mp3.id3tag.v2=java.io.ByteArrayInputStream@7efa96, mp3.version.encoding=MPEG1L3,
-   * year=1984, mp3.id3tag.genre=Rock, mp3.header.pos=136, mp3.mode=0,
-   * mp3.original=true, vbr=false, mp3.padding=true, duration=394762000, 
-   * author=Alison Moyet}
-   * </pre></p>
-   *
-   * @return Map  the properties Map with information such as in above example
-   */
-  public Map<String, Object> getMetadata() {
-    if (properties == null) {
-      properties = getMetadata(trackFile);
-    }
-    return properties;
-  }
-
-  /**
-   * Get the bitrate of this track, i.e. bits per second
-   * @return  the bitrate
-   */
-  public long getBitrate() {
-    long bitrate = -1;
-    Object o = getMetadata().get("bitrate");
-    if (o != null) {
-      bitrate = Long.parseLong(o.toString());
-    }
-    return bitrate;
-  }
-
-  /**
-   * get the artist of the currently playing song
-   * @return String  the artist of the song
-   */
-  public String getArtist() {
-    String artist = "";
-    Object o = getMetadata().get("author");
-    if (o != null) {
-      artist = o.toString().trim();
-    }
-    return artist;
-  }
-
-  /**
-   * get the album of the currently playing song
-   * @return String  the album of the song
-   */
-  public String getAlbum() {
-    String album = "";
-    //if (properties != null) {
-    Object o = getMetadata().get("album");
-    if (o != null) {
-      album = o.toString().trim();
-    }
-    //}
-    return album;
-  }
-
-  /**
-   * get the title of the currently playing song
-   * @return String  the song title
-   */
-  public String getTitle() {
-    String title = "";
-    Object o = getMetadata().get("title");
-    if (o != null) {
-      title = o.toString().trim();
-    } else {
-      title = trackFile.getName();
-    }
-    return title;
-  }
-
-  /**
-   * get the duration of the currently playing song
-   *
-   * @return long duration in milliseconds
-   */
-  public long getDuration() {
-    long duration = -1;
-    Object o = getMetadata().get("duration");
-    if (o != null) {
-      duration = Long.parseLong(o.toString());
-    }
-    return duration;
-  }
-
-  /**
-   * Overridden from class <code>Object</code>
-   * @return  the hash code
-   * @see java.lang.Object#hashCode() 
-   */
-  public int hashCode() {
-    int hash = 7;
-    hash = 97 * hash + (this.trackFile != null ? this.trackFile.hashCode() : 0);
-    return hash;
-  }
-
-  /**
-   * Overridden from class <code>Object</code>
-   * @return  true, when this object is equal to the given object 
-   * @see java.lang.Object#equals(java.lang.Object) 
-   */
-  public boolean equals(Object obj) {
-    boolean isEqual = false;
-    if(obj != null && obj instanceof Track) {
-      Track otherTrack = (Track) obj;
-      File otherFile = otherTrack.getTrackFile();
-      isEqual = otherFile.equals(this.getTrackFile());
-    }
-    return isEqual;
-  }
-
-}
diff --git a/www/ui/js/app.js b/www/ui/js/app.js
index 7f91809..691f93c 100644
--- a/www/ui/js/app.js
+++ b/www/ui/js/app.js
@@ -309,7 +309,7 @@
   this.ablageort_form = function(ort) {
     self.entitaet_form('Katalog', ort, ort.name,
       "data/tpl/form_ablageort.txt", '../api/store/Ablageort/',
-      '#ablageort-name', function() { 
+      '#ablageort-name', 'name', function() { 
         self.ablageort_liste();
     });
   };

--
Gitblit v1.9.3