Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#26 Le 27/06/2016, à 22:00

Hilarion

Re : Suivi des plugins de GCstar

Bonsoir Varkolak,

Varkolak a écrit :

Du coup, le problème est résolu, il s'agissait bien d'une impossibilité de téléchargement aux adresses de type https.

Bravo ! Tout fonctionne maintenant à la perfection, je vais pouvoir enfin mettre à jour ma bibliothèque... et penser rendre à un certain voisin verbeux et pédant son édition de 1669 des Pensées de Pascal qui servait de cale au buffet de ma cuisine.

Merci encore.

Hors ligne

#27 Le 11/07/2016, à 21:37

Varkolak

Re : Suivi des plugins de GCstar

Bonsoir à tous,

voici une version améliorée du plugin GCAmazon.pm pour les livres, qui corrige deux petits détails gênants:

- la présence d'un point-virgule apparaissant parfois après l'éditeur
- le fait que certains noms d'auteurs sur le site sont rédigés en majuscules

package GCPlugins::GCbooks::GCAmazon;

###################################################
#
#  Copyright 2005-2009 Tian
#
#  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::GCbooks::GCbooksCommon;

{
    package GCPlugins::GCbooks::GCPluginAmazon;
    
    use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
    use XML::Simple;
    use LWP::Simple qw($ua);
    use Encode;
    use HTML::Entities;
    use GCUtils;

    sub start
    {
        my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
	
        $self->{inside}->{$tagname}++;

        if ($self->{parsingList})
        {
	    # Identify beginning of comments
	    if (($self->{isComment} == 0) && ($tagname eq 'varkcomment'))
	    {
	         $self->{isComment} = 1 ;
	    }

	    # Capture URL of book
	    if (($self->{isComment} == 0) && ($self->{isUrl} == 1) && ($tagname eq 'a'))
	    {
                 $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
	         $self->{isUrl} = 0 ;
		 $self->{isTitle} = 1 ;
		 return;
	    }	

	    # Identify beginning of new book (next text is title)
	    if (($self->{isComment} == 0) && ($tagname eq 'li') && ($attr->{id} =~ /result_[0-9]+/ ))
	    {
		 # Create new entry
                 $self->{itemIdx}++;
	         $self->{isUrl} = 1 ;
		 $self->{isAuthor} = 0 ;
		 return ;
	    }

	    # Identify end of authors list
	    if (($self->{isComment} == 0) && ($tagname eq 'varkendauthors') && ($self->{isAuthor} != 0))
	    {
		 $self->{isAuthor} = 0 ;
		 return ;
	    }
        }
        else
        {
	    # Detection of book themes
	    if (($self->{isTheme} == 0) && ($tagname eq 'varkgenre'))
	    {
                $self->{isTheme} = 1 ;
                return ;
	    }		

	    # Detection of book page count
	    if (($self->{isPage} == 0) && ($tagname eq 'varkdata'))
	    {
                $self->{isPage} = 1 ;
                return ;
	    }	

 	    # Detection of authors
	    if ($tagname eq 'varkauthor')
	    {
                $self->{isAuthor} = 1;
                return ;
	    }

	    # Capture of image
	    if ($tagname eq 'varkimage')
	    {
                $attr->{adress} =~ /http.*?\.jpg/;
		$attr->{adress} =~ s|https://images-na.ssl-images-amazon.com/images/I/|http://z2-ec2.images-amazon.com/images/I/|;
		$self->{curInfo}->{cover} = $attr->{adress};
                return ;
	    }

	    # Detection of book description
	    if (($self->{isDescription} == 0) && ($tagname eq 'varkdescription'))
	    {
                $self->{isDescription} = 1 ;
                return ;
	    }
	    if (($self->{isDescription} == 1) && ($tagname eq 'div'))
	    {
                $self->{isDescription} = 2 ;
                return ;
	    }

	    # Detection title
	    if (($self->{isTitle} == 0) && ($tagname eq 'varktitle'))
	    {
                $self->{isTitle} = 2 ;
                return ;
	    }
        }
    }

    sub end
    {
        my ($self, $tagname) = @_;

        $self->{inside}->{$tagname}--;

        if ($self->{parsingList})
        {
	    # Identify end of comments
	    if (($self->{isComment} == 1) && ($tagname eq 'varkcomment'))
	    {
	         $self->{isComment} = 0 ;
	    } 
        }

        else
        {
	    # Finishing themes analysis
	    if (($self->{isTheme} != 0) && ($tagname eq 'li'))
	    {
                $self->{isTheme} = 0 ;
                return ;
	    }

	    # Finishing description analysis
	    if (($self->{isDescription} != 0) && ($tagname eq 'div'))
	    {
                $self->{isDescription} = 0 ;
                return ;
	    }		    
        }
    }

    sub text
    {
        my ($self, $origtext) = @_;


        if ($self->{parsingList})
        {
	    # Remove blanks before and after string
            $origtext =~ s/^\s+//;
            $origtext =~ s/\s+$//g;

	    # Capture of book title
	    if (($self->{isComment} == 0) && ($self->{isTitle} == 1) && ($origtext ne ''))
	    {
                $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
                $self->{isTitle} = 0 ;
                $self->{isPublication} = 1 ;
                return ;
	    }	

	    # Capture of book publication date
	    if (($self->{isComment} == 0) && ($self->{isPublication} == 1) && ($origtext ne ''))
	    {
                $self->{itemsList}[$self->{itemIdx}]->{publication} = $origtext;
                $self->{isAuthor} = 1 ;
                $self->{isPublication} = 0 ;
                return ;
	    }	
   
	    # Avoid a text area before the first author
	    if (($self->{isComment} == 0) && ($self->{isAuthor} == 1) && ($origtext ne ''))
	    {
                $self->{isAuthor} = 2 ;
                return ;
	    }

	    # Capture of authors
	    if (($self->{isComment} == 0) && ($self->{isAuthor} == 2) && ($origtext ne ''))
	    {
                if ($self->{itemsList}[$self->{itemIdx}]->{authors} eq '')
                {
                    $self->{itemsList}[$self->{itemIdx}]->{authors} = $origtext;
		}
		else
		{
		   $self->{itemsList}[$self->{itemIdx}]->{authors} .= " " . $origtext;
		}
		return;
	    }	

        }
        else
        {
	    # Remove blanks before and after string
            $origtext =~ s/^\s+//;
            $origtext =~ s/\s+$//g;

	    # Capture of title
	    if (($self->{isTitle} == 2) && ($origtext ne ''))
	    {
                $self->{isTitle} = 0 ;
                $self->{curInfo}->{title} = $origtext;
                return ;
	    }

	    # Capture of page number
	    if (($self->{isPage} == 1) && ($origtext =~ /^[0-9]+/))
	    {
                $self->{curInfo}->{pages} = $origtext;
                $self->{isPage} = 0 ;
                return ;
	    }

	    # Capture of editor and publication date
	    if (($self->{isEditor} == 0) && ($origtext eq $self->getTranslation(1)))
	    {

                $self->{isEditor} = 1 ;
                return ;
	    }
	    if (($self->{isEditor} == 1) && ($origtext ne ''))
	    {
		my @array = split('\(',$origtext);
		$array[1] =~ s/\)//g;
		$array[0] =~ s/^\s+//;
		$array[0] =~ s/\s+$//g;
		$array[0] =~ s/\;//g;
		$array[1] =~ s/^\s+//;
		$array[1] =~ s/\s+$//g;
                $self->{curInfo}->{publisher} = $array[0];
		$self->{curInfo}->{publication} = $array[1];
                $self->{isEditor} = 0 ;
                return ;
	    }

	    # Capture of language
	    if (($self->{isLanguage} == 0) && ($origtext eq $self->getTranslation(2)))
	    {
                $self->{isLanguage} = 1 ;
                return ;
	    }
	    if (($self->{isLanguage} == 1) && ($origtext ne ''))
	    {
                $self->{curInfo}->{language} = $origtext;
                $self->{isLanguage} = 0 ;
                return ;
	    }

	    # Capture of ISBN
	    if (($self->{isISBN} == 0) && ($origtext eq $self->getTranslation(3)))
	    {
                $self->{isISBN} =1 ;
                return ;
	    }
	    if (($self->{isISBN} == 1) && ($origtext ne ''))
	    {
		$origtext =~ s|-||gi;
                $self->{curInfo}->{isbn} = $origtext;
		$self->{isISBN} = 0 ;
                return ;
	    }

	    # Capture of book dimensions
	    if (($self->{isSize} == 0) && ($origtext eq $self->getTranslation(4)))
	    {
                $self->{isSize} = 1 ;
                return ;
	    }
	    if (($self->{isSize} == 1) && ($origtext ne ''))
	    {
                $self->{curInfo}->{format} = $origtext;
                $self->{isSize} = 0 ;
                return ;
	    }


	    # Detection of themes
	    if (($origtext eq '>') && ($self->{isTheme} == 1))
	    {
                $self->{isTheme} = 2 ;
                return ;
	    }

	    # Capture of themes
	    if (($self->{isTheme} == 2) && ($origtext ne ''))
            {
                if ($self->{curInfo}->{genre} eq '')
                {
                   $self->{curInfo}->{genre} = $origtext;
                }
		else
		{
		   $self->{curInfo}->{genre} .= ", " . $origtext;
		}
		$self->{isTheme} = 1 ;
		return;
            }

	    # Capture of authors
	    if (($self->{isAuthor} == 1) && ($origtext ne '') && ($origtext =~ /^(?:(?!Ajax).)*$/))
            {
		# Lower case for author names, except for first letters
		$origtext =~ s/([[:alpha:]]+)/ucfirst(lc $1)/egi;
                if ($self->{curInfo}->{authors} eq '')
                {
                   $self->{curInfo}->{authors} = $origtext;
                }
		else
		{
		   $self->{curInfo}->{authors} .= ", " . $origtext;
		}
		$self->{isAuthor} = 0 ;
		return;
            }

	    # Capture of description
	    if (($self->{isDescription} == 2) && ($origtext ne ''))
	    {
                if ($self->{curInfo}->{description} eq '')
                {
                   $self->{curInfo}->{description} = $origtext;
                }
		else
		{
		   $self->{curInfo}->{description} .= $origtext;
		}
                return ;
	    }
        }
    }


 
    sub new
    {
        my $proto = shift;
        my $class = ref($proto) || $proto;
        my $self  = $class->SUPER::new();
        bless ($self, $class);

        $self->{hasField} = {
            title => 1,
            authors => 1,
            publication => 1,
            format => 0,
            edition => 0,
        };

        $self->{isComment} = 0;
	$self->{isUrl} = 0;
	$self->{isTitle} = 0;
	$self->{isPublication} = 0;
	$self->{isAuthor} = 0;
        $self->{isPage} = 0;
        $self->{isEditor} = 0;
        $self->{isISBN} = 0;
        $self->{isDescription} = 0;
	$self->{isLanguage} = 0 ;
	$self->{isTheme} = 0 ;

        return $self;
    }
    
    sub getItemUrl
    {
	my ($self, $url) = @_;	
        return $url;
    }

    sub preProcess
    {
        my ($self, $html) = @_;

	if ($self->{parsingList})
        {
	    # Analysis of results must be disabled during comments
            $html =~ s|<!--|<varkcomment>|gi;
            $html =~ s|-->|</varkcomment>|gi;
	    # Remove other commercial offers
	    $html =~ s|END SPONSORED LINKS SCRIPT.*||s;
	    # End of authors listing detection 
	    $html =~ s|<h3 class="a-size-small a-color-null s-inline  a-text-normal">|<varkendauthors>|gi;
	    $html =~ s|<div class="a-row a-spacing-mini">|<varkendauthors>|gi;
        }
        else
        {
	    # Beginning of book data : pages, editor, publication date, ISBN, dimensions
	    $html =~ s|<td class="bucket">|<varkdata>|gi;
	    # Beginning and end of book description
	    $html =~ s|<script id="bookDesc_override_CSS" type="text/undefined">|<varkdescription>|;
	    #$html =~ s|<div id="bookDesc_outer_postBodyPS" style="overflow: hidden; z-index: 1; height: 0px; display: block;">|</varkdescription>|;
	    # Beginning of book title
	    $html =~ s|<div id="booksTitle" class="feature" data-feature-name="booksTitle">|<varktitle>|gi;
	    # Beginning of book themes
	    $html =~ s|<ul class="zg_hrsr">|<varkgenre>|gi;
	    # Beginning of authors
	    $html =~ s|<span class="author notFaded" data-width="">|<varkauthor>|gi;
            # Beginning of image 
            $html =~ s|class="a-dynamic-image image-stretch-vertical frontImage" id="imgBlkFront" data-a-dynamic-image="{&quot;|><varkimage adress="|;

	    $html =~ s|<BR>||gi;
	    $html =~ s|<I>||gi;
	    $html =~ s|</I>||gi;
            $html =~ s|\x{8C}|OE|gi;
            $html =~ s|\x{9C}|oe|gi;
            $html =~ s|&#146;|'|gi;

	}
        return $html;
    }

    sub getSearchUrl
    {
		my ($self, $word) = @_;
		return 'http://' . $self->baseWWWamazonUrl . '/s/ref=nb_sb_noss_1?url=search-alias=stripbooks&field-keywords=' . "$word";
    }
    
    sub baseWWWamazonUrl
    {   
		return "www.amazon.com";    
    }    

    sub getName
    {
        return "Amazon (US)";
    }
    
    sub getAuthor
    {
        return 'Varkolak';
    }
    
    sub getLang
    {
        return 'EN';
    }

    sub getCharset
    {
        my $self = shift;
        return "ISO-8859-15";
    }
    
    sub getSearchFieldsArray
    {
        return ['title', 'authors', 'isbn'];
    }

    # Used to get the local translation of editor, language, ISBN, product dimension, series 
    sub getTranslation
    {
         my $param = $_[1];

	 if ($param == 1)
	 {
		return 'Publisher:';
	 }
	 elsif ($param == 2)
	 {
		return 'Language:';
	 }
	 elsif ($param == 3)
	 {
		return 'ISBN-13:';
	 }
	 elsif ($param == 4)
	 {
		return 'Product Dimensions:';
	 }
	 elsif ($param == 5)
	 {
		return 'Series:';
	 }
    }

}
1;

