){
$fileContent .= $_;
}
close IMGFILE;
return $fileContent;
}
return undef;
}
########################################################################################
#
# YAMAHA_URI_Escape - Escapes the given string.
#
########################################################################################
sub YAMAHA_URI_Escape($) {
my ($txt) = @_;
eval {
$txt = uri_escape($txt);
};
if ($@) {
$txt = uri_escape_utf8($txt);
};
return $txt;
}
########################################################################################
#
# YAMAHA_GetSpeakFile - Generates the audiofile according to the given text, language and generator
#
########################################################################################
sub YAMAHA_GetSpeakFile($$$$$) {
my ($udn, $workType, $language, $text, $destFileName) = @_;
my $name = "YAMAHA_MC";
# Attribut Directory lesen
my $targetSpeakMP3FileDir = YAMAHA_Client_Data_Retreive('undef', 'attr', 'targetSpeakMP3FileDir', '');
# Some Constants
my @YAMAHA_PINGTYPELIST = qw(none tcp udp icmp syn);
my $YAMAHA_DEFAULTPINGTYPE = 'syn';
my $YAMAHA_SUBSCRIPTIONSRENEWAL = 1800;
my $YAMAHA_DIDLHeader = '';
my $YAMAHA_DIDLFooter = '';
my $YAMAHA_GOOGLETRANSLATOR_URL = 'http://translate.google.com/translate_tts?tl=%1$s&client=tw-ob&q=%2$s'; # 1->Sprache, 2->Text
my $YAMAHA_GOOGLETRANSLATOR_CHUNKSIZE = 95;
# Parametrisieren...
my $chunksize = $YAMAHA_GOOGLETRANSLATOR_CHUNKSIZE;
my $textescaped = YAMAHA_URI_Escape($text);
my $textutf8 = YAMAHA_Latin1ToUtf8($text);
my $textutf8escaped = YAMAHA_URI_Escape($textutf8);
# Chunks ermitteln...
# my @textList = ($text =~ m/(?:\b(?:[^ ]+)\W*){0,$YAMAHA_GOOGLETRANSLATOR_CHUNKSIZE}/g);
# pop @textList; # Letztes Element ist immer leer, deshalb abschneiden...
my @textList = ('');
for my $elem (split(/[ \t]/, $text)) {
# Files beibehalten...
if ($elem =~ m/\|(.*)\|/) {
my $filename = $1;
$filename = $targetSpeakMP3FileDir.'/'.$filename if ($filename !~ m/^(\/|[a-z]:)/i);
$filename = $filename.'.mp3' if ($filename !~ m/\.mp3$/i);
push(@textList, '|'.$filename.'|');
push(@textList, '');
next;
}
if (length($textList[$#textList].' '.$elem) <= $chunksize) {
$textList[$#textList] .= ' '.$elem;
} else {
push(@textList, $elem);
}
}
Log3 $name, 4, " YAMAHA_GetSpeakFile Chunks: ".join(",",@textList);
# Generating Speakfiles...
if (lc($workType) eq 'speak0') {
# Einzelne Chunks herunterladen...
my $counter = 0;
for my $text (@textList) {
# Leere Einträge überspringen...
next if ($text eq '');
$counter++;
# MP3Files direkt kopieren
if ($text =~ m/\|(.*)\|/) {
Log3 $name, 4, "$name : Copy MP3-File (".$counter." Element) from ".$1." to ".$destFileName.$counter;
copy($1, $destFileName.$counter);
# Etwaige ID-Tags entfernen...
eval {
use MP3::Info;
remove_mp3tag($destFileName.$counter, 'ALL');
};
if ($@) {
Log3 $name, 4, "$name : Copy MP3-File. ERROR during removing of ID3Tag: ".$@;
}
next;
}
my $url = sprintf($YAMAHA_GOOGLETRANSLATOR_URL, YAMAHA_URI_Escape(lc($language)), YAMAHA_URI_Escape($text));
Log3 $name, 4, "$name : Load Google generated MP3 (".$counter.". Element) from ".$url." to ".$destFileName.$counter;
my $ua = LWP::UserAgent->new(agent => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11');
my $response = $ua->get($url, ':content_file' => $destFileName.$counter);
if (!$response->is_success) {
Log3 $name, 4, "$name : MP3 Download-Error: ".$response->status_line;
unlink($destFileName.$counter);
#YAMAHA_MakeSigHandlerReturnValue($udn, 'LastActionResult', ucfirst($workType).': MP3-Creation ERROR during downloading: '.$response->status_line);
return ucfirst($workType).': MP3-Creation ERROR during downloading: '.$response->status_line;
#return 0;
}
}
# Heruntergeladene Chunks zusammenführen...
return YAMAHA_CombineMP3Files($udn, $workType, $destFileName, $counter);
}
#YAMAHA_MakeSigHandlerReturnValue($udn, 'LastActionResult', ucfirst($workType).': Speaking not defined.');
return ucfirst($workType).': Speaking not defined.';
#return 0;
}
########################################################################################
#
# YAMAHA_CombineMP3Files - Combine the loaded mp3-files
#
########################################################################################
sub YAMAHA_CombineMP3Files($$$$) {
my ($udn, $workType, $destFileName, $counter) = @_;
my $name = "Yamaha_MV";
Log3 $name, 4, "$name : Combine loaded chunks into $destFileName";
# Reinladen
my $newMP3File = '';
for(my $i = 1; $i <= $counter; $i++) {
$newMP3File .= YAMAHA_ReadFile($destFileName.$i);
unlink($destFileName.$i);
}
# Speichern
eval {
open MPFILE, '>'.$destFileName;
binmode MPFILE ;
print MPFILE $newMP3File;
close MPFILE;
};
if ($@) {
#YAMAHA_MakeSigHandlerReturnValue($udn, 'LastActionResult', ucfirst($workType).': MP3-Creation ERROR during combining: '.$@);
#return 0;
return ucfirst($workType).': MP3-Creation ERROR during combining: '.$@;
}
# Konvertieren? nur wenn targetSpeakMP3FileConverter angegeben ist
my $targetSpeakMP3FileConverter = YAMAHA_Client_Data_Retreive('undef', 'attr', 'targetSpeakMP3FileConverter', '');
if ($targetSpeakMP3FileConverter) {
Log3 $name, 4, "$name : Convert combined file ".$destFileName." with ".$targetSpeakMP3FileConverter;
eval {
my $destFileNameTMP = $destFileName;
$destFileNameTMP =~ s/^(.*)\/(.*?)$/$1\/TMP_$2/;
$targetSpeakMP3FileConverter =~ s/%infile%/$destFileName/gi;
$targetSpeakMP3FileConverter =~ s/%outfile%/$destFileNameTMP/gi;
Log3 $name, 4, " $name : Execute: ".$targetSpeakMP3FileConverter;
system($targetSpeakMP3FileConverter);
# "Alte" MP3-Datei entfernen, und die "neue" umbenennen...
unlink($destFileName);
move($destFileNameTMP, $destFileName);
};
if ($@) {
Log3 $name, 4, " $name : MP3-Creation ERROR during converting: ".$@;
#YAMAHA_MakeSigHandlerReturnValue($udn, 'LastActionResult', ucfirst($workType).': MP3-Creation ERROR during converting: '.$@);
#return 0;
return ucfirst($workType).": MP3-Creation ERROR during converting: ".$@;
}
}
return 1;
}
# command reference entry starts here...
=pod
=item device
=begin html
YAMAHA_MC