#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my $dest_dir = $ARGV[0] || die("Need destination directory\n"); my $src_dev = $ARGV[1] || '/dev/sr0'; my $src_pkt_dev = $ARGV[2] || '/dev/pktcdvd/pktcdvd0'; my @tracks; for(split "\n", `dvd+rw-mediainfo $src_dev`) { if (/^READ TRACK INFORMATION/) { push @tracks, { }; } if (/^ Track (State): +(.*)/ || /^ Track (Start) Address: +(.*)\*2KB/ || /^ Track (Size): +(.*)\*2KB/ ) { $tracks[@tracks-1]->{$1} = $2; } } die("No tracks found\n") if @tracks == 0; print "mkdir -p $dest_dir\n"; my $i = 0; for my $t (@tracks) { $i++; if ($t->{State} =~ /complete/) { my $c = $t->{Size} * 2048; next if $c == 224 * 2048; my $s = $t->{Start} * 2048; my $n = sprintf "%02d",$i; print "ddrescue -b 2048 -i $s -o 0 -s $c $src_pkt_dev $dest_dir/t$n.mpg $dest_dir/t$n.log\n"; } }