This repository has been archived on 2025-02-01. You can view files and clone it, but cannot push or open issues or pull requests.
seriesmailer/lib/SeriesMailer/App.pm
Thomas Schwery b5552ced50 First draft
2012-06-30 16:04:07 +02:00

110 lines
3.5 KiB
Perl

package SeriesMailer::App;
use Dancer ':syntax';
use WWW::Mechanize;
use MIME::Base64;
use Digest::SHA1 qw(sha1 sha1_hex sha1_base64);
our $VERSION = '0.1';
get '/list' => sub {
my $today = "TODAY";
forward '/list/' . $today;
};
get '/list/:date' => sub {
forward '/list/' . params->{date} . '/7';
};
get '/list/:date/:days' => sub {
my $browser = WWW::Mechanize->new();
$browser->default_header(
Authorization => 'Basic ' . encode_base64( setting("user") . ':' . setting("password") ) );
my $list_url = "http://api.trakt.tv/user/calendar/shows.json/" .setting("api_key"). "/" .setting("user"). "/";
if (params->{date} =~ m/^\d+$/) {
$list_url = $list_url . params->{date} . '/' . params->{days};
}
eval {
$browser->get($list_url);
} or do {
return "Error while getting server answer";
};
my $json_content = from_json($browser->content());
my $user_text;
foreach my $date (@{$json_content}) {
foreach my $episode (@{$date->{episodes}}) {
$user_text .= $date->{date} . ": " . $episode->{show}->{title} . "\n";
my $ep_title = sprintf "%02d",$episode->{episode}->{season};
$ep_title .= "x" . sprintf "%02d",$episode->{episode}->{number};
$ep_title .= " - " . $episode->{episode}->{title};
$user_text .= " " . $ep_title . "\n";
$user_text .= " " . $episode->{episode}->{overview} . "\n";
my $validation_url = uri_for('/seen') . "/";
$validation_url .= $episode->{show}->{tvdb_id} . "/";
$validation_url .= $episode->{episode}->{season} . "/";
$validation_url .= $episode->{episode}->{number} . "/";
my $validation_token = setting("user");
$validation_token .= $episode->{show}->{tvdb_id};
$validation_token .= $episode->{episode}->{season};
$validation_token .= $episode->{episode}->{number};
$validation_url .= sha1_hex($validation_token);
$user_text .= " " . $validation_url . "\n";
$user_text .= "\n";
}
}
return $user_text;
};
get '/seen/:serie_id/:season/:episode/:secret' => sub {
my $validation_token = setting("user");
$validation_token .= params->{serie_id};
$validation_token .= params->{season};
$validation_token .= params->{episode};
if ( sha1_hex($validation_token) ne params->{secret} ) {
debug "Validation should be " . sha1_hex($validation_token) . " but is " . params->{secret};
send_error("Not allowed", 403);
}
my $browser = WWW::Mechanize->new();
my %test_ei = ("season" => params->{season}, "episode" => params->{episode});
my @test_ep = (\%test_ei);
my %test_a = (
"username" => setting("user"),
"password" => sha1_hex(setting("password")),
"tvdb_id" => params->{serie_id},
"episodes" => (\@test_ep) );
my $json_encode = to_json(\%test_a);
debug "Seen JSON sent is: " . $json_encode;
my $seen_url = "http://api.trakt.tv/show/episode/seen/" . setting("api_key");
my $req = HTTP::Request->new(POST => $seen_url);
$req->content_type('application/json');
$req->content($json_encode);
$browser->request($req);
my $req_answer = from_json($browser->content());
debug to_json($req_answer);
return $req_answer->{message};
};
true;