diff --git a/TOOLS/wma2ogg.pl b/TOOLS/wma2ogg.pl new file mode 100755 index 0000000000..ee8aacbdd3 --- /dev/null +++ b/TOOLS/wma2ogg.pl @@ -0,0 +1,341 @@ +#!/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"; +} +