Skip to content

Instantly share code, notes, and snippets.

@hollie
Created November 11, 2015 20:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hollie/f86d1026e9eedd2970fa to your computer and use it in GitHub Desktop.
Save hollie/f86d1026e9eedd2970fa to your computer and use it in GitHub Desktop.
Scrape the 'kustweerbericht' local weather page and convert it to speech
#Category=Weather
# noloop=start
my $kwb_file = "$config_parms{data_dir}/web/kwb.html";
my $kwb_voice = "/Volumes/Media/speech/kustweer.wave";
my $last_fetched_kwb; # To keep track of the last type of fetched weather report
my $weerbeeld;
my $kwb_player = "keuken"; # Default player
$v_get_kwb = new Voice_Cmd "[korte,volledige] weerbericht";
$v_process_kwb = new Voice_Cmd "Speel weerbericht in [keuken,slaapkamer,zolder]";
$fetch_kwb = new Process_Item "get_url http://www.kustweerbericht.be/nl/home.asp $kwb_file";
$say_kwb = new Process_Item;
# noloop=stop
if ($state = said $v_get_kwb) {
$last_fetched_kwb = $state;
# Fetch new data
unlink $kwb_file;
# Get the correct URL
my $url = 'http://www.kustweerbericht.be/nl/home.asp';
$url = 'http://www.kustweerbericht.be/nl/professionele.gebruikers.algemeen.asp' if $state eq 'volledige';
set $fetch_kwb "get_url $url $kwb_file";
start $fetch_kwb;
print_log "Fetching kustweerbericht $state";
}
if ($state = said $v_process_kwb or done_now $fetch_kwb){
my $html = file_read($kwb_file);
if (defined($state)) {
::print_log("weer", "Voorlezen kuststweer in $state\n");
$kwb_player = $state;
}
# Gewoon kustweerbericht
my $weerbeeld;
$state = $v_process_kwb->state();
if ($last_fetched_kwb eq 'korte' && $html =~ /Weerbeeld\s:\s<\/strong>\s+(.*?)<\/p>/s){
$weerbeeld = $1;
$weerbeeld =~ s/N/noord /g; # idem for wind directions
$weerbeeld =~ s/O/oost /g;
$weerbeeld =~ s/Z/zuid /g;
$weerbeeld =~ s/W/west /g;
$weerbeeld = "Hier volgt het korte kustweerbericht: " . $weerbeeld;
}
if ($last_fetched_kwb eq 'volledige' && $html =~ /(Mariene meteoverwachting.*?)\(De in de tekst/s){
$weerbeeld = $1;
}
print_log "Weerbeeld: $weerbeeld";
# Parse if we found something
if ($weerbeeld ne '') {
$weerbeeld =~ s/<.*?>//sg; # strip HTML code
$weerbeeld =~ s/\s{2,}/ /g; # strip extra spaces
$weerbeeld =~ s/&deg;C/graden Celcius/g; # ensure temperature units can be TTSed
$weerbeeld =~ s/Bft/Beaufort/g; # and units
$weerbeeld =~ s/\((\d)\)/$1 Beaufort /g;
} else {
$weerbeeld = "Kon het weerbericht niet terugvinden, mijn parser moet waarschijnlijk aangepast worden";
next;
}
print_log "Converted to '$weerbeeld'";
unlink $kwb_voice;
set $say_kwb "say \"$weerbeeld\" -o $kwb_voice";
start $say_kwb;
print_log "Started conversion";
}
if (done_now $say_kwb) {
print_log("Conversion done, starting playback");
my $player;
if ($kwb_player eq "keuken") {
$player = $sb_keuken;
} elsif ($kwb_player eq "zolder") {
$player = $sb_zolder;
} else {
$player = $sb_wekker;
}
$player->play_notification($kwb_voice, 80);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment