Augmenter: hook Augmenters into DataStore and enable augmenting for some Importers
[nonametv.git] / lib / NonameTV / Augmenter / Tvdb.pm
blob66d010732c682c06de639c221524edee6fd2a969
1 package NonameTV::Augmenter::Tvdb;
3 use strict;
4 use warnings;
6 use Data::Dumper;
7 use Encode;
8 use TVDB::API;
10 use NonameTV qw/norm/;
11 use NonameTV::Augmenter::Base;
12 use NonameTV::Config qw/ReadConfig/;
13 use NonameTV::Log qw/w/;
15 use base 'NonameTV::Augmenter::Base';
18 sub new {
19 my $proto = shift;
20 my $class = ref($proto) || $proto;
21 my $self = $class->SUPER::new( @_ );
22 bless ($self, $class);
24 defined( $self->{ApiKey} ) or die "You must specify ApiKey";
25 defined( $self->{Language} ) or die "You must specify Language";
27 # need config for main content cache path
28 my $conf = ReadConfig( );
30 my $cachefile = $conf->{ContentCachePath} . '/' . $self->{Type} . '/tvdb.db';
31 my $bannerdir = $conf->{ContentCachePath} . '/' . $self->{Type} . '/banner';
33 $self->{tvdb} = TVDB::API::new({ apikey => $self->{ApiKey},
34 lang => $self->{Language},
35 cache => $cachefile,
36 banner => $bannerdir,
37 });
38 $self->{tvdb}->getUpdates( 'guess' );
40 my $opt = { quiet => 1 };
41 Debug::Simple::debuglevels($opt);
43 return $self;
47 sub FillHash( $$$$ ) {
48 my( $self, $resultref, $series, $episode )=@_;
50 return if( !defined $episode );
52 my $episodeid = $series->{Seasons}[$episode->{SeasonNumber}][$episode->{EpisodeNumber}];
54 $resultref->{title} = $series->{SeriesName};
56 $resultref->{episode} = ($episode->{SeasonNumber} - 1) . ' . ' . ($episode->{EpisodeNumber} - 1) . ' .';
58 $resultref->{subtitle} = decode( 'utf-8', $episode->{EpisodeName} );
60 if( defined( $episode->{Overview} ) ) {
61 $resultref->{description} = decode( 'utf-8', $episode->{Overview} ) . "\nQuelle: Tvdb";
64 $resultref->{production_date} = $episode->{FirstAired};
66 # FIXME link to the correct language instead of hardcoding german (14)
67 $resultref->{url} = sprintf(
68 'http://thetvdb.com/?tab=episode&seriesid=%d&seasonid=%d&id=%d&lid=%d',
69 $episode->{seriesid}, $episode->{seasonid}, $episodeid, 14
72 my @actors = split( '\|', decode( 'utf-8', $series->{Actors} ) );
73 foreach( @actors ){
74 $_ = norm( $_ );
75 if( $_ eq '' ){
76 $_ = undef;
79 @actors = grep{ defined } @actors;
80 if( @actors ) {
81 # replace programme's actors
82 $resultref->{actors} = join( ', ', @actors );
83 } else {
84 # remove existing actors from programme
85 $resultref->{actors} = undef;
88 $resultref->{program_type} = 'series';
92 sub AugmentProgram( $$$ ){
93 my( $self, $ceref, $ruleref ) = @_;
95 # empty hash to get all attributes to change
96 my $resultref = {};
97 # result string, empty/false for success, message/true for failure
98 my $result = '';
100 if( $ruleref->{matchby} eq 'episodeabs' ) {
101 # match by absolute episode number from program hash
103 if( defined $ceref->{episode} ){
104 my( $episodeabs )=( $ceref->{episode} =~ m|^\s*\.\s*(\d+)\s*/?\s*\d*\s*\.\s*$| );
105 if( defined $episodeabs ){
106 $episodeabs += 1;
108 my $series;
109 if( defined( $ruleref->{remoteref} ) ) {
110 my $seriesname = $self->{tvdb}->getSeriesName( $ruleref->{remoteref} );
111 $series = $self->{tvdb}->getSeries( $seriesname );
112 } else {
113 $series = $self->{tvdb}->getSeries( $ceref->{title} );
115 if( defined $series ){
116 my $episode = $self->{tvdb}->getEpisodeAbs( $series->{SeriesName}, $episodeabs );
118 if( defined( $episode ) ) {
119 $self->FillHash( $resultref, $series, $episode );
120 } else {
121 w( "no absolute episode " . $episodeabs . " found for '" . $ceref->{title} . "'" );
122 $resultref = undef;
125 } else {
126 $resultref = undef;
128 } else {
129 $resultref = undef;
131 }elsif( $ruleref->{matchby} eq 'episodetitle' ) {
132 # match by episode title from program hash
134 if( defined( $ceref->{subtitle} ) ) {
135 my $series;
136 if( defined( $ruleref->{remoteref} ) ) {
137 my $seriesname = $self->{tvdb}->getSeriesName( $ruleref->{remoteref} );
138 $series = $self->{tvdb}->getSeries( $seriesname );
139 } else {
140 $series = $self->{tvdb}->getSeries( $ceref->{title} );
143 my $episodetitle = $ceref->{subtitle};
144 $episodetitle =~ s|,\s+Teil\s+(\d+)$| ($1)|;
145 $episodetitle =~ s|\s+-\s+Teil\s+(\d+)$| ($1)|;
146 $episodetitle =~ s|\s+\(Teil\s+(\d+)\)$| ($1)|;
147 $episodetitle =~ s|\s+-\s+(\d+)\.\s+Teil$| ($1)|;
149 my $episode = $self->{tvdb}->getEpisodeByName( $series->{SeriesName}, $episodetitle );
150 if( defined( $episode ) ) {
151 $self->FillHash( $resultref, $series, $episode );
152 } else {
153 $resultref = undef;
155 } else {
156 $resultref = undef;
159 }else{
160 $result = "don't know how to match by '" . $ruleref->{matchby} . "'";
163 return( $resultref, $result );