Hors ligne

#28 Le 25/07/2016, à 22:52

Varkolak

Re : Suivi des plugins de GCstar

Bonsoir à tous,

encore une petite modification du plugin GCAmazon.pm en réponse à une altération du site d'Amazon, qui devrait rendre la recherche par auteur ou titre plus propre :

package GCPlugins::GCbooks::GCAmazon;

###################################################
#
#  Copyright 2005-2009 Tian
#
#  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::GCbooks::GCbooksCommon;

{
    package GCPlugins::GCbooks::GCPluginAmazon;
    
    use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
    use XML::Simple;
    use LWP::Simple qw($ua);
    use Encode;
    use HTML::Entities;
    use GCUtils;

    sub start
    {
        my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
	
        $self->{inside}->{$tagname}++;

        if ($self->{parsingList})
        {
	    # Identify beginning of comments
	    if (($self->{isComment} == 0) && ($tagname eq 'varkcomment'))
	    {
	         $self->{isComment} = 1 ;
	    }

	    # Capture URL of book
	    if (($self->{isComment} == 0) && ($self->{isUrl} == 1) && ($tagname eq 'a'))
	    {
                 $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
	         $self->{isUrl} = 0 ;
		 $self->{isTitle} = 1 ;
		 return;
	    }	

	    # Identify beginning of new book (next text is title)
	    if (($self->{isComment} == 0) && ($tagname eq 'li') && ($attr->{id} =~ /result_[0-9]+/ ))
	    {
		 # Create new entry
                 $self->{itemIdx}++;
	         $self->{isUrl} = 1 ;
		 $self->{isAuthor} = 0 ;
		 return ;
	    }

	    # Identify end of authors list
	    if (($self->{isComment} == 0) && ($tagname eq 'varkendauthors') && ($self->{isAuthor} != 0))
	    {
		 $self->{isAuthor} = 0 ;
		 return ;
	    }
        }
        else
        {
	    # Detection of book themes
	    if (($self->{isTheme} == 0) && ($tagname eq 'varkgenre'))
	    {
                $self->{isTheme} = 1 ;
                return ;
	    }		

	    # Detection of book page count
	    if (($self->{isPage} == 0) && ($tagname eq 'varkdata'))
	    {
                $self->{isPage} = 1 ;
                return ;
	    }	

 	    # Detection of authors
	    if ($tagname eq 'varkauthor')
	    {
                $self->{isAuthor} = 1;
                return ;
	    }

	    # Capture of image
	    if ($tagname eq 'varkimage')
	    {
                $attr->{adress} =~ /http.*?\.jpg/;
		$attr->{adress} =~ s|https://images-na.ssl-images-amazon.com/images/I/|http://z2-ec2.images-amazon.com/images/I/|;
		$self->{curInfo}->{cover} = $attr->{adress};
                return ;
	    }

	    # Detection of book description
	    if (($self->{isDescription} == 0) && ($tagname eq 'varkdescription'))
	    {
                $self->{isDescription} = 1 ;
                return ;
	    }
	    if (($self->{isDescription} == 1) && ($tagname eq 'div'))
	    {
                $self->{isDescription} = 2 ;
                return ;
	    }

	    # Detection title
	    if (($self->{isTitle} == 0) && ($tagname eq 'varktitle'))
	    {
                $self->{isTitle} = 2 ;
                return ;
	    }
        }
    }

    sub end
    {
        my ($self, $tagname) = @_;

        $self->{inside}->{$tagname}--;

        if ($self->{parsingList})
        {
	    # Identify end of comments
	    if (($self->{isComment} == 1) && ($tagname eq 'varkcomment'))
	    {
	         $self->{isComment} = 0 ;
	    } 
        }

        else
        {
	    # Finishing themes analysis
	    if (($self->{isTheme} != 0) && ($tagname eq 'li'))
	    {
                $self->{isTheme} = 0 ;
                return ;
	    }

	    # Finishing description analysis
	    if (($self->{isDescription} != 0) && ($tagname eq 'div'))
	    {
                $self->{isDescription} = 0 ;
                return ;
	    }		    
        }
    }

    sub text
    {
        my ($self, $origtext) = @_;


        if ($self->{parsingList})
        {
	    # Remove blanks before and after string
            $origtext =~ s/^\s+//;
            $origtext =~ s/\s+$//g;

	    # Capture of book title
	    if (($self->{isComment} == 0) && ($self->{isTitle} == 1) && ($origtext ne ''))
	    {
                $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
                $self->{isTitle} = 0 ;
                $self->{isPublication} = 1 ;
                return ;
	    }	

	    # Capture of book publication date
	    if (($self->{isComment} == 0) && ($self->{isPublication} == 1) && ($origtext ne ''))
	    {
                $self->{itemsList}[$self->{itemIdx}]->{publication} = $origtext;
                $self->{isAuthor} = 1 ;
                $self->{isPublication} = 0 ;
                return ;
	    }	
   
	    # Avoid a text area before the first author
	    if (($self->{isComment} == 0) && ($self->{isAuthor} == 1) && ($origtext ne ''))
	    {
                $self->{isAuthor} = 2 ;
                return ;
	    }

	    # Capture of authors
	    if (($self->{isComment} == 0) && ($self->{isAuthor} == 2) && ($origtext ne ''))
	    {
                if ($self->{itemsList}[$self->{itemIdx}]->{authors} eq '')
                {
                    $self->{itemsList}[$self->{itemIdx}]->{authors} = $origtext;
		}
		else
		{
		   $self->{itemsList}[$self->{itemIdx}]->{authors} .= " " . $origtext;
		}
		return;
	    }	

        }
        else
        {
	    # Remove blanks before and after string
            $origtext =~ s/^\s+//;
            $origtext =~ s/\s+$//g;

	    # Capture of title
	    if (($self->{isTitle} == 2) && ($origtext ne ''))
	    {
                $self->{isTitle} = 0 ;
                $self->{curInfo}->{title} = $origtext;
                return ;
	    }

	    # Capture of page number
	    if (($self->{isPage} == 1) && ($origtext =~ /^[0-9]+/))
	    {
                $self->{curInfo}->{pages} = $origtext;
                $self->{isPage} = 0 ;
                return ;
	    }

	    # Capture of editor and publication date
	    if (($self->{isEditor} == 0) && ($origtext eq $self->getTranslation(1)))
	    {

                $self->{isEditor} = 1 ;
                return ;
	    }
	    if (($self->{isEditor} == 1) && ($origtext ne ''))
	    {
		my @array = split('\(',$origtext);
		$array[1] =~ s/\)//g;
		$array[0] =~ s/^\s+//;
		$array[0] =~ s/\s+$//g;
		$array[0] =~ s/\;//g;
		$array[1] =~ s/^\s+//;
		$array[1] =~ s/\s+$//g;
                $self->{curInfo}->{publisher} = $array[0];
		$self->{curInfo}->{publication} = $array[1];
                $self->{isEditor} = 0 ;
                return ;
	    }

	    # Capture of language
	    if (($self->{isLanguage} == 0) && ($origtext eq $self->getTranslation(2)))
	    {
                $self->{isLanguage} = 1 ;
                return ;
	    }
	    if (($self->{isLanguage} == 1) && ($origtext ne ''))
	    {
                $self->{curInfo}->{language} = $origtext;
                $self->{isLanguage} = 0 ;
                return ;
	    }

	    # Capture of ISBN
	    if (($self->{isISBN} == 0) && ($origtext eq $self->getTranslation(3)))
	    {
                $self->{isISBN} =1 ;
                return ;
	    }
	    if (($self->{isISBN} == 1) && ($origtext ne ''))
	    {
		$origtext =~ s|-||gi;
                $self->{curInfo}->{isbn} = $origtext;
		$self->{isISBN} = 0 ;
                return ;
	    }

	    # Capture of book dimensions
	    if (($self->{isSize} == 0) && ($origtext eq $self->getTranslation(4)))
	    {
                $self->{isSize} = 1 ;
                return ;
	    }
	    if (($self->{isSize} == 1) && ($origtext ne ''))
	    {
                $self->{curInfo}->{format} = $origtext;
                $self->{isSize} = 0 ;
                return ;
	    }


	    # Detection of themes
	    if (($origtext eq '>') && ($self->{isTheme} == 1))
	    {
                $self->{isTheme} = 2 ;
                return ;
	    }

	    # Capture of themes
	    if (($self->{isTheme} == 2) && ($origtext ne ''))
            {
                if ($self->{curInfo}->{genre} eq '')
                {
                   $self->{curInfo}->{genre} = $origtext;
                }
		else
		{
		   $self->{curInfo}->{genre} .= ", " . $origtext;
		}
		$self->{isTheme} = 1 ;
		return;
            }

	    # Capture of authors
	    if (($self->{isAuthor} == 1) && ($origtext ne '') && ($origtext =~ /^(?:(?!Ajax).)*$/))
            {
		# Lower case for author names, except for first letters
		$origtext =~ s/([[:alpha:]]+)/ucfirst(lc $1)/egi;
                if ($self->{curInfo}->{authors} eq '')
                {
                   $self->{curInfo}->{authors} = $origtext;
                }
		else
		{
		   $self->{curInfo}->{authors} .= ", " . $origtext;
		}
		$self->{isAuthor} = 0 ;
		return;
            }

	    # Capture of description
	    if (($self->{isDescription} == 2) && ($origtext ne ''))
	    {
                if ($self->{curInfo}->{description} eq '')
                {
                   $self->{curInfo}->{description} = $origtext;
                }
		else
		{
		   $self->{curInfo}->{description} .= $origtext;
		}
                return ;
	    }
        }
    }


 
    sub new
    {
        my $proto = shift;
        my $class = ref($proto) || $proto;
        my $self  = $class->SUPER::new();
        bless ($self, $class);

        $self->{hasField} = {
            title => 1,
            authors => 1,
            publication => 1,
            format => 0,
            edition => 0,
        };

        $self->{isComment} = 0;
	$self->{isUrl} = 0;
	$self->{isTitle} = 0;
	$self->{isPublication} = 0;
	$self->{isAuthor} = 0;
        $self->{isPage} = 0;
        $self->{isEditor} = 0;
        $self->{isISBN} = 0;
        $self->{isDescription} = 0;
	$self->{isLanguage} = 0 ;
	$self->{isTheme} = 0 ;

        return $self;
    }
    
    sub getItemUrl
    {
	my ($self, $url) = @_;	
        return $url;
    }

    sub preProcess
    {
        my ($self, $html) = @_;

	if ($self->{parsingList})
        {
	    # Analysis of results must be disabled during comments
            $html =~ s|<!--|<varkcomment>|gi;
            $html =~ s|-->|</varkcomment>|gi;
	    # Remove other commercial offers
	    $html =~ s|END SPONSORED LINKS SCRIPT.*||s;
	    # End of authors listing detection 
	    $html =~ s|</span></div></div><div class="a-row"><div class="a-column a-span7"><div class="a-row a-spacing-none">|<varkendauthors>|gi;
	    $html =~ s|<h3 class="a-size-small a-color-null s-inline  a-text-normal">|<varkendauthors>|gi;
	    $html =~ s|<div class="a-row a-spacing-mini">|<varkendauthors>|gi;
        }
        else
        {
	    # Beginning of book data : pages, editor, publication date, ISBN, dimensions
	    $html =~ s|<td class="bucket">|<varkdata>|gi;
	    # Beginning and end of book description
	    $html =~ s|<script id="bookDesc_override_CSS" type="text/undefined">|<varkdescription>|;
	    #$html =~ s|<div id="bookDesc_outer_postBodyPS" style="overflow: hidden; z-index: 1; height: 0px; display: block;">|</varkdescription>|;
	    # Beginning of book title
	    $html =~ s|<div id="booksTitle" class="feature" data-feature-name="booksTitle">|<varktitle>|gi;
	    # Beginning of book themes
	    $html =~ s|<ul class="zg_hrsr">|<varkgenre>|gi;
	    # Beginning of authors
	    $html =~ s|<span class="author notFaded" data-width="">|<varkauthor>|gi;
            # Beginning of image 
            $html =~ s|class="a-dynamic-image image-stretch-vertical frontImage" id="imgBlkFront" data-a-dynamic-image="{&quot;|><varkimage adress="|;

	    $html =~ s|<BR>||gi;
	    $html =~ s|<I>||gi;
	    $html =~ s|</I>||gi;
            $html =~ s|\x{8C}|OE|gi;
            $html =~ s|\x{9C}|oe|gi;
            $html =~ s|&#146;|'|gi;

	}
        return $html;
    }

    sub getSearchUrl
    {
		my ($self, $word) = @_;
		return 'http://' . $self->baseWWWamazonUrl . '/s/ref=nb_sb_noss_1?url=search-alias=stripbooks&field-keywords=' . "$word";
    }
    
    sub baseWWWamazonUrl
    {   
		return "www.amazon.com";    
    }    

    sub getName
    {
        return "Amazon (US)";
    }
    
    sub getAuthor
    {
        return 'Varkolak';
    }
    
    sub getLang
    {
        return 'EN';
    }

    sub getCharset
    {
        my $self = shift;
        return "ISO-8859-15";
    }
    
    sub getSearchFieldsArray
    {
        return ['title', 'authors', 'isbn'];
    }

    # Used to get the local translation of editor, language, ISBN, product dimension, series 
    sub getTranslation
    {
         my $param = $_[1];

	 if ($param == 1)
	 {
		return 'Publisher:';
	 }
	 elsif ($param == 2)
	 {
		return 'Language:';
	 }
	 elsif ($param == 3)
	 {
		return 'ISBN-13:';
	 }
	 elsif ($param == 4)
	 {
		return 'Product Dimensions:';
	 }
	 elsif ($param == 5)
	 {
		return 'Series:';
	 }
    }

}
1;

