From 126bb8cb6b93240bb4d3a2b816b74c286c3d422b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Frings-F=C3=BCrst?= Date: Sun, 6 Jul 2014 15:20:38 +0200 Subject: Imported Upstream version 1.7.0 --- lib/gcstar/GCPlugins/GCgames/GCMobyGames.pm | 541 ++++++++++++++++++++++++++++ 1 file changed, 541 insertions(+) create mode 100644 lib/gcstar/GCPlugins/GCgames/GCMobyGames.pm (limited to 'lib/gcstar/GCPlugins/GCgames/GCMobyGames.pm') diff --git a/lib/gcstar/GCPlugins/GCgames/GCMobyGames.pm b/lib/gcstar/GCPlugins/GCgames/GCMobyGames.pm new file mode 100644 index 0000000..c6650c3 --- /dev/null +++ b/lib/gcstar/GCPlugins/GCgames/GCMobyGames.pm @@ -0,0 +1,541 @@ +package GCPlugins::GCgames::GCMobyGames; + +################################################### +# +# Copyright 2005-2011 Christian Jodar +# +# This file is part of GCstar. +# +# GCstar is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# GCstar is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCstar; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +# +################################################### + +use strict; +use utf8; + +use GCPlugins::GCgames::GCgamesCommon; + +{ + package GCPlugins::GCgames::GCPluginMobyGames; + + use base 'GCPlugins::GCgames::GCgamesPluginsBase'; + use HTML::Entities; + + sub extractTips + { + my ($self, $html_ini) = @_; + my $answer = ""; + my @tmpAnswer = (); + my $html = $self->loadPage($html_ini, 0, 1); + $html =~ s|
||gi;
+        $html =~ s|
||gi; + $html =~ s|||gi; + $html =~ s|||gi; + my $found = index($html,"class=\"sbL sbB sbT\">"); + if ( $found >= 0 ) + { + $answer = substr($html, $found + length("class=\"sbL sbB sbT\">"),length($html)- $found -length("class=\"sbL sbB sbT\">") ); + $answer = substr($answer, 0, index($answer,"

"); + if ( $found >= 0 ) + { + my $html2 = substr($html, $found + length("class=\"sbR sbL sbB\">

"),length($html)- $found -length("class=\"sbR sbL sbB\">

") ); + $html2 = substr($html2, 0, index($html2,"

")); + $html2 =~ s/
/\n/gi; + $html2 =~ s|

|\n|gi; + $html2 =~ s|

||gi; + + $tmpAnswer[1] = decode_entities($html2); + } + + } + + return @tmpAnswer; + } + + sub extractPlayer + { + my ($self, $html_ini, $word) = @_; + my $html = 0; + my $found = index($html_ini,$word); + if ( $found >= 0 ) + { + $html = substr($html_ini, $found + length($word),length($html_ini)- $found -length($word) ); + $html = substr($html,0, index($html,"") ); + $html = reverse($html); + $html = substr($html,0, index($html,">") ); + $html = reverse($html); + $html =~ s/ / /g; + $html =~ s/1 Player/1/; + } + return $html; + } + + sub start + { + my ($self, $tagname, $attr, $attrseq, $origtext) = @_; + + $self->{inside}->{$tagname}++; + if ($self->{parsingList}) + { + if ( !$self->{insideSearchImage} + && ($tagname eq 'a') + && ( substr($attr->{href},0,6) eq '/game/' ) ) + { + # Test if there is a platform name in it + # (i.e. if we can find a second slash after game/ ) + if ($attr->{href} =~ m|/game/[^/]*/|) + { + if ($self->{currentName}) + { + $self->{itemIdx}++; + $self->{itemsList}[$self->{itemIdx}]->{url} = 'http://www.mobygames.com'.$attr->{href}.''; + $self->{itemsList}[$self->{itemIdx}]->{name} = $self->{currentName}; + $self->{isPlatform} = 1; + } + else + { + # This is a game we want to add + $self->{isGame} = 1; + $self->{itemIdx}++; + $self->{itemsList}[$self->{itemIdx}]->{url} = 'http://www.mobygames.com'.$attr->{href}.''; + $self->{isName} = 1 ; + } + } + else + { + # We will need the name later + $self->{isGameName} = 1; + } + } + elsif ( ($tagname eq 'a') && ( substr($attr->{href},0,7) eq '/search' ) ) + { + $self->{isGame} = 0; + } + elsif ($tagname eq 'div') + { + if ($attr->{class} eq 'searchResult') + { + $self->{currentName} = ''; + } + elsif ($attr->{class} eq 'searchImage') + { + $self->{insideSearchImage} = 1; + } + } + elsif ($tagname eq 'em') + { + $self->{isDate} = 1; + } + } + elsif ($self->{parsingTips}) + { + if (($tagname eq 'table') && ($attr->{summary} eq 'List of Tips and Tricks')) + { + $self->{isSectionTips} = 2; + } + elsif ( ($tagname eq 'b') && ($self->{isSectionTips} eq '2') ) + { + $self->{isSectionTips} = 1; + } + elsif ( ($tagname eq 'tr') && (($attr->{class} eq 'mb1') || ($attr->{class} eq 'mb2')) ) + { + $self->{isTip} = 1 if ($self->{isTip} eq 2); + $self->{isCode} = 1 if ($self->{isCode} eq 2); + } + elsif ( ($tagname eq 'a') && ($self->{isTip} eq 1)) + { + my @tips = $self->extractTips('http://www.mobygames.com'.$attr->{href}.''); + if ($tips[0] =~ m/unlock/i) + { + $Text::Wrap::columns = 80; + $tips[1] = Text::Wrap::wrap('', '', $tips[1]); + #$self->{tmpCheatLine} = []; + #push @{$self->{tmpCheatLine}}, @tips; + push @{$self->{curInfo}->{unlockable}}, \@tips; + } + else + { + my $answer = $tips[0]; + $answer .= "\n"; + $answer .= $tips[1]; + if ( ($self->{curInfo}->{secrets}) && ($answer ne "") ) + { + $self->{curInfo}->{secrets} .= "\n\n\n" + } + $self->{curInfo}->{secrets} .= $answer; + } + $self->{isTip} = 2; + } + elsif ( ($tagname eq 'a') && ($self->{isCode} eq 1)) + { + my @tips = $self->extractTips('http://www.mobygames.com'.$attr->{href}.''); + @tips = reverse(@tips); + $Text::Wrap::columns = 80; + $tips[1] = Text::Wrap::wrap('', '', $tips[1]); + #$self->{tmpCheatLine} = []; + #push @{$self->{tmpCheatLine}}, @tips; + push @{$self->{curInfo}->{code}}, \@tips; + + $self->{isCode} = 2; + + } + elsif ($tagname eq 'br') + { + $self->{isTip} = 3; + $self->{isCode} = 3; + $self->{isSectionTips} = 0; + } + elsif ($tagname eq 'head') + { + $self->{isTip} = 0; + $self->{isCode} = 0; + $self->{isSectionTips} = 0; + } + + } + else + { + + if ($tagname eq 'div') + { + for ($attr->{id}) + { + /^gameTitle$/ && ($self->{isName} = 1, last); + /^gamePlatform/ && ($self->{isPlatform} = 1, last); + #/^coreGameCover/ && ($self->{isBox} = 1, last); + /^coreGameRelease/ && ($self->{isEditor} = 1, last); + } + + if ($attr->{class} =~ m/scoreBoxBig/) + { + $self->{isRating} = 1; + } + + if ($self->{curInfo}->{genre}) + { + $self->{isGenre} = 0; + } + + $self->{isDescription} = 0; + + } + elsif ( ($tagname eq 'a') && ($self->{isName}) ) + { + $self->{is} = 'name'; + $self->{curInfo}->{exclusive} = 1; + $self->{isName} = 0; + } + elsif ( ($tagname eq 'a') && ($self->{isPlatform}) ) + { + $self->{is} = 'platform'; + $self->{isPlatform} = 0; + } + elsif ( ($tagname eq 'a') && ($self->{isEditor}) ) + { + $self->{is} = 'editor'; + $self->{isEditor} = 0; + } + elsif ( ($tagname eq 'a') && ($self->{isDeveloper}) ) + { + $self->{is} = 'developer'; + $self->{isDeveloper} = 0; + } + elsif ( ($tagname eq 'a') && ($self->{isDate}) ) + { + $self->{is} = 'released'; + $self->{isDate} = 0; + } + elsif ( ($tagname eq 'a') && ($self->{isGenre}) ) + { + $self->{is} = 'genre'; + } + elsif ($tagname eq 'img') + { + if ($attr->{src} =~ m|covers/small|) + { + $attr->{src} =~ s|/small/|/large/| + if $self->{bigPics}; + $self->{curInfo}->{boxpic} = $attr->{src}; + # From here we try to get back cover + my $covers = $self->loadPage($self->{rootUrl}.'/cover-art', 0, 1); + $covers =~ m|.*?Back Cover{curInfo}->{backpic} = $1; + $self->{curInfo}->{backpic} =~ s|/small/|/large/| + if $self->{bigPics}; + } + } + elsif ($tagname eq 'html') + { + my $html = $self->loadPage($self->{curInfo}->{$self->{urlField}}.'/techinfo', 0, 1); + my $player_offline = $self->extractPlayer($html, "Number of Players: Offline" ); + my $player_online = $self->extractPlayer($html, "Number of Players: Online" ); + my $player_total = $self->extractPlayer($html, "Number of Players Supported" ); + + if ($player_total) + { + $self->{curInfo}->{players} = $player_total; + } + else + { + if ($player_offline) + { + $self->{curInfo}->{players} = 'Offline: '.$player_offline; + } + if ($player_online) + { + if ( $self->{curInfo}->{players} ) + { + $self->{curInfo}->{players} .= '; Online: '.$player_online; + } + else + { + $self->{curInfo}->{players} = 'Online: '.$player_online; + } + } + } + + $html = $self->loadPage($self->{curInfo}->{$self->{urlField}}.'/screenshots', 0, 1); + my $screen = 1; + while ($html =~ m|src="(/images/shots/[^"]*?)"|g) + { + $self->{curInfo}->{'screenshot'.$screen} = 'http://www.mobygames.com' . $1; + $self->{curInfo}->{'screenshot'.$screen} =~ s|/images/shots/s/|/images/shots/l/| + if $self->{bigPics}; + $screen++; + last if $screen > 2; + } + } + elsif ( ($tagname eq 'br') && ($self->{isDescription}) ) + { + $self->{curInfo}->{description} .= "\n"; + } + } + } + + sub end + { + my ($self, $tagname) = @_; + $self->{inside}->{$tagname}--; + if ($self->{parsingList} && ($tagname eq 'div')) + { + $self->{insideSearchImage} = 0; + } + } + + sub text + { + my ($self, $origtext) = @_; + + if ($self->{parsingList}) + { + if ($self->{isName}) + { + #$self->{itemsList}[$self->{itemIdx}]->{name} = $origtext; + if ($origtext !~ /^Game:/) + { + if (!$self->{currentName}) + { + $self->{itemsList}[$self->{itemIdx}]->{name} = $origtext; + } + $self->{isName} = 0; + } + } + elsif ($self->{isPlatform}) + { + $self->{itemsList}[$self->{itemIdx}]->{platform} = $origtext; + $self->{isPlatform} = 0; + } + elsif ($self->{isGameName}) + { + $self->{currentName} = $origtext; + $self->{isGameName} = 0; + } + elsif ($self->{isDate}) + { + # tags enclose both dates and the 'a.k.a.' text, so make sure we + # ignore the aka ones + if ($origtext !~ /^a\.k\.a\./) + { + $self->{itemsList}[$self->{itemIdx}]->{released} = $origtext; + if (! $self->{itemsList}[$self->{itemIdx}]->{platform}) + { + $self->{previous} =~ s/[\s\(]*$//g; + $self->{itemsList}[$self->{itemIdx}]->{platform} = $self->{previous}; + } + } + $self->{isDate} = 0; + } + $self->{previous} = $origtext; + } + elsif ($self->{parsingTips}) + { + if ($self->{isSectionTips} eq 1) + { + if ($origtext =~ m/General Hints\/Tips/i) + { + $self->{isTip} = 2; + $self->{isCode} = 0; + } + elsif ($origtext =~ m/Cheats\/Codes/i) + { + $self->{isTip} = 0; + $self->{isCode} = 2; + } + $self->{isSectionTips} = 2; + } + } + else + { + if ($self->{is}) + { + $origtext =~ s/^\s*//; + + if ($self->{is} eq 'platform') + { + $self->{curInfo}->{$self->{is}} = $origtext; + $self->{curInfo}->{platform} =~ s/DOS/PC/; + $self->{curInfo}->{platform} =~ s/Windows/PC/; + } + elsif ($self->{is} eq 'genre') + { + push @{$self->{curInfo}->{genre}}, [ $origtext ]; + } + else + { + $self->{curInfo}->{$self->{is}} = $origtext; + } + + $self->{is} = ''; + } + elsif ($self->{isRating}) + { + $self->{curInfo}->{ratingpress} = int($origtext/10+0.5); + $self->{isRating} = 0; + } + elsif ($self->{isDescription}) + { + $self->{curInfo}->{description} .= $origtext; + } + elsif ($origtext eq 'Developed by') + { + $self->{isDeveloper} = 1 + } + elsif ( ($origtext eq 'Also For') || (($origtext eq 'Platforms'))) + { + $self->{curInfo}->{exclusive} = 0; + } + elsif ($origtext eq 'Released') + { + $self->{isDate} = 1 + } + elsif ($origtext eq 'Genre') + { + $self->{isGenre} = 1 + } + elsif ($origtext eq 'Description') + { + $self->{isDescription} = 1 + } + } + } + + sub getTipsUrl + { + my $self = shift; + my $url = $self->{curInfo}->{$self->{urlField}}.'/hints'; + $url =~ s/##MobyGames//; + return $url; + } + + sub new + { + my $proto = shift; + my $class = ref($proto) || $proto; + my $self = $class->SUPER::new(); + bless ($self, $class); + + $self->{hasField} = { + name => 1, + platform => 1, + released => 1 + }; + + $self->{isName} = 0; + $self->{isGame} = 0; + $self->{isGameName} = 0; + $self->{isPlatform} = 0; + $self->{isEditor} = 0; + $self->{isDeveloper} = 0; + $self->{isDate} = 0; + $self->{isGenre} = 0; + $self->{isDescription} = 0; + $self->{isBox} = 0; + $self->{isSectionTips} = 0; + $self->{isTip} = 0; + $self->{isCode} = 0; + $self->{is} = ''; + + return $self; + } + + sub preProcess + { + my ($self, $html) = @_; + $self->{rootUrl} = $self->{loadedUrl}; + return $html; + } + + sub getSearchUrl + { + my ($self, $word) = @_; + return 'http://www.mobygames.com/search/quick?q='.$word.'&p=-1&search=Go&sFilter=1&sG=on'; + } + + sub getItemUrl + { + my ($self, $url) = @_; + + return $url if $url; + return 'http://www.mobygames.com/'; + } + + sub getName + { + return 'MobyGames'; + } + + sub getAuthor + { + return 'TPF'; + } + + sub getLang + { + return 'EN'; + } + + sub getCharset + { + my $self = shift; + + return "ISO-8859-1"; + } +} + +1; -- cgit v1.2.3