[girl] girl version 0.6.1



commit 934fe1d5d5129f6c4ace2967092a707750afbad9
Author: Ole Aamot <oka oka no>
Date:   Sun Dec 7 16:56:37 2014 +0100

    girl version 0.6.1

 ChangeLog                      |   19 ++++
 Makefile.in                    |    4 +-
 NEWS                           |   15 +++
 THANKS                         |    3 +-
 configure                      |  223 ++++++++++++++++++++++++++++++++++------
 configure.ac                   |   36 ++++++-
 data/Makefile.in               |    4 +-
 data/girl.appdata.xml.in       |    2 +-
 data/icons/16x16/Makefile.in   |    4 +-
 data/icons/22x22/Makefile.in   |    4 +-
 data/icons/24x24/Makefile.in   |    4 +-
 data/icons/256x256/Makefile.in |    4 +-
 data/icons/32x32/Makefile.in   |    4 +-
 data/icons/48x48/Makefile.in   |    4 +-
 data/icons/Makefile.in         |    4 +-
 data/pixmaps/Makefile.in       |    4 +-
 data/screenshot.png            |  Bin 164831 -> 142688 bytes
 girl.doap                      |    2 +-
 girl.spec.in                   |    8 ++-
 src/Makefile.am                |    8 +-
 src/Makefile.in                |   17 ++--
 src/girl-gui.c                 |  166 ++++++++++++++++++++++++++++--
 src/girl-station.c             |   95 +++++++++++++-----
 src/girl-station.h             |   14 +---
 src/girl.c                     |  186 ++++++++++++++++++++++++++++------
 src/girl.h                     |   34 ++++++-
 src/programs-0.1.dtd           |   17 +++
 27 files changed, 742 insertions(+), 143 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 92c460e..c7b564b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2014-12-07  Ole Aamot  <oka oka no>
+
+       * NEWS: Release girl version 0.6.1
+       * THANKS: Add Ettore Perazzoli and Bernd Homuth.
+       * configure.ac: Check for GIRL_HELPER_PLAYER (totem)
+       * configure.ac: Check for GIRL_HELPER_RECORD (streamripper)
+       * configure.ac: Check for and define HAVE_GIRL_RECORD
+       * src/Makefile.am: Add GIRL_HELPER_PLAYER, GIRL_HELPER_RECORD
+       * src/girl-gui.c: Add menu item if GIRL_HELPER_RECORD is defined
+       * src/girl-program.c: New file with support for programs
+       * src/girl-station.c: Rename girl_launch_helper to girl_helper_run
+       * src/girl-station.h: Remove GirlChannels and GirlStreamType
+       * src/girl.c: Add programs feature
+       * src/girl.h: Add enums GirlChannels, GirlStreamType, GirlHelperType
+
+2014-12-06  Ole Aamot  <oka oka no>
+
+       * configure.ac: Bump version to 0.6.1.
+
 2014-12-06  Ole Aamot  <oka oka no>
 
        * NEWS: girl 0.6.0 released.
diff --git a/Makefile.in b/Makefile.in
index 4434c53..86bb5bc 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -217,12 +217,14 @@ EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIRL_CFLAGS = @GIRL_CFLAGS@
-GIRL_HELPER = @GIRL_HELPER@
+GIRL_HELPER_PLAYER = @GIRL_HELPER_PLAYER@
+GIRL_HELPER_RECORD = @GIRL_HELPER_RECORD@
 GIRL_LIBS = @GIRL_LIBS@
 GIRL_PKG_DEPS = @GIRL_PKG_DEPS@
 GMOFILES = @GMOFILES@
 GMSGFMT = @GMSGFMT@
 GREP = @GREP@
+HAVE_GIRL_RECORD = @HAVE_GIRL_RECORD@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
diff --git a/NEWS b/NEWS
index 62ada79..9a560b4 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,18 @@
+2014-12-07  Ole Aamot  <oka linux oka no>
+
+       * girl version 0.6.1 release.
+       * THANKS: Add Ettore Perazzoli and Bernd Homuth.
+       * configure.ac: Check for GIRL_HELPER_PLAYER (totem)
+       * configure.ac: Check for GIRL_HELPER_RECORD (streamripper)
+       * configure.ac: Check for and define HAVE_GIRL_RECORD
+       * src/Makefile.am: Add GIRL_HELPER_PLAYER, GIRL_HELPER_RECORD
+       * src/girl-gui.c: Add menu item if GIRL_HELPER_RECORD is defined
+       * src/girl-program.c: New file with support for programs
+       * src/girl-station.c: Rename girl_launch_helper to girl_helper_run
+       * src/girl-station.h: Remove GirlChannels and GirlStreamType
+       * src/girl.c: Add programs feature
+       * src/girl.h: Add enums GirlChannels, GirlStreamType, GirlHelperType
+
 2014-12-06  Ole Aamot  <oka oka no>
 
        * girl version 0.6.0 release.
diff --git a/THANKS b/THANKS
index 77c17eb..1465aec 100644
--- a/THANKS
+++ b/THANKS
@@ -3,4 +3,5 @@ Richard Hughes for tips on adding data/girl.app.data.xml and data/girl.desktop.i
 Federico Mena Quintero for launching the GNOME project and writing GNOME Canvas
 Piotr Drąg for fixing minor typos in src/girl-station.c
 Hans Petter Jansson for help with debugging GNOME VFS.
-Ettore Perazzoli (June 15, 1974 - December 10, 2003) for GNOME VFS.
\ No newline at end of file
+Ettore Perazzoli (June 15, 1974 - December 10, 2003) for GNOME VFS.
+Bernd Homuth for minor spelling correction.
diff --git a/configure b/configure
index d95c324..ae43f5c 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for girl 0.6.0.
+# Generated by GNU Autoconf 2.69 for girl 0.6.1.
 #
 #
 # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@@ -577,8 +577,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='girl'
 PACKAGE_TARNAME='girl'
-PACKAGE_VERSION='0.6.0'
-PACKAGE_STRING='girl 0.6.0'
+PACKAGE_VERSION='0.6.1'
+PACKAGE_STRING='girl 0.6.1'
 PACKAGE_BUGREPORT=''
 PACKAGE_URL=''
 
@@ -680,7 +680,11 @@ GIRL_CFLAGS
 PKG_CONFIG_LIBDIR
 PKG_CONFIG_PATH
 PKG_CONFIG
-GIRL_HELPER
+HAVE_GIRL_RECORD
+HAVE_GIRL_RECORD_FALSE
+HAVE_GIRL_RECORD_TRUE
+GIRL_HELPER_RECORD
+GIRL_HELPER_PLAYER
 am__fastdepCC_FALSE
 am__fastdepCC_TRUE
 CCDEPMODE
@@ -768,6 +772,7 @@ ac_user_opts='
 enable_option_checking
 enable_silent_rules
 enable_dependency_tracking
+with_recording
 enable_nls
 '
       ac_precious_vars='build_alias
