Revision 296 (by ahitrov, 2013/03/26 17:59:01) Promosite (anthill) project source
#!/usr/bin/perl

use FindBin;
BEGIN {
        require "$FindBin::RealBin/../../../lib/Modules.pm";
	use lib "$FindBin::RealBin/../lib";
}

use Contenido::Globals;
use Contenido::Init;
use ErrorTee;
use PidFile;

use Convert::UU qw(uudecode);
use POSIX qw(strftime);
use IIR_Parser;
use Data::Dumper;
use Image::Size;

use vars qw($DEBUG);
$DEBUG = 0;

# begin
Contenido::Init->init();

my $news_section = $project->s_alias()->{news};
my $sources_section = $project->s_alias()->{sources};

my $discovery_section = 260004783; 
my $temp_images_directory = "~/Contenido/var/projects/promosuite/loader/images";

my %inter = (
);

my %SPECATTRS = (
	Image => [],
	SECT_ID => [],
	IMG_COMMENT => [],
	ShortAbstr => [],
	LongAbstr => [],
	Command => [],
	itype_id => [],
);

$SPECATTRS{LentaImage} = $SPECATTRS{Image};

my %STATUSMAP = (
	0 => 0, #default
);


my %fields_map = (
	'Title'		=> 'name',
	'Body'		=> 'body',
	'Body_Preview'	=> 'abstr',
	'Date'		=> 'dtime',
#	'SECT_ID'	=> 'sections'
);


my $err = ErrorLog->new();

# Инициализация парсера IIR
my $parser = IIR_Parser->new(err => $err, debug=>$DEBUG);

# Читаем IIR в хэш {поле}=>{значение}
my %obj;
while (! $parser->eof ) {
	my $fn = $parser -> GetFieldName;
	my $fv = $parser -> GetFieldValue(mode => 'return');
	$fv=[uudecode($fv)] if ($fv=~/^begin/);
        if (exists($SPECATTRS{$fn})){
		push (@{$SPECATTRS{$fn}},$fv)
	}else{
		$obj{$fn}=$fv if ($fn && defined($fv));
	}
}

if (my ($cmd) = grep { /change_author/ } @{$SPECATTRS{Command}}) {
	($obj{AUTH_ID}) = ($cmd =~ /change_author\s+(\d+)/);
}
#print Dumper(\%obj);
#print Dumper(\%SPECATTRS);
##### warn Dumper \%SPECATTRS;
##### warn Dumper \%obj;

## Если новость не в теме "Олимпиада", то, если у нее есть картинки, отложим их в сторонку
## А вдруг пригодятся
## Потом выйдем, потому как соленые бананы мы не едим

if ($obj{MTYPE_ID} != -4 ) {
	if (@{$SPECATTRS{Image}}) {
		my $i = 0;
		foreach my $image (@{$SPECATTRS{Image}}) {
			$i++;
			my ($img, $file) = @$image;
			my ($ext) = ($file =~ /\.(\w+)$/);
			my $real_msg_id = $obj{Real_Msg_Id};
			$real_msg_id =~ s/^0+//;
			my $dir = "$temp_images_directory/$real_msg_id";
			system("mkdir -p $dir");
			if (my $fh = new IO::File ">$dir/image$i.$ext") {
				$fh->autoflush(1);
				$fh->print($img);
				$fh->close();
			} else {
				warn "Can\'t open $dir/image$i.$ext: $!";
				return undef;
			}		
		}
	}
#####	exit();
##### } elsif (!(grep { $_ == $discovery_section } @{$SPECATTRS{SECT_ID}})) {
#####	exit();
}

my %src_map = map { $_->auth_id() => $_->name } $keeper->get_documents(
			s	=> $sources_section,
			class	=> 'promosuite::Source',
			status	=> 1,
		);

my $news = new promosuite::Article $keeper;

foreach my $key (keys %obj) {
	next unless exists $fields_map{$key};
	$news->{$fields_map{$key}} = $obj{$key};
}

#warn Dumper(\%obj);
#warn Dumper($news);

my $body = $news->body();

$body =~ s/\n{2,}/<p>/gi;
$body =~ s/\n/\ /gi;
$body =~ s/<p>/\n\n/gi;

