Index: SQL/SQLite/dbcreate.sql =================================================================== --- SQL/SQLite/dbcreate.sql (revision 4218) +++ SQL/SQLite/dbcreate.sql (working copy) @@ -55,6 +55,7 @@ lyrics text, -- lyrics for this track moodlogic_mixable integer, musicmagic_mixable integer, + musicbrainz_id varchar, multialbumsortkey varchar -- used for sorting tracks in multi album lists ); @@ -107,6 +108,7 @@ artwork_path varchar, -- path to cover art disc integer, -- album number in set discc integer, -- number of albums in set + musicbrainz_id varchar, musicmagic_mixable integer ); @@ -125,6 +127,7 @@ namesearch varchar, -- version of name used for search matching moodlogic_id integer, -- these will eventually be dynamically created by the plugin moodlogic_mixable integer, + musicbrainz_id varchar, musicmagic_mixable integer ); Index: SQL/mysql/dbcreate.sql =================================================================== --- SQL/mysql/dbcreate.sql (revision 4218) +++ SQL/mysql/dbcreate.sql (working copy) @@ -63,6 +63,7 @@ moodlogic_id int(10) unsigned, moodlogic_mixable tinyint(1) unsigned, musicmagic_mixable tinyint(1) unsigned, + musicbrainz_id varchar(40), multialbumsortkey text, INDEX trackTitleIndex (title), INDEX trackAlbumIndex (album), @@ -119,6 +120,7 @@ artwork_path varchar(255), disc tinyint(1) unsigned, discc tinyint(1) unsigned, + musicbrainz_id varchar(40), musicmagic_mixable tinyint(1) unsigned, INDEX albumsTitleIndex (title), INDEX albumsSortIndex (titlesort), @@ -139,6 +141,7 @@ namesearch varchar(255), moodlogic_id int(10) unsigned, moodlogic_mixable tinyint(1) unsigned, + musicbrainz_id varchar(40), musicmagic_mixable tinyint(1) unsigned, INDEX contributorsNameIndex (name), INDEX contributorsSortIndex (namesort), Index: Slim/DataStores/DBI/Track.pm =================================================================== --- Slim/DataStores/DBI/Track.pm (revision 4218) +++ Slim/DataStores/DBI/Track.pm (working copy) @@ -52,6 +52,7 @@ 'moodlogic_id' => 'moodlogic_id', 'moodlogic_mixable' => 'moodlogic_mixable', 'musicmagic_mixable' => 'musicmagic_mixable', + 'musicbrainz_id' => 'musicbrainz_id', 'playCount' => 'playCount', 'lastPlayed' => 'lastPlayed', 'lossless' => 'lossless', @@ -136,6 +137,13 @@ return wantarray ? @items : $items[0]; } +sub musicbrainzId { + my $self = shift; + + my ($musicbrainzId) = $self->_attrs('musicbrainz_id'); + return $musicbrainzId; +} + sub albumid { my $self = shift; Index: Slim/DataStores/DBI/Contributor.pm =================================================================== --- Slim/DataStores/DBI/Contributor.pm (revision 4218) +++ Slim/DataStores/DBI/Contributor.pm (working copy) @@ -14,7 +14,7 @@ $class->columns(Essential => qw/name namesort moodlogic_id moodlogic_mixable musicmagic_mixable/); - $class->columns(Others => qw/namesearch/); + $class->columns(Others => qw/namesearch musicbrainz_id/); $class->columns(Stringify => qw/name/); @@ -27,6 +27,13 @@ return \@fields; } +sub musicbrainzId { + my $self = shift; + + my ($musicbrainzId) = $self->_attrs('musicbrainz_id'); + return $musicbrainzId; +} + 1; __END__ Index: Slim/DataStores/DBI/DBIStore.pm =================================================================== --- Slim/DataStores/DBI/DBIStore.pm (revision 4218) +++ Slim/DataStores/DBI/DBIStore.pm (working copy) @@ -1345,7 +1345,9 @@ # Push these back until we have a Track object. for my $tag (qw( COMMENT BAND COMPOSER CONDUCTOR GENRE ARTIST ARTISTSORT - PIC APIC ALBUM ALBUMSORT DISCC ALBUMARTIST COMPILATION)) { + PIC APIC ALBUM ALBUMSORT DISCC ALBUMARTIST COMPILATION + MUSICBRAINZ_ARTIST_ID MUSICBRAINZ_ALBUM_ARTIST_ID + MUSICBRAINZ_ALBUM_ID MUSICBRAINZ_ALBUM_TYPE MUSICBRAINZ_ALBUM_STATUS)) { next unless defined $attributes->{$tag}; @@ -1542,6 +1544,8 @@ $albumObj->compilation(1) if $attributes->{'COMPILATION'}; + $albumObj->musicbrainz_id($attributes->{'MUSICBRAINZ_ALBUM_ID'}); + $albumObj->disc($disc) if $disc; $albumObj->discc($discc) if $discc; $albumObj->year($track->year) if $track->year; @@ -1686,8 +1690,15 @@ # Is ARTISTSORT/TSOP always right for non-artist # contributors? I think so. ID3 doesn't have # "BANDSORT" or similar at any rate. + my $contributorMBId; + + $contributorMBId = $attributes->{'MUSICBRAINZ_ALBUM_ARTIST_ID'} if ($tag eq 'ALBUMARTIST'); + $contributorMBId = $attributes->{'MUSICBRAINZ_ARTIST_ID'} if ($tag eq 'ARTIST'); + $contributorMBId = $attributes->{'MUSICBRAINZ_ARTIST_ID'} if ($tag eq 'TRACKARTIST'); + push @contributors, Slim::DataStores::DBI::ContributorTrack->add( $contributor, + $contributorMBId, $Slim::DataStores::DBI::ContributorTrack::contributorToRoleMap{$tag}, $track, $tag eq 'ARTIST' ? $attributes->{'ARTISTSORT'} : undef, Index: Slim/DataStores/DBI/ContributorTrack.pm =================================================================== --- Slim/DataStores/DBI/ContributorTrack.pm (revision 4218) +++ Slim/DataStores/DBI/ContributorTrack.pm (working copy) @@ -43,6 +43,7 @@ sub add { my $class = shift; my $artist = shift; + my $artistMBId = shift; my $role = shift; my $track = shift; my $artistSort = shift || $artist; @@ -86,6 +87,7 @@ $artistObj->name($name); $artistObj->namesort($sort); + $artistObj->musicbrainz_id($artistMBId); $artistObj->update; push @contributors, $artistObj; Index: Slim/DataStores/DBI/Album.pm =================================================================== --- Slim/DataStores/DBI/Album.pm (revision 4218) +++ Slim/DataStores/DBI/Album.pm (working copy) @@ -14,7 +14,7 @@ $class->columns(Essential => qw/title titlesort contributor compilation year artwork_path disc discc musicmagic_mixable/); - $class->columns(Others => qw/titlesearch/); + $class->columns(Others => qw/titlesearch musicbrainz_id/); $class->columns(Stringify => qw/title/); @@ -38,6 +38,13 @@ return Slim::Music::Info::addDiscNumberToAlbumTitle( $self->get(qw(title disc discc)) ); } +sub musicbrainzId { + my $self = shift; + + my ($musicbrainzId) = $self->_attrs('musicbrainz_id'); + return $musicbrainzId; +} + 1; __END__ Index: Slim/Formats/FLAC.pm =================================================================== --- Slim/Formats/FLAC.pm (revision 4218) +++ Slim/Formats/FLAC.pm (working copy) @@ -20,7 +20,6 @@ use Audio::FLAC::Header; use File::Basename; use IO::Seekable qw(SEEK_SET); -use MP3::Info (); use Slim::Formats::Parse; use Slim::Utils::Misc; @@ -30,7 +29,15 @@ 'TRACKNUMBER' => 'TRACKNUM', 'DISCNUMBER' => 'DISC', 'URL' => 'URLTAG', - 'musicbrainz_sortname' => 'ARTISTSORT', + 'musicbrainz_sortname' => 'ARTISTSORT', + 'MUSICBRAINZ_ALBUMARTISTID' => 'MUSICBRAINZ_ALBUM_ARTIST_ID', + 'MUSICBRAINZ_ALBUMID' => 'MUSICBRAINZ_ALBUM_ID', + 'MUSICBRAINZ_ALBUMSTATUS' => 'MUSICBRAINZ_ALBUM_STATUS', + 'MUSICBRAINZ_ALBUMTYPE' => 'MUSICBRAINZ_ALBUM_TYPE', + 'MUSICBRAINZ_ARTISTID' => 'MUSICBRAINZ_ARTIST_ID', + 'MUSICBRAINZ_SORTNAME' => 'MUSICBRAINZ_SORTNAME', + 'MUSICBRAINZ_TRACKID' => 'MUSICBRAINZ_ID', + 'MUSICBRAINZ_TRMID' => 'MUSICBRAINZ_TRM_ID', ); my @tagNames = qw(ALBUM ARTIST BAND COMPOSER CONDUCTOR DISCNUMBER TITLE TRACKNUMBER DATE); Index: Slim/Formats/Ogg.pm =================================================================== --- Slim/Formats/Ogg.pm (revision 4218) +++ Slim/Formats/Ogg.pm (working copy) @@ -25,6 +25,13 @@ 'TRACKNUMBER' => 'TRACKNUM', 'DISCNUMBER' => 'DISC', 'URL' => 'URLTAG', + 'MUSICBRAINZ_ALBUMARTISTID' => 'MUSICBRAINZ_ALBUM_ARTIST_ID', + 'MUSICBRAINZ_ALBUMID' => 'MUSICBRAINZ_ALBUM_ID', + 'MUSICBRAINZ_ALBUMSTATUS' => 'MUSICBRAINZ_ALBUM_STATUS', + 'MUSICBRAINZ_ALBUMTYPE' => 'MUSICBRAINZ_ALBUM_TYPE', + 'MUSICBRAINZ_ARTISTID' => 'MUSICBRAINZ_ARTIST_ID', + 'MUSICBRAINZ_TRACKID' => 'MUSICBRAINZ_ID', + 'MUSICBRAINZ_TRMID' => 'MUSICBRAINZ_TRM_ID', ); # Given a file, return a hash of name value pairs, Index: Slim/Formats/MP3.pm =================================================================== --- Slim/Formats/MP3.pm (revision 4218) +++ Slim/Formats/MP3.pm (working copy) @@ -13,6 +13,16 @@ use Slim::Utils::Misc; +my %tagMapping = ( + 'Unique file identifier' => 'MUSICBRAINZ_ID', + 'MusicBrainz Album Artist Id' => 'MUSICBRAINZ_ALBUM_ARTIST_ID', + 'MusicBrainz Album Id' => 'MUSICBRAINZ_ALBUM_ID', + 'MusicBrainz Album Status' => 'MUSICBRAINZ_ALBUM_STATUS', + 'MusicBrainz Album Type' => 'MUSICBRAINZ_ALBUM_TYPE', + 'MusicBrainz Artist Id' => 'MUSICBRAINZ_ARTIST_ID', + 'MusicBrainz TRM Id' => 'MUSICBRAINZ_TRM_ID', +); + # Don't try and convert anything to latin1 if ($] > 5.007) { @@ -32,6 +42,8 @@ my $tags = MP3::Info::get_mp3tag($fh); my $info = MP3::Info::get_mp3info($fh); + doTagMapping($tags); + # we'll always have $info, as it's machine generated. if ($tags && $info) { %$info = (%$info, %$tags); @@ -66,6 +78,17 @@ } +sub doTagMapping { + my $tags = shift; + + # map the existing tag names to the expected tag names + while (my ($old,$new) = each %tagMapping) { + if (exists $tags->{$old}) { + $tags->{$new} = delete $tags->{$old}; + } + } +} + my $MINFRAMELEN = 96; # 144 * 32000 kbps / 48000 kHz + 0 padding my $MAXDISTANCE = 8192; # (144 * 320000 kbps / 32000 kHz + 1 padding + fudge factor) for garbage data * 2 frames