@@ -1324,7 +1329,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures girl 0.6.0 to adapt to many kinds of systems.
+\`configure' configures girl 0.6.1 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1390,7 +1395,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of girl 0.6.0:";;
+     short | recursive ) echo "Configuration of girl 0.6.1:";;
    esac
   cat <<\_ACEOF
 
@@ -1406,6 +1411,11 @@ Optional Features:
                           speeds up one-time build
   --disable-nls           do not use Native Language Support
 
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-recording        Support recording with streamripper
+
 Some influential environment variables:
   CC          C compiler command
   CFLAGS      C compiler flags
@@ -1489,7 +1499,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-girl configure 0.6.0
+girl configure 0.6.1
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1854,7 +1864,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by girl $as_me 0.6.0, which was
+It was created by girl $as_me 0.6.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2717,7 +2727,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='girl'
- VERSION='0.6.0'
+ VERSION='0.6.1'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -3860,12 +3870,12 @@ if test -n "$ac_tool_prefix"; then
 set dummy ${ac_tool_prefix}totem; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_GIRL_HELPER+:} false; then :
+if ${ac_cv_path_GIRL_HELPER_PLAYER+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  case $GIRL_HELPER in
+  case $GIRL_HELPER_PLAYER in
   [\\/]* | ?:[\\/]*)
-  ac_cv_path_GIRL_HELPER="$GIRL_HELPER" # Let the user override the test with a path.
+  ac_cv_path_GIRL_HELPER_PLAYER="$GIRL_HELPER_PLAYER" # Let the user override the test with a path.
   ;;
   *)
   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -3875,7 +3885,7 @@ do
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
   if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_GIRL_HELPER="$as_dir/$ac_word$ac_exec_ext"
+    ac_cv_path_GIRL_HELPER_PLAYER="$as_dir/$ac_word$ac_exec_ext"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -3886,10 +3896,10 @@ IFS=$as_save_IFS
   ;;
 esac
 fi
-GIRL_HELPER=$ac_cv_path_GIRL_HELPER
-if test -n "$GIRL_HELPER"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GIRL_HELPER" >&5
-$as_echo "$GIRL_HELPER" >&6; }
+GIRL_HELPER_PLAYER=$ac_cv_path_GIRL_HELPER_PLAYER
+if test -n "$GIRL_HELPER_PLAYER"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GIRL_HELPER_PLAYER" >&5
+$as_echo "$GIRL_HELPER_PLAYER" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
@@ -3897,18 +3907,18 @@ fi
 
 
 fi
-if test -z "$ac_cv_path_GIRL_HELPER"; then
-  ac_pt_GIRL_HELPER=$GIRL_HELPER
+if test -z "$ac_cv_path_GIRL_HELPER_PLAYER"; then
+  ac_pt_GIRL_HELPER_PLAYER=$GIRL_HELPER_PLAYER
   # Extract the first word of "totem", so it can be a program name with args.
 set dummy totem; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_ac_pt_GIRL_HELPER+:} false; then :
+if ${ac_cv_path_ac_pt_GIRL_HELPER_PLAYER+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  case $ac_pt_GIRL_HELPER in
+  case $ac_pt_GIRL_HELPER_PLAYER in
   [\\/]* | ?:[\\/]*)
-  ac_cv_path_ac_pt_GIRL_HELPER="$ac_pt_GIRL_HELPER" # Let the user override the test with a path.
+  ac_cv_path_ac_pt_GIRL_HELPER_PLAYER="$ac_pt_GIRL_HELPER_PLAYER" # Let the user override the test with a 
path.
   ;;
   *)
   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -3918,7 +3928,80 @@ do
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
   if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_ac_pt_GIRL_HELPER="$as_dir/$ac_word$ac_exec_ext"
+    ac_cv_path_ac_pt_GIRL_HELPER_PLAYER="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_GIRL_HELPER_PLAYER=$ac_cv_path_ac_pt_GIRL_HELPER_PLAYER
+if test -n "$ac_pt_GIRL_HELPER_PLAYER"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_GIRL_HELPER_PLAYER" >&5
+$as_echo "$ac_pt_GIRL_HELPER_PLAYER" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_GIRL_HELPER_PLAYER" = x; then
+    GIRL_HELPER_PLAYER="/usr/bin/totem"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    GIRL_HELPER_PLAYER=$ac_pt_GIRL_HELPER_PLAYER
+  fi
+else
+  GIRL_HELPER_PLAYER="$ac_cv_path_GIRL_HELPER_PLAYER"
+fi
+
+
+record_msg="no (http://streamripper.sf.net/)"
+try_record=:
+girl_record=false
+
+# Check whether --with-recording was given.
+if test "${with_recording+set}" = set; then :
+  withval=$with_recording;
+       if test x$withval = xno; then
+          try_record=false
+          record_msg = "no (not requested)"
+       fi
+
+fi
+
+record_prefix=$ac_default_prefix
+
+if $try_record; then
+   if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}streamripper", so it can be a program name with args.
+set dummy ${ac_tool_prefix}streamripper; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GIRL_HELPER_RECORD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $GIRL_HELPER_RECORD in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GIRL_HELPER_RECORD="$GIRL_HELPER_RECORD" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR                                         
/usr/sbin$PATH_SEPARATOR/usr/etc$PATH_SEPARATOR/etc
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_GIRL_HELPER_RECORD="$as_dir/$ac_word$ac_exec_ext"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -3929,17 +4012,60 @@ IFS=$as_save_IFS
   ;;
 esac
 fi
-ac_pt_GIRL_HELPER=$ac_cv_path_ac_pt_GIRL_HELPER
-if test -n "$ac_pt_GIRL_HELPER"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_GIRL_HELPER" >&5
-$as_echo "$ac_pt_GIRL_HELPER" >&6; }
+GIRL_HELPER_RECORD=$ac_cv_path_GIRL_HELPER_RECORD
+if test -n "$GIRL_HELPER_RECORD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GIRL_HELPER_RECORD" >&5
+$as_echo "$GIRL_HELPER_RECORD" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 fi
 
-  if test "x$ac_pt_GIRL_HELPER" = x; then
-    GIRL_HELPER="/usr/bin/totem"
+
+fi
+if test -z "$ac_cv_path_GIRL_HELPER_RECORD"; then
+  ac_pt_GIRL_HELPER_RECORD=$GIRL_HELPER_RECORD
+  # Extract the first word of "streamripper", so it can be a program name with args.
+set dummy streamripper; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_GIRL_HELPER_RECORD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_GIRL_HELPER_RECORD in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_GIRL_HELPER_RECORD="$ac_pt_GIRL_HELPER_RECORD" # Let the user override the test with a 
path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR                                         
/usr/sbin$PATH_SEPARATOR/usr/etc$PATH_SEPARATOR/etc
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_ac_pt_GIRL_HELPER_RECORD="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_GIRL_HELPER_RECORD=$ac_cv_path_ac_pt_GIRL_HELPER_RECORD
+if test -n "$ac_pt_GIRL_HELPER_RECORD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_GIRL_HELPER_RECORD" >&5
+$as_echo "$ac_pt_GIRL_HELPER_RECORD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_GIRL_HELPER_RECORD" = x; then
+    GIRL_HELPER_RECORD="/usr/bin/streamripper"
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
@@ -3947,13 +4073,40 @@ yes:)
 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
-    GIRL_HELPER=$ac_pt_GIRL_HELPER
+    GIRL_HELPER_RECORD=$ac_pt_GIRL_HELPER_RECORD
   fi
 else
-  GIRL_HELPER="$ac_cv_path_GIRL_HELPER"
+  GIRL_HELPER_RECORD="$ac_cv_path_GIRL_HELPER_RECORD"
+fi
+
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for recording" >&5
+$as_echo_n "checking for recording... " >&6; }
+       if test -n "${GIRL_HELPER_RECORD}"; then
+
+$as_echo "#define HAVE_GIRL_RECORD 1" >>confdefs.h
+
+          record_msg="yes"
+          girl_record=true
+       else
+
+$as_echo "#define HAVE_GIRL_RECORD 0" >>confdefs.h
+
+          record_msg="no"
+          girl_record=false
+        fi
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $record_msg" >&5
+$as_echo "$record_msg" >&6; }
+fi
+ if $girl_record; then
+  HAVE_GIRL_RECORD_TRUE=
+  HAVE_GIRL_RECORD_FALSE='#'
+else
+  HAVE_GIRL_RECORD_TRUE='#'
+  HAVE_GIRL_RECORD_FALSE=
 fi
 
 
+
 # Checks for libraries.
 
 
@@ -6149,6 +6302,10 @@ if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
   as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${HAVE_GIRL_RECORD_TRUE}" && test -z "${HAVE_GIRL_RECORD_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_GIRL_RECORD\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 
   ac_config_commands="$ac_config_commands po/stamp-it"
 
@@ -6550,7 +6707,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by girl $as_me 0.6.0, which was
+This file was extended by girl $as_me 0.6.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -6616,7 +6773,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-girl config.status 0.6.0
+girl config.status 0.6.1
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff --git a/configure.ac b/configure.ac
index 61d66ef..1e2dfd0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2,7 +2,7 @@
 # Process this file with autoconf to produce a configure script.
 
 AC_PREREQ(2.59)
-AC_INIT(girl, 0.6.0)
+AC_INIT(girl, 0.6.1)
 AM_INIT_AUTOMAKE([no-dist-gzip dist-xz])
 AC_CONFIG_SRCDIR([src/girl.c])
 AC_CONFIG_HEADER([config.h])
@@ -11,10 +11,40 @@ AC_CONFIG_HEADER([config.h])
 AC_PROG_CC
 # AC_PROG_LIBTOOL
 
-AC_PATH_TOOL([GIRL_HELPER], [totem], [/usr/bin/totem],
+AC_PATH_TOOL([GIRL_HELPER_PLAYER], [totem], [/usr/bin/totem],
              [$PATH$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR]dnl
      [/usr/sbin$PATH_SEPARATOR/usr/etc$PATH_SEPARATOR/etc])
 
+record_msg="no (http://streamripper.sf.net/)"
+try_record=:
+girl_record=false
+AC_ARG_WITH([recording],AS_HELP_STRING([--with-recording],[Support recording with streamripper]), [
+       if test x$withval = xno; then
+          try_record=false
+          record_msg = "no (not requested)"
+       fi
+])
+record_prefix=$ac_default_prefix
+
+if $try_record; then
+   AC_PATH_TOOL([GIRL_HELPER_RECORD], [streamripper], [/usr/bin/streamripper],
+                                          [$PATH$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR]dnl
+                                          [/usr/sbin$PATH_SEPARATOR/usr/etc$PATH_SEPARATOR/etc])
+       AC_MSG_CHECKING([for recording])
+       if test -n "${GIRL_HELPER_RECORD}"; then
+          AC_DEFINE([HAVE_GIRL_RECORD],1,[have record])
+          record_msg="yes"
+          girl_record=true
+       else
+          AC_DEFINE([HAVE_GIRL_RECORD],0,[don't have record])
+          record_msg="no"
+          girl_record=false
+        fi
+       AC_MSG_RESULT([$record_msg])
+fi
+AM_CONDITIONAL([HAVE_GIRL_RECORD], [$girl_record])
+AC_SUBST([HAVE_GIRL_RECORD])
+
 # Checks for libraries.
 
 PKG_CHECK_MODULES(GIRL,
@@ -50,7 +80,7 @@ AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [Gettext package.])
 AC_SUBST(GIRL_LIBS)
 AC_SUBST(GIRL_CFLAGS)
 AC_SUBST(GIRL_PKG_DEPS)
-AC_SUBST(GIRL_HELPER)
+AC_SUBST(GIRL_HELPER_PLAYER)
 
 AC_OUTPUT([
 Makefile
diff --git a/data/Makefile.in b/data/Makefile.in
index 9e68e3f..f150b5c 100644
--- a/data/Makefile.in
+++ b/data/Makefile.in
@@ -224,12 +224,14 @@ EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIRL_CFLAGS = @GIRL_CFLAGS@
-GIRL_HELPER = @GIRL_HELPER@
+GIRL_HELPER_PLAYER = @GIRL_HELPER_PLAYER@
+GIRL_HELPER_RECORD = @GIRL_HELPER_RECORD@
 GIRL_LIBS = @GIRL_LIBS@
 GIRL_PKG_DEPS = @GIRL_PKG_DEPS@
 GMOFILES = @GMOFILES@
 GMSGFMT = @GMSGFMT@
 GREP = @GREP@
+HAVE_GIRL_RECORD = @HAVE_GIRL_RECORD@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
diff --git a/data/girl.appdata.xml.in b/data/girl.appdata.xml.in
index e050ea4..78f778a 100644
--- a/data/girl.appdata.xml.in
+++ b/data/girl.appdata.xml.in
@@ -4,7 +4,7 @@
   <licence>CC0</licence>
   <description>
     <_p>
-      Girl, the GNOME Internet Radio Locator program, allow users
+      Girl, the GNOME Internet Radio Locator program, allows users
       to easily find live radio programs on radio broadcasters on
       the Internet.
     </_p>
diff --git a/data/icons/16x16/Makefile.in b/data/icons/16x16/Makefile.in
index a6ab746..b53d77a 100644
--- a/data/icons/16x16/Makefile.in
+++ b/data/icons/16x16/Makefile.in
@@ -164,12 +164,14 @@ EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIRL_CFLAGS = @GIRL_CFLAGS@
-GIRL_HELPER = @GIRL_HELPER@
+GIRL_HELPER_PLAYER = @GIRL_HELPER_PLAYER@
+GIRL_HELPER_RECORD = @GIRL_HELPER_RECORD@
 GIRL_LIBS = @GIRL_LIBS@
 GIRL_PKG_DEPS = @GIRL_PKG_DEPS@
 GMOFILES = @GMOFILES@
 GMSGFMT = @GMSGFMT@
 GREP = @GREP@
+HAVE_GIRL_RECORD = @HAVE_GIRL_RECORD@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
diff --git a/data/icons/22x22/Makefile.in b/data/icons/22x22/Makefile.in
index cc8aa62..b2abce3 100644
--- a/data/icons/22x22/Makefile.in
+++ b/data/icons/22x22/Makefile.in
@@ -164,12 +164,14 @@ EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIRL_CFLAGS = @GIRL_CFLAGS@
-GIRL_HELPER = @GIRL_HELPER@
+GIRL_HELPER_PLAYER = @GIRL_HELPER_PLAYER@
+GIRL_HELPER_RECORD = @GIRL_HELPER_RECORD@
 GIRL_LIBS = @GIRL_LIBS@
 GIRL_PKG_DEPS = @GIRL_PKG_DEPS@
 GMOFILES = @GMOFILES@
 GMSGFMT = @GMSGFMT@
 GREP = @GREP@
+HAVE_GIRL_RECORD = @HAVE_GIRL_RECORD@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
diff --git a/data/icons/24x24/Makefile.in b/data/icons/24x24/Makefile.in
index 52a3a10..d263552 100644
--- a/data/icons/24x24/Makefile.in
+++ b/data/icons/24x24/Makefile.in
@@ -164,12 +164,14 @@ EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIRL_CFLAGS = @GIRL_CFLAGS@
-GIRL_HELPER = @GIRL_HELPER@
+GIRL_HELPER_PLAYER = @GIRL_HELPER_PLAYER@
+GIRL_HELPER_RECORD = @GIRL_HELPER_RECORD@
 GIRL_LIBS = @GIRL_LIBS@
 GIRL_PKG_DEPS = @GIRL_PKG_DEPS@
 GMOFILES = @GMOFILES@
 GMSGFMT = @GMSGFMT@
 GREP = @GREP@
+HAVE_GIRL_RECORD = @HAVE_GIRL_RECORD@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
diff --git a/data/icons/256x256/Makefile.in b/data/icons/256x256/Makefile.in
index 2776e08..5c4b440 100644
--- a/data/icons/256x256/Makefile.in
+++ b/data/icons/256x256/Makefile.in
@@ -164,12 +164,14 @@ EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIRL_CFLAGS = @GIRL_CFLAGS@
-GIRL_HELPER = @GIRL_HELPER@
+GIRL_HELPER_PLAYER = @GIRL_HELPER_PLAYER@
+GIRL_HELPER_RECORD = @GIRL_HELPER_RECORD@
 GIRL_LIBS = @GIRL_LIBS@
 GIRL_PKG_DEPS = @GIRL_PKG_DEPS@
 GMOFILES = @GMOFILES@
 GMSGFMT = @GMSGFMT@
 GREP = @GREP@
+HAVE_GIRL_RECORD = @HAVE_GIRL_RECORD@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
diff --git a/data/icons/32x32/Makefile.in b/data/icons/32x32/Makefile.in
index 92558b3..1c10612 100644
--- a/data/icons/32x32/Makefile.in
+++ b/data/icons/32x32/Makefile.in
@@ -164,12 +164,14 @@ EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIRL_CFLAGS = @GIRL_CFLAGS@
-GIRL_HELPER = @GIRL_HELPER@
+GIRL_HELPER_PLAYER = @GIRL_HELPER_PLAYER@
+GIRL_HELPER_RECORD = @GIRL_HELPER_RECORD@
 GIRL_LIBS = @GIRL_LIBS@
 GIRL_PKG_DEPS = @GIRL_PKG_DEPS@
 GMOFILES = @GMOFILES@
 GMSGFMT = @GMSGFMT@
 GREP = @GREP@
+HAVE_GIRL_RECORD = @HAVE_GIRL_RECORD@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
diff --git a/data/icons/48x48/Makefile.in b/data/icons/48x48/Makefile.in
index dfe2def..f4629b3 100644
--- a/data/icons/48x48/Makefile.in
+++ b/data/icons/48x48/Makefile.in
@@ -164,12 +164,14 @@ EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIRL_CFLAGS = @GIRL_CFLAGS@
-GIRL_HELPER = @GIRL_HELPER@
+GIRL_HELPER_PLAYER = @GIRL_HELPER_PLAYER@
+GIRL_HELPER_RECORD = @GIRL_HELPER_RECORD@
 GIRL_LIBS = @GIRL_LIBS@
 GIRL_PKG_DEPS = @GIRL_PKG_DEPS@
 GMOFILES = @GMOFILES@
 GMSGFMT = @GMSGFMT@
 GREP = @GREP@
+HAVE_GIRL_RECORD = @HAVE_GIRL_RECORD@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
diff --git a/data/icons/Makefile.in b/data/icons/Makefile.in
index 0ae7e7a..440a645 100644
--- a/data/icons/Makefile.in
+++ b/data/icons/Makefile.in
@@ -193,12 +193,14 @@ EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIRL_CFLAGS = @GIRL_CFLAGS@
-GIRL_HELPER = @GIRL_HELPER@
+GIRL_HELPER_PLAYER = @GIRL_HELPER_PLAYER@
+GIRL_HELPER_RECORD = @GIRL_HELPER_RECORD@
 GIRL_LIBS = @GIRL_LIBS@
 GIRL_PKG_DEPS = @GIRL_PKG_DEPS@
 GMOFILES = @GMOFILES@
 GMSGFMT = @GMSGFMT@
 GREP = @GREP@
+HAVE_GIRL_RECORD = @HAVE_GIRL_RECORD@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
diff --git a/data/pixmaps/Makefile.in b/data/pixmaps/Makefile.in
index 2b6173e..d69c17e 100644
--- a/data/pixmaps/Makefile.in
+++ b/data/pixmaps/Makefile.in
@@ -163,12 +163,14 @@ EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIRL_CFLAGS = @GIRL_CFLAGS@
-GIRL_HELPER = @GIRL_HELPER@
+GIRL_HELPER_PLAYER = @GIRL_HELPER_PLAYER@
+GIRL_HELPER_RECORD = @GIRL_HELPER_RECORD@
 GIRL_LIBS = @GIRL_LIBS@
 GIRL_PKG_DEPS = @GIRL_PKG_DEPS@
 GMOFILES = @GMOFILES@
 GMSGFMT = @GMSGFMT@
 GREP = @GREP@
+HAVE_GIRL_RECORD = @HAVE_GIRL_RECORD@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
diff --git a/data/screenshot.png b/data/screenshot.png
index 709833b..f21bc4d 100644
Binary files a/data/screenshot.png and b/data/screenshot.png differ
diff --git a/girl.doap b/girl.doap
index 369225c..3d9894e 100644
--- a/girl.doap
+++ b/girl.doap
@@ -5,7 +5,7 @@
          xmlns="http://usefulinc.com/ns/doap#";>
   <name xml:lang="en">GNOME Internet Radio Locator</name>
   <shortdesc xml:lang="en">Locate Internet Radio Stations</shortdesc>
-  <description>Girl, the GNOME Internet Radio Locator program, allow users to easily find live radio 
programs on radio broadcasters on the Internet.  Girl is developed on the new GNOME platform and requires at 
least one audio helper such as totem to be installed.  Enjoy Internet Radio.</description>
+  <description>Girl, the GNOME Internet Radio Locator program, allows users to easily find live radio 
programs on radio broadcasters on the Internet.  Girl is developed on the new GNOME platform and requires at 
least one audio helper such as totem to be installed.  Enjoy Internet Radio.</description>
   <homepage rdf:resource="https://wiki.gnome.org/Apps/Girl"; />
   <mailing-list rdf:resource="http://mail.gnome.org/mailman/listinfo/girl-list"; />
   <download-page rdf:resource="http://download.gnome.org/sources/girl/"; />
diff --git a/girl.spec.in b/girl.spec.in
index 5d40fcb..ad6e84c 100644
--- a/girl.spec.in
+++ b/girl.spec.in
@@ -12,10 +12,11 @@ Requires: libxml2 >= 2.9.1
 Requires: gnome-vfs2 >= 2.24.4
 Requires: libgnomeui >= 2.24.5
 Requires: totem >= 3.10.1
+Requires: streamripper >= 1.64.6
 BuildRequires: gtk2-devel libgnome-devel libxml2-devel gnome-vfs2-devel libgnomeui-devel intltool
 
 %description
-Girl is a GNOME Internet Radio Locator program that allow users
+Girl is a GNOME Internet Radio Locator program that allows users
 to easily find live radio programs on radio broadcasters on the
 Internet.
 
@@ -54,6 +55,8 @@ make DESTDIR=%{buildroot} install
 %{_datadir}/girl/listener-1.0.dtd
 %{_datadir}/girl/listener-1.1.dtd
 %{_datadir}/girl/listeners.xml
+%{_datadir}/girl/programs-0.1.dtd
+%{_datadir}/girl/programs.xml
 %{_datadir}/girl/stations.xml
 %{_datadir}/appdata/girl.appdata.xml
 %{_datadir}/applications/girl.desktop
@@ -67,6 +70,9 @@ make DESTDIR=%{buildroot} install
 %{_mandir}/man1/girl.1.gz
 
 %changelog
+* Sat Dec 06 2014 Ole Aamot - 0.6.1-1
+- Girl 0.6.1 build on Fedora Linux 21
+
 * Tue Dec 02 2014 Ole Aamot - 0.6.0-1
 - Girl 0.6.0 build on Fedora Linux 21
 
diff --git a/src/Makefile.am b/src/Makefile.am
index 64889e9..07d3e09 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,13 +1,13 @@
-GOAL_CFLAGS=`pkg-config --cflags gtk+-2.0 libgnome-2.0 libxml-2.0 gnome-vfs-2.0 libgnomeui-2.0 
libgnomecanvas-2.0` -Wall -g -DHAVE_CONFIG_H -I. -DGNOMELOCALEDIR=\""`pkg-config --variable=prefix 
libgnomeui-2.0`/share/locale"\" -DDATADIR=\""`pkg-config --variable=prefix libgnomeui-2.0`/share"\" -DDEBUG 
-DGIRL_CFG -DGIRL_HELPER=\"$(GIRL_HELPER)\"
+GOAL_CFLAGS=`pkg-config --cflags gtk+-2.0 libgnome-2.0 libxml-2.0 gnome-vfs-2.0 libgnomeui-2.0 
libgnomecanvas-2.0` -Wall -g -DHAVE_CONFIG_H -I. -DGNOMELOCALEDIR=\""`pkg-config --variable=prefix 
libgnomeui-2.0`/share/locale"\" -DDATADIR=\""`pkg-config --variable=prefix libgnomeui-2.0`/share"\" -DDEBUG 
-DGIRL_CFG -DGIRL_HELPER_PLAYER=\"$(GIRL_HELPER_PLAYER)\" -DGIRL_HELPER_RECORD=\"$(GIRL_HELPER_RECORD)\"
 GOAL_LIBS=`pkg-config --libs gtk+-2.0 libgnome-2.0 libxml-2.0 gnome-vfs-2.0 libgnomeui-2.0 
