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 |
|
---|
15 | use File::Basename;
|
---|
16 | use lib dirname($0);
|
---|
17 |
|
---|
18 | use MythTV::MythVideoCommon;
|
---|
19 |
|
---|
20 | eval "use DateTime::Format::Strptime"; my $has_date_format = $@ ? 0 : 1;
|
---|
21 |
|
---|
22 | use vars qw($opt_h $opt_r $opt_d $opt_i $opt_v $opt_D $opt_M $opt_P);
|
---|
23 | use Getopt::Std;
|
---|
24 | use Data::Dumper;
|
---|
25 | use LWP::Simple;
|
---|
26 | use XML::Simple;
|
---|
27 |
|
---|
28 | $title = "themoviedb Query";
|
---|
29 | $version = "v0.1.0";
|
---|
30 | $author = "William Stewart";
|
---|
31 | push(@MythTV::MythVideoCommon::URL_get_extras, ($title, $version));
|
---|
32 |
|
---|
33 | my @countries = qw(USA UK Canada Japan);
|
---|
34 |
|
---|
35 | my $base_url = "http://api.themoviedb.org/2.0/";
|
---|
36 | my $posterimdb_url = "http://api.themoviedb.org/cover.php?imdb=";
|
---|
37 |
|
---|
38 | # themoviedb.org api key given by Travis Bell for Mythtv
|
---|
39 | my $api_key = "c27cb71cff5bd76e1a7a009380562c62";
|
---|
40 |
|
---|
41 | binmode(STDOUT, ":utf8");
|
---|
42 |
|
---|
43 | # display usage
|
---|
44 | sub usage {
|
---|
45 | print "usage: $0 -hdrviMPD [parameters]\n";
|
---|
46 | print " -h help\n";
|
---|
47 | print " -d debug\n";
|
---|
48 | print " -r dump raw query result data only\n";
|
---|
49 | print " -v display version\n";
|
---|
50 | print " -i display info\n";
|
---|
51 | print "\n";
|
---|
52 | print " -M [options] <query> get movie list\n";
|
---|
53 | print " some known options are:\n";
|
---|
54 | print " type=[fuzy] looser search\n";
|
---|
55 | print " from_year=[int] limit matches to year\n";
|
---|
56 | print " to_year=[int] limit matches to year\n";
|
---|
57 | print " sort=[smart] ??\n";
|
---|
58 | print " tv=[no|both|only] limits between tv and movies\n";
|
---|
59 | print " Note: multiple options must be separated by ';'\n";
|
---|
60 | print " -P <movieid> get movie poster\n";
|
---|
61 | print " -D <movieid> get movie data\n";
|
---|
62 | exit(-1);
|
---|
63 | }
|
---|
64 |
|
---|
65 | # display 1-line of info that describes the version of the program
|
---|
66 | sub version {
|
---|
67 | print "$title ($version) by $author\n"
|
---|
68 | }
|
---|
69 |
|
---|
70 | # display 1-line of info that can describe the type of query used
|
---|
71 | sub info {
|
---|
72 | print "Performs queries using the themoviedb.org website.\n";
|
---|
73 | }
|
---|
74 |
|
---|
75 | # display detailed help
|
---|
76 | sub help {
|
---|
77 | version();
|
---|
78 | info();
|
---|
79 | usage();
|
---|
80 | }
|
---|
81 |
|
---|
82 | # get Movie Data
|
---|
83 | sub getMovieData {
|
---|
84 | my ($movieid)=@_; # grab movieid parameter
|
---|
85 | if (defined $opt_d) { printf("# looking for movie id: '%s'\n", $movieid);}
|
---|
86 |
|
---|
87 | # get the search results page via Movie.imdbLookup
|
---|
88 | my $request = $base_url . "Movie.imdbLookup?imdb_id=tt" . $movieid . "&api_key=" . $api_key;
|
---|
89 | if (defined $opt_d) { printf("# request: '%s'\n", $request); }
|
---|
90 | my ($rc, $response) = myth_url_get($request);
|
---|
91 | if (defined $opt_r) { printf("%s", $response); }
|
---|
92 |
|
---|
93 | my $xs = new XML::Simple(suppressempty => '');
|
---|
94 | my $xml = $xs->XMLin($response);
|
---|
95 |
|
---|
96 | if ($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
|
---|
169 | sub 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'
|
---|
195 | sub getMovieList {
|
---|
196 | my ($filename, $options)=@_; # grab parameters
|
---|
197 |
|
---|
198 | #
|
---|
199 | # Convert filename into a query string
|
---|
200 | # (use same rules that Metadata::guesTitle does)
|
---|
201 | my $query = cleanTitleQuery($filename);
|
---|
202 | if (!$options) { $options = "" ;}
|
---|
203 | if (defined $opt_d) {
|
---|
204 | printf("# query: '%s'\n", $query);
|
---|
205 | }
|
---|
206 |
|
---|
207 | # get the search results page
|
---|
208 | my $request = $base_url . "Movie.search?title=" . $query . "&api_key=" . $api_key;
|
---|
209 | if (defined $opt_d) { printf("# request: '%s'\n", $request); }
|
---|
210 | my ($rc, $response) = myth_url_get($request);
|
---|
211 | if (defined $opt_r) {
|
---|
212 | print $response;
|
---|
213 | exit(0);
|
---|
214 | }
|
---|
215 |
|
---|
216 | my $xs = new XML::Simple(suppressempty => '');
|
---|
217 | my $xml = $xs->XMLin($response, forcearray => [ 'movie' ]);
|
---|
218 | my @movies;
|
---|
219 | my $j = 0;
|
---|
220 |
|
---|
221 | foreach 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 |
|
---|
243 | for $movie (@movies) { print "$movie\n"; }
|
---|
244 | }
|
---|
245 |
|
---|
246 | #
|
---|
247 | # Main Program
|
---|
248 | #
|
---|
249 |
|
---|
250 | # parse command line arguments
|
---|
251 | getopts('ohrdivDMP');
|
---|
252 |
|
---|
253 | # print out info
|
---|
254 | if (defined $opt_v) { version(); exit 1; }
|
---|
255 | if (defined $opt_i) { info(); exit 1; }
|
---|
256 |
|
---|
257 | # print out usage if needed
|
---|
258 | if (defined $opt_h || $#ARGV<0) { help(); }
|
---|
259 |
|
---|
260 | if (defined $opt_D) {
|
---|
261 | # take movieid from cmdline arg
|
---|
262 | $movieid = shift || die "Usage : $0 -D <movieid>\n";
|
---|
263 | getMovieData($movieid);
|
---|
264 | }
|
---|
265 |
|
---|
266 | elsif (defined $opt_P) {
|
---|
267 | # take movieid from cmdline arg
|
---|
268 | $movieid = shift || die "Usage : $0 -P <movieid>\n";
|
---|
269 | getMoviePoster($movieid);
|
---|
270 | }
|
---|
271 |
|
---|
272 | elsif (defined $opt_M) {
|
---|
273 | # take query from cmdline arg
|
---|
274 | $options = shift || die "Usage : $0 -M [options] <query>\n";
|
---|
275 | $query = shift;
|
---|
276 | if (!$query) {
|
---|
277 | $query = $options;
|
---|
278 | $options = "";
|
---|
279 | }
|
---|
280 | getMovieList($query, $options);
|
---|
281 | }
|
---|
282 | # vim: set expandtab ts=3 sw=3 :
|
---|