#!/usr/bin/perl -w
#
# MyRSSMerger - odczytuje wiele pakietw RSS, nowe wpisy wysya do Movable Type.
# http://disobey.com/d/code/ lub contact morbus@disobey.com.
#
# Kod ten jest darmowym oprogramowaniem; mona go rozpowszechnia i/lub
# modyfikowa na takich samych warunkach, jak samego Perla.
#

use strict; $|++;
my $VERSION = "1.0";
use Getopt::Long;
my %opts;

# upewnijmy si, e mamy potrzebne moduy; jeli nie, koczymy.
eval("use LWP::Simple;");  die "[err] Nie zainstalowano LWP::Simple.\n" if $@;
eval("use Net::Blogger;"); die "[err] Nie zainstalowano Net::Blogger.\n" if $@;
eval("use XML::RSS;");    die "[err] Nie zainstalowano XML::RSS.\n" if $@;

# definiujemy nasze flagi wiersza polece (wersje dugie i krtkie).
GetOptions(\%opts, 'server|s=s',      # uywany serwer POP3.
                   'username|u=s',    # konto na serwerze POP3.
                   'password|p=s',    # haso na serwerze POP3.
                   'blogid|b=i',      # identyfikator naszego bloga.
                   'catid|c=i',       # identyfikator kategorii wpisw.
                   'showcategories',  # pokazuje kategorie bloga.
                   'filter|f=s',      # filtr poszczeglnych wysyek?
);

# potrzebujemy co najmniej danych do zalogowania si.
die "[err] Brak URL XML-RPC, uyj --server lub -s.\n" unless $opts{server};
die "[err] Brak konta, uyj --username lub -u.\n"  
    unless $opts{username};
die "[err] Brak hasa, uyj --password lub -p.\n"  
    unless $opts{password};
die "[err] Brak BlogID, uyj --blogid lub -b.\n"      unless $opts{blogid};

# Kade danie za tym miejscem wymaga poczenia,
# wic musimy je przygotowa.
print "-" x 76, "\n"; # separator wizualny.
my $mt = Net::Blogger->new(engine=>"movabletype");
$mt->Proxy($opts{server});       # nazwa serwera.
$mt->Username($opts{username});  # nazwa uytkownika.
$mt->Password($opts{password});  # to jest... no, przecie
$mt->BlogId($opts{blogid});      # to nie wymaga wyjanie!

# poka istniejce kategorie.
if ($opts{showcategories}) {

    # pobierz z serwera list kategorii.
    my $cats = $mt->mt()->getCategoryList(  )
      or die "[err] ", $mt->LastError(  ), "\n";

    # i pokae je.
    if (scalar(@$cats) > 0) {
        print "Dostpne s nastpujce kategorie:\n\n";
        foreach (sort { $a->{categoryId} <=> $b->{categoryId} } @$cats) {
            print " $_->{categoryId}: $_->{categoryName}\n";
        }
    } else { print "Nie ma adnych kategorii do wyboru.\n"; }

    # to danie ju obsuylimy, wic koczymy.
    print "\nID kategorii moe by uyty w --catid lub -c.\n";
    print "-" x 76, "\n"; exit; # wywoaj mnie jeszcze raz!

}

# teraz sprawdzamy przekazane adresy URL.
die "[err] Nie przekazano adresw URL RSS do przetworzenia.\n" unless @ARGV;

# i zapisujemy na potrzeby porwna dzisiejsz dat.
# Kto tam by uywa moduw Date:: ?!
my ($day, $month, $year) = ((localtime)[3, 4, 5]);
$year+=1900; $month = sprintf("%02.0d", ++$month);
$day = sprintf("%02.0d", $day);  # wypenienie zerami.
my $today = "$year-$month-$day"; # ostateczna wersja.

# ptla po kolejnych URL RSS.
foreach my $rss_url (@ARGV) {

    # pobieramy to, co otrzymalimy.
    print "Pobieranie pakietu RSS z ", substr($rss_url, 0, 40), "...\n";
    my $data = get($rss_url) or print " [err] Nie pobrano danych!\n";
    next unless $data; # przechodzimy do nastpnego URL z listy.

    # analizujemy i zliczamy pozycje.
    # jeli niczego nie analizowano, idziemy dalej.
    my $rss = new XML::RSS; $rss->parse($data);
    my $item_count = scalar(@{$rss->{items}});
    unless ($item_count) { print " [err] Brak pozycji do analizy.\n"; next; }

    # wstawiamy nasz wpis midzy preface/anteface.
    my $clink = $rss->{channel}->{"link"}; # krtsza zmienna.
    my $ctitle = $rss->{channel}->{title}; # krtsza zmienna.
    my $preface = "From <a href=\"$clink\">$ctitle</a>:\n\n<blockquote>";
    my $anteface = "</blockquote>\n\n"; # nowe pozycje jako bloki.

    # i szukamy nowych pozycji z dzisiejsz dat.
    foreach my $item (@{$rss->{items}}) {

        # w danej pozycji brak opisu lub daty? idziemy dalej.
        unless ($item->{description} or $item->{dc}->{date}) {
          print " Pomijam (brak opisu/daty): '$item->{title}'.\n";
          next;
        }

        # jeli jest data, to czy dzisiejsza?
        if ($item->{dc}->{date} =~ /^$today/) {

            # krtsza zmienna; jestemy tacy leniwi...
            my $creator = $item->{dc}->{creator};

            # jeli jest filtr, skorzystajmy z niego.
            if ($opts{filter} && $item->{description} !~ /$opts{filter}/i) {
                print " Pomijam (nie zadziaaa filtr): '$item->{title}'.\n"; 
                next;
            }

            # mamy co do wysania, wic z rnych czci przygotowujemy
            # ostateczny opis.
            my $description = "$preface$item->{description} ";
            $description   .= "($creator) " if $creator;
            $description   .= "<a href=\"$item->{link}\">Wicej " .
                              "o tej przesyce.</a>$anteface";

            # teraz przesyamy przekazane dane blogu.
            print " Publikacja wpisu: '$item->{title}'.\n";
            my $id = $mt->metaWeblog(  )->newPost(
                              title       => $item->{title},
                              description => $description,
                              publish     => 1)
                     or die "[err] ", $mt->LastError(  ), "\n";

            # ustawiamy kategori?
            if ($opts{catid}) {
                $mt->mt(  )->setPostCategories(
                              postid     => $id,
                              categories => [ {categoryId => $opts{catid}}])
                or die " [err] ", $mt->LastError(  ), "\n";

                # "edycja" artykuu bez zmian, aby tylko uaktywni 
                # zmian kategorii.
                $mt->metaWeblog(  )->editPost(
                              title       => $item->{title},
                              description => $description,
                              postid      => $id,
                              publish     => 1)
                     or die " [err] ", $mt->LastError(  ), "\n";
            }
        } else { 
           print " Pomijam (z uwagi na dat): '$item->{title}'.\n"; 
        }
    }
    print "-" x 76, "\n"; # separator wizualny.
}

exit;