Hors ligne

#29 Le 27/07/2016, à 10:14

Hilarion

Re : Suivi des plugins de GCstar

Varkolak a écrit :

encore une petite modification du plugin GCAmazon.pm en réponse à une altération du site d'Amazon, qui devrait rendre la recherche par auteur ou titre plus propre

Cher Voisin,

Le plugin fonctionne parfaitement. Un grand merci !

H. L.

Hors ligne

#30 Le 18/08/2016, à 19:00

couillardin

Re : Suivi des plugins de GCstar

hello

Ce message s'adresse plus particulièrement à varkolak. Je suis un nouvel utilisateur d'ubuntu et chaque pas en avant est une découverte ! Concernant GCstar, j'ai bien réussi l'installation et je voudrais maintenant mettre à jour les liens qui permettent d'aller sur les sites internet (fnac, ...). Vous expliquez qu'il faut créer un fichier à copier dans un répertoire. Mes compétences s'arrêtent sur la manière de procéder. J'ai essayé le copier-coller de votre texte à la place de l'ancien texte dans le fichier .pm de la fnac mais le message me disant que je n'ai pas l'autorisation apparait. De même en essayant de créer un nouveau fichier.
Merci de m'indiquer comment procéder, en utilisant, s'il vous plait, des termes accessibles aux profanes !
Cordialement

