#!/usr/bin/perl use strict; use diagnostics; use Getopt::Long; use Term::ReadKey; ####################################################### # default-values ... # # feel free to change this to your needs # ####################################################### my $device = "/dev/cdrom"; # set default cd-reader my $target_dir = "/images"; # set default output-path ####################################################### # DONT CHANGE ANYTHING BELOW! # # unless you know what you're doing ;-) # ####################################################### my $tracks = 0; # '0' means 'all' my $needhelp = 0; # '0' means 'don't show usage-message by default' if ( ! &GetOptions( "tracks=s" => \$tracks, "dev=s" => \$device, "dir=s" => \$target_dir, "help" => \$needhelp ) ) {exit 1;} if ($needhelp == 1) { &printusage; } chomp $tracks; chomp $device; chomp $target_dir; my $temp_dir = "$target_dir\/tmp"; if (not -e $temp_dir) { system ("mkdir -p $temp_dir"); } my ($track_nr, $title, $playlist); my @rip_tracks; system ("cda -dev $device on >/dev/null 2>&1"); my ($width) = GetTerminalSize(1); &header; print " Extracting Tracks\n"; print " from: $device\n"; print " to: $target_dir\n"; &drawline; my $id = `cda -dev $device extinfo | grep 'disc ID'`; my $artist = `cda -dev $device extinfo | grep 'Artist:'`; my $album = `cda -dev $device extinfo | grep 'Title:'`; if ($id =~ m/disc ID: (.{1,})\Z/i) { $id = $1; chomp $id; } if ($artist =~ m/\AArtist: (.{1,})\Z/i) { $artist = $1; chomp $artist; } if ($album =~ m/\ATitle: (.{1,})\Z/i) { $album = $1; chomp $album; } if ($tracks ne 0) { if ($tracks =~ m/,/i) { @rip_tracks = split (/,/, $tracks); } else { push (@rip_tracks, $tracks); } foreach (@rip_tracks) { chomp $_; if (length $_ < 2) { $track_nr = "0$_"; } else { $track_nr = $_; } $title = `cda -dev $device toc | grep ' $track_nr '`; if ($title =~ m/ (\d\d) \d\d\:\d\d (.{1,})\Z/i) { $title = $2; chomp $title; } &extract_tracks; } } elsif ($tracks == 0) { my @toc = `cda -dev $device toc`; foreach (@toc) { if ($_ =~ m/ (\d\d) \d\d\:\d\d (.{1,})\Z/i) { $track_nr = $1; $title = $2; chomp $title; &extract_tracks; } } } system ("cda -dev $device off >/dev/null 2>&1"); # # beautify the playlist # print "\n"; &drawline; print "writing cumulative playlist to:\n"; print " $playlist\n"; print "\n\.\.\. all done!\n\n"; my @pl = `less $playlist`; @pl = sort(@pl); my @new_pl; my $entry = ""; foreach (@pl) { if ($entry ne $_) { push (@new_pl, $_); $entry = $_; } } open (NEWPL, ">$playlist"); print NEWPL ("@new_pl"); close (NEWPL); #-------------------- Subs -------------------# sub drawline { for (my $i = 1; $i < ($width +1); $i++) { print "-"; } print "\n"; } sub header { &drawline; print " \| Rip and Encode Audio-CDs using CDDA2WAV and LAME\n"; print "mhripper \| (c) 2002, Martin Holz \\n"; print " \| http:\\\\www\.perl-newbie\.de\n"; &drawline; } sub printusage { &header; print "Usage:\n"; print "------\n"; print "mhripper [--help] [--dev] [--dir] [--tracks]\n\n"; print " --help = displays this message\n\n"; print " --device = set a specific CDROM-device (default: /dev/cdrom)\n"; print " Example: mhripper --device=/dev/cdrecorder\n\n"; print " --dir = set OUTPUT-directory (default: /images)\n"; print " Example: mhripper --dir=/home/martin/mp3\n\n"; print " --tracks = comma seperated list to select tracks for\n"; print " ripping and encoding\n"; print " Examples: mhripper --tracks=1\n"; print " mhripper --tracks=1,4,8,11\n\n"; &drawline; { exit } } sub extract_tracks { my $rip_nr; if ($track_nr =~ m/0(\d)/i) { $rip_nr = $1; } else { $rip_nr = $track_nr; } my $rip_name = $title; my $id3_artist = $artist; my $id3_album = $album; $rip_name =~ s/ /_/g; # $artist =~ s/ /_/g; # subset whitespaces with underlines $album =~ s/ /_/g; # my $album_dir = "$target_dir\/$artist-$album"; $playlist = "$album_dir\/$artist-$album\.m3u"; # beautify output ;-) &drawline; write; &drawline; if (not -e $album_dir) { system ("mkdir -p $album_dir"); } system ("touch $playlist"); print "\* Step 1: ripping track \[using CDDA2WAV\]"; system ("cdda2wav -Q -D $device -I cooked_ioctl -q -H -t $rip_nr $temp_dir\/\"$track_nr\_$rip_name\""); print "\.\.\. done\n"; print "\* Step 2: encoding track \[using LAME\]\n"; system ("lame -b 192 --tt \"$title\" --ta \"$id3_artist\" --tl \"$id3_album\" $temp_dir\/\"$track_nr\_$rip_name\.wav\" $album_dir\/\"$track_nr\_$rip_name\.mp3\""); system ("echo \"$track_nr\_$rip_name\.mp3\" >> $playlist"); unlink ("$temp_dir\/$track_nr\_$rip_name\.wav"); return ($playlist); } format STDOUT = Track: @< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $track_nr, $title Artist: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $artist Album: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $album .