#!/usr/bin/perl

#extractnzb: Reassembles the file described within an NZB from the cache.
#            Does not perform any network access: Use cachenzb for that.

use XML::LibXML;
use XML::LibXML::Common;
use XML::NamespaceSupport;
use XML::SAX;
use IO::Socket;
use Digest::MD5 'md5_hex';

chdir "/home/goldenpi/usenetcache/";

if($#ARGV <=1){
  dumpHelpAndDie;
}
my $getpar2s=0;
foreach $option (@ARGV){

  if($option eq "-p"){
    $getpar2s=1;
    print "Extracting par2 files.\n";
  }
}





foreach $option (@ARGV){
  if(substr($option, 0, 1) ne "-"){
    processNZB($option);
  }
}

exit 0;

sub processNZB{
  my($filename)=@_;

  my $parser = XML::LibXML->new();
  my $doc = $parser->parse_file($filename);
  $filesystem = $doc->getDocumentElement();
  @nodes=$filesystem->childNodes;

  foreach $node (@nodes) {
    if($node->nodeName eq "file"){
      getFile($node, $filename);
    }
  }
}

sub getFile{
    mkdir("out");

    my($node, $filename)=@_; #The node is the file.
    $subject = $node->getAttribute("subject"); #Temporary subject.
#    print $subject."\n";
    if($getpar2s == ($subject !~ m/\.PAR2/i)){
      print "Skipping par2\n";
      return;
    }
    $segmentsnode=$node->getChildrenByTagName("segments")->item(0);
    @segments=$segmentsnode->getChildrenByTagName("segment");

    foreach $segment (@segments){
      #print $segment->getAttribute("bytes")." ".$segment->textContent."\n";
      getSegment($segment->textContent, $filename)
    }
 
 
 
}

sub getSegment{
  my($segment, $filename)=@_;
  my $outfilename=$filename;

  $outfilename =~ s/^.*\///;
  $outfilename =~ s/nzb/ntx/;

  print "Getting ".$segment."\n";

  my $cachefile=md5_hex $segment;
  $cachefile=chop($cachefile)."/".$segment;
  print "$cachefile\n";
  if(-e $cachefile){
#    print "Filename: $outfilename\n";	
     `cat \'$cachefile\' >> \'out/$outfilename\'`;
#    open(OUTFILE, ">>out/$outfilename");
#    print OUTFILE @data;
#    close(OUTFILE);
  }
}

sub dumpHelpAndDie{
print "extractnzb [options] <nzbfile>\n  Options:\n    -p      - Get PAR2 files only (Normally PAR2 files are not retrieved).\n";
die;
}

