Search in sources :

Example 1 with ID3v1Tag

use of org.jaudiotagger.tag.id3.ID3v1Tag in project MusicDNA by harjot-oberai.

the class Lyrics3v2 method write.

/**
     * @param file
     * @throws IOException
     */
public void write(RandomAccessFile file) throws IOException {
    int offset = 0;
    long size;
    long filePointer;
    byte[] buffer = new byte[6 + 9];
    String str;
    Lyrics3v2Field field;
    Iterator<Lyrics3v2Field> iterator;
    ID3v1Tag id3v1tag;
    new ID3v1Tag();
    id3v1tag = null;
    delete(file);
    file.seek(file.length());
    filePointer = file.getFilePointer();
    str = "LYRICSBEGIN";
    for (int i = 0; i < str.length(); i++) {
        buffer[i] = (byte) str.charAt(i);
    }
    file.write(buffer, 0, str.length());
    // IND needs to go first. lets createField/update it and write it first.
    updateField("IND");
    field = fieldMap.get("IND");
    field.write(file);
    iterator = fieldMap.values().iterator();
    while (iterator.hasNext()) {
        field = iterator.next();
        String id = field.getIdentifier();
        boolean save = TagOptionSingleton.getInstance().getLyrics3SaveField(id);
        if ((!id.equals("IND")) && save) {
            field.write(file);
        }
    }
    size = file.getFilePointer() - filePointer;
    if (this.getSize() != size) {
    //logger.config("Lyrics3v2 size didn'timer match up while writing.");
    //logger.config("this.getsize()     = " + this.getSize());
    //logger.config("size (filePointer) = " + size);
    }
    str = Long.toString(size);
    for (int i = 0; i < (6 - str.length()); i++) {
        buffer[i] = (byte) '0';
    }
    offset += (6 - str.length());
    for (int i = 0; i < str.length(); i++) {
        buffer[i + offset] = (byte) str.charAt(i);
    }
    offset += str.length();
    str = "LYRICS200";
    for (int i = 0; i < str.length(); i++) {
        buffer[i + offset] = (byte) str.charAt(i);
    }
    offset += str.length();
    file.write(buffer, 0, offset);
    if (id3v1tag != null) {
        id3v1tag.write(file);
    }
}
Also used : ID3v1Tag(org.jaudiotagger.tag.id3.ID3v1Tag)

Example 2 with ID3v1Tag

use of org.jaudiotagger.tag.id3.ID3v1Tag in project frostwire by frostwire.

the class SoundcloudDownload method setAlbumArt.

private static boolean setAlbumArt(SoundcloudSearchResult sr, byte[] cover, String inPath, String outPath) {
    try {
        Mp3File mp3 = new Mp3File(inPath);
        ID3Wrapper newId3Wrapper = new ID3Wrapper(new ID3v1Tag(), new ID3v23Tag());
        newId3Wrapper.setAlbum(sr.getUsername() + ": " + sr.getDisplayName() + " via SoundCloud.com");
        newId3Wrapper.setArtist(sr.getUsername());
        newId3Wrapper.setTitle(sr.getDisplayName());
        newId3Wrapper.setAlbumImage(cover, "image/jpg");
        newId3Wrapper.setUrl(sr.getDetailsUrl());
        newId3Wrapper.getId3v2Tag().setPadding(true);
        mp3.setId3v1Tag(newId3Wrapper.getId3v1Tag());
        mp3.setId3v2Tag(newId3Wrapper.getId3v2Tag());
        mp3.save(outPath);
        return true;
    } catch (Throwable e) {
        LOG.error("Error setting art information for soundcloud download", e);
        return false;
    }
}
Also used : Mp3File(com.frostwire.mp3.Mp3File) ID3Wrapper(com.frostwire.mp3.ID3Wrapper) ID3v1Tag(com.frostwire.mp3.ID3v1Tag) ID3v23Tag(com.frostwire.mp3.ID3v23Tag)

Example 3 with ID3v1Tag

