Advertisement
Guest User

Untitled

a guest
Jul 13th, 2010
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 18.20 KB | None | 0 0
  1. package GCPlugins::GCfilms::GCAllocine;
  2.  
  3. ###################################################
  4. #
  5. #  Copyright 2005-2009 Tian
  6. #
  7. #  This file is part of GCstar.
  8. #
  9. #  GCstar is free software; you can redistribute it and/or modify
  10. #  it under the terms of the GNU General Public License as published by
  11. #  the Free Software Foundation; either version 2 of the License, or
  12. #  (at your option) any later version.
  13. #
  14. #  GCstar is distributed in the hope that it will be useful,
  15. #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17. #  GNU General Public License for more details.
  18. #
  19. #  You should have received a copy of the GNU General Public License
  20. #  along with GCstar; if not, write to the Free Software
  21. #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  22. #
  23. ###################################################
  24.  
  25. use strict;
  26. use utf8;
  27.  
  28. use GCPlugins::GCfilms::GCfilmsCommon;
  29.  
  30. {
  31.  
  32.     package GCPlugins::GCfilms::GCPluginAllocine;
  33.  
  34.     use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
  35.  
  36.     sub start
  37.     {
  38.         my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
  39.         $self->{inside}->{$tagname}++;
  40.  
  41.         if ($self->{parsingList})
  42.         {
  43.             if ($self->{insideResults} eq 1)
  44.             {
  45.                 if (   ($tagname eq "a")
  46.                     && ($attr->{href} =~ /^\/film\/fichefilm_gen_cfilm=/)
  47.                     && ($self->{isMovie} eq 0))
  48.                 {
  49.                     my $url = $attr->{href};
  50.                     $self->{isMovie} = 1;
  51.                     $self->{isInfo}  = 0;
  52.                     $self->{itemIdx}++;
  53.                     $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
  54.                 }
  55.                 elsif (($tagname eq "td") && ($self->{isMovie} eq 1))
  56.                 {
  57.                     $self->{isMovie} = 2;
  58.                 }
  59.                 elsif (($tagname eq "a") && ($self->{isMovie} eq 2))
  60.                 {
  61.                     $self->{isMovie} = 3;
  62.                 }
  63.                 elsif (($tagname eq "br") && ($self->{isMovie} eq 3))
  64.                 {
  65.                     $self->{itemsList}[ $self->{itemIdx} ]->{title} =~ s/^\s*//;
  66.                     $self->{itemsList}[ $self->{itemIdx} ]->{title} =~ s/\s*$//;
  67.                     $self->{itemsList}[ $self->{itemIdx} ]->{title} =~ s/\s+/ /g;
  68.                     $self->{isMovie} = 4;
  69.                 }
  70.                 elsif (($tagname eq "span")
  71.                     && ($attr->{class}   eq "fs11")
  72.                     && ($self->{isMovie} eq 4))
  73.                 {
  74.                     $self->{isInfo}  = 1;
  75.                     $self->{isMovie} = 0;
  76.                 }
  77.                 elsif (($tagname eq "br") && ($self->{isInfo} eq 1))
  78.                 {
  79.                     $self->{isInfo} = 2;
  80.                 }
  81.                 elsif (($tagname eq "br") && ($self->{isInfo} eq 2))
  82.                 {
  83.                     $self->{isInfo} = 3;
  84.                 }
  85.             }
  86.         }
  87.         else
  88.         {
  89.             if (($tagname eq "span") && ($self->{insideDate} eq 1))
  90.             {
  91.                 $self->{insideDate} = 2;
  92.             }
  93.             elsif (($tagname eq "a") && ($self->{insideDirector} eq 1))
  94.             {
  95.                 $self->{insideDirector} = 2;
  96.             }
  97.             elsif (($tagname eq "a") && ($self->{insideDate} eq 1))
  98.             {
  99.                 $self->{insideDate} = 2;
  100.             }
  101.             elsif (($tagname eq "a") && ($self->{insideGenre} eq 1))
  102.             {
  103.                 $self->{insideGenre} = 2;
  104.             }
  105.             elsif (($tagname eq "em") && ($self->{insideOriginal} eq 1))
  106.             {
  107.                 $self->{insideOriginal} = 2;
  108.             }
  109.             elsif (($tagname eq "a") && ($self->{insideCountry} eq 1))
  110.             {
  111.                 $self->{insideCountry} = 2;
  112.             }
  113.             elsif (($tagname eq "div") && ($attr->{class} eq "poster"))
  114.             {
  115.                 $self->{insidePicture} = 1;
  116.             }
  117.             elsif (($tagname eq "img") && ($self->{insidePicture} == 1))
  118.             {
  119.                 my $src = $attr->{src};
  120.                 if (!$self->{curInfo}->{image})
  121.                 {
  122.                     # http://www.allocine.fr/film/fichefilm_gen_cfilm=17811.html
  123.                     if (($src =~ /r_160_214/) && !($src =~ /AffichetteAllocine\.gif/i))
  124.                     {
  125.                         ($src =~ s/r_160_214/r_760_x/g)
  126.                             if $self->{bigPics};
  127.                         $self->{curInfo}->{image} = $src;
  128.                     }
  129.                     else
  130.                     {
  131.                         $self->{curInfo}->{image} = "empty";
  132.                     }
  133.                 }
  134.             }
  135.             elsif ($tagname eq "actors")
  136.             {
  137.                 $self->{insideActors} = 1;
  138.                 $self->{insideCast}   = 0;
  139.                 $self->{insideActor}  = 0;
  140.                 $self->{insideRole}   = 0;
  141.             }
  142.             elsif (($tagname eq "h2") && ($self->{insideActors}))
  143.             {
  144.                 $self->{insideCast} = 1;
  145.             }
  146.             elsif (($tagname eq "h3") && ($self->{insideCast} == 1))
  147.             {
  148.                 $self->{insideActor} = 1;
  149.             }
  150.             elsif (($tagname eq "p") && ($self->{insideCast} == 1))
  151.             {
  152.                 $self->{insideRole} = 1;
  153.             }
  154.             elsif (($tagname eq "table")
  155.                 && ($attr->{class} =~ /castingdata/)
  156.                 && ($self->{insideActors}))
  157.             {
  158.                 # Alternate way the page lists cast
  159.                 $self->{insideCast} = 2;
  160.             }
  161.             elsif (($tagname eq "td") && ($self->{insideCast} == 2))
  162.             {
  163.                 $self->{insideRole} = 2;
  164.             }
  165.             elsif (($tagname eq "a") && ($self->{insideCast} == 3))
  166.             {
  167.                 $self->{insideActor} = 2;
  168.             }
  169.             elsif (($tagname eq "br") && ($self->{insideSynopsis} == 2))
  170.             {
  171.                 $self->{curInfo}->{synopsis} .= "\n";
  172.             }
  173.  
  174.         }
  175.     }
  176.  
  177.     sub end
  178.     {
  179.         my ($self, $tagname) = @_;
  180.         $self->{inside}->{$tagname}--;
  181.  
  182.         if (($tagname eq "span") && ($self->{insideSynopsis} eq 1))
  183.         {
  184.             $self->{insideSynopsis} = 2;
  185.         }
  186.         elsif ($tagname eq "span")
  187.         {
  188.             $self->{insideDirector} = 0;
  189.         }
  190.         elsif (($tagname eq "div") && ($self->{insidePressRating} eq 1))
  191.         {
  192.             # http://www.allocine.fr/film/fichefilm_gen_cfilm=5947.html
  193.             $self->{insidePressRating} = 0;
  194.             # http://www.allocine.fr/film/fichefilm_gen_cfilm=112274.html :
  195.             # Director become Gregory HoblitconnectéClothilde-Mathilde
  196.             # Because of "Dans les blogs" containing "Réalisé par"
  197.             $self->{insideInfo} = 0;
  198.         }
  199.         elsif ($tagname eq "div")
  200.         {
  201.             $self->{insidePicture} = 0;
  202.         }
  203.         elsif ($tagname eq "table")
  204.         {
  205.             $self->{insideResults} = 0;
  206.         }
  207.  
  208.         elsif ($tagname eq "actors")
  209.         {
  210.             $self->{insideActors} = 0;
  211.             $self->{insideCast}   = 0;
  212.             $self->{insideActor}  = 0;
  213.             $self->{insideRole}   = 0;
  214.         }
  215.         elsif ((($tagname eq "div") || ($tagname eq "table")) && ($self->{insideCast}))
  216.         {
  217.             $self->{insideCast} = 0;
  218.         }
  219.         elsif (($tagname eq "tr") && ($self->{insideCast} > 1))
  220.         {
  221.             $self->{insideActor} = 0;
  222.             $self->{insideRole}  = 0;
  223.         }
  224.         elsif (($tagname eq "a") && ($self->{insideActor}))
  225.         {
  226.             $self->{insideActor} = 0;
  227.         }
  228.         elsif ($tagname eq "p")
  229.         {
  230.             if ($self->{insideRole})
  231.             {
  232.                 $self->{insideRole} = 0;
  233.             }
  234.             elsif ($self->{insideSynopsis})
  235.             {
  236.                 $self->{insideSynopsis} = 0;
  237.             }
  238.         }
  239.     }
  240.  
  241.     sub text
  242.     {
  243.         my ($self, $origtext) = @_;
  244.  
  245.         if ($self->{parsingList})
  246.         {
  247.             if (($origtext =~ m/(\d+) r..?sultats? trouv..?s? dans les titres de films/) && ($1 > 0))
  248.             {
  249.                 $self->{insideResults} = 1;
  250.             }
  251.             if ($self->{isMovie} eq 3)
  252.             {
  253.                 $self->{itemsList}[ $self->{itemIdx} ]->{title} .= $origtext;
  254.             }
  255.             if ($self->{isInfo} eq 1)
  256.             {
  257.                 if ($origtext =~ /\s*([0-9]{4})/)
  258.                 {
  259.                     $self->{itemsList}[ $self->{itemIdx} ]->{date} = $1;
  260.                 }
  261.             }
  262.             elsif ($self->{isInfo} eq 2)
  263.             {
  264.                 if ($origtext =~ /^\s*de (.*)/)
  265.                 {
  266.                     $self->{itemsList}[ $self->{itemIdx} ]->{director} = $1;
  267.                 }
  268.             }
  269.             elsif ($self->{isInfo} eq 3)
  270.             {
  271.                 if (   ($origtext =~ m/^\s*avec (.*)/)
  272.                     && (!$self->{itemsList}[ $self->{itemIdx} ]->{actors}))
  273.                 {
  274.                     $self->{itemsList}[ $self->{itemIdx} ]->{actors} = $1;
  275.                 }
  276.                 $self->{isInfo} = 0;
  277.             }
  278.         }
  279.         else
  280.         {
  281.             $origtext =~ s/[\r\n]//g;
  282.             $origtext =~ s/^\s*//;
  283.             $origtext =~ s/\s*$//;
  284.             if (length($origtext) < 1)
  285.             {
  286.                 $self->{insideGenre} = 0;
  287.             }
  288.             elsif (($self->{inside}->{h1}) && !($self->{inside}->{script}))
  289.             {
  290.                 $self->{curInfo}->{title} = $origtext;
  291.                 $self->{insideInfo} = 1;
  292.             }
  293.             elsif ($self->{insideInfo} eq 1) {
  294.                 if (($self->{insideDate} eq 2) && (length($origtext) > 1))
  295.                 {
  296.                     # http://www.allocine.fr/film/fichefilm_gen_cfilm=140683.html
  297.                     $self->{curInfo}->{date} = $origtext
  298.                       if !($origtext =~ /inconnu/);
  299.                     $self->{insideDate} = 0;
  300.                 }
  301.                 elsif (($origtext =~ /^Date de sortie/)
  302.                     && (!$self->{curInfo}->{date}))
  303.                 {
  304.                     $self->{insideDate} = 1;
  305.                 }
  306.                 elsif (($origtext =~ /^Date de reprise/)
  307.                     && (!$self->{curInfo}->{date}))
  308.                 {
  309.                     $self->{insideDate} = 1;
  310.                 }
  311.                 elsif ($self->{insideDirector} eq 2)
  312.                 {
  313.                     $origtext = ", " if $origtext =~ m/^,/;
  314.                     $self->{curInfo}->{director} .= $origtext;
  315.                 }
  316.                 elsif ($origtext =~ /^R..?alis..? par/)
  317.                 {
  318.                     $self->{insideDirector} = 1;
  319.                 }
  320.                 elsif ($self->{insideOriginal} eq 2)
  321.                 {
  322.                     $self->{curInfo}->{original} = $origtext;
  323.                     $self->{insideOriginal} = 0;
  324.                 }
  325.                 elsif ($origtext =~ /^Titre original/)
  326.                 {
  327.                     $self->{insideOriginal} = 1;
  328.                 }
  329.                 # http://www.allocine.fr/film/fichefilm_gen_cfilm=46940.html
  330.                 elsif ($origtext =~ /^Interdit aux moins de (\d+) ans/)
  331.                 {
  332.                     $self->{curInfo}->{age} = $1;
  333.                 }
  334.                 elsif ($origtext =~ m/^[\s\n]*Dur..?e[\s\n]*:[\s\n]*(\S+)(.*)Ann/)
  335.                 {
  336.                     $self->{insideGenre} = 0;
  337.                     my $time = $1;
  338.                     $time =~ /(?:(\d+)h)?(\d+)min/;
  339.                     $self->{curInfo}->{time} = $1 * 60 + $2 . " ($time)";
  340.                    
  341.                     # http://www.allocine.fr/film/fichefilm_gen_cfilm=140683.html
  342.                     # A bit different, 2 info in the same tag
  343.                     if (!$self->{curInfo}->{date} && ($origtext =~ /Ann..?e de production/)) {
  344.                         $self->{insideDate} = 1;
  345.                     }
  346.                 }
  347.                 elsif ($self->{insideGenre} eq 2)
  348.                 {
  349.                     $origtext = ";" if $origtext =~ m/^,/;
  350.                     $self->{curInfo}->{genre} .= $origtext;
  351.                 }
  352.                 elsif ($origtext =~ /^[\s\n]*Genre/)
  353.                 {
  354.                     $self->{insideCountry} = 0;
  355.                     $self->{insideGenre}   = 1;
  356.                 }
  357.                 elsif ($self->{insideCountry} eq 2)
  358.                 {
  359.                     if ($origtext ne '.')
  360.                     {
  361.                         $origtext = ", " if $origtext =~ m/^,/;
  362.                         $self->{curInfo}->{country} .= $origtext;
  363.                     }
  364.                 }
  365.                 # http://www.allocine.fr/film/fichefilm_gen_cfilm=140683.html
  366.                 elsif ($origtext =~ /(Court|Long)-m..?trage/)
  367.                 {
  368.                     $self->{insideCountry} = 1;
  369.                 }
  370.                 elsif ($self->{insideSynopsis} eq 2)
  371.                 {
  372.                     $self->{curInfo}->{synopsis} .= $origtext;
  373.                 }
  374.                 elsif (($origtext =~ /^Synopsis ./) && !($self->{curInfo}->{synopsis}))
  375.                 {
  376.                     $self->{insideSynopsis} = 1;
  377.                 }
  378.                 elsif ($origtext =~ /^Presse$/)
  379.                 {
  380.                     $self->{insidePressRating} = 1;
  381.                 }
  382.                 elsif (($origtext =~ /^\((.*)\)/) && ($self->{insidePressRating} == 1))
  383.                 {
  384.                     my $rating = $1;
  385.                     $rating =~ s/,/\./g;
  386.                     $self->{curInfo}->{ratingpress} = ($rating / 4) * 10;
  387.                 }
  388.             }
  389.             elsif ($self->{insideActor} == 1)
  390.             {
  391.                 # Actors from casting page
  392.                 $self->{curInfo}->{actors}->[ $self->{actorsCounter} ]->[0] = $origtext
  393.                   if ($self->{actorsCounter} <= $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
  394.                 $self->{actorsCounter}++;
  395.             }
  396.             elsif ($self->{insideRole} == 1)
  397.             {
  398.                 my $role = "";
  399.                 # Roles from casting page
  400.                 if ($origtext =~ m/R..?le : (.*)/)
  401.                 {
  402.                     $role = $1;
  403.                 }
  404.                 # http://www.allocine.fr/film/casting_gen_cfilm=140683.html
  405.                 # Useless ?
  406.                 elsif ($origtext =~ m/R..?le/)
  407.                 {
  408.                     # Unknown / empty role
  409.                     $role = "";
  410.                 }
  411.                 # As we incremented it above, we have one more chance here to add a role
  412.                 # Without <= we would skip the role for last actor
  413.                 push @{$self->{curInfo}->{actors}->[ $self->{actorsCounter} - 1 ]}, $role
  414.                   if ($self->{actorsCounter} <= $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
  415.             }
  416.             elsif ($self->{insideRole} == 2)
  417.             {
  418.                 # Role from casting page
  419.                 $self->{role}       = $origtext;
  420.                 $self->{insideCast} = 3;
  421.                 $self->{insideRole} = 0;
  422.             }
  423.             elsif ($self->{insideActor} == 2)
  424.             {
  425.                 # Actor from casting page
  426.                 push @{$self->{curInfo}->{actors}}, [ $origtext, $self->{role} ]
  427.                   if ($self->{actorsCounter} <= $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
  428.                 $self->{actorsCounter}++;
  429.                 $self->{insideActor} = 0;
  430.             }
  431.         }
  432.     }
  433.  
  434.     sub new
  435.     {
  436.         my $proto = shift;
  437.         my $class = ref($proto) || $proto;
  438.         my $self  = $class->SUPER::new();
  439.  
  440.         $self->{hasField} = {
  441.             title    => 1,
  442.             date     => 1,
  443.             director => 1,
  444.             actors   => 1,
  445.         };
  446.  
  447.         $self->{isInfo}        = 0;
  448.         $self->{isMovie}       = 0;
  449.         $self->{insideResults} = 0;
  450.         $self->{curName}       = undef;
  451.         $self->{curUrl}        = undef;
  452.         $self->{actorsCounter} = 0;
  453.  
  454.         bless($self, $class);
  455.         return $self;
  456.     }
  457.  
  458.     sub preProcess
  459.     {
  460.         my ($self, $html) = @_;
  461.         $html =~ s/&nbsp;/ /gi;
  462.         $html =~ s/<b>|<strong>|<\/b>|<\/strong>|<i>|<\/i>//gi;
  463.  
  464.         if (!$self->{parsingList})
  465.         {
  466.             # Get cast page list
  467.             my $pageUrl = $self->{loadedUrl};
  468.             $pageUrl =~ s/fichefilm_/casting_/;
  469.  
  470.             my $page = $self->loadPage($pageUrl, 0, 1);
  471.             # Grab the actors section, place it in the fetched html. Not the nicest way of grabbing
  472.             # this section, since we end up with mismatched tags, but it works
  473.             # http://www.allocine.fr/film/casting_gen_cfilm=17811.html 2 sections
  474.             # http://www.allocine.fr/film/casting_gen_cfilm=147034.html 1 section
  475.             if ($page =~
  476.                 #m/<a class=.anchor. id=.actors.>(.*?)<a class=.anchor. id=.\S+.><\/a>/s)
  477.                 #m/<a class=.anchor. id=.actors.>(.*)<div class=.nav_secondary.>/s)
  478.                 m/<a class=.anchor. id=.actors.>(.*)<!-- \/rubric !-->/s)
  479.             {
  480.                 my $src = "<actors>$1</actors></body>";
  481.                 $html =~ s/<\/body>/$src/;
  482.             }
  483.         }
  484.  
  485.         return $html;
  486.     }
  487.  
  488.     sub getSearchUrl
  489.     {
  490.         my ($self, $word) = @_;
  491.  
  492.         # f=3 ?
  493.         # return "http://www.allocine.fr/recherche/?q=$word&f=3&rub=1";
  494.         return "http://www.allocine.fr/recherche/1/?q=$word";
  495.     }
  496.  
  497.     sub getSearchCharset
  498.     {
  499.         my $self = shift;
  500.  
  501.         # Need urls to be double character encoded
  502.         return "utf8";
  503.     }
  504.  
  505.     sub getItemUrl
  506.     {
  507.         my ($self, $url) = @_;
  508.  
  509.         return "http://www.allocine.fr" . $url;
  510.     }
  511.  
  512.     sub getName
  513.     {
  514.         return "Allocine.fr";
  515.     }
  516.  
  517.     sub getAuthor
  518.     {
  519.         return 'Tian';
  520.     }
  521.  
  522.     sub getLang
  523.     {
  524.         return 'FR';
  525.     }
  526.    
  527.     sub getCharset
  528.     {
  529.         # return "UTF-8"; # For 1.5.0 Win32
  530.         return "ISO-8859-1"; # For 1.5.0 Win32 with /lib/gcstar/GCPlugins/ ver.1.5.9svn
  531.     }
  532. }
  533.  
  534. 1;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement