From: Ian Beckwith Date: Sun, 31 Oct 2010 22:40:25 +0000 (+0000) Subject: new special tags: channels, samplerate, bitrate X-Git-Url: http://erislabs.net/gitweb/?p=id3fs.git;a=commitdiff_plain;h=4f5ee0606c8b9726493ffab0e97872c670498184 new special tags: channels, samplerate, bitrate --- diff --git a/lib/ID3FS/AudioFile.pm b/lib/ID3FS/AudioFile.pm index 3091ed0..e020b43 100644 --- a/lib/ID3FS/AudioFile.pm +++ b/lib/ID3FS/AudioFile.pm @@ -89,6 +89,9 @@ sub delete_comment { shift->{audiofile}->delete_comment(); } sub delete_all { shift->{audiofile}->delete_all(); } sub delete_genre { shift->{audiofile}->delete_genre(); } sub delete_tags { shift->{audiofile}->delete_tags(@_); } +sub channels { shift->{audiofile}->channels(); } +sub bitrate { shift->{audiofile}->bitrate(); } +sub samplerate { shift->{audiofile}->samplerate(@_); } sub year { diff --git a/lib/ID3FS/AudioFile/Mp3.pm b/lib/ID3FS/AudioFile/Mp3.pm index d51e0b0..b4f340c 100644 --- a/lib/ID3FS/AudioFile/Mp3.pm +++ b/lib/ID3FS/AudioFile/Mp3.pm @@ -19,6 +19,7 @@ package ID3FS::AudioFile::Mp3; use strict; use warnings; use MP3::Tag; +use MP3::Info; sub new { @@ -28,7 +29,8 @@ sub new bless($self,$class); $self->{path}=shift; - $self->{mp3}=MP3::Tag->new($self->{path}); + $self->{mp3tag}=MP3::Tag->new($self->{path}); + $self->{mp3info}=MP3::Info->new($self->{path}); $self->get_tags(); $self->{tags}={}; @@ -39,16 +41,16 @@ sub set { my ($self, $func, $value)=@_; return $self->choose($func) unless($value); - unless(exists($self->{mp3}->{ID3v1})) + unless(exists($self->{mp3tag}->{ID3v1})) { - $self->{mp3}->new_tag("ID3v1"); + $self->{mp3tag}->new_tag("ID3v1"); } - unless(exists($self->{mp3}->{ID3v2})) + unless(exists($self->{mp3tag}->{ID3v2})) { - $self->{mp3}->new_tag("ID3v2"); + $self->{mp3tag}->new_tag("ID3v2"); } my $method=$func . "_set"; - $self->{mp3}->$method($value, 1); + $self->{mp3tag}->$method($value, 1); return $value; } @@ -56,13 +58,13 @@ sub choose { my($self, $func)=@_; my $thing=undef; - if(exists($self->{mp3}->{ID3v2})) + if(exists($self->{mp3tag}->{ID3v2})) { - $thing=$self->{mp3}->{ID3v2}->$func(); + $thing=$self->{mp3tag}->{ID3v2}->$func(); } - if(exists($self->{mp3}->{ID3v1}) && (!defined($thing) || !length($thing))) + if(exists($self->{mp3tag}->{ID3v1}) && (!defined($thing) || !length($thing))) { - $thing=$self->{mp3}->{ID3v1}->$func(); + $thing=$self->{mp3tag}->{ID3v1}->$func(); } return $thing; } @@ -82,8 +84,8 @@ sub v1genre my($self, $val)=@_; if($val) { - $self->{mp3}->new_tag("ID3v1") unless(defined($self->{mp3}->{ID3v1})); - $self->{mp3}->{ID3v1}->genre($val); + $self->{mp3tag}->new_tag("ID3v1") unless(defined($self->{mp3tag}->{ID3v1})); + $self->{mp3tag}->{ID3v1}->genre($val); return $val; } my $genre=undef; @@ -94,8 +96,8 @@ sub v1genre sub tags { my $self=shift; - return() unless(exists($self->{mp3}->{ID3v2}) && defined($self->{mp3}->{ID3v2})); - return($self->{mp3}->{ID3v2}->genre()); + return() unless(exists($self->{mp3tag}->{ID3v2}) && defined($self->{mp3tag}->{ID3v2})); + return($self->{mp3tag}->{ID3v2}->genre()); } sub get_tags @@ -109,7 +111,7 @@ sub get_tags { $oldout=select(NULL); } - eval { $self->{mp3}->get_tags; }; + eval { $self->{mp3tag}->get_tags; }; warn("$self->{path}: $@\n") if($@); if(defined($oldout)) { @@ -128,11 +130,10 @@ sub add_tags return($self->set("genre", $genre)); } - sub write { my $self=shift; - $self->{mp3}->update_tags(); + $self->{mp3tag}->update_tags(); } sub delete_artist { shift->delete("artist"); } @@ -170,13 +171,13 @@ sub delete_tags sub delete_all { my($self)=@_; - if(exists($self->{mp3}->{ID3v1})) + if(exists($self->{mp3tag}->{ID3v1})) { - $self->{mp3}->{ID3v1}->remove_tag; + $self->{mp3tag}->{ID3v1}->remove_tag; } - if(exists($self->{mp3}->{ID3v2})) + if(exists($self->{mp3tag}->{ID3v2})) { - $self->{mp3}->{ID3v2}->remove_tag; + $self->{mp3tag}->{ID3v2}->remove_tag; } } @@ -184,52 +185,52 @@ sub delete { my($self, $thing)=@_; - if(exists($self->{mp3}->{ID3v1}) && $thing ne "genre") + if(exists($self->{mp3tag}->{ID3v1}) && $thing ne "genre") { my $action=$thing; $action="genre" if($action eq "v1genre"); if($action eq "track") { - $self->{mp3}->{ID3v1}->track("00"); + $self->{mp3tag}->{ID3v1}->track("00"); } else { - $self->{mp3}->{ID3v1}->$action(" "); + $self->{mp3tag}->{ID3v1}->$action(" "); } } - if(exists($self->{mp3}->{ID3v2})) + if(exists($self->{mp3tag}->{ID3v2})) { print "2: remove: $thing\n"; if($thing eq "artist") { - $self->{mp3}->{ID3v2}->remove_frame("TPE1"); - $self->{mp3}->{ID3v2}->remove_frame("TPE2"); + $self->{mp3tag}->{ID3v2}->remove_frame("TPE1"); + $self->{mp3tag}->{ID3v2}->remove_frame("TPE2"); } elsif($thing eq "album") { - $self->{mp3}->{ID3v2}->remove_frame("TALB"); + $self->{mp3tag}->{ID3v2}->remove_frame("TALB"); } elsif($thing eq "song") { - $self->{mp3}->{ID3v2}->remove_frame("TIT2"); + $self->{mp3tag}->{ID3v2}->remove_frame("TIT2"); } elsif($thing eq "track") { - $self->{mp3}->{ID3v2}->remove_frame("TRCK"); + $self->{mp3tag}->{ID3v2}->remove_frame("TRCK"); } elsif($thing eq "year") { - $self->{mp3}->{ID3v2}->remove_frame("TYER"); - $self->{mp3}->{ID3v2}->remove_frame("TDRC"); + $self->{mp3tag}->{ID3v2}->remove_frame("TYER"); + $self->{mp3tag}->{ID3v2}->remove_frame("TDRC"); } elsif($thing eq "comment") { - $self->{mp3}->{ID3v2}->remove_frame("COMM"); + $self->{mp3tag}->{ID3v2}->remove_frame("COMM"); } elsif($thing eq "genre") { - $self->{mp3}->{ID3v2}->remove_frame("TCON"); + $self->{mp3tag}->{ID3v2}->remove_frame("TCON"); } } } @@ -243,4 +244,26 @@ sub uniq } +sub channels +{ + my($self)=@_; + return undef unless($self->{mp3info}); + return( ($self->{mp3info}->stereo()) ? 2 : 1 ); +} + +sub bitrate +{ + my($self)=@_; + return undef unless($self->{mp3info}); + return( int($self->{mp3info}->bitrate()) ); +} + +sub samplerate +{ + my($self)=@_; + return undef unless($self->{mp3info}); + return(int($self->{mp3info}->frequency() * 1000)); +} + + 1; diff --git a/lib/ID3FS/DB.pm b/lib/ID3FS/DB.pm index 79cd194..143c568 100644 --- a/lib/ID3FS/DB.pm +++ b/lib/ID3FS/DB.pm @@ -233,13 +233,17 @@ sub add my $audiotype=$file->audiotype(); my @tags=$file->tags(); my $haspic=$file->haspic(); + my $channels=$file->channels(); + my $bitrate=$file->bitrate(); + my $samplerate=$file->samplerate(); $artist=undef unless($self->ok($artist)); print "$self->{me}: $path: no artist tag defined\n" unless(defined($artist)); my $artist_id=$self->add_to_table("artists", $artist); my $path_id=$self->add_to_table("paths", $pathpart); $album=undef unless($self->ok($album)); - if($self->{verbose} && !defined($album)) +# if($self->{verbose} && !defined($album)) FIXME + if(!defined($album)) { print "$self->{me}: $path: no album tag defined\n"; } @@ -261,7 +265,7 @@ sub add $self->add_tag($file_id, "UNTAGGED"); } - $year="UNKNOWN" unless($self->ok($year)); + $year="UNKNOWN" if(!$self->ok($year) || $year =~ /^0+$/); $self->add_tag($file_id, "year", $year); if($year=~/^(\d\d\d)\d$/) { @@ -286,6 +290,33 @@ sub add { $self->add_tag($file_id, "audiotype", $audiotype); } + + if($self->ok($channels)) + { + if($channels eq "2") + { + $self->add_tag($file_id, "channels", "stereo"); + } + elsif($channels eq "1") + { + $self->add_tag($file_id, "channels", "mono"); + } + else + { + $self->add_tag($file_id, "channels", $channels); + } + } + + if($self->ok($bitrate)) + { + $self->add_tag($file_id, "bitrate", $bitrate); + } + + if($self->ok($samplerate)) + { + $self->add_tag($file_id, "samplerate", $samplerate); + } + } sub add_tag