1 # (c) 2008 by Ralf Ertzinger <ralf@camperquake.de>
2 # licensed under GNU GPL v2
4 # Grabber for redtube.com
6 # Algorithm for the file name hash reverse engineered by
7 # Maximilian Rehkopf <otakon at gmx dot net>
9 package videosite::RedTubeGrabber;
11 use videosite::GrabberBase;
12 @ISA = qw(videosite::GrabberBase);
21 my $self = $class->SUPER::new(
23 _SELFTESTURL => 'http://www.redtube.com/8269',
24 _SELFTESTTITLE => 'Porn bloopers with pretty girl',
25 PATTERNS => ['(http://(?:[-a-zA-Z0-9_.]+\.)*redtube.com/(\d+))'],
28 return bless($self, $class);
32 return ($_[0] - ($_[0] % $_[1])) / $_[1];
35 sub digitatindex($$) {
36 return div($_[0], 10**$_[1]) % 10;
44 my @key = split(//, "R15342O7K9HBCDXFGAIJ8LMZ6PQ0STUVWEYN");
47 # Calculate a weighed digit sum of the id
48 $q += ($_*($i--)) for reverse(split(//, $id));
50 # Now calculate the digit sum of the digit sum
51 $q2 += $_ for split(//, $q);
53 # The rest are lookups into @key and the second digit sum,
54 # based on the second digit sum and the original id
55 $hash .= $key[digitatindex($id,3)+$q2+3];
56 $hash .= digitatindex($q2, 0);
57 $hash .= $key[digitatindex($id,6)+$q2+2];
58 $hash .= $key[digitatindex($id,4)+$q2+1];
59 $hash .= $key[digitatindex($id,1)+$q2+6];
60 $hash .= $key[digitatindex($id,5)+$q2+5];
61 $hash .= digitatindex($q2, 1);
62 $hash .= $key[digitatindex($id,2)+$q2+7];
63 $hash .= $key[digitatindex($id,0)+$q2+4];
65 return (sprintf("%07d", $id/1000), $hash);
84 $metadata->{'URL'} = $url;
85 $metadata->{'ID'} = $2;
86 $metadata->{'TYPE'} = 'video';
87 $metadata->{'SOURCE'} = $self->{'NAME'};
88 $metadata->{'TITLE'} = undef;
89 $metadata->{'DLURL'} = undef;
91 # Set the cookies necessary to get the video data
92 $ua->cookie_jar->set_cookie(undef, 'pp', '1', '/', '.redtube.com');
94 unless(defined($content = $self->simple_get(sprintf("http://www.redtube.com/%s", $2), $ua))) {
95 $self->error('Could not download page');
99 $p = HTML::TokeParser->new(\$content);
102 while ($tag = $p->get_tag('title', 'script')) {
103 if ('title' eq $tag->[0]) {
104 my $t = $p->get_text();
105 $metadata->{'TITLE'} = $t;
106 $metadata->{'TITLE'} =~ s/ \| Redtube.*//;
107 } elsif ('script' eq $tag->[0]) {
108 my $t = $p->get_text();
110 if ($t =~ m|so\.addParam\("flashvars","([^\x22]+)"|) {
113 $self->debug("Found flashvars: %s", $1);
114 %h = map { $self->decode_hexurl($_) } split(/[&=]/, $1);
116 $self->debug("Decoded flashvars: %s", Dumper(\%h));
118 if (exists($h{mp4_url})) {
119 $metadata->{'DLURL'} = $h{mp4_url};
125 unless(defined($metadata->{'DLURL'}) && defined($metadata->{'TITLE'})) {
126 $self->error('Could not extract download URL and title');