Hors ligne

#31 Le 20/08/2016, à 19:46

Varkolak

Re : Suivi des plugins de GCstar

Bonjour couillardin,

et bon démarrage sur Ubuntu. Le problème décrit est lié aux droits sur les fichiers et va nécessiter quelques manipulations à la console.

En gros (et de manière simplifiée), il existe sous Ubuntu plusieurs utilisateurs (ou groupes d'utilisateurs), qui correspondent le plus souvent à des logins différents.
Les fichiers ont des droits, qui correspondent à ce que les différents utilisateurs sont autorisés à faire dessus (lecture simple, exécution, modification ...), ceci étant spécifique à chaque utilisateur. Il est ainsi possible de permettre à l'utilisateur Simone de simplement consulter un fichier (lecture), alors que l'utilisateur Janine pourra à la fois le lire et le modifier (lecture et modification). Les droits d'un fichier sont visibles par un clic droit.

Ceci étant posé, on va voir comment sont divisés les fichiers dans Ubuntu :

- dans le dossier /home/, chaque sous dossier correspond à un utilisateur (propriétaire) différent (il contient tous ses fichiers, ses configurations personnelles etc...); il est normalement accessible uniquement au propriétaire (ce qui évite à un autre utilisateur de détruire/changer son contenu)

- tous les autres dossiers sont des dossiers système : de manière générale, ils doivent pouvoir être lus et exécutés par tous (le programme Firefox est disponible pour tous les utilisateurs; si il était dans un des dossiers du /home, il ne serait utilisable que par un seul). Le revers de la médaille est que les dossiers système ne sont pas modifiables par les utilisateurs normaux (ce qui évite à l'un des utilisateurs de saboter un programme pour tous par exemple). Une mise à jour de programme nécessite de modifier des fichiers système, ce qui ne peut être fait que par un utilisateur spécial appelé root, qui a tous les droits. Sous Ubuntu, il existe un mécanisme permettant à un utilisateur administrateur d'obtenir temporairement les droits de root pour faire des changements sur les fichiers système.


Sur un plan pratique, pour GCstar, il faut :

- ouvrir un terminal (menu principal - émulateur de terminal par exemple)

- entrer d'abord une commande de mise à jour automatique de GCstar (il va y avoir une demande de mot de passe) :

sudo gcstar -a

sudo signalant que l'on souhaite travailler avec les droits de root
gcstar -a lance GCstar avec l'option -a, qui correspond à la mise à jour de tous les composants du logiciel

- comme la mise à jour centralisée de GCstar a pris un peu de retard, il va falloir ensuite modifier manuellement certains fichiers; à titre d'exemple, pour le plugin principal des livres Amazon :

sudo gedit /usr/share/gcstar/lib/GCPlugins/GCbooks/GCAmazon.pm

sudo donne les droits root
gedit lance l'éditeur de texte Gedit
/usr/share/gcstar/lib/GCPlugins/GCbooks/GCAmazon.pm en ouvrant le fichier GCAmazon.pm

Le fichier est alors ouvert de manière classique, mais cette fois avec les droits root : il peut être modifié et sauvegardé !


ATTENTION : l'utilisation de sudo permet de tout faire sur le système, y compris endommager des fichiers indispensables; il faut toujours vérifier que le fichier modifié est bien celui visé (fautes de frappe par exemple), et comprendre exactement ce qui appliqué (ne pas lancer des commandes avec sudo qu'on ne comprend pas).

J'espère avoir été clair sur la procédure à suivre et un peu débroussaillé le terrain concernant les droits sous Ubuntu...

Hors ligne

#32 Le 02/02/2017, à 00:37

LeChi

Re : Suivi des plugins de GCstar

Bonsoir à tous,

pouvez-vous me dire comment adapter les plugins fnac et amazone que vous avez écrit pour des biblio de livres afin de s'en servir pour des biblio de BD ?

merci par avance.

Hors ligne

#33 Le 08/02/2017, à 11:24

coucou123

Re : Suivi des plugins de GCstar

Varkolak a écrit :

Bonsoir à tous,

encore une petite modification du plugin GCAmazon.pm en réponse à une altération du site d'Amazon, qui devrait rendre la recherche par auteur ou titre plus propre :


Merci beaucoup ! Ça fonctionne parfaitement !

Hors ligne

#34 Le 08/02/2017, à 13:32

LeChi

Re : Suivi des plugins de GCstar

Pas d'aide possible ?

LeChi a écrit :

Bonsoir à tous,

pouvez-vous me dire comment adapter les plugins fnac et amazone que vous avez écrit pour des biblio de livres afin de s'en servir pour des biblio de BD ?

merci par avance.

Hors ligne

#35 Le 10/02/2017, à 00:44

Varkolak

Re : Suivi des plugins de GCstar

Bonsoir LeChi,

et désolé pour la réponse un peu tardive. J'ai jeté un œil aux modifications à faire pour adapter les plugins à la recherche de BD.
Une certitude, il va falloir au moins changer la partie initiale du fichier pour le relier aux modèles de BD (remplacer les GCbooks par des GCcomics), et déplacer les fichiers modifiés dans la bonne arborescence (/usr/share/gcstar/lib/GCPlugins/GCcomics/).

Je ne suis pas du tout sûr que ce soit suffisant, car les données des BD semblent assez différentes de celles des livres :

- La fonction de recherche est à changer, puisque les possibilités semblent être le nom de la série et l'auteur (pas de titre ni d'ISBN), et que les sites non spécialisés regroupent en général leurs réponses concernant livres et BD (tri à faire).
- La récupération des auteurs doit être plus précise (les auteurs de livres sont récupérés sous forme de simple liste, alors que ceux des BD doivent être séparés selon leur fonction : scénariste, dessinateur...)
- Les champs à remplir n'ont pas forcément les mêmes noms

