Как получить метаданные из mp3 файлов?

131
22 ноября 2019, 23:00

Я считываю *.mp3 файлы но покуда только по именам, как еще добавить сюда вывод альбома, длительности и путь непосредственно к файлу. Нашёл много инфы и библиотек, но там примеры для одного файла.

public class Main {
    public static void main(String[] args) {
        String path = "D:\\music";
        File dir = new File("D:\\music");
        File[] files = dir.listFiles(new HeyFile());

        for (File fileloop : files) {
            System.out.println(fileloop.getName());
        }
    }
    public class HeyFile implements FileFilter {
        public boolean accept(File file) {
            return file.getName().endsWith(".mp3");
        }
    }
}
Answer 1

Для получение мета-информации о mp3 файле, вы можете использовать apache tika Java API. Можно получить Название, Альбома, Длительности и т.д. (требуется подключить jars tika-parsers-1.4, tika-core-1.4)

Простая программа

package com.parse.mp3;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
import org.apache.tika.parser.mp3.Mp3Parser;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class AudioParser {
    /**
     * @param args
     */
    public static void main(String[] args) {
        String fileLocation = "G:/asas/album/song.mp3";
        try {
            InputStream input = new FileInputStream(new File(fileLocation));
            ContentHandler handler = new DefaultHandler();
            Metadata metadata = new Metadata();
            Parser parser = new Mp3Parser();
            ParseContext parseCtx = new ParseContext();
            parser.parse(input, handler, metadata, parseCtx);
            input.close();
            // List all metadata
            String[] metadataNames = metadata.names();
            for (String name : metadataNames) {
                System.out.println(name + ": " + metadata.get(name));
            }
            // Retrieve the necessary info from metadata
            // Names - title, xmpDM:artist etc. - mentioned below may differ based
            System.out.println("----------------------------------------------");
            System.out.println("Title: " + metadata.get("title"));
            System.out.println("Artists: " + metadata.get("xmpDM:artist"));
            System.out.println("Composer : " + metadata.get("xmpDM:composer"));
            System.out.println("Genre : " + metadata.get("xmpDM:genre"));
            System.out.println("Album : " + metadata.get("xmpDM:album"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (TikaException e) {
            e.printStackTrace();
        }
    }
}

источник ответа

Answer 2

Разобрался и с путем и с длительностью.

Путь: fileloop.getAbsolutePath() просто при выводе это добавил Что насчет длительности, то нашел в интернетах инфу:во первых нужно создать метод и добавить toMinutes(metadata.get("xmpDM:duration"))

public static String toMinutes(String timeInMilis) {
        double milis = Double.valueOf(timeInMilis);
        long second = (long) (milis / 1000) % 60;
        long minute = (long) (milis / (1000 * 60)) % 60;
        long hour = (long) (milis / (1000 * 60 * 60)) % 24;
        return hour != 0 ? String.format("%02dh:%02dm:%02ds", hour, minute, second) : String.format("%02dm:%02ds", minute, second);
    }
READ ALSO
Frontpad api java

Frontpad api java

Я слышал, что у frontpad есть apiМне нужно через Java подключиться к frontpad и отправлять с мобильного приложения заказы

113
Конвертирование String в функцию java.util.function

Конвертирование String в функцию java.util.function

Вот фрагмент кода в котором задан конструктор, принимающий функциональный интерфейс, принимающий и возвращающий DoubleМожно вместо параметра...

121
GraphQL не десериализует java-тип LocalDate

GraphQL не десериализует java-тип LocalDate

У меня в проекте используется GraphQL, и я пытаюсь замапить даты на поле типа LocalDateЗапрос такой:

150
Как искать данные в нижним регистре Firebase database?

Как искать данные в нижним регистре Firebase database?

Поисковить у меня работает так

102