#!/usr/bin/perl

#
# post2blog - a tool to post a new entry to Movable Type with pictures and locations
#
# Copyright (C) 2003 - 2004 Jiro Motonaga
# All rights reserved.
# This is free software with NO WARRANTY.
#
# You can redistribute it and/or modify it under the terms of 
# the GNU General Public License version 2.
#

use strict;

my $url = 'http://uls.fam.cx/mt/mt-xmlrpc.cgi'; # CGIPath + 'mt-xmlrpc.cgi'

my $blog_id = 1;
my $username = 'aaaaaaa';
my $password = 'xxxxxxx';
my $MT_DIR = '/usr/local/www/data/mt/';
my $parse_path = '/tmp/post2blog';
my @authadrs = ('abcd@uls.fam.cx','xyz@uls.fam.cx');
my $auth;

my $auth;
my $category_id = 0;
#my @categories = (2, 3, 4);

my ($maxx, $maxy) = (320, 320);
my $returl = "";
my $orgfilename = "";
my $mkthumb = 0;
my $thumbfile;
my $thumbfilename;
my $tnreturl;
my ($iwidth,$file,$filename,$filepath,$suffix);

unshift @INC, $MT_DIR . 'extlib';

use MIME::Parser;
#use Data::Dumper;
use File::Basename;
use Jcode;
use XMLRPC::Lite;
use Image::Info qw(image_info dim);

my $j = new Jcode;
my $approve = 1;

my $str='';
while(<STDIN>) {
$str = $str.$_;
}

my $parser = new MIME::Parser;
$parser->output_under($parse_path);
my $entity = $parser->parse_data($str);
my $head = $entity->head;
my $sub = $head->get('Subject');
my $from = $head->get('From');
my $message_id = $head->get('Message-ID');
my $cnttype = $entity->mime_type;
$sub = $j->set($sub)->mime_decode->utf8;
$sub =~ s/[\r\n]//g;
$sub =~ s/ +$//g;
$message_id =~ s/[<>]//g;
$message_id =~ s/\@.*//g;
$message_id =~ s/[\r\n]//g;

if($from =~ /([-,0-9,a-z,A-Z,-,_,\.]+@[-,0-9,a-z,A-Z,-,\.]+)/){
   foreach (@authadrs){
           if($_ eq $1){$auth = 1;}
           }
  }

     if($auth != 1){print "Not authorized mail address : $from\n";exit;}

my $partnum = $entity->parts;
my (@texts, @attachs, $cnttype, $cntpath, $cntname);
if ($entity->is_multipart) {
	# multi parts
	for (my $pn = 0; $pn < $partnum; $pn++) {
		$cnttype = $entity->parts($pn)->mime_type;
		$cntpath = $entity->parts($pn)->bodyhandle->path;
		$cntname = $entity->parts($pn)->head->mime_attr('content-type.name') || $entity->parts($pn)->head->mime_attr('content-disposition.filename');
		$cntname = $j->set($cntname)->mime_decode->utf8;
		arrange_parts($pn, $cnttype, $cntpath, $cntname);
	}
} else {
	# single part
	$cnttype = $entity->mime_type;
	$cntpath = $entity->bodyhandle->path;
	$cntname = $entity->head->mime_attr('content-type.name') || $entity->head->mime_attr('content-disposition.filename');
	$cntname = $j->set($cntname)->mime_decode->utf8;
	arrange_parts(1, $cnttype, $cntpath, $cntname);
}

my $cont;
my $dummy;
my $setName;
foreach (@texts) {
	open(CONT, $_);
	while (<CONT>) {
		s/\r\n/\n/g;
		s/\r/\n/g;

               if(/^Cat=/){
                   ($dummy,$setName) = split(/=/);
                   $setName =~ s/\n//g;
                   $setName = $j->set($setName)->utf8;
               }else{$cont = $cont.$_;}

	}
	close(CONT);
}
$cont = $j->set($cont)->utf8;

my @conts = split(/<<more>>/, $cont);
my $description = shift(@conts);
my $text_more = join("\n\n\n", @conts);
my $title = $sub;

my $rpc = XMLRPC::Lite->new;
$rpc->proxy($url);

use Image::Size;
use Image::Magick;

