MusicBrainz-Collection
view release on metacpan or search on metacpan
lib/MusicBrainz/Collection.pm view on Meta::CPAN
user => $opts{user} || '',
pass => $opts{pass} || '',
albums => {},
verbose => $opts{verbose} || 0,
};
bless $self, $class;
if ( !$self->{user} ) {
$self->_load_auth;
unless ( $self->{user} && $self->{pass} ) {
die "No login information found\n";
}
}
return $self;
}
sub process {
my ( $self, $dir ) = @_;
if ( my $albums = $self->_find_albums($dir) ) {
print "Uploading " . scalar( @{$albums} ) . " albums to collection...\n";
my $ua = LWP::UserAgent->new;
$ua->credentials(
'musicbrainz.org:80',
'musicbrainz.org',
$self->{user} => $self->{pass}
);
my $req = POST "http://musicbrainz.org/ws/1/collection/", [
addAlbums => join( ',', @{$albums} ),
];
$self->{verbose} && print $req->as_string;
my $response = $ua->request($req);
if ( $response->is_success ) {
print "Done!\n";
}
else {
print "Error: " . $response->status_line . "\n";
}
}
else {
print "No album ID tags found\n";
}
}
sub _load_auth {
my $self = shift;
require File::Spec;
my $file = File::Spec->catfile( $ENV{HOME}, '.musicbrainz' );
if ( -e $file ) {
open my $fh, '<', $file or die "Unable to read .musicbrainz file: $!\n";
my $prefs = do { local $/; <$fh> };
close $fh;
($self->{user}) = $prefs =~ m/user\s+(.+)/;
($self->{pass}) = $prefs =~ m/pass\s+(.+)/;
}
}
sub _find_albums {
my ( $self, $dir ) = @_;
my $iter = File::Next::files( {
file_filter => sub { Audio::Scan->is_supported( $File::Next::name ) },
}, $dir );
# Speed up scanning a bit by ignoring artwork
local $ENV{AUDIO_SCAN_NO_ARTWORK} = 1;
while ( defined ( my $file = $iter->() ) ) {
$self->{verbose} && print "$file\n";
my $s = Audio::Scan->scan_tags($file);
my $tags = $s->{tags};
my $albumid
= $tags->{'MusicBrainz Album Id'}
|| $tags->{'MUSICBRAINZ ALBUM ID'}
|| $tags->{'MUSICBRAINZ_ALBUMID'}
|| $tags->{'MusicBrainz/Album Id'};
if ( $albumid ) {
$self->{albums}->{$albumid} = 1;
}
}
return [ keys %{ $self->{albums} } ];
}
1;
__END__
=head1 NAME
MusicBrainz::Collection - Upload album collection list to MusicBrainz
=head1 SYNOPSIS
use MusicBrainz::Collection;
my $mbcol = MusicBrainz::Collection->new(
user => 'musicbrainz@example.com',
pass => '12345',
);
$mbcol->process('/path/to/music');
=head1 DESCRIPTION
This script uploads a list of all albums found in a given directory that contain
MusicBrainz Album ID tags. This list can be used by the MusicBrainz website for various
purposes such as determining missing albums by your favorite artists, notifying you
about new releases, and so on.
Supported file formats (from L<Audio::Scan>):
MP3, MP4, FLAC, Ogg Vorbis, WMA, WAV, AIFF, Musepack, Monkey's Audio
( run in 1.311 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )