|
From: <pf...@us...> - 2012-05-25 07:14:16
|
Revision: 837
http://openautomation.svn.sourceforge.net/openautomation/?rev=837&view=rev
Author: pfry
Date: 2012-05-25 07:14:08 +0000 (Fri, 25 May 2012)
Log Message:
-----------
Szenencontroller: Anpassungen auf PL32 (Vereinfachungen moeglich)
Logikprozessor: Patch u.a. fuer den Fall, dass waehrend einer Timer-Berechnung ein Plugin-Timeout kommt
Ansagen: jetzt mit integriertem Radio!
Modified Paths:
--------------
wiregate/plugin/generic/Ansagen.pl
wiregate/plugin/generic/Logikprozessor.pl
wiregate/plugin/generic/Szenencontroller.pl
wiregate/plugin/generic/conf.d/Ansagen.conf
Modified: wiregate/plugin/generic/Ansagen.pl
===================================================================
--- wiregate/plugin/generic/Ansagen.pl 2012-05-20 21:10:59 UTC (rev 836)
+++ wiregate/plugin/generic/Ansagen.pl 2012-05-25 07:14:08 UTC (rev 837)
@@ -18,6 +18,8 @@
my @additional_subscriptions=();
my %mpdhost=('default'=>'127.0.0.1/6600');
my $mode='mpd';
+my $radioga=undef;
+my %stations=(); # Internet-Radiostationen
# Konfigurationsfile einlesen
my $conf=$plugname; $conf=~s/\.pl$/.conf/;
@@ -61,16 +63,23 @@
for my $pat (keys %channels)
{
- next if $pat eq 'default';
+ next if $pat eq 'default' || $name!~/$pat/;
+ $plugin_subscribe{$ga}{$plugname}=1;
+ $gas{$channels{$pat}}++;
- if($name=~/$pat/)
+ if($name=~/$radioga/)
{
- $plugin_subscribe{$ga}{$plugname}=1;
- $gas{$channels{$pat}}++;
+ speak($channels{$pat},$name,'AUS');
}
}
+
}
+ for my $channel (values %channels)
+ {
+ $plugin_info{$plugname.'_radio_'.$channel}='AUS';
+ }
+
for my $ga (@additional_subscriptions)
{
$plugin_subscribe{$ga}{$plugname}=1;
@@ -101,35 +110,59 @@
}
}
+ # Radiosender bei dpt 16 (Text=Sendername)
+ if($mode eq 'mpd' && $name=~/$radioga/ && $dpt=~/^16/)
+ {
+ $val=~s/\000*$//; # streiche Nullen am Ende
+ return speak($channel, $name, $val);
+ }
+
# Hole alle verfuegbaren Durchsagedateien
my $find=checkexec('find');
my @speech=split /\n/, `$find . -name '*.wav'`;
map s!^\./!!, @speech; # Pfade relativ zum speechdir
return 'no speech files found' unless @speech;
-
+
my @statement=();
+
+ # Praefix bei Gefahrenwarnung (dpt 5.005)
+ push(@statement, words(\@speech, 'Achtung')) if $dpt eq '5.005'; # Gefahrenwarnung
# Textteil (Gruppenadresse ausgesprochen)
- if(defined $pattern)
- {
- push(@statement, words(\@speech, $pattern));
- }
+ push(@statement, words(\@speech, $pattern)) if defined $pattern;
# Informationsteil (Inhalt des Telegramms)
given($dpt)
{
when (1.001) # An/Aus
- { push(@statement, 'Zahlen/'.($val?'an':'aus').'.wav'); }
+ {
+ push(@statement, 'Zahlen/'.($val?'an':'aus').'.wav');
+ }
when (1.008) # Hoch/Runter
- { push(@statement, 'Zahlen/'.($val?'hoch':'runter').'.wav'); }
+ {
+ push(@statement, 'Zahlen/'.($val?'hoch':'runter').'.wav');
+ }
when(1.009) # Auf/Zu
- { push(@statement, 'Zahlen/'.($val?'auf':'zu').'.wav'); }
+ {
+ push(@statement, 'Zahlen/'.($val?'auf':'zu').'.wav');
+ }
when(2.007) # Auf/Ab/Stop
- { push(@statement, 'Zahlen/'.($val==1?'auf':($val==-1?'ab':'stop')).'.wav'); }
+ {
+ push(@statement, 'Zahlen/'.($val==1?'auf':($val==-1?'ab':'stop')).'.wav');
+ }
+ when(5.005) # Gefahrenwarnung
+ {
+ my %warnstufe=(0=>'keine_Meldung', 1=>'Hinweis', 2=>'Vorwarnung', 3=>'Warnung', 4=>'Gefahr', 5=>'Gefahr_hoch');
+ push(@statement, 'Warnung/'.$warnstufe{$val}.'.wav');
+ }
when([5.010,7.001,12.001]) # Ordinalzahl
- { push(@statement, number(\@speech, $val, -1)); }
+ {
+ push(@statement, number(\@speech, $val, -1));
+ }
when([3.007,6.010,8.001,13.001]) # Kardinalzahl
- { push(@statement, number(\@speech, $val)); }
+ {
+ push(@statement, number(\@speech, $val));
+ }
when([5.001,6.001]) # Prozent
{
push(@statement, number(\@speech, $val));
@@ -150,7 +183,7 @@
}
else
{
- return "Unbekanntes Datumsformat $val";
+ return "Unbekanntes Datumsformat '$val'";
}
}
when(7.005) # Zeitdauer
@@ -180,23 +213,30 @@
push(@statement, "Wochentage/$1.wav");
push(@statement, number(\@speech, $2));
push(@statement, "Zeiten/Uhr.wav");
- push(@statement, number(\@speech, $3)) if $3;
+ push(@statement, number(\@speech, $3)) if int($3)>0;
}
elsif($val=~/^([0-9][0-9])\:([0-9][0-9])/)
{
push(@statement, number(\@speech, $1));
push(@statement, "Zeiten/Uhr.wav");
- push(@statement, number(\@speech, $2)) if $2;
+ push(@statement, number(\@speech, $2)) if int($2)>0;
}
else
{
- return "Unbekanntes Uhrzeitformat $msg{value}";
+ return "Unbekanntes Uhrzeitformat '$val'";
}
}
+ when(/^16/) # Freitext
+ {
+ $val=~s/\000*$//; # streiche Nullen am Ende
+ push(@statement, words(\@speech, $val));
+ }
when(1.017) # Trigger, kein Datenzusatz
{}
default # kein Datenzusatz, aber mit Logeintrag
- { return "Datentyp $dpt nicht implementiert"; }
+ {
+ return "Datentyp $dpt nicht implementiert";
+ }
}
# Das komplette Statement in die Ausgabe geben
return speak($channel, $name, @statement);
@@ -404,21 +444,21 @@
my $datetime=`$date +"%F %X"`;
$datetime=~s/\s*$//s;
- if(@_)
+ # Fuer Russound-Ausgabe: Star Trek 'Beep' vorweg weckt Russound (und User) fuer Ansage auf
+ if($channel=~/$beepchannel/ && $name!~/$radioga/)
{
- # Nur fuer Russound-Paging: Star Trek 'Beep' vorweg weckt Russound auf
- if($channel=~/$beepchannel/)
+ my $lastbeep=$plugin_info{$plugname.'_lastbeep_'.$channel};
+
+ # max ein Beep pro Minute
+ if(!defined $lastbeep || time()>$lastbeep+60)
{
- my $lastbeep=$plugin_info{$plugname.'_lastbeep'};
-
- # max ein Beep pro Minute
- if(!defined $lastbeep || time()>$lastbeep+60)
- {
- unshift(@_, $beep);
- $plugin_info{$plugname.'_lastbeep'}=time();
- }
+ unshift(@_, $beep);
+ $plugin_info{$plugname.'_lastbeep_'.$channel}=time();
}
+ }
+ if(@_)
+ {
if($mode eq 'aplay')
{
my $aplay=checkexec('aplay');
@@ -429,12 +469,7 @@
}
elsif($mode eq 'mpd')
{
- push @_, "silence.wav"; # kurze Pause zwischen Ansagen
-
- map s!^/*!$speechdir/!, @_; # alle Eintraege relativ zum speechdir
- map s!^$mpddir/!!, @_; # mpd braucht einen Pfadnamen relativ zum music-Dir
- map s!/+!/!, @_; # zur Sicherheit
-
+ # Host und Port ermitteln
$mpdhost{$channel}=~m!^\s*(.*)\s*/\s*(.*)\s*$!;
my $host=$1; my $port=$2;
@@ -442,19 +477,71 @@
# also so:
my $mpc=checkexec('mpc');
$mpc="export MPD_HOST=$host; export MPD_PORT=$port; $mpc";
- system "$mpc update"; # Aktualisierung verfuegbarer Soundclips
- # wird momentan noch was gespielt?
- system "$mpc clear" unless `$mpc`=~/playing/s; # leeren falls abgespielt
- system "$mpc add \"".(join "\" \"", @_)."\"";
-# plugin_log($plugname, "$mpc add \"".(join "\" \"", @_)."\"");
-# plugin_log($plugname, "$mpc play") unless `$mpc`=~/playing/s;
- system "$mpc play" unless `$mpc`=~/playing/s; # starten falls noch nicht aktiv
+ # Laeuft gerade das Radio oder eine Ansage?
+ my $lfd_radio = $plugin_info{$plugname.'_radio_'.$channel} ne 'AUS';
+ my $lfd_ansage = `$mpc`=~/playing/s && !$lfd_radio;
-# $playing=`$mpc; $mpc outputs`;
-# $playing=~s/\s+/ /sg;
-# plugin_log($plugname, $playing);
- map s!^.*/(.*?)\.wav!$1!, @_;
+ # Sonderfall Internetradio statt Sprachausgabe
+ if($name=~/$radioga/)
+ {
+ my $val=$_[0];
+
+ if($val=~s/V([+-]?[0-9X])$//)
+ {
+ my $vol=$1;
+ $vol = ($vol eq 'X' ? 100: 10*$vol);
+ system "$mpc volume $vol"; # ermoeglicht gleichzeitig Sender u Lautstaerke festzulegen
+ }
+
+ if($val eq 'AUS')
+ {
+ system "$mpc clear";
+ $plugin_info{$plugname.'_radio_'.$channel}='AUS';
+ }
+ elsif($val =~ /^VOLUME\s*([+-]?[0-9]+)/)
+ {
+ system "$mpc volume $1";
+ }
+ elsif(defined $stations{$val})
+ {
+ system "$mpc clear" unless $lfd_ansage; # nur leeren falls abgespielt
+ system "$mpc add \"$stations{$val}\"";
+ plugin_log($plugname, "$mpc add \"$stations{$val}\"");
+ system "$mpc play" unless `$mpc`=~/playing/s; # starten falls noch nicht aktiv
+ $plugin_info{$plugname.'_radio_'.$channel}=$stations{$val};
+ }
+ else
+ {
+ return "Unbekannter Radiosender '$val'";
+ }
+ }
+ else # Regelfall: Sprachausgabe
+ {
+ system "$mpc update"; # Aktualisierung verfuegbarer Soundclips
+
+ push @_, "silence.wav"; # kurze Pause zwischen Ansagen
+
+ map s!^/*!$speechdir/!, @_; # alle Eintraege relativ zum speechdir
+ map s!^$mpddir/!!, @_; # mpd braucht einen Pfadnamen relativ zum music-Dir
+ map s!/+!/!, @_; # zur Sicherheit
+
+ push @_, $plugin_info{$plugname.'_radio_'.$channel} if $lfd_radio; # nach der Ansage wieder zurueck aufs Radio
+
+ # wird momentan noch was gespielt?
+ # dann Playlist leeren, ggf Radio stoppen falls abgespielt
+ system "$mpc crossfade 0"; # nur leeren falls abgespielt
+ system "$mpc clear" unless $lfd_ansage;
+ # ein Fall noch zu klaeren: wenn Radio laeuft und zwei Ansagen kurz hintereinander kommen,
+ # wird die zweite die erste unterbrechen, weil $lfd_ansage hier (inkorrekt) 0 sein wird.
+
+ system "$mpc add \"".(join "\" \"", @_)."\"";
+ plugin_log($plugname, "$mpc add \"".(join "\" \"", @_)."\"");
+ system "$mpc play" unless `$mpc`=~/playing/s; # starten falls noch nicht aktiv
+
+ map s!^.*/(.*?)\.wav!$1!, @_;
+ }
+
$retval.=$channel.':'.(join ' ', @_);
}
else
Modified: wiregate/plugin/generic/Logikprozessor.pl
===================================================================
--- wiregate/plugin/generic/Logikprozessor.pl 2012-05-20 21:10:59 UTC (rev 836)
+++ wiregate/plugin/generic/Logikprozessor.pl 2012-05-25 07:14:08 UTC (rev 837)
@@ -320,6 +320,7 @@
$result=execute_logic($t, groupaddress($logic{$t}{receive}), undef, undef);
$retval.="\$logic{$t} -> $transmit:".
(defined $result?$result.($toor?" gespeichert":" gesendet"):"nichts zu senden")." (Timer) " if $debug;
+
}
# Timer loeschen bzw. neu setzen
@@ -339,6 +340,21 @@
}
}
+# Suche Timer-Logiken, bei denen aus irgendeinem Grund der naechste Aufruf noch nicht berechnet wurde,
+# bspw wegen eines Plugin-Timeouts waehrend der Berechnung
+for my $t (keys %logic)
+{
+ next if $t eq 'debug' || !defined $logic{$t}{timer};
+
+ my $timer=$plugin_info{$plugname.'__'.$t.'_timer'};
+
+ next if defined $timer && $timer>time();
+
+ # Debuggingflag gesetzt
+ my $debug = $logic{debug} || $logic{$t}{debug};
+ set_next_call($t, $debug);
+}
+
# Cycle auf naechsten Aufruf setzen
unless(defined $nexttimer)
{
@@ -407,19 +423,18 @@
# Feiertagstabelle als Tageszahl im Jahr (1=1.Januar, 32=1.Februar usw.): 1.1., 1.5., 3.10., 25./26.12.
# und die auf Ostern bezogenen Kirchenfeiertage: Karfreitag, Ostern (2x), Christi Himmelfahrt, Pfingsten (2x), Fronleichnam
my @holidays=(1,121+$leapyear,276+$leapyear,359+$leapyear,360+$leapyear,$J-2,$J,$J+39,$J+49,$J+50,$J+60);
- my $is_holiday = scalar(grep { $_==$doy } @holidays);
-
- return $is_holiday;
+
+ return (grep { $_==$doy } @holidays) ? 1 : 0;
}
sub add_day_info
{
my $d=shift;
- $d->{weekend}=($d->{day_of_week_no}>=6);
- $d->{weekday}=!$d->{weekend};
- $d->{holiday}=is_holiday($d->{year},$d->{day_of_year});
- $d->{workingday}=(!$d->{weekend} && !$d->{holiday});
+ $d->{weekend} = ($d->{day_of_week}>=6) ? 1 : 0;
+ $d->{weekday} = !$d->{weekend};
+ $d->{holiday} = is_holiday($d->{year},$d->{day_of_year});
+ $d->{workingday} = (!$d->{weekend} && !$d->{holiday}) ? 1 : 0;
$d->{date} = sprintf("%02d/%02d",$d->{month},$d->{day_of_month});
}
@@ -474,7 +489,7 @@
next;
}
- if($k=~/^(holiday|weekend|weekday|workingday)$/ && $s->{$k}!~/^(0|1)$/)
+ if($k=~/^(holiday|weekend|weekday|workingday)$/ && !ref $s->{$k} && $s->{$k}!~/^(0|1)$/)
{
plugin_log($plugname, "Logiktimer zu Logik '$t': Unerlaubter Wert '$k\->$s->{$k}': erlaubt sind 0 und 1");
next;
@@ -598,6 +613,11 @@
# Pflichtfeld ist lediglich time, die anderen duerfen auch entfallen.
# Jeder Wert darf ein Einzelwert oder eine Liste sein.
my $schedule=$logic{$t}{timer};
+
+# return unless defined $schedule;
+
+ # Das "Day-Hash" wird dazu verwendet, Tage zu finden, auf die die Timer-Spezifikation zutrifft
+ # Wir fangen dabei mit today, also heute, an.
my $today={year=>$year,day_of_year=>$day_of_year,month=>$month,day_of_month=>$day_of_month,
calendar_week=>$calendar_week,day_of_week=>$day_of_week_no};
add_day_info($today);
@@ -611,7 +631,7 @@
for my $s (@{$schedule})
{
standardize_and_expand_single_schedule($t,$s);
-
+
# Steht heute aus diesem Schedule noch ein Termin an?
next unless schedule_matches_day($s,$today) && $s->{time}[-1] gt $time_of_day;
@@ -658,7 +678,7 @@
else
{
plugin_log($plugname, "Logik '$t' wird nicht mehr aufgerufen (alle in time=>... festgelegten Termine sind verstrichen).")
- if $debug && $logic{$t}{timer};
+ if $logic{$t}{timer}; # if $debug;
delete $plugin_info{$plugname.'__'.$t.'_timer'};
}
Modified: wiregate/plugin/generic/Szenencontroller.pl
===================================================================
--- wiregate/plugin/generic/Szenencontroller.pl 2012-05-20 21:10:59 UTC (rev 836)
+++ wiregate/plugin/generic/Szenencontroller.pl 2012-05-25 07:14:08 UTC (rev 837)
@@ -10,24 +10,25 @@
my $use_short_names=1; # 1 fuer GA-Kuerzel (erstes Wort des GA-Namens), 0 fuer die "nackte" Gruppenadresse
# eibgaconf fixen falls nicht komplett indiziert
-if($use_short_names && !exists $eibgaconf{ZV_Uhrzeit})
-{
- for my $ga (grep /^[0-9\/]+$/, keys %eibgaconf)
- {
- $eibgaconf{$ga}{ga}=$ga;
- my $name=$eibgaconf{$ga}{name};
- next unless defined $name;
- $eibgaconf{$name}=$eibgaconf{$ga};
+# entfaellt ab Wiregate PL32
+#if($use_short_names && !exists $eibgaconf{ZV_Uhrzeit})
+#{
+# for my $ga (grep /^[0-9\/]+$/, keys %eibgaconf)
+# {
+# $eibgaconf{$ga}{ga}=$ga;
+# my $name=$eibgaconf{$ga}{name};
+# next unless defined $name;
+# $eibgaconf{$name}=$eibgaconf{$ga};
+#
+# next unless $name=~/^\s*(\S+)/;
+# my $short=$1;
+# $short='ZV_'.$1 if $eibgaconf{$ga}{name}=~/^Zeitversand.*(Uhrzeit|Datum)/;
+#
+# $eibgaconf{$ga}{short}=$short;
+# $eibgaconf{$short}=$eibgaconf{$ga};
+# }
+#}
- next unless $name=~/^\s*(\S+)/;
- my $short=$1;
- $short='ZV_'.$1 if $eibgaconf{$ga}{name}=~/^Zeitversand.*(Uhrzeit|Datum)/;
-
- $eibgaconf{$ga}{short}=$short;
- $eibgaconf{$short}=$eibgaconf{$ga};
- }
-}
-
# Aufrufgrund ermitteln
my $event=undef;
if (!$plugin_initflag)
@@ -42,7 +43,8 @@
# Konfigurationsfile einlesen
my %scene=();
-my $conf="/etc/wiregate/plugin/generic/conf.d/$plugname"; $conf=~s/\.pl$/.conf/;
+my $conf="/etc/wiregate/plugin/generic/conf.d/$plugname";
+$conf.='.conf' unless $conf=~s/\.pl$/.conf/;
my $err=read_from_config();
return $err if $err;
@@ -110,6 +112,7 @@
# die betreffende Szene finden
unless($plugin_info{$plugname.'__SceneLookup'}=~/(St|Rc)\($ga\)=>\'(.+?)\',/)
{
+ plugin_log($plugname, "Storniere $ga");
delete $plugin_subscribe{$ga}{$plugname}; # unbekannte GA
for my $k (keys %scene) { delete $scene{$k}; } # Hilfe fuer die Garbage Collection
return;
@@ -213,7 +216,7 @@
my $z=shift; # die Szenenbezeichnung
open CONFIG, ">>$conf";
- print CONFIG "\$scene{$z}={";
+ print CONFIG "\$scene{'$z'}={";
for my $v (sort keys %{$scene{$z}})
{
print CONFIG sprintf "'$v'=>%.2f, ", $scene{$z}{$v};
@@ -230,25 +233,41 @@
# Alle Laufzeitvariablen im Hash %{$dyn}
# in das (flache) Hash plugin_info schreiben
- for my $k (grep /^$plugname\__$z/, keys %plugin_info)
- {
- delete $plugin_info{$k};
- }
+
+ my @keylist=keys %{$scene{$z}};
+ map { $_=sprintf("$_=>'%.2f'",$scene{$z}{$_}) } @keylist;
- for my $v (keys %{$scene{$z}})
- {
- $plugin_info{$plugname.'__'.$z.'__'.$v}=$scene{$z}{$v};
- }
+ $plugin_info{$plugname.'__'.$z} = join ',', @keylist;
+# plugin_log($plugname, "stored: ".$plugin_info{$plugname.'__'.$z});
+
+# for my $k (grep /^$plugname\__$z/, keys %plugin_info)
+# {
+# delete $plugin_info{$k};
+# }
+#
+# for my $v (keys %{$scene{$z}})
+# {
+# $plugin_info{$plugname.'__'.$z.'__'.$v}=$scene{$z}{$v};
+# }
}
sub recall_from_plugin_info
{
for my $k (grep /^$plugname\__/, keys %plugin_info)
{
- next unless($k=~/^$plugname\__(.*\#.*)__(.*)$/);
- my ($z,$v)=($1,$2);
- $scene{$z}{$v}=$plugin_info{$k};
+ next unless($k=~/^$plugname\__(.*\#.*)$/);
+ my $z=$1;
+ $scene{$z}={};
+ my $pi=$plugin_info{$k};
+ while($pi=~m/(.*?)=>\'(.*?)\'/g) { $scene{$z}{$1}=$2 }
+# plugin_log($plugname, "retrieved: ".join ',', map $_=sprintf("$_=>'%.2f'",$scene{$z}{$_}), keys %{$scene{$z}});
}
+# for my $k (grep /^$plugname\__/, keys %plugin_info)
+# {
+# next unless($k=~/^$plugname\__(.*\#.*)__(.*)$/);
+# my ($z,$v)=($1,$2);
+# $scene{$z}{$v}=$plugin_info{$k};
+# }
}
# Umgang mit GA-Kurznamen und -Adressen
@@ -287,39 +306,3 @@
}
}
-sub shortname
-{
- my $gas=shift;
-
- return unless defined $gas;
- return $gas unless $use_short_names;
-
- if(ref $gas)
- {
- my $sh=[];
- for my $ga (@{$gas})
- {
- if($ga=~/^[0-9\/]+$/ && defined $eibgaconf{$ga}{short})
- {
- push @{$sh}, $eibgaconf{$ga}{short};
- }
- else
- {
- push @{$sh}, $ga;
- }
- }
- return $sh;
- }
- else
- {
- my $sh=$gas;
-
- if($gas=~/^[0-9\/]+$/ && defined $eibgaconf{$gas}{short})
- {
- $sh=$eibgaconf{$gas}{short};
- }
-
- return $sh;
- }
-}
-
Modified: wiregate/plugin/generic/conf.d/Ansagen.conf
===================================================================
--- wiregate/plugin/generic/conf.d/Ansagen.conf 2012-05-20 21:10:59 UTC (rev 836)
+++ wiregate/plugin/generic/conf.d/Ansagen.conf 2012-05-25 07:14:08 UTC (rev 837)
@@ -1,7 +1,6 @@
#!/usr/bin/perl
#
# Ansagen.pl - Konfiguration
-
# Voraussetzungen:
# 1. Im Verzeichnis $speechdir/Zahlen muessen folgende Dateien vorhanden sein:
@@ -78,23 +77,321 @@
# Directories, Kanaele, Gruppenadressen
$speechdir='/var/lib/mpd/music/Ansagen/';
%channels=(
- '^WA_'=>'welcome', # zB "WA_Die Aussentemperatur betraegt"
- '^WD_'=>'paging', # zB "WD_Folgende Fenster sind geoeffnet"
+ '^WW_'=>'welcome',
+ # zB "WW_Die Aussentemperatur betraegt"
+ '^WP_'=>'paging',
+ # zB "WP_Folgende Fenster sind geoeffnet"
+ '^WM_'=>'music',
+ # zB "WM_Folgende Fenster sind geoeffnet"
'default'=>'welcome' # die GAs in additional_subscriptions
);
-$beepchannel='paging';
+$beepchannel='paging|music';
$beep = sprintf "Beep/%02d.wav", 3; # int(rand(32))+1 fuer Zufallsbeep
#@additional_subscriptions=qw(0/7/245 0/7/246 6/2/186);
@additional_subscriptions=();
+
# Ausgabeoptionen
$mode='mpd'; # mpd or aplay
-# die folgenden Eintraege nur fuer mpd benoetigt
+# die folgenden Eintraege werden nur fuer mpd benoetigt
$mpddir='/var/lib/mpd/music';
%mpdhost=(
- 'welcome'=>'127.0.0.1/6600',
- 'paging'=>'127.0.0.1/6601'
+ 'welcome'=>'127.0.0.1/6600',
+ 'paging'=>'127.0.0.1/6601',
+ 'music'=>'127.0.0.1/6602',
);
+# Integriertes Internetradio, funktioniert NUR mit $mode='mpd',
+# GA-Kuerzel nach diesem Muster rufen das Radio auf
+$radioga='^...MusicPlayer';
+# solche GAs muessen Datentyp DPT 16 haben und uebertragen im Datenteil den Sendernamen
+# sowie Kommandos wie 'AUS' oder 'VOLUME 30' oder 'VOLUME +10',
+# es ist auch moeglich, in einem einzigen Aufruf Sender und Lautstaerke festzulegen:
+# zB knx_write($ga, 'Bayern1 V3', 16); setzt Lautstaerke auf 30%, 'bayern1 VX' auf 100%
+
+# Tabelle von Sendernamen, nicht alle sind <=14 Zeichen und damit aufrufbar...
+# die meisten Links sind UNGETESTET!
+%stations = (
+ 'Bayern1' => 'http://gffstream.ic.llnwd.net/stream/gffstream_w10a',
+ 'Bayern2' => 'http://gffstream.ic.llnwd.net/stream/gffstream_w11a',
+ 'Bayern3' => 'http://gffstream.ic.llnwd.net/stream/gffstream_w12a',
+ 'BRKlassik' => 'http://gffstream.ic.llnwd.net/stream/gffstream_w13a',
+ 'B5aktuell' => 'http://gffstream.ic.llnwd.net/stream/gffstream_w14a',
+ 'B5plus' => 'http://gffstream.ic.llnwd.net/stream/gffstream_w15a',
+ 'FFH' => 'http://streams.ffh.de/radioffh/mp3/hqlivestream.mp3',
+ 'FFHTop40' => 'http://streams.ffh.de/ffhchannels/mp3/hqtop40.mp3',
+ 'FFH80er' => 'http://streams.ffh.de/ffhchannels/mp3/hq80er.mp3',
+ 'FFHRock' => 'http://streams.ffh.de/ffhchannels/mp3/hqrock.mp3',
+ 'FFHElektro' => 'http://streams.ffh.de/ffhchannels/mp3/hqelectrobeatz.mp3',
+ 'FFHEurodance' => 'http://streams.ffh.de/ffhchannels/mp3/hqeurodance.mp3',
+ 'FFHDeutsch' => 'http://streams.ffh.de/ffhchannels/mp3/hqdeutsch.mp3',
+ 'FFHSoundtrck' => 'http://streams.ffh.de/ffhchannels/mp3/hqsoundtrack.mp3',
+ 'FFHHits4Kids' => 'http://streams.ffh.de/ffhchannels/mp3/hqhits4kids.mp3',
+ 'FFHJazz' => 'http://streams.ffh.de/ffhchannels/mp3/hqjazz.mp3',
+ 'FFH90er' => 'http://streams.ffh.de/ffhchannels/mp3/hqspezial.mp3',
+ 'FFHLounge' => 'http://streams.ffh.de/ffhchannels/mp3/hqlounge.mp3',
+ 'FFHLovesongs' => 'http://streams.ffh.de/ffhchannels/mp3/hqspezial1.mp3',
+ 'FFHAlternatv' => 'http://streams.ffh.de/ffhchannels/mp3/hqalternative.mp3',
+
+ '1Live Diggi' => 'http://gffstream.ic.llnwd.net/stream/gffstream_einslive_b',
+ '1Live Kunst' => 'http://gffstream.ic.llnwd.net/stream/gffstream_einslive_a',
+ '1Live' => 'http://gffstream.ic.llnwd.net/stream/gffstream_stream_wdr_einslive_a',
+ '2Radio' => 'http://88.198.50.10:8020',
+ '80s' => 'http://64.236.34.67:80/stream/1040',
+ '89.0 RTL' => 'http://62.75.176.45/rtl-high',
+ 'Alpen-Radio' => 'http://cdn1.ice.muc.streamin.de/alpenradio',
+ 'BHJMS-Radio1' => 'http://bhjms-streamserver.mscs.net:8000/',
+ 'BIG FM' => 'http://www.bigfm.de/webradio/bigfm-high.m3u',
+ 'BS Allgenres' => 'http://www.besonic.fm/allgenres',
+ 'BS HipHop' => 'http://besonic.fm:8000/hiphopsoulurban',
+ 'BS JazzBlues' => 'http://besonic.fm:8000/jazzblues',
+ 'BS MixedUP' => 'http://besonic.fm:8000/mixedup',
+ 'BS Pop' => 'http://besonic.fm:8000/Pop',
+ 'BSAlternativ' => 'http://besonic.fm:8000/rockalternative',
+ 'BavOpenRadio' => 'http://gffstream.ic.llnwd.net/stream/gffstream_w9b',
+ 'BlackBeats' => 'http://blackbeats.fm:13000/',
+ 'Blackmusic' => 'http://listen.bmradio.de',
+ 'Blitz-Radio' => 'http://blitz-stream.de:8000/',
+ 'Blu.FM' => 'http://sc1.netstreamer.net:9800/',
+ 'Br4 Zeiglers' => 'http://80.252.104.101:8000/zeiglerswwdp',
+ 'CFNYFM' => 'http://208.80.52.106/CFNYFM',
+ 'CHROMANOV' => 'http://212.112.241.88:8000/',
+ 'Chat-Radio' => 'http://chatradio.myftp.org:8202',
+ 'Citybull' => 'http://citybull.net:11000/',
+ 'ClubNatur.FM' => 'http://server2.digital-webstream.de:7800',
+ 'CrossChannel' => 'http://62.146.11.24/3095crosschannel_dsl.mp3',
+ 'DEFJAY.DE' => 'http://sc1.netstreamer.net:8040/',
+ 'DLF' => 'http://www.dradio.de/streaming/dlf_hq_ogg.m3u',
+ 'DLR Kultur' => 'http://www.dradio.de/streaming/dkultur_hq_ogg.m3u',
+ 'Dancefox' => 'http://s5.pop-stream.de:9000/',
+ 'DeluxeJazz' => 'http://d85195728.i.tis.core005.cdn.streamfarm.net:80/13000deluxe/live/3258radiodeluxe/de_96.mp3',
+ 'DeluxeLounge' => 'http://d852143781.i.sto.core008.cdn.streamfarm.net/13000deluxe/live/3304lounge/de_128.mp3',
+ 'DieNeue107.7' => 'http://cdn1.ice.muc.streamin.de:80/dieneue1077',
+ 'Disco-Beatz' => 'http://85.214.43.232:1598/',
+ 'Discodance' => 'http://discodancefoxradio.eu:25819',
+ 'Discoradio' => 'http://discoradio.fabbricadigitale.it/asx/discoradio.asx',
+ 'Dt Welle' => 'http://metafiles.gl-systemhaus.de/dw/radio_de_64.m3u',
+ 'ELDORADIO' => 'http://sender.eldoradio.de:8000/128',
+ 'ERF Radio' => 'http://d85195728.i.tis.core005.cdn.streamfarm.net:80/3212erf_96_live.mp3',
+ 'Enc Ismaning' => 'http://mp3.webradio.antenne.de:80',
+ 'Enjoy' => 'http://91.121.29.176:9000/',
+ 'EnrgieBerlin' => 'mms://213.200.97.107/energyberlin$livestream.wma',
+ 'EnrgieBremen' => 'mms://213.200.97.107/energybremen$livestream.wma',
+ 'EnrgieHH' => 'mms://213.200.97.107/energyhamburg$livestream.wma',
+ 'EnrgieM' => 'mms://213.200.97.107/energymuenchen$livestream.wma',
+ 'EnrgieN' => 'mms://213.200.97.107/energynuernberg$livestream.wma',
+ 'EnrgieS' => 'mms://213.200.97.107/energystuttgart$livestream.wma',
+ 'EnrgieSachsn' => 'mms://62.26.161.89/energysachsen$livestream.wma',
+ 'FFN' => 'http://rs20.stream24.org:8000/stream',
+ 'Fernsehen' => 'mms://80.190.139.69/11008bmt/live/3338s10rfo/300.wmv?cid=60921&dummy=.wmv',
+ 'Filmradio' => 'http://212.123.103.171:8000/',
+ 'GameSports' => 'http://195.13.63.169:8200/',
+ 'Gamer-FM' => 'http://82.149.224.55:8500/',
+ 'Gong FM' => 'http://213.186.33.86:8321/gongfm.mp3',
+ 'Gong Live' => 'http://radiator.nci.de:8000/live',
+ 'GothicFan' => 'http://85.214.43.100:8000',
+ 'HR Info' => 'http://d851957213.i.tis.core005.cdn.streamfarm.net:80/17000hr/live/3435hrinfo/de_96.mp3',
+ 'HR1' => 'http://d85195728.i.tis.core005.cdn.streamfarm.net:80/17000hr/live/3435hr1/de_96.mp3',
+ 'HR2' => 'http://hr.streamfarm.net/cms/_vm100/radio/live/hr2_cms.asx',
+ 'HR3' => 'http://d85195728.i.tis.core005.cdn.streamfarm.net:80/17000hr/live/3435hr3/de_96.mp3',
+ 'HR4' => 'http://hr.streamfarm.net/cms/_vm100/radio/live/hr4_cms.asx',
+ 'Hit-R.Ant' => 'MMS://213.200.64.231/ANTENNE1$LIVESTREAM2.WMA',
+ 'Hitradio 77' => 'http://80.154.38.77:8000/',
+ 'HotBeats FM' => 'http://break.hotbeats.fm:9999/',
+ 'House-Musik' => 'http://85.214.92.77:8000',
+ 'Impact Punk' => 'http://85.214.37.96:8000/',
+ 'JUMP' => 'mms://wm-ipx-11.stream.tv1.de/22004mdrjump/live/3087mdr_jump_live/de_44.wma',
+ 'Jack FM' => 'http://sc1.streamfox.com:8050',
+ 'KlassikRadio' => 'http://str0.creacast.com:80/klassik1',
+ 'Krautrock' => 'http://krautrock.pop-stream.de:7592/',
+ 'Kronehit' => 'http://kronehit.sil.at:8016',
+ 'LeFunkBoat' => 'http://lefunkboat.com:8000/',
+ 'M94.5' => 'http://stream.lrz-muenchen.de:31337/m945-hq.mp3',
+ 'MAIN.FM' => 'http://87.106.14.18:8000/',
+ 'MDR Figaro' => 'MMS://D621466636.W.IPX.CORE001.CDN.STREAMFARM.NET/22007MDRFIGARO/LIVE/3087MDR_FIGARO_LIVE/DE_44.WMA',
+ 'MDR Info' => 'MMS://D621466636.W.IPX.CORE001.CDN.STREAMFARM.NET/22006MDRINFO/LIVE/3087MDR_INFO_LIVE/DE_44.WMA',
+ 'MDR Klassik' => 'http://62.146.11.19:80/22008mdrklassik/live/3087mdrklassik/klassik_128.mp3',
+ 'MDR1 Thuerin' => 'mms://wm-ipx-11.stream.tv1.de/22003mdr1thueringen/live/3087mdr_thue/de_44.wma',
+ 'METAL-ONLY ' => 'http://80.190.246.22:6666',
+ 'Memoryradio' => 'http://www.memoryradio.de:4000/',
+ 'Metal Refine' => 'http://www.metal-refinement.de:8088',
+ 'MotorFM' => 'http://85.25.145.179:80/motorfm.mp3',
+ 'Muni.Hardest' => 'http://84.19.188.7:8010',
+ 'N-JOY' => 'mms://213.254.239.66/ndr$live$n-joy.wma',
+ 'NDR Info' => 'http://213.200.97.110:8000/ndr/ndrinfo_spezial.mp3',
+ 'NDR Kultur' => 'mms://213.254.239.60/ndr$live$ndrkultur.wma',
+ 'NDR1 90.3' => 'mms://213.254.239.66/ndr$live$ndr903.wma',
+ 'NDR1 NiederS' => 'mms://213.254.239.60/ndr$live$ndr1niedersachsen.wma',
+ 'NDR1 Welle' => 'mms://213.254.239.66/ndr$live$ndr1wellenord.wma',
+ 'NDR2' => 'mms://213.254.239.60/ndr$live$ndr2.wma',
+ 'NE-WS 89.4' => 'mms://213.200.75.248/news894$livestream.wma',
+ 'Neue Welle' => 'http://www.meine-neue-welle.de/dieneuewelle.m3u',
+ 'NightFly' => 'http://pia-server.com:8080/',
+ 'Nightline' => 'http://radio1.nightline-radio.de:8000',
+ 'Nordwest' => 'mms://a346.l2377539860.c23775.g.lm.akamaistream.net/D/346/23775/v0001/reflector:39860',
+ 'OldieStar' => 'http://www.digitalradiostream.de:8000',
+ 'OnkelzRadio' => 'http://80.67.26.220:8000/',
+ 'PELLENZRADIO' => 'http://pellenzradio.info:8020/',
+ 'POP-Radio 1' => 'http://tobit.pop-radio.de:8000',
+ 'POP-Radio 2' => 'http://tobit.pop-radio.de:8030',
+ 'POP-Radio 3' => 'http://tobit.pop-radio.de:8060',
+ 'PRIDE1' => 'http://p1standby.serveftp.org:8100',
+ 'Powerhitz' => 'http://scfire-chi0l-2.stream.aol.com:80/stream/1044',
+ 'Punkrockers' => 'http://punkrockers.kicks-ass.net:8003/',
+ 'R.AktivFM' => 'http://stream.radioaktiv.fm:8000',
+ 'R.Arabella ' => 'http://83.246.121.39:8010/arabella.mp3',
+ 'R.Bielefeld ' => 'http://stream.radiobielefeld.de:8000/live',
+ 'R.Bonn' => 'http://ga-stream01.ga-bonn.de:80/live128',
+ 'R.Brocken' => 'http://62.75.176.44/brocken-high',
+ 'R.Chemnitz' => 'mms://stream.green.ch/RadioChemnitz',
+ 'R.Chiemgau' => 'http://chiemgau.blm.netlantic.net:80/live.mp3',
+ 'R.Cottbus' => 'mms://d85195723.w.tis.core005.cdn.streamfarm.net/21001radio_cottbus/live/3142radio_cottbus/de_48.wma',
+ 'R.Crazy Oper' => 'http://stream2139.init7.net:80',
+ 'R.Dresden' => 'mms://stream.green.ch/RadioDresden',
+ 'R.Electracks' => 'http://peace.str3am.com:6390/',
+ 'R.Erding' => 'mms://stream.hitwelle.de/hitwelle',
+ 'R.Fantasy' => 'http://stream.fantasy.de:8000/radiofantasy.mp3',
+ 'R.Harmony' => 'mms://213.200.64.231/harmony$livestream.wma',
+ 'R.Hellwig' => 'http://s2.global-streaming.net:8100/',
+ 'R.Jumpstyle' => 'http://88.198.13.153:16055',
+ 'R.Kiepenkerl' => 'http://rs1.radiostreamer.com:8810',
+ 'R.Lausitz' => 'mms://stream.green.ch/RadioLausitz',
+ 'R.Leipzig' => 'mms://stream.green.ch/RadioLeipzig',
+ 'R.Melodie' => 'http://62.146.11.24/3107melodie_live.mp3',
+ 'R.Multikulti' => 'mms://stream2.rbb-online.de/wmtencoder/multikulti-live.wma',
+ 'R.Nachteule' => 'ttp://radio-nachteule.de:8010/',
+ 'R.Norderney' => 'http://radiosws.s2.onlinestream.de/listen1.m3u',
+ 'R.Primavera' => 'http://hellfireserver.de:8000/primavera.mp3',
+ 'R.Regenbogen' => 'mms://195.52.221.166/regenbogenweb$livestream.wma',
+ 'R1Live' => 'http://www.r1live.de:8000',
+ 'R2 Offbeat' => 'http://webchannels.sr-online.de:8000/sr2offbeat',
+ 'RBB 1' => 'mms://stream2.rbb-online.de/wmtencoder/radioeins-live.wma',
+ 'RBB Info' => 'mms://webstream1.rbb-online.de/wmtencoder/inforadio-live.wma',
+ 'RMN Power' => 'http://server.powerstream.de:30846',
+ 'RMN Relaxed' => 'http://server.rmnrelax.de:80/',
+ 'RMN Schlager' => 'http://server1.schlagerhoelle.de:30842/',
+ 'RMNradio' => 'http://streamserver1.radiomelodienet.de:8022/',
+ 'RPR1 Groove' => 'mms://217.151.151.46/RPR1-GROOVE-LOUNGE',
+ 'RPR1 Live' => 'mms://217.151.151.46/RPR1',
+ 'RPR1 Rock' => 'mms://217.151.151.46/RPR1-ROCK',
+ 'RPR1NewSongs' => 'mms://217.151.151.46/RPR1-NEW-SONGS',
+ 'RPR1RnB,Soul' => 'mms://217.151.151.46/RPR1-RnB',
+ 'RPR2' => 'mms://217.151.151.46/RPR2',
+ 'RSA Radio' => 'http://212.227.99.26:7000/rsa',
+ 'R.7' => 'http://213.251.129.69:8010/',
+ 'R.700' => 'http://s1.global-streaming.net:11600/',
+ 'R.AENA' => 'http://85.214.85.83:8055/dslTest',
+ 'R.FreeFM' => 'http://freefm.lauschangriff.org:8100',
+ 'R.Fritz' => 'mms://stream2.rbb-online.de/wmtencoder/fritz-live.wma',
+ 'R.Lippe' => 'http://stream.radiolippe.de:8000/live',
+ 'R.Mundus' => 'http://www.radiomundus.de:7000/',
+ 'R.SAW' => 'mms://195.52.221.166/radiosaw$livestream.wma',
+ 'R.TEDDY' => 'http://sc1.streamfox.com:9000',
+ 'R.21' => 'http://cdn1.ice.muc.streamin.de:80/radio21',
+ 'R.Sinnlos' => 'http://85.25.150.183:8300',
+ 'RockAnt' => 'http://mp3.webradio.rockantenne.de:80',
+ 'RockUnity' => 'http://relay.rockunity.com',
+ 'Rockland' => 'http://cdn1.ice.muc.streamin.de:80/rockland',
+ 'Rockradio' => 'http://rockradio.de:8090',
+ 'SPUTNIK Club' => 'http://62.146.66.19:80/22005mdr/live/3087mdr_sputnik_ch_club.mp3',
+ 'SPUTNIK Live' => 'http://d85195727.i.tis.core005.cdn.streamfarm.net:80/22005mdrsputnik/live/3087mdr_sputnik_live/de_96.mp3',
+ 'SPUTNIK Rock' => 'http://62.146.11.19:80/22005mdr/live/3087mdr_sputnik_ch_rock.mp3',
+ 'SPUTNIKBlack' => 'http://62.146.66.19:80/22005mdr/live/3087mdr_sputnik_ch_black.mp3',
+ 'SPUTNIKIntro' => 'http://62.146.11.19:80/22005mdr/live/3087mdr_sputnik_ch_cd1.mp3',
+ 'SR2 Offbeat ' => 'http://webchannels.sr-online.de:8000/sr2offbeat',
+ 'SR3-Schlager' => 'http://webchannels.sr-online.de:8000/sr3schlagerwelt',
+ 'SR3Oldiewelt' => 'http://webchannels.sr-online.de:8000/sr3oldiewelt',
+ 'SWR Contra' => 'mms://195.52.221.166/swrcontra$live.wma',
+ 'SWR1' => 'mms://213.200.75.252/swr$swr1$live_bw_44.wma',
+ 'SWR2' => 'mms://213.254.239.66/swr$swr2$live.wma',
+ 'SWR3' => 'mms://213.200.75.248/swr3$livestream.wma',
+ 'SWR3' => 'mms://213.254.239.66/swr3$livestream.wma',
+ 'SWR4' => 'mms://213.254.239.66/swr$swr4$live_rp.wma',
+ 'SachsAnhalt' => 'mms://wm-ipx-10.stream.tv1.de/22002mdr1sachsenanhalt/live/3087mdr_mdr1sa_live/de_44.wma',
+ 'Sachsen' => 'mms://wm-ipx-11.stream.tv1.de/22001mdr1sachsen/live/3087mdr_sachsen/de_44.wma',
+ 'ShFM Altern' => 'http://alternative.mthn.net:8700',
+ 'ShFM Black' => 'http://black.mthn.net:8300',
+ 'ShFM Break' => 'http://break.mthn.net:8800',
+ 'ShFM Club' => 'http://club.mthn.net:8200',
+ 'ShFM Elektro' => 'http://electro.mthn.net:8400',
+ 'ShFM House' => 'http://house.mthn.net:8500',
+ 'ShFM Main' => 'http://main.mthn.net:8000',
+ 'Solo Piano' => 'http://208.122.59.30:7794',
+ 'Sonnensender' => 'http://mystreamradio.com:3150/',
+ 'SoundBlack' => 'http://89.149.245.215:80/',
+ 'SoundExtrem' => 'http://89.149.245.201:80',
+ 'SoundHouse' => 'http://housestream.sound-generation.fm:80',
+ 'SoundPop' => 'http://88.198.125.141:80',
+ 'SoundTechno' => 'http://Clubstream.Sound-Generation.FM:11111',
+ 'Spreeradio' => 'MMS://D852143742.W.STO.CORE008.CDN.STREAMFARM.NET/23002SPREERADIO/LIVE/2925SPREERADIO_LIVE/DE_40.WMV',
+ 'Starlight' => 'http://87.118.64.200:8100/',
+ 'Suedstars' => 'http://stream1.suedstars-radio.de:8000/',
+ 'Sun.fm' => 'http://85.214.45.122:10224/',
+ 'Sunshine' => 'http://s2.global-streaming.net:9500',
+ 'TechnoBaseFM' => 'http://dsl.tb-stream.net:80',
+ 'Tiger-Radio' => 'http://85.25.150.17:8000',
+ 'Tillate.com' => 'http://s1.radio.tilllate.com:8080/tilllate_channel1',
+ 'Tillate.com' => 'http://s1.radio.tilllate.com:8080/tilllate_channel21',
+ 'Tillate11' => 'http://s1.radio.tilllate.com:8080/tilllate_channel11',
+ 'Top FM' => 'mms://www.top-fm-webstream.de/top_fm',
+ 'Troisdorf' => 'http://80.237.152.110:9000',
+ 'TruckRadio' => 'http://stream.truckradio.de:8000/',
+ 'TuneBase.FM' => 'http://listen.dsl.tunebase.fm',
+ 'UDing Black' => 'http://webchannels.sr-online.de:8000/unserding-schwarz',
+ 'UDingZukunft' => 'http://webchannels.sr-online.de:8000/unserding-zukunft',
+ 'VirgClassic' => 'http://ogg.smgradio.com/vc160.ogg',
+ 'VirgExtrem' => 'http://ogg.smgradio.com/vx160.ogg',
+ 'VirgGroove' => 'http://ogg.smgradio.com/gr160.ogg',
+ 'VirgRadio' => 'http://ogg.smgradio.com/vr160.ogg',
+ 'WDR Kiraka' => 'http://mp3.stream-a-lot.com/kiraka',
+ 'WDR2' => 'mms://a1367.l672223084.c6722.g.lm.akamaistream.net/D/1367/6722/v0001/reflector:23084',
+ 'WDR3' => 'mms://a1918.l1383638601.c13836.e.lm.akamaistream.net/D/1918/13836/v0001/reflector:38601',
+ 'WDR4' => 'mms://a473.l1383738602.c13837.e.lm.akamaistream.net/D/473/13837/v0001/reflector:38602',
+ 'WDR5' => 'mms://a28.l751837440.c7518.g.lm.akamaistream.net/D/28/7518/v0001/reflector:37440',
+ 'WGUC 90.9' => 'MMS://198.234.121.100/WGUCLIVE',
+ 'Webblaster' => 'http://streaming.wbr1.de:8000',
+ 'Webblaster2' => 'http://87.118.98.89:8010',
+ 'Wilantis' => 'http://217.18.179.34:8000/stream.ogg',
+ 'WoED.fm' => 'http://stream1-1.woed.de:80',
+ 'Wunschradio' => 'http://cdn1.ice.muc.streamin.de:80/wunschradio',
+ 'YOUFM' => 'mms://d85195725.w.tis.core005.cdn.streamfarm.net/17000hr/live/3219youfm/de_48.wma',
+ 'eaR1' => 'http://85.214.25.102:8010',
+ 'eaR2' => 'http://www.earadio.de:8010',
+ 'eaR3' => 'http://www.earadio.de:8020',
+ 'eaR4' => 'http://www.earadio.de:8040',
+ 'enSonic.FM' => 'http://stream.ensonic.fm:8500/',
+ 'jenny.fm' => 'http://stream2.jenny.fm:9000/',
+ 'GrooveSalad' => 'http://scfire-ntc-aa07.stream.aol.com:80/stream/1018',
+ 'SKYDream' => 'http://u12.sky.fm:80/sky_dreamscapes',
+ 'SKYCountry' => 'http://scfire-dtc-aa01.stream.aol.com:80/stream/1019',
+ '181.FM Hits' => 'http://sc-rly.181.fm:80/stream/1094',
+ 'KDFC' => 'http://6073.live.streamtheworld.com:80/KDFCFM_SC',
+ 'Classic FM' => 'http://media-ice.musicradio.com:80/ClassicFMMP3',
+ 'WCPE' => 'http://audio-mp3.ibiblio.org:8000/wcpe.mp3',
+ 'SKYPianoTrio' => 'http://72.26.204.28:6874/',
+ 'SKYDanceHits' => 'http://72.26.204.18:6844/',
+ 'Smooth Jazz' => 'http://scfire-mtc-aa04.stream.aol.com:80/stream/1005',
+ 'SKYSmoothJzz' => 'http://91.121.3.80:8000/',
+ 'SKYVocal' => 'http://u12.sky.fm:80/sky_vocalsmoothjazz',
+ 'SKYJazz' => 'http://205.188.215.227:8008/',
+ 'OndaTropical' => 'http://174.133.147.90:8000',
+ 'Latino Radio' => 'http://online.radiodifusion.net:8020/',
+ 'SalsaStream' => 'http://205.188.215.231:8010/',
+ 'SKYNew Age' => 'http://scfire-ntc-aa02.stream.aol.com:80/stream/1002',
+ 'AM 1710' => 'http://lin2.ash.fast-serv.com:9022/',
+ 'WNAR' => 'http://live.wnar-am.com:8500/',
+ 'SKY70s' => 'http://scfire-dtc-aa06.stream.aol.com:80/stream/1076',
+ 'SKY80s' => 'http://scfire-ntc-aa04.stream.aol.com:80/stream/1013',
+ 'SKYOldies' => 'http://91.121.3.80:8010/',
+ 'R.Paradise' => 'http://scfire-ntc-aa02.stream.aol.com:80/stream/1049',
+ '.977 Hitz' => 'http://scfire-mtc-aa04.stream.aol.com:80/stream/1074',
+ '80s SKY' => 'http://scfire-ntc-aa04.stream.aol.com:80/stream/1013',
+ 'SKYLoveMusic' => 'http://91.185.206.240:8000/',
+ 'SKYAlterRock' => 'http://80.94.69.106:6754/',
+ 'SKYClassRock' => 'http://80.94.69.106:6734/',
+ 'SKYSoloPiano' => 'http://scfire-ntc-aa04.stream.aol.com:80/stream/1004',
+ 'SKYChristian' => 'http://80.94.69.106:6784/',
+ 'SKYSoundtrks' => 'http://80.94.69.106:6774/',
+ );
############### Ende der Konfiguration #########################
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|