Audio::Ofa::Util - Retrieve audio fingerprints and metadata for unknown audio files


Audio-Ofa-Util documentation  | view source Contained in the Audio-Ofa-Util distribution.

Index


NAME

Top

Audio::Ofa::Util - Retrieve audio fingerprints and metadata for unknown audio files

SYNOPSIS

Top

This module tries to make retrieving audio fingerprints and metadata for unknown audio files as easy as possible. It interfaces with the modules Audio::Ofa and WebService::MusicBrainz, provides a simple LWP based interface to the MusicDNS library, and can make use of Audio::Extract::PCM to read some popular music formats.

The most comprehensive way to use this is to start with a (possibly untagged) file name and get full metadata:

    my $util = Audio::Ofa::Util->new(filename => 'song.ogg');
    my @tracks = $util->musicbrainz_lookup or die $util->error;
    for (@tracks) {
        print 'Artist: ', $_->artist, "\n";
        print 'Title:  ', $_->title, "\n";
        print 'Track:  ', $_->track, "\n";
        print 'Album:  ', $_->album, "\n\n";
    }

To create an audio fingerprint:

    my $util = Audio::Ofa::Util->new(filename => 'song.ogg');
    $util->analyze_file or die $util->error;
    print $util->fingerprint, "\n";

To create a fingerprint and look it up at MusicDNS:

    my $util = Audio::Ofa::Util->new(filename => 'song.ogg');
    $util->musicdns_lookup or die $util->error; # calls analyze_file implicitly
    print $util->artist, ' - ', $util->title, "\n";

To look up a known fingerprint at MusicDNS (you need the length of the song, too):

    my $util = Audio::Ofa::Util->new(fingerprint => $fp, duration => $millisecs);

The overall process goes like this:

ACCESSORS

Top

filename

See analyze_file.

fingerprint, duration

See analyze_file and musicdns_lookup.

client_id, client_version, metadata, bitrate, extension, artist, title, album, track, genre, year, puids

See musicdns_lookup.

Note that puids accesses an array reference. If it is not defined or not set, it means that no PUID has been looked up yet. If it is an empty array, it means that no PUIDs were found.

error

Description of the last error that happened.

METHODS

Top

new

Constructor. Accepts key-value pairs as initializers for all of the fields, c.f. ACCESSORS, but currently only the following calls make sense:

    Audio::Ofa::Util->new(filename => $filename);
    Audio::Ofa::Util->new(fingerprint => $fp, duration => $dur);
    Audio::Ofa::Util->new(puid => $puid);

analyze_file

This creates an Audio Fingerprint of a sound file. The audio file is read using Audio::Extract::PCM, which currently uses the extarnal "sox" program and supports encodings such as MP3, Ogg/Vorbis and many others.

You must set filename before calling this method.

The fingerprint is calculated by ofa_create_print in Audio::Ofa, and the fingerprint field of the object will be set. Additionally, the duration (in milliseconds) and the extension will be set to the values provided by the file name.

In case of an error, an empty list is returned and the error message can be retrieved via error. Otherwise, a true value will be returned.

musicdns_lookup

This looks up a track at the MusicDNS web service.

To do a fingerprint lookup, the keys fingerprint and duration must be present, where duration is the length of the song in milli seconds. Additionally, the following fields (defaults in parentheses) will be sent to the MusicDNS service:

client_id (hardcoded client id), client_version (module name and version), fingerprint, metadata (1), bitrate (0), extension ("unknown"), duration, artist ("unknown"), title ("unknown"), album ("unknown"), track (0), genre ("unknown"), year (0).

To do a fingerprint lookup, fingerprint and duration must have been set (can be given to new), where duration is the song length in milli seconds.

If fingerprint hasn't been set, analyze_file is called implicitly.

client_id defaults to a hard-coded Client ID. You can get your own from http://www.musicip.com.

You should set as much of the above-mentioned metadata (like artist, etc.) as you have available, because the MusicDNS terms of service require this in order to help clean errors in their database.

In the case of an error, musicdns_lookup returns an empty list and the error message can be retrieved with the error method.

In the case of success, musicdns_lookup sets the fields puids to the found PUIDs, and sets the fields artist and title to the first of the found values, and returns a true value. In list context, it returns a list of objects which have artist, title and puid methods.

musicbrainz_lookup

This looks up a PUID at MusicBrainz. The PUID can come from a call to musicdns_lookup. In fact this is implicitly done if there is no PUID stored in the object (cf. SYNOPSIS).

This returns a list of WebService::MusicBrainz::Response::Track objects on success, or the first of them in scalar context. Otherwise it returns an empty list and the error message can be retrieved via the error method.

This method returns a list of tracks or the first track in scalar context. The tracks are represented as objects that are guaranteed to have the methods artist, title, album, track and wsres, where the latter is an WebService::MusicBrainz::Response::Track object, and the four former return values that have been retrieved from that object for your convenience.

In the case of an error, an empty list is returned and the error can be returned via the error method.

SEE ALSO

Top

LICENSE

Top

This module is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (GPL) as published by the Free Software Foundation (http://www.fsf.org/); either version 2 of the License, or (at your option) any later version.

The GPL, which is quite restrictive (when compared to LGPL or Artistic), seems to be necessary because of libofa's licenses, but IANAL and if you need a license change please contact me.

Please note that in addition to the license which allows you to use this software, the MusicDNS web service has its own terms of service. The most important fact is that you can use it for free unless you use it commercially. See http://www.musicdns.org for more information. You are encouraged to register your own client id (for free) if you build a client on top of this module.

AUTHOR

Top

Christoph Bussenius (pepe at cpan.org)

Please mention the module's name in the subject of your mails so that they will not be lost in the spam.

If you find this module useful I'll be glad if you drop me a note.


Audio-Ofa-Util documentation  | view source Contained in the Audio-Ofa-Util distribution.