Few fixes to some importers
[nonametv.git] / lib / NonameTV / Importer / Hallmark.pm
blobb2ea194b7362e2a73cbcee29bf94d113ab70cde6
1 package NonameTV::Importer::Hallmark;
3 use strict;
4 use warnings;
6 =pod
8 Import data from Excel files delivered via e-mail.
10 Features:
12 =cut
14 use utf8;
16 use DateTime;
17 use Spreadsheet::ParseExcel;
18 use File::Temp qw/tempfile/;
20 use NonameTV qw/norm AddCategory MonthNumber/;
21 use NonameTV::Log qw/progress error/;
23 use NonameTV::Importer::BaseFile;
25 use base 'NonameTV::Importer::BaseFile';
27 sub new {
28 my $proto = shift;
29 my $class = ref($proto) || $proto;
30 my $self = $class->SUPER::new( @_ );
31 bless ($self, $class);
33 $self->{grabber_name} = "Hallmark";
35 return $self;
38 sub ImportContentFile {
39 my $self = shift;
40 my( $file, $chd ) = @_;
42 $self->{fileerror} = 0;
44 my $xmltvid = $chd->{xmltvid};
45 my $channel_id = $chd->{id};
46 my $ds = $self->{datastore};
48 # Only process .xls files.
49 return if( $file !~ /\.xls$/i );
50 progress( "Hallmark: $xmltvid: Processing $file" );
52 my %columns = ();
53 my $date;
54 my $currdate = "x";
57 my $batch_id = $xmltvid . "_" . $file;
58 $ds->StartBatch( $batch_id , $channel_id );
60 my $oBook = Spreadsheet::ParseExcel::Workbook->Parse( $file );
62 # main loop
63 for(my $iSheet=0; $iSheet < $oBook->{SheetCount} ; $iSheet++) {
65 my $oWkS = $oBook->{Worksheet}[$iSheet];
66 progress( "Hallmark: $chd->{xmltvid}: Processing worksheet: $oWkS->{Name}" );
68 # browse through rows
69 for(my $iR = $oWkS->{MinRow} ; defined $oWkS->{MaxRow} && $iR <= $oWkS->{MaxRow} ; $iR++) {
71 # get the names of the columns from the 1st row
72 if( not %columns ){
73 for(my $iC = $oWkS->{MinCol} ; defined $oWkS->{MaxCol} && $iC <= $oWkS->{MaxCol} ; $iC++) {
74 $columns{norm($oWkS->{Cells}[$iR][$iC]->Value)} = $iC;
76 next;
78 #foreach my $col (%columns) {
79 #print "$col\n";
82 # date - column 0 ('Date')
83 my $oWkC = $oWkS->{Cells}[$iR][$columns{'Date'}];
84 next if( ! $oWkC );
86 $date = ParseDate( $oWkC->Value );
87 next if( ! $date );
89 # starttime - column ('Start')
90 $oWkC = $oWkS->{Cells}[$iR][$columns{'Start'}];
91 next if( ! $oWkC );
92 my $starttime = create_dt( $date , $oWkC->Value ) if( $oWkC->Value );
94 # endtime - column ('End')
95 $oWkC = $oWkS->{Cells}[$iR][$columns{'End'}];
96 next if( ! $oWkC );
97 my $endtime = create_dt( $date , $oWkC->Value ) if( $oWkC->Value );
99 # title - column ('Title')
100 $oWkC = $oWkS->{Cells}[$iR][$columns{'Title'}];
101 next if( ! $oWkC );
102 my $title = $oWkC->Value if( $oWkC->Value );
104 my $type = $oWkS->{Cells}[$iR][$columns{'Type'}]->Value if $oWkS->{Cells}[$iR][$columns{'Type'}];
105 my $prodno = $oWkS->{Cells}[$iR][$columns{'Prod No.'}]->Value if $oWkS->{Cells}[$iR][$columns{'Prod No.'}];
106 my $episodetitle = $oWkS->{Cells}[$iR][$columns{'Episode Title'}]->Value if $oWkS->{Cells}[$iR][$columns{'Episode Title'}];
107 my $slotlen = $oWkS->{Cells}[$iR][$columns{'Slot Len'}]->Value if $oWkS->{Cells}[$iR][$columns{'Slot Len'}];
108 my $epino = $oWkS->{Cells}[$iR][$columns{'Epi No.'}]->Value if $oWkS->{Cells}[$iR][$columns{'Epi No.'}];
109 my $cert = $oWkS->{Cells}[$iR][$columns{'Cert'}]->Value if $oWkS->{Cells}[$iR][$columns{'Cert'}];
110 my $genre = $oWkS->{Cells}[$iR][$columns{'Genre'}]->Value if $oWkS->{Cells}[$iR][$columns{'Genre'}];
111 my $year = $oWkS->{Cells}[$iR][$columns{'Year'}]->Value if $oWkS->{Cells}[$iR][$columns{'Year'}];
112 my $director = $oWkS->{Cells}[$iR][$columns{'Director'}]->Value if $oWkS->{Cells}[$iR][$columns{'Director'}];
113 my $actor = $oWkS->{Cells}[$iR][$columns{'Actor'}]->Value if $oWkS->{Cells}[$iR][$columns{'Actor'}];
114 my $episodesynopsis = $oWkS->{Cells}[$iR][$columns{'Episode Synopsis'}]->Value if $oWkS->{Cells}[$iR][$columns{'Episode Synopsis'}];
115 my $minisynopsis = $oWkS->{Cells}[$iR][$columns{'Mini Synopsis'}]->Value if $oWkS->{Cells}[$iR][$columns{'Mini Synopsis'}];
116 my $synopsis = $oWkS->{Cells}[$iR][$columns{'Synopsis'}]->Value if $oWkS->{Cells}[$iR][$columns{'Synopsis'}];
118 progress("Hallmark: $xmltvid: $starttime - $title");
120 my $ce = {
121 channel_id => $channel_id,
122 start_time => $starttime->ymd("-") . " " . $starttime->hms(":"),
123 end_time => $endtime->ymd("-") . " " . $endtime->hms(":"),
124 title => $title,
127 # subtitle
128 if( $episodetitle ){
129 $ce->{subtitle} = $episodetitle;
132 # description
133 if( $synopsis ){
134 $ce->{description} = $synopsis;
137 # episode
138 if( $epino ){
139 $ce->{episode} = sprintf( ". %d .", $epino-1 );
140 $ce->{program_type} = 'series';
143 # type
144 if( $type ){
145 $ce->{program_type} = $type;
148 # genre
149 if( $genre ){
150 my($program_type, $category ) = $ds->LookupCat( "Hallmark_genre", $genre );
151 AddCategory( $ce, $program_type, $category );
154 # production year
155 if( $year ){
156 $ce->{production_date} = "$year-01-01";
159 # directors
160 if( $director ){
161 $ce->{directors} = $director;
164 # actors
165 if( $actor ){
166 $ce->{actors} = $actor;
169 $ds->AddProgramme( $ce );
172 %columns = ();
176 $ds->EndBatch( 1 );
178 return;
181 sub ParseDate
183 my ( $dinfo ) = @_;
185 my( $day, $monthname, $year );
187 # format '033 03 Jul 2008'
188 if( $dinfo =~ /^\d+\s+\d+\s+\S+\s+\d+$/ ){
189 ( $day, $monthname, $year ) = ( $dinfo =~ /^\d+\s+(\d+)\s+(\S+)\s+(\d+)$/ );
191 # format '05-sep-08'
192 } elsif( $dinfo =~ /^\d+-(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)-\d+$/i ){
193 ( $day, $monthname, $year ) = ( $dinfo =~ /^(\d+)-(\S+)-(\d+)$/ );
196 else {
197 return undef;
200 return undef if( ! $year);
202 $year+= 2000 if $year< 100;
204 my $mon = MonthNumber( $monthname, "en" );
206 #print "DAY: $day\n";
207 #print "MON: $mon\n";
208 #print "YEA: $year\n";
210 my $dt = DateTime->new( year => $year,
211 month => $mon,
212 day => $day,
213 hour => 0,
214 minute => 0,
215 second => 0,
216 time_zone => 'Europe/Zagreb',
219 $dt->set_time_zone( "UTC" );
221 return $dt;
224 sub create_dt
226 my( $date, $time ) = @_;
228 my( $hour, $min, $sec ) = ( $time =~ /(\d{2}):(\d{2}):(\d{2})/ );
230 my $dt = $date->clone()->add( hours => $hour , minutes => $min , seconds => $sec );
232 return $dt;
237 ### Setup coding system
238 ## Local Variables:
239 ## coding: utf-8
240 ## End: