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;