#!/usr/bin/perl -w 
#
# LeechGrounds - zapisuje pliki Flash z Newgrounds.com.
# Cz pakietu Leecharoo - przeznaczonego do obsugi wszystkich trudnych
# do automatycznego pobierania miejsc.
# http://disobey.com/d/code/ lub kontaktuj si z 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 File::Spec::Functions;

# Upewniamy si, czy mamy wszystkie potrzebne moduy; jeli nie, koczymy.
eval("use LWP 5.6.9;"); die "[err] Wymagane LWP w wersji 5.6.9 lub wyszej.\n" if $@;

# nasze adresy URL do pobierania danych s pod podanym URL
# (bdziemy czy je z dat i identyfikatorem).
my $base_url = "http://newgrounds.com/portal/content.php";
my $dir = "newgrounds";  # zapisuj pobrane pliki do...?
mkdir $dir;              # upewnij si, e katalog bdzie istnia.
my $date;                # data z serwera newgrounds.

# tworzenie ostatecznej tablicy ze wszystkimi identyfikatorami,
# ktre bdziemy pobiera.
my %ids; foreach (@ARGV) {
    next unless /\d/; # tylko liczby.

    # jeli to zakres, analizujemy go.
    if (/(\d+)-(\d+)/) {
        my $start = $1; my $end = $2;
        for (my $i = $start; $i <= $end; $i++) {
            $ids{$i} = undef; # alive, alive!
        }
    } else { $ids{$_} = undef; } # zwyka liczba.
}

# tworzenie obiektu pobierajcego, oszukane User-Agent, aby przej przez filtry
my $ua = LWP::UserAgent->new(agent => 'Mozilla/4.76 [en] (Win98; U)');

# teraz mamy list identyfikatorw, ktre chcemy pobiera; z pierwszej
# strony pobierzemy dat, ktrej uyjemy do ostatecznego pobrania URL.
print "-" x 76, "\n"; # adny separator wizualny.
foreach my $id (sort {$a <=> $b} keys %ids) {

    # pobierz za pierwszym razem dat.
    unless ($date) {
       print "Prba wydzielenia daty z $id... ";
       my $response = 
           $ua->get("http://newgrounds.com/portal/view.php?id=$id");
       my $data = $response->content; $data =~ /&date=(\d+)&quality=b/;
       unless ($1) { print "ba!\n"; next; } print "tak!\n";
       $date = $1; # zapisanie daty na pniej.
    }

    # teraz moemy pobiera adresy URL do naszych plikw Flash.
    # zauwamy, e pobieramy WSZYSTKIE adresy URL przed faktycznym
    # pobieraniem plikw. Dziki temu nie musimy sprawdza bdw,
    # wskutek dugiego pobierania plikw koczy nam si czas.
    print "Okrelanie URL do pobierania $id... ";
    my $response = $ua->get("$base_url?id=$id&date=$date");
    my $data = $response->content; # our content.
    $data =~ /uploads.newgrounds.com\/(.*swf)/;
    $ids{$id} = "http://uploads.newgrounds.com/$1";
    print "gotowe!\n";

} print "-" x 76, "\n"; # adnie!

# jeli doszlimy tutaj, mamy w tablicy potrzebne adresy URL
# i wystarczy je wykorzysta.
foreach my $id (sort {$a <=> $b} keys %ids) {

   # korzystanie jedynie z identyfikatorw z adresami URL.
   next unless defined ($ids{$id});

   # pobranie URL/nazwy pliku.
   my $url = $ids{$id}; $url =~ /([^\/]*.swf)/;
   my $filename = $1; print "Pobieranie $filename... ";

   # i uywamy:content_file do autozapisu w naszym katalogu.
   $ua->get($url, ':content_file' => "$dir/$filename");
   print "gotowe!\n"; # atwiej powiedzie ni zrobi... no, niewane.

}

