[girl] Prepare 9.5.0 release.
- From: Ole Aamot <ole src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [girl] Prepare 9.5.0 release.
- Date: Sun, 14 Aug 2016 19:19:07 +0000 (UTC)
commit 271e931526dabea17f5f8292d2fbb0a3e36b40f1
Author: Ole Aamot <oka oka no>
Date: Sun Aug 14 20:38:30 2016 +0200
Prepare 9.5.0 release.
NEWS | 8 +++-
configure | 11 +----
configure.ac | 3 +-
src/Makefile.am | 8 ++--
src/Makefile.in | 8 ++--
src/girl-gui.c | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++----
src/girl.c | 14 ++----
src/girl.h | 11 ++++-
src/girl.xml | 35 +++++++++++++++-
9 files changed, 176 insertions(+), 45 deletions(-)
---
diff --git a/NEWS b/NEWS
index 9ad0756..660f1d4 100644
--- a/NEWS
+++ b/NEWS
@@ -4,10 +4,14 @@ Version 9.5.0
GUI
* src/girl.c: Add translation credits for Laudivan Freire de Almeida
- * src/girl.[ch]: Add History callback
- * src/girl-gui.c: Add History button
* src/girl-station.c: Add and increment station_count variable
+Stations
+
+ * src/girl.xml: Add NRK Jazz (nrk.no)
+ * src/girl.xml: Add NRK Klassisk (nrk.no)
+ * src/girl.xml: Add NRK P13 (nrk.no)
+
Translations
* po/hu.po: Updated Hungarian translation by Balázs Meskó
diff --git a/configure b/configure
index 6c0379f..ac84c04 100755
--- a/configure
+++ b/configure
@@ -4333,14 +4333,12 @@ if test -n "$GIRL_CFLAGS"; then
if test -n "$PKG_CONFIG" && \
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.0 \\
glib-2.0 >= 2.40 \\
- gstreamer-1.0 >= 1.0 \\
libgnome-2.0 >= 2.0 \\
libgnomeui-2.0 >= 2.0 \\
libxml-2.0 >= 2.0 \\
gnome-vfs-2.0 >= 2.0\""; } >&5
($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.0 \
glib-2.0 >= 2.40 \
- gstreamer-1.0 >= 1.0 \
libgnome-2.0 >= 2.0 \
libgnomeui-2.0 >= 2.0 \
libxml-2.0 >= 2.0 \
@@ -4350,7 +4348,6 @@ if test -n "$GIRL_CFLAGS"; then
test $ac_status = 0; }; then
pkg_cv_GIRL_CFLAGS=`$PKG_CONFIG --cflags "gtk+-2.0 >= 2.0 \
glib-2.0 >= 2.40 \
- gstreamer-1.0 >= 1.0 \
libgnome-2.0 >= 2.0 \
libgnomeui-2.0 >= 2.0 \
libxml-2.0 >= 2.0 \
@@ -4368,14 +4365,12 @@ if test -n "$GIRL_LIBS"; then
if test -n "$PKG_CONFIG" && \
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.0 \\
glib-2.0 >= 2.40 \\
- gstreamer-1.0 >= 1.0 \\
libgnome-2.0 >= 2.0 \\
libgnomeui-2.0 >= 2.0 \\
libxml-2.0 >= 2.0 \\
gnome-vfs-2.0 >= 2.0\""; } >&5
($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.0 \
glib-2.0 >= 2.40 \
- gstreamer-1.0 >= 1.0 \
libgnome-2.0 >= 2.0 \
libgnomeui-2.0 >= 2.0 \
libxml-2.0 >= 2.0 \
@@ -4385,7 +4380,6 @@ if test -n "$GIRL_LIBS"; then
test $ac_status = 0; }; then
pkg_cv_GIRL_LIBS=`$PKG_CONFIG --libs "gtk+-2.0 >= 2.0 \
glib-2.0 >= 2.40 \
- gstreamer-1.0 >= 1.0 \
libgnome-2.0 >= 2.0 \
libgnomeui-2.0 >= 2.0 \
libxml-2.0 >= 2.0 \
@@ -4412,7 +4406,6 @@ fi
if test $_pkg_short_errors_supported = yes; then
GIRL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk+-2.0 >= 2.0 \
glib-2.0 >= 2.40 \
- gstreamer-1.0 >= 1.0 \
libgnome-2.0 >= 2.0 \
libgnomeui-2.0 >= 2.0 \
libxml-2.0 >= 2.0 \
@@ -4420,7 +4413,6 @@ fi
else
GIRL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-2.0 >= 2.0 \
glib-2.0 >= 2.40 \
- gstreamer-1.0 >= 1.0 \
libgnome-2.0 >= 2.0 \
libgnomeui-2.0 >= 2.0 \
libxml-2.0 >= 2.0 \
@@ -4431,7 +4423,6 @@ fi
as_fn_error $? "Package requirements (gtk+-2.0 >= 2.0 \
glib-2.0 >= 2.40 \
- gstreamer-1.0 >= 1.0 \
libgnome-2.0 >= 2.0 \
libgnomeui-2.0 >= 2.0 \
libxml-2.0 >= 2.0 \
@@ -4468,7 +4459,7 @@ $as_echo "yes" >&6; }
fi
-GIRL_PKG_DEPS="gtk+-2.0, glib-2.0, gstreamer-1.0, libgnome-2.0, libgnomeui-2.0, libxml-2.0, gnome-vfs-2.0"
+GIRL_PKG_DEPS="gtk+-2.0, glib-2.0, libgnome-2.0, libgnomeui-2.0, libxml-2.0, gnome-vfs-2.0"
diff --git a/configure.ac b/configure.ac
index 96697f4..0e2e24a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -51,13 +51,12 @@ AC_CHECK_LIB(m, pow, [], [], [])
PKG_CHECK_MODULES(GIRL,
gtk+-2.0 >= 2.0 \
glib-2.0 >= 2.40 \
- gstreamer-1.0 >= 1.0 \
libgnome-2.0 >= 2.0 \
libgnomeui-2.0 >= 2.0 \
libxml-2.0 >= 2.0 \
gnome-vfs-2.0 >= 2.0)
-GIRL_PKG_DEPS="gtk+-2.0, glib-2.0, gstreamer-1.0, libgnome-2.0, libgnomeui-2.0, libxml-2.0, gnome-vfs-2.0"
+GIRL_PKG_DEPS="gtk+-2.0, glib-2.0, libgnome-2.0, libgnomeui-2.0, libxml-2.0, gnome-vfs-2.0"
GTK_DOC_CHECK([1.16], [--flavour no-tmpl])
diff --git a/src/Makefile.am b/src/Makefile.am
index 75a52b6..61d31e4 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -24,7 +24,7 @@ test_endianess_CFLAGS = $(GIRL_CFLAGS) -DGIRL_DATADIR="\"$(pkgdatadir)\""
bin_PROGRAMS = girl
girl_SOURCES = \
girl-gui.c \
- girl-listener.c\
+ girl-listener.c \
girl-program.c \
girl-runners.c \
girl-station.c \
@@ -36,7 +36,7 @@ girl_SOURCES = \
girl_CFLAGS = $(GIRL_CFLAGS) \
-DGIRL_DATADIR=\"$(datadir)/girl\" \
-DDATADIR=\"$(datadir)\" \
- -DGIRL_DEBUG=0 \
+ -DGIRL_DEBUG=1 \
-DGIRL_CFG \
-DGIRL_HELPER_PLAYER=\"$(GIRL_HELPER_PLAYER)\" \
-DGIRL_HELPER_RECORD=\"$(GIRL_HELPER_RECORD)\" \
@@ -44,9 +44,9 @@ girl_CFLAGS = $(GIRL_CFLAGS) \
girl_LDADD = $(GIRL_LIBS)
girldir = $(datadir)/girl
-girl_DATA = girl-9.3.dtd girl-logo.png girl.png girl.xml
+girl_DATA = girl-9.5.dtd girl-logo.png girl.png girl.xml
-EXTRA_DIST = girl.h girl-station.h girl-stations-map.h girl-tz.h girl-gui.h girl-listener.h girl-program.h
girl-runners.h girl-streams.h girl-9.3.dtd girl-map.png girl-logo.png girl.png girl.xml
+EXTRA_DIST = girl.h girl-station.h girl-stations-map.h girl-tz.h girl-gui.h girl-listener.h girl-program.h
girl-runners.h girl-streams.h girl-9.5.dtd girl-map.png girl-logo.png girl.png girl.xml
all-local: check-local
diff --git a/src/Makefile.in b/src/Makefile.in
index b44859f..9e2f13e 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -380,7 +380,7 @@ test_endianess_LDADD = $(GIRL_LIBS)
test_endianess_CFLAGS = $(GIRL_CFLAGS) -DGIRL_DATADIR="\"$(pkgdatadir)\""
girl_SOURCES = \
girl-gui.c \
- girl-listener.c\
+ girl-listener.c \
girl-program.c \
girl-runners.c \
girl-station.c \
@@ -392,7 +392,7 @@ girl_SOURCES = \
girl_CFLAGS = $(GIRL_CFLAGS) \
-DGIRL_DATADIR=\"$(datadir)/girl\" \
-DDATADIR=\"$(datadir)\" \
- -DGIRL_DEBUG=0 \
+ -DGIRL_DEBUG=1 \
-DGIRL_CFG \
-DGIRL_HELPER_PLAYER=\"$(GIRL_HELPER_PLAYER)\" \
-DGIRL_HELPER_RECORD=\"$(GIRL_HELPER_RECORD)\" \
@@ -400,8 +400,8 @@ girl_CFLAGS = $(GIRL_CFLAGS) \
girl_LDADD = $(GIRL_LIBS)
girldir = $(datadir)/girl
-girl_DATA = girl-9.3.dtd girl-logo.png girl.png girl.xml
-EXTRA_DIST = girl.h girl-station.h girl-stations-map.h girl-tz.h girl-gui.h girl-listener.h girl-program.h
girl-runners.h girl-streams.h girl-9.3.dtd girl-map.png girl-logo.png girl.png girl.xml
+girl_DATA = girl-9.5.dtd girl-logo.png girl.png girl.xml
+EXTRA_DIST = girl.h girl-station.h girl-stations-map.h girl-tz.h girl-gui.h girl-listener.h girl-program.h
girl-runners.h girl-streams.h girl-9.5.dtd girl-map.png girl-logo.png girl.png girl.xml
all: all-am
.SUFFIXES:
diff --git a/src/girl-gui.c b/src/girl-gui.c
index 73bc1e6..5497104 100644
--- a/src/girl-gui.c
+++ b/src/girl-gui.c
@@ -41,6 +41,7 @@
#include <libgnome/libgnome.h>
/* #include <libgnome/gnome-desktop-item.h> */
#include <gtk/gtk.h>
+#include <gtk/gtkcombobox.h>
#include <glib/gstdio.h>
#include "girl.h"
#include "girl-gui.h"
@@ -59,10 +60,6 @@ GnomeUIInfo toolbar[] = {
on_search_button_clicked,
GTK_STOCK_FIND),
GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_STOCK(N_("History"), N_("History of radio stations"),
- on_history_button_clicked,
- GTK_STOCK_HARDDISK),
- GNOMEUIINFO_SEPARATOR,
GNOMEUIINFO_ITEM_STOCK(N_("Listen"), N_("Listen to selected radio station"),
on_listen_button_clicked,
GTK_STOCK_MEDIA_PLAY),
@@ -108,6 +105,112 @@ GnomeUIInfo toolbar[] = {
*/
+/* This is the signal handler that got connected to button
+ * press/release events of the List
+ */
+void sigh_button_event( GtkWidget *gtklist,
+ GdkEventButton *event,
+ GtkWidget *frame )
+{
+ /* We only do something if the third (rightmost mouse button
+ * was released
+ */
+ if (event->type==GDK_BUTTON_RELEASE &&
+ event->button==3) {
+ GList *dlist, *free_list;
+ GtkWidget *new_station;
+
+ /* Fetch the currently selected list item which
+ * will be our next station ;)
+ */
+ dlist=GTK_LIST(gtklist)->selection;
+ if (dlist)
+ new_station=GTK_WIDGET(dlist->data);
+ else
+ new_station=NULL;
+
+ /* Look for already imprisoned list items, we
+ * will put them back into the list.
+ * Remember to free the doubly linked list that
+ * gtk_container_children() returns
+ */
+ dlist=gtk_container_children(GTK_CONTAINER(frame));
+ free_list=dlist;
+ while (dlist) {
+ GtkWidget *list_item;
+
+ list_item=dlist->data;
+
+ gtk_widget_reparent(list_item, gtklist);
+
+ dlist=dlist->next;
+ }
+ g_list_free(free_list);
+
+ /* If we have a new station, remove station from the
+ * List and put station into the frame "Station History".
+ * We need to unselect the item first.
+ */
+ if (new_station) {
+ GList static_dlist;
+
+ static_dlist.data=new_station;
+ // static_dlist.next=NULL;
+ // static_dlist.prev=NULL;
+
+ gtk_list_unselect_child(GTK_LIST(gtklist),
+ new_station);
+ gtk_widget_reparent(new_station, frame);
+ }
+ }
+}
+
+/* This is the signal handler that gets called if List
+ * emits the "selection_changed" signal
+ */
+void sigh_print_selection( GtkWidget *gtklist,
+ gpointer func_data )
+{
+ GList *dlist;
+
+ /* Fetch the doubly linked list of selected items
+ * of the List, remember to treat this as read-only!
+ */
+ dlist=GTK_LIST(gtklist)->selection;
+
+ /* If there are no selected items there is nothing more
+ * to do than just telling the user so
+ */
+ if (!dlist) {
+ g_print("Selection cleared\n");
+ return;
+ }
+ /* Ok, we got a selection and so we print it
+ */
+ g_print("The selection is a ");
+
+
+ /* Get the list item from the doubly linked list
+ * and then query the data associated with list_item_data_key.
+ * We then just print it */
+ while (dlist) {
+ GtkObject *list_item;
+ gchar *item_data_string;
+
+ list_item=GTK_OBJECT(dlist->data);
+ item_data_string=gtk_object_get_data(list_item,
+ list_item_data_key);
+ appbar_send_msg(_("Playing %s"), item_data_string);
+
+ girl_helper_run(item_data_string,
+ "Historic station",
+ GIRL_STREAM_SHOUTCAST,
+ GIRL_STREAM_PLAYER);
+
+ dlist=dlist->next;
+ }
+}
+
GtkWidget *create_listeners_selector(char *selected_listener_uri,
char *filename)
{
@@ -1086,28 +1189,28 @@ GtkWidget *create_streams_selector(char *selected_streams_uri,
#if 0
static void station_print_selection(GtkWidget * list, gpointer func_data)
{
- GList *dlist;
- /* dlist = GTK_LIST(list)->selection; */
+ GList *girl_history;
+ girl_history = GTK_LIST(list)->selection;
- if (!dlist) {
+ if (!girl_history) {
g_print(_("Selection cleared!\n"));
return;
}
g_print("The selection is a ");
- while (dlist) {
+ while (girl_history) {
GtkObject *list_item;
gchar *item_data_string;
- list_item = dlist->data;
+ list_item = girl_history->data;
item_data_string =
g_object_get_data(G_OBJECT(list_item),
"station_list_item_data");
g_print("%s ", item_data_string);
- dlist = dlist->next;
+ girl_history = girl_history->next;
}
g_print("\n");
}
diff --git a/src/girl.c b/src/girl.c
index 2dc324e..bbed360 100644
--- a/src/girl.c
+++ b/src/girl.c
@@ -45,7 +45,6 @@ GList *girl_listeners;
GList *girl_programs;
GList *girl_stations;
GList *girl_streams;
-GList *girl_history;
GtkWidget *girl_app;
GtkWidget *archivers_selector = NULL;
@@ -55,6 +54,8 @@ GtkWidget *stations_selector = NULL;
GtkWidget *streams_selector = NULL;
GtkWidget *search_selector = NULL;
+gchar *list_item_data_key ="list_item_data";
+
int main(int argc, char *argv[])
{
gchar *iconname;
@@ -86,7 +87,7 @@ int main(int argc, char *argv[])
/* Set up the channels list */
stations_selector = create_stations_selector(girl->selected_station_uri,
"girl.xml");
-
+
/* /\* Set up the stations list *\/ */
/* stations_selector = create_stations_selector(girl->selected_station_uri, */
/* "girl.xml"); */
@@ -97,7 +98,7 @@ int main(int argc, char *argv[])
g_object_add_weak_pointer(G_OBJECT(stations_selector),
(void **) &(stations_selector));
-
+
/* g_object_add_weak_pointer(G_OBJECT(stations_selector), */
/* (void **) &(stations_selector)); */
@@ -822,11 +823,6 @@ void about_streams(GtkWidget * a, gpointer user_data)
}
-void on_history_button_clicked(GtkWidget *a, gpointer user_data)
-{
- girl_history = g_list_insert(girl_history, (gchar*)girl->selected_station_name,
girl->current_station_number++);
- appbar_send_msg(_("Added %s to history of radio stations as station #%i"),
girl->selected_station_name, girl->current_station_number);
-}
void on_search_button_clicked(GtkWidget *a, gpointer user_data)
{
@@ -840,12 +836,12 @@ void on_search_button_clicked(GtkWidget *a, gpointer user_data)
void on_listen_button_clicked(GtkWidget *a, gpointer user_data)
{
+
appbar_send_msg(_("Listening to the radio station %s in %s: %s "),
girl->selected_station_name,
girl->selected_station_location,
girl->selected_station_uri,
girl->selected_station_band);
-
girl_helper_run(girl->selected_station_uri,
girl->selected_station_name,
GIRL_STREAM_SHOUTCAST,
diff --git a/src/girl.h b/src/girl.h
index 7054263..5d5b23f 100644
--- a/src/girl.h
+++ b/src/girl.h
@@ -76,7 +76,6 @@ gint girl_archive_new(gchar *title, gchar *file, gchar *codec);
/* Fetcher for the channels */
void girl_helper_run(char *url, char *name, GirlStreamType type, GirlHelperType girl);
-void on_history_button_clicked(GtkWidget *a, gpointer user_data);
void on_search_button_clicked(GtkWidget * button, gpointer user_data);
void on_listen_button_clicked(GtkWidget * button, gpointer user_data);
void on_record_button_clicked(GtkWidget * button, gpointer user_data);
@@ -162,6 +161,14 @@ extern GList *girl_listeners;
extern GList *girl_programs;
extern GList *girl_stations;
extern GList *girl_streams;
-extern GList *girl_history;
+
+extern gchar *list_item_data_key;
+
+static void sigh_print_selection( GtkWidget *gtklist,
+ gpointer func_data);
+
+static void sigh_button_event( GtkWidget *gtklist,
+ GdkEventButton *event,
+ GtkWidget *frame );
#endif /* GIRL_H */
diff --git a/src/girl.xml b/src/girl.xml
index 2d0b54d..4077c67 100644
--- a/src/girl.xml
+++ b/src/girl.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="girl.xsl" ?>
-<!DOCTYPE girl SYSTEM "girl-9.3.dtd">
-<girl version="9.4.0">
+<!DOCTYPE girl SYSTEM "girl-9.5.dtd">
+<girl version="9.5.0">
<station band="CIUT" id="ciut" lang="en" name="CIUT" rank="1.0" type="edu">
<frequency uri="http://www.ciut.fm/">89.5 FM in Toronto, Canada</frequency>
<location>Toronto, Canada</location>
@@ -260,6 +260,17 @@ WUMR has been the University of Memphis broadcasting outlet since 1979, when Sou
<stream mime="audio/mpeg" uri="http://lyd.nrk.no/nrk_radio_p3_aac_h" codec="MPEG 1 Audio, Layer 3 (MP3)"
samplerate="44100 Hz" channels="Stereo" bitrate="128 kbps" />
<uri>http://www.nrk.no/p3</uri>
</station>
+ <station band="ONLINE" id="nrkp13" lang="no" name="NRK P13" rank="1.0" type="gov">
+ <frequency uri="https://www.nrk.no/p13">ONLINE in Oslo, Norway</frequency>
+ <location>Oslo, Norway</location>
+ <description lang="en">
+ NRK P13 is a Norwegian digital radio station, run by the Norwegian Broadcasting Corporation.
+ NRK P13 launched on January 28th 2014.
+ The station is broadcast on DAB, Internet radio and digital television and plays mainly rock and indie
music.
+ </description>
+ <stream mime="audio/mpeg" uri="http://lyd.nrk.no/nrk_radio_p13_aac_h" codec="MPEG 1 Audio, Layer 3
(MP3)" samplerate="44100 Hz" channels="Stereo" bitrate="128 kbps" />
+ <uri>http://radio.nrk.no/direkte/p13</uri>
+ </station>
<station band="ONLINE" id="nrkurort" lang="no" name="NRK Urørt" rank="1.0" type="gov">
<frequency uri="http://www.nrk.no/urort/">ONLINE in Oslo, Norway</frequency>
<location>Oslo, Norway</location>
@@ -269,6 +280,26 @@ WUMR has been the University of Memphis broadcasting outlet since 1979, when Sou
<stream mime="audio/mpeg" uri="http://lyd.nrk.no/nrk_radio_p3_urort_aac_h" codec="MPEG 1 Audio, Layer 3
(MP3)" samplerate="44100 Hz" channels="Stereo" bitrate="128 kbps" />
<uri>http://urort.p3.no</uri>
</station>
+ <station band="ONLINE" id="nrkjazz" lang="no" name="NRK Jazz" rank="1.0" type="gov">
+ <frequency uri="https://radio.nrk.no/direkte/jazz">ONLINE in Oslo, Norway</frequency>
+ <location>Oslo, Norway</location>
+ <description lang="en">
+ NRK Jazz is a Norwegian radio station operated by the Norwegian Broadcasting Corporation (NRK) that
broadcasts jazz on DAB Digital Radio and the internet.
+ </description>
+ <stream mime="audio/mpeg" uri="http://lyd.nrk.no/nrk_radio_jazz_aac_h" codec="MPEG 1 Audio, Layer 3
(MP3)" samplerate="44100 Hz" channels="Stereo" bitrate="128 kbps" />
+ <uri>https://radio.nrk.no/direkte/jazz</uri>
+ </station>
+ <station band="ONLINE" id="nrkklassisk" lang="no" name="NRK Klassisk" rank="1.0" type="gov">
+ <frequency uri="https://www.nrk.no/arkiv/artikkel/radiokanalen-nrk-klassisk-1.5318146">ONLINE in Oslo,
Norway</frequency>
+ <location>Oslo, Norway</location>
+ <description lang="en">
+ NRK Klassisk is a digital radio channel operated by the Norwegian Broadcasting Corporation (NRK) which
broadcasts classical music 24 hours a day.
+ NRK Klassisk was launched in Oslo on 1 June 1995 as the world’s first all-digital radio station (DAB),
broadcasting 24 hours a day. The BBC and Swedish Radio, which launched their first digital radio stations in
September 1995, caused NRK to bring forward its plans, so as to be the first in the world to use the DAB
radio standard (Eureka 147).
+ Right from the start, the channel was in operation 24 hours a day with a staff of six, in a totally
digital programme chain from production via DAB transmitter to receiver.
+ </description>
+ <stream mime="audio/mpeg" uri="http://lyd.nrk.no/nrk_radio_klassisk_aac_h" codec="MPEG 1 Audio, Layer 3
(MP3)" samplerate="44100 Hz" channels="Stereo" bitrate="128 kbps" />
+ <uri>https://radio.nrk.no/direkte/klassisk</uri>
+ </station>
<station band="104.5FM" id="uctradio" lang="en" name="UCT Radio" rank="1.0" type="edu">
<frequency uri="http://www.radio.uct.ac.za/">104.5 FM in Cape Town, South Africa</frequency>
<location>Cape Town, South Africa</location>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]