Package com.tulskiy.musique.audio.formats.ape

Source Code of com.tulskiy.musique.audio.formats.ape.APETagProcessor

/*
* Copyright (c) 2008, 2009, 2010, 2011 Denis Tulskiy
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with this work.  If not, see <http://www.gnu.org/licenses/>.
*/

package com.tulskiy.musique.audio.formats.ape;

import com.tulskiy.musique.playlist.Track;
import com.tulskiy.musique.playlist.TrackData;
import com.tulskiy.musique.util.Util;

import davaguine.jmac.info.APETag;
import davaguine.jmac.info.ID3Tag;
import davaguine.jmac.tools.RandomAccessFile;

import java.io.IOException;

import org.jaudiotagger.tag.FieldKey;

/**
* Author: Denis Tulskiy
* Date: 26.06.2009
*/
public class APETagProcessor {

    public APETagProcessor() {
        ID3Tag.setDefaultEncoding("windows-1251");
    }

    public boolean readAPEv2Tag(Track track) throws IOException {
      TrackData trackData = track.getTrackData();
        RandomAccessFile ras = null;
        try {
            ras = new RandomAccessFile(trackData.getFile(), "r");
            APETag tag = new APETag(ras, true);
            if (tag.GetHasAPETag() || tag.GetHasID3Tag()) {
              setMusiqueTagFieldValue(tag, trackData, FieldKey.ARTIST, APETag.APE_TAG_FIELD_ARTIST);
              setMusiqueTagFieldValue(tag, trackData, FieldKey.ALBUM, APETag.APE_TAG_FIELD_ALBUM);
              setMusiqueTagFieldValue(tag, trackData, FieldKey.TITLE, APETag.APE_TAG_FIELD_TITLE);
              setMusiqueTagFieldValue(tag, trackData, FieldKey.YEAR, APETag.APE_TAG_FIELD_YEAR);
              setMusiqueTagFieldValue(tag, trackData, FieldKey.GENRE, APETag.APE_TAG_FIELD_GENRE);
              setMusiqueTagFieldValue(tag, trackData, FieldKey.COMMENT, APETag.APE_TAG_FIELD_COMMENT);
              setMusiqueTagFieldValue(tag, trackData, FieldKey.ALBUM_ARTIST, "album artist");
              handleTrackDiscFields(tag, trackData);

              setCustomMusiqueTagFieldValue(tag, trackData, FieldKey.RECORD_LABEL);
              setCustomMusiqueTagFieldValue(tag, trackData, FieldKey.CATALOG_NO);
              setCustomMusiqueTagFieldValue(tag, trackData, FieldKey.RATING);

              trackData.setCueSheet(tag.GetFieldString("CUESHEET"));
                if (tag.GetHasAPETag())
                    return tag.GetHasAPETag();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ras != null)
                ras.close();
        }
        return false;
    }

    public void writeAPEv2Tag(Track track) throws IOException {
      TrackData trackData = track.getTrackData();
        RandomAccessFile ras = null;
        try {
            ras = new RandomAccessFile(trackData.getFile(), "rw");
            APETag tag = new APETag(ras, true);

            setApeTagFieldValue(tag, trackData, FieldKey.ARTIST, APETag.APE_TAG_FIELD_ARTIST);
            setApeTagFieldValue(tag, trackData, FieldKey.ALBUM, APETag.APE_TAG_FIELD_ALBUM);
            setApeTagFieldValue(tag, trackData, FieldKey.TITLE, APETag.APE_TAG_FIELD_TITLE);
            setApeTagFieldValue(tag, trackData, FieldKey.YEAR, APETag.APE_TAG_FIELD_YEAR);
            setApeTagFieldValue(tag, trackData, FieldKey.GENRE, APETag.APE_TAG_FIELD_GENRE);
            setApeTagFieldValue(tag, trackData, FieldKey.COMMENT, APETag.APE_TAG_FIELD_COMMENT);
            setApeTagFieldValue(tag, trackData, FieldKey.TRACK, APETag.APE_TAG_FIELD_TRACK);
            setApeTagFieldValue(tag, trackData, FieldKey.ALBUM_ARTIST, "Album Artist");

            setCustomApeTagFieldValue(tag, trackData, FieldKey.DISC_NO);
            setCustomApeTagFieldValue(tag, trackData, FieldKey.TRACK_TOTAL);
            setCustomApeTagFieldValue(tag, trackData, FieldKey.DISC_TOTAL);
            setCustomApeTagFieldValue(tag, trackData, FieldKey.RECORD_LABEL);
            setCustomApeTagFieldValue(tag, trackData, FieldKey.CATALOG_NO);
            setCustomApeTagFieldValue(tag, trackData, FieldKey.RATING);

            // TODO review this hardcoded const
            tag.SetFieldString("CUESHEET", trackData.getCueSheet());

            tag.Save();
       
        track.getTrackData().removeEmptyTagFields();
        } finally {
            if (ras != null)
                ras.close();
        }
    }

    private void setMusiqueTagFieldValue(APETag tag, TrackData trackData, FieldKey musiqueKey, String apeKey) throws IOException {
      String value = tag.GetFieldString(apeKey);
      if (value != null) {
        trackData.setTagFieldValues(musiqueKey, value);
      }
    }

    private void setApeTagFieldValue(APETag tag, TrackData trackData, FieldKey musiqueKey, String apeKey) throws IOException {
      String value = trackData.getFirstTagFieldValue(musiqueKey);
      if (!Util.isEmpty(value)) {
        tag.SetFieldString(apeKey, value);
      }
      else if (tag.GetFieldString(apeKey) != null) {
        tag.RemoveField(apeKey);
      }
    }

    private void setCustomMusiqueTagFieldValue(APETag tag, TrackData trackData, FieldKey musiqueKey) throws IOException {
      setMusiqueTagFieldValue(tag, trackData, musiqueKey, musiqueKey.toString());
    }

    private void setCustomApeTagFieldValue(APETag tag, TrackData trackData, FieldKey musiqueKey) throws IOException {
      setApeTagFieldValue(tag, trackData, musiqueKey, musiqueKey.toString());
    }
   
    private void handleTrackDiscFields(APETag tag, TrackData trackData) throws IOException {
      String value = tag.GetFieldString(APETag.APE_TAG_FIELD_TRACK);
      if (!Util.isEmpty(value)) {
        if (!value.contains("/")) {
          setMusiqueTagFieldValue(tag, trackData, FieldKey.TRACK, APETag.APE_TAG_FIELD_TRACK);
            setCustomMusiqueTagFieldValue(tag, trackData, FieldKey.TRACK_TOTAL);
        }
        else {
          String[] parts = value.split("/");
          trackData.setTagFieldValues(FieldKey.TRACK, parts[0]);
          if (parts.length > 1) {
            trackData.setTagFieldValues(FieldKey.TRACK_TOTAL, parts[1]);
          }
        }
      }

      setCustomMusiqueTagFieldValue(tag, trackData, FieldKey.DISC_NO);
      setCustomMusiqueTagFieldValue(tag, trackData, FieldKey.DISC_TOTAL);
    }

}
TOP

Related Classes of com.tulskiy.musique.audio.formats.ape.APETagProcessor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.