- Timestamp:
- Oct 11, 2009, 3:18:59 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
projects/CDDBeditor/bin/CDDBeditor
r858 r860 24 24 use CDDB_get qw( get_cddb get_discids ); 25 25 use Encode; 26 #use Linux::CDROM; 27 use Device::Cdio::Device; 28 use Device::Cdio::Track; 29 use File::Copy; 30 use File::Basename; 26 31 27 32 # Global variables … … 145 150 my $artist_label = Newt::Label("Artist: "); 146 151 my $empty_label = Newt::Label(" "); 147 #my $data_label = Newt::Label("Data: ");148 #my $raw_label = Newt::Label("Raw: ");149 152 my $title_label = Newt::Label("Title: "); 150 153 my $year_label = Newt::Label("Year: "); 151 my $id_label = Newt::Label("Id: "); 154 my $id_label = "Id: "; 155 my $rev_label = "Revision: "; 152 156 my $genre_label = Newt::Label("Genre: "); 153 157 my $category_label = Newt::Label("Category: "); … … 172 176 my %ce_config; 173 177 $ce_config{"CDDB_HOST"}="freedb.freedb.org"; 178 $ce_config{"CDDB_USER"}="freedb-submit\@freedb.org"; 179 $ce_config{"CDDB_CC"}="bruno\@victoria.frmug.org"; 174 180 $ce_config{"CDDB_PORT"}=888; 175 181 #$ce_config{"CDDB_PORT"}=80; … … 182 188 $ce_config{"HTTP_PROXY"}=$ENV{http_proxy} if $ENV{http_proxy}; 183 189 $ce_config{"input"}=0; 184 $ce_config{"HELLO_ID"} = "bruno musique-ancienne.org fastrip 0.77";185 190 $ce_config{"PROTO_VERSION"} = 6; 191 $ce_config{"DOMAIN"} = "musique-ancienne.org"; 192 $ce_config{"USER"} = "bruno"; 193 $ce_config{"HELLO_ID"} = "$ce_config{\"USER\"} $ce_config{\"DOMAIN\"} fastrip 0.77"; 194 195 # Copied from CDDB.pm 196 # Determine whether we can submit changes by e-mail. 186 197 187 198 # First panel for configuration parameters … … 267 278 $send_button->Tag("Send"); 268 279 280 my $firsttime = 1; 281 my $ce_cd; 282 my $artist_entry; 283 my $title_entry; 284 my $category_entry; 285 my $genre_entry; 286 my $tno_entry; 287 my $year_entry; 288 my @track_entry; 289 269 290 # Entering the loop 270 291 for (my $i=0 ; ; $i++) { … … 279 300 Newt::Refresh(); 280 301 281 # CDDB query 282 my %ce_cd = get_cddb(\%ce_config); 283 302 # CDDB query if first time 303 if ($firsttime eq 1) { 304 ($ce_cd) = get_cddb(\%ce_config) 305 } 306 $firsttime = 0; 307 308 if (not defined $ce_cd->{title}) { 309 # Get the disc id first 310 my $id = get_discids($ce_config{"CD_DEVICE"}); 311 $ce_cd->{id} = sprintf "%08x", $id->[0]; 312 313 # Try to find it locally 314 my @d = glob("$ENV{'HOME'}/.cddb/*/$ce_cd->{id}"); 315 foreach my $d (@d) { 316 $ce_cd->{cat} = basename(dirname($d)); 317 open(DISC,$d) || die "Unable to open $d"; 318 # Idea taken from CDDB_get 319 while (<DISC>) { 320 push @{$ce_cd->{raw}},$_; 321 if (/^TTITLE(\d+)\=\s*(\S.*)/) { 322 chomp($2); 323 $ce_cd->{track}[$1]=$2; 324 } elsif(/^DTITLE=\s*(\S.*)/) { 325 my $t = $1; 326 if ($t =~ /\//) { 327 ($ce_cd->{artist},$ce_cd->{title}) = split(/\s\/\s/,$t); 328 } else { 329 $ce_cd->{artist}=$t; 330 $ce_cd->{title}=$t; 331 } 332 chomp($ce_cd->{title}); 333 } elsif(/^DYEAR=\s*(\d+)/) { 334 $ce_cd->{year} = $1; 335 } elsif(/^DGENRE=\s*(\S.*)/) { 336 $ce_cd->{genre} = $1; 337 } elsif(/^\#\s+Revision:\s+(\d+)/) { 338 $ce_cd->{revision} = $1; 339 } 340 } 341 close(DISC); 342 } 343 344 # Pre allocate from the physical media 345 my $device = Device::Cdio::Device->new(-source=>$ce_config{"CD_DEVICE"}); 346 my $track = $device->get_last_track(); 347 $ce_cd->{tno} = $track->{track}; 348 my $n = 0; 349 350 # If they were not found 351 $ce_cd->{artist} = "" if (not defined $ce_cd->{artist}); 352 $ce_cd->{title} = "" if (not defined $ce_cd->{title}); 353 $ce_cd->{genre} = "" if (not defined $ce_cd->{genre}); 354 $ce_cd->{cat} = "" if (not defined $ce_cd->{cat}); 355 $ce_cd->{year} = "" if (not defined $ce_cd->{year}); 356 $ce_cd->{revision} = 0 if (not defined $ce_cd->{revision}); 357 358 # Going one track further for frame computation. 359 # Cf: http://www.gnu.org/software/libcdio/doxygen/track_8h.html 360 while ( $n <= $ce_cd->{tno}) { 361 $track->set_track($n+1); 362 # Again only if not found previously 363 $ce_cd->{track}[$n] = "" if (not defined $ce_cd->{track}[$n]); 364 my ($m, $s, $f) = split(/:/,$track->get_msf()); 365 $ce_cd->{frames}[$n] = $f + 75*$s + 75*60*$m; 366 $n++; 367 } 368 } 284 369 # Modify enconding of some fields if proto < 5 285 #$ce_cd {artist} = decode("iso8859-1",$ce_cd{artist});286 #$ce_cd {title} = decode("iso8859-1",$ce_cd{title});370 #$ce_cd->{artist} = decode("iso8859-1",$ce_cd->{artist}); 371 #$ce_cd->{title} = decode("iso8859-1",$ce_cd->{title}); 287 372 288 373 # Third panel to display CD Infos … … 293 378 $flag = NEWT_ENTRY_SCROLL; 294 379 $width = 40; 295 my $artist_entry = Newt::Entry($width, $flag, $ce_cd{artist});296 my $title_entry = Newt::Entry($width, $flag, $ce_cd{title});380 $artist_entry = Newt::Entry($width, $flag, $ce_cd->{artist}); 381 $title_entry = Newt::Entry($width, $flag, $ce_cd->{title}); 297 382 # http://www.freedb.org/en/faq.3.html 298 383 # Category list is data, folk, jazz, misc, rock, country, blues, newage, reggae, classical, and soundtrack 299 my $category_entry = Newt::Entry($width, $flag, $ce_cd{cat}); 300 my $genre_entry = Newt::Entry($width, $flag, $ce_cd{genre}); 301 #my $data_entry = Newt::Entry($width, $flag, Dumper(@{$ce_cd{data}})); 302 #my $raw_entry = Newt::Entry($width, $flag, Dumper(@{$ce_cd{raw}})); 303 my $tno_entry = Newt::Label($ce_cd{tno}); 384 $category_entry = Newt::Entry($width, $flag, $ce_cd->{cat}); 385 $genre_entry = Newt::Entry($width, $flag, $ce_cd->{genre}); 386 $tno_entry = Newt::Label($ce_cd->{tno}." - ".$id_label.$ce_cd->{id}." - ".$rev_label.$ce_cd->{revision}); 304 387 $width = 5; 305 my $year_entry = Newt::Entry($width, $flag, $ce_cd{year});388 $year_entry = Newt::Entry($width, $flag, $ce_cd->{year}); 306 389 307 390 # Build interface 308 $ce_panel = Newt::Panel( 3, $ce_sh, "CDDB Info");391 $ce_panel = Newt::Panel(4, $ce_sh, "CDDB Info"); 309 392 $flage = NEWT_ANCHOR_RIGHT; 310 393 $ce_panel->Add(0, 0, $artist_label,$flage); … … 331 414 $flage = NEWT_ANCHOR_LEFT; 332 415 $ce_panel->Add(1, 5, $tno_entry, $flage); 333 #$ce_panel->Add(0, 5, $data_label); 334 #$ce_panel->Add(1, 5, $data_entry, $flage); 335 #$ce_panel->Add(0, 6, $raw_label); 336 #$ce_panel->Add(1, 6, $raw_entry, $flage); 337 #$ce_panel->Add(0, 5, $info_label); 338 #$ce_panel->Add(1, 5, $info_entry, $flage); 339 340 my $n=1; 416 417 my $n=0; 341 418 $width = 40; 342 while ( $n <= $ce_cd{tno} ) {343 last if ($n > $ce_sh - 8);344 my $from=$ce_cd {frames}[$n-1];345 my $to=$ce_cd {frames}[$n]-1;419 while ( $n < $ce_cd->{tno} ) { 420 last if ($n > $ce_sh - 9); 421 my $from=$ce_cd->{frames}[$n]; 422 my $to=$ce_cd->{frames}[$n+1]-1; 346 423 my $dur=$to-$from; 347 424 my $min=int($dur/75/60); 348 425 my $sec=int($dur/75)-$min*60; 349 #my $frm=($dur-$sec*75-$min*75*60)*100/75; 350 my $tr = sprintf "Track %2d:", $n; 426 my $tr = sprintf "Track %2d:", $n+1; 351 427 my $track_label = Newt::Label($tr); 352 428 $tr = sprintf " %2d':%.2d", $min, $sec; 353 429 # Adapt encoding of track if proto < 5 354 #$ce_cd {track}[$n -1] = decode("iso8859-1",$ce_cd{track}[$n -1]);430 #$ce_cd->{track}[$n] = decode("iso8859-1",$ce_cd->{track}[$n]); 355 431 356 432 my $dur_label = Newt::Label($tr); 357 433 $flag = NEWT_FLAG_WRAP|NEWT_ENTRY_SCROLL; 358 my $track_entry = Newt::Entry($width, $flag, $ce_cd{track}[$n-1]);359 $ce_panel->Add(0, 8+$n, $track_label);360 $ce_panel->Add(1, 8+$n, $track_entry, $flage);361 $ce_panel->Add(2, 8+$n, $dur_label, $flage);434 $track_entry[$n] = Newt::Entry($width, $flag, $ce_cd->{track}[$n]); 435 $ce_panel->Add(0, 9+$n, $track_label); 436 $ce_panel->Add(1, 9+$n, $track_entry[$n], $flage); 437 $ce_panel->Add(2, 9+$n, $dur_label, $flage); 362 438 $n++; 363 364 $ce_panel->Add(0, 8+$n, $empty_label);365 366 $ce_panel->Add(0, 8+$n+1, $send_button);367 $ce_panel->Add(1, 8+$n+1, $reload_button);368 $ce_panel->Add(2, 8+$n+1, $quit_button);439 } 440 $ce_panel->Add(0, 9+$n, $empty_label); 441 442 $ce_panel->Add(0, 9+$n+1, $send_button); 443 $ce_panel->Add(1, 9+$n+1, $reload_button); 444 $ce_panel->Add(2, 9+$n+1, $quit_button); 369 445 370 446 Newt::Cls(); 371 447 Newt::Refresh(); 448 372 449 # Build interface 373 450 ($reason, $data) = $ce_panel->Run(); 374 451 375 $ce_cd{artist} = $artist_entry->Get(); 376 $ce_cd{title} = $title_entry->Get(); 377 $ce_cd{year} = $year_entry->Get(); 378 $ce_cd{cat} = $category_entry->Get(); 379 $ce_cd{genre} = $genre_entry->Get(); 452 $ce_cd->{artist} = $artist_entry->Get(); 453 $ce_cd->{title} = $title_entry->Get(); 454 $ce_cd->{year} = $year_entry->Get(); 455 $ce_cd->{cat} = $category_entry->Get(); 456 $ce_cd->{genre} = $genre_entry->Get(); 457 $n=1; 458 while ( $n <= $ce_cd->{tno} ) { 459 $ce_cd->{track}[$n-1] = $track_entry[$n-1]->Get(); 460 $n++; 461 } 380 462 Newt::Refresh(); 381 463 Newt::Cls(); … … 386 468 $flag = NEWT_FLAG_WRAP; 387 469 $width = 40; 388 my $height = 25;470 my $height = 10; 389 471 390 472 Newt::DrawRootText(ce_center_string($ce_title), 1, $ce_title); 391 473 Newt::PushHelpLine($ce_help); 392 474 393 ce_prepare_mail(\%ce_cd); 394 open(TEXT,"$ENV{'PBTMP'}/mail.txt") || die "Unable to open $ENV{'PBTMP'}/mail.txt"; 395 my $txt = ""; 396 #my $txt = pb_get_content("$ENV{'PBTMP'}/mail.txt"); 397 while (<TEXT>) { 398 next if (/^#/); 399 $txt .= $_; 400 } 475 my $txt = "Please wait while sending disc $ce_cd->{id} ($ce_cd->{cat}) to $ce_config{\"CDDB_USER\"}"; 401 476 my $info_tb = Newt::Textbox($width, $height, $flag, $txt); 402 477 403 478 Newt::Cls(); 404 479 $ce_panel = Newt::Panel(3, $width, "CDDB Sending Infos"); 405 $ce_panel->Add(0, 0, $wait_label); 406 $ce_panel->Add(0, 1, $info_tb); 407 $ce_panel->Add(0, 2, $quit_button); 480 $ce_panel->Add(0, 0, $info_tb); 481 $ce_panel->Add(0, 1, $quit_button); 408 482 Newt::Refresh(); 483 # TODO: Mail::Sendmail ? 484 ce_prepare_mail($ce_cd); 485 pb_system("mutt -s \"cddb $ce_cd->{cat} $ce_cd->{id}\" -c $ce_config{\"CDDB_CC\"} $ce_config{\"CDDB_USER\"} < $ENV{'HOME'}/.cddb/$ce_cd->{cat}/$ce_cd->{id}", "quiet"); 409 486 ($reason, $data) = $ce_panel->Run(); 487 488 # Force reloading info from cache 489 $ce_cd->{title} = undef; 490 } 491 if ($data->Tag() eq "Reload") { 492 # Then force CDDB query 493 $firsttime = 1; 410 494 } 411 495 } … … 430 514 my $ce_cd = shift; 431 515 432 open(MAIL, "> $ENV{'PBTMP'}/mail.txt") || die "Unable to create $ENV{'PBTMP'}/mail.txt"; 516 pb_mkdir_p("$ENV{'HOME'}/.cddb/$ce_cd->{cat}"); 517 open(MAIL, "> $ENV{'HOME'}/.cddb/$ce_cd->{cat}/$ce_cd->{id}") || die "Unable to create $ENV{'HOME'}/.cddb/$ce_cd->{cat}/$ce_cd->{id}"; 433 518 print MAIL "# xmcd CD database file\n#\n# Track frame offsets:\n"; 434 my $n= 1;435 while ( $n < =$ce_cd->{tno} ) {436 print MAIL "# ".$ce_cd->{frames}[$n -1]."\n";519 my $n=0; 520 while ( $n < $ce_cd->{tno} ) { 521 print MAIL "# ".$ce_cd->{frames}[$n]."\n"; 437 522 $n++; 438 523 } 439 my $from=$ce_cd->{frames}[0]; 440 my $to=$ce_cd->{frames}[$ce_cd->{tno}]; 441 my $dur=$to-$from; 442 my $sec=int($dur/75); 524 #my $from=int($ce_cd->{frames}[0]/75); 525 my $sec=int($ce_cd->{frames}[$ce_cd->{tno}]/75); 526 #my $sec=$to-$from; 443 527 my $rev = $ce_cd->{revision} + 1; 528 # Taken from CDDB.pm 444 529 print MAIL "#\n# Disc length: $sec seconds\n#\n"; 445 530 print MAIL "# Revision: $rev\n"; … … 447 532 print MAIL "# Submitted via: CDDBEditor $projver-$projrev\n"; 448 533 print MAIL "DISCID=$ce_cd->{id}\n"; 449 print MAIL "DTITLE=$ce_cd->{ title}\n";534 print MAIL "DTITLE=$ce_cd->{artist} / $ce_cd->{title}\n"; 450 535 print MAIL "DYEAR=$ce_cd->{year}\n"; 451 536 print MAIL "DGENRE=$ce_cd->{genre}\n"; 452 $n= 1;453 while ( $n < =$ce_cd->{tno} ) {454 print MAIL "TTITLE$n=$ce_cd->{track}[$n -1]\n";537 $n=0; 538 while ( $n < $ce_cd->{tno} ) { 539 print MAIL "TTITLE$n=$ce_cd->{track}[$n]\n"; 455 540 $n++; 456 541 } 457 542 print MAIL "EXTD=\n"; 458 $n= 1;459 while ( $n < =$ce_cd->{tno} ) {543 $n=0; 544 while ( $n < $ce_cd->{tno} ) { 460 545 print MAIL "EXTT$n=\n"; 461 546 $n++;
Note:
See TracChangeset
for help on using the changeset viewer.