libgnomecanvas-2.0`
 
 AM_CFLAGS = $(GOAL_CFLAGS)
 AM_LDFLAGS= $(GOAL_LIBS)
 
 bin_PROGRAMS = girl
-girl_SOURCES = girl.c girl-gui.c girl-listener.c girl-station.c girl-canvas.c
+girl_SOURCES = girl.c girl-gui.c girl-listener.c girl-program.c girl-station.c girl-canvas.c
 
 girldir = $(datadir)/girl
-girl_DATA = listeners.xml stations.xml girl-0.1.dtd girl-0.2.dtd girl-0.3.dtd girl-0.4.dtd girl-0.5.dtd 
girl-0.6.dtd listener-1.0.dtd listener-1.1.dtd girl-logo.png girl.png
+girl_DATA = listeners.xml programs.xml stations.xml girl-0.1.dtd girl-0.2.dtd girl-0.3.dtd girl-0.4.dtd 
girl-0.5.dtd girl-0.6.dtd listener-1.0.dtd listener-1.1.dtd programs-0.1.dtd girl-logo.png girl.png
 
-EXTRA_DIST = girl.h girl-gui.h girl-listener.h girl-station.h girl-canvas.h listeners.xml stations.xml 
girl-0.1.dtd girl-0.2.dtd girl-0.3.dtd girl-0.4.dtd girl-0.5.dtd girl-0.6.dtd listener-1.0.dtd 
listener-1.1.dtd girl-logo.png girl.png
+EXTRA_DIST = girl.h girl-gui.h girl-listener.h girl-program.h girl-station.h girl-canvas.h listeners.xml 
programs.xml stations.xml girl-0.1.dtd girl-0.2.dtd girl-0.3.dtd girl-0.4.dtd girl-0.5.dtd girl-0.6.dtd 
listener-1.0.dtd listener-1.1.dtd programs-0.1.dtd girl-logo.png girl.png
diff --git a/src/Makefile.in b/src/Makefile.in
index c0ed90a..0cd9e45 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -93,8 +93,8 @@ CONFIG_CLEAN_VPATH_FILES =
 am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(girldir)"
 PROGRAMS = $(bin_PROGRAMS)
 am_girl_OBJECTS = girl.$(OBJEXT) girl-gui.$(OBJEXT) \
-       girl-listener.$(OBJEXT) girl-station.$(OBJEXT) \
-       girl-canvas.$(OBJEXT)
+       girl-listener.$(OBJEXT) girl-program.$(OBJEXT) \
+       girl-station.$(OBJEXT) girl-canvas.$(OBJEXT)
 girl_OBJECTS = $(am_girl_OBJECTS)
 girl_LDADD = $(LDADD)
 AM_V_P = $(am__v_P_ AM_V@)
@@ -206,12 +206,14 @@ EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIRL_CFLAGS = @GIRL_CFLAGS@
-GIRL_HELPER = @GIRL_HELPER@
+GIRL_HELPER_PLAYER = @GIRL_HELPER_PLAYER@
+GIRL_HELPER_RECORD = @GIRL_HELPER_RECORD@
 GIRL_LIBS = @GIRL_LIBS@
 GIRL_PKG_DEPS = @GIRL_PKG_DEPS@
 GMOFILES = @GMOFILES@
 GMSGFMT = @GMSGFMT@
 GREP = @GREP@
+HAVE_GIRL_RECORD = @HAVE_GIRL_RECORD@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -303,14 +305,14 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-GOAL_CFLAGS = `pkg-config --cflags gtk+-2.0 libgnome-2.0 libxml-2.0 gnome-vfs-2.0 libgnomeui-2.0 
libgnomecanvas-2.0` -Wall -g -DHAVE_CONFIG_H -I. -DGNOMELOCALEDIR=\""`pkg-config --variable=prefix 
libgnomeui-2.0`/share/locale"\" -DDATADIR=\""`pkg-config --variable=prefix libgnomeui-2.0`/share"\" -DDEBUG 
-DGIRL_CFG -DGIRL_HELPER=\"$(GIRL_HELPER)\"
+GOAL_CFLAGS = `pkg-config --cflags gtk+-2.0 libgnome-2.0 libxml-2.0 gnome-vfs-2.0 libgnomeui-2.0 
libgnomecanvas-2.0` -Wall -g -DHAVE_CONFIG_H -I. -DGNOMELOCALEDIR=\""`pkg-config --variable=prefix 
libgnomeui-2.0`/share/locale"\" -DDATADIR=\""`pkg-config --variable=prefix libgnomeui-2.0`/share"\" -DDEBUG 
-DGIRL_CFG -DGIRL_HELPER_PLAYER=\"$(GIRL_HELPER_PLAYER)\" -DGIRL_HELPER_RECORD=\"$(GIRL_HELPER_RECORD)\"
 GOAL_LIBS = `pkg-config --libs gtk+-2.0 libgnome-2.0 libxml-2.0 gnome-vfs-2.0 libgnomeui-2.0 
