#! /usr/bin/perl # # $Id: dbconv,v 1.14 2007/11/29 04:40:02 doi Exp doi $ # # dbconv - convert seiyuu databases # # this program will convert the format of the seiyuu databases, # which are maintained by Hitoshi Doi . # it is mainly used for creating parts of the WWW seiyuu pages. # # the seiyuu information is available via WWW at: # http://www.usagi.org/doi/seiyuu/ # # original hack by Hitoshi Doi (doi@usagi.org), 1995.10.17 # # this program is public domain. do whatever you want with it. # this program is offered "as is", and does not have any warrantee. # # --------------------------------------------------------------- # modifications # # 1996.03.18 Hitoshi Doi # support title format version 2 # generate indexed WWW info # # 1996.05.25 Hitoshi Doi # added -listall option # # 2001.02.09 Hitoshi Doi # support continuation lines # --------------------------------------------------------------- $me = $0; $me =~ s/.*\///; $print_out = 'VA'; $wwwtype = ''; $wwwdir = ''; $listall = ''; $listall2 = ''; $do_mp3 = 0; $MP3_HOME = 'http://mp3.usagi.org/'; while ($ai = shift(@ARGV)) { if ($ai =~ m/-dbformat/i) { $print_out = 'DB'; } elsif ($ai =~ m/^-dbprefix/i) { $DB_prefix = shift(@ARGV); } elsif ($ai =~ m/^-vaformat/i) { $print_out = 'VA'; } elsif ($ai =~ m/^-db/i) { $dbfile = shift(@ARGV); } elsif ($ai =~ m/^-www/i) { $wwwtype = shift(@ARGV); $wwwdir = shift(@ARGV); $print_out = ''; } elsif ($ai eq '-listall') { $listall = shift(@ARGV); $print_out = ''; } elsif ($ai eq '-listall2') { $listall2 = shift(@ARGV); $print_out = ''; } elsif ($ai =~ m/^-help/i) { print "$me - convert seiyuu databases usage: $me -db FILE options: -dbformat print out in DB format -vaformat print out in VA format [default] -www cd SUBDIR generate indexed WWW info for CDs -www title SUBDIR generate indexed WWW info for titles -www role SUBIDR generate indexed WWW info for roles -listall PATH list all in HTML format, preceeded by PATH -listall2 PATH list all in HTML TABLE format, preceeded by PATH "; exit 0; } elsif ($ai =~ m/^-debug/i) { $debug = 1; } elsif ($ai =~ m/^-mp3/i) { $do_mp3 = 1; } } if (!$dbfile) { print "$me: the seiyuu database is undefined. please specify the database with the -db option.\n"; exit -1; } $ev_db = "seiyuu database $dbfile"; if (!open(DB, "<$dbfile")) { print "$me: can't open the $ev_db.\n"; exit -1; } $style = " onMouseOver=\"this.style.background='pink'\""; $style .= " onMouseOut=\"this.style.background=''\""; &read_profile; # # go through the database and do processing # $DB_format = ''; while ($l = ) { chop($l); next if ($l =~ m/^$/); next if ($l =~ m/^#/); while ($l =~ m/\\$/) { # continuation $l =~ s/\\$//; $l .= ; chop($l); } # # new title # if ($l =~ m/^[A-Za-z0-9\"]/) { $cur_title = $l; $cur_url = ''; $cur_cover = ''; next; } $l =~ s/^[ ]+//i; # remove leading spaces # # special keywords # if ($l =~ m/^URL/) { $l =~ s/^URL[ ]*//i; $cur_url = $l; if ($listall) { print "
  • "; print "$cur_title\n"; } if ($listall2) { my @x = split(/,/, $cur_title); print "$x[1]"; print "$x[0]\n"; } next; } if ($l =~ m/^COVER/) { $l =~ s/^COVER[ ]*//i; $cur_cover = $l; next; } if ($l =~ m/^MP3/) { next if (!$do_mp3); $l =~ s/^MP3[ ]*//i; $MP3 = $l; next; } # # character :: voice actor info # ($chara, $val) = split(/::/, $l); ($va, $debut) = split(/--/, $val); $chara =~ s/[ ]*$//; $chara =~ s/^[ ]*//; $va =~ s/^[ ]*//; $va =~ s/[ ]*$//; $eps = ''; if ($va =~ m/\{.*\}/) { $eps = $va; $va =~ s/[ ]*\{.*\}.*//; $eps =~ s/.*\{//; $eps =~ s/\}.*//; } $debut =~ s/^[ ]*//; next if (!$va); # # create WWW info # if ($wwwdir) { $val = $va; $val =~ y/A-Z/a-z/; $s_titles{$val} .= "$cur_title\t"; $s_url{$val} .= "$cur_url\t"; $s_role{$val} .= "$chara\t"; $s_eps{$val} .= "$eps\t"; $s_debut{$val} .= "$debut\t"; } # # to VA format # if ($print_out eq 'VA') { if ($debut) { $VA_data{$va} .= " $cur_title -- $debut\n $chara"; } else { $VA_data{$va} .= " $cur_title\n $chara"; } if ($eps) { $VA_data{$va} .= " {$eps}"; } $VA_data{$va} .= "\n"; } # # to DB format # [debut] char - title {eps} - va (kanji) # if ($print_out eq 'DB') { $DB_format = "$DB_prefix "; $DB_format .= "[$debut] " if ($debut); if ($MP3) { $DB_format .= ""; $DB_format .= "$chara - "; } else { $DB_format .= "$chara - "; } if ($cur_url) { $DB_format .= "$tt $dt"; } else { $DB_format .= "$cur_title"; } if ($eps) { $DB_format .= " {$eps}"; } $va .= " ($kanji{$va})" if ($kanji{$va}); $DB_format .= " - $va\n"; print $DB_format; $DB_format = ''; } $MP3 = ''; } close(DB); # # print out VA format # if ($print_out eq 'VA') { foreach $k (sort keys(%VA_data)) { print "$k\n$VA_data{$k}\n"; } } if ($wwwdir) { &write_wwwcd if ($wwwtype eq 'cd'); &write_wwwtitle if ($wwwtype eq 'title'); &write_wwwrole if ($wwwtype eq 'role'); } exit 0; # # subroutines # sub read_profile { $pf = '/home/doi/www/seiyuu/db/DB.profile'; open(PF, "<$pf"); my @all = ; close(PF); %kanji = (); foreach $pl (@all) { chop($pl); ($r, $k) = split(/\t/, $pl, 2); $kanji{$r} = $k; } } # # write data for WWW use (for CD) # sub write_wwwcd { my(@e_name, @e_url, @e_role); my($en, $eu, $er); my $www_index = "$wwwdir/Index"; my $www_out; system "/bin/mv $wwwdir $wwwdir.old"; mkdir($wwwdir, 0755); open(INDEX, ">$www_index"); my $i = 0; foreach $k (keys(%s_titles)) { printf INDEX "%05d:%s\n", $i, $k; $www_out = sprintf("$wwwdir/%05d", $i); open(WWWOUT, ">$www_out"); @e_name = split(/\t/, $s_titles{$k}); @e_url = split(/\t/, $s_url{$k}); @e_role = split(/\t/, $s_role{$k}); @e_eps = split(/\t/, $s_eps{$k}); while ($en = shift(@e_name)) { $eu = shift(@e_url); $er = shift(@e_role); $ep = shift(@e_eps); my @x = split(/,/, $en); print WWWOUT "$x[1]"; if ($eu) { if ($eu =~ m/^\//) { print WWWOUT ""; } else { print WWWOUT ""; } } print WWWOUT "$x[0]"; if ($eu) { print WWWOUT ""; } print WWWOUT "" . $er; print WWWOUT " {$ep}" if ($ep); print WWWOUT "\n"; } close(WWWOUT); $i++; } close(INDEX); } # # write data for WWW use (for titles) # sub write_wwwtitle { my(@e_name, @e_url, @e_role); my($en, $eu, $er); my $www_index = "$wwwdir/Index"; my $www_out; system "/bin/mv $wwwdir $wwwdir.old"; mkdir($wwwdir, 0755); open(INDEX, ">$www_index"); my $i = 0; foreach $k (keys(%s_titles)) { printf INDEX "%05d:%s\n", $i, $k; $www_out = sprintf("$wwwdir/%05d", $i); open(WWWOUT, ">$www_out"); @e_name = split(/\t/, $s_titles{$k}); @e_url = split(/\t/, $s_url{$k}); while ($en = shift(@e_name)) { $eu = shift(@e_url); print WWWOUT "
  • "; if ($eu) { if ($eu =~ m/^\//) { print WWWOUT ""; } else { print WWWOUT ""; } } print WWWOUT "$en"; if ($eu) { print WWWOUT ""; } print WWWOUT "\n"; } close(WWWOUT); $i++; } close(INDEX); } # # write data for WWW use (for roles) # sub write_wwwrole { my(@e_name, @e_url, @e_role); my($en, $eu, $er); my $www_index = "$wwwdir/Index"; my $www_out; system "/bin/mv $wwwdir $wwwdir.old"; mkdir($wwwdir, 0755); open(INDEX, ">$www_index"); my $i = 0; foreach $k (keys(%s_titles)) { printf INDEX "%05d:%s\n", $i, $k; $www_out = sprintf("$wwwdir/%05d", $i); open(WWWOUT, ">$www_out"); @e_name = split(/\t/, $s_titles{$k}); @e_url = split(/\t/, $s_url{$k}); @e_role = split(/\t/, $s_role{$k}); @e_eps = split(/\t/, $s_eps{$k}); @e_debut = split(/\t/, $s_debut{$k}); while ($en = shift(@e_name)) { $eu = shift(@e_url); $er = shift(@e_role); $ee = shift(@e_eps); $ed = shift(@e_debut); print WWWOUT " "; if ($eu) { if ($eu =~ m/^\//) { print WWWOUT ""; } else { print WWWOUT ""; } } print WWWOUT "$en"; if ($eu) { print WWWOUT ""; } if ($ee) { print WWWOUT " {$ee}"; } if ($ed) { print WWWOUT " [$ed]"; } print WWWOUT " $er\n"; } close(WWWOUT); $i++; } close(INDEX); }