Merge branch 'master' of http://10.200.0.3/GIT/videosite
[videosite.git] / videosite / VeohGrabber.pm
1 # (c) 2009 by Ralf Ertzinger <ralf@camperquake.de>
2 # licensed under GNU GPL v2
3 #
4 # Grabber for veoh.com
5
6 package videosite::VeohGrabber;
7
8 use videosite::GrabberBase;
9 @ISA = qw(videosite::GrabberBase);
10
11 use LWP::Simple qw(!get);
12 use LWP::UserAgent;
13 use XML::Simple;
14 use Data::Dumper;
15
16 use strict;
17
18 sub new {
19     my $class = shift;
20     my $self = $class->SUPER::new();
21
22     $self->{'NAME'} = 'veoh';
23     $self->{'PATTERNS'} = ['(http://(?:[-a-zA-Z0-9_.]+\.)*veoh.com/browse/videos/category/[^/]+/watch/([^/]+))'];
24
25     bless($self, $class);
26     $self->_prepare_parameters();
27
28     return $self;
29 }
30
31 sub _parse {
32     my $self = shift;
33     my $url = shift;
34     my $pattern = shift;
35     my $content;
36     my $metadata = {};
37     my $p = XML::Simple->new();
38     my $ua = LWP::UserAgent->new(max_redirect => 0);
39     my $t;
40     my $dlurl;
41     my $r;
42
43     $url =~ m|$pattern|;
44     $url = $1;
45
46     $metadata->{'URL'} = $url;
47     $metadata->{'ID'} = $2;
48     $metadata->{'TYPE'} = 'video';
49     $metadata->{'SOURCE'} = $self->{'NAME'};
50     $metadata->{'TITLE'} = undef;
51     $metadata->{'DLURL'} = undef;
52
53     # Get the XML file containing the video metadata
54     unless(defined($content = LWP::Simple::get(sprintf('http://www.veoh.com/rest/v2/execute.xml?apiKey=5697781E-1C60-663B-FFD8-9B49D2B56D36&method=veoh.search.search&type=video&maxResults=1&permalink=%s&contentRatingId=1&', $2)))) {
55         $self->error('Could not download XML metadata');
56         return undef;
57     }
58
59     unless(defined($t = $p->XMLin($content, KeepRoot => 1))) {
60         $self->error('Could not parse XML metadata');
61         return undef;
62     }
63
64     if (exists($t->{'rsp'}->{'videoList'}->{'video'}->{'fullPreviewHashPath'})) {
65         $dlurl = $t->{'rsp'}->{'videoList'}->{'video'}->{'fullPreviewHashPath'};
66     } else {
67         $dlurl = $t->{'rsp'}->{'videoList'}->{'video'}->{'fullPreviewHashLowPath'}
68     }
69
70     unless(defined($dlurl)) {
71         $self->error('No dlurl found in XML');
72         return undef;
73     }
74
75     # We now have to fetch the dlurl to get the redirect target after it,
76     # because the dlurl itself must be called with the right referer set
77
78     $r = $ua->get($dlurl, 'referer' => 'http://www.veoh.com');
79
80     unless ($r->is_redirect) {
81         $self->error('Expected redirect, got %s', $r->code);
82         return undef;
83     }
84
85     $metadata->{'DLURL'} = $r->header('Location');
86     $metadata->{'TITLE'} = $t->{'rsp'}->{'videoList'}->{'video'}->{'title'};
87
88     unless(defined($metadata->{'DLURL'}) && defined($metadata->{'TITLE'})) {
89         $self->error('Could not extract download URL and title');
90         return undef;
91     }
92
93     return $metadata;
94 }
95
96 1;