Search in sources :

Example 1 with FlacTag

use of org.jaudiotagger.tag.flac.FlacTag in project MusicDNA by harjot-oberai.

the class FlacTagCreator method convert.

/**
     * @param tag
     * @param paddingSize extra padding to be added
     * @return
     * @throws UnsupportedEncodingException
     */
public ByteBuffer convert(Tag tag, int paddingSize) throws UnsupportedEncodingException {
    logger.config("Convert flac tag:padding:" + paddingSize);
    FlacTag flacTag = (FlacTag) tag;
    int tagLength = 0;
    ByteBuffer vorbiscomment = null;
    if (flacTag.getVorbisCommentTag() != null) {
        vorbiscomment = creator.convert(flacTag.getVorbisCommentTag());
        tagLength = vorbiscomment.capacity() + MetadataBlockHeader.HEADER_LENGTH;
    }
    for (MetadataBlockDataPicture image : flacTag.getImages()) {
        tagLength += image.getBytes().length + MetadataBlockHeader.HEADER_LENGTH;
    }
    logger.config("Convert flac tag:taglength:" + tagLength);
    ByteBuffer buf = ByteBuffer.allocate(tagLength + paddingSize);
    MetadataBlockHeader vorbisHeader;
    //If there are other metadata blocks
    if (flacTag.getVorbisCommentTag() != null) {
        if ((paddingSize > 0) || (flacTag.getImages().size() > 0)) {
            vorbisHeader = new MetadataBlockHeader(false, BlockType.VORBIS_COMMENT, vorbiscomment.capacity());
        } else {
            vorbisHeader = new MetadataBlockHeader(true, BlockType.VORBIS_COMMENT, vorbiscomment.capacity());
        }
        buf.put(vorbisHeader.getBytes());
        buf.put(vorbiscomment);
    }
    //Images
    ListIterator<MetadataBlockDataPicture> li = flacTag.getImages().listIterator();
    while (li.hasNext()) {
        MetadataBlockDataPicture imageField = li.next();
        MetadataBlockHeader imageHeader;
        if (paddingSize > 0 || li.hasNext()) {
            imageHeader = new MetadataBlockHeader(false, BlockType.PICTURE, imageField.getLength());
        } else {
            imageHeader = new MetadataBlockHeader(true, BlockType.PICTURE, imageField.getLength());
        }
        buf.put(imageHeader.getBytes());
        buf.put(imageField.getBytes());
    }
    //Padding
    logger.config("Convert flac tag at" + buf.position());
    if (paddingSize > 0) {
        int paddingDataSize = paddingSize - MetadataBlockHeader.HEADER_LENGTH;
        MetadataBlockHeader paddingHeader = new MetadataBlockHeader(true, BlockType.PADDING, paddingDataSize);
        MetadataBlockDataPadding padding = new MetadataBlockDataPadding(paddingDataSize);
        buf.put(paddingHeader.getBytes());
        buf.put(padding.getBytes());
    }
    buf.rewind();
    return buf;
}
Also used : MetadataBlockHeader(org.jaudiotagger.audio.flac.metadatablock.MetadataBlockHeader) FlacTag(org.jaudiotagger.tag.flac.FlacTag) ByteBuffer(java.nio.ByteBuffer) MetadataBlockDataPicture(org.jaudiotagger.audio.flac.metadatablock.MetadataBlockDataPicture) MetadataBlockDataPadding(org.jaudiotagger.audio.flac.metadatablock.MetadataBlockDataPadding)

Example 2 with FlacTag

use of org.jaudiotagger.tag.flac.FlacTag in project MusicDNA by harjot-oberai.

the class FlacTagReader method read.