A priori, un gros travail en perspective, auquel je n'ai le temps de m'atteler dans l'immédiat.
Mais si quelqu'un veut se lancer dans l'aventure, je reste disponible pour des discussions et conseils...

Hors ligne

#36 Le 13/02/2017, à 18:36

kazoupilami1

Re : Suivi des plugins de GCstar

Hello et tout d'abord un grand merci pour ce travail, car GCStar, même avec la dernière version, ne m'apportait pas les résultats attendus pour le téléchargement en ligne des infos.

De mon côté, je m'en sers pour les films.

Hier, j'ai bien repris le code des plugins Amazon et Allocine, ainsi que le GCPluginsBase.pm. Tout fonctionnait nickel sauf les images (CF plus bas).

Aujourd'hui, je ne sais pas pourquoi, mais le plugin Allocine ne fonctionne plus. Les films ne sont pas reconnus. J'ai remodifié les fichiers, me disant que... Mais le résultat reste le même.
Pour Amazon, il ne m'importe plus le champ "genre" du film.
Enfin, même quand ça fonctionnait très bien, ni le plugin Amazon ni le plugin Allocine ne permettait de télécharger les images pour les films. J'ai essayé une modif moi-même à partir du code fourni ici pour le plugin Amazon pour les livres, sans succès (je ne suis pas très doué pour le code).

