aboutsummaryrefslogtreecommitdiff
path: root/subsonic-main/src/main/java/net/sourceforge/subsonic/ajax/TagService.java
diff options
context:
space:
mode:
Diffstat (limited to 'subsonic-main/src/main/java/net/sourceforge/subsonic/ajax/TagService.java')
-rw-r--r--subsonic-main/src/main/java/net/sourceforge/subsonic/ajax/TagService.java128
1 files changed, 128 insertions, 0 deletions
diff --git a/subsonic-main/src/main/java/net/sourceforge/subsonic/ajax/TagService.java b/subsonic-main/src/main/java/net/sourceforge/subsonic/ajax/TagService.java
new file mode 100644
index 00000000..f7373b4e
--- /dev/null
+++ b/subsonic-main/src/main/java/net/sourceforge/subsonic/ajax/TagService.java
@@ -0,0 +1,128 @@
+/*
+ This file is part of Subsonic.
+
+ Subsonic is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Subsonic 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Subsonic. If not, see <http://www.gnu.org/licenses/>.
+
+ Copyright 2009 (C) Sindre Mehus
+ */
+package net.sourceforge.subsonic.ajax;
+
+import net.sourceforge.subsonic.Logger;
+import net.sourceforge.subsonic.domain.MediaFile;
+import net.sourceforge.subsonic.service.MediaFileService;
+import net.sourceforge.subsonic.service.metadata.MetaData;
+import net.sourceforge.subsonic.service.metadata.MetaDataParser;
+import net.sourceforge.subsonic.service.metadata.MetaDataParserFactory;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang.ObjectUtils;
+import org.apache.commons.lang.StringUtils;
+
+/**
+ * Provides AJAX-enabled services for editing tags in music files.
+ * This class is used by the DWR framework (http://getahead.ltd.uk/dwr/).
+ *
+ * @author Sindre Mehus
+ */
+public class TagService {
+
+ private static final Logger LOG = Logger.getLogger(TagService.class);
+
+ private MetaDataParserFactory metaDataParserFactory;
+ private MediaFileService mediaFileService;
+
+ /**
+ * Updated tags for a given music file.
+ *
+ * @param id The ID of the music file.
+ * @param track The track number.
+ * @param artist The artist name.
+ * @param album The album name.
+ * @param title The song title.
+ * @param year The release year.
+ * @param genre The musical genre.
+ * @return "UPDATED" if the new tags were updated, "SKIPPED" if no update was necessary.
+ * Otherwise the error message is returned.
+ */
+ public String setTags(int id, String track, String artist, String album, String title, String year, String genre) {
+
+ track = StringUtils.trimToNull(track);
+ artist = StringUtils.trimToNull(artist);
+ album = StringUtils.trimToNull(album);
+ title = StringUtils.trimToNull(title);
+ year = StringUtils.trimToNull(year);
+ genre = StringUtils.trimToNull(genre);
+
+ Integer trackNumber = null;
+ if (track != null) {
+ try {
+ trackNumber = new Integer(track);
+ } catch (NumberFormatException x) {
+ LOG.warn("Illegal track number: " + track, x);
+ }
+ }
+
+ Integer yearNumber = null;
+ if (year != null) {
+ try {
+ yearNumber = new Integer(year);
+ } catch (NumberFormatException x) {
+ LOG.warn("Illegal year: " + year, x);
+ }
+ }
+
+ try {
+
+ MediaFile file = mediaFileService.getMediaFile(id);
+ MetaDataParser parser = metaDataParserFactory.getParser(file.getFile());
+
+ if (!parser.isEditingSupported()) {
+ return "Tag editing of " + FilenameUtils.getExtension(file.getPath()) + " files is not supported.";
+ }
+
+ MetaData existingMetaData = parser.getRawMetaData(file.getFile());
+
+ if (StringUtils.equals(artist, existingMetaData.getArtist()) &&
+ StringUtils.equals(album, existingMetaData.getAlbumName()) &&
+ StringUtils.equals(title, existingMetaData.getTitle()) &&
+ ObjectUtils.equals(yearNumber, existingMetaData.getYear()) &&
+ StringUtils.equals(genre, existingMetaData.getGenre()) &&
+ ObjectUtils.equals(trackNumber, existingMetaData.getTrackNumber())) {
+ return "SKIPPED";
+ }
+
+ MetaData newMetaData = new MetaData();
+ newMetaData.setArtist(artist);
+ newMetaData.setAlbumName(album);
+ newMetaData.setTitle(title);
+ newMetaData.setYear(yearNumber);
+ newMetaData.setGenre(genre);
+ newMetaData.setTrackNumber(trackNumber);
+ parser.setMetaData(file, newMetaData);
+ mediaFileService.refreshMediaFile(file);
+ return "UPDATED";
+
+ } catch (Exception x) {
+ LOG.warn("Failed to update tags for " + id, x);
+ return x.getMessage();
+ }
+ }
+
+ public void setMediaFileService(MediaFileService mediaFileService) {
+ this.mediaFileService = mediaFileService;
+ }
+
+ public void setMetaDataParserFactory(MetaDataParserFactory metaDataParserFactory) {
+ this.metaDataParserFactory = metaDataParserFactory;
+ }
+}