public FlacTag read(RandomAccessFile raf) throws CannotReadException, IOException {
    FlacStreamReader flacStream = new FlacStreamReader(raf);
    flacStream.findStream();
    //Hold the metadata
    VorbisCommentTag tag = null;
    List<MetadataBlockDataPicture> images = new ArrayList<MetadataBlockDataPicture>();
    //Seems like we have a valid stream
    boolean isLastBlock = false;
    while (!isLastBlock) {
        if (logger.isLoggable(Level.CONFIG)) {
            logger.config("Looking for MetaBlockHeader at:" + raf.getFilePointer());
        }
        //Read the header
        MetadataBlockHeader mbh = MetadataBlockHeader.readHeader(raf);
        if (mbh == null) {
            break;
        }
        if (logger.isLoggable(Level.CONFIG)) {
            logger.config("Reading MetadataBlockHeader:" + mbh.toString() + " ending at " + raf.getFilePointer());
        }
        //JAUDIOTAGGER-466:CBlocktype can be null
        if (mbh.getBlockType() != null) {
            switch(mbh.getBlockType()) {
                //We got a vorbiscomment comment block, parse it
                case VORBIS_COMMENT:
                    byte[] commentHeaderRawPacket = new byte[mbh.getDataLength()];
                    raf.read(commentHeaderRawPacket);
                    tag = vorbisCommentReader.read(commentHeaderRawPacket, false);
                    break;
                case PICTURE:
                    try {
                        MetadataBlockDataPicture mbdp = new MetadataBlockDataPicture(mbh, raf);
                        images.add(mbdp);
                    } catch (IOException ioe) {
                        logger.warning("Unable to read picture metablock, ignoring:" + ioe.getMessage());
                    } catch (InvalidFrameException ive) {
                        logger.warning("Unable to read picture metablock, ignoring" + ive.getMessage());
                    }
                    break;
                //This is not a metadata block we are interested in so we skip to next block
                default:
                    if (logger.isLoggable(Level.CONFIG)) {
                        logger.config("Ignoring MetadataBlock:" + mbh.getBlockType());
                    }
                    raf.seek(raf.getFilePointer() + mbh.getDataLength());
                    break;
            }
        }
        isLastBlock = mbh.isLastBlock();
        mbh = null;
    }
    //just initialize Flac with an empty VorbisTag
    if (tag == null) {
        tag = VorbisCommentTag.createNewTag();
    }
    FlacTag flacTag = new FlacTag(tag, images);
    return flacTag;
}
Also used : MetadataBlockHeader(org.jaudiotagger.audio.flac.metadatablock.MetadataBlockHeader) FlacTag(org.jaudiotagger.tag.flac.FlacTag) ArrayList(java.util.ArrayList) IOException(java.io.IOException) VorbisCommentTag(org.jaudiotagger.tag.vorbiscomment.VorbisCommentTag) InvalidFrameException(org.jaudiotagger.tag.InvalidFrameException) MetadataBlockDataPicture(org.jaudiotagger.audio.flac.metadatablock.MetadataBlockDataPicture)

Example 3 with FlacTag

use of org.jaudiotagger.tag.flac.FlacTag in project MusicDNA by harjot-oberai.

the class FlacTagWriter method delete.

/**
     * Delete Tag from file
     *
     * @param raf
     * @param tempRaf
     * @throws IOException
     * @throws CannotWriteException
     */
public void delete(RandomAccessFile raf, RandomAccessFile tempRaf) throws IOException, CannotWriteException {
    //This will save the file without any Comment or PictureData blocks  
    FlacTag emptyTag = new FlacTag(null, new ArrayList<MetadataBlockDataPicture>());
    raf.seek(0);
    tempRaf.seek(0);
    write(emptyTag, raf, tempRaf);
}
Also used : FlacTag(org.jaudiotagger.tag.flac.FlacTag)

Aggregations

FlacTag (org.jaudiotagger.tag.flac.FlacTag)3 MetadataBlockDataPicture (org.jaudiotagger.audio.flac.metadatablock.MetadataBlockDataPicture)2 MetadataBlockHeader (org.jaudiotagger.audio.flac.metadatablock.MetadataBlockHeader)2 IOException (java.io.IOException)1 ByteBuffer (java.nio.ByteBuffer)1 ArrayList (java.util.ArrayList)1 MetadataBlockDataPadding (org.jaudiotagger.audio.flac.metadatablock.MetadataBlockDataPadding)1 InvalidFrameException (org.jaudiotagger.tag.InvalidFrameException)1 VorbisCommentTag (org.jaudiotagger.tag.vorbiscomment.VorbisCommentTag)1