diff options
Diffstat (limited to 'lib/gcstar/GCExport/GCExportTellico.pm')
| -rw-r--r-- | lib/gcstar/GCExport/GCExportTellico.pm | 512 | 
1 files changed, 512 insertions, 0 deletions
diff --git a/lib/gcstar/GCExport/GCExportTellico.pm b/lib/gcstar/GCExport/GCExportTellico.pm new file mode 100644 index 0000000..2bac594 --- /dev/null +++ b/lib/gcstar/GCExport/GCExportTellico.pm @@ -0,0 +1,512 @@ +package GCExport::GCExportTellico; + +################################################### +# +#  Copyright 2005-2010 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 GCExport::GCExportBase; + +{ +    package GCExport::GCExporterTellico; + +    use base qw(GCExport::GCExportBaseClass); +    use GCUtils; + +    sub new +    { +        my $proto = shift; +        my $class = ref($proto) || $proto; +        my $self  = $class->SUPER::new(); +        bless ($self, $class); + +        $self->checkModule('MIME::Base64'); +        $self->checkModule('Digest::MD5'); + +        #List of collections: http://www.periapsis.org/tellico/doc/collection-type-values.html +        # [ entryTitle, type, extra fields ] +        $self->{models} = { +                              GCbooks  => ['Books', '2', ''], +                              GCfilms  => ['Videos', '3', '<field flags="2" title="Rating" category="Personal" allowed="5;4;3;2;1" format="4" type="3" name="rating" />'], +                              GCmusics => ['Music', '4', ''], +                              GCcoins  => ['Coin', '8', ''], +                              GCgames  => ['Games', '11', ''] +                          }; +         +        return $self; +    } + +    sub getName +    { +        my $self = shift; +         +        return "Tellico"; +    } +     +    sub getModels +    { +        my $self = shift; +         +        my @models = keys %{$self->{models}}; +        return \@models; +    } +     +    sub needsUTF8 +    { +        my $self = shift; +     +        return 1; +    } + +    sub getOptions +    { +        my $self = shift; +         +        return []; +    } +       +    sub wantsFieldsSelection +    { +        return 0; +    } +     +    sub preProcess +    { +        my $self =  shift; +         +        $self->{imagesInfos} = {}; +        return 1; +    } + +    sub getHeader +    { +        my ($self, $number) = @_; +        my $result; + +        my $model = $self->{model}; +        my $title = $model->getDescription; +        my $info = $self->{models}->{$model->getName}; + +        $result = '<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE tellico PUBLIC "-//Robby Stephenson/DTD Tellico V9.0//EN" "http://periapsis.org/tellico/dtd/v9/tellico.dtd"> +<tellico xmlns="http://periapsis.org/tellico/" syntaxVersion="7" > + <collection title="'.$title.'" entryTitle="'.$info->[0].'" type="'.$info->[1].'" > +  <fields> +   <field name="_default" /> +   '.$info->[2].' +  </fields> +'; + +        return $result; +    } +     +    sub transformData +    { +        my ($self, $data) = @_; +         +        $data =~ s/&/&/g; +         +        return $data; +    } +     +    sub transformList +    { +        my ($self, $list, $tag) = @_; + +        my $result = ''; +        if (ref($list) eq 'ARRAY') +        { +            foreach (@{$list}) +            { +                $result .= "    <$tag>".$self->transformData($_->[0]) +                        ."</$tag>\n"; +            } +        } +        else +        { +            foreach (split ',', $list) +            { +                s/;.*$//; +                $result .= "    <$tag>".$self->transformData($_)."</$tag>\n"; +            } +        } +        return $result; +    } +     +    sub encodeImage +    { +        my ($self, $file) = @_; +        my $image = GCUtils::getDisplayedImage($file, $self->{options}->{defaultImage}, $self->{original}); +        (my $suffix = $image) =~ s/.*?\.([^.]*)$/$1/; +        $suffix = 'jpeg' if $suffix eq 'jpg'; +        open PIC, "<$image" or return (undef,undef,undef); +        my $data = do {local $/; <PIC>}; +        close PIC; +        my $pictureId = Digest::MD5::md5_hex($data).'.'.$suffix; +        my %infos; +        $infos{id} = $pictureId; +        $infos{format} = uc $suffix; +        $infos{width} = 120; +        $infos{height} = 160; +        $infos{data} = MIME::Base64::encode_base64($data); +        return \%infos; +    } + +    sub getItem +    { +        my ($self, $item, $number) = @_; +         +        my $methodName = 'get'.$self->{model}->getName.'Item'; +         +        return $self->$methodName($item); +    } +     +    sub getGCfilmsItem +    { +        my ($self, $movie, $number) = @_; +        my $result; +         +       #(my $synopsis = $movie->{synopsis}) =~ s/<br>/\n/gm; +       #(my $comments = $movie->{comment}) =~ s/<br>/\n/gm; +   +        use integer; +        my $rating = $movie->{rating} / 2; +        no integer; +         +        my $age = $movie->{age}; +        my $certification; +         +        if ($age == 1) +        { +            $certification = 'U (USA)'; +        } +        elsif ($age == 2) +        { +            $certification = 'G (USA)'; +        } +        elsif ($age <= 5) +        { +             $certification = 'PG (USA)'; +        } +        elsif ($age <= 13) +        { +            $certification = 'PG-13 (USA)'; +        } +        elsif ($age <= 17) +        { +            $certification = 'R (USA)'; +        } + +        my $imageInfos = $self->encodeImage($movie->{image}); +        $self->{imagesInfos}->{$imageInfos->{id}} = $imageInfos; + +        my $year = GCPreProcess::extractYear($movie->{date}); + +        $result = '  <entry> +   <title>'.$self->transformData($movie->{title}).'</title> +   <medium>'.$self->transformData($movie->{format}).'</medium> +   <year>'.$year.'</year> +   <certification>'.$certification.'</certification> +   <genres> +'; +        $result .= $self->transformList($movie->{genre}, 'genre'); +        $result .= '   </genres> +   <nationalitys> +    <nationality>'.$self->transformData($movie->{country}).'</nationality> +   </nationalitys> +   <casts> +'; +        foreach (split ',', $movie->{actors}) +        { +            $result .= "    <cast><column>".$self->transformData($_)."</column></cast>\n"; +        } +        $result .= '   </casts> +   <directors> +    <director>'.$self->transformData($movie->{director}).'</director> +   </directors> +   <languages> +'; +        $result .= $self->transformList($movie->{audio}, 'language'); +        $result .= '   </languages> +   <running-time>'.$self->transformData($movie->{time}).'</running-time> +   <plot>'.$self->transformData($movie->{synopsis}).'</plot> +   <rating>'.$rating.'</rating> +   <comments>'.$self->transformData($movie->{comments}).'</comments> +'; +        if (($movie->{borrower}) && ($movie->{borrower} ne 'none')) +        { +            $result .= '   <loaned>true</loaned> +'; +        } +         +        $result .= '   <cover>'.$imageInfos->{id}.'</cover> +'; +         +        $result .= '  </entry> +'; + +        return $result; +    } +     +    sub getGCgamesItem +    { +        my ($self, $item, $number) = @_; +        my $result; +         +        use integer; +        my $rating = $item->{rating} / 2; +        no integer; + +        my $imageInfos = $self->encodeImage($item->{boxpic}); +        $self->{imagesInfos}->{$imageInfos->{id}} = $imageInfos; + +        my $year = GCPreProcess::extractYear($item->{released}); + +        $result = '  <entry> +   <title>'.$self->transformData($item->{name}).'</title> +   <platform>'.$self->transformData($item->{platform}).'</platform> +   <description>'.$self->transformData($item->{description}).'</description> +   <year>'.$year.'</year> +   <pur_date>'.$self->transformData($item->{added}).'</pur_date> +   <genres> +'; +        $result .= $self->transformList($item->{genre}, 'genre'); +        $result .= '   </genres> +   <publishers> +    <publisher>'.$self->transformData($item->{editor}).'</publisher> +   </publishers> +   <rating>'.$rating.'</rating> +'; +        if (($item->{borrower}) && ($item->{borrower} ne 'none')) +        { +            $result .= '   <loaned>true</loaned> +'; +        } +        if ($item->{completion} >= 100) +        { +            $result .= '   <completed>true</completed> +'; +        } +         +        $result .= '   <cover>'.$imageInfos->{id}.'</cover> +'; +         +        $result .= '  </entry> +'; + +        return $result; +    } + +    sub getGCbooksItem +    { +        my ($self, $item, $number) = @_; +        my $result; +         +        use integer; +        my $rating = $item->{rating} / 2; +        no integer; + +        my $imageInfos = $self->encodeImage($item->{cover}); +        $self->{imagesInfos}->{$imageInfos->{id}} = $imageInfos; + +        my $year = GCPreProcess::extractYear($item->{publication}); + +        $result = '  <entry> +   <title>'.$self->transformData($item->{title}).'</title> +   <isbn>'.$self->transformData($item->{isbn}).'</isbn> +   <series>'.$self->transformData($item->{serie}).'</series> +   <edition>'.$self->transformData($item->{edition}).'</edition> +   <binding>'.$self->transformData($item->{format}).'</binding> +   <comments>'.$self->transformData($item->{description}).'</comments> +   <pages>'.$self->transformData($item->{pages}).'</pages> +   <pur_date>'.$self->transformData($item->{acquisition}).'</pur_date> +   <pub_year>'.$year.'</pub_year> +   <publisher>'.$self->transformData($item->{publisher}).'</publisher> +   <authors> +'; +        $result .= $self->transformList($item->{authors}, 'author'); +        $result .= '   </authors> +   <languages> +'; +        $result .= $self->transformList($item->{language}, 'language'); +        $result .= '   </languages> +   <genres> +'; +        $result .= $self->transformList($item->{genre}, 'genre'); +        $result .= '   </genres> +   <rating>'.$rating.'</rating> +'; +        if (($item->{borrower}) && ($item->{borrower} ne 'none')) +        { +            $result .= '   <loaned>true</loaned> +'; +        } +        if ($item->{read}) +        { +            $result .= '   <read>true</read> +'; +        } +         +        $result .= '   <cover>'.$imageInfos->{id}.'</cover> +'; +         +        $result .= '  </entry> +'; + +        return $result; +    } + +    sub getGCmusicsItem +    { +        my ($self, $item, $number) = @_; +        my $result; +         +        use integer; +        my $rating = $item->{rating} / 2; +        no integer; + +        my $imageInfos = $self->encodeImage($item->{cover}); +        $self->{imagesInfos}->{$imageInfos->{id}} = $imageInfos; + +        my $year = GCPreProcess::extractYear($item->{release}); + +        $result = '  <entry> +   <title>'.$self->transformData($item->{title}).'</title> +   <medium>'.$self->transformData($item->{format}).'</medium> +   <year>'.$year.'</year> +   <label>'.$self->transformData($item->{label}).'</label> +   <comments>'.$self->transformData($item->{comment}).'</comments> +   <artists> +'; +        $result .= $self->transformList($item->{artist}, 'artist'); +        $result .= '   </artists> +   <genres> +'; +        $result .= $self->transformList($item->{genre}, 'genre'); +        $result .= '   </genres> +   <rating>'.$rating.'</rating> +   <tracks>'; +        foreach (@{$item->{tracks}}) +        { +            $result .= ' +      <track> +         <column>'.$self->transformData($_->[1]).'</column> +         <column>'.$self->transformData($item->{artist}).'</column> +         <column>'.$self->transformData($_->[2]).'</column> +      </track>' +        } +        $result .= ' +   </tracks> +'; + + +        if (($item->{borrower}) && ($item->{borrower} ne 'none')) +        { +            $result .= '   <loaned>true</loaned> +'; +        } +        $result .= '   <cover>'.$imageInfos->{id}.'</cover> +'; +       +        $result .= '  </entry> +'; + +        return $result; +    } + +    sub getGCcoinsItem +    { +        my ($self, $item, $number) = @_; +        my $result; +         +        my $frontInfos = $self->encodeImage($item->{front}); +        $self->{imagesInfos}->{$frontInfos->{id}} = $frontInfos; +        my $backInfos = $self->encodeImage($item->{back}); +        $self->{imagesInfos}->{$backInfos->{id}} = $backInfos; + +        $result = '  <entry> +   <title>'.$self->transformData($item->{name}).'</title> +   <type>'.$self->transformData($item->{currency}).'</type> +   <denomination>'.$self->transformData($item->{value}).'</denomination> +   <year>'.$self->transformData($item->{year}).'</year> +   <country>'.$self->transformData($item->{country}).'</country> +   <set>'.(($item->{type} eq 'coin') ? 'true' : 'false').'</set> +   <pur_date>'.$self->transformData($item->{added}).'</pur_date> +   <pur_price>'.$self->transformData($item->{estimate}).'</pur_price> +   <location>'.$self->transformData($item->{location}).'</location> +   <comments>'.$self->transformData($item->{comments}).'</comments> +   <obverse>'.$frontInfos->{id}.'</obverse> +   <reverse>'.$backInfos->{id}.'</reverse> +  </entry> +'; +        return $result; +    } + +    sub getFooter +    { +        my $self = shift; +        my $result; +         +        $result = '  <images> +'; +        foreach (values %{$self->{imagesInfos}}) +        { +            $result .= '   <image id="'.$_->{id}.'" format="'.$_->{format}. +                       '" width="'.$_->{width}.'" height="'.$_->{height}.'">'. +                       $_->{data}.'</image>'; +        } +        $result .='  </images> + </collection> +</tellico> +'; +         +        return $result; +    } + +    # postProcess +    # Called after all processing. Use it if you need to perform extra stuff on the header. +    # $header is a reference to the header string. +    sub postProcess +    { +        my ($self, $header, $body) = @_; + +        # Your code here +        # As header is a reference, it can be modified on place with $$header +    } + +    # getEndInfo +    # Used to display some information to user when export is ended. +    # To localize your message, use $self->{options}->{lang}. +    # Returns a string that will be displayed in a message box. +    sub getEndInfo +    { +        my $self = shift; +        my $message; +         +        # Your code here +        # Don't do put anything in message if you don't want information to be displayed. +         +        return $message; +    } +} + +1;  | 