foreach my $fileref (@attachs) {
	my ($file, $orgfilename) = @$fileref;
	my ($filename, $filepath, $suffix) = fileparse($file, '\.(jpe?g|gif|png)');

###################################################################
       $mkthumb = 1;
       my ($imgx, $imgy) = imgsize($file);
       if($imgx > 330){$iwidth = 330;}else{$iwidth = $imgx;}
       $thumbfile = $filepath . 'tn_' . $filename . $suffix;
    my $i =  Image::Magick->new;
       $i->Read("$file");
       $i = $i->Transform(geometry=>$iwidth);
       $i->Write("$thumbfile");
       undef $i;

       my ($imgx, $imgy) = imgsize($file);
       if($imgx > 800){
       $i =  Image::Magick->new;
       $i->Read("$file");
       $i = $i->Transform(geometry=>800);
       $i->Write("$file");
       undef $i;
           }
###################################################################

	open(BIN, $file);
	my $bindata;
	while (<BIN>) {
		$bindata = $bindata.$_;
	}
	close(BIN);
	my $ret = $rpc->call('metaWeblog.newMediaObject',
		$blog_id,
		$username,
		$password,
		{
			'bits' => $bindata,
			'name' => $filename.$suffix
		},
		1
	);

   if($mkthumb == 1){

   ($thumbfilename, $filepath, $suffix) = fileparse($thumbfile, '\.(jpe?g|gif|png)');

        open(BIN, $thumbfile);
        $bindata ="";
        while (<BIN>) {
                $bindata = $bindata.$_;
        }
    }

        $returl = $ret->result->{url};

        close(BIN);
        $ret = $rpc->call('metaWeblog.newMediaObject',
                $blog_id,
                $username,
                $password,
                {
                        'bits' => $bindata,
                        'name' => $thumbfilename.$suffix
                },
                1
        );

	#print Dumper $ret->result;
	#print Dumper $ret->fault;

        $tnreturl = $ret->result->{url};

        if ($returl =~ /\.(jpe?g|gif|png)$/i) {
           if($mkthumb != 1){$tnreturl = $returl;}
           $description = "<a href=\"$returl\"><img src=\"$tnreturl\" alt=\"$orgfilename\" border=\"0\"></a><br/>$description";
        } else {
                $description = "<a href=\"$returl\">$orgfilename</a><br />$description";
        }
}

my $ret = $rpc->call('metaWeblog.newPost',
	$blog_id,
	$username,
	$password,
	{  
		'title' => $title,
		'description' => $description,
		'mt_text_more' => $text_more
	},
        0,	
);

my $post_id = $ret->result();



my $ret = $rpc->call('mt.getCategoryList',
        $blog_id,
        $username,
        $password,
);


my $ref =$ret->result();

my $catID;
my $catName;
my %tmp;

foreach(@$ref){
   %tmp = %$_;
   $catID = $tmp{"categoryId"};
   $catName = $tmp{"categoryName"};
   $catName = $j->set($catName)->utf8;

   if($catName eq $setName){$category_id = 1;last;}

}

if ($category_id) {
	my $cats;
	$cats = [{ 'categoryId' => $catID, 'isPrimary' => 1, }];

	$ret = $rpc->call('mt.setPostCategories',
		$post_id,
		$username,
		$password,
		$cats,
	);
}

$ret = $rpc->call('metaWeblog.editPost',
	$post_id,
	$username,
	$password,
	{
		'title' => $title,
		'description' => $description,
		'mt_text_more' => $text_more
	},
	1
);


system("/bin/rm -fr /tmp/post2blog/*");

#print Dumper $ret->result;
#print Dumper $ret->fault;

sub arrange_parts {
	my ($pn, $cnttype, $cntpath, $cntname) = @_;
	if ($cnttype =~ /^text\/plain$/i) {
		# plain text
		push(@texts, $cntpath);
	} else {
		# attachment
		my ($filename, $filepath, $suffix) = fileparse($cntpath, '\..+');
		my $orgsuffix;
		$orgsuffix = $1 if ($cntname =~ /.+(\..+)/);
		if ("$filename$suffix" ne $cntname) {
			rename($cntpath, "$filepath${message_id}_$pn$orgsuffix");
			$cntpath = "$filepath${message_id}_$pn$orgsuffix";
		}
		unshift(@attachs, [ $cntpath, $cntname ]);
		if ($orgsuffix eq '.amc') {
			amc2thumb($cntpath);
		}
	}
	
}

sub amc2thumb {
	my $amc = shift;
	my ($filename, $filepath, $suffix) = fileparse($amc, '\.amc');
	my $mpg = "$filepath$filename.mpg";
	my $jpg = "$filepath${filename}_mpg\%d.jpg";
	my $jpg1 = "$filepath${filename}_mpg1.jpg";
	system("/usr/local/bin/ffmpeg -f m4v -i $amc -f jpeg -t 0.01 $jpg");
	unshift(@attachs, [ $jpg1, "$filename" ]);
	1;
}

sub deg2dms {
  my($d) = @_;
  my($m, $s, $sf);
  $sf = int($d*360000 + 0.5);
  $s = sprintf("%02d", $sf / 100 % 60);
  $m = sprintf("%02d", $sf / 6000 % 60);
  $d = int($sf/360000);
  $sf %= 100;
	return ($d, $m, "$s.$sf");
}
