recurse down @ARGV instead of treating them as files
[id3fs.git] / bin / id3fs-tag
index 0a1aabe..0b1f20e 100755 (executable)
 use lib '/home/ianb/projects/id3fs/id3fs/lib'; # FIXME: remove
 use strict;
 use Getopt::Long qw(Configure);
+use File::Find;
 use ID3FS::AudioFile;
 use vars qw($me);
 $me=($0=~/(?:.*\/)?(.*)/)[0];
 
+my @extensions=qw(mp3); # FIXME:  flac ogg
 my $verbose=0;
 my $help=0;
 my ($artist, $album, $track, $tracknum, $year, $v1genre, $comment,
@@ -31,7 +33,7 @@ my ($artist, $album, $track, $tracknum, $year, $v1genre, $comment,
     $delete_genre, $genre, $add_tags, $delete_tags, $overwrite_tagvals,
     $delete_tagvals);
 
-Configure(qw(no_ignore_case));
+Configure(qw(bundling no_ignore_case));
 my $optret=GetOptions(
     "verbose|v"                      => \$verbose,
     "help|h"                         => \$help,
@@ -60,24 +62,35 @@ my $optret=GetOptions(
 
 usage() if(!@ARGV || !$optret || $help);
 
-while(my $filename=shift @ARGV)
+while(my $path=shift @ARGV)
 {
-    unless(-f $filename)
+    unless(-e $path)
     {
-       warn("$me: $filename: not found\n");
+       warn("$me: $path: not found\n");
        next;
     }
-    my $file=ID3FS::AudioFile->new($filename);
-    my $changes=0;
-    $changes =  do_deletes($file);
-    $changes += do_adds($file);
-    if($changes)
-    {
-       do_write($file);
-    }
-    else
+    File::Find::find( {wanted => \&wanted, follow => 1, no_chdir => 1}, $path);
+}
+
+sub wanted
+{
+    my $ext='';
+    if(/.*\.(.*)/) { $ext=lc($1); }
+    if(-f && scalar(grep({ $ext eq lc($_);} @extensions)))
     {
-       do_display($file);
+       my $file=ID3FS::AudioFile->new($_);
+       return unless($file);
+       my $changes=0;
+       $changes =  do_deletes($file);
+       $changes += do_adds($file);
+       if($changes)
+       {
+           do_write($file);
+       }
+       else
+       {
+           do_display($file);
+       }
     }
 }
 
@@ -97,14 +110,15 @@ sub do_deletes
     $file->delete_year()     if($delete_year);
     $file->delete_v1genre()  if($delete_v1genre);
     $file->delete_comment()  if($delete_comment);
-    $file->delete_genre()    if($delete_genre);
-    $file->delete_tags($delete_tags, 0)    if($delete_tags);
-    $file->delete_tags($delete_tagvals, 1) if($delete_tagvals);
-
-    my $donesomething=($delete_artist   || $delete_album || $delete_track   ||
-                      $delete_tracknum || $delete_year  || $delete_v1genre ||
-                      $delete_comment  || $delete_genre || $delete_tags    ||
-                      $delete_tagvals);
+    $file->delete_genre()    if($delete_genre || $genre);
+    $file->delete_tags($delete_tags, 0)       if($delete_tags);
+    $file->delete_tags($delete_tagvals, 1)    if($delete_tagvals);
+    $file->delete_tags($overwrite_tagvals, 1) if($overwrite_tagvals);
+
+    my $donesomething=($delete_artist   || $delete_album   || $delete_track   ||
+                      $delete_tracknum || $delete_year    || $delete_v1genre ||
+                      $delete_comment  || $delete_genre   || $delete_tags    ||
+                      $delete_tagvals  || defined($genre) || $overwrite_tagvals);
     return($donesomething ? 1 : 0);
 }
 
@@ -118,14 +132,15 @@ sub do_adds
     $file->year($year)         if($year);
     $file->v1genre($v1genre)   if($v1genre);
     $file->comment($comment)   if($comment);
-    $file->genre($genre)       if($genre);
     $file->add_tags($add_tags) if($add_tags);
+    $file->add_tags($genre)    if($genre);
+    $file->add_tags($overwrite_tagvals) if($overwrite_tagvals);
 
     my $donesomething=(defined($artist)   || defined($album) ||
                       defined($track)    || defined($tracknum) ||
                       defined($year)     || defined($v1genre) ||
                       defined($comment)  || defined($genre) ||
-                      defined($add_tags));
+                      defined($add_tags) || defined($overwrite_tagvals));
     return( $donesomething ? 1 : 0 );
 }
 
@@ -168,7 +183,8 @@ sub do_display
     if(@tags)
     {
        if($verbose) { print "  tags: "; }
-       else         { print $file->path() . ":tags:"; }
+#      else         { print $file->path() . ":tags:"; }
+       else         { print "tags:"; }
        print join(", ", @tags), "\n";
     }
 }