new special tags: channels, samplerate, bitrate
authorIan Beckwith <ianb@erislabs.net>
Sun, 31 Oct 2010 22:40:25 +0000 (22:40 +0000)
committerIan Beckwith <ianb@erislabs.net>
Sun, 31 Oct 2010 22:40:25 +0000 (22:40 +0000)
lib/ID3FS/AudioFile.pm
lib/ID3FS/AudioFile/Mp3.pm
lib/ID3FS/DB.pm

index 3091ed0..e020b43 100644 (file)
@@ -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
 {
index d51e0b0..b4f340c 100644 (file)
@@ -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;
index 79cd194..143c568 100644 (file)
@@ -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