use of org.jaudiotagger.tag.id3.ID3v1Tag in project UniversalMediaServer by UniversalMediaServer.

the class AudioUtils method parseRealAudio.

/**
 * Parses the old RealAudio 1.0 and 2.0 formats that's not supported by
 * neither {@link org.jaudiotagger} nor MediaInfo. Returns {@code false} if
 * {@code channel} isn't one of these formats or the parsing fails.
 * <p>
 * Primary references:
 * <ul>
 * <li><a href="https://wiki.multimedia.cx/index.php/RealMedia">RealAudio on
 * MultimediaWiki</a></li>
 * <li><a
 * href="https://github.com/FFmpeg/FFmpeg/blob/master/libavformat/rmdec.c"
 * >FFmpeg rmdec.c</a></li>
 * </ul>
 *
 * @param channel the {@link Channel} containing the input. Size will only
 *            be parsed if {@code channel} is a {@link FileChannel}
 *            instance.
 * @param media the {@link DLNAMediaInfo} instance to write the parsing
 *            results to.
 * @return {@code true} if the {@code channel} input is in RealAudio 1.0 or
 *         2.0 format and the parsing succeeds; false otherwise
 */
public static boolean parseRealAudio(ReadableByteChannel channel, DLNAMediaInfo media) {
    final byte[] magicBytes = { 0x2E, 0x72, 0x61, (byte) 0xFD };
    ByteBuffer buffer = ByteBuffer.allocate(8);
    buffer.order(ByteOrder.BIG_ENDIAN);
    DLNAMediaAudio audio = new DLNAMediaAudio();
    try {
        int count = channel.read(buffer);
        if (count < 4) {
            LOGGER.trace("Input is too short to be RealAudio");
            return false;
        }
        buffer.flip();
        byte[] signature = new byte[4];
        buffer.get(signature);
        if (!Arrays.equals(magicBytes, signature)) {
            if (LOGGER.isTraceEnabled()) {
                LOGGER.trace("Input signature ({}) mismatches RealAudio version 1.0 or 2.0", new String(signature, StandardCharsets.US_ASCII));
            }
            return false;
        }
        media.setContainer(FormatConfiguration.RA);
        short version = buffer.getShort();
        int reportedHeaderSize = 0;
        int reportedDataSize = 0;
        if (version == 3) {
            audio.setCodecA(FormatConfiguration.REALAUDIO_14_4);
            audio.getAudioProperties().setNumberOfChannels(1);
            audio.getAudioProperties().setSampleFrequency(8000);
            short headerSize = buffer.getShort();
            buffer = ByteBuffer.allocate(headerSize);
            channel.read(buffer);
            buffer.flip();
            buffer.position(8);
            int bytesPerMinute = buffer.getShort() & 0xFFFF;
            reportedDataSize = buffer.getInt();
            byte b = buffer.get();
            if (b != 0) {
                byte[] title = new byte[b & 0xFF];
                buffer.get(title);
                String titleString = new String(title, StandardCharsets.US_ASCII);
                audio.setSongname(titleString);
                audio.setAudioTrackTitleFromMetadata(titleString);
            }
            b = buffer.get();
            if (b != 0) {
                byte[] artist = new byte[b & 0xFF];
                buffer.get(artist);
                audio.setArtist(new String(artist, StandardCharsets.US_ASCII));
            }
            audio.setBitRate(bytesPerMinute * 8 / 60);
            media.setBitrate(bytesPerMinute * 8 / 60);
        } else if (version == 4 || version == 5) {
            buffer = ByteBuffer.allocate(14);
            channel.read(buffer);
            buffer.flip();
            buffer.get(signature);
            if (!".ra4".equals(new String(signature, StandardCharsets.US_ASCII))) {
                LOGGER.debug("Invalid RealAudio 2.0 signature \"{}\"", new String(signature, StandardCharsets.US_ASCII));
                return false;
            }
            reportedDataSize = buffer.getInt();
            // skip version repeated
            buffer.getShort();
            reportedHeaderSize = buffer.getInt();
            buffer = ByteBuffer.allocate(reportedHeaderSize);
            channel.read(buffer);
            buffer.flip();
            // skip codec flavor
            buffer.getShort();
            // skip coded frame size
            buffer.getInt();
            // skip unknown
            buffer.getInt();
            long bytesPerMinute = buffer.getInt() & 0xFFFFFFFFL;
            // skip unknown
            buffer.getInt();
            // skip sub packet
            buffer.getShort();
            // skip frame size
            buffer.getShort();
            // skip sub packet size
            buffer.getShort();
            // skip unknown
            buffer.getShort();
            if (version == 5) {
                // skip unknown
                buffer.position(buffer.position() + 6);
            }
            short sampleRate = buffer.getShort();
            // skip unknown
            buffer.getShort();
            short sampleSize = buffer.getShort();
            short nrChannels = buffer.getShort();
            byte[] fourCC;
            if (version == 4) {
                // skip interleaver id
                buffer.position(buffer.get() + buffer.position());
                fourCC = new byte[buffer.get()];
                buffer.get(fourCC);
            } else {
                // skip deinterlace id
                buffer.getFloat();
                fourCC = new byte[4];
                buffer.get(fourCC);
            }
            String fourCCString = new String(fourCC, StandardCharsets.US_ASCII).toLowerCase(Locale.ROOT);
            switch(fourCCString) {
                case "lpcJ":
                    audio.setCodecA(FormatConfiguration.REALAUDIO_14_4);
                    break;
                case "28_8":
                    audio.setCodecA(FormatConfiguration.REALAUDIO_28_8);
                    break;
                case "dnet":
                    audio.setCodecA(FormatConfiguration.AC3);
                    break;
                case "sipr":
                    audio.setCodecA(FormatConfiguration.SIPRO);
                    break;
                case "cook":
                    audio.setCodecA(FormatConfiguration.COOK);
                case "atrc":
                    audio.setCodecA(FormatConfiguration.ATRAC);
                case "ralf":
                    audio.setCodecA(FormatConfiguration.RALF);
                case "raac":
                    audio.setCodecA(FormatConfiguration.AAC_LC);
                case "racp":
                    audio.setCodecA(FormatConfiguration.HE_AAC);
                default:
                    LOGGER.debug("Unknown RealMedia codec FourCC \"{}\" - parsing failed", fourCCString);
                    return false;
            }
            if (buffer.hasRemaining()) {
                parseRealAudioMetaData(buffer, audio, version);
            }
            audio.setBitRate((int) (bytesPerMinute * 8 / 60));
            media.setBitrate((int) (bytesPerMinute * 8 / 60));
            audio.setBitsperSample(sampleSize);
            audio.getAudioProperties().setNumberOfChannels(nrChannels);
            audio.getAudioProperties().setSampleFrequency(sampleRate);
        } else {
            LOGGER.error("Could not parse RealAudio format - unknown format version {}", version);
            return false;
        }
        media.getAudioTracksList().add(audio);
        long fileSize = 0;
        if (channel instanceof FileChannel) {
            fileSize = ((FileChannel) channel).size();
            media.setSize(fileSize);
        }
        // Duration is estimated based on bitrate and might not be accurate
        if (audio.getBitRate() > 0) {
            int dataSize;
            if (fileSize > 0 && reportedHeaderSize > 0) {
                int fullHeaderSize = reportedHeaderSize + (version == 3 ? 8 : 16);
                if (reportedDataSize > 0) {
                    dataSize = (int) Math.min(reportedDataSize, fileSize - fullHeaderSize);
                } else {
                    dataSize = (int) (fileSize - fullHeaderSize);
                }
            } else {
                dataSize = reportedDataSize;
            }
            media.setDuration((double) dataSize / audio.getBitRate() * 8);
        }
    } catch (IOException e) {
        LOGGER.debug("Error while trying to parse RealAudio version 1 or 2: {}", e.getMessage());
        LOGGER.trace("", e);
        return false;
    }
    if (PMS.getConfiguration() != null && !PMS.getConfiguration().getAudioThumbnailMethod().equals(CoverSupplier.NONE) && (StringUtils.isNotBlank(media.getFirstAudioTrack().getSongname()) || StringUtils.isNotBlank(media.getFirstAudioTrack().getArtist()))) {
        ID3v1Tag tag = new ID3v1Tag();
        if (StringUtils.isNotBlank(media.getFirstAudioTrack().getSongname())) {
            tag.setTitle(media.getFirstAudioTrack().getSongname());
        }
        if (StringUtils.isNotBlank(media.getFirstAudioTrack().getArtist())) {
            tag.setArtist(media.getFirstAudioTrack().getArtist());
        }
        try {
            media.setThumb(DLNAThumbnail.toThumbnail(CoverUtil.get().getThumbnail(tag), 640, 480, ScaleType.MAX, ImageFormat.SOURCE, false));
        } catch (IOException e) {
            LOGGER.error("An error occurred while generating thumbnail for RealAudio source: [\"{}\", \"{}\"]", tag.getFirstTitle(), tag.getFirstArtist());
        }
    }
    media.setThumbready(true);
    media.setMediaparsed(true);
    return true;
}
Also used : DLNAMediaAudio(net.pms.dlna.DLNAMediaAudio) FileChannel(java.nio.channels.FileChannel) IOException(java.io.IOException) ID3v1Tag(org.jaudiotagger.tag.id3.ID3v1Tag) ByteBuffer(java.nio.ByteBuffer)

