[mythtv-users] Apple Trailer Downloader

Ma Begaj derliebegott at gmail.com
Thu Jun 26 09:11:46 UTC 2008


2008/6/24 James Sumners <james.sumners at gmail.com>:
> Ah, I see. There is a modification to the "Apple Trailers" plugin that
> replaces "h640w" in the file URL with "720p".
>
> On Tue, Jun 24, 2008 at 2:57 PM, John Payne <mythtv at payne.ch> wrote:
>> James Sumners wrote:
>>
>> Looks good. It looks like the script pulls the "large" trailer from
>> the site. Would it be just as easy to pull the 720p version? (I
>> haven't looked at Apple's site.)
>>
>> On Tue, Jun 24, 2008 at 2:34 PM, John Payne <mythtv at payne.ch> wrote:
>>
>>
>> I really liked the Myth Apple Trailers 'plugin' but I wanted to see
>> plot, cast, rating etc in the basic display, before I started the actual
>> trailer. Rather than try to write a real plugin I created an Apple
>> Trailer downloader that reads the list of current trailers and creates a
>> videometadata record in the DB with related cast & genre records, &
>> downloadsthe trailers in a subfolder of the video folder and the poster
>> in the standard posters directory.
>>
>> The trailers can then be viewed with Mythvideo
>>
>> At the moment the trailer & poster folders are hard coded so need to be
>> modified as required ($videoStore & $posterStore) and I don't seem to
>> get all the posters. I've set it up to run each night from mythtv's cron
>> and it uses the Apple id to check if the trailer's already been loaded -
>> I assume the id is unique.
>>
>> It uses LWP::Simple, XML::Simple, File::Basename, DBI & DBIx:Perlish,
>> which is simplifies DB access without the usual DBI overhead.
>> ToDo:
>> - get the video & poster directories from the DB
>> - automatically remove old trailers
>> - add 'new' to the new trailers (and remove it from existing
>> trailers)(or when they have been viewed)
>> - use a standard DB interface (perl bindings? where are they documented?)
>> - make a dedicated plugin similar to the existing plugin but showing the
>> additional details - is it possible to write a plugin/addon in perl? I'm
>> too old to start learning C++
>>
>> Perhaps someone might find it useful, or have some ideas for improvement....
>>
>> John
>>
>> Here it is
>> -------------------------------------------------------------------------------------
>> #!/usr/bin/perl
>>
>> use strict;
>> use LWP::Simple;
>> use XML::Simple;
>> use File::Basename;
>>
>> use DBI;
>> use DBIx::Perlish;
>>
>> my $videoStore = "/storage500/videos/Trailers/";
>> my $posterStore = "/storage500/posters/";
>> my $logfile = "apple$$.log";
>> open LOG, ">$logfile";
>>
>> my $dbh = DBI->connect('dbi:mysql:mythconverg', "mythtv", "mythtv");
>> DBIx::Perlish::init($dbh);
>>
>> my $list = get 'http://www.apple.com/trailers/home/xml/current.xml';
>> #my $ref = XMLin($list, ForceArray => [ "name" ]);
>> my $ref = XMLin($list, ForceArray => [ "name" ]);
>>
>> my $message;
>>
>> my %Cast;
>> my %Movies;
>> foreach my $movie (keys %{$ref->{movieinfo}}){
>>   next if(db_fetch {videometadata->inetref eq $movie}); # already go
>> this one
>>   print LOG "Checking  $ref->{movieinfo}{$movie}{info}{title}\n";
>>   # fetch the trailer & images
>>   print LOG "Adding...\n";
>>   my $trailer = $ref->{movieinfo}{$movie}{preview}{large}{content};
>>   my $trailersize = $ref->{movieinfo}{$movie}{preview}{large}{filesize};
>>   my $localTrailer = $videoStore . File::Basename::basename($trailer);
>>   my $rv = getstore($trailer, $localTrailer);
>>   my $poster = $ref->{movieinfo}{$movie}{poster}{location};
>>   my $localPoster = $posterStore . File::Basename::basename($poster);
>>   $rv = getstore($poster, $localPoster);
>>
>>   # main data to videometadata
>>   # build the 'plot'
>>   my $plot = $ref->{movieinfo}{$movie}{info}{description};
>>   $plot .= "\nRelease Date: " .
>> $ref->{movieinfo}{$movie}{info}{releasedate};
>>   $plot .= "\nStudio: " . $ref->{movieinfo}{$movie}{info}{studio};
>>   $plot .= "\n" . $ref->{movieinfo}{$movie}{info}{copyright};
>>   $ref->{movieinfo}{$movie}{info}{runtime} =~ /^(\d+):(\d+)/;
>>   my $length = ($1 * 60) + $2;
>>   my $year = substr($ref->{movieinfo}{$movie}{info}{releasedate}, 0, 4);
>>
>>   # add the record
>>
>>   db_insert 'videometadata', {
>>      title       => $ref->{movieinfo}{$movie}{info}{title},
>>      director    => $ref->{movieinfo}{$movie}{info}{director},
>>      plot        => $plot,
>>      rating      => $ref->{movieinfo}{$movie}{info}{rating},
>>      inetref     => $movie,
>>      year        => $year,
>>      showlevel   => 1,
>>      length      => $length,
>>      filename    => $localTrailer,
>>      coverfile   => $localPoster,
>>   };
>>   my $videoid = $dbh->{'mysql_insertid'};
>>
>>   foreach my $actor (@{$ref->{movieinfo}{$movie}{cast}{name}}){
>>      _addCast($actor, $videoid);
>>   }
>>   foreach my $genre (@{$ref->{movieinfo}{$movie}{genre}{name}}){
>>      _addGenre($genre, $videoid);
>>   }
>> }
>>
>> # send me a mail
>>
>> #my $cmd = "/bin/mailx pinthenet\@payne.ch -s 'Appletrailers' $message";
>> #system($cmd);
>>
>> sub _addCast{
>>   my($name, $idx) = @_;
>>   my $castid;
>>
>>   # if new cast name add record else use existing record
>>   if(!($castid =  db_fetch {return videocast->intid; videocast->cast eq
>> $name})){
>>      db_insert 'videocast', {cast => $name,};
>>      $castid = $dbh->{'mysql_insertid'};
>>   }
>>
>>   # now add n:n record
>>
>>   db_insert 'videometadatacast', {idvideo => $idx, idcast => $castid};
>>
>> }
>>
>> sub _addGenre{
>>   my($name, $idx) = @_;
>>   my $genreid;
>>
>>   # if new cast name add record else use existing record
>>   if(!($genreid =  db_fetch {return videogenre->intid;
>> videogenre->genre eq $name})){
>>      db_insert 'videogenre', {genre => $name,};
>>      $genreid = $dbh->{'mysql_insertid'};
>>   }
>>
>>   # now add n:n record
>>
>>   db_insert 'videometadatagenre', {idvideo => $idx, idgenre => $genreid};
>>
>> }
>>
>>
>> _______________________________________________
>> mythtv-users mailing list
>> mythtv-users at mythtv.org
>> http://mythtv.org/cgi-bin/mailman/listinfo/mythtv-users
>>
>>
>>
>>
>>
>> The list http://www.apple.com/trailers/home/xml/current.xml only includes
>> one preview - identified as <large>. I got the URL from the Apple Trailer
>> plugin - do you know of another? I seem to remember that there are 2 version
>> of the plugin - one downloads & the other just makes a list and I think they
>> use different URLs - I'll check again
>>
>>
>>
>>
>> _______________________________________________
>> mythtv-users mailing list
>> mythtv-users at mythtv.org
>> http://mythtv.org/cgi-bin/mailman/listinfo/mythtv-users
>>
>>
>
>
>
> --
> James Sumners
> http://james.roomfullofmirrors.com/
>
> "All governments suffer a recurring problem: Power attracts
> pathological personalities. It is not that power corrupts but that it
> is magnetic to the corruptible. Such people have a tendency to become
> drunk on violence, a condition to which they are quickly addicted."
>
> Missionaria Protectiva, Text QIV (decto)
> CH:D 59
> _______________________________________________
> mythtv-users mailing list
> mythtv-users at mythtv.org
> http://mythtv.org/cgi-bin/mailman/listinfo/mythtv-users
>

Well, you could do it the same way in perl the same way. You are
already using LWP::Simple, so this should be enough:

$ref->{movieinfo}{$movie}{preview}{large}{content} = s/_h640w\./_720\./g;
if (head($ref->{movieinfo}{$movie}{preview}{large}{content})) {
    #  new file exists, overwrite $trailer again
    $trailer = $ref->{movieinfo}{$movie}{preview}{large}{content};
}

head() should be at least as fast as php's get_header() function.


More information about the mythtv-users mailing list