File Coverage

blib/lib/TMDB/TV.pm
Criterion Covered Total %
statement 67 106 63.2
branch 8 40 20.0
condition 4 16 25.0
subroutine 18 23 78.2
pod 0 15 0.0
total 97 200 48.5


line stmt bran cond sub pod time code
1             package TMDB::TV;
2              
3             #######################
4             # LOAD CORE MODULES
5             #######################
6 3     3   19 use strict;
  3         5  
  3         112  
7 3     3   14 use warnings FATAL => 'all';
  3         3  
  3         215  
8 3     3   17 use Carp qw(croak carp);
  3         5  
  3         192  
9              
10             #######################
11             # LOAD CPAN MODULES
12             #######################
13 3     3   17 use Object::Tiny qw(id session);
  3         5  
  3         16  
14 3     3   647 use Params::Validate qw(validate_with :types);
  3         4  
  3         525  
15 3     3   20 use Locale::Codes::Country qw(all_country_codes);
  3         4  
  3         125  
16              
17             #######################
18             # LOAD DIST MODULES
19             #######################
20 3     3   13 use TMDB::Session;
  3         4  
  3         15  
21              
22             #######################
23             # VERSION
24             #######################
25             our $VERSION = '1.3.0';
26              
27             #######################
28             # PUBLIC METHODS
29             #######################
30              
31             ## ====================
32             ## Constructor
33             ## ====================
34             sub new {
35 1     1 0 16 my $class = shift;
36 1         38 my %opts = validate_with(
37             params => \@_,
38             spec => {
39             session => {
40             type => OBJECT,
41             isa => 'TMDB::Session',
42             },
43             id => {
44             type => SCALAR,
45             },
46             },
47             );
48              
49 1         15 my $self = $class->SUPER::new(%opts);
50 1         11 return $self;
51             } ## end sub new
52              
53             ## ====================
54             ## INFO
55             ## ====================
56             sub info {
57 1     1 0 574 my $self = shift;
58 1         3 my $params = {};
59 1 50       41 $params->{language} = $self->session->lang if $self->session->lang;
60 1         144 my $info = $self->session->talk(
61             {
62             method => 'tv/' . $self->id,
63             params => $params
64             }
65             );
66 1 50       54 return unless $info;
67 1         5 $self->{id} = $info->{id}; # Reset TMDB ID
68 1         6 return $info;
69             } ## end sub info
70              
71             ## ====================
72             ## ALTERNATIVE TITLES
73             ## ====================
74             sub alternative_titles {
75 0     0 0 0 my $self = shift;
76 0         0 my $country = shift;
77              
78             # Valid Country codes
79 0 0       0 if ($country) {
80             my %valid_country_codes
81 0         0 = map { $_ => 1 } all_country_codes('alpha-2');
  0         0  
82 0         0 $country = uc $country;
83 0 0       0 return unless $valid_country_codes{$country};
84             } ## end if ($country)
85              
86 0         0 my $args = {
87             method => 'tv/' . $self->id() . '/alternative_titles',
88             params => {},
89             };
90 0 0       0 $args->{params}->{country} = $country if $country;
91              
92 0         0 my $response = $self->session->talk($args);
93 0   0     0 my $titles = $response->{results} || [];
94              
95 0 0       0 return @$titles if wantarray;
96 0         0 return $titles;
97             } ## end sub alternative_titles
98              
99             ## ====================
100             ## CAST
101             ## ====================
102             sub cast {
103 1     1 0 539 my $self = shift;
104 1         6 my $response = $self->_credits();
105 1   50     58 my $cast = $response->{cast} || [];
106 1 50       5 return @$cast if wantarray;
107 1         7 return $cast;
108             } ## end sub cast
109              
110             ## ====================
111             ## CREW
112             ## ====================
113             sub crew {
114 1     1 0 482 my $self = shift;
115 1         4 my $response = $self->_credits();
116 1   50     58 my $crew = $response->{crew} || [];
117 1 50       6 return @$crew if wantarray;
118 1         6 return $crew;
119             } ## end sub crew
120              
121             ## ====================
122             ## IMAGES
123             ## ====================
124             sub images {
125 1     1 0 494 my $self = shift;
126 1         3 my $params = {};
127 1 50       40 $params->{lang} = $self->session->lang if $self->session->lang;
128 1         103 return $self->session->talk(
129             {
130             method => 'tv/' . $self->id() . '/images',
131             params => $params
132             }
133             );
134             } ## end sub images
135              
136             ## ====================
137             ## VIDEOS
138             ## ====================
139             sub videos {
140 1     1 0 545 my $self = shift;
141 1         39 my $response
142             = $self->session->talk( { method => 'tv/' . $self->id() . '/videos' } );
143 1   50     51 my $videos = $response->{results} || [];
144              
145 1 50       5 return @$videos if wantarray;
146 1         6 return $videos;
147              
148             } ## end sub videos
149              
150             ## ====================
151             ## KEYWORDS
152             ## ====================
153             sub keywords {
154 0     0 0 0 my $self = shift;
155 0         0 my $response = $self->session->talk(
156             { method => 'tv/' . $self->id() . '/keywords' } );
157 0   0     0 my $keywords_dump = $response->{results} || [];
158 0         0 my @keywords;
159 0         0 foreach (@$keywords_dump) { push @keywords, $_->{name}; }
  0         0  
160 0 0       0 return @keywords if wantarray;
161 0         0 return \@keywords;
162             } ## end sub keywords
163              
164             ## ====================
165             ## TRANSLATIONS
166             ## ====================
167             sub translations {
168 0     0 0 0 my $self = shift;
169 0         0 my $response = $self->session->talk(
170             { method => 'tv/' . $self->id() . '/translations' } );
171 0   0     0 my $translations = $response->{translations} || [];
172 0 0       0 return @$translations if wantarray;
173 0         0 return $translations;
174             } ## end sub translations
175              
176             ## ====================
177             ## SIMILAR TV SHOWS
178             ## ====================
179             sub similar {
180 1     1 0 476 my ( $self, $max_pages ) = @_;
181 1 50       39 return $self->session->paginate_results(
182             {
183             method => 'tv/' . $self->id() . '/similar',
184             max_pages => $max_pages,
185             params => {
186             language => $self->session->lang
187             ? $self->session->lang
188             : undef,
189             },
190             }
191             );
192             } ## end sub similar
193              
194             ## ====================
195             ## CONTENT RATING
196             ## ====================
197             sub content_ratings {
198 0     0 0 0 my $self = shift;
199 0         0 my $response = $self->session->talk(
200             { method => 'tv/' . $self->id() . '/content_ratings' } );
201 0   0     0 my $content_ratings = $response->{results} || [];
202 0 0       0 return @$content_ratings if wantarray;
203 0         0 return $content_ratings;
204             } ## end sub content_ratings
205              
206             ## ====================
207             ## SEASON
208             ## ====================
209             sub season {
210 1     1 0 493 my $self = shift;
211 1         3 my $season = shift;
212 1         40 return $self->session->talk(
213             { method => 'tv/' . $self->id() . '/season/' . $season } );
214             } ## end sub season
215              
216             ## ====================
217             ## EPISODE
218             ## ====================
219             sub episode {
220 1     1 0 538 my $self = shift;
221 1         3 my $season = shift;
222 1         2 my $episode = shift;
223 1         39 return $self->session->talk(
224             {
225             method => 'tv/'
226             . $self->id()
227             . '/season/'
228             . $season
229             . '/episode/'
230             . $episode
231             }
232             );
233             } ## end sub episode
234              
235             ## ====================
236             ## CHANGES
237             ## ====================
238             sub changes {
239 0     0 0 0 my ( $self, @args ) = @_;
240 0         0 my %options = validate_with(
241             params => [@args],
242             spec => {
243             start_date => {
244             type => SCALAR,
245             optional => 1,
246             regex => qr/^\d{4}\-\d{2}\-\d{2}$/
247             },
248             end_date => {
249             type => SCALAR,
250             optional => 1,
251             regex => qr/^\d{4}\-\d{2}\-\d{2}$/
252             },
253             },
254             );
255              
256             my $changes = $self->session->talk(
257             {
258             method => 'tv/' . $self->id() . '/changes',
259             params => {
260             (
261             $options{start_date}
262             ? ( start_date => $options{start_date} )
263             : ()
264             ), (
265             $options{end_date} ? ( end_date => $options{end_date} )
266 0 0       0 : ()
    0          
267             ),
268             },
269             }
270             );
271              
272 0 0       0 return unless defined $changes;
273 0 0       0 return unless exists $changes->{changes};
274 0 0       0 return @{ $changes->{changes} } if wantarray;
  0         0  
275 0         0 return $changes->{changes};
276             } ## end sub changes
277              
278             ## ====================
279             ## VERSION
280             ## ====================
281             sub version {
282 1     1 0 484 my ($self) = @_;
283 1 50       36 my $response = $self->session->talk(
284             {
285             method => 'tv/' . $self->id(),
286             want_headers => 1,
287             }
288             ) or return;
289 1   50     12 my $version = $response->{etag} || q();
290 1         3 $version =~ s{"}{}gx;
291 1         4 return $version;
292             } ## end sub version
293              
294             #######################
295             # PRIVATE METHODS
296             #######################
297              
298             ## ====================
299             ## CREDITS
300             ## ====================
301             sub _credits {
302 3     3   493 my $self = shift;
303 3         181 return $self->session->talk(
304             {
305             method => 'tv/' . $self->id() . '/credits',
306             }
307             );
308             } ## end sub _credits
309              
310             #######################
311             1;