$news->body($body);

## Аннотация, если надо
if ( !$news->{abstr} || $news->{abstr} !~ /\S/) {
	my $text = substr($news->body(), 0, 300);
	$text =~ s/\s\S+$//;
	$news->{abstr} = $text;
}

my $images = {};
if (@{$SPECATTRS{Image}}) {
	my $i = 0;
	foreach my $image (@{$SPECATTRS{Image}}) {
		$i++;
		my $ind = $i - 1;
		my $key = "pictures_$i";

		my ($img, $file);
		if (ref $image eq 'ARRAY') {
			($img, $file) = @$image;
		} elsif ($obj{MTYPE_ID} == -4) {
			my $old_msg_id = $obj{Msg_Id};
			my $dir = "$temp_images_directory/$old_msg_id";
			opendir(D, $dir);
			($file) = grep { /^image$i/ } readdir D;
			closedir D;

			if ($file) {
				if (my $fh = new IO::File "$dir/$file") {
					local $/ = undef;
					$img = <$fh>;
				} else {
					warn "Can\'t open $dir/$file: $!";
					next;
				}
			} else {
					next;
			}
		}

		my ($ext) = ($file =~ /\.(\w+)$/);
		$ext = 'gif' unless $ext;
		my $ii = post_image($keeper->images_directory(), $ext, $img);
		next unless defined $ii;

		$ii->{alt}=$SPECATTRS{IMG_COMMENT}[$ind] if (exists($SPECATTRS{IMG_COMMENT}) && $SPECATTRS{IMG_COMMENT}[$ind]);
		$ii->{number} = $i;

		$images->{$key} = $ii;
	}

	$images->{maxnumber} = $i;

	local $Data::Dumper::Indent = 0;
	$news->images(Dumper($images));
}

if (my ($cmd) = grep { /(?:ex_)?photobanner/ }  @{$SPECATTRS{itype_id}}) {
	exit;
}

if (my ($cmd) = grep { /interface_lifetime/ }  @{$SPECATTRS{Command}}) {
	my ($interface, $time) = ($cmd =~ /interface_lifetime\s+(.[^\s]+)\s+(.[^\s]+)$/);
	$news->{status} = 0;
} else {
	$news->{status} = 0; ##### было 2
}

##### $news->{body} =~ tr/\202\204\213\221\222\223\224\225\226\227\233\246\253\271\273/\,\"\<\'\'\"\"\-\-\-\>\|\"\N\"/;
##### $news->{abstr} =~ tr/\202\204\213\221\222\223\224\225\226\227\233\246\253\271\273/\,\"\<\'\'\"\"\-\-\-\>\|\"\N\"/;
#if (scalar @{$SPECATTRS{SECT_ID}}) {
#	$news->sections(@{ $SPECATTRS{SECT_ID} });
#}else{
	$news->sections($news_section);
#}

if (exists $src_map{$obj{AUTH_ID}}) {
	$news->source($src_map{$obj{AUTH_ID}});
} else {
	$news->source("Источник медии # ".$obj{AUTH_ID});
}

$news->store();

exit;

sub post_image
{
	my ($dest_dir, $ext, $img) = @_;

	my $uniq = time().'_'.int(rand(10**5));
	my $fname="$uniq.$ext";
	my $imgfile="$dest_dir/$fname";

	if (my $fh = new IO::File ">$imgfile"){
		$fh->autoflush(1);
		$fh->print($img);
		$fh->close();
	}else{
		warn "Can\'t open $imgfile: $!";
		return undef;
	}

	my ($width, $height) = imgsize($imgfile);

	my $ii = {
		filename => $fname,
		width => $width,
		height => $height,
	};

	$keeper->minimize_image($ii, '100x100');

	return $ii;
}

1;

package ErrorLog;

sub new {
        my ($class, %opts) = @_;
        $opts{_FH}=*STDERR unless ($opts{_FH});
        my $self = \%opts;
        bless ($self,$class);
        return $self;
}

sub handle{
        my ($self,$level,$msg)=@_;
        my $fh=$$self{'_FH'};
        print $fh time()."\t$$\t$level\t$msg\n";
	exit(1) if ($level eq 'fatal');
        return 1;
}

1;