Example 4 with ID3v1Tag

use of org.jaudiotagger.tag.id3.ID3v1Tag in project MusicDNA by harjot-oberai.

the class AbstractLyrics3 method delete.

/**
     * @param file
     * @throws IOException
     */
public void delete(RandomAccessFile file) throws IOException {
    long filePointer;
    ID3v1Tag id3v1tag = new ID3v1Tag();
}
Also used : ID3v1Tag(org.jaudiotagger.tag.id3.ID3v1Tag)

Example 5 with ID3v1Tag

use of org.jaudiotagger.tag.id3.ID3v1Tag in project MusicDNA by harjot-oberai.

the class Lyrics3v1 method write.

/**
     * @param file
     * @throws IOException
     */
public void write(RandomAccessFile file) throws IOException {
    String str;
    int offset;
    byte[] buffer;
    ID3v1Tag id3v1tag;
    id3v1tag = null;
    delete(file);
    file.seek(file.length());
    buffer = new byte[lyric.length() + 11 + 9];
    str = "LYRICSBEGIN";
    for (int i = 0; i < str.length(); i++) {
        buffer[i] = (byte) str.charAt(i);
    }
    offset = str.length();
    str = ID3Tags.truncate(lyric, 5100);
    for (int i = 0; i < str.length(); i++) {
        buffer[i + offset] = (byte) str.charAt(i);
    }
    offset += str.length();
    str = "LYRICSEND";
    for (int i = 0; i < str.length(); i++) {
        buffer[i + offset] = (byte) str.charAt(i);
    }
    offset += str.length();
    file.write(buffer, 0, offset);
    if (id3v1tag != null) {
        id3v1tag.write(file);
    }
}
Also used : ID3v1Tag(org.jaudiotagger.tag.id3.ID3v1Tag)

Aggregations

ID3v1Tag (org.jaudiotagger.tag.id3.ID3v1Tag)4 ID3Wrapper (com.frostwire.mp3.ID3Wrapper)2 ID3v1Tag (com.frostwire.mp3.ID3v1Tag)2 ID3v23Tag (com.frostwire.mp3.ID3v23Tag)2 Mp3File (com.frostwire.mp3.Mp3File)2 IOException (java.io.IOException)1 ByteBuffer (java.nio.ByteBuffer)1 FileChannel (java.nio.channels.FileChannel)1 ID3v1Tag (net.addradio.codec.id3.model.v1.ID3v1Tag)1 DLNAMediaAudio (net.pms.dlna.DLNAMediaAudio)1