Ticket #5917: tmdb.4.pl

File tmdb.4.pl, 9.9 KB (added by wstewart@…, 15 years ago)

see comment

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, Stuart Morgan
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 $opt_B);
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, Stuart Morgan";
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 "       -B <movieid>  get movie backdrop\n";
62print "       -D <movieid>  get movie data\n";
63exit(-1);
64}
65
66# display 1-line of info that describes the version of the program
67sub version {
68print "$title ($version) by $author\n"
69}
70
71# display 1-line of info that can describe the type of query used
72sub info {
73print "Performs queries using the themoviedb.org website.\n";
74}
75
76# display detailed help
77sub help {
78version();
79info();
80usage();
81}
82
83# get Movie Data
84sub getMovieData {
85my ($movieid)=@_; # grab movieid parameter
86if (defined $opt_d) { printf("# looking for movie id: '%s'\n", $movieid);}
87
88# get the search results page via Movie.imdbLookup
89my $request = $base_url . "Movie.imdbLookup?imdb_id=tt" . $movieid . "&api_key=" . $api_key;
90if (defined $opt_d) { printf("# request: '%s'\n", $request); }
91my ($rc, $response) = myth_url_get($request);
92if (defined $opt_r) { printf("%s", $response); }
93
94my $xs = new XML::Simple(suppressempty => '');
95my $xml = $xs->XMLin($response);
96
97if ($xml->{"opensearch:totalResults"} > 0) {
98        #
99        # now get the movie data via Movie.getInfo, Movie.imdbLookup does not provide us all the data
100        #
101        my $tmdbid = $xml->{moviematches}->{movie}->{id};
102        $request = $base_url . "Movie.getInfo?id=" . $tmdbid . "&api_key=" . $api_key;
103        if (defined $opt_d) { printf("# request: '%s'\n", $request); }
104        my ($rc, $response) = myth_url_get($request);
105        if (defined $opt_r) { printf("%s", $response); }
106
107        $xml = $xs->XMLin($response, KeyAttr => ['key', 'id']);
108
109        my $title       = $xml->{moviematches}->{movie}->{title};
110        my $releasedate = $xml->{moviematches}->{movie}->{release};
111        my $year        = substr($releasedate, 0, 4);
112        my $plot        = $xml->{moviematches}->{movie}->{short_overview};
113        my $userrating  = $xml->{moviematches}->{movie}->{rating};
114        my $runtime     = $xml->{moviematches}->{movie}->{runtime};
115        my $budget      = $xml->{moviematches}->{movie}->{budget};
116        my $revenue     = $xml->{moviematches}->{movie}->{revenue};
117        my $trailer     = $xml->{moviematches}->{movie}->{trailer}->{content};
118        my $homepage    = $xml->{moviematches}->{movie}->{homepage};
119
120        # Genre
121        my @lgenres;
122        my $j = 0;
123        my @catlist = @{$xml->{moviematches}->{movie}->{categories}->{category}};
124        for (my $i = 0; $i < @catlist; $i++)
125        {
126            $lgenres[$j++] = $catlist[$i]->{name};
127        }
128        my $genres = join(',', @lgenres);
129
130        # People
131        my @lcast;
132        my @ldirector;
133        my $dc = 0;
134        my $cc = 0;
135        my @castlist = @{$xml->{moviematches}->{movie}->{people}->{person}};
136        for (my $i = 0; $i < @castlist; $i++)
137        {
138            if ($castlist[$i]->{job} eq "actor")
139            {
140                $lcast[$cc++] = $castlist[$i]->{name};
141            }
142
143            if ($castlist[$i]->{job} eq "director")
144            {
145                $ldirector[$dc++] = $castlist[$i]->{name};
146            }
147        }
148        my $cast     = join(',', @lcast);
149        my $director = join(',', @ldirector);
150
151        # output fields (these field names must match what MythVideo is looking for)
152        print "Title:$title\n";
153        print "Year:$year\n";
154        print "ReleaseDate:$releasedate\n";
155        print "Director:$director\n";
156        print "Plot:$plot\n";
157        print "UserRating:$userrating\n";
158#   print "MovieRating:$movierating\n";
159        print "Runtime:$runtime\n";
160#        print "Writers: $writer\n";
161        print "Cast:$cast\n";
162        print "Genres: $genres\n";
163#        print "Countries: $lcountries\n";
164        print "Budget: $budget\n";
165        print "Revenue: $revenue\n";
166        if ($trailer) {print "trailer: $trailer\n";}
167        if ($homepage) {print "Homepage: $homepage\n";}
168    }
169}
170
171# dump Movie Poster
172sub getMoviePoster {
173    my ($movieid)=@_; # grab movieid parameter
174    if (defined $opt_d) { printf("# looking for poster for movie id: '%s'\n", $movieid);}
175
176    # get the search results  page
177    my $request = $base_url . "Movie.imdbLookup?imdb_id=tt" . $movieid . "&api_key=" . $api_key;
178    if (defined $opt_d) { printf("# request: '%s'\n", $request); }
179    my ($rc, $response) = myth_url_get($request);
180    if (defined $opt_r) { printf("%s", $response); }
181
182    my $xml = XMLin($response, forcearray => [ 'poster', 'backdrop' ]);
183   
184    my $poster = $xml->{moviematches}->{movie}->{poster}->[0]->{content};
185
186    # check for a mid sized poster
187    foreach my $p (@{$xml->{moviematches}->{movie}->{poster}})
188    {
189       if ($p->{size} eq "mid")
190       {
191           $poster = $p->{content};
192           last;
193       }
194    }
195
196    if ($poster) {
197        print "$poster\n";
198    }
199    else {
200        my $backdrop = $xml->{moviematches}->{movie}->{backdrop}->[0]->{content};
201        if ($backdrop)
202        {
203            print "$backdrop\n";
204        }
205    }
206}
207
208# dump Movie Backdrop
209sub getMovieBackdrop {
210    my ($movieid)=@_; # grab movieid parameter
211    if (defined $opt_d) { printf("# looking for backdrop for movie id: '%s'\n", $movieid);}
212
213    # get the search results  page
214    my $request = $base_url . "Movie.imdbLookup?imdb_id=tt" . $movieid . "&api_key=" . $api_key;
215    if (defined $opt_d) { printf("# request: '%s'\n", $request); }
216    my ($rc, $response) = myth_url_get($request);
217    if (defined $opt_r) { printf("%s", $response); }
218
219    my $xml = XMLin($response, forcearray => [ 'poster', 'backdrop' ]);
220
221    foreach my $backdrop (@{$xml->{moviematches}->{movie}->{backdrop}})
222    {
223       if ($backdrop->{size} eq "original")
224       {
225           print "$backdrop->{content}\n";
226       }
227    }
228}
229
230
231# dump Movie list:  1 entry per line, each line as 'movieid:Movie Title'
232sub getMovieList {
233my ($filename, $options)=@_; # grab parameters
234
235#
236# Convert filename into a query string
237# (use same rules that Metadata::guesTitle does)
238my $query = cleanTitleQuery($filename);
239if (!$options) { $options = "" ;}
240if (defined $opt_d) {
241    printf("# query: '%s'\n", $query);
242}
243
244# get the search results  page
245my $request = $base_url . "Movie.search?title=" . $query . "&api_key=" . $api_key;
246if (defined $opt_d) { printf("# request: '%s'\n", $request); }
247my ($rc, $response) = myth_url_get($request);
248if (defined $opt_r) {
249    print $response;
250    exit(0);
251}
252
253my $xs = new XML::Simple(suppressempty => '');
254my $xml = $xs->XMLin($response, forcearray => [ 'movie' ]);
255
256if ($xml->{"opensearch:totalResults"} > 0) {
257    my @movies;
258    my $j = 0;
259
260    foreach my $key (keys(%{$xml->{moviematches}->{movie}}))
261    {
262        my $movienum  = $xml->{moviematches}->{movie}->{$key}->{imdb};
263        my $moviename = $xml->{moviematches}->{movie}->{$key}->{title};
264        my $release   = $xml->{moviematches}->{movie}->{$key}->{release};
265        my $movieyear = 0;
266
267        if ($release) {
268            $movieyear = substr($release, 0, 4);
269        }
270
271        if ($movienum) {
272            if ($release) {
273                $movies[$j++]= substr($movienum,2) . ":" . $moviename . " (". $movieyear . ")";
274            }
275            else {
276                $movies[$j++]= substr($movienum,2) . ":" . $moviename;
277            }
278        }
279    }
280    # display array of values
281
282    for $movie (@movies) { print "$movie\n"; }
283    }
284}
285
286#
287# Main Program
288#
289
290# parse command line arguments
291getopts('ohrdivDMPB');
292
293# print out info
294if (defined $opt_v) { version(); exit 1; }
295if (defined $opt_i) { info(); exit 1; }
296
297# print out usage if needed
298if (defined $opt_h || $#ARGV<0) { help(); }
299
300if (defined $opt_D) {
301# take movieid from cmdline arg
302$movieid = shift || die "Usage : $0 -D <movieid>\n";
303getMovieData($movieid);
304}
305
306elsif (defined $opt_P) {
307# take movieid from cmdline arg
308$movieid = shift || die "Usage : $0 -P <movieid>\n";
309getMoviePoster($movieid);
310}
311
312elsif (defined $opt_B) {
313# take movieid from cmdline arg
314$movieid = shift || die "Usage : $0 -P <movieid>\n";
315getMovieBackdrop($movieid);
316}
317
318elsif (defined $opt_M) {
319# take query from cmdline arg
320$options = shift || die "Usage : $0 -M [options] <query>\n";
321$query = shift;
322if (!$query) {
323    $query = $options;
324    $options = "";
325}
326getMovieList($query, $options);
327}
328# vim: set expandtab ts=3 sw=3 :