print correct container in dryrun mode
[undvd.git] / scandvd.pl
blob568479898b6832444400b147164af098061a614d
1 #!/usr/bin/perl
3 # Author: Martin Matusiak <numerodix@gmail.com>
4 # Licensed under the GNU Public License, version 3.
6 use strict;
7 use Getopt::Long qw(:config no_ignore_case);
9 BEGIN {
10 use File::Basename;
11 push(@INC, dirname(grep(-l, $0) ? readlink $0 : $0));
12 require colors; colors->import(qw(:DEFAULT));
13 require common; common->import(qw(:DEFAULT $suite $defaults $tools));
17 my $usage = "Usage: " . s_b($suite->{tool_name}) . " ["
18 . s_b("--dev") . " " . s_bb("/dev/dvd") . " | "
19 . s_b("--dir") . " " . s_bb("/path") . " | "
20 . s_b("--iso") . " " . s_bb("disc.iso") . "]
21 -d --dev dvd device to read from (default is " . s_bb("/dev/dvd") . ")
22 -q --dir dvd directory to read from
23 -i --iso dvd iso image to read from
24 -v be verbose (print id numbers)
25 --version show " . $suite->{name} . " version\n";
27 my ($verbose, $dvd_device, $dvd_is_dir);
28 $dvd_device = $defaults->{dvd_device};
29 my $parse = GetOptions(
30 "d|dev=s"=>\$dvd_device,
31 "q|dir=s"=> sub { $dvd_device = $_[1]; $dvd_is_dir = "-q"; },
32 "i|iso=s"=> sub { $dvd_device = $_[1]; $dvd_is_dir = "-q"; },
33 "v"=>\$verbose,
34 "version"=>\&print_version,
35 "C"=> sub { init_cmds(1); exit; },
38 print_tool_banner();
40 if (! $parse) {
41 print $usage;
42 exit 2;
45 print " * Scanning DVD for titles...\n";
46 my @args = ($tools->{lsdvd}, "-avs", $dvd_is_dir, $dvd_device);
47 my ($out, $exit, $err) = run(\@args);
49 if ($exit) {
50 print s_err($err) . "\n";
51 print "$usage";
52 exit 2;
56 my @title_numbers = map( { /^Title: ([0-9]*)/ } split(/\n/, $out));
58 foreach my $titleno (@title_numbers) {
59 my ($title_s, $length, @aids, @alangs, @sids, @slangs);
60 if ($out =~ /(Title: $titleno.*?\n\n)/s) { $title_s = $1; }
62 if ($title_s =~ /Title: $titleno, Length: ([0-9:]+)/) { $length = $1; }
64 while ($title_s =~ m/Audio: .*Language: ([a-zA-Z]+)/g) { push(@alangs, $1); }
65 while ($title_s =~ m/Audio: .*Stream id: (0x[0-9abcdefABCDEF]+)/g) {
66 push(@aids, oct($1)); }
68 while ($title_s =~ m/Subtitle: .*Language: ([a-zA-Z]+)/g) { push(@slangs, $1); }
69 while ($title_s =~ m/Subtitle: .*Stream id: (0x[0-9abcdefABCDEF]+)/g) {
70 push(@sids, oct($1)); }
72 my $audio = "";
73 for (my $i = 0; $i < scalar @aids; $i++) {
74 if ($i == 0) { $audio = " audio: "; }
75 $audio .= s_bb($alangs[$i]) . " ";
76 if ($verbose) { $audio .= s_it($aids[$i]) . " "; }
78 $audio =~ s/\s*$//;
80 my $subs = "";
81 for (my $i = 0; $i < scalar @sids; $i++) {
82 if ($i == 0) { $subs = " subs: "; }
83 $subs .= s_bb($slangs[$i]) . " ";
84 if ($verbose) { $subs .= s_it($sids[$i]) . " "; }
86 $subs =~ s/\s*$//;
88 print s_b($titleno) ." length: " . s_bb($length) . $audio . $subs . "\n";
91 print "\nTo watch a title:\n";
92 print " " . s_b("mplayer")
93 ." " . s_b("dvd://") . s_bb("01")
94 ." " . s_b("-alang") . " " . s_bb("en")
95 ." " . s_b("-slang") . " " . s_bb("en/off") . "\n";
96 print "To rip titles:\n";
97 print " " . s_b("undvd")
98 ." " . s_b("-t") . " " . s_bb("01,02,03")
99 ." " . s_b("-a") . " " . s_bb("en")
100 ." " . s_b("-s") . " " . s_bb("en/off") . "\n";