[mythtv-users] Apple Trailer Downloader

Ma Begaj derliebegott at gmail.com
Thu Jun 26 09:23:24 UTC 2008


2008/6/26 Ma Begaj <derliebegott at gmail.com>:
> 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.
>


but it would be maybe even much better if you could put the $trailer
in DB for "filename" instead of $localTrailer, and let mplayer stream
all *.mov files instead of downloading all before someone even knows
whether s/he wants to watch it.

mplayer or a shell script with mplayer command could cache trailers
and save them for the further watching. but this is more complicated
than your script and I even do not know whether "filename" can contain
absolute paths. this would probably be a "misuse" of this field.


More information about the mythtv-users mailing list