Asterisk podcast per telefoon

Ook dit is onstaan als een voorbeeld toepassing in Asterisk.

Het idee is simpel: bel een nummer en er wordt een laatste versie van een geluidsbestand afgespeeld. Voor allerlei doeleinden te gebruiken, maar ik kwam snel op 'de laatste editie van een podcast'.

Het concept is niet origineel, via google prima te vinden op Michigan Telephone, VoIP and Broadband blog. Ik heb het een beetje opgepoetst en er wat nederlandse tekst bijgemaakt.

Het lastigste deel aan het spelen van podcasts (of andere mp3 bronnen) in Asterisk is het ophalen en op de juiste manier beschikbaar stellen. En er blijft altijd de vitale vraag of de audio op deze manier gepubliceert mag worden. De licentie van de podcast (of andere mp3 bron) moet deze toepassing accepteren.

In dit voorbeeld gebruik ik the daily breakfast, een podcast met (bijna) dagelijks een nieuwe aflevering. Het effect is bijna een dial a prayer lijn.

Het relevante deel van extensions.conf:

[dailybreakfast]

;exten => s,1,Ringing()
exten => s,1,Noop()
exten => s,n,System('/usr/lib/asterisk/scripts/getdailybreakfast')
exten => s,n,Answer()
exten => s,n,Wait(2)
exten => s,n,MP3Player(/tmp/dailybreakfastlatest.mp3)
exten => s,n,Wait(1)
exten => s,n,Hangup()
Ik had eerst de 'Ringing()' staan. Met een intern toestel wat het nummer kiest gaat dat prima. Als ik vervolgens dezelfde toepassing in een telefoonmenu hing een dus al opgenomen was op het moment dat dit script uitgevoerd wordt) kwam er een vreselijke foutmelding uit Asterisk op het moment dat MP3Player aangeroepen werd.

Het perl-script getdailybreakfast :

#!/usr/bin/perl -w

# get the mp3 of the latest dailybreakfast from the sqpn feed
# strip the id3 tags to keep mpg123 0.59r from aborting
# so it can be used as a destination in Asterisk

use strict;
use XML::Simple;
use LWP::Simple;

my $content;

my $rss = new XML::Simple;

$content = get("http://feeds.feedburner.com/dailybreakfast");
my $data = $rss->XMLin($content);

# the url of the enclosure of the first item in the channel of the xml feed
my $remotefile=$data->{channel}->{item}[0]{enclosure}->{url};
my $localfile;

if ($remotefile =~ /\/([^\/]+\.mp3)$/i){
        $localfile="/tmp/".$1;
}

if (! -f $localfile){
        #printf "Getting %s to %s\n",$remotefile,$localfile;
        getstore($remotefile,$localfile);
        system("id3v2 -D ".$localfile);
		unlink("/tmp/dailybreakfastlatest.mp3");
        symlink($localfile,"/tmp/dailybreakfastlatest.mp3");
}
mpg123 0.59r blijkt niet tegen 'moderne' mp3s te kunnen met id3 v1/v2 tags. Maar dit is wel de 'ideale' versie voor Asterisk. Vandaar het extra commando om de id3 tags te verwijderen.

Ook bleek het parsen van deze feed beter te gaan met XML::Simple dan met XML::RSS. De laatste herkent (nog?) geen enclosures die in podcast feeds heel normaal zijn.

Nodig

Naast asterisk: perl, id3v2, XML::Simple en LWP::Simple.

Debian packages: perl, id3v2, libwww-perl en libxml-simple-perl.

Download

beleenpodcast-scripts.tar.gz archief met het deel uit extensions.conf en het getdailybreakfast script.

Links

Demonstratie

Is momenteel niet beschikbaar.
Creative Commons License
Op dit werk is een Creative Commons Licentie van toepassing.
Commentaar over en updates voor deze pagina zijn welkom. E-mail is de beste manier van contact.
Koos van den Hout (koos+website@idefix.net)
Other webprojects: Camp Wireless The Virtual Bookcase