Quelqu'un aurait-il une piste pour résoudre ces petits soucis, principalement celui d'Allociné qui fait choux blanc, et du genre manquant avec Amazon s'il vous plaît ?
Pour le mode opératoire : j'exécute le programme en admin. Je l'ai réinstallé avec l'application des updates (sudo gcstar -u) avant de remodifier les plugins selon le code fourni ici.

Encore un grand merci pour votre travail.

A bientôt.

K.


Un petit Eee PC Asus 1225b sur Ubuntu 12.04 LTS.
Une tour revue au gré des incidents materiels depuis 2008, sous Ubuntu 16.04.
Houba Ubuntu Houba !

Hors ligne

#37 Le 13/02/2017, à 22:34

kerenoc

Re : Suivi des plugins de GCstar

Bonsoir,

Pour répondre aux deux derniers posts (amélioration de la recherche Amazon sur les livres/bd et Allocine), je signale que j'ai rendu public le dépôt Gitlab https://gitlab.com/Kerenoc/GCstar dans lequel j'essaie de centraliser les améliorations que j'ai faites ou que j'ai trouvées sur le web.

La branche master correspond au dépôt SVN, la branche Test permet de tester toutes les modifications proposées.

Certains plugins ne peuvent être utilisés sans faire les modifications de GCstar permettant de traiter correctement HTTPS. D'autres (Allmovie, Allocine) nécessitent une modification de GCPluginsBase.pm pour récupérer les informations sur plusieurs pages web différentes (page du casting complet pour Allocine).

