- Add metacafe grabber
[videosite.git] / videosite / MetaCafeGrabber.pm
1 package MetaCafeGrabber;
2
3 use GrabberBase;
4 @ISA = qw(GrabberBase);
5
6 use LWP::Simple qw(!get);
7 use HTML::Parser;
8 use Data::Dumper;
9
10 use strict;
11
12 sub new {
13     my $class = shift;
14     my $self = $class->SUPER::new();
15
16     $self->{'NAME'} = 'metacafe';
17     $self->{'PATTERNS'} = ['(http://(?:[-a-zA-Z0-9_.]+\.)*metacafe.com/watch/(\d+)(?:\S+)?)'];
18
19     bless($self, $class);
20
21     return $self;
22 }
23
24 sub _parse {
25     my $self = shift;
26     my $url = shift;
27     my $pattern = shift;
28     my $content;
29     my $metadata = {};
30     my $p = HTML::Parser->new(api_version => 3);
31     my @accum;
32     my @text;
33     my $e;
34
35     $url =~ m|$pattern|;
36     $url = $1;
37
38     $metadata->{'URL'} = $url;
39     $metadata->{'ID'} = $2;
40     $metadata->{'TYPE'} = 'video';
41     $metadata->{'SOURCE'} = $self->{'NAME'};
42     $metadata->{'TITLE'} = undef;
43     $metadata->{'DLURL'} = undef;
44
45     unless(defined($content = LWP::Simple::get(sprintf('http://www.metacafe.com/watch/%s', $2)))) {
46         $self->error('Could not download %s', $url);
47         return undef;
48     }
49
50     $p->handler(start => \@accum, "tagname, attr");
51     $p->handler(text => \@text, "text");
52     $p->report_tags(qw(meta script));
53     $p->utf8_mode(1);
54     $p->parse($content);
55
56     # Look for the title in the meta tags
57     foreach $e (@accum) {
58         if ('meta' eq $e->[0]) {
59             if ('title' eq $e->[1]->{'name'}) {
60                 $metadata->{'TITLE'} = $e->[1]->{'content'};
61                 $metadata->{'TITLE'} =~ s/^Metacafe\s*-\s*//;
62             }
63         }
64     }
65
66     # Look for the download URL
67     foreach $e (@text) {
68         if ($e->[0] =~ m|\.addParam\("flashvars", ".*\&mediaURL=([^\&]+)\&.*"|) {
69             $metadata->{'DLURL'} = $1;
70         }
71     }
72
73     unless(defined($metadata->{'DLURL'}) && defined($metadata->{'TITLE'})) {
74         $self->error('Could not determine download URL');
75         return undef;
76     }
77
78     return $metadata;
79 }
80
81 1;