dbiesecke
7/28/2015 - 10:13 PM

Export Amazon Mangas to JPEG

Export Amazon Mangas to JPEG

It's possible to Dump a buyed eBook to HDD with read.amazon.com.

The Chrome Webapp will store the JPEG files of our Manga in $HOME/.config/chromium/Profile 1/databases/https_read.amazon.com_0/9, a sqlite db.

the following script will try to dump all base64 links & dumpt all to HDD.

  % ~/bin/dump_manga.sh "Für immer mein Vol.01"                                                                                                                                                                         :(
  [X] Created:     48      Für immer mein Vol.01.html
    adding: Für immer mein Vol.01-1.jpg (deflated 19%)
    adding: Für immer mein Vol.01-10.jpg (deflated 7%)
    adding: Für immer mein Vol.01-100.jpg (deflated 10%)
    adding: Für immer mein Vol.01-101.jpg (deflated 9%)
    adding: Für immer mein Vol.01-102.jpg (deflated 8%)
    adding: Für immer mein Vol.01-103.jpg (deflated 7%)
    adding: Für immer mein Vol.01-104.jpg (deflated 6%)
    adding: Für immer mein Vol.01-105.jpg (deflated 5%)
    adding: Für immer mein Vol.01-106.jpg (deflated 5%)
    adding: Für immer mein Vol.01-107.jpg (deflated 8%)
    adding: Für immer mein Vol.01-108.jpg (deflated 6%)
    adding: Für immer mein Vol.01-109.jpg (deflated 6%)
    adding: Für immer mein Vol.01-11.jpg (deflated 4%)
    adding: Für immer mein Vol.01-110.jpg (deflated 6%)
    adding: Für immer mein Vol.01-111.jpg (deflated 4%)
    adding: Für immer mein Vol.01-112.jpg (deflated 8%)
    adding: Für immer mein Vol.01-113.jpg (deflated 6%)
    adding: Für immer mein Vol.01-114.jpg (deflated 8%)
    adding: Für immer mein Vol.01-115.jpg (deflated 6%)
    adding: Für immer mein Vol.01-116.jpg (deflated 9%)
    adding: Für immer mein Vol.01-117.jpg (deflated 9%)
    adding: Für immer mein Vol.01-118.jpg (deflated 5%)
    adding: Für immer mein Vol.01-119.jpg (deflated 6%)
    adding: Für immer mein Vol.01-12.jpg (deflated 6%)
    adding: Für immer mein Vol.01-120.jpg (deflated 6%)
    adding: Für immer mein Vol.01-121.jpg (deflated 9%)
    adding: Für immer mein Vol.01-122.jpg (deflated 5%)
    adding: Für immer mein Vol.01-123.jpg (deflated 5%)
    adding: Für immer mein Vol.01-124.jpg (deflated 5%)
    adding: Für immer mein Vol.01-125.jpg (deflated 3%)
    adding: Für immer mein Vol.01-126.jpg (deflated 4%)
    adding: Für immer mein Vol.01-127.jpg (deflated 6%)
    adding: Für immer mein Vol.01-128.jpg (deflated 3%)
    adding: Für immer mein Vol.01-129.jpg (deflated 6%)
    adding: Für immer mein Vol.01-13.jpg (deflated 7%)
    adding: Für immer mein Vol.01-130.jpg (deflated 5%)
    adding: Für immer mein Vol.01-131.jpg (deflated 5%)
    adding: Für immer mein Vol.01-132.jpg (deflated 6%)
    adding: Für immer mein Vol.01-133.jpg (deflated 5%)
    adding: Für immer mein Vol.01-134.jpg (deflated 3%)
    adding: Für immer mein Vol.01-135.jpg (deflated 5%)
    adding: Für immer mein Vol.01-136.jpg (deflated 9%)
    adding: Für immer mein Vol.01-137.jpg (deflated 6%)
    adding: Für immer mein Vol.01-138.jpg (deflated 5%)
    adding: Für immer mein Vol.01-139.jpg (deflated 8%)
    adding: Für immer mein Vol.01-14.jpg (deflated 4%)
    adding: Für immer mein Vol.01-140.jpg (deflated 6%)
    adding: Für immer mein Vol.01-141.jpg (deflated 7%)
    adding: Für immer mein Vol.01-142.jpg (deflated 11%)
    adding: Für immer mein Vol.01-143.jpg (deflated 6%)
    adding: Für immer mein Vol.01-144.jpg (deflated 9%)
    adding: Für immer mein Vol.01-145.jpg (deflated 7%)
    adding: Für immer mein Vol.01-146.jpg (deflated 10%)
    adding: Für immer mein Vol.01-147.jpg (deflated 9%)
    adding: Für immer mein Vol.01-148.jpg (deflated 7%)
    adding: Für immer mein Vol.01-149.jpg (deflated 11%)
    adding: Für immer mein Vol.01-15.jpg (deflated 6%)
    adding: Für immer mein Vol.01-150.jpg (deflated 4%)
    adding: Für immer mein Vol.01-151.jpg (deflated 6%)
    adding: Für immer mein Vol.01-152.jpg (deflated 9%)
    adding: Für immer mein Vol.01-153.jpg (deflated 7%)
    adding: Für immer mein Vol.01-154.jpg (deflated 5%)
    adding: Für immer mein Vol.01-155.jpg (deflated 7%)
    adding: Für immer mein Vol.01-156.jpg (deflated 6%)
    adding: Für immer mein Vol.01-157.jpg (deflated 4%)
    adding: Für immer mein Vol.01-158.jpg (deflated 5%)
    adding: Für immer mein Vol.01-159.jpg (deflated 5%)
    adding: Für immer mein Vol.01-16.jpg (deflated 5%)
    adding: Für immer mein Vol.01-160.jpg (deflated 7%)
    adding: Für immer mein Vol.01-161.jpg (deflated 12%)
    adding: Für immer mein Vol.01-162.jpg (deflated 5%)
    adding: Für immer mein Vol.01-163.jpg (deflated 5%)
    adding: Für immer mein Vol.01-164.jpg (deflated 5%)
    adding: Für immer mein Vol.01-165.jpg (deflated 7%)
    adding: Für immer mein Vol.01-166.jpg (deflated 4%)
    adding: Für immer mein Vol.01-167.jpg (deflated 9%)
    adding: Für immer mein Vol.01-168.jpg (deflated 9%)
    adding: Für immer mein Vol.01-169.jpg (deflated 5%)
    adding: Für immer mein Vol.01-17.jpg (deflated 8%)
    adding: Für immer mein Vol.01-170.jpg (deflated 5%)
    adding: Für immer mein Vol.01-171.jpg (deflated 6%)
    adding: Für immer mein Vol.01-172.jpg (deflated 11%)
    adding: Für immer mein Vol.01-173.jpg (deflated 5%)
    adding: Für immer mein Vol.01-174.jpg (deflated 6%)
    adding: Für immer mein Vol.01-175.jpg (deflated 5%)
    adding: Für immer mein Vol.01-176.jpg (deflated 4%)
    adding: Für immer mein Vol.01-177.jpg (deflated 8%)
    adding: Für immer mein Vol.01-178.jpg (deflated 5%)
    adding: Für immer mein Vol.01-179.jpg (deflated 7%)
    adding: Für immer mein Vol.01-18.jpg (deflated 7%)
    adding: Für immer mein Vol.01-180.jpg (deflated 6%)
    adding: Für immer mein Vol.01-181.jpg (deflated 7%)
    adding: Für immer mein Vol.01-182.jpg (deflated 7%)
    adding: Für immer mein Vol.01-183.jpg (deflated 4%)
    adding: Für immer mein Vol.01-184.jpg (deflated 3%)
    adding: Für immer mein Vol.01-185.jpg (deflated 7%)
    adding: Für immer mein Vol.01-186.jpg (deflated 3%)
    adding: Für immer mein Vol.01-187.jpg (deflated 7%)
    adding: Für immer mein Vol.01-188.jpg (deflated 99%)
    adding: Für immer mein Vol.01-189.jpg (deflated 1%)
    adding: Für immer mein Vol.01-19.jpg (deflated 5%)
    adding: Für immer mein Vol.01-190.jpg (deflated 17%)
    adding: Für immer mein Vol.01-191.jpg (deflated 10%)
    adding: Für immer mein Vol.01-192.jpg (deflated 8%)
    adding: Für immer mein Vol.01-2.jpg (deflated 10%)
    adding: Für immer mein Vol.01-20.jpg (deflated 11%)
    adding: Für immer mein Vol.01-21.jpg (deflated 6%)
    adding: Für immer mein Vol.01-22.jpg (deflated 5%)
    adding: Für immer mein Vol.01-23.jpg (deflated 7%)
    adding: Für immer mein Vol.01-24.jpg (deflated 6%)
    adding: Für immer mein Vol.01-25.jpg (deflated 3%)
    adding: Für immer mein Vol.01-26.jpg (deflated 6%)
    adding: Für immer mein Vol.01-27.jpg (deflated 5%)
    adding: Für immer mein Vol.01-28.jpg (deflated 6%)
    adding: Für immer mein Vol.01-29.jpg (deflated 8%)
    adding: Für immer mein Vol.01-3.jpg (deflated 8%)
    adding: Für immer mein Vol.01-30.jpg (deflated 4%)
    adding: Für immer mein Vol.01-31.jpg (deflated 8%)
    adding: Für immer mein Vol.01-32.jpg (deflated 6%)
    adding: Für immer mein Vol.01-33.jpg (deflated 6%)
    adding: Für immer mein Vol.01-34.jpg (deflated 5%)
    adding: Für immer mein Vol.01-35.jpg (deflated 11%)
    adding: Für immer mein Vol.01-36.jpg (deflated 8%)
    adding: Für immer mein Vol.01-37.jpg (deflated 7%)
    adding: Für immer mein Vol.01-38.jpg (deflated 6%)
    adding: Für immer mein Vol.01-39.jpg (deflated 12%)
    adding: Für immer mein Vol.01-4.jpg (deflated 9%)
    adding: Für immer mein Vol.01-40.jpg (deflated 10%)
    adding: Für immer mein Vol.01-41.jpg (deflated 5%)
    adding: Für immer mein Vol.01-42.jpg (deflated 3%)
    adding: Für immer mein Vol.01-43.jpg (deflated 6%)
    adding: Für immer mein Vol.01-44.jpg (deflated 8%)
    adding: Für immer mein Vol.01-45.jpg (deflated 5%)
    adding: Für immer mein Vol.01-46.jpg (deflated 4%)
    adding: Für immer mein Vol.01-47.jpg (deflated 9%)
    adding: Für immer mein Vol.01-48.jpg (deflated 8%)
    adding: Für immer mein Vol.01-49.jpg (deflated 6%)
    adding: Für immer mein Vol.01-5.jpg (deflated 7%)
    adding: Für immer mein Vol.01-50.jpg (deflated 5%)
    adding: Für immer mein Vol.01-51.jpg (deflated 7%)
    adding: Für immer mein Vol.01-52.jpg (deflated 7%)
    adding: Für immer mein Vol.01-53.jpg (deflated 7%)
    adding: Für immer mein Vol.01-54.jpg (deflated 4%)
    adding: Für immer mein Vol.01-55.jpg (deflated 6%)
    adding: Für immer mein Vol.01-56.jpg (deflated 11%)
    adding: Für immer mein Vol.01-57.jpg (deflated 11%)
    adding: Für immer mein Vol.01-58.jpg (deflated 9%)
    adding: Für immer mein Vol.01-59.jpg (deflated 5%)
    adding: Für immer mein Vol.01-6.jpg (deflated 9%)
    adding: Für immer mein Vol.01-60.jpg (deflated 5%)
    adding: Für immer mein Vol.01-61.jpg (deflated 8%)
    adding: Für immer mein Vol.01-62.jpg (deflated 6%)
    adding: Für immer mein Vol.01-63.jpg (deflated 5%)
    adding: Für immer mein Vol.01-64.jpg (deflated 6%)
    adding: Für immer mein Vol.01-65.jpg (deflated 7%)
    adding: Für immer mein Vol.01-66.jpg (deflated 7%)
    adding: Für immer mein Vol.01-67.jpg (deflated 4%)
    adding: Für immer mein Vol.01-68.jpg (deflated 6%)
    adding: Für immer mein Vol.01-69.jpg (deflated 7%)
    adding: Für immer mein Vol.01-7.jpg (deflated 8%)
    adding: Für immer mein Vol.01-70.jpg (deflated 6%)
    adding: Für immer mein Vol.01-71.jpg (deflated 6%)
    adding: Für immer mein Vol.01-72.jpg (deflated 4%)
    adding: Für immer mein Vol.01-73.jpg (deflated 7%)
    adding: Für immer mein Vol.01-74.jpg (deflated 9%)
    adding: Für immer mein Vol.01-75.jpg (deflated 6%)
    adding: Für immer mein Vol.01-76.jpg (deflated 6%)
    adding: Für immer mein Vol.01-77.jpg (deflated 6%)
    adding: Für immer mein Vol.01-78.jpg (deflated 4%)
    adding: Für immer mein Vol.01-79.jpg (deflated 4%)
    adding: Für immer mein Vol.01-8.jpg (deflated 7%)
    adding: Für immer mein Vol.01-80.jpg (deflated 6%)
    adding: Für immer mein Vol.01-81.jpg (deflated 5%)
    adding: Für immer mein Vol.01-82.jpg (deflated 8%)
    adding: Für immer mein Vol.01-83.jpg (deflated 5%)
    adding: Für immer mein Vol.01-84.jpg (deflated 7%)
    adding: Für immer mein Vol.01-85.jpg (deflated 5%)
    adding: Für immer mein Vol.01-86.jpg (deflated 5%)
    adding: Für immer mein Vol.01-87.jpg (deflated 5%)
    adding: Für immer mein Vol.01-88.jpg (deflated 7%)
    adding: Für immer mein Vol.01-89.jpg (deflated 4%)
    adding: Für immer mein Vol.01-9.jpg (deflated 7%)
    adding: Für immer mein Vol.01-90.jpg (deflated 7%)
    adding: Für immer mein Vol.01-91.jpg (deflated 5%)
    adding: Für immer mein Vol.01-92.jpg (deflated 5%)
    adding: Für immer mein Vol.01-93.jpg (deflated 7%)
    adding: Für immer mein Vol.01-94.jpg (deflated 5%)
    adding: Für immer mein Vol.01-95.jpg (deflated 4%)
    adding: Für immer mein Vol.01-96.jpg (deflated 9%)
    adding: Für immer mein Vol.01-97.jpg (deflated 8%)
    adding: Für immer mein Vol.01-98.jpg (deflated 4%)
    adding: Für immer mein Vol.01-99.jpg (deflated 7%)
#!/usr/bin/perl
use Data::Dumper;
use FindBin qw( $Bin);
use File::MimeInfo qw(mimetype);
use JSON;
use LWP::Simple qw(get);
use Image::ExifTool;
      use Data::Dump::XML;
my ($DBHOME) = findDatabase();     

sub loadUp(){
    my $mudb;
    my $home = "$ENV{'HOME'}";
    my $mudbfile = $home."/.mudb.json";
    if (-f $mudbfile) {
	    open(FILE,'<',$mudbfile);
		  while (<FILE>) {
		    $mudb .= $_;
		  }
	    close(FILE);
    }else {
	    print "[X] mudb.json not found, downloading it...\n";
	    $mudb = get('http://mcd.iosphe.re/api/v1/database/');
	    open(my $fh,'>',$mudbfile);
		    print $fh $mudb;
	    close($fh);	
    }
    return decode_json($mudb);
}




sub searchManga {
#   my $self = shift;
#   $self->{ref} = {};
	my ($search) = @_;
	my $db = loadUp();
# 	print "[Search] $search\n";
	foreach my $id (keys %{ $db } ){
		foreach my $title (@{ $db->{$id} }) {
			#print $title."\n" if ( $title=~ /$search/ );
			next if not ($title =~/^$search$/i);
			return decode_json(get('http://mcd.iosphe.re/api/v1/series/'.$id.'/'));
# 		 	return $self;
		}
	}

}      
      
# my $mt    = MIME::Types->new();    # MIME::Types object

sub getVolFromTitel {
    my ($title) = @_;
    if ( $title=~ m/[\s]?(\d+)[\s]?$/ ) {
      return $1;
    }
    
}

sub parseTitle {
    my ($title) = @_;
    my ($note,$volume) = "0";
    my $full_title = $title;
    $title =~ s/Vol[\s]?(\d+)/$1/ig;
#     print "$title\n";
    if ( $title=~ m/\(([a-z ]+)\)[\s]?$/ig ) {
      $note = $1;
      $title =~ s/[ ]?\($note\)[ ]?//;
    }
    $volume = getVolFromTitel($title);
    if(getVolFromTitel($title)) {
	 my $vol = getVolFromTitel($title);
	 $title =~ s/[\s ]?$vol[\s ]?//;
    }
    #$ret->{volume}->{content} = $1 if($1);
    my $ret = { title =>  $full_title , series => $title, volume => $volume, note => "$note"};
    
#     print Dumper($ret);
    return $ret;

}


sub genComicInfoFromID {
      my ($id) = @_;
      my ($DBHOME) = findDatabase;
      my $meta = metadataFromId($id);
use XML::Simple;

my $xml = join "\n", <<EOF;
<?xml version="1.0" encoding="utf-8" ?>
<ComicInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <Series>Dragon Ball</Series>
   <Volume>1</Volume>
   <Writer>Akira Toriyama</Writer>
   <Manga>Yes</Manga>
   <ScanInformation>MCD(3106)</ScanInformation>
</ComicInfo>
EOF
my $doc = XMLin($xml,ForceContent => 1 , KeepRoot => 1);

# print Dumper($meta);
# $doc->{ComicInfo}->{Series} = 'TEST';
# Get the list of cities as a list, then push "Tokyo" to it.
my $author = $meta->{"authorList"}[0];
$author =~ s/,//g; 
$doc->{ComicInfo}->{Series}->{content} = $meta->{"title"};
$doc->{ComicInfo}->{ScanInformation}->{content} = "asin(".$meta->{"asin"}.")";
$doc->{ComicInfo}->{Writer}->{content} = $author;

# searchManga();

# B00J50RXUQ
#ScanInformation
#amazon_de:B00J50S1IY

print XMLout($doc, KeepRoot => 1); 
#       print parseTitle( $meta->{"title"});
      open(FILE,'>ComicInfo.xml');
	print FILE XMLout($doc, KeepRoot => 1);
      close(FILE);
}

sub findDatabase() {

      my $DBHOME = $ENV{'HOME'}."/.config/google-chrom*/Default/databases/https_read.amazon.com_0/";
      foreach(<~/.config/google-chrom*/Default/databases/https_read.amazon.com_0/*>) {
	my $mime_type = mimetype($_);
	next if !($mime_type=~/application\/octet-stream/);
	$DBHOME = $_;
# 	print $DBHOME."\n";
	my $cmd = `sqlite3 $DBHOME ".schema"`;
	if( ($cmd =~ /fragments/ig ) && ($cmd =~ /resources/ig ) ) {
# 	  print "[X] Found Database at: $DBHOME\n";
	  return $DBHOME;
	}
      }
      
    die("ERROR - No valid sqlite3 db from read.amazon.com found!" )   
}

sub getBooks() {
	my ($DBFILE) = findDatabase;
# 	my $arg =;
	my $cmd = `sqlite3  $DBFILE 'select asin from resources' | sort | uniq `;
	foreach(split(/\n/,$cmd)) {
	  print "[X] Book found:\t $_\n";
	  if(&getHashes($_)) {
#	 	print $cmd;
	  }
	} 

}

sub metadataFromId {
      my ($id) = @_;
	my ($DBHOME) = findDatabase;
	my $cmd = `sqlite3  $DBHOME "select metadata from bookinfo where asin='$id'" `;
	return from_json($cmd);
}



sub getCoverFromID {
      my ($id) = @_;

      use MIME::Base64 qw|decode_base64|;

	my $cmd = "sqlite3 -header -csv  '$DBHOME' \"select coverdata from covers WHERE asin='$id'\"";
	my $test = `$cmd`;
	chomp($test);
	# print $test."\n";
	if($test=~m/base64,(.*)\"$/ig) {
# 	  print "$1\n";
	  $cmd = decode_base64($1) or die("error $@");

	}
 
      open(FILE,'>',"cover.jpg");
	      print FILE $cmd;
      close(FILE);	
	    

}

sub getHashes() {
      my $id = $_[0];
	my ($DBHOME) = findDatabase;
      my $meta = metadataFromId($id);
      my $infos = parseTitle($meta->{"title"});
      my $manga = $infos->{'title'};
      my $author = join(" ",@{$meta->{"authorList"}});
#       $manga =~ s/,/ /g;
      print $manga."\n";
   
      print Dumper($meta);
#       exit;
      my $val = to_json($meta);
#       print Dumper(searchManga($infos->{'series'}));
#       exit;
      


chomp($manga);


system('echo "<html>\n<head>\n<title>Kindle</title>\n</head>\n<body>\n" > "'.$id.'-.html"; sqlite3 -header -csv  "'.$DBHOME.'" "select piece from resources WHERE asin=\''.$id.'\'" | grep "base64" | sed \'s/\"\"/<img src=/\' | sed \'s/\"\"\"/" \/>/\' > "'.$id.'-.html" ');


      my $size = sprintf("%.0f",(( -s $id.'-.html')/1000/1024));

      if($size < 1){
	    print "ERROR - getHashes\n";
	    return -1;
      }else { print "[X] Download $manga SUCCESS!\n";}
      
die("keep_photo_dump not found!") if (!(-f "$Bin/keep_photo_dump.py"));
mkdir("$id");chdir("$id");

system($Bin.'/keep_photo_dump.py "../'.$id.'-.html" && exiftool -all= *.jpg && rm *original;rm "../'.$id.'-.html"');

my $cmd = q{rename 'unless (/0+[0-9]{3}.jpg/) {s/-([0-9]{1,2}\.jpg)$/-00$1/g;s/0*([0-9]{3}\..*)/$1/}' *  };

system($cmd);
genComicInfoFromID($id);
getCoverFromID($id);
#['.$meta->{headerMetadata}->{publishingDate}.']
system('zip "../'.$manga.' - '.$author.'.cbz" *');   
chdir("./../");
system("rm -fR $id");
# system("rm ./'.$id.'.html");
       return $id.'-.html'
}



###############################

print Dumper(getBooks);
exit;