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 )