libgnomecanvas-2.0`
 AM_CFLAGS = $(GOAL_CFLAGS)
 AM_LDFLAGS = $(GOAL_LIBS)
-girl_SOURCES = girl.c girl-gui.c girl-listener.c girl-station.c girl-canvas.c
+girl_SOURCES = girl.c girl-gui.c girl-listener.c girl-program.c girl-station.c girl-canvas.c
 girldir = $(datadir)/girl
-girl_DATA = listeners.xml stations.xml girl-0.1.dtd girl-0.2.dtd girl-0.3.dtd girl-0.4.dtd girl-0.5.dtd 
girl-0.6.dtd listener-1.0.dtd listener-1.1.dtd girl-logo.png girl.png
-EXTRA_DIST = girl.h girl-gui.h girl-listener.h girl-station.h girl-canvas.h listeners.xml stations.xml 
girl-0.1.dtd girl-0.2.dtd girl-0.3.dtd girl-0.4.dtd girl-0.5.dtd girl-0.6.dtd listener-1.0.dtd 
listener-1.1.dtd girl-logo.png girl.png
+girl_DATA = listeners.xml programs.xml stations.xml girl-0.1.dtd girl-0.2.dtd girl-0.3.dtd girl-0.4.dtd 
girl-0.5.dtd girl-0.6.dtd listener-1.0.dtd listener-1.1.dtd programs-0.1.dtd girl-logo.png girl.png
+EXTRA_DIST = girl.h girl-gui.h girl-listener.h girl-program.h girl-station.h girl-canvas.h listeners.xml 
programs.xml stations.xml girl-0.1.dtd girl-0.2.dtd girl-0.3.dtd girl-0.4.dtd girl-0.5.dtd girl-0.6.dtd 
listener-1.0.dtd listener-1.1.dtd programs-0.1.dtd girl-logo.png girl.png
 all: all-am
 
 .SUFFIXES:
@@ -401,6 +403,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote  /$(DEPDIR)/girl-canvas Po am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote  /$(DEPDIR)/girl-gui Po am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote  /$(DEPDIR)/girl-listener Po am__quote@
+ AMDEP_TRUE@@am__include@ @am__quote  /$(DEPDIR)/girl-program Po am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote  /$(DEPDIR)/girl-station Po am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote  /$(DEPDIR)/girl Po am__quote@
 
diff --git a/src/girl-gui.c b/src/girl-gui.c
index a784574..260f0f7 100644
--- a/src/girl-gui.c
+++ b/src/girl-gui.c
@@ -43,6 +43,7 @@
 
 #include "girl.h"
 #include "girl-gui.h"
+#include "girl-program.h"
 #include "girl-station.h"
 
 #ifdef DEBUG
@@ -56,13 +57,21 @@ extern GtkWidget *girl_app;
 GnomeUIInfo toolbar[] = {
        GNOMEUIINFO_ITEM_STOCK(("Listen"), ("Listen to selected station"),
                               on_listen_button_clicked,
-                              GTK_STOCK_REFRESH),
-       GNOMEUIINFO_ITEM_STOCK(("Listeners"), ("Listeners"),
-                              on_listeners_selector_button_clicked,
-                              GTK_STOCK_FIND),
+                              GTK_STOCK_MEDIA_PLAY),
+#ifdef GIRL_HELPER_RECORD
+       GNOMEUIINFO_ITEM_STOCK(("Record"), ("Record selected station"),
+                              on_record_button_clicked,
+                              GTK_STOCK_MEDIA_RECORD),
+#endif /* GIRL_HELPER_RECORD
+       /* GNOMEUIINFO_ITEM_STOCK(("Listeners"), ("Listeners"), */
+       /*                     on_listeners_selector_button_clicked, */
+       /*                     GTK_STOCK_FIND), */
        GNOMEUIINFO_ITEM_STOCK(("Stations"), ("Stations"),
                               on_stations_selector_button_clicked,
-                              GTK_STOCK_PREFERENCES),
+                              GTK_STOCK_NETWORK),
+       GNOMEUIINFO_ITEM_STOCK(("Programs"), ("Programs"),
+                              on_programs_selector_button_clicked,
+                              GTK_STOCK_HARDDISK),
        GNOMEUIINFO_SEPARATOR,
        GNOMEUIINFO_ITEM_STOCK(("Previous"),
                               ("Go back to the previous station"),
@@ -70,17 +79,22 @@ GnomeUIInfo toolbar[] = {
        GNOMEUIINFO_ITEM_STOCK(("Next"), ("Proceed to the next station"),
                               on_next_click, GTK_STOCK_GO_FORWARD),
        GNOMEUIINFO_SEPARATOR,
-       GNOMEUIINFO_ITEM_STOCK(("About Listener"),
-                              ("About the GNOME Internet Radio Locator"),
-                              about_listener, GNOME_STOCK_ABOUT),
-       GNOMEUIINFO_SEPARATOR,
+       /* GNOMEUIINFO_ITEM_STOCK(("About Listener"), */
+       /*                     ("About the GNOME Internet Radio Locator"), */
+       /*                     about_listener, GNOME_STOCK_ABOUT), */
+       /* GNOMEUIINFO_SEPARATOR, */
        GNOMEUIINFO_ITEM_STOCK(("About Station"),
-                              ("About the GNOME Internet Radio Locator"),
+                              ("About the current Station"),
                               about_station, GNOME_STOCK_ABOUT),
        GNOMEUIINFO_SEPARATOR,
        GNOMEUIINFO_ITEM_STOCK(("About Program"),
+                              ("About the current Program"),
+                              about_program, GNOME_STOCK_ABOUT),
+       GNOMEUIINFO_SEPARATOR,
+       GNOMEUIINFO_ITEM_STOCK(("About App"),
                               ("About the GNOME Internet Radio Locator"),
                               about_app, GNOME_STOCK_ABOUT),
+
        GNOMEUIINFO_SEPARATOR,
        GNOMEUIINFO_ITEM_STOCK(("Exit"),
                               ("Quit the GNOME Internet Radio Locator"),
@@ -239,6 +253,138 @@ GtkWidget *create_listeners_selector(char *selected_listener_uri,
        return listeners_selector;
 }
 
+GtkWidget *create_programs_selector(char *selected_program_uri,
+                                   char *filename)
+{
+       GirlProgramInfo *programinfo, *localprogram;
+       GtkWidget *programs_selector;
+       GtkWidget *align, *menu, *drop_down, *item;
+
+       gchar *program_uri, *program_name, *program_location, *program_release, *program_description;
+       gchar *label, *world_program_xml_filename, *local_program_xml_file;
+
+       int i = 0, selection = -1;
+
+       /* The Programs dialog */
+       programs_selector = gtk_dialog_new_with_buttons(("Select a program"), GTK_WINDOW(girl_app), 0,  /* 
flags */
+                                                       GTK_STOCK_CLOSE,
+                                                       GTK_RESPONSE_ACCEPT,
+                                                       NULL);
+       gtk_container_set_border_width
+           (GTK_CONTAINER(GTK_DIALOG(programs_selector)->vbox), 6);
+
+       align = gtk_alignment_new(0.5, 0.5, 0, 0);
+       gtk_container_add(GTK_CONTAINER
+                         (GTK_DIALOG(programs_selector)->vbox), align);
+       gtk_container_set_border_width(GTK_CONTAINER(align), 6);
+       gtk_widget_show(align);
+
+       menu = gtk_menu_new();
+       gtk_widget_show(menu);
+
+       /* creating the menu items */
+
+       world_program_xml_filename = gnome_program_locate_file(NULL,
+                                                              GNOME_FILE_DOMAIN_APP_DATADIR,
+                                                              "girl/programs.xml",
+                                                              FALSE,
+                                                              NULL);
+       /* world_program_xml_filename = g_strdup("http://girl.src.oka.no/programs.xml";); */
+
+       MSG("world_program_xml_filename = %s\n",
+           world_program_xml_filename);
+
+       if (world_program_xml_filename == NULL) {
+               g_warning(("Failed to open %s.  Please install it.\n"),
+                         world_program_xml_filename);
+       }
+
+       local_program_xml_file =
+           g_strconcat(g_get_home_dir(), "/.girl/programs.xml", NULL);
+       localprogram =
+           girl_program_load_from_file(NULL, local_program_xml_file);
+
+       if (localprogram == NULL) {
+               g_warning(("Failed to open %s\n"), local_program_xml_file);
+       }
+
+/*   g_free (local_program_xml_file); */
+
+       programinfo =
+           girl_program_load_from_file(localprogram,
+                                       world_program_xml_filename);
+
+       girl_programs = NULL;
+
+       while (programinfo != NULL) {
+
+               label =
+                   g_strconcat(programinfo->name, " (",
+                               programinfo->location, ")", NULL);
+               program_uri = g_strdup(programinfo->archive->uri);
+               program_name = g_strdup(programinfo->name);
+               program_location = g_strdup(programinfo->location);
+               program_release = g_strdup(programinfo->release);
+               program_description = g_strdup(programinfo->description);
+
+               girl_programs = g_list_append(girl_programs,(GirlProgramInfo *)programinfo);
+
+               if (label != NULL) {
+                       item = gtk_menu_item_new_with_label(label);
+                       gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+                       g_signal_connect(G_OBJECT(item), "activate",
+                                        G_CALLBACK
+                                        (on_programs_selector_changed),
+                                        NULL);
+                       g_object_set_data(G_OBJECT(item), "program_uri",
+                                         (gpointer) program_uri);
+                       g_object_set_data(G_OBJECT(item), "program_name",
+                                         (gpointer) program_name);
+                       g_object_set_data(G_OBJECT(item),
+                                         "program_location",
+                                         (gpointer) program_location);
+                       g_object_set_data(G_OBJECT(item),
+                                         "program_release",
+                                         (gpointer) program_release);
+                       g_object_set_data(G_OBJECT(item),
+                                         "program_description",
+                                         (gpointer) program_description);
+                       gtk_widget_show(item);
+                       g_free(label);
+
+                       /* selection */
+                       if (selected_program_uri != NULL &&
+                           !strcmp(selected_program_uri, program_uri))
+                               selection = i;
+               } else {
+                       g_free(program_uri);
+                       g_free(program_name);
+                       g_free(program_location);
+                       g_free(program_release);
+                       g_free(program_description);
+               }
+               i++;
+               programinfo = programinfo->next;
+       }
+
+       drop_down = gtk_option_menu_new();
+       gtk_widget_show(drop_down);
+       gtk_option_menu_set_menu(drop_down, menu);
+       gtk_container_add(GTK_CONTAINER(align), drop_down);
+
+       if (selection != -1)
+               gtk_option_menu_set_history(drop_down, selection);
+
+       g_signal_connect(G_OBJECT(programs_selector), "response",
+                        G_CALLBACK(gtk_widget_hide),
+                        (gpointer) programs_selector);
+       g_signal_connect(G_OBJECT(programs_selector), "delete-event",
+                        G_CALLBACK(gtk_widget_hide),
+                        (gpointer) programs_selector);
+
+       return programs_selector;
+}
+
 GtkWidget *create_stations_selector(char *selected_station_uri,
                                    char *filename)
 {
diff --git a/src/girl-station.c b/src/girl-station.c
index 63de5e8..dbf38b5 100644
--- a/src/girl-station.c
+++ b/src/girl-station.c
@@ -1,4 +1,4 @@
-/* $Id$
+/* $id$
  *
  * GNOME Internet Radio Locator
  *
@@ -63,59 +63,104 @@ void show_error(gchar * msg)
 #endif                         /* GIRL_CLI */
 }
 
-void girl_launch_helper(char *url, GirlStreamType type)
+void girl_helper_run(char *url, char *name, GirlStreamType type, GirlHelperType helper)
 {
        GError *err = NULL;
+       GTimeVal mtime;
+
        const char *mime_info;
 
        /* GnomeVFSMimeApplication *app; */
-       char *app, *command, *msg;
+       char *app, *command, *msg, *archive;
+
+       gint status;
 
        g_return_if_fail(url != NULL);
        MSG("%s", url);
 
        mime_info = gnome_vfs_get_mime_type(url);
 
+       g_get_current_time(&mtime);
+
        /* app = gnome_vfs_mime_get_default_application (mime_info); */
 
-       app = g_strdup(GIRL_HELPER);
+       if (helper == GIRL_STREAM_PLAYER) {
+               app = g_strdup(GIRL_HELPER_PLAYER);
+       }
+
+       if (helper == GIRL_STREAM_RECORD) {
+               app = g_strdup(GIRL_HELPER_RECORD);
+       }
 
        if (app != NULL) {
                command = g_strconcat(app, " ", url, NULL);
-               g_print("Helper command is %s\n", command);
-               /* gnome_vfs_mime_application_free (app); */
-       } else {
+               g_print("Helper application is %s\n", command);
                if (type == GIRL_STREAM_SHOUTCAST) {
-                       command = g_strconcat(app, " ", url, NULL);
+                       if (helper == GIRL_STREAM_PLAYER) {
+                               command = g_strconcat(app, " ", url, NULL);
+                       }
+                       if (helper == GIRL_STREAM_RECORD) {
+                               /* archive = g_strconcat("file://", g_get_home_dir(), "/.girl/", name, NULL); 
*/
+                               /* girl_archive_new(url, archive); */
+                               /* printf("Archiving program at %s\n", archive); */                           
  command = g_strconcat(app, " ", url, NULL);
+                               /* " -d ", g_get_home_dir(), "/.girl -D \"", name, "\" -s -a -u girl/", 
VERSION, NULL); */
+                               /* command = g_strconcat(command, " -d ", g_get_home_dir(), "/.girl/", name, 
" -D %S%A%T -t 10 -u girl/", VERSION, NULL); */
+                       }
                        g_print("Helper command is %s\n", command);
-               } else {
-                       msg =
-                           g_strdup_printf(_
-                                           ("An error happened trying to play "
-                                            "%s\nEither the file doesn't exist, or you "
-                                            "don't have a player for it."),
-                                           url);
+               }
+               /* gnome_vfs_mime_application_free (app); */
+       } else {
+               if (helper == GIRL_STREAM_PLAYER) {
+                       msg = g_strdup_printf(_("An error happened trying to play "
+                                               "%s\nEither the file doesn't exist, or you "
+                                               "don't have a player for it."),
+                                             url);
+               }
+               if (helper == GIRL_STREAM_RECORD) {
+                       msg = g_strdup_printf(_("An error happened trying to record "
+                                               "%s\nEither the file doesn't exist, or you "
+                                               "don't have a recorder for it."),
+                                             url);
+               }
+               if (msg != NULL) {
                        show_error(msg);
                        g_free(msg);
                }
                return;
        }
 
-       if (!g_spawn_command_line_async(command, &err)) {
-               msg = g_strdup_printf(_("Failed to open URL: '%s'\n"
-                                       "Details: %s"), url, err->message);
-               show_error(msg);
-               g_error_free(err);
-               g_free(msg);
-       } else {
-               g_print("Launching %s\n", command);
+       if (helper == GIRL_STREAM_PLAYER) {
+               if (!g_spawn_command_line_async(command, &err)) {
+                       msg = g_strdup_printf(_("Failed to open URL: '%s'\n"
+                                               "Details: %s"), url, err->message);
+                       show_error(msg);
+                       g_error_free(err);
+                       g_free(msg);
+               } else {
+                       g_print("Launching %s player\n", command);
+               }
+       }
+
+       if (helper == GIRL_STREAM_RECORD) {
+               if (!g_spawn_command_line_sync(command, stdout, stderr, status, &err)) {
+                       msg = g_strdup_printf(_("Failed to open URL: '%s'\n"
+                                               "Status code: %i\n"
+                                               "Details: %s"), url, status, err->message);
+                       show_error(msg);
+                       g_error_free(err);
+                       g_free(msg);
+               } else {
+                       g_print("Launching %s\n", command);
+               }
        }
 }
 
 void girl_stream_player(GtkWidget * widget, gpointer data)
 {
-       girl_launch_helper(girl->selected_station_uri,
-                          GIRL_STREAM_SHOUTCAST);
+       girl_helper_run(girl->selected_station_uri,
+                       girl->selected_station_name,
+                       GIRL_STREAM_SHOUTCAST,
+                       GIRL_STREAM_PLAYER);
 }
 
 void girl_info_view(GirlStationInfo * info)
diff --git a/src/girl-station.h b/src/girl-station.h
index 1dc77b6..3f643a5 100644
--- a/src/girl-station.h
+++ b/src/girl-station.h
@@ -29,18 +29,6 @@
 typedef struct _GirlStationInfo GirlStationInfo;
 typedef struct _GirlStreamInfo GirlStreamInfo;
 
-typedef enum {
-       GIRL_CHANNELS_MONO = 0x0001,
-       GIRL_CHANNELS_STEREO = 0x0002,
-       GIRL_CHANNELS_5_1 = 0x0005,
-       GIRL_CHANNELS_NONE = 0xffff
-} GirlChannels;
-
-typedef enum {
-       GIRL_STREAM_SHOUTCAST = 0x0001,
-       GIRL_STREAM_OGG = 0x0002
-} GirlStreamType;
-
 struct _GirlStationInfo {
        GtkWidget *widget;
        gchar *id;
@@ -78,6 +66,6 @@ GirlStationInfo *girl_station_load_from_file(GirlStationInfo * head,
                                             char *filename);
 GirlStationInfo *girl_station_load_from_http(GirlStationInfo * head,
                                             gpointer data);
-void girl_launch_helper(char *url, GirlStreamType type);
+void girl_helper_run(char *url, char *name, GirlStreamType type, GirlHelperType girl);
 
 #endif                         /* GIRL_STATION_H */
diff --git a/src/girl.c b/src/girl.c
index 2a73063..732ffa1 100644
--- a/src/girl.c
+++ b/src/girl.c
@@ -42,11 +42,14 @@
 #endif
 
 GirlData *girl;
-GList *girl_stations;
+
 GList *girl_listeners;
+GList *girl_programs;
+GList *girl_stations;
 
 GtkWidget *girl_app;
 GtkWidget *listeners_selector = NULL;
+GtkWidget *programs_selector = NULL;
 GtkWidget *stations_selector = NULL;
 
 int main(int argc, char *argv[])
@@ -74,18 +77,24 @@ int main(int argc, char *argv[])
        gtk_widget_show(girl_app);
 
        /* Set up the listeners list */
-       listeners_selector =
-           create_listeners_selector(girl->selected_listener_uri,
-                                     "listeners.xml");
+       listeners_selector = create_listeners_selector(girl->selected_listener_uri,"listeners.xml");
 
        g_object_add_weak_pointer(G_OBJECT(listeners_selector),
                                  (void **) &(listeners_selector));
 
+       /* Set up the programs list */
+       programs_selector = create_programs_selector(girl->selected_program_uri,"programs.xml");
+
+       /* gtk_widget_show(programs_selector); */
+
+        g_object_add_weak_pointer(G_OBJECT(programs_selector),
+                                 (void **) &(programs_selector));
+
        /* Set up the stations list */
        stations_selector = create_stations_selector(girl->selected_station_uri,
                                                     "stations.xml");
 
-       gtk_widget_show(stations_selector);
+       /* gtk_widget_show(stations_selector); */
 
        g_object_add_weak_pointer(G_OBJECT(stations_selector),
                                  (void **) &(stations_selector));
@@ -115,19 +124,6 @@ toggle_in_area (double x1, double y1, double x2, double y2)
        
 }
 
-
-static gint
-xfer_progress_callback(GnomeVFSXferProgressInfo * info, gpointer data)
-{
-
-       while (gtk_events_pending())
-               gtk_main_iteration();
-
-       appbar_send_msg(_("Fetching %s"), (gchar *) data);
-       MSG("%s", gnome_vfs_result_to_string(info->status));
-       return TRUE;
-}
-
 void appbar_send_msg(const char *a, ...)
 {
        gchar foo[2048];
@@ -203,7 +199,10 @@ void on_previous_click(GtkWidget * a, gpointer user_data)
                                        girl->selected_station_release);
                        
 
-                       girl_launch_helper(station->stream->uri, GIRL_STREAM_SHOUTCAST);
+                       girl_helper_run(girl->selected_station_uri,
+                                       girl->selected_station_name,
+                                       GIRL_STREAM_SHOUTCAST,
+                                       GIRL_STREAM_PLAYER);
                }
        } else {
                printf("Prev Station: At the beginning of Stations list!\n");
@@ -258,7 +257,10 @@ void on_next_click(GtkWidget * a, gpointer user_data)
                                        girl->selected_station_uri,
                                        girl->selected_station_release);
                        
-                       girl_launch_helper(station->stream->uri, GIRL_STREAM_SHOUTCAST);
+                       girl_helper_run(station->stream->uri,
+                                       station->name,
+                                       GIRL_STREAM_SHOUTCAST,
+                                       GIRL_STREAM_PLAYER);
                }
        }
 }
@@ -306,9 +308,58 @@ void on_listeners_selector_changed(GtkWidget * a, gpointer user_data)
                        girl->selected_listener_uri,
                        girl->selected_listener_release);
 
-       girl_launch_helper(girl->selected_listener_uri,
-                          GIRL_STREAM_SHOUTCAST);
+       girl_helper_run(girl->selected_listener_uri,
+                       girl->selected_listener_name,
+                       GIRL_STREAM_SHOUTCAST,
+                       GIRL_STREAM_PLAYER);
+
+}
+
+void on_programs_selector_button_clicked(GtkWidget * a, gpointer user_data)
+{
+       gtk_widget_show(programs_selector);
+       gdk_window_raise(programs_selector->window);
+}
+
+void on_programs_selector_changed(GtkWidget * a, gpointer user_data)
+{
+       if (girl->selected_program_uri != NULL)
+               g_free(girl->selected_program_uri);
+
+       girl->selected_program_uri =
+           g_strdup(g_object_get_data(G_OBJECT(a), "program_uri"));
+       MSG("on_program_select_changed: %s\n", girl->selected_program_uri);
+
+       girl->selected_program_name =
+           g_strdup(g_object_get_data(G_OBJECT(a), "program_name"));
+       MSG("on_program_select_changed: %s\n",
+           girl->selected_program_name);
 
+       girl->selected_program_location =
+           g_strdup(g_object_get_data(G_OBJECT(a), "program_location"));
+       MSG("on_program_select_changed: %s\n",
+           girl->selected_program_location);
+
+       girl->selected_program_release =
+           g_strdup(g_object_get_data(G_OBJECT(a), "program_release"));
+       MSG("on_program_select_changed: %s\n",
+           girl->selected_program_release);
+
+       girl->selected_program_description =
+           g_strdup(g_object_get_data(G_OBJECT(a), "program_description"));
+       MSG("on_program_select_changed: %s\n",
+           girl->selected_program_description);
+
+       appbar_send_msg(_("Selected %s in %s: %s"),
+                       girl->selected_program_name,
+                       girl->selected_program_location,
+                       girl->selected_program_uri,
+                       girl->selected_program_release);
+
+       girl_helper_run(girl->selected_program_uri,
+                       girl->selected_program_name,
+                       GIRL_STREAM_SHOUTCAST,
+                       GIRL_STREAM_PLAYER);
 }
 
 void on_stations_selector_button_clicked(GtkWidget * a, gpointer user_data)
@@ -352,8 +403,10 @@ void on_stations_selector_changed(GtkWidget * a, gpointer user_data)
                        girl->selected_station_uri,
                        girl->selected_station_release);
 
-       girl_launch_helper(girl->selected_station_uri,
-                          GIRL_STREAM_SHOUTCAST);
+       girl_helper_run(girl->selected_station_uri,
+                       girl->selected_station_name,
+                       GIRL_STREAM_SHOUTCAST,
+                       GIRL_STREAM_PLAYER);
 }
 
 void quit_app(GtkWidget * a, gpointer user_data)
@@ -392,7 +445,7 @@ void about_app(GtkWidget * a, gpointer user_data)
 {
        static GtkWidget *about = NULL;
        const gchar *authors[] = {
-               ("Ole Aamot <ole gnu org>"),
+               ("Ole Aamot <ole src gnome org>"),
                NULL,
        };
        const gchar *translator_credits = _("translator_credits");
@@ -437,7 +490,6 @@ void about_listener(GtkWidget * a, gpointer user_data)
                                        NULL,
                                        NULL,
                                        girl->icon);
-
        g_signal_connect(G_OBJECT(about_listener), "destroy",
                         G_CALLBACK(gtk_widget_destroy), NULL);
        g_signal_connect(G_OBJECT(about_listener), "delete-event",
@@ -446,6 +498,39 @@ void about_listener(GtkWidget * a, gpointer user_data)
        gtk_widget_show(about_listener);
 }
 
+void about_program(GtkWidget * a, gpointer user_data)
+{
+       static GtkWidget *about_program = NULL;
+       const gchar *translator_credits = _("translator_credits");
+       const gchar *authors[] = {
+               girl->selected_program_name,
+               NULL,
+       };
+
+       if (about_program) {
+               gdk_window_raise(about_program->window);
+               return;
+       }
+
+       if (girl->selected_program_name != NULL) {
+               about_program = gnome_about_new(girl->selected_program_name,
+                                               girl->selected_program_release,
+                                               girl->selected_program_location,
+                                               girl->selected_program_description,
+                                               authors,
+                                               NULL,
+                                               NULL,
+                                               girl->icon);
+               g_signal_connect(G_OBJECT(about_program), "destroy",
+                                G_CALLBACK(gtk_widget_destroy), NULL);
+               g_signal_connect(G_OBJECT(about_program), "delete-event",
+                                G_CALLBACK(gtk_widget_destroy), NULL);
+               g_object_add_weak_pointer(G_OBJECT(about_program), (void **) &(about_program));
+               gtk_widget_show(about_program);
+       }
+
+}
+
 void about_station(GtkWidget * a, gpointer user_data)
 {
        static GtkWidget *about_station = NULL;
@@ -489,11 +574,36 @@ void on_listen_button_clicked(GtkWidget *a, gpointer user_data)
                        girl->selected_station_uri,
                        girl->selected_station_release);
 
-       girl_launch_helper(girl->selected_station_uri,
-                          GIRL_STREAM_SHOUTCAST);
+       girl_helper_run(girl->selected_station_uri,
+                       girl->selected_station_name,
+                       GIRL_STREAM_SHOUTCAST,
+                       GIRL_STREAM_PLAYER);
 
 }
 
+void on_record_button_clicked(GtkWidget *a, gpointer user_data)
+{
+       GtkWidget *dialog;
+
+       if (girl->selected_station_name != NULL) {
+               appbar_send_msg(_("Recording from %s in %s: %s "),
+                               girl->selected_station_name,
+                               girl->selected_station_location,
+                               girl->selected_station_uri,
+                               girl->selected_station_release);
+               girl_helper_run(girl->selected_station_uri,
+                               girl->selected_station_name,
+                               GIRL_STREAM_SHOUTCAST,
+                               GIRL_STREAM_RECORD);
+       } else {
+               dialog = gtk_message_dialog_new(GTK_WINDOW(girl_app),
+                                               GTK_DIALOG_MODAL,
+                                               GTK_MESSAGE_ERROR,
+                                               GTK_BUTTONS_CLOSE, "Could not record!", NULL);
+               gtk_dialog_run(GTK_DIALOG(dialog));
+               gtk_widget_destroy(dialog);
+       }
+}
 
 GnomeVFSFileSize get_size(GnomeVFSURI * uri)
 {
@@ -516,7 +626,19 @@ GnomeVFSFileSize get_size(GnomeVFSURI * uri)
        return len;
 }
 
-GnomeVFSURI *xfer_webpage(gchar * src, gchar * dest)
+static gint
+girl_archive_progress_callback(GnomeVFSXferProgressInfo * info, gpointer data)
+{
+
+       while (gtk_events_pending())
+               gtk_main_iteration();
+
+       appbar_send_msg(_("Archiving %s"), (gchar *) data);
+       MSG("%s", gnome_vfs_result_to_string(info->status));
+       return TRUE;
+}
+
+GnomeVFSURI *girl_archive_new(gchar *src, gchar *dest)
 {
        GnomeVFSURI *src_uri, *dest_uri;
        GnomeVFSResult result;
@@ -527,11 +649,13 @@ GnomeVFSURI *xfer_webpage(gchar * src, gchar * dest)
        src_uri = gnome_vfs_uri_new(src);
        dest_uri = gnome_vfs_uri_new(dest);
 
-       result = gnome_vfs_xfer_uri(src_uri, dest_uri,
+       result = gnome_vfs_xfer_uri(src_uri,
+                                   dest_uri,
                                    xfer_options,
                                    GNOME_VFS_XFER_ERROR_MODE_QUERY,
                                    GNOME_VFS_XFER_OVERWRITE_MODE_REPLACE,
-                                   xfer_progress_callback, src);
+                                   girl_archive_progress_callback, src);
+
        gnome_vfs_uri_unref(src_uri);
 
        if (result != GNOME_VFS_OK)
diff --git a/src/girl.h b/src/girl.h
index ed3e2f2..6acb336 100644
--- a/src/girl.h
+++ b/src/girl.h
@@ -24,10 +24,28 @@
 #ifndef GIRL_H
 #define GIRL_H
 
+typedef enum {
+       GIRL_CHANNELS_MONO = 0x0001,
+       GIRL_CHANNELS_STEREO = 0x0002,
+       GIRL_CHANNELS_5_1 = 0x0005,
+       GIRL_CHANNELS_NONE = 0xffff
+} GirlChannels;
+
+typedef enum {
+       GIRL_STREAM_SHOUTCAST = 0x0001,
+       GIRL_STREAM_OGG = 0x0002
+} GirlStreamType;
+
+typedef enum {
+       GIRL_STREAM_PLAYER = 0x0001,
+       GIRL_STREAM_RECORD = 0x0002
+} GirlHelperType;
+
 #include <gnome.h>
 #include <libgnomevfs/gnome-vfs.h>
-#include "girl-station.h"
 #include "girl-listener.h"
+#include "girl-program.h"
+#include "girl-station.h"
 
 #ifdef DEBUG
 #define MSG(x...) g_message(x)
@@ -46,20 +64,23 @@ gchar *copy_to_mem(GnomeVFSURI * uri, GnomeVFSFileSize len);
 
 /* Fetcher for the stations */
 
-void girl_launch_helper(char *url, GirlStreamType type);
+void girl_helper_run(char *url, char *name, GirlStreamType type, GirlHelperType girl);
 void on_listen_button_clicked(GtkWidget * button, gpointer user_data);
+void on_record_button_clicked(GtkWidget * button, gpointer user_data);
 void on_next_click(GtkWidget *, gpointer user_data);
 void on_previous_click(GtkWidget *, gpointer user_data);
 void on_listeners_selector_button_clicked(GtkWidget *, gpointer user_data);
 void on_listeners_selector_changed(GtkWidget * a, gpointer user_data);
+void on_programs_selector_button_clicked(GtkWidget *, gpointer user_data);
+void on_programs_selector_changed(GtkWidget * a, gpointer user_data);
 void on_stations_selector_button_clicked(GtkWidget *, gpointer user_data);
 void on_stations_selector_changed(GtkWidget * a, gpointer user_data);
 void quit_app(GtkWidget *, gpointer user_data);
 void about_app(GtkWidget *, gpointer user_data);
 void about_listener(GtkWidget *, gpointer user_data);
+void about_program(GtkWidget *, gpointer user_data);
 void about_station(GtkWidget *, gpointer user_data);
 
-
 struct _GirlData {
        GtkImage *pixmap;
        GnomeAppBar *appbar;
@@ -69,6 +90,12 @@ struct _GirlData {
        gchar *selected_listener_location;
        gchar *selected_listener_release;
        gchar *selected_listener_description;
+       GirlProgramInfo *selected_program;
+       gchar *selected_program_uri;
+       gchar *selected_program_name;
+       gchar *selected_program_location;
+       gchar *selected_program_release;
+       gchar *selected_program_description;
        GirlStationInfo *selected_station;
        gchar *selected_station_uri;
        gchar *selected_station_name;
@@ -85,6 +112,7 @@ typedef struct _GirlData GirlData;
 
 extern GirlData *girl;
 extern GList *girl_stations;
+extern GList *girl_programs;
 extern GList *girl_listeners;
 
 #endif /* GIRL_H */
diff --git a/src/programs-0.1.dtd b/src/programs-0.1.dtd
new file mode 100644
index 0000000..2ab57d9
--- /dev/null
+++ b/src/programs-0.1.dtd
@@ -0,0 +1,17 @@
+<!ELEMENT description ( #PCDATA ) >
+<!ELEMENT frequency ( #PCDATA ) >
+<!ATTLIST frequency uri CDATA #REQUIRED >
+<!ELEMENT location ( lat | lon )* >
+<!ELEMENT girl ( program+ ) >
+<!ATTLIST girl version NMTOKEN #REQUIRED >
+<!ELEMENT program ( description | frequency | location | stream | uri | rank | type | release)* >
+<!ATTLIST program id NMTOKEN #REQUIRED >
+<!ATTLIST program name CDATA #REQUIRED >
+<!ELEMENT archive EMPTY >
+<!ATTLIST archive bitrate NMTOKEN #REQUIRED >
+<!ATTLIST archive channels NMTOKEN #IMPLIED >
+<!ATTLIST archive mime CDATA #REQUIRED >
+<!ATTLIST archive samplerate NMTOKEN #REQUIRED >
+<!ATTLIST archive uri CDATA #REQUIRED >
+<!ATTLIST archive codec CDATA #REQUIRED >
+<!ELEMENT uri ( #PCDATA ) >


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]