#!/usr/bin/perl -w
use strict;
use LWP::Simple;
use URI::Escape;
use Win32::Sound;
use SOAP::Lite;

# tutaj naley poda swj klucz API Google!
my $google_key  = "tutaj Twj klucz Google";
my $google_wdsl = "GoogleSearch.wsdl";

# zaadowanie wybranej frazy z wiersza polece.
my $lyrics_phrase = shift or die "Uycie: robotkaraoke.pl <fraza>\n";

# i szukamy w Google.
my $google_search_term = "intitle:\"$lyrics_phrase\" site:lyricsfreak.com";
my $googleSearch = SOAP::Lite->service("file:$google_wdsl");
my $result = $googleSearch->doGoogleSearch(
                      $google_key, $google_search_term,
                      0, 10, "false", "", "false",
                      "", "", "");

# jeli nic nie znaleziono, informujemy o tym i koczymy dziaanie.
die "Nie znaleziono LyricsFreak pasujcych do '$lyrics_phrase'.\n"
          if $result->{estimatedTotalResultsCount} == 0;
  
# i pobieramy pierwszy wynik z Google jako najbardziej
# prawdopodobn lokalizacj LyricsFreak.com.
my @results         = @{$result->{'resultElements'}};
my $first_result    = $results[0];
my $lyricsfreak_url = $first_result->{'URL'};
print "Pobieranie wierszy z:\n $lyricsfreak_url\n";

# i obieramy dane z LyricsFreak.com.
my $content = get($lyricsfreak_url) or die $!;
print "Poczenie z LyricsFreak powiodo si.\n";

# Jeli mamy dane, przeanalizujmy je.
# wszystkie wiersze s zapisywane w znaczniku pre,
# wic usuwamy wszystko sprzed i zza.
$content =~ s/.*<pre><b>.*<\/b><br>//mgis;
$content =~ s/<\/pre>.*//mgis;
my @lyrics_lines = split("\x0d", $content);

# Demonstracyjna usuga TTS w AT&T pobiera maksymalnie 30 sw,
# wic stworzymy mini-paczk poezji do wysania.
# kada taka paczka bdzie wysyana do serwera TTS i zapisywana
# w osobnym pliku; bdzie zatem wiele mini-plikw wav.
my (@lyrics_chunks, $current_lyrics_chunk); my $line_counter = 0;
for (my $i = 0; $i <= scalar(@lyrics_lines) - 1; ++$i) {
    next if $lyrics_lines[$i] =~ /^\s*$/;
    $current_lyrics_chunk .= $lyrics_lines[$i] . "\n";

    if (($line_counter == 5) || ($i == scalar(@lyrics_lines) - 1) ) {
        push(@lyrics_chunks, $current_lyrics_chunk);
        $current_lyrics_chunk = ''; $line_counter = 0;
    } $line_counter++;
}

# dobrze, teraz przechodzimy po kolejnych paczkach i przesyamy je
# do serwera TTS.
my @temporary_wav_files;
foreach my $lyrics_chunk (@lyrics_chunks) {

    # i pobieramy dane.
    my $url = 'http://morrissey.naturalvoices.com/tts/cgi-bin/nph-talk';
    my $req = HTTP::Request->new('POST', $url); # prawie!
    $req->content('txt=' . uri_escape($lyrics_chunk) .
                  '&voice=crystal&speakButton=SPEAK');
    $req->content_type('application/x-www-form-urlencoded');
    my $res = LWP::UserAgent->new->simple_request($req);

    # nieprawidowa odpowied serwera? zatem koczymy.
    unless ($res->is_success || $res->code == 301) {
       die "Bd czenia si z serwerem TTS: " . $res->status_line . ".\n"; }

    # nie otrzymalimy oczekiwanej odpowiedzi? koczymy.
    if ($res->content !~ /can be found <A HREF=([^>]*)>here<\/A>/i) {
       die "Odpowied z serwera TTS jest niezrozumiaa. Dziwne.\n"; }

    # efektem ubocznym sprawdzania bdw powyej jest ustawienie $1 na
    # faktyczn nazw wygenerowanego pliku - i dobrze.
    my $wav_url  = "http://morrissey.naturalvoices.com$1";
    my $wav_file = $1; # uywany przy zapisie na dysk.
    $wav_file =~ s/.*?\/(\w+.wav)/$1/;
    getstore($wav_url, "$wav_file") or
     die "Pobieranie $wav_file nie udao si: $!";
    push(@temporary_wav_files, $wav_file);
}

# kiedy mamy wszystkie pliki, odtwarzamy je za pomoc moduu Win32::Sound. 
# jeli nie, po prostu zostawiamy je liczc, e uytkownik odtworzy je pniej.
print  "Odtwarzanie pobranych plikw wav...\n";
foreach my $temporary_wav_file (@temporary_wav_files) {
    print " Odtwarzam: $temporary_wav_file\n";
    Win32::Sound::Play("$temporary_wav_file");
}

