Ticket #5917: tmdb.2.pl

File tmdb.2.pl, 8.5 KB (added by stuartm, 17 years ago)

Updated version of script fixing several bugs

Line 
1#!/usr/bin/perl -w
2
3#
4# This perl script is intended to perform movie data lookups based on
5# the themoviedb.org website
6#
7# For more information on MythVideo's external movie lookup mechanism, see
8# the README file in this directory.
9#
10# Author: William Stewart
11#
12# v0.1
13# - Initial script
14
15use File::Basename;
16use lib dirname($0);
17
18use MythTV::MythVideoCommon;
19
20eval "use DateTime::Format::Strptime"; my $has_date_format = $@ ? 0 : 1;
21
22use vars qw($opt_h $opt_r $opt_d $opt_i $opt_v $opt_D $opt_M $opt_P);
23use Getopt::Std;
24use Data::Dumper;
25use LWP::Simple;
26use XML::Simple;
27
28$title = "themoviedb Query";
29$version = "v0.1.0";
30$author = "William Stewart";
31push(@MythTV::MythVideoCommon::URL_get_extras, ($title, $version));
32
33my @countries = qw(USA UK Canada Japan);
34
35my $base_url = "http://api.themoviedb.org/2.0/";
36my $posterimdb_url = "http://api.themoviedb.org/cover.php?imdb=";
37
38# themoviedb.org api key given by Travis Bell for Mythtv
39my $api_key = "c27cb71cff5bd76e1a7a009380562c62";
40
41binmode(STDOUT, ":utf8");
42
43# display usage
44sub usage {
45print "usage: $0 -hdrviMPD [parameters]\n";
46print " -h help\n";
47print " -d debug\n";
48print " -r dump raw query result data only\n";
49print " -v display version\n";
50print " -i display info\n";
51print "\n";
52print " -M [options] <query> get movie list\n";
53print " some known options are:\n";
54print " type=[fuzy] looser search\n";
55print " from_year=[int] limit matches to year\n";
56print " to_year=[int] limit matches to year\n";
57print " sort=[smart] ??\n";
58print " tv=[no|both|only] limits between tv and movies\n";
59print " Note: multiple options must be separated by ';'\n";
60print " -P <movieid> get movie poster\n";
61print " -D <movieid> get movie data\n";
62exit(-1);
63}
64
65# display 1-line of info that describes the version of the program
66sub version {
67print "$title ($version) by $author\n"
68}
69
70# display 1-line of info that can describe the type of query used
71sub info {
72print "Performs queries using the themoviedb.org website.\n";
73}
74
75# display detailed help
76sub help {
77version();
78info();
79usage();
80}
81
82# get Movie Data
83sub getMovieData {
84my ($movieid)=@_; # grab movieid parameter
85if (defined $opt_d) { printf("# looking for movie id: '%s'\n", $movieid);}
86
87# get the search results page via Movie.imdbLookup
88my $request = $base_url . "Movie.imdbLookup?imdb_id=tt" . $movieid . "&api_key=" . $api_key;
89if (defined $opt_d) { printf("# request: '%s'\n", $request); }
90my ($rc, $response) = myth_url_get($request);
91if (defined $opt_r) { printf("%s", $response); }
92
93my $xs = new XML::Simple(suppressempty => '');
94my $xml = $xs->XMLin($response);
95
96if ($xml->{"opensearch:totalResults"} > 0) {
97 #
98 # now get the movie data via Movie.getInfo, Movie.imdbLookup does not provide us all the data
99 #
100 my $tmdbid = $xml->{moviematches}->{movie}->{id};
101 $request = $base_url . "Movie.getInfo?id=" . $tmdbid . "&api_key=" . $api_key;
102 if (defined $opt_d) { printf("# request: '%s'\n", $request); }
103 my ($rc, $response) = myth_url_get($request);
104 if (defined $opt_r) { printf("%s", $response); }
105
106 $xml = $xs->XMLin($response);
107
108 my $title = $xml->{moviematches}->{movie}->{title};
109 my $releasedate = $xml->{moviematches}->{movie}->{release};
110 my $year = substr($releasedate, 0, 4);
111 my $plot = $xml->{moviematches}->{movie}->{short_overview};
112 my $userrating = $xml->{moviematches}->{movie}->{rating};
113 my $runtime = $xml->{moviematches}->{movie}->{runtime};
114 my $budget = $xml->{moviematches}->{movie}->{budget};
115 my $revenue = $xml->{moviematches}->{movie}->{revenue};
116 my $trailer = $xml->{moviematches}->{movie}->{trailer}->{content};
117 my $homepage = $xml->{moviematches}->{movie}->{homepage};
118
119 # Genre
120 my @lgenres;
121 my $j = 0;
122 foreach my $key (keys (%{$xml->{moviematches}->{movie}->{categories}->{category}}))
123 {
124 $lgenres[$j++] = $key;
125 }
126 my $genres = join(',', @lgenres);
127
128 # People
129 my @lcast;
130 my @ldirector;
131 my $dc = 0;
132 my $cc = 0;
133 foreach my $key (keys (%{$xml->{moviematches}->{movie}->{people}->{person}}))
134 {
135 if ($xml->{moviematches}->{movie}->{people}->{person}->{$key}->{job} eq "actor")
136 {
137 $lcast[$cc++] = $key;
138 }
139
140 if ($xml->{moviematches}->{movie}->{people}->{person}->{$key}->{job} eq "director")
141 {
142 $ldirector[$dc++] = $key;
143 }
144 }
145 my $cast = join(',', @lcast);
146 my $director = join(',', @ldirector);
147
148 # output fields (these field names must match what MythVideo is looking for)
149 print "Title:$title\n";
150 print "Year:$year\n";
151 print "ReleaseDate:$releasedate\n";
152 print "Director:$director\n";
153 print "Plot:$plot\n";
154 print "UserRating:$userrating\n";
155# print "MovieRating:$movierating\n";
156 print "Runtime:$runtime\n";
157# print "Writers: $writer\n";
158 print "Cast:$cast\n";
159 print "Genres: $genres\n";
160# print "Countries: $lcountries\n";
161 print "Budget: $budget\n";
162 print "Revenue: $revenue\n";
163 if ($trailer) {print "trailer: $trailer\n";}
164 if ($homepage) {print "Homepage: $homepage\n";}
165 }
166}
167
168# dump Movie Poster
169sub getMoviePoster {
170 my ($movieid)=@_; # grab movieid parameter
171 if (defined $opt_d) { printf("# looking for poster for movie id: '%s'\n", $movieid);}
172
173 # get the search results page
174 my $request = $base_url . "Movie.imdbLookup?imdb_id=tt" . $movieid . "&api_key=" . $api_key;
175 if (defined $opt_d) { printf("# request: '%s'\n", $request); }
176 my ($rc, $response) = myth_url_get($request);
177 if (defined $opt_r) { printf("%s", $response); }
178
179 my $xml = XMLin($response, forcearray => [ 'poster', 'backdrop' ]);
180
181 my $poster = $xml->{moviematches}->{movie}->{poster}->[0]->{content};
182 if ($poster) {
183 print "$poster\n";
184 }
185 else {
186 my $backdrop = $xml->{moviematches}->{movie}->{backdrop}->[0]->{content};
187 if ($backdrop)
188 {
189 print "$backdrop\n";
190 }
191 }
192}
193
194# dump Movie list: 1 entry per line, each line as 'movieid:Movie Title'
195sub getMovieList {
196my ($filename, $options)=@_; # grab parameters
197
198#
199# Convert filename into a query string
200# (use same rules that Metadata::guesTitle does)
201my $query = cleanTitleQuery($filename);
202if (!$options) { $options = "" ;}
203if (defined $opt_d) {
204 printf("# query: '%s'\n", $query);
205}
206
207# get the search results page
208my $request = $base_url . "Movie.search?title=" . $query . "&api_key=" . $api_key;
209if (defined $opt_d) { printf("# request: '%s'\n", $request); }
210my ($rc, $response) = myth_url_get($request);
211if (defined $opt_r) {
212 print $response;
213 exit(0);
214}
215
216my $xs = new XML::Simple(suppressempty => '');
217my $xml = $xs->XMLin($response, forcearray => [ 'movie' ]);
218my @movies;
219my $j = 0;
220
221foreach my $key (keys(%{$xml->{moviematches}->{movie}}))
222{
223 my $movienum = $xml->{moviematches}->{movie}->{$key}->{imdb};
224 my $moviename = $xml->{moviematches}->{movie}->{$key}->{title};
225 my $release = $xml->{moviematches}->{movie}->{$key}->{release};
226 my $movieyear = 0;
227
228 if ($release) {
229 $movieyear = substr($release, 0, 4);
230 }
231
232 if ($movienum) {
233 if ($release) {
234 $movies[$j++]= substr($movienum,2) . ":" . $moviename . " (". $movieyear . ")";
235 }
236 else {
237 $movies[$j++]= substr($movienum,2) . ":" . $moviename;
238 }
239 }
240}
241# display array of values
242
243for $movie (@movies) { print "$movie\n"; }
244}
245
246#
247# Main Program
248#
249
250# parse command line arguments
251getopts('ohrdivDMP');
252
253# print out info
254if (defined $opt_v) { version(); exit 1; }
255if (defined $opt_i) { info(); exit 1; }
256
257# print out usage if needed
258if (defined $opt_h || $#ARGV<0) { help(); }
259
260if (defined $opt_D) {
261# take movieid from cmdline arg
262$movieid = shift || die "Usage : $0 -D <movieid>\n";
263getMovieData($movieid);
264}
265
266elsif (defined $opt_P) {
267# take movieid from cmdline arg
268$movieid = shift || die "Usage : $0 -P <movieid>\n";
269getMoviePoster($movieid);
270}
271
272elsif (defined $opt_M) {
273# take query from cmdline arg
274$options = shift || die "Usage : $0 -M [options] <query>\n";
275$query = shift;
276if (!$query) {
277 $query = $options;
278 $options = "";
279}
280getMovieList($query, $options);
281}
282# vim: set expandtab ts=3 sw=3 :