Hors ligne

#38 Le 13/02/2017, à 22:46

Hizoka

Re : Suivi des plugins de GCstar

kerenoc => ça à l'aire intéressant mais compliqué, est il possible d'avoir plus d'explications sur la façon de faire pour améliorer gcstar et ses plugins ?


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#39 Le 13/02/2017, à 23:04

kazoupilami1

Re : Suivi des plugins de GCstar

Salut Kerenoc et merci pour le tuyau.
Néanmoins mon soucis reste le même avec le plugin Allociné qui est devenu inéficient du jour au lendemain. Et n'étant pas familier avec Gitlab, lorsque je récupère ta version du plugin Allociné, je n'arrive pas le faire avec une version expurgée des lignes d'erreur et de celles précédées d'@. J'ai dû louper un truc mais je ne vois pas comment procéder sur le site pour récupérer le fichier au "propre". Désolé...


Un petit Eee PC Asus 1225b sur Ubuntu 12.04 LTS.
Une tour revue au gré des incidents materiels depuis 2008, sous Ubuntu 16.04.
Houba Ubuntu Houba !

Hors ligne

#40 Le 13/02/2017, à 23:29

kerenoc

Re : Suivi des plugins de GCstar

Le plus simple est sans doute d'aller sur la page de la branche Test et de télécharger une archive (icône sur la droite, vers le haut).

Après l'avoir décompressée localement, on peut soit lancer GCstar depuis le répertoire bin soit copier à la main les fichiers nécessaires vers sa propre installation.

Hors ligne

#41 Le 13/02/2017, à 23:50

kazoupilami1

Re : Suivi des plugins de GCstar

Merci smile Effectivement, c'est plus simple que lire les fichiers depuis la page web.
Je n'ai pas fait dans la demi-mesure : j'ai téléchargé le zip complet de la branche test et l'ai installé, après avoir désinstallé (apt-get remove) puis purgé (apt-get purge) ma précédente version.
Ça a résolu mes problèmes avec Allocine, téléchargement d'image inclus smile
Merci et désolé pour la question de newbie sur l'usage de Gitlab.

edit : en fait, non, ça a marché pour le premier film testé, puis depuis, même issue : ne reconnaît plus les films.

Voici un extrait du terminal.

