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; |