#!/usr/bin/perl

# ラノベの杜（http://ranobe-mori.net/db/）からダウンロードしたtsvファイルにアマゾンから取得したあらすじを追加する。
# ダウンロードしたtsvファイルは文字コードをUTF-8に変換しておくこと。
# perl get_amazon_data.pl input_file > output_file

use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Cookies;
use Encode qw/decode/;
use Encode qw/encode/;
use utf8;

my $ua = LWP::UserAgent->new(agent => "Mozilla/5.0");
my $cookie_jar = HTTP::Cookies->new(file => "cookie.txt", autosave => 1, ignore_discard => 1);
$ua->cookie_jar($cookie_jar);

open IN, "$ARGV[0]" or die;
while (<IN>) {
	my $line = decode('UTF-8', $_);
	chomp $line;
	my @data = split /\t/, $line;
	my $isbn = $data[5];

	# ISBN-13をISBN-10に変換する
	if ($isbn =~ /^978/) {
		$isbn =~ s/^978-//;
		$isbn =~ s/-.$//;
		$isbn =~ s/-//g;
		my $count = 10;
		my $check = 0;
		for (my $i = 0; $i < 9; $i++) {
			my $num = substr($isbn, $i, 1);
			$check = $check + $count * $num;
			--$count;
		}
		$check = 11 - ($check % 11);
		if ($check == 11) {
			$check = 0;
		} elsif ($check == 10) {
			$check = 'X';
		}
		$isbn = $isbn . $check;
	} else {
		$isbn =~ s/-//g;
	}

	# ISBN-10からアマゾンの該当ページを取得してあらすじ部分を抽出する。
	my $url = 'http://www.amazon.co.jp/dp/' . $isbn;
	sleep(3);
	my $content = &get_content($url);
	$content =~ s/\n//g;
	if ($content =~ /<h3 class="productDescriptionSource">内容/) {
		$content =~ s/^.*<h3 class="productDescriptionSource">内容.*?<div class="productDescriptionWrapper">(.*?)<\/div>.*$/$1/;
		$content =~ s/<[^>]+>//g;
		$content =~ s/^ +//;
		$content =~ s/ +$//;
	} else {
		$content = '';
	}
	print encode('UTF-8', "$line\t$content\n");
}
close IN;

# 指定されたURLのファイルを取得する。
# 取得したファイルの文字コードはShift-JISとする。
# 取得に失敗した場合、10回まで繰り返し、それでも失敗した場合はstatus codeを返す。
sub get_content {
	my $url = $_[0];
	my $req = HTTP::Request->new(GET => $url);
	$req->content_type('text/html');
	my $res = '';

	for ( my $i = 1; $i <= 10; $i++ ) {
		$res = $ua->request($req);
		if ($res->code == 200) {
			my $content = $res->content;
			$content = decode('shiftjis', $content);
			return $content;
		}
		sleep(10);
	}

	my $code = $res->code;
	return "$code";
}