32a3a078a623d5e/gcstar$ sudo gcstar
GLib-CRITICAL **: Source ID 942 was not found when attempting to remove it at /usr/local/bin/../lib/gcstar/GCMainWindow.pm line 492.
GLib-CRITICAL **: Source ID 1301 was not found when attempting to remove it at /usr/local/bin/../lib/gcstar/GCMainWindow.pm line 1001.
PluginsBase response 403 url http://www.allocine.fr/recherche/?q=4+Gar%C3%A7ons+plein+d%27avenir
GLib-CRITICAL **: Source ID 2737 was not found when attempting to remove it at /usr/local/bin/../lib/gcstar/GCMainWindow.pm line 492.
PluginsBase response 403 url http://www.allocine.fr/recherche/?q=Quatre+Gar%C3%A7ons+plein+d%27avenir
GLib-CRITICAL **: Source ID 3450 was not found when attempting to remove it at /usr/local/bin/../lib/gcstar/GCMainWindow.pm line 492.
PluginsBase response 403 url http://www.allocine.fr/recherche/?q=Quatre+garcons+plein+d%27avenir
GLib-CRITICAL **: Source ID 3968 was not found when attempting to remove it at /usr/local/bin/../lib/gcstar/GCMainWindow.pm line 492.
PluginsBase response 403 url http://www.allocine.fr/recherche/?q=12+Hommes+en+col%C3%A8re
GLib-CRITICAL **: Source ID 4542 was not found when attempting to remove it at /usr/local/bin/../lib/gcstar/GCMainWindow.pm line 492.
PluginsBase response 403 url http://www.allocine.fr/recherche/?q=58+minutes+pour+vivre
GLib-CRITICAL **: Source ID 5010 was not found when attempting to remove it at /usr/local/bin/../lib/gcstar/GCMainWindow.pm line 492.

Pour la précision, la première ligne GLib-Critical correspond au premier film que j'ai recherché et où ça a fonctionné.
J'ai ensuite enchaîné avec 4 Garçons plein d'avenir et les autres films que l'on peut voir dans le code, et là le bug est revenu. Allociné me renvoie désormais pour chaque film qu'il est inconnu, conséquence (si je lis bien) d'une erreur 403 - Forbiden, comme si j'étais "banni" après une consultation. Si je cherche avec AmazonFR, il trouve rien, ou plutôt il m'ouvre la fenêtre avec le choix entre plusieurs versions mais aucun texte n'apparaît dans cette fenêtre.

Dernière modification par kazoupilami1 (Le 14/02/2017, à 11:11)


Un petit Eee PC Asus 1225b sur Ubuntu 12.04 LTS.
Une tour revue au gré des incidents materiels depuis 2008, sous Ubuntu 16.04.
Houba Ubuntu Houba !

Hors ligne

#42 Le 14/02/2017, à 08:49

Hizoka

Re : Suivi des plugins de GCstar

Pourquoi lancé en mode sudo le logiciel ? C'est prendre des risques inutiles !
De plus, il ne faut pas utiliser sudo pour lancer des applications graphiques en mode root !
https://doc.ubuntu-fr.org/sudo#executer … tu_xubuntu

kerenoc => Merci, en effet c'est plus simple comme ça smile


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#43 Le 14/02/2017, à 12:44

kerenoc

Re : Suivi des plugins de GCstar

@kazoupilami1

Apparemment Allocine a mis très récemment en place un contrôle plus poussé sur l'accès au site et je suis tombé sur une page destinée à filtrer les robots. Comme GCstar ne prend actuellement pas de précaution particulière pour passer inaperçu, il se fait directement filtrer (message 403 "You have been blocked").

Hors ligne

#44 Le 14/02/2017, à 13:45

kazoupilami1

Re : Suivi des plugins de GCstar

C'est bien ce que je craignais :'(
Je vais me pencher sur les problèmes que j'ai avec le plugin Amazon du coup...


Un petit Eee PC Asus 1225b sur Ubuntu 12.04 LTS.
Une tour revue au gré des incidents materiels depuis 2008, sous Ubuntu 16.04.
Houba Ubuntu Houba !

Hors ligne

#45 Le 14/02/2017, à 14:44

kerenoc

Re : Suivi des plugins de GCstar

Modifications minimales faites pendant la pause pour refaire marcher le plugin AmazonFr pour les films (peuplement de la liste de recherche, récupération du titre et de l'image). Mise à jour sur Gitlab dans un branche Plugin_Films_Amazon et dans la branche Test.

Hors ligne

#46 Le 15/02/2017, à 18:08

kazoupilami1

Re : Suivi des plugins de GCstar

Hello Kerenoc et merci.
J'ai téléchargé cette nouvelle version test : impec. Juste un détail : Amazon ne récupère pas le "genre" du film, et un peu moins important, le synopsis.
Pour Allociné, je ne comprends pas très bien comment fonctionne leur contrôle d'accès. Ce matin, j'ai réussi à enchaîner une cinquantaine de requêtes avec succès avant de repasser en 403. Ce soir, bloqué à la seconde tentative...

Dernière modification par kazoupilami1 (Le 15/02/2017, à 18:09)


Un petit Eee PC Asus 1225b sur Ubuntu 12.04 LTS.
Une tour revue au gré des incidents materiels depuis 2008, sous Ubuntu 16.04.
Houba Ubuntu Houba !

Hors ligne

#47 Le 15/02/2017, à 18:42

kerenoc

Re : Suivi des plugins de GCstar

Mise à jour d'AmazonFR pour les films sur GitLab : synopsis, correction format de la date et du nombre de page, ajout de la date et des acteurs pour la liste de recherche.

Pour le genre, le plugin Amazon pour les livres récupère quelque chose: cela devrait donc être dans la mise à jour suivante.

Pour Allociné, le site fait peut-être une remise à zéro des compteurs tous les jours.

Dernière modification par kerenoc (Le 15/02/2017, à 18:45)

Hors ligne

#48 Le 15/02/2017, à 22:03

kazoupilami1

Re : Suivi des plugins de GCstar

Une piste de solution ici pour le plugin Allocine, reprise chez les caramades de Ant MC.


Un petit Eee PC Asus 1225b sur Ubuntu 12.04 LTS.
Une tour revue au gré des incidents materiels depuis 2008, sous Ubuntu 16.04.
Houba Ubuntu Houba !

Hors ligne

#49 Le 16/02/2017, à 20:01

kerenoc

Re : Suivi des plugins de GCstar

La piste de solution pour le plugin Allocine était déjà dans le code : GCstar émule un Mozilla/5.0 Linux mais se fait repérer quand même.

Hors ligne

#50 Le 16/02/2017, à 20:58

Hizoka

Re : Suivi des plugins de GCstar

et en modifiant aléatoirement le navigateur utilisé ?


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne