From 37eadfdee87ac822923638b3e2b53abcd6b0ba57 Mon Sep 17 00:00:00 2001
From: ulrich
Date: Fri, 09 Apr 2021 06:57:44 +0000
Subject: [PATCH] ID3 Tags
---
src/de/uhilger/mediaz/store/StorageFile.java | 34 +++++
src/de/uhilger/mediaz/store/Track.java | 255 ++++++++++++++++++++++++++++++++++++++++++
src/de/uhilger/mediaz/entity/Titel.java | 9 +
www/ui/js/app.js | 8 +
src/de/uhilger/mediaz/api/ListFileHandler.java | 10 +
5 files changed, 314 insertions(+), 2 deletions(-)
diff --git a/src/de/uhilger/mediaz/api/ListFileHandler.java b/src/de/uhilger/mediaz/api/ListFileHandler.java
index cb24df1..cb9e9b4 100644
--- a/src/de/uhilger/mediaz/api/ListFileHandler.java
+++ b/src/de/uhilger/mediaz/api/ListFileHandler.java
@@ -25,6 +25,7 @@
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.IOException;
import java.io.OutputStream;
@@ -93,6 +94,7 @@
Object o = extMap.get(ext);
if(o instanceof String) {
sf.setTyp(o.toString());
+ getTrack(file, sf);
} else {
sf.setTyp(StorageFile.TYP_FILE);
}
@@ -111,5 +113,13 @@
}
}
+ private void getTrack(File file, StorageFile sf) {
+ if(sf.getTyp().equalsIgnoreCase(StorageFile.TYP_AUDIO)) {
+ Track track = new Track(file);
+ sf.setInterpret(track.getArtist());
+ sf.setTitelAnzName(track.getTitle());
+ sf.setAlbum(track.getAlbum());
+ }
+ }
}
diff --git a/src/de/uhilger/mediaz/entity/Titel.java b/src/de/uhilger/mediaz/entity/Titel.java
index 301a42a..163d0b8 100644
--- a/src/de/uhilger/mediaz/entity/Titel.java
+++ b/src/de/uhilger/mediaz/entity/Titel.java
@@ -25,6 +25,7 @@
private String katalogUrl;
private String pfad;
private String name;
+ private String anzName;
public String getKatalogUrl() {
return katalogUrl;
@@ -49,5 +50,13 @@
public void setPfad(String pfad) {
this.pfad = pfad;
}
+
+ public String getAnzName() {
+ return anzName;
+ }
+
+ public void setAnzName(String anzName) {
+ this.anzName = anzName;
+ }
}
diff --git a/src/de/uhilger/mediaz/store/StorageFile.java b/src/de/uhilger/mediaz/store/StorageFile.java
index 29b4851..8c183c5 100644
--- a/src/de/uhilger/mediaz/store/StorageFile.java
+++ b/src/de/uhilger/mediaz/store/StorageFile.java
@@ -31,6 +31,9 @@
private String name;
private String typ;
+ private String interpret = "";
+ private String titelAnzName = "";
+ private String album = "";
public String getName() {
return name;
@@ -47,5 +50,36 @@
public void setTyp(String typ) {
this.typ = typ;
}
+
+ public String getInterpret() {
+ return interpret;
+ }
+
+ public void setInterpret(String ip) {
+ if(ip != null) {
+ this.interpret = ip;
+ }
+ }
+
+ public String getTitelAnzName() {
+ return titelAnzName;
+ }
+
+ public void setTitelAnzName(String tan) {
+ if(tan != null) {
+ this.titelAnzName = tan;
+ }
+ }
+
+ public String getAlbum() {
+ return album;
+ }
+
+ public void setAlbum(String a) {
+ if(a != null) {
+ this.album = a;
+ }
+ }
+
}
diff --git a/src/de/uhilger/mediaz/store/Track.java b/src/de/uhilger/mediaz/store/Track.java
new file mode 100644
index 0000000..41c1be5
--- /dev/null
+++ b/src/de/uhilger/mediaz/store/Track.java
@@ -0,0 +1,255 @@
+ /*
+ Mediacenter - 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.mediaz.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 5507333..abd781f 100644
--- a/www/ui/js/app.js
+++ b/www/ui/js/app.js
@@ -147,8 +147,12 @@
}
self.media_liste();
} else {
- self.removeClassMulti('selected');
- t.classList.add('selected');
+ if(t.classList.contains('selected')) {
+ self.addSelectedTitel();
+ } else {
+ self.removeClassMulti('selected');
+ t.classList.add('selected');
+ }
//self.selTitel = new Titel(t.textContent, self.ortPfad);
}
});
--
Gitblit v1.9.3