MusicRoom

 view release on metacpan or  search on metacpan

lib/MusicRoom/File.pm  view on Meta::CPAN

                    elsif($tag eq "artist")
                      {
                        $attribs{$tag} = $tags->{AUTHOR};
                        $attribs{$tag} = $tags->{COMPOSER}
                                          if(!defined $attribs{$tag});
                        $attribs{$tag} = $tags->{ALBUMARTIST}
                                          if(!defined $attribs{$tag});
                      }
                    elsif($tag eq "length_secs")
                      {
                        $attribs{$tag} = int($info->{playtime_seconds});
                      }
                    elsif($tag eq "track_num")
                      {
                        $attribs{$tag} = $tags->{TRACKNUMBER};
                      }
                    elsif($tag eq "year")
                      {
                        $attribs{$tag} = $tags->{YEAR};
                      }
                    elsif($tag eq "id")
                      {
                        $attribs{$tag} = extract_id($tags->{DESCRIPTION});
                      }
                    elsif($tag eq "file")
                      {
                        $attribs{$tag} = $src_file;
                      }
                    elsif($tag eq "original_format")
                      {
                        $attribs{$tag} = $format;
                        my $bitrate = closest_bitrate($format,$info->{bitrate},
                                                      @{$formats{$format}->{bitrates}});
                        if(defined $bitrate && $bitrate ne "")
                          {
                            $attribs{$tag} = "${format}:${bitrate}";
                          }
                        else
                          {
                            $attribs{$tag} = $format;
                          }
                      }
                    elsif($tag eq "dir_artist" || $tag eq "dir_album" ||
                          $tag eq "quality")
                      {
                      }
                    else
                      {
                        carp("unknown $format tag \"$tag\"");
                      }
                  }
                return %attribs;
              },
          },
        mp3 =>
          {
            uses_encoder => "lame",

            # The MP3::Info package is implicitly called by
            # total_secs_int
            uses_package => ["MP3::Tag","MP3::Info",],
            # Bitrates defined in the mp3 standard
            bitrates => [32, 40, 48, 56, 64, 80, 96, 
                         112, 128, 144, 160, 192, 224, 256, 320],
            ext => "mp3",
            to_working => sub
              {
                my($format,$src_file,$dest_file) = @_;
    
                # decode an mp3 to wav
                # $src_file & $dest_file have been dosified already

                system("$paths{lame} -h --decode \"$src_file\" -o \"$dest_file\"");
              },
            is_valid => sub
              {
                my($format,$src_file) = @_;
                if(!-r $src_file)
                  {
                    carp("Cannot read $format file \"$src_file\"");
                    return "";
                  }
                my $mp3 = MP3::Tag->new($src_file);
                if(!defined $mp3)
                  {
                    carp("File \"$src_file\" appears to not be $format format");
                    return "";
                  }
                return 1;
              },
            from_working => sub
              {
                # encode a wav to mp3
                my($format,$src_file,$dest_file) = @_;
    
                # decode an mp3 to wav

                # $src_file & $dest_file are dosified by the caller

                my $bitrate = bitrate_of($format);
                my $br_flag = "-b $bitrate";
                $br_flag = "" if($bitrate eq "");

                system("$paths{lame} -h $br_flag \"$src_file\" -o \"$dest_file\"");
              },
            get_tags => sub
              {
                # How to grab tags from an mp3 file
                my($format,$src_file) = @_;
                my $mp3 = MP3::Tag->new($src_file);
                if(!defined $mp3)
                  {
                    carp("File \"$src_file\" appears to not be $format format");
                    return "";
                  }
                my %attribs;
                $mp3->get_tags();
                foreach my $tag (@attribs)
                  {
                    if($tag eq "file")
                      {
                        $attribs{$tag} = $src_file;
                        next;
                      }
                    elsif($tag eq "length_secs")
                      {
                        $attribs{$tag} = $mp3->total_secs_int();
                      }
                    elsif($tag eq "original_format")
                      {
                        $attribs{$tag} = $format;
                        $attribs{$tag} = $format;
                        my $bitrate = closest_bitrate($format,1000*$mp3->bitrate_kbps(),
                                                      @{$formats{$format}->{bitrates}});
                        if(defined $bitrate && $bitrate ne "")
                          {
                            $attribs{$tag} = "${format}:${bitrate}";
                          }
                        else
                          {
                            $attribs{$tag} = $format;
                          }
                      }
                    elsif($tag eq "quality")
                      {
                        my $bitrate = $mp3->bitrate_kbps();
                        if(!defined $bitrate)
                          {
                            $attribs{$tag} = 7;
                          }
                        elsif($bitrate > 200)
                          {
                            $attribs{$tag} = 8;
                          }
                        elsif($bitrate > 100)
                          {
                            $attribs{$tag} = 7;
                          }
                        elsif($bitrate > 64)
                          {
                            $attribs{$tag} = 6;
                          }
                        else
                          {
                            $attribs{$tag} = 5;
                          }
                      }
                    elsif($tag eq "dir_artist" || $tag eq "dir_album" ||
                          $tag eq "quality")
                      {

lib/MusicRoom/File.pm  view on Meta::CPAN

                if(defined $mp3->{ID3v2})
                  {
                    foreach my $tag (@attribs)
                      {
                        next if(defined $attribs{$tag});
                        my $id3v2 = $mp3_tags_to_ID3v2{$tag};
                        next if(!defined $id3v2);
                        my($val,$typ) = $mp3->{ID3v2}->get_frame($id3v2);
                        next if(!defined $val);
                        if($tag eq "id")
                          {
                            $attribs{$tag} = extract_id($val->{Text});
                            next;
                          }
                        $attribs{$tag} = $val;
                      }
                  }
                if(defined $mp3->{ID3v1})
                  {
                    foreach my $tag (@attribs)
                      {
                        next if(defined $attribs{$tag});
                        # I don't see an easy way to do this, so...
                        if($tag eq "album")
                          {
                            $attribs{$tag} = $mp3->{ID3v1}->album;
                          }
                        elsif($tag eq "title")
                          {
                            $attribs{$tag} = $mp3->{ID3v1}->song;
                          }
                        elsif($tag eq "artist")
                          {
                            $attribs{$tag} = $mp3->{ID3v1}->artist;
                          }
                        elsif($tag eq "track_num")
                          {
                            $attribs{$tag} = $mp3->{ID3v1}->track;
                          }
                        elsif($tag eq "year")
                          {
                            $attribs{$tag} = $mp3->{ID3v1}->year;
                          }
                        elsif($tag eq "id")
                          {
                            $attribs{$tag} = extract_id($mp3->{ID3v1}->comment);
                          }
                        else
                          {
                            carp("unknown $format tag \"$tag\"");
                          }
                      }
                  }
                return %attribs;
              },
            set_tags => sub
              {
                # How to assign tags in an mp3 file
                my($vals_hash,$file_name) = @_;

                my $mp3 = MP3::Tag->new($file_name);
                if(!defined $mp3)
                  {
                    carp("Cannot get tags from $file_name");
                    return "";
                  }
                if(!defined $mp3->{ID3v2})
                  {
                    $mp3->new_tag("ID3v2");
                  }

                foreach my $tag (keys %mp3_tags_to_ID3v2)
                  {
                    my $val = $vals_hash->{$tag};
                    if(!defined $val)
                      {
                        carp("Cannot find value for $val in $vals_hash->{id}");
                        $val = "";
                      }
                    my $frame = $mp3_tags_to_ID3v2{$tag};
                    my @extra = ();

                    if($tag eq "id")
                      {
                        $val = insert_id($vals_hash->{id});
                        @extra = ("ENG","Short Text");
                      }
                    if(defined $mp3->{ID3v2}->get_frame($frame))
                      {
                        $mp3->{ID3v2}->change_frame($frame,@extra,$val);
                      }
                    else
                      {
                        $mp3->{ID3v2}->add_frame($frame,@extra,$val);
                      }
                  }
                $mp3->{ID3v2}->write_tag();
                
                return 1;
              },
          },
      );
    
    foreach my $format (keys %formats)
      {
        # Is this format to be ignored?
        if(defined $formats{$format}->{disabled} && 
                     $formats{$format}->{disabled})
          {
            next;
          }

        next if(!MusicRoom::is_running());
        my $is_disabled = MusicRoom::get_conf("${format}_disabled",1);
        if(defined $is_disabled && $is_disabled)
          {
            $formats{$format}->{disabled} = 1;
            next;
          }

        my @encoders;



( run in 1.217 second using v1.01-cache-2.11-cpan-d7f47b0818f )