I've exhausted my research for getting the title and duration from a music file. I've tried adding event listeners and even though the seemingly appropriate methods in those listeners get called, they appear to get called as soon as the process for getting metadata starts instead of when that process ends.
So far, this brittle MVC example is the only one that seems to work reliably. There are two problems with this code:
import uk.co.caprica.vlcj.media.Meta;
import uk.co.caprica.vlcj.media.Media;
import uk.co.caprica.vlcj.factory.MediaPlayerFactory;
import uk.co.caprica.vlcj.player.base.MediaPlayer;
import com.sun.jna.NativeLibrary;
public class Test2 {
public static void main(String[] args) {
NativeLibrary.addSearchPath("libvlc", "lib");
System.setProperty("jna.library.path", "lib");
System.setProperty("VLC_PLUGIN_PATH", "plugins");
MediaPlayerFactory factory = new MediaPlayerFactory();
for (String mediaPath : args) {
Media media = factory.media().newMedia(mediaPath);
media.parsing().parse();
try {Thread.sleep(30);} catch (Throwable ex) {} // brittle
System.out.printf(" Title: %s\n", media.meta().get(Meta.TITLE));
System.out.printf("Duration: %d(ms)\n", media.info().duration());
media.release();
}
factory.release();
}
}
I've also looked for classes that reveal processing state but came up empty.
I'm using vlcj 4.8.3 with jna 5.13.0.
Here's one way, you can deal with the asynchronicity in various ways:
package demo;
import uk.co.caprica.vlcj.factory.MediaPlayerFactory;
import uk.co.caprica.vlcj.media.Media;
import uk.co.caprica.vlcj.media.MediaEventAdapter;
import uk.co.caprica.vlcj.media.MediaParsedStatus;
import uk.co.caprica.vlcj.media.MetaData;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean;
public class ParseDemo {
public static void main(String[] args) throws Exception {
if (args.length != 1) {
System.out.println("Specify MRL");
System.exit(1);
}
MediaPlayerFactory mpf = new MediaPlayerFactory("--quiet");
Media media = mpf.media().newMedia(args[0]);
CountDownLatch latch = new CountDownLatch(1);
AtomicBoolean parsed = new AtomicBoolean(false);
media.events().addMediaEventListener(new MediaEventAdapter() {
@Override
public void mediaParsedChanged(Media media, MediaParsedStatus newStatus) {
System.out.printf("Parsed changed: %s%n", newStatus);
switch (newStatus) {
case SKIPPED:
case FAILED:
case TIMEOUT:
latch.countDown();
break;
case DONE:
parsed.set(true);
latch.countDown();
break;
}
}
});
media.parsing().parse();
latch.await();
if (!parsed.get()) {
System.out.println("Failed to parse");
System.exit(0);
}
MetaData md = media.meta().asMetaData();
System.out.printf("Parsed: %s%n", md);
}
}
Sample output with vlcj-4.8.3:
Parsed changed: DONE
Parsed: MetaData[values={ALBUM=Night at the Grindhouse, ALBUM_ARTIST=STRNGR & Destryur, TRACK_NUMBER=9, TITLE=Corpse Boogie, ARTIST=STRNGR & Destryur, GENRE=Dance/Electronic, DISC_NUMBER=1},extraValues{}]
Event listener/adapter here: