#!/usr/bin/perl ################################# # wma converter 0.3.6 for Linux # ################################# # Made by Peter Simon # License: GNU GPL # # Needed programs: # # Getopt::Long - Perl Module # MPlayer - http://www.mplayerhq.hu # BladeEnc - http://bladeenc.mp3.no # oggenc - http://www.vorbis.com # mp3info - http://www.ibiblio.org/mp3info # changelog: # 0.1.0 # decoding all files to wav without any switches and encoders # 0.2.0 # converting to mp3 or ogg with bitrate, delete options # 0.2.1 # L.A.M.E. support for fanatics # Default output filetype: ogg # Some error warnings # 0.3.0 # Reading the wma tags out and puting into the mp3 or the ogg tags. (What the MPlayer shows of those.) # Default output bitrate: the original bitrate # Simlink for the default encode mode (wma2ogg = ogg, wma2mp3 = mp3) # 0.3.1 # Neglecting missing encoders if those are not in use. # 0.3.2 # Using mp3info for the mp3 tags # 0.3.3 # Convert more then one files in the start dir. # 0.3.4-5 # Some bugfixes. # 0.3.6 # Some bugfixes by Diego Biurrun # Why BladeEnc? # Eg.: The L.A.M.E.'s code isn't compatible for some hardwer-decoders. Makes noise and clashings. # I never met this trouble using BladeEnc. # That's it. use Getopt::Long qw(:config pass_through); $ver="0.3.6"; GetOptions("help|?",\&showhelp, 'a' => \$all, "file|f=s" => \@files,"t=s" => \$mtype, "lame" => \$needlame, "del" => \$delete, "br=i" => \$sbrate); if (@ARGV) { foreach (@ARGV) { error ("Missing parameter after the $_ switch!"); } exit; } print "wma2ogg $ver\nPeter Simon "; if (!$all && !@files) { error ("There is no selected file!"); exit; } if ($0 =~/wma2mp3/ && !$mtype) { $mtype="mp3"; } if ($mtype eq "ogg") { $ttype{"ogg"}="oggenc"; needed_prgs (oggenc, "http://www.vorbis.com"); } if ($needlame && $mtype eq "ogg") { error ("\nYou can not use L.A.M.E. & oggenc together!\n"); exit; } if (!$mtype && !$needlame) { $mtype="ogg"; $ttype{"ogg"}="oggenc"; needed_prgs (oggenc, "http://www.vorbis.com"); } if (!$needlame && $mtype eq "mp3") { $ttype{"mp3"}="BladeEnc"; needed_prgs (BladeEnc, "http://bladeenc.mp3.no", mp3info, "http://www.ibiblio.org/mp3info"); } if ($needlame) { $mtype="mp3"; $ttype{"mp3"}="lame"; needed_prgs (lame, "http://lame.sourceforge.net", mp3info, "http://www.ibiblio.org/mp3info"); } # Main program print "\nUsing lame - WARNING - this is not optimal!\n"; ch_needed (); ch_type (); ch_files (); decode(); # the end. sub ch_type { $o_type=$ttype{$mtype}; if ($mtype ne "wav") { $def_path=$ENV{PATH}; @exec_path=split /\:/, $def_path; foreach $temp_path (@exec_path) { if (-d $temp_path && !$enc_ok) { $enc_ok=`find $temp_path -name $o_type -type f -maxdepth 1 2>/dev/null`; chomp ($enc_ok); } } } if ((!$o_type || !$enc_ok) && $mtype ne "wav") { error("Unknown encoder."); exit; } } sub ch_br { if ($sbrate && ((($sbrate <32 || $sbrate>350) && $mtype eq "mp3") || (($sbrate<64 || $sbrate>500) && $mtype eq "ogg") )) { error("Invalid, missing or redundant bitrate."); exit; } } sub ch_files { if ($all && @files) { error ("You can't use -a switch and -f together!"); exit; } if ($all) { @enc_files=`ls | grep '.wma'\$`; foreach (@enc_files) { chomp $_; } } if (@files) { @enc_files=@files; } } sub showhelp { print "\n\nUsage: wma2ogg [OPTIONS] (-f FILE1 | -f FILE2 ... | -a)\n -f, -file filename -a converts all wma files in the current directory\n OPTIONS: -t output filetype (ogg, mp3) [default=ogg] -lame I wanna use L.A.M.E. sure enough! -br bitrate (kb/s) [default=from the wma] -del remove wma file(s) after the transcoding\n"; print $miss_text; print "\n$errtext\nExiting program.\n"; } sub error { $errtext=@_[0]; showhelp (); } sub missing_prg { $what=$keys; $that=$needed{$keys}; $miss_text.="\nThe needed \'$what\' program is missing, see: $that!"; } sub ch_needed { `perl -e 'use Getopt::Long;' 2>./err`; open (FILE, "<./err"); while ($sor=) { if ($sor =~ /Can\'t locate/) { missing_prg ("Getopt::Long", ": your Perl is too old... (uhhh... get a new one!)"); } } `rm ./err`; foreach $keys (keys %needed) { `$keys 2>./err`; open (FILE, "<./err"); while ($sor=) { if ($sor =~ /$keys\: command not found/) { missing_prg (); $error=1; } } `rm ./err`; } close FILE; if ($error) { showhelp (); exit; } } sub get_tags { my $outfile; open (FILE, "<./1"); while ($sor=) { $outfile.=$sor; } close FILE; $outfile=~ s/\((\d+\,\d+)\ kbit\)/$1/e; print "\noriginal bitrate: $1"; $kept_orig_brate=$1; $kept_orig_brate=~ s/(\d+)/$1/e; $kept_orig_brate=$1; if (!$sbrate) { $brate=$kept_orig_brate; print " (kept as default)"; } else { $brate=$sbrate; print " (new: $brate,0)"; } ch_br (); `rm ./1`; my @temp_info=split /Clip\ info\:/, $outfile; my @temp2_info=split /\n/, @temp_info[1]; my @temp_title=split /\ /, $temp2_info[1],3; my @temp_author=split /\ /, $temp2_info[2],3; my @temp_copyright=split /\ /, $temp2_info[3],3; my @temp_comments=split /\ /, $temp2_info[4],3; return ($temp_title[2], $temp_author[2], $temp_copyright[2], $temp2_comments[2]); } sub needed_prgs { %needed=( $_[0]=>$_[1], $_[2]=>$_[3], mplayer=>"http://www.mplayerhq.hu", ); } sub mp3_info { if ($title) { $infofile=" -t '$title'"; } if ($author) { $infofile.=" -a '$author'"; } if ($comments) { $infofile.=" -c '$comments'"; } `mp3info "$p_name.$mtype" $infofile`; undef ($infofile); } sub decode { foreach (@enc_files) { $wav_name=$_; $wav_name=~ s/(.+)\./$1/e; $p_name=$1; $wav_name=$p_name.".wav"; $pwd=`pwd`; chomp $pwd; $pwd.="/t2"; print "\nConverting $_ to \"wav\" file.\n"; print "Using MPlayer...\n"; `mplayer "$_" -ao pcm -input conf="$pwd" 2>/dev/null >./1`; `mv "audiodump.wav" "$wav_name"`; @tags=get_tags (); $title=$tags[0]; print "\ntitle: $title"; $author=$tags[1]; print "\nauthor: $author"; $copyright=$tags[2]; print "\ncopyright: $copyright"; $comments=$tags[3]; print "\ncomments: $comments"; $comments=$copyright." ".$comments."Transcoded by wma2ogg"; print "\n\nConverting $wav_name to \"$mtype\" file."; print "\nUsing $o_type..."; if ($mtype eq "ogg") { $br_sw="b"; if ($title) { $infofile=" -t '$title'"; } if ($author) { $infofile.=" -a '$author'"; } if ($comments) { $infofile.=" -c COMMENT='$comments'"; } `"$o_type" "-$br_sw" "$brate" "-Q" "./$wav_name" $infofile "-o" "$p_name.$mtype"`; `rm -f "$wav_name"`; } if ($mtype eq "mp3" && !$needlame) { $br_sw="br"; `"$o_type" "$wav_name" "$p_name.$mtype" "-$br_sw" "$brate" 2>/dev/null >/dev/null`; mp3_info (); `rm -f "$wav_name"`; } if ($mtype eq "mp3" && $needlame) { $br_sw="b"; `"$o_type" "-$br_sw" "$brate" "-f" "$wav_name" "$p_name.$mtype" 2>/dev/null >/dev/null`; mp3_info (); `rm -f "$wav_name"`; } if ($delete) { `rm -f "$_"`; } if (-e "./err") { `rm ./err`; } } print "\n\nDone.\n\n"; }