mpfire: removal as discussed in Conf call 7th Oct

Message ID 20241008164607.2632738-1-adolf.belka@ipfire.org
State Staged
Commit 5fd4ca19a88b5f431c5f4fdfdeab6fca4f79a22f
Headers
Series mpfire: removal as discussed in Conf call 7th Oct |

Commit Message

Adolf Belka Oct. 8, 2024, 4:45 p.m. UTC
  - removal of lfs, rootfile, backup, paks, misc-progs, mpfire perl, language file
   content, mpfire.cgi, mpfire menu references and files, mpfire specific image,
   web-user-interface references and references in manualpages.

Signed-off-by: Adolf Belka <adolf.belka@ipfire.org>
---
 config/backup/includes/mpfire                 |   2 -
 config/cfgroot/manualpages                    |   1 -
 config/menu/EX-mpfire.menu                    |   5 -
 config/mpfire/mpfire.pl                       | 108 ---
 config/mpfire/perl/Accessor.pm                | 675 -------------
 config/mpfire/perl/Accessor/Fast.pm           |  94 --
 config/mpfire/perl/Accessor/Faster.pm         | 105 --
 config/mpfire/perl/Audio/MPD.pm               | 897 ------------------
 config/mpfire/perl/Audio/MPD/Collection.pm    | 594 ------------
 config/mpfire/perl/Audio/MPD/Common.pm        |  88 --
 config/mpfire/perl/Audio/MPD/Common/Item.pm   | 100 --
 .../perl/Audio/MPD/Common/Item/Directory.pm   |  72 --
 .../perl/Audio/MPD/Common/Item/Playlist.pm    |  72 --
 .../mpfire/perl/Audio/MPD/Common/Item/Song.pm | 133 ---
 config/mpfire/perl/Audio/MPD/Common/Stats.pm  | 135 ---
 config/mpfire/perl/Audio/MPD/Common/Status.pm | 192 ----
 config/mpfire/perl/Audio/MPD/Common/Time.pm   | 186 ----
 config/mpfire/perl/Audio/MPD/Playlist.pm      | 427 ---------
 config/mpfire/perl/Audio/MPD/Test.pm          | 217 -----
 config/mpfire/perl/Readonly.pm                | 803 ----------------
 config/mpfire/webradio                        |  14 -
 config/rootfiles/common/configroot            |   1 -
 config/rootfiles/common/web-user-interface    |   3 -
 config/rootfiles/packages/mpfire              |  35 -
 doc/language_issues.de                        |  23 +
 doc/language_issues.en                        |  30 -
 doc/language_issues.es                        |  23 +-
 doc/language_issues.fr                        |  23 +
 doc/language_issues.it                        |  23 +-
 doc/language_issues.nl                        |  23 +-
 doc/language_issues.pl                        |  23 +-
 doc/language_issues.ru                        |  23 +-
 doc/language_issues.tr                        |  23 +-
 html/cgi-bin/mpfire.cgi                       | 673 -------------
 html/html/images/mpfire/box.png               | Bin 4562 -> 0 bytes
 langs/de/cgi-bin/de.pl                        |   7 -
 langs/en/cgi-bin/en.pl                        |   7 -
 langs/es/cgi-bin/es.pl                        |   7 -
 langs/fr/cgi-bin/fr.pl                        |   7 -
 langs/it/cgi-bin/it.pl                        |   7 -
 langs/nl/cgi-bin/nl.pl                        |   7 -
 langs/pl/cgi-bin/pl.pl                        |   7 -
 langs/ru/cgi-bin/ru.pl                        |   7 -
 langs/tr/cgi-bin/tr.pl                        |   7 -
 lfs/mpfire                                    |  75 --
 make.sh                                       |   1 -
 src/misc-progs/Makefile                       |   2 +-
 src/misc-progs/mpfirectrl.c                   |  15 -
 src/paks/mpfire/install.sh                    |  27 -
 src/paks/mpfire/uninstall.sh                  |  26 -
 src/paks/mpfire/update.sh                     |  27 -
 51 files changed, 179 insertions(+), 5903 deletions(-)
 delete mode 100644 config/backup/includes/mpfire
 delete mode 100644 config/menu/EX-mpfire.menu
 delete mode 100644 config/mpfire/mpfire.pl
 delete mode 100755 config/mpfire/perl/Accessor.pm
 delete mode 100755 config/mpfire/perl/Accessor/Fast.pm
 delete mode 100755 config/mpfire/perl/Accessor/Faster.pm
 delete mode 100644 config/mpfire/perl/Audio/MPD.pm
 delete mode 100644 config/mpfire/perl/Audio/MPD/Collection.pm
 delete mode 100644 config/mpfire/perl/Audio/MPD/Common.pm
 delete mode 100644 config/mpfire/perl/Audio/MPD/Common/Item.pm
 delete mode 100644 config/mpfire/perl/Audio/MPD/Common/Item/Directory.pm
 delete mode 100644 config/mpfire/perl/Audio/MPD/Common/Item/Playlist.pm
 delete mode 100644 config/mpfire/perl/Audio/MPD/Common/Item/Song.pm
 delete mode 100644 config/mpfire/perl/Audio/MPD/Common/Stats.pm
 delete mode 100644 config/mpfire/perl/Audio/MPD/Common/Status.pm
 delete mode 100644 config/mpfire/perl/Audio/MPD/Common/Time.pm
 delete mode 100644 config/mpfire/perl/Audio/MPD/Playlist.pm
 delete mode 100644 config/mpfire/perl/Audio/MPD/Test.pm
 delete mode 100644 config/mpfire/perl/Readonly.pm
 delete mode 100644 config/mpfire/webradio
 delete mode 100644 config/rootfiles/packages/mpfire
 delete mode 100644 html/cgi-bin/mpfire.cgi
 delete mode 100644 html/html/images/mpfire/box.png
 delete mode 100644 lfs/mpfire
 delete mode 100644 src/misc-progs/mpfirectrl.c
 delete mode 100644 src/paks/mpfire/install.sh
 delete mode 100644 src/paks/mpfire/uninstall.sh
 delete mode 100644 src/paks/mpfire/update.sh

index 61288dddf..2565505a5 100644
  

Patch

diff --git a/config/backup/includes/mpfire b/config/backup/includes/mpfire
deleted file mode 100644
index a21e77a6f..000000000
--- a/config/backup/includes/mpfire
+++ /dev/null
@@ -1,2 +0,0 @@ 
-/var/ipfire/mpfire/settings
-/var/ipfire/mpfire/webradio
diff --git a/config/cfgroot/manualpages b/config/cfgroot/manualpages
index f70381f12..1f7e01efc 100644
--- a/config/cfgroot/manualpages
+++ b/config/cfgroot/manualpages
@@ -69,7 +69,6 @@  iptables.cgi=configuration/firewall/iptables
 pakfire.cgi=configuration/ipfire/pakfire
 wlanap.cgi=addons/wireless
 tor.cgi=addons/tor
-mpfire.cgi=addons/mpfire
 samba.cgi=addons/samba
 
 #	Logs menu
diff --git a/config/menu/EX-mpfire.menu b/config/menu/EX-mpfire.menu
deleted file mode 100644
index afba4dbde..000000000
--- a/config/menu/EX-mpfire.menu
+++ /dev/null
@@ -1,5 +0,0 @@ 
-    $subipfire->{'40.mpfire'} = {'caption' => $Lang::tr{'mpfire'},
-				  'uri' => '/cgi-bin/mpfire.cgi',
-				  'title' => $Lang::tr{'mpfire'},
-				  'enabled' => 1,
-				  };
diff --git a/config/mpfire/mpfire.pl b/config/mpfire/mpfire.pl
deleted file mode 100644
index 15abd7893..000000000
--- a/config/mpfire/mpfire.pl
+++ /dev/null
@@ -1,108 +0,0 @@ 
-#!/usr/bin/perl
-
-require '/var/ipfire/general-functions.pl';
-require "${General::swroot}/lang.pl";
-require "${General::swroot}/header.pl";
-
-my $filename = "";
-my $debug = 0; 
-
-if (  `/etc/init.d/mpd status` =~/not running/ ){
-system("/etc/init.d/mpd start >/dev/null");
-}
-
-if ($ARGV[0] eq 'scan') {
-  if ($debug){print "Creating Database\n";}
-  system("mpd --create-db >/dev/null");
-  system("/etc/init.d/mpd restart >/dev/null");
-}
-elsif ($ARGV[0] eq 'play') {
-  &checkmute();
-  &clearplaylist();
-  if ($debug){print "Yes we are called and we will play $ARGV[1]\n";}
-  system("mpc add \"$ARGV[1]\" >/dev/null && mpc play >/dev/null");
-  }
-elsif ($ARGV[0] eq 'playadd') {
-  if ($debug){print "Yes we are called and we will add $ARGV[1]\n";}
-  system("mpc add \"$ARGV[1]\" >/dev/null && mpc play >/dev/null");
-  }
-elsif ($ARGV[0] eq 'clearplaylist') {
-  if ($debug){print "Deleting playlist\n";}
-  &clearplaylist();
-  }
-elsif ($ARGV[0] eq 'stop') {
-    my $PID = 'cat /var/run/mpd.pid';
-    if ($debug){print "Killing Process $PID\n";}
-    system("mpc stop >/dev/null");
-  }
-elsif ($ARGV[0] eq 'volup') {
-  if ($debug){print "Increasing Volume\n";}
-  system("/usr/bin/amixer set Master $ARGV[1]%+ 2>/dev/null >/dev/null");
-  system("/usr/bin/amixer set PCM $ARGV[1]%+ 2>/dev/null >/dev/null");
-  }
-elsif ($ARGV[0] eq 'voldown') {
-  if ($debug){print "Decreasing Volume\n";}
-  system("/usr/bin/amixer set Master $ARGV[1]%- 2>/dev/null >/dev/null");
-  system("/usr/bin/amixer set PCM $ARGV[1]%- 2>/dev/null >/dev/null");
-  }
-elsif ($ARGV[0] eq 'toggle') {
-  system("mpc toggle >/dev/null");
-  }
-elsif ($ARGV[0] eq 'next') {
-  if ($debug){print "Next Song\n";}
-  system("mpc next >/dev/null[");
-  }
-elsif ( $ARGV[0] eq 'prev' ) {
-  if ($debug){print "Previous Song\n";}
-  system("mpc prev >/dev/null");  
-  }
-elsif ($ARGV[0] eq 'song') {
-  my $song = `mpc \| head -2 | grep -v volume`;
-  print $song;
-  }
-elsif ($ARGV[0] eq 'stats') {
-  my $song = `mpc stats | grep Songs`;
-  print $song;
-  }
-elsif ($ARGV[0] eq 'playweb') {
-  &checkmute();
-  &clearplaylist();
-  if ($debug){print "Playing webstream $ARGV[1] \n";}
-     system("mpc add http://$ARGV[1] >/dev/null && mpc play >/dev/null && sleep 1");
-  }
-elsif ($ARGV[0] eq 'volume') {
- $temp = "Master - ";
- $temp .= `amixer get Master \| tail -2 \| awk '{ print \$2" "\$5 }'`;
- $temp .= "<break>PCM -";
- $temp .= `amixer get PCM \| tail -2 \| awk '{ print \$2" "\$5 }'`;
- print $temp;
-}
-
-sub clearplaylist(){
-  system("mpc clear >/dev/null");  
-  }
-
-sub shuffle(){
-  system("mpc random >/dev/null");  
-  }
-
-sub checkplaylist(){
- my $Datei = "/var/ipfire/mpd/playlist.m3u";
- my @Info = stat($Datei);
- if ( $Info[7] eq '' || $Info[7] eq '0' ){print "There is no playlist";exit(1);}
-}
-
-sub checkmute(){
- $temp = `amixer get Master \| tail -2`;
-  my @Master = split(/ /,$temp);
- $temp = `amixer get PCM \| tail -2`;
-  my @PCM = split(/ /,$temp);
- if ( $PCM[7] =~  /off/ ){
-  if ($debug){print "PCM was muted - umuting.\n";}
-  system("amixer set PCM toggle >/dev/null");
-  }
- if ( $Master[7] =~ /off/ ){
-  if ($debug){print "Master was muted - umuting.\n";}
-  system("amixer set Master toggle >/dev/null");
-  } 
-}
diff --git a/config/mpfire/perl/Accessor.pm b/config/mpfire/perl/Accessor.pm
deleted file mode 100755
index 7dcd00ea8..000000000
--- a/config/mpfire/perl/Accessor.pm
+++ /dev/null
@@ -1,675 +0,0 @@ 
-package Class::Accessor;
-require 5.00502;
-use strict;
-$Class::Accessor::VERSION = '0.31';
-
-=head1 NAME
-
-  Class::Accessor - Automated accessor generation
-
-=head1 SYNOPSIS
-
-  package Employee;
-  use base qw(Class::Accessor);
-  Employee->mk_accessors(qw(name role salary));
-
-  # Meanwhile, in a nearby piece of code!
-  # Class::Accessor provides new().
-  my $mp = Foo->new({ name => "Marty", role => "JAPH" });
-
-  my $job = $mp->role;  # gets $mp->{role}
-  $mp->salary(400000);  # sets $mp->{salary} = 400000 (I wish)
-  
-  # like my @info = @{$mp}{qw(name role)}
-  my @info = $mp->get(qw(name role));
-  
-  # $mp->{salary} = 400000
-  $mp->set('salary', 400000);
-
-
-=head1 DESCRIPTION
-
-This module automagically generates accessors/mutators for your class.
-
-Most of the time, writing accessors is an exercise in cutting and
-pasting.  You usually wind up with a series of methods like this:
-
-    sub name {
-        my $self = shift;
-        if(@_) {
-            $self->{name} = $_[0];
-        }
-        return $self->{name};
-    }
-
-    sub salary {
-        my $self = shift;
-        if(@_) {
-            $self->{salary} = $_[0];
-        }
-        return $self->{salary};
-    }
-
-  # etc...
-
-One for each piece of data in your object.  While some will be unique,
-doing value checks and special storage tricks, most will simply be
-exercises in repetition.  Not only is it Bad Style to have a bunch of
-repetitious code, but its also simply not lazy, which is the real
-tragedy.
-
-If you make your module a subclass of Class::Accessor and declare your
-accessor fields with mk_accessors() then you'll find yourself with a
-set of automatically generated accessors which can even be
-customized!
-
-The basic set up is very simple:
-
-    package My::Class;
-    use base qw(Class::Accessor);
-    My::Class->mk_accessors( qw(foo bar car) );
-
-Done.  My::Class now has simple foo(), bar() and car() accessors
-defined.
-
-=head2 What Makes This Different?
-
-What makes this module special compared to all the other method
-generating modules (L<"SEE ALSO">)?  By overriding the get() and set()
-methods you can alter the behavior of the accessors class-wide.  Also,
-the accessors are implemented as closures which should cost a bit less
-memory than most other solutions which generate a new method for each
-accessor.
-
-
-=head1 METHODS
-
-=head2 new
-
-    my $obj = Class->new;
-    my $obj = $other_obj->new;
-
-    my $obj = Class->new(\%fields);
-    my $obj = $other_obj->new(\%fields);
-
-Class::Accessor provides a basic constructor.  It generates a
-hash-based object and can be called as either a class method or an
-object method.  
-
-It takes an optional %fields hash which is used to initialize the
-object (handy if you use read-only accessors).  The fields of the hash
-correspond to the names of your accessors, so...
-
-    package Foo;
-    use base qw(Class::Accessor);
-    Foo->mk_accessors('foo');
-
-    my $obj = Class->new({ foo => 42 });
-    print $obj->foo;    # 42
-
-however %fields can contain anything, new() will shove them all into
-your object.  Don't like it?  Override it.
-
-=cut
-
-sub new {
-    my($proto, $fields) = @_;
-    my($class) = ref $proto || $proto;
-
-    $fields = {} unless defined $fields;
-
-    # make a copy of $fields.
-    bless {%$fields}, $class;
-}
-
-=head2 mk_accessors
-
-    Class->mk_accessors(@fields);
-
-This creates accessor/mutator methods for each named field given in
-@fields.  Foreach field in @fields it will generate two accessors.
-One called "field()" and the other called "_field_accessor()".  For
-example:
-
-    # Generates foo(), _foo_accessor(), bar() and _bar_accessor().
-    Class->mk_accessors(qw(foo bar));
-
-See L<CAVEATS AND TRICKS/"Overriding autogenerated accessors">
-for details.
-
-=cut
-
-sub mk_accessors {
-    my($self, @fields) = @_;
-
-    $self->_mk_accessors('rw', @fields);
-}
-
-
-{
-    no strict 'refs';
-
-    sub _mk_accessors {
-        my($self, $access, @fields) = @_;
-        my $class = ref $self || $self;
-        my $ra = $access eq 'rw' || $access eq 'ro';
-        my $wa = $access eq 'rw' || $access eq 'wo';
-
-        foreach my $field (@fields) {
-            my $accessor_name = $self->accessor_name_for($field);
-            my $mutator_name = $self->mutator_name_for($field);
-            if( $accessor_name eq 'DESTROY' or $mutator_name eq 'DESTROY' ) {
-                $self->_carp("Having a data accessor named DESTROY  in '$class' is unwise.");
-            }
-            if ($accessor_name eq $mutator_name) {
-                my $accessor;
-                if ($ra && $wa) {
-                    $accessor = $self->make_accessor($field);
-                } elsif ($ra) {
-                    $accessor = $self->make_ro_accessor($field);
-                } else {
-                    $accessor = $self->make_wo_accessor($field);
-                }
-                unless (defined &{"${class}::$accessor_name"}) {
-                    *{"${class}::$accessor_name"} = $accessor;
-                }
-                if ($accessor_name eq $field) {
-                    # the old behaviour
-                    my $alias = "_${field}_accessor";
-                    *{"${class}::$alias"} = $accessor unless defined &{"${class}::$alias"};
-                }
-            } else {
-                if ($ra and not defined &{"${class}::$accessor_name"}) {
-                    *{"${class}::$accessor_name"} = $self->make_ro_accessor($field);
-                }
-                if ($wa and not defined &{"${class}::$mutator_name"}) {
-                    *{"${class}::$mutator_name"} = $self->make_wo_accessor($field);
-                }
-            }
-        }
-    }
-
-    sub follow_best_practice {
-        my($self) = @_;
-        my $class = ref $self || $self;
-        *{"${class}::accessor_name_for"}  = \&best_practice_accessor_name_for;
-        *{"${class}::mutator_name_for"}  = \&best_practice_mutator_name_for;
-    }
-
-}
-
-=head2 mk_ro_accessors
-
-  Class->mk_ro_accessors(@read_only_fields);
-
-Same as mk_accessors() except it will generate read-only accessors
-(ie. true accessors).  If you attempt to set a value with these
-accessors it will throw an exception.  It only uses get() and not
-set().
-
-    package Foo;
-    use base qw(Class::Accessor);
-    Class->mk_ro_accessors(qw(foo bar));
-
-    # Let's assume we have an object $foo of class Foo...
-    print $foo->foo;  # ok, prints whatever the value of $foo->{foo} is
-    $foo->foo(42);    # BOOM!  Naughty you.
-
-
-=cut
-
-sub mk_ro_accessors {
-    my($self, @fields) = @_;
-
-    $self->_mk_accessors('ro', @fields);
-}
-
-=head2 mk_wo_accessors
-
-  Class->mk_wo_accessors(@write_only_fields);
-
-Same as mk_accessors() except it will generate write-only accessors
-(ie. mutators).  If you attempt to read a value with these accessors
-it will throw an exception.  It only uses set() and not get().
-
-B<NOTE> I'm not entirely sure why this is useful, but I'm sure someone
-will need it.  If you've found a use, let me know.  Right now its here
-for orthoginality and because its easy to implement.
-
-    package Foo;
-    use base qw(Class::Accessor);
-    Class->mk_wo_accessors(qw(foo bar));
-
-    # Let's assume we have an object $foo of class Foo...
-    $foo->foo(42);      # OK.  Sets $self->{foo} = 42
-    print $foo->foo;    # BOOM!  Can't read from this accessor.
-
-=cut
-
-sub mk_wo_accessors {
-    my($self, @fields) = @_;
-
-    $self->_mk_accessors('wo', @fields);
-}
-
-=head1 DETAILS
-
-An accessor generated by Class::Accessor looks something like
-this:
-
-    # Your foo may vary.
-    sub foo {
-        my($self) = shift;
-        if(@_) {    # set
-            return $self->set('foo', @_);
-        }
-        else {
-            return $self->get('foo');
-        }
-    }
-
-Very simple.  All it does is determine if you're wanting to set a
-value or get a value and calls the appropriate method.
-Class::Accessor provides default get() and set() methods which
-your class can override.  They're detailed later.
-
-=head2 follow_best_practice
-
-In Damian's Perl Best Practices book he recommends separate get and set methods
-with the prefix set_ and get_ to make it explicit what you intend to do.  If you
-want to create those accessor methods instead of the default ones, call:
-
-    __PACKAGE__->follow_best_practice
-
-=head2 accessor_name_for / mutator_name_for
-
-You may have your own crazy ideas for the names of the accessors, so you can
-make those happen by overriding C<accessor_name_for> and C<mutator_name_for> in
-your subclass.  (I copied that idea from Class::DBI.)
-
-=cut
-
-sub best_practice_accessor_name_for {
-    my ($class, $field) = @_;
-    return "get_$field";
-}
-
-sub best_practice_mutator_name_for {
-    my ($class, $field) = @_;
-    return "set_$field";
-}
-
-sub accessor_name_for {
-    my ($class, $field) = @_;
-    return $field;
-}
-
-sub mutator_name_for {
-    my ($class, $field) = @_;
-    return $field;
-}
-
-=head2 Modifying the behavior of the accessor
-
-Rather than actually modifying the accessor itself, it is much more
-sensible to simply override the two key methods which the accessor
-calls.  Namely set() and get().
-
-If you -really- want to, you can override make_accessor().
-
-=head2 set
-
-    $obj->set($key, $value);
-    $obj->set($key, @values);
-
-set() defines how generally one stores data in the object.
-
-override this method to change how data is stored by your accessors.
-
-=cut
-
-sub set {
-    my($self, $key) = splice(@_, 0, 2);
-
-    if(@_ == 1) {
-        $self->{$key} = $_[0];
-    }
-    elsif(@_ > 1) {
-        $self->{$key} = [@_];
-    }
-    else {
-        $self->_croak("Wrong number of arguments received");
-    }
-}
-
-=head2 get
-
-    $value  = $obj->get($key);
-    @values = $obj->get(@keys);
-
-get() defines how data is retreived from your objects.
-
-override this method to change how it is retreived.
-
-=cut
-
-sub get {
-    my $self = shift;
-
-    if(@_ == 1) {
-        return $self->{$_[0]};
-    }
-    elsif( @_ > 1 ) {
-        return @{$self}{@_};
-    }
-    else {
-        $self->_croak("Wrong number of arguments received");
-    }
-}
-
-=head2 make_accessor
-
-    $accessor = Class->make_accessor($field);
-
-Generates a subroutine reference which acts as an accessor for the given
-$field.  It calls get() and set().
-
-If you wish to change the behavior of your accessors, try overriding
-get() and set() before you start mucking with make_accessor().
-
-=cut
-
-sub make_accessor {
-    my ($class, $field) = @_;
-
-    # Build a closure around $field.
-    return sub {
-        my $self = shift;
-
-        if(@_) {
-            return $self->set($field, @_);
-        }
-        else {
-            return $self->get($field);
-        }
-    };
-}
-
-=head2 make_ro_accessor
-
-    $read_only_accessor = Class->make_ro_accessor($field);
-
-Generates a subroutine refrence which acts as a read-only accessor for
-the given $field.  It only calls get().
-
-Override get() to change the behavior of your accessors.
-
-=cut
-
-sub make_ro_accessor {
-    my($class, $field) = @_;
-
-    return sub {
-        my $self = shift;
-
-        if (@_) {
-            my $caller = caller;
-            $self->_croak("'$caller' cannot alter the value of '$field' on objects of class '$class'");
-        }
-        else {
-            return $self->get($field);
-        }
-    };
-}
-
-=head2 make_wo_accessor
-
-    $read_only_accessor = Class->make_wo_accessor($field);
-
-Generates a subroutine refrence which acts as a write-only accessor
-(mutator) for the given $field.  It only calls set().
-
-Override set() to change the behavior of your accessors.
-
-=cut
-
-sub make_wo_accessor {
-    my($class, $field) = @_;
-
-    return sub {
-        my $self = shift;
-
-        unless (@_) {
-            my $caller = caller;
-            $self->_croak("'$caller' cannot access the value of '$field' on objects of class '$class'");
-        }
-        else {
-            return $self->set($field, @_);
-        }
-    };
-}
-
-=head1 EXCEPTIONS
-
-If something goes wrong Class::Accessor will warn or die by calling Carp::carp
-or Carp::croak.  If you don't like this you can override _carp() and _croak() in
-your subclass and do whatever else you want.
-
-=cut
-
-use Carp ();
-
-sub _carp {
-    my ($self, $msg) = @_;
-    Carp::carp($msg || $self);
-    return;
-}
-
-sub _croak {
-    my ($self, $msg) = @_;
-    Carp::croak($msg || $self);
-    return;
-}
-
-=head1 EFFICIENCY
-
-Class::Accessor does not employ an autoloader, thus it is much faster
-than you'd think.  Its generated methods incur no special penalty over
-ones you'd write yourself.
-
-  accessors:
-               Rate   Basic Average    Fast  Faster  Direct
-  Basic    189150/s      --    -42%    -51%    -55%    -89%
-  Average  327679/s     73%      --    -16%    -22%    -82%
-  Fast     389212/s    106%     19%      --     -8%    -78%
-  Faster   421646/s    123%     29%      8%      --    -76%
-  Direct  1771243/s    836%    441%    355%    320%      --
-
-  mutators:
-               Rate   Basic Average    Fast  Faster  Direct
-  Basic    173769/s      --    -34%    -53%    -59%    -90%
-  Average  263046/s     51%      --    -29%    -38%    -85%
-  Fast     371158/s    114%     41%      --    -13%    -78%
-  Faster   425821/s    145%     62%     15%      --    -75%
-  Direct  1699081/s    878%    546%    358%    299%      --
-
-Class::Accessor::Fast is faster than methods written by an average programmer
-(where "average" is based on Schwern's example code).
-
-Class::Accessor is slower than average, but more flexible.
-
-Class::Accessor::Faster is even faster than Class::Accessor::Fast.  It uses an
-array internally, not a hash.  This could be a good or bad feature depending on
-your point of view.
-
-Direct hash access is, of course, much faster than all of these, but it
-provides no encapsulation.
-
-Of course, its not as simple as saying "Class::Accessor is slower than
-average".  These are benchmarks for a simple accessor.  If your accessors do
-any sort of complicated work (such as talking to a database or writing to a
-file) the time spent doing that work will quickly swamp the time spend just
-calling the accessor.  In that case, Class::Accessor and the ones you write
-will be roughly the same speed.
-
-
-=head1 EXAMPLES
-
-Here's an example of generating an accessor for every public field of
-your class.
-
-    package Altoids;
-    
-    use base qw(Class::Accessor Class::Fields);
-    use fields qw(curiously strong mints);
-    Altoids->mk_accessors( Altoids->show_fields('Public') );
-
-    sub new {
-        my $proto = shift;
-        my $class = ref $proto || $proto;
-        return fields::new($class);
-    }
-
-    my Altoids $tin = Altoids->new;
-
-    $tin->curiously('Curiouser and curiouser');
-    print $tin->{curiously};    # prints 'Curiouser and curiouser'
-
-    
-    # Subclassing works, too.
-    package Mint::Snuff;
-    use base qw(Altoids);
-
-    my Mint::Snuff $pouch = Mint::Snuff->new;
-    $pouch->strong('Blow your head off!');
-    print $pouch->{strong};     # prints 'Blow your head off!'
-
-
-Here's a simple example of altering the behavior of your accessors.
-
-    package Foo;
-    use base qw(Class::Accessor);
-    Foo->mk_accessor(qw(this that up down));
-
-    sub get {
-        my $self = shift;
-
-        # Note every time someone gets some data.
-        print STDERR "Getting @_\n";
-
-        $self->SUPER::get(@_);
-    }
-
-    sub set {
-        my ($self, $key) = splice(@_, 0, 2);
-
-        # Note every time someone sets some data.
-        print STDERR "Setting $key to @_\n";
-
-        $self->SUPER::set($key, @_);
-    }
-
-
-=head1 CAVEATS AND TRICKS
-
-Class::Accessor has to do some internal wackiness to get its
-job done quickly and efficiently.  Because of this, there's a few
-tricks and traps one must know about.
-
-Hey, nothing's perfect.
-
-=head2 Don't make a field called DESTROY
-
-This is bad.  Since DESTROY is a magical method it would be bad for us
-to define an accessor using that name.  Class::Accessor will
-carp if you try to use it with a field named "DESTROY".
-
-=head2 Overriding autogenerated accessors
-
-You may want to override the autogenerated accessor with your own, yet
-have your custom accessor call the default one.  For instance, maybe
-you want to have an accessor which checks its input.  Normally, one
-would expect this to work:
-
-    package Foo;
-    use base qw(Class::Accessor);
-    Foo->mk_accessors(qw(email this that whatever));
-
-    # Only accept addresses which look valid.
-    sub email {
-        my($self) = shift;
-        my($email) = @_;
-
-        if( @_ ) {  # Setting
-            require Email::Valid;
-            unless( Email::Valid->address($email) ) {
-                carp("$email doesn't look like a valid address.");
-                return;
-            }
-        }
-
-        return $self->SUPER::email(@_);
-    }
-
-There's a subtle problem in the last example, and its in this line:
-
-    return $self->SUPER::email(@_);
-
-If we look at how Foo was defined, it called mk_accessors() which
-stuck email() right into Foo's namespace.  There *is* no
-SUPER::email() to delegate to!  Two ways around this... first is to
-make a "pure" base class for Foo.  This pure class will generate the
-accessors and provide the necessary super class for Foo to use:
-
-    package Pure::Organic::Foo;
-    use base qw(Class::Accessor);
-    Pure::Organic::Foo->mk_accessors(qw(email this that whatever));
-
-    package Foo;
-    use base qw(Pure::Organic::Foo);
-
-And now Foo::email() can override the generated
-Pure::Organic::Foo::email() and use it as SUPER::email().
-
-This is probably the most obvious solution to everyone but me.
-Instead, what first made sense to me was for mk_accessors() to define
-an alias of email(), _email_accessor().  Using this solution,
-Foo::email() would be written with:
-
-    return $self->_email_accessor(@_);
-
-instead of the expected SUPER::email().
-
-
-=head1 AUTHORS
-
-Copyright 2007 Marty Pauley <marty+perl@kasei.com>
-
-This program is free software; you can redistribute it and/or modify it under
-the same terms as Perl itself.  That means either (a) the GNU General Public
-License or (b) the Artistic License.
-
-=head2 ORIGINAL AUTHOR
-
-Michael G Schwern <schwern@pobox.com>
-
-=head2 THANKS
-
-Liz and RUZ for performance tweaks.
-
-Tels, for his big feature request/bug report.
-
-
-=head1 SEE ALSO
-
-L<Class::Accessor::Fast>
-
-These are some modules which do similar things in different ways
-L<Class::Struct>, L<Class::Methodmaker>, L<Class::Generate>,
-L<Class::Class>, L<Class::Contract>
-
-L<Class::DBI> for an example of this module in use.
-
-=cut
-
-1;
diff --git a/config/mpfire/perl/Accessor/Fast.pm b/config/mpfire/perl/Accessor/Fast.pm
deleted file mode 100755
index 6522923f5..000000000
--- a/config/mpfire/perl/Accessor/Fast.pm
+++ /dev/null
@@ -1,94 +0,0 @@ 
-package Class::Accessor::Fast;
-use base 'Class::Accessor';
-use strict;
-$Class::Accessor::Fast::VERSION = '0.31';
-
-=head1 NAME
-
-Class::Accessor::Fast - Faster, but less expandable, accessors
-
-=head1 SYNOPSIS
-
-  package Foo;
-  use base qw(Class::Accessor::Fast);
-
-  # The rest is the same as Class::Accessor but without set() and get().
-
-=head1 DESCRIPTION
-
-This is a faster but less expandable version of Class::Accessor.
-Class::Accessor's generated accessors require two method calls to accompish
-their task (one for the accessor, another for get() or set()).
-Class::Accessor::Fast eliminates calling set()/get() and does the access itself,
-resulting in a somewhat faster accessor.
-
-The downside is that you can't easily alter the behavior of your
-accessors, nor can your subclasses.  Of course, should you need this
-later, you can always swap out Class::Accessor::Fast for
-Class::Accessor.
-
-Read the documentation for Class::Accessor for more info.
-
-=cut
-
-sub make_accessor {
-    my($class, $field) = @_;
-
-    return sub {
-        return $_[0]->{$field} if @_ == 1;
-        return $_[0]->{$field} = $_[1] if @_ == 2;
-        return (shift)->{$field} = \@_;
-    };
-}
-
-
-sub make_ro_accessor {
-    my($class, $field) = @_;
-
-    return sub {
-        return $_[0]->{$field} if @_ == 1;
-        my $caller = caller;
-        $_[0]->_croak("'$caller' cannot alter the value of '$field' on objects of class '$class'");
-    };
-}
-
-
-sub make_wo_accessor {
-    my($class, $field) = @_;
-
-    return sub {
-        if (@_ == 1) {
-            my $caller = caller;
-            $_[0]->_croak("'$caller' cannot access the value of '$field' on objects of class '$class'");
-        }
-        else {
-            return $_[0]->{$field} = $_[1] if @_ == 2;
-            return (shift)->{$field} = \@_;
-        }
-    };
-}
-
-
-=head1 EFFICIENCY
-
-L<Class::Accessor/EFFICIENCY> for an efficiency comparison.
-
-=head1 AUTHORS
-
-Copyright 2007 Marty Pauley <marty+perl@kasei.com>
-
-This program is free software; you can redistribute it and/or modify it under
-the same terms as Perl itself.  That means either (a) the GNU General Public
-License or (b) the Artistic License.
-
-=head2 ORIGINAL AUTHOR
-
-Michael G Schwern <schwern@pobox.com>
-
-=head1 SEE ALSO
-
-L<Class::Accessor>
-
-=cut
-
-1;
diff --git a/config/mpfire/perl/Accessor/Faster.pm b/config/mpfire/perl/Accessor/Faster.pm
deleted file mode 100755
index 8f81ff9d0..000000000
--- a/config/mpfire/perl/Accessor/Faster.pm
+++ /dev/null
@@ -1,105 +0,0 @@ 
-package Class::Accessor::Faster;
-use base 'Class::Accessor';
-use strict;
-$Class::Accessor::Faster::VERSION = '0.31';
-
-=head1 NAME
-
-Class::Accessor::Faster - Even faster, but less expandable, accessors
-
-=head1 SYNOPSIS
-
-  package Foo;
-  use base qw(Class::Accessor::Faster);
-
-=head1 DESCRIPTION
-
-This is a faster but less expandable version of Class::Accessor::Fast.
-
-Class::Accessor's generated accessors require two method calls to accompish
-their task (one for the accessor, another for get() or set()).
-
-Class::Accessor::Fast eliminates calling set()/get() and does the access itself,
-resulting in a somewhat faster accessor.
-
-Class::Accessor::Faster uses an array reference underneath to be faster.
-
-Read the documentation for Class::Accessor for more info.
-
-=cut
-
-my %slot;
-sub _slot {
-    my($class, $field) = @_;
-    my $n = $slot{$class}->{$field};
-    return $n if defined $n;
-    $n = keys %{$slot{$class}};
-    $slot{$class}->{$field} = $n;
-    return $n;
-}
-
-sub new {
-    my($proto, $fields) = @_;
-    my($class) = ref $proto || $proto;
-    my $self = bless [], $class;
-
-    $fields = {} unless defined $fields;
-    for my $k (keys %$fields) {
-        my $n = $class->_slot($k);
-        $self->[$n] = $fields->{$k};
-    }
-    return $self;
-}
-
-sub make_accessor {
-    my($class, $field) = @_;
-    my $n = $class->_slot($field);
-    return sub {
-        return $_[0]->[$n] if @_ == 1;
-        return $_[0]->[$n] = $_[1] if @_ == 2;
-        return (shift)->[$n] = \@_;
-    };
-}
-
-
-sub make_ro_accessor {
-    my($class, $field) = @_;
-    my $n = $class->_slot($field);
-    return sub {
-        return $_[0]->[$n] if @_ == 1;
-        my $caller = caller;
-        $_[0]->_croak("'$caller' cannot alter the value of '$field' on objects of class '$class'");
-    };
-}
-
-
-sub make_wo_accessor {
-    my($class, $field) = @_;
-    my $n = $class->_slot($field);
-    return sub {
-        if (@_ == 1) {
-            my $caller = caller;
-            $_[0]->_croak("'$caller' cannot access the value of '$field' on objects of class '$class'");
-        } else {
-            return $_[0]->[$n] = $_[1] if @_ == 2;
-            return (shift)->[$n] = \@_;
-        }
-    };
-}
-
-
-=head1 AUTHORS
-
-Copyright 2007 Marty Pauley <marty+perl@kasei.com>
-
-This program is free software; you can redistribute it and/or modify it under
-the same terms as Perl itself.  That means either (a) the GNU General Public
-License or (b) the Artistic License.
-
-=head1 SEE ALSO
-
-L<Class::Accessor>
-
-=cut
-
-1;
diff --git a/config/mpfire/perl/Audio/MPD.pm b/config/mpfire/perl/Audio/MPD.pm
deleted file mode 100644
index 0bfbc485e..000000000
--- a/config/mpfire/perl/Audio/MPD.pm
+++ /dev/null
@@ -1,897 +0,0 @@ 
-#
-# This file is part of Audio::MPD
-# Copyright (c) 2007 Jerome Quelin, all rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the same terms as Perl itself.
-#
-#
-
-package Audio::MPD;
-
-use warnings;
-use strict;
-
-use Audio::MPD::Collection;
-use Audio::MPD::Common::Item;
-use Audio::MPD::Common::Stats;
-use Audio::MPD::Common::Status;
-use Audio::MPD::Playlist;
-use Encode;
-use IO::Socket;
-use Readonly;
-
-
-use base qw[ Class::Accessor::Fast Exporter ];
-__PACKAGE__->mk_accessors(
-    qw[ _conntype _host _password _port _socket
-        collection playlist version ] );
-
-
-our $VERSION = '0.19.1';
-
-Readonly our $REUSE => 0;
-Readonly our $ONCE  => 1;
-
-our @EXPORT = qw[ $REUSE $ONCE ];
-
-
-#--
-# Constructor
-
-#
-# my $mpd = Audio::MPD->new( [%opts] )
-#
-# This is the constructor for Audio::MPD. One can specify the following
-# options:
-#   - hostname => $hostname : defaults to environment var MPD_HOST, then to 'localhost'
-#   - port     => $port     : defaults to env var MPD_PORT, then to 6600
-#   - password => $password : defaults to env var MPD_PASSWORD, then to ''
-#   - conntype => $type     : how the connection to mpd server is handled. it can be
-#               either $REUSE: reuse the same connection
-#                    or $ONCE: open a new connection per command (default)
-#
-sub new {
-    my ($class, %opts) = @_;
-
-    # use mpd defaults.
-    my ($default_password, $default_host) = split( '@', $ENV{MPD_HOST} )
-       if exists $ENV{MPD_HOST} && $ENV{MPD_HOST} =~ /@/;
-    my $host     = $opts{host}     || $default_host      || $ENV{MPD_HOST} || 'localhost';
-    my $port     = $opts{port}     || $ENV{MPD_PORT}     || '6600';
-    my $password = $opts{password} || $ENV{MPD_PASSWORD} || $default_password || '';
-
-    # create & bless the object.
-    my $self = {
-        _host     => $host,
-        _port     => $port,
-        _password => $password,
-        _conntype => exists $opts{conntype} ? $opts{conntype} : $REUSE,
-    };
-    bless $self, $class;
-
-    # create the connection if conntype is set to $REUSE
-    $self->_connect_to_mpd_server if $self->_conntype == $REUSE;
-
-
-    # create the helper objects and store them.
-    $self->collection( Audio::MPD::Collection->new($self) );
-    $self->playlist  ( Audio::MPD::Playlist->new($self) );
-
-    # try to issue a ping to test connection - this can die.
-    $self->ping;
-
-    return $self;
-}
-
-
-#--
-# Private methods
-
-
-#
-# $mpd->_connect_to_mpd_server;
-#
-# This method connects to the mpd server. It can die on several conditions:
-#  - if the server cannot be reached,
-#  - if it's not an mpd server,
-#  - or if the password is incorrect,
-#
-sub _connect_to_mpd_server {
-    my ($self) = @_;
-
-    # try to connect to mpd.
-    my $socket = IO::Socket::INET->new(
-        PeerAddr => $self->_host,
-        PeerPort => $self->_port,
-    )
-    or die "Could not create socket: $!\n";
-
-    # parse version information.
-    my $line = $socket->getline;
-    chomp $line;
-    die "Not a mpd server - welcome string was: [$line]\n"
-        if $line !~ /^OK MPD (.+)$/;
-    $self->version($1);
-
-    # send password.
-    if ( $self->_password ) {
-        $socket->print( 'password ' . encode('utf-8', $self->_password) . "\n" );
-        $line = $socket->getline;
-        die $line if $line =~ s/^ACK //;
-    }
-
-    # save socket
-    $self->_socket($socket);
-}
-
-
-#
-# my @result = $mpd->_send_command( $command );
-#
-# This method is central to the module. It is responsible for interacting with
-# mpd by sending the $command and reading output - that will be returned as an
-# array of chomped lines (status line will not be returned).
-#
-# This method can die on several conditions:
-#  - if the server cannot be reached,
-#  - if it's not an mpd server,
-#  - if the password is incorrect,
-#  - or if the command is an invalid mpd command.
-# In the latter case, the mpd error message will be returned.
-#
-sub _send_command {
-    my ($self, $command) = @_;
-
-    $self->_connect_to_mpd_server if $self->_conntype == $ONCE;
-    my $socket = $self->_socket;
-
-    # ok, now we're connected - let's issue the command.
-    $socket->print( encode('utf-8', $command) );
-    my @output;
-    while (defined ( my $line = $socket->getline ) ) {
-        chomp $line;
-        die $line if $line =~ s/^ACK //; # oops - error.
-        last if $line =~ /^OK/;          # end of output.
-        push @output, decode('utf-8', $line);
-    }
-
-    # close the socket.
-    $socket->close if $self->_conntype == $ONCE;
-
-    return @output;
-}
-
-
-#
-# my @items = $mpd->_cooked_command_as_items( $command );
-#
-# Lots of Audio::MPD methods are using _send_command() and then parse the
-# output as a collection of AMC::Item. This method is meant to factorize
-# this code, and will parse the raw output of _send_command() in a cooked
-# list of items.
-#
-sub _cooked_command_as_items {
-    my ($self, $command) = @_;
-
-    my @lines = $self->_send_command($command);
-    my (@items, %param);
-
-    # parse lines in reverse order since "file:" or "directory:" lines
-    # come first. therefore, let's first store every other parameter,
-    # and the last line will trigger the object creation.
-    # of course, since we want to preserve the playlist order, this means
-    # that we're going to unshift the objects instead of push.
-    foreach my $line (reverse @lines) {
-        my ($k,$v) = split /:\s/, $line, 2;
-        $param{$k} = $v;
-        next unless $k eq 'file' || $k eq 'directory' || $k eq 'playlist'; # last param of item
-        unshift @items, Audio::MPD::Common::Item->new(%param);
-        %param = ();
-    }
-
-    return @items;
-}
-
-
-sub _cooked_command_as_filename {
-    my ($self, $command) = @_;
-
-    my @lines = $self->_send_command($command);
-    my (@items, %param);
-
-    # parse lines in reverse order since "file:" or "directory:" lines
-    # come first. therefore, let's first store every other parameter,
-    # and the last line will trigger the object creation.
-    # of course, since we want to preserve the playlist order, this means
-    # that we're going to unshift the objects instead of push.
-    foreach my $line (@lines) {
-        my ($k,$v) = split /:\s/, $line, 2;
-        if ( $k eq 'file'){$param{$k} = $v;}
-        unshift @items, $param{'file'};
-        %param = ();
-    }
-
-    return @items;
-}
-
-#
-# my %hash = $mpd->_cooked_command_as_kv( $command );
-#
-# Lots of Audio::MPD methods are using _send_command() and then parse the
-# output to get a list of key / value (with the colon ":" acting as separator).
-# This method is meant to factorize this code, and will parse the raw output
-# of _send_command() in a cooked hash.
-#
-sub _cooked_command_as_kv {
-    my ($self, $command) = @_;
-    my %hash =
-        map { split(/:\s/, $_, 2) }
-        $self->_send_command($command);
-    return %hash;
-}
-
-#
-# my @list = $mpd->_cooked_command_strip_first_field( $command );
-#
-# Lots of Audio::MPD methods are using _send_command() and then parse the
-# output to remove the first field (with the colon ":" acting as separator).
-# This method is meant to factorize this code, and will parse the raw output
-# of _send_command() in a cooked list of strings.
-#
-sub _cooked_command_strip_first_field {
-    my ($self, $command) = @_;
-
-    my @list =
-        map { ( split(/:\s+/, $_, 2) )[1] }
-        $self->_send_command($command);
-    return @list;
-}
-
-
-#--
-# Public methods
-
-# -- MPD interaction: general commands
-
-#
-# $mpd->ping;
-#
-# Sends a ping command to the mpd server.
-#
-sub ping {
-    my ($self) = @_;
-    $self->_send_command( "ping\n" );
-}
-
-
-#
-# my $version = $mpd->version;
-#
-# Return version of MPD server's connected.
-#
-# sub version {} # implemented as an accessor.
-#
-
-
-#
-# $mpd->kill;
-#
-# Send a message to the MPD server telling it to shut down.
-#
-sub kill {
-    my ($self) = @_;
-    $self->_send_command("kill\n");
-}
-
-
-#
-# $mpd->password( [$password] )
-#
-# Change password used to communicate with MPD server to $password.
-# Empty string is assumed if $password is not supplied.
-#
-sub password {
-    my ($self, $passwd) = @_;
-    $passwd ||= '';
-    $self->_password($passwd);
-    $self->ping; # ping sends a command, and thus the password is sent
-}
-
-
-#
-# $mpd->updatedb( [$path] );
-#
-# Force mpd to rescan its collection. If $path (relative to MPD's music
-# directory) is supplied, MPD will only scan it - otherwise, MPD will rescan
-# its whole collection.
-#
-sub updatedb {
-    my ($self, $path) = @_;
-    $path ||= '';
-    $self->_send_command("update $path\n");
-}
-
-
-#
-# my @handlers = $mpd->urlhandlers;
-#
-# Return an array of supported URL schemes.
-#
-sub urlhandlers {
-    my ($self) = @_;
-    return $self->_cooked_command_strip_first_field("urlhandlers\n");
-}
-
-
-# -- MPD interaction: handling volume & output
-
-#
-# $mpd->volume( [+][-]$volume );
-#
-# Sets the audio output volume percentage to absolute $volume.
-# If $volume is prefixed by '+' or '-' then the volume is changed relatively
-# by that value.
-#
-sub volume {
-    my ($self, $volume) = @_;
-
-    if ($volume =~ /^(-|\+)(\d+)/ )  {
-        my $current = $self->status->volume;
-        $volume = $1 eq '+' ? $current + $2 : $current - $2;
-    }
-    $self->_send_command("setvol $volume\n");
-}
-
-
-#
-# $mpd->output_enable( $output );
-#
-# Enable the specified audio output. $output is the ID of the audio output.
-#
-sub output_enable {
-    my ($self, $output) = @_;
-    $self->_send_command("enableoutput $output\n");
-}
-
-
-#
-# $mpd->output_disable( $output );
-#
-# Disable the specified audio output. $output is the ID of the audio output.
-#
-sub output_disable {
-    my ($self, $output) = @_;
-    $self->_send_command("disableoutput $output\n");
-}
-
-
-
-# -- MPD interaction: retrieving info from current state
-
-#
-# $mpd->stats;
-#
-# Return an AMC::Stats object with the current statistics of MPD.
-#
-sub stats {
-    my ($self) = @_;
-    my %kv = $self->_cooked_command_as_kv( "stats\n" );
-    return Audio::MPD::Common::Stats->new(\%kv);
-}
-
-
-#
-# my $status = $mpd->status;
-#
-# Return an AMC::Status object with various information on current
-# MPD server settings. Check the embedded pod for more information on the
-# available accessors.
-#
-sub status {
-    my ($self) = @_;
-    my %kv = $self->_cooked_command_as_kv( "status\n" );
-    my $status = Audio::MPD::Common::Status->new( \%kv );
-    return $status;
-}
-
-
-#
-# my $song = $mpd->current;
-#
-# Return an AMC::Item::Song representing the song currently playing.
-#
-sub current {
-    my ($self) = @_;
-    my ($item) = $self->_cooked_command_as_items("currentsong\n");
-    return $item;
-}
-
-
-#
-# my $song = $mpd->song( [$song] )
-#
-# Return an AMC::Item::Song representing the song number $song.
-# If $song is not supplied, returns the current song.
-#
-sub song {
-    my ($self, $song) = @_;
-    return $self->current unless defined $song;
-    my ($item) = $self->_cooked_command_as_items("playlistinfo $song\n");
-    return $item;
-}
-
-
-#
-# my $song = $mpd->songid( [$songid] )
-#
-# Return an AMC::Item::Song representing the song with id $songid.
-# If $songid is not supplied, returns the current song.
-#
-sub songid {
-    my ($self, $songid) = @_;
-    return $self->current unless defined $songid;
-    my ($item) = $self->_cooked_command_as_items("playlistid $songid\n");
-    return $item;
-}
-
-
-# -- MPD interaction: altering settings
-
-#
-# $mpd->repeat( [$repeat] );
-#
-# Set the repeat mode to $repeat (1 or 0). If $repeat is not specified then
-# the repeat mode is toggled.
-#
-sub repeat {
-    my ($self, $mode) = @_;
-
-    $mode = not $self->status->repeat
-        unless defined $mode; # toggle if no param
-    $mode = $mode ? 1 : 0;               # force integer
-    $self->_send_command("repeat $mode\n");
-}
-
-
-#
-# $mpd->random( [$random] );
-#
-# Set the random mode to $random (1 or 0). If $random is not specified then
-# the random mode is toggled.
-#
-sub random {
-    my ($self, $mode) = @_;
-
-    $mode = not $self->status->random
-        unless defined $mode; # toggle if no param
-    $mode = $mode ? 1 : 0;               # force integer
-    $self->_send_command("random $mode\n");
-}
-
-
-#
-# $mpd->fade( [$seconds] );
-#
-# Enable crossfading and set the duration of crossfade between songs. If
-# $seconds is not specified or $seconds is 0, then crossfading is disabled.
-#
-sub fade {
-    my ($self, $value) = @_;
-    $value ||= 0;
-    $self->_send_command("crossfade $value\n");
-}
-
-
-# -- MPD interaction: controlling playback
-
-#
-# $mpd->play( [$song] );
-#
-# Begin playing playlist at song number $song. If no argument supplied,
-# resume playing.
-#
-sub play {
-    my ($self, $number) = @_;
-    $number = '' unless defined $number;
-    $self->_send_command("play $number\n");
-}
-
-#
-# $mpd->playid( [$songid] );
-#
-# Begin playing playlist at song ID $songid. If no argument supplied,
-# resume playing.
-#
-sub playid {
-    my ($self, $number) = @_;
-    $number ||= '';
-    $self->_send_command("playid $number\n");
-}
-
-
-#
-# $mpd->pause( [$sate] );
-#
-# Pause playback. If $state is 0 then the current track is unpaused, if
-# $state is 1 then the current track is paused.
-#
-# Note that if $state is not given, pause state will be toggled.
-#
-sub pause {
-    my ($self, $state) = @_;
-    $state ||= ''; # default is to toggle
-    $self->_send_command("pause $state\n");
-}
-
-
-#
-# $mpd->stop;
-#
-# Stop playback.
-#
-sub stop {
-    my ($self) = @_;
-    $self->_send_command("stop\n");
-}
-
-
-#
-# $mpd->next;
-#
-# Play next song in playlist.
-#
-sub next {
-    my ($self) = @_;
-    $self->_send_command("next\n");
-}
-
-#
-# $mpd->prev;
-#
-# Play previous song in playlist.
-#
-sub prev {
-    my($self) = shift;
-    $self->_send_command("previous\n");
-}
-
-
-#
-# $mpd->seek( $time, [$song] );
-#
-# Seek to $time seconds in song number $song. If $song number is not specified
-# then the perl module will try and seek to $time in the current song.
-#
-sub seek {
-    my ($self, $time, $song) = @_;
-    $time ||= 0; $time = int $time;
-    $song = $self->status->song if not defined $song; # seek in current song
-    $self->_send_command( "seek $song $time\n" );
-}
-
-
-#
-# $mpd->seekid( $time, [$songid] );
-#
-# Seek to $time seconds in song ID $songid. If $songid number is not specified
-# then the perl module will try and seek to $time in the current song.
-#
-sub seekid {
-    my ($self, $time, $song) = @_;
-    $time ||= 0; $time = int $time;
-    $song = $self->status->songid if not defined $song; # seek in current song
-    $self->_send_command( "seekid $song $time\n" );
-}
-
-
-1;
-
-
-
-__END__
-
-=pod
-
-=head1 NAME
-
-Audio::MPD - class to talk to MPD (Music Player Daemon) servers
-
-
-=head1 SYNOPSIS
-
-    use Audio::MPD;
-
-    my $mpd = Audio::MPD->new();
-    $mpd->play();
-    sleep 10;
-    $mpd->next();
-
-
-=head1 DESCRIPTION
-
-Audio::MPD gives a clear object-oriented interface for talking to and
-controlling MPD (Music Player Daemon) servers. A connection to the MPD
-server is established as soon as a new Audio::MPD object is created.
-
-Note that the module will by default connect to mpd before sending any
-command, and will disconnect after the command has been issued. This scheme
-is far from optimal, but allows us not to care about timeout disconnections.
-
-B</!\> Note that Audio::MPD is using high-level, blocking sockets. This
-means that if the mpd server is slow, or hangs for whatever reason, or
-even crash abruptly, the program will be hung forever in this sub. The
-POE::Component::Client::MPD module is way safer - you're advised to use
-it instead of Audio::MPD. Or you can try to set C<conntype> to C<$REUSE>
-(see Audio::MPD constructor for more details), but you would be then on
-your own to deal with disconnections.
-
-
-=head1 METHODS
-
-=head2 Constructor
-
-=over 4
-
-=item new( [%opts] )
-
-This is the constructor for Audio::MPD. One can specify the following
-options:
-
-=over 4
-
-=item hostname => C<$hostname>
-
-defaults to environment var MPD_HOST, then to 'localhost'. Note that
-MPD_HOST can be of the form password@host.
-
-=item port => C<$port>
-
-defaults to environment var MPD_PORT, then to 6600.
-
-=item password => $password
-
-defaults to environment var MPD_PASSWORD, then to ''.
-
-=item conntype => $type
-
-change how the connection to mpd server is handled. It can be either
-C<$REUSE> to reuse the same connection or C<$ONCE> to open a new
-connection per command (default)
-
-=back
-
-
-=back
-
-
-=head2 Controlling the server
-
-=over 4
-
-=item $mpd->ping()
-
-Sends a ping command to the mpd server.
-
-
-=item $mpd->version()
-
-Return the version number for the server we are connected to.
-
-
-=item $mpd->kill()
-
-Send a message to the MPD server telling it to shut down.
-
-
-=item $mpd->password( [$password] )
-
-Change password used to communicate with MPD server to $password.
-Empty string is assumed if $password is not supplied.
-
-
-=item $mpd->updatedb( [$path] )
-
-Force mpd to recan its collection. If $path (relative to MPD's music directory)
-is supplied, MPD will only scan it - otherwise, MPD will rescan its whole
-collection.
-
-
-=item $mpd->urlhandlers()
-
-Return an array of supported URL schemes.
-
-
-=back
-
-
-=head2 Handling volume & output
-
-=over 4
-
-=item $mpd->volume( [+][-]$volume )
-
-Sets the audio output volume percentage to absolute $volume.
-If $volume is prefixed by '+' or '-' then the volume is changed relatively
-by that value.
-
-
-=item $mpd->output_enable( $output )
-
-Enable the specified audio output. $output is the ID of the audio output.
-
-
-=item $mpd->output_disable( $output )
-
-Disable the specified audio output. $output is the ID of the audio output.
-
-=back
-
-
-=head2 Retrieving info from current state
-
-=over 4
-
-=item $mpd->stats()
-
-Return an C<Audio::MPD::Common::Stats> object with the current statistics
-of MPD. See the associated pod for more information.
-
-
-=item $mpd->status()
-
-Return an C<Audio::MPD::Common::Status> object with various information on
-current MPD server settings. Check the embedded pod for more information on
-the available accessors.
-
-
-=item $mpd->current()
-
-Return an C<Audio::MPD::Common::Item::Song> representing the song currently
-playing.
-
-
-=item $mpd->song( [$song] )
-
-Return an C<Audio::MPD::Common::Item::Song> representing the song number
-C<$song>. If C<$song> is not supplied, returns the current song.
-
-
-=item $mpd->songid( [$songid] )
-
-Return an C<Audio::MPD::Common::Item::Song> representing the song with id
-C<$songid>. If C<$songid> is not supplied, returns the current song.
-
-=back
-
-
-=head2 Altering MPD settings
-
-=over 4
-
-=item $mpd->repeat( [$repeat] )
-
-Set the repeat mode to $repeat (1 or 0). If $repeat is not specified then
-the repeat mode is toggled.
-
-
-=item $mpd->random( [$random] )
-
-Set the random mode to $random (1 or 0). If $random is not specified then
-the random mode is toggled.
-
-
-=item $mpd->fade( [$seconds] )
-
-Enable crossfading and set the duration of crossfade between songs.
-If $seconds is not specified or $seconds is 0, then crossfading is disabled.
-
-=back
-
-
-=head2 Controlling playback
-
-=over 4
-
-=item $mpd->play( [$song] )
-
-Begin playing playlist at song number $song. If no argument supplied,
-resume playing.
-
-
-=item $mpd->playid( [$songid] )
-
-Begin playing playlist at song ID $songid. If no argument supplied,
-resume playing.
-
-
-=item $mpd->pause( [$state] )
-
-Pause playback. If C<$state> is 0 then the current track is unpaused,
-if $state is 1 then the current track is paused.
-
-Note that if C<$state> is not given, pause state will be toggled.
-
-
-=item $mpd->stop()
-
-Stop playback.
-
-
-=item $mpd->next()
-
-Play next song in playlist.
-
-
-=item $mpd->prev()
-
-Play previous song in playlist.
-
-
-=item $mpd->seek( $time, [$song])
-
-Seek to $time seconds in song number $song. If $song number is not specified
-then the perl module will try and seek to $time in the current song.
-
-
-=item $mpd->seekid( $time, $songid )
-
-Seek to $time seconds in song ID $songid. If $song number is not specified
-then the perl module will try and seek to $time in the current song.
-
-=back
-
-
-=head2 Searching the collection
-
-To search the collection, use the C<collection()> accessor, returning the
-associated C<Audio::MPD::Collection> object. You will then be able to call:
-
-    $mpd->collection->random_song();
-
-See C<Audio::MPD::Collection> documentation for more details on available
-methods.
-
-
-=head2 Handling the playlist
-
-To update the playlist, use the C<playlist()> accessor, returning the
-associated C<Audio::MPD::Playlist> object. You will then be able to call:
-
-    $mpd->playlist->clear;
-
-See C<Audio::MPD::Playlist> documentation for more details on available
-methods.
-
-
-=head1 SEE ALSO
-
-You can find more information on the mpd project on its homepage at
-L<http://www.musicpd.org>, or its wiki L<http://mpd.wikia.com>.
-
-Regarding this Perl module, you can report bugs on CPAN via
-L<http://rt.cpan.org/Public/Bug/Report.html?Queue=Audio-MPD>.
-
-Audio::MPD development takes place on <audio-mpd@googlegroups.com>: feel free
-to join us. (use L<http://groups.google.com/group/audio-mpd> to sign in). Our
-subversion repository is located at L<https://svn.musicpd.org>.
-
-
-=head1 AUTHOR
-
-Jerome Quelin, C<< <jquelin at cpan.org> >>
-
-Original code by Tue Abrahamsen C<< <tue.abrahamsen at gmail.com> >>,
-documented by Nicholas J. Humfrey C<< <njh at aelius.com> >>.
-
-
-=head1 COPYRIGHT & LICENSE
-
-Copyright (c) 2005 Tue Abrahamsen, all rights reserved.
-Copyright (c) 2006 Nicolas J. Humfrey, all rights reserved.
-Copyright (c) 2007 Jerome Quelin, all rights reserved.
-
-This program is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself.
-
-=cut
diff --git a/config/mpfire/perl/Audio/MPD/Collection.pm b/config/mpfire/perl/Audio/MPD/Collection.pm
deleted file mode 100644
index 727512808..000000000
--- a/config/mpfire/perl/Audio/MPD/Collection.pm
+++ /dev/null
@@ -1,594 +0,0 @@ 
-#
-# This file is part of Audio::MPD
-# Copyright (c) 2007 Jerome Quelin, all rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the same terms as Perl itself.
-#
-#
-
-package Audio::MPD::Collection;
-
-use strict;
-use warnings;
-use Scalar::Util qw[ weaken ];
-
-use base qw[ Class::Accessor::Fast ];
-__PACKAGE__->mk_accessors( qw[ _mpd ] );
-
-
-#our ($VERSION) = '$Rev: 5284 $' =~ /(\d+)/;
-
-
-#--
-# Constructor
-
-#
-# my $collection = Audio::MPD::Collection->new( $mpd );
-#
-# This will create the object, holding a back-reference to the Audio::MPD
-# object itself (for communication purposes). But in order to play safe and
-# to free the memory in time, this reference is weakened.
-#
-# Note that you're not supposed to call this constructor yourself, an
-# Audio::MPD::Collection is automatically created for you during the creation
-# of an Audio::MPD object.
-#
-sub new {
-    my ($pkg, $mpd) = @_;
-
-    my $self = { _mpd => $mpd };
-    weaken( $self->{_mpd} );
-    bless $self, $pkg;
-    return $self;
-}
-
-
-#--
-# Public methods
-
-# -- Collection: retrieving songs & directories
-
-#
-# my @items = $collection->all_items( [$path] );
-#
-# Return *all* AMC::Items (both songs & directories) currently known
-# by mpd.
-#
-# If $path is supplied (relative to mpd root), restrict the retrieval to
-# songs and dirs in this directory.
-#
-sub all_items {
-    my ($self, $path) = @_;
-    $path ||= '';
-    $path =~ s/"/\\"/g;
-
-    return $self->_mpd->_cooked_command_as_items( qq[listallinfo "$path"\n] );
-}
-
-
-#
-# my @items = $collection->all_items_simple( [$path] );
-#
-# Return *all* AMC::Items (both songs & directories) currently known
-# by mpd.
-#
-# If $path is supplied (relative to mpd root), restrict the retrieval to
-# songs and dirs in this directory.
-#
-# /!\ Warning: the AMC::Item::Song objects will only have their tag
-# file filled. Any other tag will be empty, so don't use this sub for any
-# other thing than a quick scan!
-#
-sub all_items_simple {
-    my ($self, $path) = @_;
-    $path ||= '';
-    $path =~ s/"/\\"/g;
-
-    return $self->_mpd->_cooked_command_as_items( qq[listall "$path"\n] );
-}
-
-
-#
-# my @items = $collection->items_in_dir( [$path] );
-#
-# Return the items in the given $path. If no $path supplied, do it on mpd's
-# root directory.
-#
-# Note that this sub does not work recusrively on all directories.
-#
-sub items_in_dir {
-    my ($self, $path) = @_;
-    $path ||= '';
-    $path =~ s/"/\\"/g;
-
-    return $self->_mpd->_cooked_command_as_items( qq[lsinfo "$path"\n] );
-}
-
-
-
-# -- Collection: retrieving the whole collection
-
-#
-# my @songs = $collection->all_songs( [$path] );
-#
-# Return *all* AMC::Item::Songs currently known by mpd.
-#
-# If $path is supplied (relative to mpd root), restrict the retrieval to
-# songs and dirs in this directory.
-#
-sub all_songs {
-    my ($self, $path) = @_;
-    return grep { $_->isa('Audio::MPD::Common::Item::Song') } $self->all_items($path);
-}
-
-
-#
-# my @albums = $collection->all_albums;
-#
-# Return the list of all albums (strings) currently known by mpd.
-#
-sub all_albums {
-    my ($self) = @_;
-    return $self->_mpd->_cooked_command_strip_first_field( "list album\n" );
-}
-
-
-#
-# my @artists = $collection->all_artists;
-#
-# Return the list of all artists (strings) currently known by mpd.
-#
-sub all_artists {
-    my ($self) = @_;
-    return $self->_mpd->_cooked_command_strip_first_field( "list artist\n" );
-}
-
-
-#
-# my @titles = $collection->all_titles;
-#
-# Return the list of all titles (strings) currently known by mpd.
-#
-sub all_titles {
-    my ($self) = @_;
-    return $self->_mpd->_cooked_command_strip_first_field( "list title\n" );
-}
-
-
-#
-# my @genre = $collection->all_genre;
-#
-# Return the list of all genres (strings) currently known by mpd.
-#
-sub all_genre {
-    my ($self) = @_;
-    return $self->_mpd->_cooked_command_strip_first_field( "list genre\n" );
-}
-
-
-#
-# my @yers = $collection->all_years;
-#
-# Return the list of all years (strings) currently known by mpd.
-#
-sub all_years {
-    my ($self) = @_;
-    return $self->_mpd->_cooked_command_strip_first_field( "list date\n" );
-}
-
-
-#
-# my @pathes = $collection->all_pathes;
-#
-# Return the list of all pathes (strings) currently known by mpd.
-#
-sub all_pathes {
-    my ($self) = @_;
-    return $self->_mpd->_cooked_command_strip_first_field( "list filename\n" );
-}
-
-
-#
-# my @items = $collection->all_playlists;
-#
-# Return the list of playlists (strings) currently known by mpd.
-#
-sub all_playlists {
-    my ($self) = @_;
-
-    return
-        map { /^playlist: (.*)$/ ? ($1) : () }
-        $self->_mpd->_send_command( "lsinfo\n" );
-}
-
-
-
-# -- Collection: picking songs
-
-#
-# my $song = $collection->song( $path );
-#
-# Return the AMC::Item::Song which correspond to $path.
-#
-sub song {
-    my ($self, $what) = @_;
-    $what =~ s/"/\\"/g;
-
-    my ($item) = $self->_mpd->_cooked_command_as_items( qq[find filename "$what"\n] );
-    return $item;
-}
-
-
-#
-# my $song = $collection->songs_with_filename_partial( $path );
-#
-# Return the AMC::Item::Songs containing $string in their path.
-#
-sub songs_with_filename_partial {
-    my ($self, $what) = @_;
-    $what =~ s/"/\\"/g;
-
-    return $self->_mpd->_cooked_command_as_items( qq[search filename "$what"\n] );
-}
-
-
-# -- Collection: songs, albums & artists relations
-
-#
-# my @albums = $collection->albums_by_artist($artist);
-#
-# Return all albums (strings) performed by $artist or where $artist
-# participated.
-#
-sub albums_by_artist {
-    my ($self, $artist) = @_;
-    $artist =~ s/"/\\"/g;
-    return $self->_mpd->_cooked_command_strip_first_field( qq[list album "$artist"\n] );
-}
-
-
-#
-# my @songs = $collection->songs_by_artist( $genre );
-#
-# Return all AMC::Item::Songs performed in $genre.
-#
-
-sub songs_by_genre {
-    my ($self, $what) = @_;
-    $what =~ s/"/\\"/g;
-
-    return $self->_mpd->_cooked_command_as_items( qq[find genre "$what"\n] );
-}
-
-
-sub filenames_by_artist {
-    my ($self, $what) = @_;
-    $what =~ s/"/\\"/g;
-
-    return $self->_mpd->_cooked_command_as_filename( qq[find artist "$what"\n] );
-}
-
-
-sub filenames_by_year {
-    my ($self, $what) = @_;
-    $what =~ s/"/\\"/g;
-
-    return $self->_mpd->_cooked_command_as_filename( qq[find date "$what"\n] );
-}
-
-sub filenames_by_genre {
-    my ($self, $what) = @_;
-    $what =~ s/"/\\"/g;
-
-    return $self->_mpd->_cooked_command_as_filename( qq[find genre "$what"\n] );
-}
-
-
-sub filenames_by_album {
-    my ($self, $what) = @_;
-    $what =~ s/"/\\"/g;
-
-    return $self->_mpd->_cooked_command_as_filename( qq[find album "$what"\n] );
-}
-
-
-#
-# my @songs = $collection->songs_by_artist_partial( $string );
-#
-# Return all AMC::Item::Songs performed by an artist with $string
-# in her name.
-#
-sub songs_by_artist_partial {
-    my ($self, $what) = @_;
-    $what =~ s/"/\\"/g;
-
-    return $self->_mpd->_cooked_command_as_items( qq[search artist "$what"\n] );
-}
-
-
-#
-# my @songs = $collection->songs_from_album( $album );
-#
-# Return all AMC::Item::Songs appearing in $album.
-#
-sub songs_from_album {
-    my ($self, $what) = @_;
-    $what =~ s/"/\\"/g;
-
-    return $self->_mpd->_cooked_command_as_items( qq[find album "$what"\n] );
-}
-
-
-#
-# my @songs = $collection->songs_from_album_partial( $string );
-#
-# Return all AMC::Item::Songs appearing in album containing $string.
-#
-sub songs_from_album_partial {
-    my ($self, $what) = @_;
-    $what =~ s/"/\\"/g;
-
-    return $self->_mpd->_cooked_command_as_items( qq[search album "$what"\n] );
-}
-
-
-#
-# my @songs = $collection->songs_with_title( $title );
-#
-# Return all AMC::Item::Songs which title is exactly $title.
-#
-sub songs_with_title {
-    my ($self, $what) = @_;
-    $what =~ s/"/\\"/g;
-
-    return $self->_mpd->_cooked_command_as_items( qq[find title "$what"\n] );
-}
-
-
-#
-# my @songs = $collection->songs_with_title_partial( $string );
-#
-# Return all AMC::Item::Songs where $string is part of the title.
-#
-sub songs_with_title_partial {
-    my ($self, $what) = @_;
-    $what =~ s/"/\\"/g;
-
-    return $self->_mpd->_cooked_command_as_items( qq[search title "$what"\n] );
-}
-
-
-# my @songs = $collection->songs_with_title_partial_filename( $string );
-#
-# Return all AMC::Item::Songs where $string is part of the title.
-#
-sub songs_with_title_partial_filename {
-    my ($self, $what) = @_;
-    $what =~ s/"/\\"/g;
-
-
-    return $self->_mpd->_cooked_command_as_filename( qq[search title "$what"\n] );
-}
-
-# my @songs = $collection->songs_with_artist_partial_filename( $string );
-#
-# Return all AMC::Item::Songs where $string is part of the artist.
-#
-sub songs_with_artist_partial_filename {
-    my ($self, $what) = @_;
-    $what =~ s/"/\\"/g;
-
-    return $self->_mpd->_cooked_command_as_filename( qq[search artist "$what"\n] );
-}
-
-
-# my @songs = $collection->songs_with_album_partial_filename( $string );
-#
-# Return all AMC::Item::Songs where $string is part of the album.
-#
-sub songs_with_album_partial_filename {
-    my ($self, $what) = @_;
-    $what =~ s/"/\\"/g;
-
-    return $self->_mpd->_cooked_command_as_filename( qq[search album "$what"\n] );
-}
-
-
-1;
-
-__END__
-
-
-=head1 NAME
-
-Audio::MPD::Collection - an object to query MPD's collection
-
-
-=head1 SYNOPSIS
-
-    my $song = $mpd->collection->random_song;
-
-
-=head1 DESCRIPTION
-
-C<Audio::MPD::Collection> is a class meant to access & query MPD's
-collection. You will be able to use those high-level methods instead
-of using the low-level methods provided by mpd itself.
-
-
-=head1 PUBLIC METHODS
-
-=head2 Constructor
-
-=over 4
-
-=item new( $mpd )
-
-This will create the object, holding a back-reference to the C<Audio::MPD>
-object itself (for communication purposes). But in order to play safe and
-to free the memory in time, this reference is weakened.
-
-Note that you're not supposed to call this constructor yourself, an
-C<Audio::MPD::Collection> is automatically created for you during the creation
-of an C<Audio::MPD> object.
-
-=back
-
-
-=head2 Retrieving songs & directories
-
-=over 4
-
-=item $coll->all_items( [$path] )
-
-Return B<all> C<Audio::MPD::Common::Item>s (both songs & directories)
-currently known by mpd.
-
-If C<$path> is supplied (relative to mpd root), restrict the retrieval to
-songs and dirs in this directory.
-
-
-=item $coll->all_items_simple( [$path] )
-
-Return B<all> C<Audio::MPD::Common::Item>s (both songs & directories)
-currently known by mpd.
-
-If C<$path> is supplied (relative to mpd root), restrict the retrieval to
-songs and dirs in this directory.
-
-B</!\ Warning>: the C<Audio::MPD::Common::Item::Song> objects will only have
-their tag file filled. Any other tag will be empty, so don't use this sub for
-any other thing than a quick scan!
-
-
-=item $coll->items_in_dir( [$path] )
-
-Return the items in the given C<$path>. If no C<$path> supplied, do it on
-mpd's root directory.
-
-Note that this sub does not work recusrively on all directories.
-
-
-=back
-
-
-=head2 Retrieving the whole collection
-
-=over 4
-
-=item $coll->all_songs( [$path] )
-
-Return B<all> C<Audio::MPD::Common::Item::Song>s currently known by mpd.
-
-If C<$path> is supplied (relative to mpd root), restrict the retrieval to
-songs and dirs in this directory.
-
-
-=item $coll->all_albums()
-
-Return the list of all albums (strings) currently known by mpd.
-
-
-=item $coll->all_artists()
-
-Return the list of all artists (strings) currently known by mpd.
-
-
-=item $coll->all_titles()
-
-Return the list of all song titles (strings) currently known by mpd.
-
-
-=item $coll->all_pathes()
-
-Return the list of all pathes (strings) currently known by mpd.
-
-
-=item $coll->all_playlists()
-
-Return the list of all playlists (strings) currently known by mpd.
-
-
-=back
-
-
-=head2 Picking a song
-
-=over 4
-
-=item $coll->song( $path )
-
-Return the C<Audio::MPD::Common::Item::Song> which correspond to C<$path>.
-
-
-=item $coll->songs_with_filename_partial( $path )
-
-Return the C<Audio::MPD::Common::Item::Song>s containing $string in their path.
-
-
-=back
-
-
-=head2 Songs, albums & artists relations
-
-=over 4
-
-=item $coll->albums_by_artist( $artist )
-
-Return all albums (strings) performed by C<$artist> or where C<$artist>
-participated.
-
-
-=item $coll->songs_by_artist( $artist )
-
-Return all C<Audio::MPD::Common::Item::Song>s performed by C<$artist>.
-
-
-=item $coll->songs_by_artist_partial( $string )
-
-Return all C<Audio::MPD::Common::Item::Song>s performed by an artist with
-C<$string> in her name.
-
-
-=item $coll->songs_from_album( $album )
-
-Return all C<Audio::MPD::Common::Item::Song>s appearing in C<$album>.
-
-
-=item $coll->songs_from_album_partial( $string )
-
-Return all C<Audio::MPD::Common::Item::Song>s appearing in album containing C<$string>.
-
-
-=item $coll->songs_with_title( $title )
-
-Return all C<Audio::MPD::Common::Item::Song>s which title is exactly C<$title>.
-
-
-=item $coll->songs_with_title_partial( $string )
-
-Return all C<Audio::MPD::Common::Item::Song>s where C<$string> is part of the title.
-
-
-=back
-
-
-=head1 SEE ALSO
-
-L<Audio::MPD>
-
-
-=head1 AUTHOR
-
-Jerome Quelin, C<< <jquelin at cpan.org> >>
-
-
-=head1 COPYRIGHT & LICENSE
-
-Copyright (c) 2007 Jerome Quelin, all rights reserved.
-
-This program is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself.
-
-=cut
diff --git a/config/mpfire/perl/Audio/MPD/Common.pm b/config/mpfire/perl/Audio/MPD/Common.pm
deleted file mode 100644
index 07de83c20..000000000
--- a/config/mpfire/perl/Audio/MPD/Common.pm
+++ /dev/null
@@ -1,88 +0,0 @@ 
-#
-# This file is part of Audio::MPD::Common
-# Copyright (c) 2007 Jerome Quelin, all rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the same terms as Perl itself.
-#
-#
-
-package Audio::MPD::Common;
-
-use warnings;
-use strict;
-our $VERSION = '0.1.2';
-
-1;
-
-__END__
-
-
-=head1 NAME
-
-Audio::MPD::Common - a bunch of common helper classes for mpd
-
-
-=head1 DESCRIPTION
-
-Depending on whether you're using a POE-aware environment or not, people
-wanting to tinker with mpd (Music Player Daemon) will use either
-L<POE::Component::Client::MPD> or L<Audio::MPD>.
-
-But even if the run-cores of those two modules differ completely, they
-are using the exact same common classes to represent the various mpd
-states and information.
-
-Therefore, those common classes have been outsourced to
-L<Audio::MPD::Common>.
-
-This module does not export any methods, but the dist provides the
-following classes that you can query with perldoc:
-
-=over 4
-
-=item o L<Audio::MPD::Common::Item>
-
-=item o L<Audio::MPD::Common::Item::Directory>
-
-=item o L<Audio::MPD::Common::Item::Playlist>
-
-=item o L<Audio::MPD::Common::Item::Song>
-
-=item o L<Audio::MPD::Common::Stats>
-
-=item o L<Audio::MPD::Common::Status>
-
-=item o L<Audio::MPD::Common::Time>
-
-=back
-
-
-Note that those modules should not be of any use outside the two mpd
-modules afore-mentioned.
-
-
-=head1 SEE ALSO
-
-=over 4
-
-=item L<Audio::MPD>
-
-=item L<POE::Component::Client::MPD>
-
-=back
-
-
-=head1 AUTHOR
-
-Jerome Quelin, C<< <jquelin at cpan.org> >>
-
-
-=head1 COPYRIGHT & LICENSE
-
-Copyright (c) 2007 Jerome Quelin, all rights reserved.
-
-This program is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself.
-
-=cut
diff --git a/config/mpfire/perl/Audio/MPD/Common/Item.pm b/config/mpfire/perl/Audio/MPD/Common/Item.pm
deleted file mode 100644
index e1d4fa84d..000000000
--- a/config/mpfire/perl/Audio/MPD/Common/Item.pm
+++ /dev/null
@@ -1,100 +0,0 @@ 
-#
-# This file is part of Audio::MPD::Common
-# Copyright (c) 2007 Jerome Quelin, all rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the same terms as Perl itself.
-#
-#
-
-package Audio::MPD::Common::Item;
-
-use strict;
-use warnings;
-use Audio::MPD::Common::Item::Directory;
-use Audio::MPD::Common::Item::Playlist;
-use Audio::MPD::Common::Item::Song;
-
-#our ($VERSION) = '$Rev: 5645 $' =~ /(\d+)/;
-
-#
-# constructor.
-#
-sub new {
-    my ($pkg, %params) = @_;
-
-    # transform keys in lowercase.
-    my %lowcase;
-    @lowcase{ keys %params } = values %params;
-
-    return Audio::MPD::Common::Item::Song->new(\%lowcase)      if exists $params{file};
-    return Audio::MPD::Common::Item::Directory->new(\%lowcase) if exists $params{directory};
-    return Audio::MPD::Common::Item::Playlist->new(\%lowcase)  if exists $params{playlist};
-}
-
-1;
-
-__END__
-
-
-=head1 NAME
-
-Audio::MPD::Common::Item - a generic collection item
-
-
-=head1 SYNOPSIS
-
-    my $item = Audio::MPD::Common::Item->new( %params );
-
-
-=head1 DESCRIPTION
-
-C<Audio::MPD::Common::Item> is a virtual class representing a generic
-item of mpd's collection. It can be either a song, a directory or a playlist.
-
-Depending on the params given to C<new>, it will create and return an
-C<Audio::MPD::Common::Item::Song>, an C<Audio::MPD::Common::Item::Directory>
-or an C<Audio::MPD::Common::Playlist> object. Currently, the
-discrimination is done on the existence of the C<file> key of C<%params>.
-
-
-=head1 PUBLIC METHODS
-
-Note that the only sub worth it in this class is the constructor:
-
-=over 4
-
-=item new( key => val [, key => val [, ...] ] )
-
-Create and return either an C<Audio::MPD::Common::Item::Song>, an
-C<Audio::MPD::Common::Item::Directory> or an C<Audio::MPD::Common::Playlist>
-object, depending on the existence of a key C<file>, C<directory> or
-C<playlist> (respectively).
-
-=back
-
-
-=head1 SEE ALSO
-
-=over 4
-
-=item L<Audio::MPD>
-
-=item L<POE::Component::Client::MPD>
-
-=back
-
-
-=head1 AUTHOR
-
-Jerome Quelin, C<< <jquelin at cpan.org> >>
-
-
-=head1 COPYRIGHT & LICENSE
-
-Copyright (c) 2007 Jerome Quelin, all rights reserved.
-
-This program is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself.
-
-=cut
diff --git a/config/mpfire/perl/Audio/MPD/Common/Item/Directory.pm b/config/mpfire/perl/Audio/MPD/Common/Item/Directory.pm
deleted file mode 100644
index cd9076dc1..000000000
--- a/config/mpfire/perl/Audio/MPD/Common/Item/Directory.pm
+++ /dev/null
@@ -1,72 +0,0 @@ 
-#
-# This file is part of Audio::MPD::Common
-# Copyright (c) 2007 Jerome Quelin, all rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the same terms as Perl itself.
-#
-#
-
-package Audio::MPD::Common::Item::Directory;
-
-use strict;
-use warnings;
-
-use base qw[ Class::Accessor::Fast Audio::MPD::Common::Item ];
-__PACKAGE__->mk_accessors( qw[ directory ] );
-
-#our ($VERSION) = '$Rev: 5645 $' =~ /(\d+)/;
-
-1;
-
-__END__
-
-
-=head1 NAME
-
-Audio::MPD::Common::Item::Directory - a directory object
-
-
-=head1 SYNOPSIS
-
-    print $item->directory . "\n";
-
-
-=head1 DESCRIPTION
-
-C<Audio::MPD::Common::Item::Directory> is more a placeholder for a
-hash ref with one pre-defined key, namely the directory name.
-
-
-=head1 PUBLIC METHODS
-
-This module only has a C<new()> constructor, which should only be called by
-C<Audio::MPD::Common::Item>'s constructor.
-
-The only other public method is an accessor: directory().
-
-
-=head1 SEE ALSO
-
-=over 4
-
-=item L<Audio::MPD>
-
-=item L<POE::Component::Client::MPD>
-
-=back
-
-
-=head1 AUTHOR
-
-Jerome Quelin, C<< <jquelin at cpan.org> >>
-
-
-=head1 COPYRIGHT & LICENSE
-
-Copyright (c) 2007 Jerome Quelin, all rights reserved.
-
-This program is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself.
-
-=cut
diff --git a/config/mpfire/perl/Audio/MPD/Common/Item/Playlist.pm b/config/mpfire/perl/Audio/MPD/Common/Item/Playlist.pm
deleted file mode 100644
index bfeda9853..000000000
--- a/config/mpfire/perl/Audio/MPD/Common/Item/Playlist.pm
+++ /dev/null
@@ -1,72 +0,0 @@ 
-#
-# This file is part of Audio::MPD::Common
-# Copyright (c) 2007 Jerome Quelin, all rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the same terms as Perl itself.
-#
-#
-
-package Audio::MPD::Common::Item::Playlist;
-
-use strict;
-use warnings;
-
-use base qw[ Class::Accessor::Fast Audio::MPD::Common::Item ];
-__PACKAGE__->mk_accessors( qw[ playlist ] );
-
-#our ($VERSION) = '$Rev: 5645 $' =~ /(\d+)/;
-
-1;
-
-__END__
-
-
-=head1 NAME
-
-Audio::MPD::Common::Item::Playlist - a playlist object
-
-
-=head1 SYNOPSIS
-
-    print $item->playlist . "\n";
-
-
-=head1 DESCRIPTION
-
-C<Audio::MPD::Common::Item::Playlist> is more a placeholder for a hash ref
-with one pre-defined key, namely the playlist name.
-
-
-=head1 PUBLIC METHODS
-
-This module only has a C<new()> constructor, which should only be called by
-C<Audio::MPD::Common::Item>'s constructor.
-
-The only other public method is an accessor: playlist().
-
-
-=head1 SEE ALSO
-
-=over 4
-
-=item L<Audio::MPD>
-
-=item L<POE::Component::Client::MPD>
-
-=back
-
-
-=head1 AUTHOR
-
-Jerome Quelin, C<< <jquelin at cpan.org> >>
-
-
-=head1 COPYRIGHT & LICENSE
-
-Copyright (c) 2007 Jerome Quelin, all rights reserved.
-
-This program is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself.
-
-=cut
diff --git a/config/mpfire/perl/Audio/MPD/Common/Item/Song.pm b/config/mpfire/perl/Audio/MPD/Common/Item/Song.pm
deleted file mode 100644
index 4ce8d6da3..000000000
--- a/config/mpfire/perl/Audio/MPD/Common/Item/Song.pm
+++ /dev/null
@@ -1,133 +0,0 @@ 
-#
-# This file is part of Audio::MPD::Common
-# Copyright (c) 2007 Jerome Quelin, all rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the same terms as Perl itself.
-#
-#
-
-package Audio::MPD::Common::Item::Song;
-
-use strict;
-use warnings;
-
-use overload '""' => \&as_string;
-use Readonly;
-
-use base qw[ Class::Accessor::Fast Audio::MPD::Common::Item ];
-__PACKAGE__->mk_accessors( qw[ Album Artist file id pos Title Track time ] );
-
-#our ($VERSION) = '$Rev: 5645 $' =~ /(\d+)/;
-
-Readonly my $SEP => ' = ';
-
-
-#
-# my $str = $song->as_string;
-#
-# Return a string representing $song. This string will be;
-#  - either "Album = Track = Artist = Title"
-#  - or     "Artist = Title"
-#  - or     "Title"
-#  - or     "file"
-# (in this order), depending on the existing tags of the song. The last
-# possibility always exist of course, since it's a path.
-#
-sub as_string {
-    my ($self) = @_;
-
-    return $self->file unless defined $self->Title;
-    my $str = $self->Title;
-    return $str unless defined $self->Artist;
-    $str = $self->Artist . $SEP . $str;
-    return $str unless defined $self->Album && defined $self->Track;
-    return join $SEP,
-        $self->Album,
-        $self->Track,
-        $str;
-}
-
-1;
-
-__END__
-
-
-=head1 NAME
-
-Audio::MPD::Common::Item::Song - a song object with some audio tags
-
-
-=head1 DESCRIPTION
-
-C<Audio::MPD::Common::Item::Song> is more a placeholder for a
-hash ref with some pre-defined keys, namely some audio tags.
-
-
-=head1 PUBLIC METHODS
-
-This module has a C<new()> constructor, which should only be called by
-C<Audio::MPD::Common::Item>'s constructor.
-
-The only other public methods are the accessors - see below.
-
-
-=head2 Accessors
-
-The following methods are the accessors to their respective named fields:
-C<Album()>, C<Artist()>, C<file()>, C<id>, C<pos>, C<Title()>, CTTrack()>,
-C<time()>. You can call them either with no arg to get the value, or with
-an arg to replace the current value.
-
-
-=head2 Methods
-
-
-=over 4
-
-=item $song->as_string()
-
-Return a string representing $song. This string will be:
-
-=over 4
-
-=item either "Album = Track = Artist = Title"
-
-=item or "Artist = Title"
-
-=item or "Title"
-
-=item or "file"
-
-=back
-
-(in this order), depending on the existing tags of the song. The last
-possibility always exist of course, since it's a path.
-
-=back
-
-
-=head1 SEE ALSO
-
-=over 4
-
-=item L<Audio::MPD>
-
-=item L<POE::Component::Client::MPD>
-
-=back
-
-
-=head1 AUTHOR
-
-Jerome Quelin, C<< <jquelin at cpan.org> >>
-
-
-=head1 COPYRIGHT & LICENSE
-
-Copyright (c) 2007 Jerome Quelin, all rights reserved.
-
-This program is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself.
-
-=cut
diff --git a/config/mpfire/perl/Audio/MPD/Common/Stats.pm b/config/mpfire/perl/Audio/MPD/Common/Stats.pm
deleted file mode 100644
index 06749072e..000000000
--- a/config/mpfire/perl/Audio/MPD/Common/Stats.pm
+++ /dev/null
@@ -1,135 +0,0 @@ 
-#
-# This file is part of Audio::MPD::Common
-# Copyright (c) 2007 Jerome Quelin, all rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the same terms as Perl itself.
-#
-#
-
-package Audio::MPD::Common::Stats;
-
-use warnings;
-use strict;
-
-use base qw[ Class::Accessor::Fast ];
-__PACKAGE__->mk_accessors
-    ( qw[ artists albums songs uptime playtime db_playtime db_update ] );
-
-#our ($VERSION) = '$Rev$' =~ /(\d+)/;
-
-1;
-
-__END__
-
-
-=head1 NAME
-
-Audio::MPD::Common::Stats - class representing MPD stats
-
-
-=head1 SYNOPSIS
-
-    print $stats->artists;
-
-
-=head1 DESCRIPTION
-
-The MPD server maintains some general information. Those information can be
-queried with the mpd modules. Some of those information are served to you as
-an C<Audio::MPD::Common::Status> object.
-
-Note that an C<Audio::MPD::Common::Stats> object does B<not> update itself
-regularly, and thus should be used immediately.
-
-
-=head1 METHODS
-
-=head2 Constructor
-
-=over 4
-
-=item new( %kv )
-
-The C<new()> method is the constructor for the C<Audio::MPD::Common::Stats>
-class.
-
-Note: one should B<never> ever instantiate an C<Audio::MPD::Common::Stats>
-object directly - use the mpd modules instead.
-
-=back
-
-
-=head2 Accessors
-
-Once created, one can access to the following members of the object:
-
-=over 4
-
-=item $stats->artists()
-
-Number of artists in the music database.
-
-
-=item $stats->albums()
-
-Number of albums in the music database.
-
-
-=item $stats->songs()
-
-Number of songs in the music database.
-
-
-=item $stats->uptime()
-
-Daemon uptime (time since last startup) in seconds.
-
-
-=item $stats->playtime()
-
-Time length of music played.
-
-
-=item $stats->db_playtime()
-
-Sum of all song times in the music database.
-
-
-=item $stats->db_update()
-
-Last database update in UNIX time.
-
-
-=back
-
-
-Please note that those accessors are read-only: changing a value will B<not>
-change the current settings of MPD server. Use the mpd modules to alter the
-settings.
-
-
-=head1 SEE ALSO
-
-=over 4
-
-=item L<Audio::MPD>
-
-=item L<POE::Component::Client::MPD>
-
-=back
-
-
-=head1 AUTHOR
-
-Jerome Quelin, C<< <jquelin at cpan.org> >>
-
-
-=head1 COPYRIGHT & LICENSE
-
-Copyright (c) 2007 Jerome Quelin, all rights reserved.
-
-This program is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself.
-
-=cut
diff --git a/config/mpfire/perl/Audio/MPD/Common/Status.pm b/config/mpfire/perl/Audio/MPD/Common/Status.pm
deleted file mode 100644
index f9c98e2f6..000000000
--- a/config/mpfire/perl/Audio/MPD/Common/Status.pm
+++ /dev/null
@@ -1,192 +0,0 @@ 
-#
-# This file is part of Audio::MPD::Common
-# Copyright (c) 2007 Jerome Quelin, all rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the same terms as Perl itself.
-#
-#
-
-package Audio::MPD::Common::Status;
-
-use warnings;
-use strict;
-
-use Audio::MPD::Common::Time;
-
-use base qw[ Class::Accessor::Fast ];
-__PACKAGE__->mk_accessors
-    ( qw[ audio bitrate error playlist playlistlength random
-          repeat song songid state time volume updating_db xfade ] );
-
-#our ($VERSION) = '$Rev: 5865 $' =~ /(\d+)/;
-
-
-#--
-# Constructor
-
-#
-# my $status = Audio::MPD::Common::Status->new( \%kv )
-#
-# The constructor for the class Audio::MPD::Common::Status. %kv is
-# a cooked output of what MPD server returns to the status command.
-#
-sub new {
-    my ($class, $kv) = @_;
-    my %kv = %$kv;
-    $kv{time} = Audio::MPD::Common::Time->new( delete $kv{time} );
-    bless \%kv, $class;
-    return \%kv;
-}
-
-1;
-
-__END__
-
-
-=head1 NAME
-
-Audio::MPD::Common::Status - class representing MPD status
-
-
-=head1 SYNOPSIS
-
-    print $status->bitrate;
-
-
-=head1 DESCRIPTION
-
-The MPD server maintains some information on its current state. Those
-information can be queried with mpd modules. Some of those information
-are served to you as an C<Audio::MPD::Common::Status> object.
-
-Note that an C<Audio::MPD::Common::Status> object does B<not> update
-itself regularly, and thus should be used immediately.
-
-
-=head1 METHODS
-
-=head2 Constructor
-
-=over 4
-
-=item new( \%kv )
-
-The C<new()> method is the constructor for the C<Audio::MPD::Common::Status>
-class.
-
-Note: one should B<never> ever instantiate an C<Audio::MPD::Common::Status>
-object directly - use the mpd modules instead.
-
-=back
-
-
-=head2 Accessors
-
-Once created, one can access to the following members of the object:
-
-=over 4
-
-=item $status->audio()
-
-A string with the sample rate of the song currently playing, number of bits
-of the output and number of channels (2 for stereo) - separated by a colon.
-
-
-=item $status->bitrate()
-
-The instantaneous bitrate in kbps.
-
-
-=item $status->error()
-
-May appear in special error cases, such as when disabling output.
-
-
-=item $status->playlist()
-
-The playlist version number, that changes every time the playlist is updated.
-
-
-=item $status->playlistlength()
-
-The number of songs in the playlist.
-
-
-=item $status->random()
-
-Whether the playlist is read randomly or not.
-
-
-=item $status->repeat()
-
-Whether the song is repeated or not.
-
-
-=item $status->song()
-
-The offset of the song currently played in the playlist.
-
-
-=item $status->songid()
-
-The song id (MPD id) of the song currently played.
-
-
-=item $status->state()
-
-The state of MPD server. Either C<play>, C<stop> or C<pause>.
-
-
-=item $status->time()
-
-An C<Audio::MPD::Common::Time> object, representing the time elapsed /
-remainging and total. See the associated pod for more details.
-
-
-=item $status->updating_db()
-
-An integer, representing the current update job.
-
-
-=item $status->volume()
-
-The current MPD volume - an integer between 0 and 100.
-
-
-=item $status->xfade()
-
-The crossfade in seconds.
-
-
-=back
-
-Please note that those accessors are read-only: changing a value will B<not>
-change the current settings of MPD server. Use the mpd modules to alter the
-settings.
-
-
-=head1 SEE ALSO
-
-=over 4
-
-=item L<Audio::MPD>
-
-=item L<POE::Component::Client::MPD>
-
-=back
-
-
-=head1 AUTHOR
-
-Jerome Quelin, C<< <jquelin at cpan.org> >>
-
-
-=head1 COPYRIGHT & LICENSE
-
-Copyright (c) 2007 Jerome Quelin, all rights reserved.
-
-This program is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself.
-
-=cut
diff --git a/config/mpfire/perl/Audio/MPD/Common/Time.pm b/config/mpfire/perl/Audio/MPD/Common/Time.pm
deleted file mode 100644
index 77b6c7dd3..000000000
--- a/config/mpfire/perl/Audio/MPD/Common/Time.pm
+++ /dev/null
@@ -1,186 +0,0 @@ 
-#
-# This file is part of Audio::MPD::Common
-# Copyright (c) 2007 Jerome Quelin, all rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the same terms as Perl itself.
-#
-#
-
-package Audio::MPD::Common::Time;
-
-use warnings;
-use strict;
-
-use base qw[ Class::Accessor::Fast ];
-__PACKAGE__->mk_accessors
-    ( qw[ percent sofar left total
-          sofar_secs sofar_mins seconds_sofar
-          total_secs total_mins seconds_total
-          left_secs  left_mins  seconds_left
-        ] );
-
-#our ($VERSION) = '$Rev$' =~ /(\d+)/;
-
-
-#--
-# Constructor
-
-#
-# my $status = Audio::MPD::Common::Time->new( $time )
-#
-# The constructor for the class Audio::MPD::Common::Time. $time is
-# the time value (on the "time" line) of what the output MPD server
-# returns to the status command.
-#
-sub new {
-    my ($class, $time) = @_;
-    $time ||= '0:0';
-    my ($seconds_sofar, $seconds_total) = split /:/, $time;
-    my $seconds_left = $seconds_total - $seconds_sofar;
-    my $percent      = $seconds_total ? 100*$seconds_sofar/$seconds_total : 0;
-
-    # Parse the time so far
-    my $sofar_mins = int( $seconds_sofar / 60 );
-    my $sofar_secs = $seconds_sofar % 60;
-    my $sofar = sprintf "%d:%02d", $sofar_mins, $sofar_secs;
-
-    # Parse the total time
-    my $total_mins = int( $seconds_total / 60 );
-    my $total_secs = $seconds_total % 60;
-    my $total = sprintf "%d:%02d", $total_mins, $total_secs;
-
-    # Parse the time left
-    my $left_mins = int( $seconds_left / 60 );
-    my $left_secs = $seconds_left % 60;
-    my $left = sprintf "%d:%02d", $left_mins, $left_secs;
-
-
-    # create object
-    my $self = {
-        # time elapsed in seconds
-        seconds_sofar => $seconds_sofar,
-        seconds_left  => $seconds_left,
-        seconds_total => $seconds_total,
-
-        # cooked values
-        sofar      => $sofar,
-        left       => $left,
-        total      => $total,
-        percent    => sprintf("%.1f", $percent), # 1 decimal
-
-        # details
-        sofar_secs => $sofar_secs,
-        sofar_mins => $sofar_mins,
-        total_secs => $total_secs,
-        total_mins => $total_mins,
-        left_secs  => $left_secs,
-        left_mins  => $left_mins,
-    };
-    bless $self, $class;
-    return $self;
-}
-
-
-1;
-
-__END__
-
-=head1 NAME
-
-Audio::MPD::Common::Time - class representing time of current song
-
-
-=head1 SYNOPSIS
-
-    my $time = $status->time;
-    print $time->sofar;
-
-
-=head1 DESCRIPTION
-
-C<Audio::MPD::Common::Status> returns some time information with the C<time()>
-accessor. This information relates to the elapsed time of the current song,
-as well as the remaining and total time. This information is encapsulated
-in an C<Audio::MPD::Common::Time> object.
-
-Note that an C<Audio::MPD::Common::Time> object does B<not> update itself
-regularly, and thus should be used immediately.
-
-
-=head1 METHODS
-
-=head2 Constructor
-
-=over 4
-
-=item new( $time )
-
-The C<new()> method is the constructor for the C<Audio::MPD::Common::Time>
-class.
-
-Note: one should B<never> ever instantiate an C<Audio::MPD::Common::Time>
-object directly - use the mpd modules instead.
-
-=back
-
-
-=head2 Accessors
-
-Once created, one can access the following members of the object:
-
-=over 4
-
-=item cooked values:
-
-The C<sofar()>, C<left()> and C<total()> methods return the according values
-under the form C<minutes:seconds>. Note the existence of a C<percent()>
-method returning a percentage complete. (one decimal)
-
-
-=item values in seconds:
-
-The C<seconds_sofar()>, C<seconds_left()> and C<seconds_total()> return the
-according values in seconds.
-
-
-=item detailled values:
-
-If you want to cook your own value, then the following methods can help:
-C<sofar_secs()> and C<sofar_mins()> return the seconds and minutes elapsed.
-Same for C<left_secs()> and C<left_mins()> (time remaining), C<total_secs()>
-and C<total_mins()>. (total song length)
-
-
-=back
-
-
-Please note that those accessors are read-only: changing a value will B<not>
-change the current settings of MPD server. Use the mpd modules to alter the
-settings.
-
-
-=head1 SEE ALSO
-
-=over 4
-
-=item L<Audio::MPD>
-
-=item L<POE::Component::Client::MPD>
-
-=back
-
-
-=head1 AUTHOR
-
-Jerome Quelin, C<< <jquelin at cpan.org> >>
-
-
-=head1 COPYRIGHT & LICENSE
-
-Copyright (c) 2007 Jerome Quelin, all rights reserved.
-
-This program is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself.
-
-=cut
diff --git a/config/mpfire/perl/Audio/MPD/Playlist.pm b/config/mpfire/perl/Audio/MPD/Playlist.pm
deleted file mode 100644
index b59499d02..000000000
--- a/config/mpfire/perl/Audio/MPD/Playlist.pm
+++ /dev/null
@@ -1,427 +0,0 @@ 
-#
-# This file is part of Audio::MPD
-# Copyright (c) 2007 Jerome Quelin, all rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the same terms as Perl itself.
-#
-#
-
-package Audio::MPD::Playlist;
-
-use strict;
-use warnings;
-use Scalar::Util qw[ weaken ];
-
-use base qw[ Class::Accessor::Fast ];
-__PACKAGE__->mk_accessors( qw[ _mpd ] );
-
-
-#our ($VERSION) = '$Rev$' =~ /(\d+)/;
-
-
-#--
-# Constructor
-
-#
-# my $collection = Audio::MPD::Playlist->new( $mpd );
-#
-# This will create the object, holding a back-reference to the Audio::MPD
-# object itself (for communication purposes). But in order to play safe and
-# to free the memory in time, this reference is weakened.
-#
-# Note that you're not supposed to call this constructor yourself, an
-# Audio::MPD::Playlist is automatically created for you during the creation
-# of an Audio::MPD object.
-#
-sub new {
-    my ($pkg, $mpd) = @_;
-
-    my $self = { _mpd => $mpd };
-    weaken( $self->{_mpd} );
-    bless $self, $pkg;
-    return $self;
-}
-
-
-#--
-# Public methods
-
-# -- Playlist: retrieving information
-
-#
-# my @items = $pl->as_items;
-#
-# Return an array of AMC::Item::Songs, one for each of the
-# songs in the current playlist.
-#
-sub as_items {
-    my ($self) = @_;
-
-    my @list = $self->_mpd->_cooked_command_as_items("playlistinfo\n");
-    return @list;
-}
-
-
-#
-# my @items = $pl->items_changed_since( $plversion );
-#
-# Return a list with all the songs (as API::Song objects) added to
-# the playlist since playlist $plversion.
-#
-sub items_changed_since {
-    my ($self, $plid) = @_;
-    return $self->_mpd->_cooked_command_as_items("plchanges $plid\n");
-}
-
-
-
-# -- Playlist: adding / removing songs
-
-#
-# $pl->add( $path [, $path [...] ] );
-#
-# Add the songs identified by $path (relative to MPD's music directory) to
-# the current playlist. No return value.
-#
-sub add {
-    my ($self, @pathes) = @_;
-    my $command =
-          "command_list_begin\n"
-        . join( '', map { s/"/\\"/g; qq[add "$_"\n] } @pathes )
-        . "command_list_end\n";
-    $self->_mpd->_send_command( $command );
-}
-
-
-#
-# $pl->delete( $song [, $song [...] ] );
-#
-# Remove song number $song (starting from 0) from the current playlist. No
-# return value.
-#
-sub delete {
-    my ($self, @songs) = @_;
-    my $command =
-          "command_list_begin\n"
-        . join( '', map { s/"/\\"/g; "delete $_\n" } @songs )
-        . "command_list_end\n";
-    $self->_mpd->_send_command( $command );
-}
-
-
-#
-# $pl->deleteid( $songid [, $songid [...] ]);
-#
-# Remove the specified $songid (as assigned by mpd when inserted in playlist)
-# from the current playlist. No return value.
-#
-sub deleteid {
-    my ($self, @songs) = @_;
-    my $command =
-          "command_list_begin\n"
-        . join( '', map { "deleteid $_\n" } @songs )
-        . "command_list_end\n";
-    $self->_mpd->_send_command( $command );
-}
-
-
-#
-# $pl->clear;
-#
-# Remove all the songs from the current playlist. No return value.
-#
-sub clear {
-    my ($self) = @_;
-    $self->_mpd->_send_command("clear\n");
-}
-
-
-#
-# $pl->crop;
-#
-#  Remove all of the songs from the current playlist *except* the current one.
-#
-sub crop {
-    my ($self) = @_;
-
-    my $status = $self->_mpd->status;
-    my $cur = $status->song;
-    my $len = $status->playlistlength - 1;
-
-    my $command =
-          "command_list_begin\n"
-        . join( '', map { $_  != $cur ? "delete $_\n" : '' } reverse 0..$len )
-        . "command_list_end\n";
-    $self->_mpd->_send_command( $command );
-}
-
-
-# -- Playlist: changing playlist order
-
-#
-# $pl->shuffle();
-#
-# Shuffle the current playlist. No return value.
-#
-sub shuffle {
-    my ($self) = @_;
-    $self->_mpd->_send_command("shuffle\n");
-}
-
-
-#
-# $pl->swap( $song1, $song2 );
-#
-# Swap positions of song number $song1 and $song2 in the current playlist.
-# No return value.
-#
-sub swap {
-    my ($self, $from, $to) = @_;
-    $self->_mpd->_send_command("swap $from $to\n");
-}
-
-
-#
-# $pl->swapid( $songid1, $songid2 );
-#
-# Swap the postions of song ID $songid1 with song ID $songid2 in the
-# current playlist. No return value.
-#
-sub swapid {
-    my ($self, $from, $to) = @_;
-    $self->_mpd->_send_command("swapid $from $to\n");
-}
-
-
-#
-# $pl->move( $song, $newpos );
-#
-# Move song number $song to the position $newpos. No return value.
-#
-sub move {
-    my ($self, $song, $pos) = @_;
-    $self->_mpd->_send_command("move $song $pos\n");
-}
-
-
-#
-# $pl->moveid( $songid, $newpos );
-#
-# Move song ID $songid to the position $newpos. No return value.
-#
-sub moveid {
-    my ($self, $song, $pos) = @_;
-    $self->_mpd->_send_command("moveid $song $pos\n");
-}
-
-
-# -- Playlist: managing playlists
-
-#
-# $pl->load( $playlist );
-#
-# Load list of songs from specified $playlist file. No return value.
-#
-sub load {
-    my ($self, $playlist) = @_;
-    $self->_mpd->_send_command( qq[load "$playlist"\n] );
-}
-
-
-#
-# $pl->save( $playlist );
-#
-# Save the current playlist to a file called $playlist in MPD's playlist
-# directory. No return value.
-#
-sub save {
-    my ($self, $playlist) = @_;
-    $self->_mpd->_send_command( qq[save "$playlist"\n] );
-}
-
-
-#
-# $pl->rm( $playlist )
-#
-# Delete playlist named $playlist from MPD's playlist directory. No
-# return value.
-#
-sub rm {
-    my ($self, $playlist) = @_;
-    $self->_mpd->_send_command( qq[rm "$playlist"\n] );
-}
-
-
-
-1;
-
-__END__
-
-
-=head1 NAME
-
-Audio::MPD::Playlist - an object to mess MPD's playlist
-
-
-=head1 SYNOPSIS
-
-    my $song = $mpd->playlist->randomize;
-
-
-=head1 DESCRIPTION
-
-C<Audio::MPD::Playlist> is a class meant to access & update MPD's
-playlist.
-
-
-=head1 PUBLIC METHODS
-
-=head2 Constructor
-
-=over 4
-
-=item new( $mpd )
-
-This will create the object, holding a back-reference to the C<Audio::MPD>
-object itself (for communication purposes). But in order to play safe and
-to free the memory in time, this reference is weakened.
-
-Note that you're not supposed to call this constructor yourself, an
-C<Audio::MPD::Playlist> is automatically created for you during the creation
-of an C<Audio::MPD> object.
-
-=back
-
-
-=head2 Retrieving information
-
-=over 4
-
-=item $pl->as_items()
-
-Return an array of C<Audio::MPD::Common::Item::Song>s, one for each of the
-songs in the current playlist.
-
-
-=item $pl->items_changed_since( $plversion )
-
-Return a list with all the songs (as AMC::Item::Song objects) added to
-the playlist since playlist $plversion.
-
-
-=back
-
-
-=head2 Adding / removing songs
-
-=over 4
-
-=item $pl->add( $path [, $path [...] ] )
-
-Add the songs identified by C<$path> (relative to MPD's music directory) to the
-current playlist. No return value.
-
-
-=item $pl->delete( $song [, $song [...] ] )
-
-Remove song number C<$song>s (starting from 0) from the current playlist. No
-return value.
-
-
-=item $pl->deleteid( $songid [, $songid [...] ] )
-
-Remove the specified C<$songid>s (as assigned by mpd when inserted in playlist)
-from the current playlist. No return value.
-
-
-=item $pl->clear()
-
-Remove all the songs from the current playlist. No return value.
-
-
-=item $pl->crop()
-
-Remove all of the songs from the current playlist *except* the
-song currently playing.
-
-
-=back
-
-
-=head2 Changing playlist order
-
-=over 4
-
-=item $pl->shuffle()
-
-Shuffle the current playlist. No return value.
-
-
-=item $pl->swap( $song1, $song2 )
-
-Swap positions of song number C<$song1> and C<$song2> in the current
-playlist. No return value.
-
-
-=item $pl->swapid( $songid1, $songid2 )
-
-Swap the postions of song ID C<$songid1> with song ID C<$songid2> in the
-current playlist. No return value.
-
-
-=item $pl->move( $song, $newpos )
-
-Move song number C<$song> to the position C<$newpos>. No return value.
-
-
-=item $pl->moveid( $songid, $newpos )
-
-Move song ID C<$songid> to the position C<$newpos>. No return value.
-
-
-=back
-
-
-=head2 Managing playlists
-
-=over 4
-
-=item $pl->load( $playlist )
-
-Load list of songs from specified C<$playlist> file. No return value.
-
-
-=item $pl->save( $playlist )
-
-Save the current playlist to a file called C<$playlist> in MPD's playlist
-directory. No return value.
-
-
-=item $pl->rm( $playlist )
-
-Delete playlist named C<$playlist> from MPD's playlist directory. No
-return value.
-
-
-=back
-
-
-=head1 SEE ALSO
-
-L<Audio::MPD>
-
-
-=head1 AUTHOR
-
-Jerome Quelin, C<< <jquelin at cpan.org> >>
-
-
-=head1 COPYRIGHT & LICENSE
-
-Copyright (c) 2007 Jerome Quelin, all rights reserved.
-
-This program is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself.
-
-=cut
diff --git a/config/mpfire/perl/Audio/MPD/Test.pm b/config/mpfire/perl/Audio/MPD/Test.pm
deleted file mode 100644
index 74359afd1..000000000
--- a/config/mpfire/perl/Audio/MPD/Test.pm
+++ /dev/null
@@ -1,217 +0,0 @@ 
-#
-# This file is part of Audio::MPD
-# Copyright (c) 2007 Jerome Quelin, all rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the same terms as Perl itself.
-#
-#
-
-package Audio::MPD::Test;
-
-use strict;
-use warnings;
-
-use Exporter;
-use FindBin     qw[ $Bin ];
-use Readonly;
-
-
-use base qw[ Exporter ];
-our @EXPORT = qw[ customize_test_mpd_configuration start_test_mpd stop_test_mpd ];
-#our ($VERSION) = '$Rev: 5284 $' =~ /(\d+)/;
-
-
-Readonly my $TEMPLATE => "$Bin/mpd-test/mpd.conf.template";
-Readonly my $CONFIG   => "$Bin/mpd-test/mpd.conf";
-
-{ # this will be run when Audio::MPD::Test will be use-d.
-    my $restart = 0;
-    my $stopit  = 0;
-
-    customize_test_mpd_configuration();
-    $restart = _stop_user_mpd_if_needed();
-    $stopit  = start_test_mpd();
-
-    END {
-        stop_test_mpd() if $stopit;
-        return unless $restart;       # no need to restart
-        system 'mpd 2>/dev/null';     # restart user mpd
-        sleep 1;                      # wait 1 second to let mpd start.
-    }
-}
-
-
-#--
-# public subs
-
-#
-# customize_test_mpd_configuration( [$port] )
-#
-# Create a fake mpd configuration file, based on the file mpd.conf.template
-# located in t/mpd-test. The string PWD will be replaced by the real path -
-# ie, where the tarball has been untarred. The string PORT will be replaced
-# by $port if specified, 6600 otherwise (MPD default).
-#
-sub customize_test_mpd_configuration {
-    my ($port) = @_;
-    $port ||= 6600;
-
-    # open template and config.
-    open my $in,  '<',  $TEMPLATE or die "can't open [$TEMPLATE]: $!\n";
-    open my $out, '>',  $CONFIG   or die "can't open [$CONFIG]: $!\n";
-
-    # replace string and fill in config file.
-    while ( defined( my $line = <$in> ) ) {
-        $line =~ s!PWD!$Bin/mpd-test!;
-        $line =~ s!PORT!$port!;
-        print $out $line;
-    }
-
-    # clean up.
-    close $in;
-    close $out;
-
-    # create a fake mpd db.
-    system( "mpd --create-db $CONFIG >/dev/null 2>&1" ) == 0
-        or die "could not create fake mpd database: $?\n";
-}
-
-
-#
-# start_test_mpd()
-#
-# Start the fake mpd, and die if there were any error.
-#
-sub start_test_mpd {
-    my $output = qx[mpd $CONFIG 2>&1];
-    die "could not start fake mpd: $output\n" if $output;
-    sleep 1;   # wait 1 second to let mpd start.
-    return 1;
-}
-
-
-#
-# stop_test_mpd()
-#
-# Kill the fake mpd.
-#
-sub stop_test_mpd {
-    system "mpd --kill $CONFIG 2>/dev/null";
-    sleep 1;   # wait 1 second to free output device.
-    unlink "$Bin/mpd-test/state", "$Bin/mpd-test/music.db";
-}
-
-
-#--
-# private subs
-
-
-#
-# my $was_running = _stop_user_mpd_if_needed()
-#
-# This sub will check if mpd is currently running. If it is, force it to
-# a full stop (unless MPD_TEST_OVERRIDE is not set).
-#
-# In any case, it will return a boolean stating whether mpd was running
-# before forcing stop.
-#
-sub _stop_user_mpd_if_needed {
-    # check if mpd is running.
-    my $is_running = grep { /mpd$/ } qx[ ps -e ];
-
-    return 0 unless $is_running; # mpd does not run - nothing to do.
-
-    # check force stop.
-    die "mpd is running\n" unless $ENV{MPD_TEST_OVERRIDE};
-    system( 'mpd --kill 2>/dev/null') == 0 or die "can't stop user mpd: $?\n";
-    sleep 1;  # wait 1 second to free output device
-    return 1;
-}
-
-
-1;
-
-__END__
-
-=head1 NAME
-
-Audio::MPD::Test - automate launching of fake mdp for testing purposes
-
-
-=head1 SYNOPSIS
-
-    use Audio::MPD::Test; # die if error
-    [...]
-    stop_fake_mpd();
-
-
-=head1 DESCRIPTION
-
-=head2 General usage
-
-This module will try to launch a new mpd server for testing purposes. This
-mpd server will then be used during Audio::MPD tests.
-
-In order to achieve this, the module will create a fake mpd.conf file with
-the correct pathes (ie, where you untarred the module tarball). It will then
-check if some mpd server is already running, and stop it if the
-MPD_TEST_OVERRIDE environment variable is true (die otherwise). Last it will
-run the test mpd with its newly created configuration file.
-
-Everything described above is done automatically when the module is C<use>-d.
-
-
-Once the tests are run, the mpd server will be shut down, and the original
-one will be relaunched (if there was one).
-
-Note that the test mpd will listen to C<localhost>, so you are on the safe
-side. Note also that the test suite comes with its own ogg files - and yes,
-we can redistribute them since it's only some random voice recordings :-)
-
-
-=head2 Advanced usage
-
-In case you want more control on the test mpd server, you can use the
-following public methods:
-
-=over 4
-
-=item start_test_mpd()
-
-Start the fake mpd, and die if there were any error.
-
-=item stop_test_mpd()
-
-Kill the fake mpd.
-
-=item customize_test_mpd_configuration( [$port] )
-
-Create a fake mpd configuration file, based on the file mpd.conf.template
-located in t/mpd-test. The string PWD will be replaced by the real path -
-ie, where the tarball has been untarred. The string PORT will be replaced
-by $port if specified, 6600 otherwise (MPD default).
-
-=back
-
-This might be useful when trying to test connections with mpd server.
-
-
-=head1 SEE ALSO
-
-L<Audio::MPD>
-
-
-=head1 AUTHOR
-
-Jerome Quelin, C<< <jquelin at cpan.org> >>
-
-
-=head1 COPYRIGHT & LICENSE
-
-Copyright (c) 2007 Jerome Quelin, all rights reserved.
-
-This program is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself.
-
-=cut
diff --git a/config/mpfire/perl/Readonly.pm b/config/mpfire/perl/Readonly.pm
deleted file mode 100644
index 294c759c5..000000000
--- a/config/mpfire/perl/Readonly.pm
+++ /dev/null
@@ -1,803 +0,0 @@ 
-=for gpg
------BEGIN PGP SIGNED MESSAGE-----
-Hash: SHA1
-
-- -----BEGIN PGP SIGNED MESSAGE-----
-Hash: SHA1
-
-=head1 NAME
-
-Readonly - Facility for creating read-only scalars, arrays, hashes.
-
-=head1 VERSION
-
-This documentation describes version 1.03 of Readonly.pm, April 20, 2004.
-
-=cut
-
-# Rest of documentation is after __END__.
-
-use 5.005;
-use strict;
-#use warnings;
-#no warnings 'uninitialized';
-
-package Readonly;
-$Readonly::VERSION = '1.03';    # Also change in the documentation!
-
-# Autocroak (Thanks, MJD)
-# Only load Carp.pm if module is croaking.
-sub croak
-{
-    require Carp;
-    goto &Carp::croak;
-}
-
-# These functions may be overridden by Readonly::XS, if installed.
-sub is_sv_readonly   ($) { 0 }
-sub make_sv_readonly ($) { die "make_sv_readonly called but not overridden" }
-use vars qw/$XSokay/;     # Set to true in Readonly::XS, if available
-
-# Common error messages, or portions thereof
-use vars qw/$MODIFY $REASSIGN $ODDHASH/;
-$MODIFY   = 'Modification of a read-only value attempted';
-$REASSIGN = 'Attempt to reassign a readonly';
-$ODDHASH  = 'May not store an odd number of values in a hash';
-
-# See if we can use the XS stuff.
-$Readonly::XS::MAGIC_COOKIE = "Do NOT use or require Readonly::XS unless you're me.";
-eval 'use Readonly::XS';
-
-
-# ----------------
-# Read-only scalars
-# ----------------
-package Readonly::Scalar;
-
-sub TIESCALAR
-{
-    my $whence = (caller 2)[3];    # Check if naughty user is trying to tie directly.
-    Readonly::croak "Invalid tie"  unless $whence && $whence =~ /^Readonly::(?:Scalar1?|Readonly)$/;
-    my $class = shift;
-    Readonly::croak "No value specified for readonly scalar"        unless @_;
-    Readonly::croak "Too many values specified for readonly scalar" unless @_ == 1;
-
-    my $value = shift;
-    return bless \$value, $class;
-}
-
-sub FETCH
-{
-    my $self = shift;
-    return $$self;
-}
-
-*STORE = *UNTIE =
-    sub {Readonly::croak $Readonly::MODIFY};
-
-
-# ----------------
-# Read-only arrays
-# ----------------
-package Readonly::Array;
-
-sub TIEARRAY
-{
-    my $whence = (caller 1)[3];    # Check if naughty user is trying to tie directly.
-    Readonly::croak "Invalid tie"  unless $whence =~ /^Readonly::Array1?$/;
-    my $class = shift;
-    my @self = @_;
-
-    return bless \@self, $class;
-}
-
-sub FETCH
-{
-    my $self  = shift;
-    my $index = shift;
-    return $self->[$index];
-}
-
-sub FETCHSIZE
-{
-    my $self = shift;
-    return scalar @$self;
-}
-
-BEGIN {
-    eval q{
-        sub EXISTS
-           {
-           my $self  = shift;
-           my $index = shift;
-           return exists $self->[$index];
-           }
-    } if $] >= 5.006;    # couldn't do "exists" on arrays before then
-}
-
-*STORE = *STORESIZE = *EXTEND = *PUSH = *POP = *UNSHIFT = *SHIFT = *SPLICE = *CLEAR = *UNTIE =
-    sub {Readonly::croak $Readonly::MODIFY};
-
-
-# ----------------
-# Read-only hashes
-# ----------------
-package Readonly::Hash;
-
-sub TIEHASH
-{
-    my $whence = (caller 1)[3];    # Check if naughty user is trying to tie directly.
-    Readonly::croak "Invalid tie"  unless $whence =~ /^Readonly::Hash1?$/;
-
-    my $class = shift;
-    # must have an even number of values
-    Readonly::croak $Readonly::ODDHASH unless (@_ %2 == 0);
-
-    my %self = @_;
-    return bless \%self, $class;
-}
-
-sub FETCH
-{
-    my $self = shift;
-    my $key  = shift;
-
-    return $self->{$key};
-}
-
-sub EXISTS
-{
-    my $self = shift;
-    my $key  = shift;
-    return exists $self->{$key};
-}
-
-sub FIRSTKEY
-{
-    my $self = shift;
-    my $dummy = keys %$self;
-    return scalar each %$self;
-}
-
-sub NEXTKEY
-{
-    my $self = shift;
-    return scalar each %$self;
-}
-
-*STORE = *DELETE = *CLEAR = *UNTIE =
-    sub {Readonly::croak $Readonly::MODIFY};
-
-
-# ----------------------------------------------------------------
-# Main package, containing convenience functions (so callers won't
-# have to explicitly tie the variables themselves).
-# ----------------------------------------------------------------
-package Readonly;
-use Exporter;
-use vars qw/@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS/;
-push @ISA, 'Exporter';
-push @EXPORT, qw/Readonly/;
-push @EXPORT_OK, qw/Scalar Array Hash Scalar1 Array1 Hash1/;
-
-# Predeclare the following, so we can use them recursively
-sub Scalar ($$);
-sub Array (\@;@);
-sub Hash (\%;@);
-
-# Returns true if a string begins with "Readonly::"
-# Used to prevent reassignment of Readonly variables.
-sub _is_badtype
-{
-    my $type = $_[0];
-    return lc $type if $type =~ s/^Readonly:://;
-    return;
-}
-
-# Shallow Readonly scalar
-sub Scalar1 ($$)
-{
-    croak "$REASSIGN scalar" if is_sv_readonly $_[0];
-    my $badtype = _is_badtype (ref tied $_[0]);
-    croak "$REASSIGN $badtype" if $badtype;
-
-    # xs method: flag scalar as readonly
-    if ($XSokay)
-    {
-        $_[0] = $_[1];
-        make_sv_readonly $_[0];
-        return;
-    }
-
-    # pure-perl method: tied scalar
-    my $tieobj = eval {tie $_[0], 'Readonly::Scalar', $_[1]};
-    if ($@)
-    {
-        croak "$REASSIGN scalar" if substr($@,0,43) eq $MODIFY;
-        die $@;    # some other error?
-    }
-    return $tieobj;
-}
-
-# Shallow Readonly array
-sub Array1 (\@;@)
-{
-    my $badtype = _is_badtype (ref tied $_[0]);
-    croak "$REASSIGN $badtype" if $badtype;
-
-    my $aref = shift;
-    return tie @$aref, 'Readonly::Array', @_;
-}
-
-# Shallow Readonly hash
-sub Hash1 (\%;@)
-{
-    my $badtype = _is_badtype (ref tied $_[0]);
-    croak "$REASSIGN $badtype" if $badtype;
-
-    my $href = shift;
-
-    # If only one value, and it's a hashref, expand it
-    if (@_ == 1  &&  ref $_[0] eq 'HASH')
-    {
-        return tie %$href, 'Readonly::Hash', %{$_[0]};
-    }
-
-    # otherwise, must have an even number of values
-    croak $ODDHASH unless (@_%2 == 0);
-
-    return tie %$href, 'Readonly::Hash', @_;
-}
-
-# Deep Readonly scalar
-sub Scalar ($$)
-{
-    croak "$REASSIGN scalar" if is_sv_readonly $_[0];
-    my $badtype = _is_badtype (ref tied $_[0]);
-    croak "$REASSIGN $badtype" if $badtype;
-
-    my $value = $_[1];
-
-    # Recursively check passed element for references; if any, make them Readonly
-    foreach ($value)
-    {
-        if    (ref eq 'SCALAR') {Scalar my $v => $$_; $_ = \$v}
-        elsif (ref eq 'ARRAY')  {Array  my @v => @$_; $_ = \@v}
-        elsif (ref eq 'HASH')   {Hash   my %v =>  $_; $_ = \%v}
-    }
-
-    # xs method: flag scalar as readonly
-    if ($XSokay)
-    {
-        $_[0] = $value;
-        make_sv_readonly $_[0];
-        return;
-    }
-
-    # pure-perl method: tied scalar
-    my $tieobj = eval {tie $_[0], 'Readonly::Scalar', $value};
-    if ($@)
-    {
-        croak "$REASSIGN scalar" if substr($@,0,43) eq $MODIFY;
-        die $@;    # some other error?
-    }
-    return $tieobj;
-}
-
-# Deep Readonly array
-sub Array (\@;@)
-{
-    my $badtype = _is_badtype (ref tied @{$_[0]});
-    croak "$REASSIGN $badtype" if $badtype;
-
-    my $aref = shift;
-    my @values = @_;
-
-    # Recursively check passed elements for references; if any, make them Readonly
-    foreach (@values)
-    {
-        if    (ref eq 'SCALAR') {Scalar my $v => $$_; $_ = \$v}
-        elsif (ref eq 'ARRAY')  {Array  my @v => @$_; $_ = \@v}
-        elsif (ref eq 'HASH')   {Hash   my %v => $_;  $_ = \%v}
-    }
-    # Lastly, tie the passed reference
-    return tie @$aref, 'Readonly::Array', @values;
-}
-
-# Deep Readonly hash
-sub Hash (\%;@)
-{
-    my $badtype = _is_badtype (ref tied %{$_[0]});
-    croak "$REASSIGN $badtype" if $badtype;
-
-    my $href = shift;
-    my @values = @_;
-
-    # If only one value, and it's a hashref, expand it
-    if (@_ == 1  &&  ref $_[0] eq 'HASH')
-    {
-        @values = %{$_[0]};
-    }
-
-    # otherwise, must have an even number of values
-    croak $ODDHASH unless (@values %2 == 0);
-
-    # Recursively check passed elements for references; if any, make them Readonly
-    foreach (@values)
-    {
-        if    (ref eq 'SCALAR') {Scalar my $v => $$_; $_ = \$v}
-        elsif (ref eq 'ARRAY')  {Array  my @v => @$_; $_ = \@v}
-        elsif (ref eq 'HASH')   {Hash   my %v => $_;  $_ = \%v}
-    }
-
-    return tie %$href, 'Readonly::Hash', @values;
-}
-
-
-# Common entry-point for all supported data types
-eval q{sub Readonly} . ( $] < 5.008 ? '' : '(\[$@%]@)' ) . <<'SUB_READONLY';
-{
-    if (ref $_[0] eq 'SCALAR')
-    {
-        croak $MODIFY if is_sv_readonly ${$_[0]};
-        my $badtype = _is_badtype (ref tied ${$_[0]});
-        croak "$REASSIGN $badtype" if $badtype;
-        croak "Readonly scalar must have only one value" if @_ > 2;
-
-        my $tieobj = eval {tie ${$_[0]}, 'Readonly::Scalar', $_[1]};
-        # Tie may have failed because user tried to tie a constant, or we screwed up somehow.
-        if ($@)
-        {
-            croak $MODIFY if $@ =~ /^$MODIFY at/;    # Point the finger at the user.
-            die "$@\n";        # Not a modify read-only message; must be our fault.
-        }
-        return $tieobj;
-    }
-    elsif (ref $_[0] eq 'ARRAY')
-    {
-        my $aref = shift;
-        return Array @$aref, @_;
-    }
-    elsif (ref $_[0] eq 'HASH')
-    {
-        my $href = shift;
-        croak $ODDHASH  if @_%2 != 0  &&  !(@_ == 1  && ref $_[0] eq 'HASH');
-        return Hash %$href, @_;
-    }
-    elsif (ref $_[0])
-    {
-        croak "Readonly only supports scalar, array, and hash variables.";
-    }
-    else
-    {
-        croak "First argument to Readonly must be a reference.";
-    }
-}
-SUB_READONLY
-
-
-1;
-__END__
-
-=head1 SYNOPSIS
-
- use Readonly;
-
- # Read-only scalar
- Readonly::Scalar     $sca => $initial_value;
- Readonly::Scalar  my $sca => $initial_value;
-
- # Read-only array
- Readonly::Array      @arr => @values;
- Readonly::Array   my @arr => @values;
-
- # Read-only hash
- Readonly::Hash       %has => (key => value, key => value, ...);
- Readonly::Hash    my %has => (key => value, key => value, ...);
- # or:
- Readonly::Hash       %has => {key => value, key => value, ...};
-
- # You can use the read-only variables like any regular variables:
- print $sca;
- $something = $sca + $arr[2];
- next if $has{$some_key};
-
- # But if you try to modify a value, your program will die:
- $sca = 7;
- push @arr, 'seven';
- delete $has{key};
- # The error message is "Modification of a read-only value
-attempted"
-
- # Alternate form (Perl 5.8 and later)
- Readonly    $sca => $initial_value;
- Readonly my $sca => $initial_value;
- Readonly    @arr => @values;
- Readonly my @arr => @values;
- Readonly    %has => (key => value, key => value, ...);
- Readonly my %has => (key => value, key => value, ...);
- # Alternate form (for Perls earlier than v5.8)
- Readonly    \$sca => $initial_value;
- Readonly \my $sca => $initial_value;
- Readonly    \@arr => @values;
- Readonly \my @arr => @values;
- Readonly    \%has => (key => value, key => value, ...);
- Readonly \my %has => (key => value, key => value, ...);
-
-
-=head1 DESCRIPTION
-
-This is a facility for creating non-modifiable variables.  This is
-useful for configuration files, headers, etc.  It can also be useful
-as a development and debugging tool, for catching updates to variables
-that should not be changed.
-
-If any of the values you pass to C<Scalar>, C<Array>, or C<Hash> are
-references, then those functions recurse over the data structures,
-marking everything as Readonly.  Usually, this is what you want: the
-entire structure nonmodifiable.  If you want only the top level to be
-Readonly, use the alternate C<Scalar1>, C<Array1> and C<Hash1>
-functions.
-
-Please note that most users of Readonly will also want to install a
-companion module Readonly::XS.  See the L</CONS> section below for more
-details.
-
-=head1 COMPARISON WITH "use constant"
-
-Perl provides a facility for creating constant values, via the "use
-constant" pragma.  There are several problems with this pragma.
-
-=over 2
-
-=item *
-
-The constants created have no leading $ or @ character.
-
-=item *
-
-These constants cannot be interpolated into strings.
-
-=item *
-
-Syntax can get dicey sometimes.  For example:
-
- use constant CARRAY => (2, 3, 5, 7, 11, 13);
- $a_prime = CARRAY[2];        # wrong!
- $a_prime = (CARRAY)[2];      # right -- MUST use parentheses
-
-=item *
-
-You have to be very careful in places where barewords are allowed.
-For example:
-
- use constant SOME_KEY => 'key';
- %hash = (key => 'value', other_key => 'other_value');
- $some_value = $hash{SOME_KEY};        # wrong!
- $some_value = $hash{+SOME_KEY};       # right
-
-(who thinks to use a unary plus when using a hash?)
-
-=item *
-
-C<use constant> works for scalars and arrays, not hashes.
-
-=item *
-
-These constants are global ot the package in which they're declared;
-cannot be lexically scoped.
-
-=item *
-
-Works only at compile time.
-
-=item *
-
-Can be overridden:
-
- use constant PI => 3.14159;
- ...
- use constant PI => 2.71828;
-
-(this does generate a warning, however, if you have warnings enabled).
-
-=item *
-
-It is very difficult to make and use deep structures (complex data
-structures) with C<use constant>.
-
-=back
-
-=head1 COMPARISON WITH TYPEGLOB CONSTANTS
-
-Another popular way to create read-only scalars is to modify the symbol
-table entry for the variable by using a typeglob:
-
- *a = \'value';
-
-This works fine, but it only works for global variables ("my"
-variables have no symbol table entry).  Also, the following similar
-constructs do B<not> work:
-
- *a = [1, 2, 3];      # Does NOT create a read-only array
- *a = { a => 'A'};    # Does NOT create a read-only hash
-
-=head1 PROS
-
-Readonly.pm, on the other hand, will work with global variables and
-with lexical ("my") variables.  It will create scalars, arrays, or
-hashes, all of which look and work like normal, read-write Perl
-variables.  You can use them in scalar context, in list context; you
-can take references to them, pass them to functions, anything.
-
-Readonly.pm also works well with complex data structures, allowing you
-to tag the whole structure as nonmodifiable, or just the top level.
-
-Also, Readonly variables may not be reassigned.  The following code
-will die:
-
- Readonly::Scalar $pi => 3.14159;
- ...
- Readonly::Scalar $pi => 2.71828;
-
-=head1 CONS
-
-Readonly.pm does impose a performance penalty.  It's pretty slow.  How
-slow?  Run the C<benchmark.pl> script that comes with Readonly.  On my
-test system, "use constant", typeglob constants, and regular
-read/write Perl variables were all about the same speed, and
-Readonly.pm constants were about 1/20 the speed.
-
-However, there is relief.  There is a companion module available,
-Readonly::XS.  If it is installed on your system, Readonly.pm uses it
-to make read-only scalars much faster.  With Readonly::XS, Readonly
-scalars are as fast as the other types of variables.  Readonly arrays
-and hashes will still be relatively slow.  But it's likely that most
-of your Readonly variables will be scalars.
-
-If you can't use Readonly::XS (for example, if you don't have a C
-compiler, or your perl is statically linked and you don't want to
-re-link it), you have to decide whether the benefits of Readonly
-variables outweigh the speed issue. For most configuration variables
-(and other things that Readonly is likely to be useful for), the speed
-issue is probably not really a big problem.  But benchmark your
-program if it might be.  If it turns out to be a problem, you may
-still want to use Readonly.pm during development, to catch changes to
-variables that should not be changed, and then remove it for
-production:
-
- # For testing:
- Readonly::Scalar  $Foo_Directory => '/usr/local/foo';
- Readonly::Scalar  $Bar_Directory => '/usr/local/bar';
- # $Foo_Directory = '/usr/local/foo';
- # $Bar_Directory = '/usr/local/bar';
-
- # For production:
- # Readonly::Scalar  $Foo_Directory => '/usr/local/foo';
- # Readonly::Scalar  $Bar_Directory => '/usr/local/bar';
- $Foo_Directory = '/usr/local/foo';
- $Bar_Directory = '/usr/local/bar';
-
-
-=head1 FUNCTIONS
-
-=over 4
-
-=item Readonly::Scalar $var => $value;
-
-Creates a nonmodifiable scalar, C<$var>, and assigns a value of
-C<$value> to it.  Thereafter, its value may not be changed.  Any
-attempt to modify the value will cause your program to die.
-
-A value I<must> be supplied.  If you want the variable to have
-C<undef> as its value, you must specify C<undef>.
-
-If C<$value> is a reference to a scalar, array, or hash, then this
-function will mark the scalar, array, or hash it points to as being
-Readonly as well, and it will recursively traverse the structure,
-marking the whole thing as Readonly.  Usually, this is what you want.
-However, if you want only the C<$value> marked as Readonly, use
-C<Scalar1>.
-
-If $var is already a Readonly variable, the program will die with
-an error about reassigning Readonly variables.
-
-=item Readonly::Array @arr => (value, value, ...);
-
-Creates a nonmodifiable array, C<@arr>, and assigns the specified list
-of values to it.  Thereafter, none of its values may be changed; the
-array may not be lengthened or shortened or spliced.  Any attempt to
-do so will cause your program to die.
-
-If any of the values passed is a reference to a scalar, array, or hash,
-then this function will mark the scalar, array, or hash it points to as
-being Readonly as well, and it will recursively traverse the structure,
-marking the whole thing as Readonly.  Usually, this is what you want.
-However, if you want only the hash C<%@arr> itself marked as Readonly,
-use C<Array1>.
-
-If @arr is already a Readonly variable, the program will die with
-an error about reassigning Readonly variables.
-
-=item Readonly::Hash %h => (key => value, key => value, ...);
-
-=item Readonly::Hash %h => {key => value, key => value, ...};
-
-Creates a nonmodifiable hash, C<%h>, and assigns the specified keys
-and values to it.  Thereafter, its keys or values may not be changed.
-Any attempt to do so will cause your program to die.
-
-A list of keys and values may be specified (with parentheses in the
-synopsis above), or a hash reference may be specified (curly braces in
-the synopsis above).  If a list is specified, it must have an even
-number of elements, or the function will die.
-
-If any of the values is a reference to a scalar, array, or hash, then
-this function will mark the scalar, array, or hash it points to as
-being Readonly as well, and it will recursively traverse the
-structure, marking the whole thing as Readonly.  Usually, this is what
-you want.  However, if you want only the hash C<%h> itself marked as
-Readonly, use C<Hash1>.
-
-If %h is already a Readonly variable, the program will die with
-an error about reassigning Readonly variables.
-
-=item Readonly $var => $value;
-
-=item Readonly @arr => (value, value, ...);
-
-=item Readonly %h => (key => value, ...);
-
-=item Readonly %h => {key => value, ...};
-
-The C<Readonly> function is an alternate to the C<Scalar>, C<Array>,
-and C<Hash> functions.  It has the advantage (if you consider it an
-advantage) of being one function.  That may make your program look
-neater, if you're initializing a whole bunch of constants at once.
-You may or may not prefer this uniform style.
-
-It has the disadvantage of having a slightly different syntax for
-versions of Perl prior to 5.8.  For earlier versions, you must supply
-a backslash, because it requires a reference as the first parameter.
-
-  Readonly \$var => $value;
-  Readonly \@arr => (value, value, ...);
-  Readonly \%h => (key => value, ...);
-  Readonly \%h => {key => value, ...};
-
-You may or may not consider this ugly.
-
-=item Readonly::Scalar1 $var => $value;
-
-=item Readonly::Array1 @arr => (value, value, ...);
-
-=item Readonly::Hash1 %h => (key => value, key => value, ...);
-
-=item Readonly::Hash1 %h => {key => value, key => value, ...};
-
-These alternate functions create shallow Readonly variables, instead
-of deep ones.  For example:
-
- Readonly::Array1 @shal => (1, 2, {perl=>'Rules', java=>'Bites'}, 4, 5);
- Readonly::Array  @deep => (1, 2, {perl=>'Rules', java=>'Bites'}, 4, 5);
-
- $shal[1] = 7;           # error
- $shal[2]{APL}='Weird';  # Allowed! since the hash isn't Readonly
- $deep[1] = 7;           # error
- $deep[2]{APL}='Weird';  # error, since the hash is Readonly
-
-
-=back
-
-
-=head1 EXAMPLES
-
- # SCALARS:
-
- # A plain old read-only value
- Readonly::Scalar $a => "A string value";
-
- # The value need not be a compile-time constant:
- Readonly::Scalar $a => $computed_value;
-
-
- # ARRAYS:
-
- # A read-only array:
- Readonly::Array @a => (1, 2, 3, 4);
-
- # The parentheses are optional:
- Readonly::Array @a => 1, 2, 3, 4;
-
- # You can use Perl's built-in array quoting syntax:
- Readonly::Array @a => qw/1 2 3 4/;
-
- # You can initialize a read-only array from a variable one:
- Readonly::Array @a => @computed_values;
-
- # A read-only array can be empty, too:
- Readonly::Array @a => ();
- Readonly::Array @a;        # equivalent
-
-
- # HASHES
-
- # Typical usage:
- Readonly::Hash %a => (key1 => 'value1', key2 => 'value2');
-
- # A read-only hash can be initialized from a variable one:
- Readonly::Hash %a => %computed_values;
-
- # A read-only hash can be empty:
- Readonly::Hash %a => ();
- Readonly::Hash %a;        # equivalent
-
- # If you pass an odd number of values, the program will die:
- Readonly::Hash %a => (key1 => 'value1', "value2");
-     --> dies with "May not store an odd number of values in a hash"
-
-
-=head1 EXPORTS
-
-By default, this module exports the following symbol into the calling
-program's namespace:
-
- Readonly
-
-The following symbols are available for import into your program, if
-you like:
-
- Scalar  Scalar1
- Array   Array1
- Hash    Hash1
-
-
-=head1 REQUIREMENTS
-
- Perl 5.000
- Carp.pm (included with Perl)
- Exporter.pm (included with Perl)
-
- Readonly::XS is recommended but not required.
-
-=head1 ACKNOWLEDGEMENTS
-
-Thanks to Slaven Rezic for the idea of one common function
-(Readonly) for all three types of variables (13 April 2002).
-
-Thanks to Ernest Lergon for the idea (and initial code) for
-deeply-Readonly data structures (21 May 2002).
-
-Thanks to Damian Conway for the idea (and code) for making the
-Readonly function work a lot smoother under perl 5.8+.
-
-
-=head1 AUTHOR / COPYRIGHT
-
-Eric J. Roode, roode@cpan.org
-
-Copyright (c) 2001-2004 by Eric J. Roode. All Rights Reserved.  This
-module is free software; you can redistribute it and/or modify it under
-the same terms as Perl itself.
-
-If you have suggestions for improvement, please drop me a line.  If
-you make improvements to this software, I ask that you please send me
-a copy of your changes. Thanks.
-
-Readonly.pm is made from 100% recycled electrons.  No animals were
-harmed during the development and testing of this module.  Not sold
-in stores!  Readonly::XS sold separately.  Void where prohibited.
-
-=cut
-
-=begin gpg
-
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v1.2.4 (MingW32)
-
-iD8DBQFAhaGCY96i4h5M0egRAg++AJ0ar4ncojbOp0OOc2wo+E/1cBn5cQCg9eP9
-qTzAC87PuyKB+vrcRykrDbo=
-=39Ny
------END PGP SIGNATURE-----
-
-=cut
\ No newline at end of file
diff --git a/config/mpfire/webradio b/config/mpfire/webradio
deleted file mode 100644
index 402c31a4c..000000000
--- a/config/mpfire/webradio
+++ /dev/null
@@ -1,14 +0,0 @@ 
-62.75.176.45/rtl-high|89.0 RTL Hitradio|http://www.89.0rtl.de
-gffstream.ic.llnwd.net/stream/gffstream_stream_wdr_einslive_b|Einslive|http://www.einslive.de/
-213.186.41.149:8040|Deepinside Radio European|http://www.deepinside.co.uk
-62.75.176.40:80/bigfm-cbr-128|BigFM|http://www.bigfm.de
-stream.telvi.de:8000/radiobrocken|Hit-Radio Brocken|http://www.radiobrocken.de
-magic-island.eu:8000/listen.mp3|Magic Island|http://www.magic-island.eu
-dsl.blackbeats.fm:13000|BlackBeats FM|http://www.blackbeats.fm
-87.118.64.197:3100|Discofox-Radio|http://www.discofox-radio.de
-rmnradio.powerstream.de:8022|RMNradio|http://www.rmnradio.de/
-relay.radio.ethz.ch:8000/kohina.ogg|Kohina|http://www.kohina.com
-relay1.slayradio.org:8000|Slay Radio|http://www.slayradio.com/
-demovibes.de:8000/necta128.ogg|Nectarine Demoscene Radio|http://www.scenemusic.eu/
-r1.scenesat.com:8000/scenesathi|SceneSat Radio|http://www.scenesat.com
-radioparadise.steadyhost.com:8060|Radio Paradise|http://www.radioparadise.com/
diff --git a/config/rootfiles/common/configroot b/config/rootfiles/common/configroot
index a286a1538..9839eee45 100644
--- a/config/rootfiles/common/configroot
+++ b/config/rootfiles/common/configroot
@@ -119,7 +119,6 @@  var/ipfire/menu.d/60-ipfire.menu
 var/ipfire/menu.d/70-log.menu
 #var/ipfire/menu.d/EX-apcupsd.menu
 #var/ipfire/menu.d/EX-guardian.menu
-#var/ipfire/menu.d/EX-mpfire.menu
 #var/ipfire/menu.d/EX-mympd.menu
 #var/ipfire/menu.d/EX-samba.menu
 #var/ipfire/menu.d/EX-tor.menu
diff --git a/config/rootfiles/common/web-user-interface b/config/rootfiles/common/web-user-interface
index 7678c1e5d..d779ad1c8 100644
--- a/config/rootfiles/common/web-user-interface
+++ b/config/rootfiles/common/web-user-interface
@@ -55,7 +55,6 @@  srv/web/ipfire/cgi-bin/media.cgi
 srv/web/ipfire/cgi-bin/memory.cgi
 srv/web/ipfire/cgi-bin/modem-status.cgi
 srv/web/ipfire/cgi-bin/modem.cgi
-#srv/web/ipfire/cgi-bin/mpfire.cgi
 #srv/web/ipfire/cgi-bin/mympd.cgi
 srv/web/ipfire/cgi-bin/netexternal.cgi
 srv/web/ipfire/cgi-bin/netinternal.cgi
@@ -218,8 +217,6 @@  srv/web/ipfire/html/images/media-resume.png
 srv/web/ipfire/html/images/media-shuffle.png
 srv/web/ipfire/html/images/media-skip-backward.png
 srv/web/ipfire/html/images/media-skip-forward.png
-srv/web/ipfire/html/images/mpfire
-srv/web/ipfire/html/images/mpfire/box.png
 srv/web/ipfire/html/images/network-error.png
 srv/web/ipfire/html/images/network-idle.png
 srv/web/ipfire/html/images/network-offline.png
diff --git a/config/rootfiles/packages/mpfire b/config/rootfiles/packages/mpfire
deleted file mode 100644
index ab12bde03..000000000
--- a/config/rootfiles/packages/mpfire
+++ /dev/null
@@ -1,35 +0,0 @@ 
-srv/web/ipfire/cgi-bin/mpfire.cgi
-srv/web/ipfire/html/images/mpfire
-usr/lib/perl5/5.36.0/Class/Accessor
-usr/lib/perl5/5.36.0/Class/Accessor.pm
-usr/lib/perl5/5.36.0/Class/Accessor/Fast.pm
-usr/lib/perl5/5.36.0/Class/Accessor/Faster.pm
-usr/lib/perl5/5.36.0/Readonly.pm
-usr/lib/perl5/site_perl/5.36.0/Audio
-usr/lib/perl5/site_perl/5.36.0/Audio/MPD
-usr/lib/perl5/site_perl/5.36.0/Audio/MPD.pm
-usr/lib/perl5/site_perl/5.36.0/Audio/MPD/Collection.pm
-usr/lib/perl5/site_perl/5.36.0/Audio/MPD/Common
-usr/lib/perl5/site_perl/5.36.0/Audio/MPD/Common.pm
-usr/lib/perl5/site_perl/5.36.0/Audio/MPD/Common/Item
-usr/lib/perl5/site_perl/5.36.0/Audio/MPD/Common/Item.pm
-usr/lib/perl5/site_perl/5.36.0/Audio/MPD/Common/Item/Directory.pm
-usr/lib/perl5/site_perl/5.36.0/Audio/MPD/Common/Item/Playlist.pm
-usr/lib/perl5/site_perl/5.36.0/Audio/MPD/Common/Item/Song.pm
-usr/lib/perl5/site_perl/5.36.0/Audio/MPD/Common/Stats.pm
-usr/lib/perl5/site_perl/5.36.0/Audio/MPD/Common/Status.pm
-usr/lib/perl5/site_perl/5.36.0/Audio/MPD/Common/Time.pm
-usr/lib/perl5/site_perl/5.36.0/Audio/MPD/Playlist.pm
-usr/lib/perl5/site_perl/5.36.0/Audio/MPD/Test.pm
-usr/local/bin/mpfirectrl
-var/ipfire/backup/addons/includes/mpfire
-var/ipfire/menu.d/EX-mpfire.menu
-var/ipfire/mpfire
-var/ipfire/mpfire/bin
-var/ipfire/mpfire/bin/mpfire.pl
-var/ipfire/mpfire/settings
-var/ipfire/mpfire/webradio
-usr/local/bin/mpfirectrl
-srv/web/ipfire/cgi-bin/mpfire.cgi
-srv/web/ipfire/html/images/mpfire
-var/ipfire/menu.d/EX-mpfire.menu
diff --git a/doc/language_issues.de b/doc/language_issues.de
index bd335de41..7883bef76 100644
--- a/doc/language_issues.de
+++ b/doc/language_issues.de
@@ -24,14 +24,19 @@  WARNING: translation string unused: ConnSched scheduler
 WARNING: translation string unused: ConnSched select profile
 WARNING: translation string unused: Daily
 WARNING: translation string unused: Disabled
+WARNING: translation string unused: Existing Files
 WARNING: translation string unused: HDD temperature
 WARNING: translation string unused: Level7 rule
 WARNING: translation string unused: Local VPN IP
+WARNING: translation string unused: Pages
 WARNING: translation string unused: Ping
 WARNING: translation string unused: Queuelenght
 WARNING: translation string unused: Remote IP
 WARNING: translation string unused: Remote VPN IP
 WARNING: translation string unused: Resolv
+WARNING: translation string unused: Scan for Files
+WARNING: translation string unused: Scan for Songs
+WARNING: translation string unused: Scan from Directory
 WARNING: translation string unused: Subclass
 WARNING: translation string unused: TOS Bits
 WARNING: translation string unused: Utilization on
@@ -110,6 +115,7 @@  WARNING: translation string unused: age seconds
 WARNING: translation string unused: age shour
 WARNING: translation string unused: age sminute
 WARNING: translation string unused: age ssecond
+WARNING: translation string unused: album
 WARNING: translation string unused: alcatelusb help
 WARNING: translation string unused: alcatelusb upload
 WARNING: translation string unused: all interfaces
@@ -122,6 +128,7 @@  WARNING: translation string unused: alt vpn
 WARNING: translation string unused: and
 WARNING: translation string unused: apply
 WARNING: translation string unused: archive not exist
+WARNING: translation string unused: artist
 WARNING: translation string unused: attemps
 WARNING: translation string unused: avoid dod
 WARNING: translation string unused: backup config floppy
@@ -158,6 +165,7 @@  WARNING: translation string unused: check for net traffic update
 WARNING: translation string unused: choose config
 WARNING: translation string unused: class in use
 WARNING: translation string unused: clear cache
+WARNING: translation string unused: clear playlist
 WARNING: translation string unused: client
 WARNING: translation string unused: comment
 WARNING: translation string unused: community rules
@@ -179,6 +187,7 @@  WARNING: translation string unused: create mask
 WARNING: translation string unused: create new backup
 WARNING: translation string unused: current media
 WARNING: translation string unused: current ovpn
+WARNING: translation string unused: current playlist
 WARNING: translation string unused: current profile
 WARNING: translation string unused: custom networks
 WARNING: translation string unused: custom services
@@ -375,6 +384,7 @@  WARNING: translation string unused: generatekeys
 WARNING: translation string unused: generatepolicy
 WARNING: translation string unused: generatereport
 WARNING: translation string unused: genkey
+WARNING: translation string unused: genre
 WARNING: translation string unused: gpl i accept these terms and conditions
 WARNING: translation string unused: gpl license agreement
 WARNING: translation string unused: gpl please read carefully the general public license and accept it below
@@ -540,6 +550,7 @@  WARNING: translation string unused: network traffic graphs
 WARNING: translation string unused: network updated
 WARNING: translation string unused: networks settings
 WARNING: translation string unused: new optionsfw must boot
+WARNING: translation string unused: next
 WARNING: translation string unused: no alcatelusb firmware
 WARNING: translation string unused: no cfg upload
 WARNING: translation string unused: no eciadsl synch.bin file
@@ -632,6 +643,7 @@  WARNING: translation string unused: pdc options
 WARNING: translation string unused: phase1 group
 WARNING: translation string unused: phonebook entry
 WARNING: translation string unused: ping disabled
+WARNING: translation string unused: play
 WARNING: translation string unused: polfile
 WARNING: translation string unused: port forwarding configuration
 WARNING: translation string unused: ports
@@ -639,6 +651,7 @@  WARNING: translation string unused: pots
 WARNING: translation string unused: pppoe
 WARNING: translation string unused: prefered master
 WARNING: translation string unused: present
+WARNING: translation string unused: prev
 WARNING: translation string unused: printcap name
 WARNING: translation string unused: printer
 WARNING: translation string unused: printername
@@ -652,6 +665,7 @@  WARNING: translation string unused: proxy no proxy local
 WARNING: translation string unused: proxy port
 WARNING: translation string unused: psk
 WARNING: translation string unused: qos add subclass
+WARNING: translation string unused: quick playlist
 WARNING: translation string unused: read list
 WARNING: translation string unused: reboot ask
 WARNING: translation string unused: reboot question
@@ -662,6 +676,7 @@  WARNING: translation string unused: registered user rules
 WARNING: translation string unused: released
 WARNING: translation string unused: reload
 WARNING: translation string unused: removable device advice
+WARNING: translation string unused: repeat
 WARNING: translation string unused: reportfile
 WARNING: translation string unused: reportlevel
 WARNING: translation string unused: requested data
@@ -704,6 +719,7 @@  WARNING: translation string unused: set
 WARNING: translation string unused: shaping list options
 WARNING: translation string unused: show last x lines
 WARNING: translation string unused: show share options
+WARNING: translation string unused: shuffle
 WARNING: translation string unused: shutdown ask
 WARNING: translation string unused: shutdown sure
 WARNING: translation string unused: shutdown2
@@ -765,9 +781,11 @@  WARNING: translation string unused: this months volume
 WARNING: translation string unused: this update is already installed
 WARNING: translation string unused: this weeks volume
 WARNING: translation string unused: time date manually reset
+WARNING: translation string unused: title
 WARNING: translation string unused: to email adr
 WARNING: translation string unused: to install an update
 WARNING: translation string unused: to warn email bad
+WARNING: translation string unused: toggle
 WARNING: translation string unused: too long 80 char max
 WARNING: translation string unused: tor 0 = disabled
 WARNING: translation string unused: tor accounting period daily
@@ -850,6 +868,10 @@  WARNING: translation string unused: use dov
 WARNING: translation string unused: use ibod
 WARNING: translation string unused: view log
 WARNING: translation string unused: visible in browselist
+WARNING: translation string unused: voldown10
+WARNING: translation string unused: voldown5
+WARNING: translation string unused: volup10
+WARNING: translation string unused: volup5
 WARNING: translation string unused: vpn aggrmode
 WARNING: translation string unused: vpn delayed start
 WARNING: translation string unused: vpn delayed start help
@@ -862,6 +884,7 @@  WARNING: translation string unused: vpn red name
 WARNING: translation string unused: vpn watch
 WARNING: translation string unused: warn when traffic reaches
 WARNING: translation string unused: web proxy configuration
+WARNING: translation string unused: webradio playlist
 WARNING: translation string unused: week
 WARNING: translation string unused: week-graph
 WARNING: translation string unused: weekly firewallhits
diff --git a/doc/language_issues.en b/doc/language_issues.en
index 4f8a7adc4..3f1626b68 100644
--- a/doc/language_issues.en
+++ b/doc/language_issues.en
@@ -59,7 +59,6 @@  WARNING: untranslated string: ConnSched up = Up
 WARNING: untranslated string: ConnSched weekdays = Days of the week:
 WARNING: untranslated string: Edit an existing route = Edit an existing route
 WARNING: untranslated string: Enter TOS = Activate or deactivate TOS-bits <br /> and then press <i>Save</i>.
-WARNING: untranslated string: Existing Files = Files in database
 WARNING: untranslated string: Level7 Protocol = Level7-Protocol
 WARNING: untranslated string: Level7 Rule = Level7-Rule
 WARNING: untranslated string: MB read = MB read
@@ -71,12 +70,8 @@  WARNING: untranslated string: Number of IPs for the pie chart = Number of IPs fo
 WARNING: untranslated string: Number of Ports for the pie chart = Number of ports for the pie chart
 WARNING: untranslated string: OVPN = OpenVPN
 WARNING: untranslated string: OpenVPN = OpenVPN
-WARNING: untranslated string: Pages = Pages
 WARNING: untranslated string: Port Rule = Port-Rule
 WARNING: untranslated string: QoS not enabled = QoS is not enabled!
-WARNING: untranslated string: Scan for Files = Scan for files
-WARNING: untranslated string: Scan for Songs = unknown string
-WARNING: untranslated string: Scan from Directory = Scan from directory
 WARNING: untranslated string: Set time on boot = Force setting the system clock on boot
 WARNING: untranslated string: TOS Rule = TOS-Rule
 WARNING: untranslated string: TOS rule = TOS rule
@@ -307,7 +302,6 @@  WARNING: untranslated string: advproxy wpad title = Web Proxy Auto-Discovery Pro
 WARNING: untranslated string: advproxy wpad view pac = Open PAC File
 WARNING: untranslated string: age second = second
 WARNING: untranslated string: aktiv = Active
-WARNING: untranslated string: album = Album
 WARNING: untranslated string: alias ip = Alias IP
 WARNING: untranslated string: aliases = Aliases
 WARNING: untranslated string: aliases default interface = - Default Interface -
@@ -323,7 +317,6 @@  WARNING: untranslated string: apcupsd = APC-UPS status
 WARNING: untranslated string: april = April
 WARNING: untranslated string: are you sure = Are you sure?
 WARNING: untranslated string: arp table entries = ARP Table Entries
-WARNING: untranslated string: artist = Artist
 WARNING: untranslated string: asn lookup failed = AS lookup failed
 WARNING: untranslated string: atm device = Device:
 WARNING: untranslated string: atm settings = ATM settings
@@ -477,7 +470,6 @@  WARNING: untranslated string: check all = Check all
 WARNING: untranslated string: check vpn lr = Check
 WARNING: untranslated string: cipher = Encryption:
 WARNING: untranslated string: city = City
-WARNING: untranslated string: clear playlist = Empty playlist
 WARNING: untranslated string: clenabled = Provide time to local network
 WARNING: untranslated string: click to disable = Enabled (click to disable)
 WARNING: untranslated string: click to enable = Disabled (click to enable)
@@ -535,7 +527,6 @@  WARNING: untranslated string: current dhcp leases on blue = Current DHCP leases
 WARNING: untranslated string: current dynamic leases = Current dynamic leases
 WARNING: untranslated string: current fixed leases = Current fixed leases
 WARNING: untranslated string: current hosts = Current hosts
-WARNING: untranslated string: current playlist = Current Playlist
 WARNING: untranslated string: current rules = Current rules:
 WARNING: untranslated string: daemon login script = Daemon login script
 WARNING: untranslated string: dangerous = Dangerous
@@ -978,7 +969,6 @@  WARNING: untranslated string: generate iso = Generate ISO
 WARNING: untranslated string: generate ptr = Generate PTR
 WARNING: untranslated string: generate root/host certificates = Generate root/host certificates
 WARNING: untranslated string: generating the root and host certificates may take a long time. it can take up to several minutes on older hardware. please be patient = Generating the root and host certificates may take a long time.  It can take up to several minutes on older hardware. Please be patient.
-WARNING: untranslated string: genre = Genre
 WARNING: untranslated string: global settings = Global Settings
 WARNING: untranslated string: graph = Graph
 WARNING: untranslated string: green = GREEN
@@ -1338,13 +1328,6 @@  WARNING: untranslated string: month = Month
 WARNING: untranslated string: months = Months
 WARNING: untranslated string: most preferred = most preferred
 WARNING: untranslated string: mounted on = Mounted on
-WARNING: untranslated string: mpfire = Media Player for IPFire
-WARNING: untranslated string: mpfire controls = MPFire Control
-WARNING: untranslated string: mpfire playlist = MPFire Playlist
-WARNING: untranslated string: mpfire scanning = Scan for new files
-WARNING: untranslated string: mpfire search = MPFire Search
-WARNING: untranslated string: mpfire songs = MPFire songlist
-WARNING: untranslated string: mpfire webradio = MPFire Webradio
 WARNING: untranslated string: mtu = MTU
 WARNING: untranslated string: name = Name
 WARNING: untranslated string: name is invalid = Name is invalid
@@ -1368,7 +1351,6 @@  WARNING: untranslated string: network traffic graphs others = Network (others)
 WARNING: untranslated string: never = Never
 WARNING: untranslated string: new optionsfw later = Some options need a reboot to take effect
 WARNING: untranslated string: newer = Newer
-WARNING: untranslated string: next = next
 WARNING: untranslated string: no = No
 WARNING: untranslated string: no data = unknown string
 WARNING: untranslated string: no dhcp lease = No DHCP lease has been acquired
@@ -1505,7 +1487,6 @@  WARNING: untranslated string: percentage = Percentage
 WARNING: untranslated string: persistent = Persistent
 WARNING: untranslated string: pfs yes no = Perfect Forward Secrecy (PFS)
 WARNING: untranslated string: pkcs12 file password = PKCS12 File Password
-WARNING: untranslated string: play = Play
 WARNING: untranslated string: please reboot to apply your changes = Please reboot to apply your changes
 WARNING: untranslated string: policy = Policy
 WARNING: untranslated string: port = Port
@@ -1517,7 +1498,6 @@  WARNING: untranslated string: pptp peer = Peer
 WARNING: untranslated string: pptp route = PPTP Route
 WARNING: untranslated string: pptp settings = Additional PPTP settings:
 WARNING: untranslated string: pre-shared key is too short = Pre-shared key is too short.
-WARNING: untranslated string: prev = previous
 WARNING: untranslated string: primary dns = Primary DNS:
 WARNING: untranslated string: primary ntp server = Primary NTP server
 WARNING: untranslated string: primary wins server address = Primary WINS server address
@@ -1553,7 +1533,6 @@  WARNING: untranslated string: pulse dial = Pulse dial:
 WARNING: untranslated string: qos enter bandwidths = You will need to enter your downstream and upstream bandwidth!
 WARNING: untranslated string: qos graphs = Qos Graphs
 WARNING: untranslated string: qos warning = The rule <strong>must</strong> be saved, otherwise it will be discarded!
-WARNING: untranslated string: quick playlist = Quick Playlist
 WARNING: untranslated string: ram = RAM
 WARNING: untranslated string: rdns = rDNS
 WARNING: untranslated string: read bytes = Bytes Read
@@ -1588,7 +1567,6 @@  WARNING: untranslated string: remote subnet is invalid = Remote subnet is invali
 WARNING: untranslated string: remove = Remove
 WARNING: untranslated string: remove ca certificate = Remove CA certificate
 WARNING: untranslated string: remove x509 = Remove x509
-WARNING: untranslated string: repeat = Repeat
 WARNING: untranslated string: request = Request
 WARNING: untranslated string: required = Required
 WARNING: untranslated string: required field = Required field
@@ -1651,7 +1629,6 @@  WARNING: untranslated string: show host certificate = Show host certificate
 WARNING: untranslated string: show otp qrcode = Show OTP QRCode
 WARNING: untranslated string: show root certificate = Show root certificate
 WARNING: untranslated string: show tls-auth key = Show tls-auth key
-WARNING: untranslated string: shuffle = Shuffle
 WARNING: untranslated string: shutdown = Shutdown
 WARNING: untranslated string: shutdown control = Shutdown control
 WARNING: untranslated string: shutting down = Shutting down
@@ -1747,9 +1724,7 @@  WARNING: untranslated string: time = Time
 WARNING: untranslated string: time server = Time Server
 WARNING: untranslated string: timeformat = %Y-%m-%d at %H:%M:%S %Z
 WARNING: untranslated string: timeout must be a number = Timeout must be a number.
-WARNING: untranslated string: title = Title
 WARNING: untranslated string: to = To
-WARNING: untranslated string: toggle = pause/resume
 WARNING: untranslated string: toggle enable disable = Enable or disable
 WARNING: untranslated string: token = Token:
 WARNING: untranslated string: token not set = No Token has been given.
@@ -2119,10 +2094,6 @@  WARNING: untranslated string: version = Version
 WARNING: untranslated string: virtual address = Virtual Address
 WARNING: untranslated string: virtual private networking = Virtual Private Networking
 WARNING: untranslated string: visit us at = Visit us at
-WARNING: untranslated string: voldown10 = Decrease volume by 10
-WARNING: untranslated string: voldown5 = Decrease volume by 5
-WARNING: untranslated string: volup10 = Increase volume by 10
-WARNING: untranslated string: volup5 = Increase volume by 5
 WARNING: untranslated string: vpi number = VPI number:
 WARNING: untranslated string: vpn = VPN
 WARNING: untranslated string: vpn altname syntax = SubjectAltName is a comma separated list of email, dns, uri, rid and ip objects.<br />email:an email address. Syntax email:copy takes the email field from the cert to be used.<br />DNS:a valid domain name.<br />URI:any valid uri.<br />RID:registered object identifier.<br />IP:an IP address.<br />Note:charset is limited and case is significant.<br />Example:<br /><b>email:</b>ipfire@foo.org<b>,email:</b>copy<b>,DNS:</b>www.ipfire.org<b>,IP:</b>127.0.0.1<b>,URI:</b>http://url/to/something
@@ -2157,7 +2128,6 @@  WARNING: untranslated string: was deleted = was deleted
 WARNING: untranslated string: web hits = Total number of websites matching selected criteria for
 WARNING: untranslated string: web proxy = Web Proxy
 WARNING: untranslated string: web server = Web Server
-WARNING: untranslated string: webradio playlist = Webradio Playlist
 WARNING: untranslated string: website = Website
 WARNING: untranslated string: wednesday = Wednesday
 WARNING: untranslated string: weeks = Weeks
diff --git a/doc/language_issues.es b/doc/language_issues.es
index b33ffa2dc..0a89279d5 100644
--- a/doc/language_issues.es
+++ b/doc/language_issues.es
@@ -26,14 +26,18 @@  WARNING: translation string unused: ConnSched scheduler
 WARNING: translation string unused: ConnSched select profile
 WARNING: translation string unused: Daily
 WARNING: translation string unused: Disabled
+WARNING: translation string unused: Existing Files
 WARNING: translation string unused: HDD temperature
 WARNING: translation string unused: Level7 rule
 WARNING: translation string unused: Local VPN IP
+WARNING: translation string unused: Pages
 WARNING: translation string unused: Ping
 WARNING: translation string unused: Queuelenght
 WARNING: translation string unused: Remote IP
 WARNING: translation string unused: Remote VPN IP
 WARNING: translation string unused: Resolv
+WARNING: translation string unused: Scan for Files
+WARNING: translation string unused: Scan from Directory
 WARNING: translation string unused: Subclass
 WARNING: translation string unused: TOS Bits
 WARNING: translation string unused: Utilization on
@@ -112,6 +116,7 @@  WARNING: translation string unused: age seconds
 WARNING: translation string unused: age shour
 WARNING: translation string unused: age sminute
 WARNING: translation string unused: age ssecond
+WARNING: translation string unused: album
 WARNING: translation string unused: alcatelusb help
 WARNING: translation string unused: alcatelusb upload
 WARNING: translation string unused: all interfaces
@@ -125,6 +130,7 @@  WARNING: translation string unused: and
 WARNING: translation string unused: ansi t1.483
 WARNING: translation string unused: apply
 WARNING: translation string unused: archive not exist
+WARNING: translation string unused: artist
 WARNING: translation string unused: attemps
 WARNING: translation string unused: avoid dod
 WARNING: translation string unused: backup archive
@@ -177,6 +183,7 @@  WARNING: translation string unused: choose config
 WARNING: translation string unused: choose media
 WARNING: translation string unused: class in use
 WARNING: translation string unused: clear cache
+WARNING: translation string unused: clear playlist
 WARNING: translation string unused: client
 WARNING: translation string unused: comment
 WARNING: translation string unused: community rules
@@ -200,6 +207,7 @@  WARNING: translation string unused: create new backup
 WARNING: translation string unused: cryptographic settings
 WARNING: translation string unused: current media
 WARNING: translation string unused: current ovpn
+WARNING: translation string unused: current playlist
 WARNING: translation string unused: current profile
 WARNING: translation string unused: custom networks
 WARNING: translation string unused: custom services
@@ -414,6 +422,7 @@  WARNING: translation string unused: generatekeys
 WARNING: translation string unused: generatepolicy
 WARNING: translation string unused: generatereport
 WARNING: translation string unused: genkey
+WARNING: translation string unused: genre
 WARNING: translation string unused: gpl i accept these terms and conditions
 WARNING: translation string unused: gpl license agreement
 WARNING: translation string unused: gpl please read carefully the general public license and accept it below
@@ -588,6 +597,7 @@  WARNING: translation string unused: network traffic graphs
 WARNING: translation string unused: network updated
 WARNING: translation string unused: networks settings
 WARNING: translation string unused: new optionsfw must boot
+WARNING: translation string unused: next
 WARNING: translation string unused: no alcatelusb firmware
 WARNING: translation string unused: no cfg upload
 WARNING: translation string unused: no eciadsl synch.bin file
@@ -688,6 +698,7 @@  WARNING: translation string unused: pdc options
 WARNING: translation string unused: phase1 group
 WARNING: translation string unused: phonebook entry
 WARNING: translation string unused: ping disabled
+WARNING: translation string unused: play
 WARNING: translation string unused: polfile
 WARNING: translation string unused: port forwarding configuration
 WARNING: translation string unused: ports
@@ -695,6 +706,7 @@  WARNING: translation string unused: pots
 WARNING: translation string unused: pppoe
 WARNING: translation string unused: prefered master
 WARNING: translation string unused: present
+WARNING: translation string unused: prev
 WARNING: translation string unused: printcap name
 WARNING: translation string unused: printer
 WARNING: translation string unused: printername
@@ -709,6 +721,7 @@  WARNING: translation string unused: proxy port
 WARNING: translation string unused: psk
 WARNING: translation string unused: qos add subclass
 WARNING: translation string unused: quick control
+WARNING: translation string unused: quick playlist
 WARNING: translation string unused: random number generator daemon
 WARNING: translation string unused: read list
 WARNING: translation string unused: reboot ask
@@ -720,6 +733,7 @@  WARNING: translation string unused: registered user rules
 WARNING: translation string unused: released
 WARNING: translation string unused: reload
 WARNING: translation string unused: removable device advice
+WARNING: translation string unused: repeat
 WARNING: translation string unused: reportfile
 WARNING: translation string unused: reportlevel
 WARNING: translation string unused: requested data
@@ -765,6 +779,7 @@  WARNING: translation string unused: show areas
 WARNING: translation string unused: show last x lines
 WARNING: translation string unused: show lines
 WARNING: translation string unused: show share options
+WARNING: translation string unused: shuffle
 WARNING: translation string unused: shutdown ask
 WARNING: translation string unused: shutdown sure
 WARNING: translation string unused: shutdown2
@@ -829,9 +844,11 @@  WARNING: translation string unused: this months volume
 WARNING: translation string unused: this update is already installed
 WARNING: translation string unused: this weeks volume
 WARNING: translation string unused: time date manually reset
+WARNING: translation string unused: title
 WARNING: translation string unused: to email adr
 WARNING: translation string unused: to install an update
 WARNING: translation string unused: to warn email bad
+WARNING: translation string unused: toggle
 WARNING: translation string unused: too long 80 char max
 WARNING: translation string unused: tor 0 = disabled
 WARNING: translation string unused: tor accounting period daily
@@ -919,6 +936,10 @@  WARNING: translation string unused: use dov
 WARNING: translation string unused: use ibod
 WARNING: translation string unused: view log
 WARNING: translation string unused: visible in browselist
+WARNING: translation string unused: voldown10
+WARNING: translation string unused: voldown5
+WARNING: translation string unused: volup10
+WARNING: translation string unused: volup5
 WARNING: translation string unused: vpn aggrmode
 WARNING: translation string unused: vpn configuration main
 WARNING: translation string unused: vpn delayed start
@@ -932,6 +953,7 @@  WARNING: translation string unused: vpn red name
 WARNING: translation string unused: vpn watch
 WARNING: translation string unused: warn when traffic reaches
 WARNING: translation string unused: web proxy configuration
+WARNING: translation string unused: webradio playlist
 WARNING: translation string unused: week
 WARNING: translation string unused: week-graph
 WARNING: translation string unused: weekly firewallhits
@@ -977,7 +999,6 @@  WARNING: translation string unused: zoneconf val vlan tag range error
 WARNING: translation string unused: zoneconf val zoneslave amount error
 WARNING: untranslated string: Captive ACTIVATE = unknown string
 WARNING: untranslated string: Captive clients = unknown string
-WARNING: untranslated string: Scan for Songs = unknown string
 WARNING: untranslated string: access point name = Access Point Name
 WARNING: untranslated string: access point name is invalid = Access Point Name is invalid
 WARNING: untranslated string: access point name is required = Access Point Name is required
diff --git a/doc/language_issues.fr b/doc/language_issues.fr
index 93466bd9e..7f9349bc0 100644
--- a/doc/language_issues.fr
+++ b/doc/language_issues.fr
@@ -28,14 +28,19 @@  WARNING: translation string unused: ConnSched scheduler
 WARNING: translation string unused: ConnSched select profile
 WARNING: translation string unused: Daily
 WARNING: translation string unused: Disabled
+WARNING: translation string unused: Existing Files
 WARNING: translation string unused: HDD temperature
 WARNING: translation string unused: Level7 rule
 WARNING: translation string unused: Local VPN IP
+WARNING: translation string unused: Pages
 WARNING: translation string unused: Ping
 WARNING: translation string unused: Queuelenght
 WARNING: translation string unused: Remote IP
 WARNING: translation string unused: Remote VPN IP
 WARNING: translation string unused: Resolv
+WARNING: translation string unused: Scan for Files
+WARNING: translation string unused: Scan for Songs
+WARNING: translation string unused: Scan from Directory
 WARNING: translation string unused: Subclass
 WARNING: translation string unused: TOS Bits
 WARNING: translation string unused: Utilization on
@@ -115,6 +120,7 @@  WARNING: translation string unused: age seconds
 WARNING: translation string unused: age shour
 WARNING: translation string unused: age sminute
 WARNING: translation string unused: age ssecond
+WARNING: translation string unused: album
 WARNING: translation string unused: alcatelusb help
 WARNING: translation string unused: alcatelusb upload
 WARNING: translation string unused: all interfaces
@@ -127,6 +133,7 @@  WARNING: translation string unused: alt vpn
 WARNING: translation string unused: and
 WARNING: translation string unused: apply
 WARNING: translation string unused: archive not exist
+WARNING: translation string unused: artist
 WARNING: translation string unused: attemps
 WARNING: translation string unused: avoid dod
 WARNING: translation string unused: backup archive
@@ -179,6 +186,7 @@  WARNING: translation string unused: choose config
 WARNING: translation string unused: choose media
 WARNING: translation string unused: class in use
 WARNING: translation string unused: clear cache
+WARNING: translation string unused: clear playlist
 WARNING: translation string unused: client
 WARNING: translation string unused: comment
 WARNING: translation string unused: community rules
@@ -202,6 +210,7 @@  WARNING: translation string unused: create new backup
 WARNING: translation string unused: cryptographic settings
 WARNING: translation string unused: current media
 WARNING: translation string unused: current ovpn
+WARNING: translation string unused: current playlist
 WARNING: translation string unused: current profile
 WARNING: translation string unused: custom networks
 WARNING: translation string unused: custom services
@@ -402,6 +411,7 @@  WARNING: translation string unused: generatekeys
 WARNING: translation string unused: generatepolicy
 WARNING: translation string unused: generatereport
 WARNING: translation string unused: genkey
+WARNING: translation string unused: genre
 WARNING: translation string unused: gpl i accept these terms and conditions
 WARNING: translation string unused: gpl license agreement
 WARNING: translation string unused: gpl please read carefully the general public license and accept it below
@@ -568,6 +578,7 @@  WARNING: translation string unused: network traffic graphs
 WARNING: translation string unused: network updated
 WARNING: translation string unused: networks settings
 WARNING: translation string unused: new optionsfw must boot
+WARNING: translation string unused: next
 WARNING: translation string unused: no alcatelusb firmware
 WARNING: translation string unused: no cfg upload
 WARNING: translation string unused: no eciadsl synch.bin file
@@ -662,6 +673,7 @@  WARNING: translation string unused: pdc options
 WARNING: translation string unused: phase1 group
 WARNING: translation string unused: phonebook entry
 WARNING: translation string unused: ping disabled
+WARNING: translation string unused: play
 WARNING: translation string unused: polfile
 WARNING: translation string unused: port forwarding configuration
 WARNING: translation string unused: ports
@@ -669,6 +681,7 @@  WARNING: translation string unused: pots
 WARNING: translation string unused: pppoe
 WARNING: translation string unused: prefered master
 WARNING: translation string unused: present
+WARNING: translation string unused: prev
 WARNING: translation string unused: printcap name
 WARNING: translation string unused: printer
 WARNING: translation string unused: printername
@@ -683,6 +696,7 @@  WARNING: translation string unused: proxy port
 WARNING: translation string unused: psk
 WARNING: translation string unused: qos add subclass
 WARNING: translation string unused: quick control
+WARNING: translation string unused: quick playlist
 WARNING: translation string unused: random number generator daemon
 WARNING: translation string unused: read list
 WARNING: translation string unused: reboot ask
@@ -694,6 +708,7 @@  WARNING: translation string unused: registered user rules
 WARNING: translation string unused: released
 WARNING: translation string unused: reload
 WARNING: translation string unused: removable device advice
+WARNING: translation string unused: repeat
 WARNING: translation string unused: reportfile
 WARNING: translation string unused: reportlevel
 WARNING: translation string unused: requested data
@@ -739,6 +754,7 @@  WARNING: translation string unused: show areas
 WARNING: translation string unused: show last x lines
 WARNING: translation string unused: show lines
 WARNING: translation string unused: show share options
+WARNING: translation string unused: shuffle
 WARNING: translation string unused: shutdown ask
 WARNING: translation string unused: shutdown sure
 WARNING: translation string unused: shutdown2
@@ -801,9 +817,11 @@  WARNING: translation string unused: this months volume
 WARNING: translation string unused: this update is already installed
 WARNING: translation string unused: this weeks volume
 WARNING: translation string unused: time date manually reset
+WARNING: translation string unused: title
 WARNING: translation string unused: to email adr
 WARNING: translation string unused: to install an update
 WARNING: translation string unused: to warn email bad
+WARNING: translation string unused: toggle
 WARNING: translation string unused: too long 80 char max
 WARNING: translation string unused: tor 0 = disabled
 WARNING: translation string unused: tor accounting period daily
@@ -889,6 +907,10 @@  WARNING: translation string unused: use dov
 WARNING: translation string unused: use ibod
 WARNING: translation string unused: view log
 WARNING: translation string unused: visible in browselist
+WARNING: translation string unused: voldown10
+WARNING: translation string unused: voldown5
+WARNING: translation string unused: volup10
+WARNING: translation string unused: volup5
 WARNING: translation string unused: vpn aggrmode
 WARNING: translation string unused: vpn configuration main
 WARNING: translation string unused: vpn delayed start
@@ -902,6 +924,7 @@  WARNING: translation string unused: vpn red name
 WARNING: translation string unused: vpn watch
 WARNING: translation string unused: warn when traffic reaches
 WARNING: translation string unused: web proxy configuration
+WARNING: translation string unused: webradio playlist
 WARNING: translation string unused: week
 WARNING: translation string unused: week-graph
 WARNING: translation string unused: weekly firewallhits
diff --git a/doc/language_issues.it b/doc/language_issues.it
index 426df7759..5870e2bc7 100644
--- a/doc/language_issues.it
+++ b/doc/language_issues.it
@@ -2,14 +2,18 @@  WARNING: translation string unused: Async logging enabled
 WARNING: translation string unused: Client status and controlc
 WARNING: translation string unused: ConnSched scheduler
 WARNING: translation string unused: ConnSched select profile
+WARNING: translation string unused: Existing Files
 WARNING: translation string unused: HDD temperature
 WARNING: translation string unused: Level7 rule
 WARNING: translation string unused: Local VPN IP
+WARNING: translation string unused: Pages
 WARNING: translation string unused: Ping
 WARNING: translation string unused: Queuelenght
 WARNING: translation string unused: Remote IP
 WARNING: translation string unused: Remote VPN IP
 WARNING: translation string unused: Resolv
+WARNING: translation string unused: Scan for Files
+WARNING: translation string unused: Scan from Directory
 WARNING: translation string unused: Subclass
 WARNING: translation string unused: TOS Bits
 WARNING: translation string unused: Utilization on
@@ -85,6 +89,7 @@  WARNING: translation string unused: age seconds
 WARNING: translation string unused: age shour
 WARNING: translation string unused: age sminute
 WARNING: translation string unused: age ssecond
+WARNING: translation string unused: album
 WARNING: translation string unused: alcatelusb help
 WARNING: translation string unused: alcatelusb upload
 WARNING: translation string unused: all interfaces
@@ -98,6 +103,7 @@  WARNING: translation string unused: and
 WARNING: translation string unused: ansi t1.483
 WARNING: translation string unused: apply
 WARNING: translation string unused: archive not exist
+WARNING: translation string unused: artist
 WARNING: translation string unused: attemps
 WARNING: translation string unused: avoid dod
 WARNING: translation string unused: backup archive
@@ -150,6 +156,7 @@  WARNING: translation string unused: choose config
 WARNING: translation string unused: choose media
 WARNING: translation string unused: class in use
 WARNING: translation string unused: clear cache
+WARNING: translation string unused: clear playlist
 WARNING: translation string unused: client
 WARNING: translation string unused: comment
 WARNING: translation string unused: community rules
@@ -172,6 +179,7 @@  WARNING: translation string unused: create mask
 WARNING: translation string unused: create new backup
 WARNING: translation string unused: current media
 WARNING: translation string unused: current ovpn
+WARNING: translation string unused: current playlist
 WARNING: translation string unused: current profile
 WARNING: translation string unused: custom networks
 WARNING: translation string unused: custom services
@@ -368,6 +376,7 @@  WARNING: translation string unused: generatekeys
 WARNING: translation string unused: generatepolicy
 WARNING: translation string unused: generatereport
 WARNING: translation string unused: genkey
+WARNING: translation string unused: genre
 WARNING: translation string unused: gpl i accept these terms and conditions
 WARNING: translation string unused: gpl license agreement
 WARNING: translation string unused: gpl please read carefully the general public license and accept it below
@@ -524,6 +533,7 @@  WARNING: translation string unused: network traffic graphs
 WARNING: translation string unused: network updated
 WARNING: translation string unused: networks settings
 WARNING: translation string unused: new optionsfw must boot
+WARNING: translation string unused: next
 WARNING: translation string unused: no alcatelusb firmware
 WARNING: translation string unused: no cfg upload
 WARNING: translation string unused: no eciadsl synch.bin file
@@ -616,6 +626,7 @@  WARNING: translation string unused: pdc options
 WARNING: translation string unused: phase1 group
 WARNING: translation string unused: phonebook entry
 WARNING: translation string unused: ping disabled
+WARNING: translation string unused: play
 WARNING: translation string unused: polfile
 WARNING: translation string unused: port forwarding configuration
 WARNING: translation string unused: ports
@@ -623,6 +634,7 @@  WARNING: translation string unused: pots
 WARNING: translation string unused: pppoe
 WARNING: translation string unused: prefered master
 WARNING: translation string unused: present
+WARNING: translation string unused: prev
 WARNING: translation string unused: printcap name
 WARNING: translation string unused: printer
 WARNING: translation string unused: printername
@@ -637,6 +649,7 @@  WARNING: translation string unused: proxy port
 WARNING: translation string unused: psk
 WARNING: translation string unused: qos add subclass
 WARNING: translation string unused: quick control
+WARNING: translation string unused: quick playlist
 WARNING: translation string unused: read list
 WARNING: translation string unused: reboot ask
 WARNING: translation string unused: reboot question
@@ -647,6 +660,7 @@  WARNING: translation string unused: registered user rules
 WARNING: translation string unused: released
 WARNING: translation string unused: reload
 WARNING: translation string unused: removable device advice
+WARNING: translation string unused: repeat
 WARNING: translation string unused: reportfile
 WARNING: translation string unused: reportlevel
 WARNING: translation string unused: requested data
@@ -691,6 +705,7 @@  WARNING: translation string unused: show areas
 WARNING: translation string unused: show last x lines
 WARNING: translation string unused: show lines
 WARNING: translation string unused: show share options
+WARNING: translation string unused: shuffle
 WARNING: translation string unused: shutdown ask
 WARNING: translation string unused: shutdown sure
 WARNING: translation string unused: shutdown2
@@ -755,9 +770,11 @@  WARNING: translation string unused: this months volume
 WARNING: translation string unused: this update is already installed
 WARNING: translation string unused: this weeks volume
 WARNING: translation string unused: time date manually reset
+WARNING: translation string unused: title
 WARNING: translation string unused: to email adr
 WARNING: translation string unused: to install an update
 WARNING: translation string unused: to warn email bad
+WARNING: translation string unused: toggle
 WARNING: translation string unused: too long 80 char max
 WARNING: translation string unused: tor 0 = disabled
 WARNING: translation string unused: tor accounting period daily
@@ -842,6 +859,10 @@  WARNING: translation string unused: use dov
 WARNING: translation string unused: use ibod
 WARNING: translation string unused: view log
 WARNING: translation string unused: visible in browselist
+WARNING: translation string unused: voldown10
+WARNING: translation string unused: voldown5
+WARNING: translation string unused: volup10
+WARNING: translation string unused: volup5
 WARNING: translation string unused: vpn aggrmode
 WARNING: translation string unused: vpn configuration main
 WARNING: translation string unused: vpn delayed start
@@ -855,6 +876,7 @@  WARNING: translation string unused: vpn red name
 WARNING: translation string unused: vpn watch
 WARNING: translation string unused: warn when traffic reaches
 WARNING: translation string unused: web proxy configuration
+WARNING: translation string unused: webradio playlist
 WARNING: translation string unused: week
 WARNING: translation string unused: week-graph
 WARNING: translation string unused: weekly firewallhits
@@ -917,7 +939,6 @@  WARNING: untranslated string: Captive vouchervalid = Allowed time for this coupo
 WARNING: untranslated string: Captive wrong ext = Uploaded file has wrong filetype
 WARNING: untranslated string: MTU settings = MTU settings:
 WARNING: untranslated string: Number of Countries for the pie chart = Number of Countries for the pie chart
-WARNING: untranslated string: Scan for Songs = unknown string
 WARNING: untranslated string: access point name = Access Point Name
 WARNING: untranslated string: access point name is invalid = Access Point Name is invalid
 WARNING: untranslated string: access point name is required = Access Point Name is required
diff --git a/doc/language_issues.nl b/doc/language_issues.nl
index 046e5943b..88493d1d9 100644
--- a/doc/language_issues.nl
+++ b/doc/language_issues.nl
@@ -2,14 +2,18 @@  WARNING: translation string unused: Async logging enabled
 WARNING: translation string unused: Client status and controlc
 WARNING: translation string unused: ConnSched scheduler
 WARNING: translation string unused: ConnSched select profile
+WARNING: translation string unused: Existing Files
 WARNING: translation string unused: HDD temperature
 WARNING: translation string unused: Level7 rule
 WARNING: translation string unused: Local VPN IP
+WARNING: translation string unused: Pages
 WARNING: translation string unused: Ping
 WARNING: translation string unused: Queuelenght
 WARNING: translation string unused: Remote IP
 WARNING: translation string unused: Remote VPN IP
 WARNING: translation string unused: Resolv
+WARNING: translation string unused: Scan for Files
+WARNING: translation string unused: Scan from Directory
 WARNING: translation string unused: Subclass
 WARNING: translation string unused: TOS Bits
 WARNING: translation string unused: Utilization on
@@ -85,6 +89,7 @@  WARNING: translation string unused: age seconds
 WARNING: translation string unused: age shour
 WARNING: translation string unused: age sminute
 WARNING: translation string unused: age ssecond
+WARNING: translation string unused: album
 WARNING: translation string unused: alcatelusb help
 WARNING: translation string unused: alcatelusb upload
 WARNING: translation string unused: all interfaces
@@ -98,6 +103,7 @@  WARNING: translation string unused: and
 WARNING: translation string unused: ansi t1.483
 WARNING: translation string unused: apply
 WARNING: translation string unused: archive not exist
+WARNING: translation string unused: artist
 WARNING: translation string unused: attemps
 WARNING: translation string unused: avoid dod
 WARNING: translation string unused: backup archive
@@ -150,6 +156,7 @@  WARNING: translation string unused: choose config
 WARNING: translation string unused: choose media
 WARNING: translation string unused: class in use
 WARNING: translation string unused: clear cache
+WARNING: translation string unused: clear playlist
 WARNING: translation string unused: client
 WARNING: translation string unused: comment
 WARNING: translation string unused: community rules
@@ -172,6 +179,7 @@  WARNING: translation string unused: create mask
 WARNING: translation string unused: create new backup
 WARNING: translation string unused: current media
 WARNING: translation string unused: current ovpn
+WARNING: translation string unused: current playlist
 WARNING: translation string unused: current profile
 WARNING: translation string unused: custom networks
 WARNING: translation string unused: custom services
@@ -369,6 +377,7 @@  WARNING: translation string unused: generatekeys
 WARNING: translation string unused: generatepolicy
 WARNING: translation string unused: generatereport
 WARNING: translation string unused: genkey
+WARNING: translation string unused: genre
 WARNING: translation string unused: gpl i accept these terms and conditions
 WARNING: translation string unused: gpl license agreement
 WARNING: translation string unused: gpl please read carefully the general public license and accept it below
@@ -526,6 +535,7 @@  WARNING: translation string unused: network traffic graphs
 WARNING: translation string unused: network updated
 WARNING: translation string unused: networks settings
 WARNING: translation string unused: new optionsfw must boot
+WARNING: translation string unused: next
 WARNING: translation string unused: no alcatelusb firmware
 WARNING: translation string unused: no cfg upload
 WARNING: translation string unused: no eciadsl synch.bin file
@@ -616,6 +626,7 @@  WARNING: translation string unused: pdc options
 WARNING: translation string unused: phase1 group
 WARNING: translation string unused: phonebook entry
 WARNING: translation string unused: ping disabled
+WARNING: translation string unused: play
 WARNING: translation string unused: polfile
 WARNING: translation string unused: port forwarding configuration
 WARNING: translation string unused: ports
@@ -623,6 +634,7 @@  WARNING: translation string unused: pots
 WARNING: translation string unused: pppoe
 WARNING: translation string unused: prefered master
 WARNING: translation string unused: present
+WARNING: translation string unused: prev
 WARNING: translation string unused: printcap name
 WARNING: translation string unused: printer
 WARNING: translation string unused: printername
@@ -637,6 +649,7 @@  WARNING: translation string unused: proxy port
 WARNING: translation string unused: psk
 WARNING: translation string unused: qos add subclass
 WARNING: translation string unused: quick control
+WARNING: translation string unused: quick playlist
 WARNING: translation string unused: read list
 WARNING: translation string unused: reboot ask
 WARNING: translation string unused: reboot question
@@ -647,6 +660,7 @@  WARNING: translation string unused: registered user rules
 WARNING: translation string unused: released
 WARNING: translation string unused: reload
 WARNING: translation string unused: removable device advice
+WARNING: translation string unused: repeat
 WARNING: translation string unused: reportfile
 WARNING: translation string unused: reportlevel
 WARNING: translation string unused: requested data
@@ -691,6 +705,7 @@  WARNING: translation string unused: show areas
 WARNING: translation string unused: show last x lines
 WARNING: translation string unused: show lines
 WARNING: translation string unused: show share options
+WARNING: translation string unused: shuffle
 WARNING: translation string unused: shutdown ask
 WARNING: translation string unused: shutdown sure
 WARNING: translation string unused: shutdown2
@@ -756,9 +771,11 @@  WARNING: translation string unused: this months volume
 WARNING: translation string unused: this update is already installed
 WARNING: translation string unused: this weeks volume
 WARNING: translation string unused: time date manually reset
+WARNING: translation string unused: title
 WARNING: translation string unused: to email adr
 WARNING: translation string unused: to install an update
 WARNING: translation string unused: to warn email bad
+WARNING: translation string unused: toggle
 WARNING: translation string unused: too long 80 char max
 WARNING: translation string unused: tor 0 = disabled
 WARNING: translation string unused: tor accounting period daily
@@ -843,6 +860,10 @@  WARNING: translation string unused: use dov
 WARNING: translation string unused: use ibod
 WARNING: translation string unused: view log
 WARNING: translation string unused: visible in browselist
+WARNING: translation string unused: voldown10
+WARNING: translation string unused: voldown5
+WARNING: translation string unused: volup10
+WARNING: translation string unused: volup5
 WARNING: translation string unused: vpn aggrmode
 WARNING: translation string unused: vpn configuration main
 WARNING: translation string unused: vpn delayed start
@@ -856,6 +877,7 @@  WARNING: translation string unused: vpn red name
 WARNING: translation string unused: vpn watch
 WARNING: translation string unused: warn when traffic reaches
 WARNING: translation string unused: web proxy configuration
+WARNING: translation string unused: webradio playlist
 WARNING: translation string unused: week
 WARNING: translation string unused: week-graph
 WARNING: translation string unused: weekly firewallhits
@@ -918,7 +940,6 @@  WARNING: untranslated string: Captive vouchervalid = Allowed time for this coupo
 WARNING: untranslated string: Captive wrong ext = Uploaded file has wrong filetype
 WARNING: untranslated string: MTU settings = MTU settings:
 WARNING: untranslated string: Number of Countries for the pie chart = Number of Countries for the pie chart
-WARNING: untranslated string: Scan for Songs = unknown string
 WARNING: untranslated string: access point name = Access Point Name
 WARNING: untranslated string: access point name is invalid = Access Point Name is invalid
 WARNING: untranslated string: access point name is required = Access Point Name is required
diff --git a/doc/language_issues.pl b/doc/language_issues.pl
index f0a60ab30..5f3806102 100644
--- a/doc/language_issues.pl
+++ b/doc/language_issues.pl
@@ -2,14 +2,18 @@  WARNING: translation string unused: Async logging enabled
 WARNING: translation string unused: Client status and controlc
 WARNING: translation string unused: ConnSched scheduler
 WARNING: translation string unused: ConnSched select profile
+WARNING: translation string unused: Existing Files
 WARNING: translation string unused: HDD temperature
 WARNING: translation string unused: Level7 rule
 WARNING: translation string unused: Local VPN IP
+WARNING: translation string unused: Pages
 WARNING: translation string unused: Ping
 WARNING: translation string unused: Queuelenght
 WARNING: translation string unused: Remote IP
 WARNING: translation string unused: Remote VPN IP
 WARNING: translation string unused: Resolv
+WARNING: translation string unused: Scan for Files
+WARNING: translation string unused: Scan from Directory
 WARNING: translation string unused: Subclass
 WARNING: translation string unused: TOS Bits
 WARNING: translation string unused: Utilization on
@@ -80,6 +84,7 @@  WARNING: translation string unused: advproxy update information
 WARNING: translation string unused: advproxy update notification
 WARNING: translation string unused: advproxy web browser
 WARNING: translation string unused: again
+WARNING: translation string unused: album
 WARNING: translation string unused: alcatelusb help
 WARNING: translation string unused: alcatelusb upload
 WARNING: translation string unused: all interfaces
@@ -93,6 +98,7 @@  WARNING: translation string unused: and
 WARNING: translation string unused: ansi t1.483
 WARNING: translation string unused: apply
 WARNING: translation string unused: archive not exist
+WARNING: translation string unused: artist
 WARNING: translation string unused: attemps
 WARNING: translation string unused: avoid dod
 WARNING: translation string unused: backup archive
@@ -143,6 +149,7 @@  WARNING: translation string unused: choose config
 WARNING: translation string unused: choose media
 WARNING: translation string unused: class in use
 WARNING: translation string unused: clear cache
+WARNING: translation string unused: clear playlist
 WARNING: translation string unused: client
 WARNING: translation string unused: comment
 WARNING: translation string unused: compression
@@ -164,6 +171,7 @@  WARNING: translation string unused: create mask
 WARNING: translation string unused: create new backup
 WARNING: translation string unused: current media
 WARNING: translation string unused: current ovpn
+WARNING: translation string unused: current playlist
 WARNING: translation string unused: current profile
 WARNING: translation string unused: custom networks
 WARNING: translation string unused: custom services
@@ -309,6 +317,7 @@  WARNING: translation string unused: generatekeys
 WARNING: translation string unused: generatepolicy
 WARNING: translation string unused: generatereport
 WARNING: translation string unused: genkey
+WARNING: translation string unused: genre
 WARNING: translation string unused: gpl i accept these terms and conditions
 WARNING: translation string unused: gpl license agreement
 WARNING: translation string unused: gpl please read carefully the general public license and accept it below
@@ -463,6 +472,7 @@  WARNING: translation string unused: network traffic graphs
 WARNING: translation string unused: network updated
 WARNING: translation string unused: networks settings
 WARNING: translation string unused: new optionsfw must boot
+WARNING: translation string unused: next
 WARNING: translation string unused: no alcatelusb firmware
 WARNING: translation string unused: no cfg upload
 WARNING: translation string unused: no eciadsl synch.bin file
@@ -541,6 +551,7 @@  WARNING: translation string unused: pdc options
 WARNING: translation string unused: phase1 group
 WARNING: translation string unused: phonebook entry
 WARNING: translation string unused: ping disabled
+WARNING: translation string unused: play
 WARNING: translation string unused: polfile
 WARNING: translation string unused: port forwarding configuration
 WARNING: translation string unused: ports
@@ -548,6 +559,7 @@  WARNING: translation string unused: pots
 WARNING: translation string unused: pppoe
 WARNING: translation string unused: prefered master
 WARNING: translation string unused: present
+WARNING: translation string unused: prev
 WARNING: translation string unused: printcap name
 WARNING: translation string unused: printer
 WARNING: translation string unused: printername
@@ -562,6 +574,7 @@  WARNING: translation string unused: proxy port
 WARNING: translation string unused: psk
 WARNING: translation string unused: qos add subclass
 WARNING: translation string unused: quick control
+WARNING: translation string unused: quick playlist
 WARNING: translation string unused: read list
 WARNING: translation string unused: reboot ask
 WARNING: translation string unused: reboot question
@@ -572,6 +585,7 @@  WARNING: translation string unused: registered user rules
 WARNING: translation string unused: released
 WARNING: translation string unused: reload
 WARNING: translation string unused: removable device advice
+WARNING: translation string unused: repeat
 WARNING: translation string unused: reportfile
 WARNING: translation string unused: reportlevel
 WARNING: translation string unused: requested data
@@ -616,6 +630,7 @@  WARNING: translation string unused: show areas
 WARNING: translation string unused: show last x lines
 WARNING: translation string unused: show lines
 WARNING: translation string unused: show share options
+WARNING: translation string unused: shuffle
 WARNING: translation string unused: shutdown ask
 WARNING: translation string unused: shutdown sure
 WARNING: translation string unused: shutdown2
@@ -679,9 +694,11 @@  WARNING: translation string unused: this months volume
 WARNING: translation string unused: this update is already installed
 WARNING: translation string unused: this weeks volume
 WARNING: translation string unused: time date manually reset
+WARNING: translation string unused: title
 WARNING: translation string unused: to email adr
 WARNING: translation string unused: to install an update
 WARNING: translation string unused: to warn email bad
+WARNING: translation string unused: toggle
 WARNING: translation string unused: too long 80 char max
 WARNING: translation string unused: traffic back
 WARNING: translation string unused: traffic calc time
@@ -754,6 +771,10 @@  WARNING: translation string unused: use dov
 WARNING: translation string unused: use ibod
 WARNING: translation string unused: view log
 WARNING: translation string unused: visible in browselist
+WARNING: translation string unused: voldown10
+WARNING: translation string unused: voldown5
+WARNING: translation string unused: volup10
+WARNING: translation string unused: volup5
 WARNING: translation string unused: vpn aggrmode
 WARNING: translation string unused: vpn configuration main
 WARNING: translation string unused: vpn delayed start
@@ -767,6 +788,7 @@  WARNING: translation string unused: vpn red name
 WARNING: translation string unused: vpn watch
 WARNING: translation string unused: warn when traffic reaches
 WARNING: translation string unused: web proxy configuration
+WARNING: translation string unused: webradio playlist
 WARNING: translation string unused: week
 WARNING: translation string unused: week-graph
 WARNING: translation string unused: weekly firewallhits
@@ -834,7 +856,6 @@  WARNING: untranslated string: MB read = MB read
 WARNING: untranslated string: MB written = MB written
 WARNING: untranslated string: MTU settings = MTU settings:
 WARNING: untranslated string: Number of Countries for the pie chart = Number of Countries for the pie chart
-WARNING: untranslated string: Scan for Songs = unknown string
 WARNING: untranslated string: access point name = Access Point Name
 WARNING: untranslated string: access point name is invalid = Access Point Name is invalid
 WARNING: untranslated string: access point name is required = Access Point Name is required
diff --git a/doc/language_issues.ru b/doc/language_issues.ru
index a8f2c1549..8891ce20e 100644
--- a/doc/language_issues.ru
+++ b/doc/language_issues.ru
@@ -2,14 +2,18 @@  WARNING: translation string unused: Async logging enabled
 WARNING: translation string unused: Client status and controlc
 WARNING: translation string unused: ConnSched scheduler
 WARNING: translation string unused: ConnSched select profile
+WARNING: translation string unused: Existing Files
 WARNING: translation string unused: HDD temperature
 WARNING: translation string unused: Level7 rule
 WARNING: translation string unused: Local VPN IP
+WARNING: translation string unused: Pages
 WARNING: translation string unused: Ping
 WARNING: translation string unused: Queuelenght
 WARNING: translation string unused: Remote IP
 WARNING: translation string unused: Remote VPN IP
 WARNING: translation string unused: Resolv
+WARNING: translation string unused: Scan for Files
+WARNING: translation string unused: Scan from Directory
 WARNING: translation string unused: Subclass
 WARNING: translation string unused: TOS Bits
 WARNING: translation string unused: Utilization on
@@ -80,6 +84,7 @@  WARNING: translation string unused: advproxy update information
 WARNING: translation string unused: advproxy update notification
 WARNING: translation string unused: advproxy web browser
 WARNING: translation string unused: again
+WARNING: translation string unused: album
 WARNING: translation string unused: alcatelusb help
 WARNING: translation string unused: alcatelusb upload
 WARNING: translation string unused: all interfaces
@@ -93,6 +98,7 @@  WARNING: translation string unused: and
 WARNING: translation string unused: ansi t1.483
 WARNING: translation string unused: apply
 WARNING: translation string unused: archive not exist
+WARNING: translation string unused: artist
 WARNING: translation string unused: attemps
 WARNING: translation string unused: avoid dod
 WARNING: translation string unused: backup archive
@@ -143,6 +149,7 @@  WARNING: translation string unused: choose config
 WARNING: translation string unused: choose media
 WARNING: translation string unused: class in use
 WARNING: translation string unused: clear cache
+WARNING: translation string unused: clear playlist
 WARNING: translation string unused: client
 WARNING: translation string unused: comment
 WARNING: translation string unused: compression
@@ -164,6 +171,7 @@  WARNING: translation string unused: create mask
 WARNING: translation string unused: create new backup
 WARNING: translation string unused: current media
 WARNING: translation string unused: current ovpn
+WARNING: translation string unused: current playlist
 WARNING: translation string unused: current profile
 WARNING: translation string unused: custom networks
 WARNING: translation string unused: custom services
@@ -306,6 +314,7 @@  WARNING: translation string unused: generatekeys
 WARNING: translation string unused: generatepolicy
 WARNING: translation string unused: generatereport
 WARNING: translation string unused: genkey
+WARNING: translation string unused: genre
 WARNING: translation string unused: gpl i accept these terms and conditions
 WARNING: translation string unused: gpl license agreement
 WARNING: translation string unused: gpl please read carefully the general public license and accept it below
@@ -458,6 +467,7 @@  WARNING: translation string unused: network traffic graphs
 WARNING: translation string unused: network updated
 WARNING: translation string unused: networks settings
 WARNING: translation string unused: new optionsfw must boot
+WARNING: translation string unused: next
 WARNING: translation string unused: no alcatelusb firmware
 WARNING: translation string unused: no cfg upload
 WARNING: translation string unused: no eciadsl synch.bin file
@@ -536,6 +546,7 @@  WARNING: translation string unused: pdc options
 WARNING: translation string unused: phase1 group
 WARNING: translation string unused: phonebook entry
 WARNING: translation string unused: ping disabled
+WARNING: translation string unused: play
 WARNING: translation string unused: polfile
 WARNING: translation string unused: port forwarding configuration
 WARNING: translation string unused: ports
@@ -543,6 +554,7 @@  WARNING: translation string unused: pots
 WARNING: translation string unused: pppoe
 WARNING: translation string unused: prefered master
 WARNING: translation string unused: present
+WARNING: translation string unused: prev
 WARNING: translation string unused: printcap name
 WARNING: translation string unused: printer
 WARNING: translation string unused: printername
@@ -557,6 +569,7 @@  WARNING: translation string unused: proxy port
 WARNING: translation string unused: psk
 WARNING: translation string unused: qos add subclass
 WARNING: translation string unused: quick control
+WARNING: translation string unused: quick playlist
 WARNING: translation string unused: read list
 WARNING: translation string unused: reboot ask
 WARNING: translation string unused: reboot question
@@ -567,6 +580,7 @@  WARNING: translation string unused: registered user rules
 WARNING: translation string unused: released
 WARNING: translation string unused: reload
 WARNING: translation string unused: removable device advice
+WARNING: translation string unused: repeat
 WARNING: translation string unused: reportfile
 WARNING: translation string unused: reportlevel
 WARNING: translation string unused: requested data
@@ -611,6 +625,7 @@  WARNING: translation string unused: show areas
 WARNING: translation string unused: show last x lines
 WARNING: translation string unused: show lines
 WARNING: translation string unused: show share options
+WARNING: translation string unused: shuffle
 WARNING: translation string unused: shutdown ask
 WARNING: translation string unused: shutdown sure
 WARNING: translation string unused: shutdown2
@@ -674,9 +689,11 @@  WARNING: translation string unused: this months volume
 WARNING: translation string unused: this update is already installed
 WARNING: translation string unused: this weeks volume
 WARNING: translation string unused: time date manually reset
+WARNING: translation string unused: title
 WARNING: translation string unused: to email adr
 WARNING: translation string unused: to install an update
 WARNING: translation string unused: to warn email bad
+WARNING: translation string unused: toggle
 WARNING: translation string unused: too long 80 char max
 WARNING: translation string unused: traffic back
 WARNING: translation string unused: traffic calc time
@@ -749,6 +766,10 @@  WARNING: translation string unused: use dov
 WARNING: translation string unused: use ibod
 WARNING: translation string unused: view log
 WARNING: translation string unused: visible in browselist
+WARNING: translation string unused: voldown10
+WARNING: translation string unused: voldown5
+WARNING: translation string unused: volup10
+WARNING: translation string unused: volup5
 WARNING: translation string unused: vpn aggrmode
 WARNING: translation string unused: vpn configuration main
 WARNING: translation string unused: vpn delayed start
@@ -762,6 +783,7 @@  WARNING: translation string unused: vpn red name
 WARNING: translation string unused: vpn watch
 WARNING: translation string unused: warn when traffic reaches
 WARNING: translation string unused: web proxy configuration
+WARNING: translation string unused: webradio playlist
 WARNING: translation string unused: week
 WARNING: translation string unused: weekly firewallhits
 WARNING: translation string unused: wildcards
@@ -829,7 +851,6 @@  WARNING: untranslated string: MB read = MB read
 WARNING: untranslated string: MB written = MB written
 WARNING: untranslated string: MTU settings = MTU settings:
 WARNING: untranslated string: Number of Countries for the pie chart = Number of Countries for the pie chart
-WARNING: untranslated string: Scan for Songs = unknown string
 WARNING: untranslated string: access point name = Access Point Name
 WARNING: untranslated string: access point name is invalid = Access Point Name is invalid
 WARNING: untranslated string: access point name is required = Access Point Name is required
diff --git a/doc/language_issues.tr b/doc/language_issues.tr
index 93619c0a4..c0cb2703a 100644
--- a/doc/language_issues.tr
+++ b/doc/language_issues.tr
@@ -23,14 +23,18 @@  WARNING: translation string unused: Captive voucher
 WARNING: translation string unused: Captive vout
 WARNING: translation string unused: ConnSched scheduler
 WARNING: translation string unused: ConnSched select profile
+WARNING: translation string unused: Existing Files
 WARNING: translation string unused: HDD temperature
 WARNING: translation string unused: Level7 rule
 WARNING: translation string unused: Local VPN IP
+WARNING: translation string unused: Pages
 WARNING: translation string unused: Ping
 WARNING: translation string unused: Queuelenght
 WARNING: translation string unused: Remote IP
 WARNING: translation string unused: Remote VPN IP
 WARNING: translation string unused: Resolv
+WARNING: translation string unused: Scan for Files
+WARNING: translation string unused: Scan from Directory
 WARNING: translation string unused: Subclass
 WARNING: translation string unused: TOS Bits
 WARNING: translation string unused: Utilization on
@@ -107,6 +111,7 @@  WARNING: translation string unused: age seconds
 WARNING: translation string unused: age shour
 WARNING: translation string unused: age sminute
 WARNING: translation string unused: age ssecond
+WARNING: translation string unused: album
 WARNING: translation string unused: alcatelusb help
 WARNING: translation string unused: alcatelusb upload
 WARNING: translation string unused: all interfaces
@@ -120,6 +125,7 @@  WARNING: translation string unused: and
 WARNING: translation string unused: ansi t1.483
 WARNING: translation string unused: apply
 WARNING: translation string unused: archive not exist
+WARNING: translation string unused: artist
 WARNING: translation string unused: attemps
 WARNING: translation string unused: avoid dod
 WARNING: translation string unused: backup archive
@@ -172,6 +178,7 @@  WARNING: translation string unused: choose config
 WARNING: translation string unused: choose media
 WARNING: translation string unused: class in use
 WARNING: translation string unused: clear cache
+WARNING: translation string unused: clear playlist
 WARNING: translation string unused: client
 WARNING: translation string unused: comment
 WARNING: translation string unused: community rules
@@ -194,6 +201,7 @@  WARNING: translation string unused: create mask
 WARNING: translation string unused: create new backup
 WARNING: translation string unused: current media
 WARNING: translation string unused: current ovpn
+WARNING: translation string unused: current playlist
 WARNING: translation string unused: current profile
 WARNING: translation string unused: custom networks
 WARNING: translation string unused: custom services
@@ -394,6 +402,7 @@  WARNING: translation string unused: generatekeys
 WARNING: translation string unused: generatepolicy
 WARNING: translation string unused: generatereport
 WARNING: translation string unused: genkey
+WARNING: translation string unused: genre
 WARNING: translation string unused: gpl i accept these terms and conditions
 WARNING: translation string unused: gpl license agreement
 WARNING: translation string unused: gpl please read carefully the general public license and accept it below
@@ -553,6 +562,7 @@  WARNING: translation string unused: network traffic graphs
 WARNING: translation string unused: network updated
 WARNING: translation string unused: networks settings
 WARNING: translation string unused: new optionsfw must boot
+WARNING: translation string unused: next
 WARNING: translation string unused: no alcatelusb firmware
 WARNING: translation string unused: no cfg upload
 WARNING: translation string unused: no eciadsl synch.bin file
@@ -646,6 +656,7 @@  WARNING: translation string unused: pdc options
 WARNING: translation string unused: phase1 group
 WARNING: translation string unused: phonebook entry
 WARNING: translation string unused: ping disabled
+WARNING: translation string unused: play
 WARNING: translation string unused: polfile
 WARNING: translation string unused: port forwarding configuration
 WARNING: translation string unused: ports
@@ -653,6 +664,7 @@  WARNING: translation string unused: pots
 WARNING: translation string unused: pppoe
 WARNING: translation string unused: prefered master
 WARNING: translation string unused: present
+WARNING: translation string unused: prev
 WARNING: translation string unused: printcap name
 WARNING: translation string unused: printer
 WARNING: translation string unused: printername
@@ -667,6 +679,7 @@  WARNING: translation string unused: proxy port
 WARNING: translation string unused: psk
 WARNING: translation string unused: qos add subclass
 WARNING: translation string unused: quick control
+WARNING: translation string unused: quick playlist
 WARNING: translation string unused: read list
 WARNING: translation string unused: reboot ask
 WARNING: translation string unused: reboot question
@@ -677,6 +690,7 @@  WARNING: translation string unused: registered user rules
 WARNING: translation string unused: released
 WARNING: translation string unused: reload
 WARNING: translation string unused: removable device advice
+WARNING: translation string unused: repeat
 WARNING: translation string unused: reportfile
 WARNING: translation string unused: reportlevel
 WARNING: translation string unused: requested data
@@ -721,6 +735,7 @@  WARNING: translation string unused: show areas
 WARNING: translation string unused: show last x lines
 WARNING: translation string unused: show lines
 WARNING: translation string unused: show share options
+WARNING: translation string unused: shuffle
 WARNING: translation string unused: shutdown ask
 WARNING: translation string unused: shutdown sure
 WARNING: translation string unused: shutdown2
@@ -785,9 +800,11 @@  WARNING: translation string unused: this months volume
 WARNING: translation string unused: this update is already installed
 WARNING: translation string unused: this weeks volume
 WARNING: translation string unused: time date manually reset
+WARNING: translation string unused: title
 WARNING: translation string unused: to email adr
 WARNING: translation string unused: to install an update
 WARNING: translation string unused: to warn email bad
+WARNING: translation string unused: toggle
 WARNING: translation string unused: too long 80 char max
 WARNING: translation string unused: tor 0 = disabled
 WARNING: translation string unused: tor accounting period daily
@@ -872,6 +889,10 @@  WARNING: translation string unused: use dov
 WARNING: translation string unused: use ibod
 WARNING: translation string unused: view log
 WARNING: translation string unused: visible in browselist
+WARNING: translation string unused: voldown10
+WARNING: translation string unused: voldown5
+WARNING: translation string unused: volup10
+WARNING: translation string unused: volup5
 WARNING: translation string unused: vpn aggrmode
 WARNING: translation string unused: vpn configuration main
 WARNING: translation string unused: vpn delayed start
@@ -885,6 +906,7 @@  WARNING: translation string unused: vpn red name
 WARNING: translation string unused: vpn watch
 WARNING: translation string unused: warn when traffic reaches
 WARNING: translation string unused: web proxy configuration
+WARNING: translation string unused: webradio playlist
 WARNING: translation string unused: week
 WARNING: translation string unused: week-graph
 WARNING: translation string unused: weekly firewallhits
@@ -911,7 +933,6 @@  WARNING: translation string unused: year-graph
 WARNING: translation string unused: yearly firewallhits
 WARNING: untranslated string: Captive clients = unknown string
 WARNING: untranslated string: Captive delete logo = Delete Logo
-WARNING: untranslated string: Scan for Songs = unknown string
 WARNING: untranslated string: access point name = Access Point Name
 WARNING: untranslated string: access point name is invalid = Access Point Name is invalid
 WARNING: untranslated string: access point name is required = Access Point Name is required
diff --git a/html/cgi-bin/mpfire.cgi b/html/cgi-bin/mpfire.cgi
deleted file mode 100644
index 5685053e6..000000000
--- a/html/cgi-bin/mpfire.cgi
+++ /dev/null
@@ -1,673 +0,0 @@ 
-#!/usr/bin/perl
-###############################################################################
-#                                                                             #
-# IPFire.org - A linux based firewall                                         #
-# Copyright (C) 2007  Michael Tremer & Christian Schmidt                      #
-#                                                                             #
-# This program is free software: you can redistribute it and/or modify        #
-# it under the terms of the GNU General Public License as published by        #
-# the Free Software Foundation, either version 3 of the License, or           #
-# (at your option) any later version.                                         #
-#                                                                             #
-# This program is distributed in the hope that it will be useful,             #
-# but WITHOUT ANY WARRANTY; without even the implied warranty of              #
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               #
-# GNU General Public License for more details.                                #
-#                                                                             #
-# You should have received a copy of the GNU General Public License           #
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.       #
-#                                                                             #
-###############################################################################
-
-use strict;
-
-# enable only the following on debugging purpose
-#use warnings;
-#use CGI::Carp 'fatalsToBrowser';
-
-# use the special mpd POD and the encode POD to handle the utf8 scalars
-use Audio::MPD;
-use Encode;
-
-# initiate the connector for the mpd POD, mpd must be running on locahost
-# port 6600 without authentication
-my $mpd = Audio::MPD->new('localhost',6600,'','$REUSE');
-my $work = $mpd->status()->updating_db();
-
-require '/var/ipfire/general-functions.pl';
-require "${General::swroot}/lang.pl";
-require "${General::swroot}/header.pl";
-
-my %color = ();
-my %mainsettings = ();
-my %mpfiresettings = ();
-my %checked = ();
-my $message = '0';
-my $errormessage = "";
-my @songs;
-
-&General::readhash("${General::swroot}/main/settings", \%mainsettings);
-&General::readhash("/srv/web/ipfire/html/themes/ipfire/include/colors.txt", \%color);
-
-&Header::showhttpheaders();
-
-if ( $ENV{'QUERY_STRING'} =~ /title/){
-
-################################################################################
-# $ENV{'QUERY_STRING'} =~ /title/ is used to handle the inline iframe used to
-# display the current song playing ( artist - title - album aso )
-# the cgi call´s itself with a parameter and the iframe refreshes itself without
-# reloading the whole page
-################################################################################
-
-	my $number = $mpd->status()->song()+1;
-	my $volume = $mpd->status()->volume();
-	my $random = $mpd->status()->random();
-
-	if ($random eq "0" ){
-		$random="off";
-	}else{
-		$random="on";
-	}
-
-	my $repeat = $mpd->status()->repeat();
-	if ($repeat eq "0" ){
-		$repeat="off";
-	}else{
-		$repeat="on";
-	}
-
-	my $song = "";
-	if ( $mpd->current() )
-	{
-		$song = substr("-= ".$mpd->current()->Artist()." | ".$mpd->current()->Title(),0,85)." =-<br /> ";
-		if ( $song eq "-=  |  =-<br /> " ){
-			$song = "None<br />"
-		};
-		$song .= $mpd->current()->Track()."# ".substr($mpd->current()->Album(),0,90)."<br />";
-	}else{
-		$song = "None<br /><br />";
-	}
-
-	if ( $song eq "None<br /># <br />" ){
-		$song = "None<br />".substr($mpd->current()->file(),0,90)."<br />"
-	};
-	$song .= "Playlist: ".$number."-".$mpd->status()->playlistlength()." Time: ".$mpd->status()->time()->sofar."/";
-	$song .= $mpd->status()->time()->total." (".$mpd->status()->time()->percent()."%) Status: ";
-	$song .= $mpd->status()->state()." Volume: ".$volume." % Repeat: ".$repeat." Random: ".$random;
-
-	print <<END
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<meta http-equiv='refresh' content='5'>
-<title></title>
-<body>
-<table width='100%' cellspacing='0' align='center' style="background-image:url(/images/mpfire/box.png);background-repeat:no-repeat">
-END
-;
-	print"<tr ><td align='center'><font color='red' face='Verdana' size='2'><br />".encode('utf-8', $song)."<br /><br /></font></td></tr></table></body>";
-	exit;
-}elsif ( $ENV{'QUERY_STRING'} =~ /control/){
-
-################################################################################
-# $ENV{'QUERY_STRING'} =~ /control/ is used to handle the inline iframe used to
-# display the control button ( prev play skip stop toggle aso )
-# the cgi call´s itself with a parameter and only the iframe is reloaded on click
-################################################################################
-
-	&Header::getcgihash(\%mpfiresettings);
-	if ( $mpfiresettings{'ACTION'} eq "playall" ){
-		$mpd->playlist->clear();
-		foreach ($mpd->collection->all_pathes){
-			$mpd->playlist->add($_);
-		}
-		$mpd->play();
-	}elsif ($mpfiresettings{'ACTION'} eq "x" ){
-		$mpd->stop();
-	}elsif ( $mpfiresettings{'ACTION'} eq "|>" ){
-		$mpd->pause();
-	}elsif ( $mpfiresettings{'ACTION'} eq "<<" ){
-		$mpd->prev();
-	}elsif ( $mpfiresettings{'ACTION'} eq ">>" ){
-		$mpd->next();
-	}elsif ( $mpfiresettings{'ACTION'} eq "+" ){
-		$mpd->volume('+5');
-	}elsif ( $mpfiresettings{'ACTION'} eq "-" ){
-		$mpd->volume('-5');
-	}elsif ( $mpfiresettings{'ACTION'} eq "++" ){
-		$mpd->volume('+10');
-	}elsif ( $mpfiresettings{'ACTION'} eq "--" ){
-		$mpd->volume('-10');
-	}elsif ( $mpfiresettings{'ACTION'} eq ">" ){
-		$mpd->play();
-	}elsif ( $mpfiresettings{'ACTION'} eq "repeat" ){
-		$mpd->repeat();
-	}elsif ( $mpfiresettings{'ACTION'} eq "shuffle" ){
-		$mpd->random();
-	}
-	print <<END
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<title></title>
-<body>
-<table width='95%' cellspacing='0'>
-<tr>
-<td align='center'><form method='post' action='$ENV{'SCRIPT_NAME'}?control'><input type='hidden' name='ACTION' value='<<' /><input type='image' alt='$Lang::tr{'prev'}' title='$Lang::tr{'prev'}' src='/images/media-skip-backward.png' /></form></td>
-<td align='center'><form method='post' action='$ENV{'SCRIPT_NAME'}?control'><input type='hidden' name='ACTION' value='x' /><input type='image' alt='$Lang::tr{'stop'}' title='$Lang::tr{'stop'}' src='/images/media-playback-stop.png' /></form></td>
-<td align='center'><form method='post' action='$ENV{'SCRIPT_NAME'}?control'><input type='hidden' name='ACTION' value='|>' /><input type='image' alt='$Lang::tr{'toggle'}' title='$Lang::tr{'toggle'}' src='/images/media-resume.png' /></form></td>
-<td align='center'><form method='post' action='$ENV{'SCRIPT_NAME'}?control'><input type='hidden' name='ACTION' value='>' /><input type='image' alt='$Lang::tr{'play'}' title='$Lang::tr{'play'}' src='/images/media-playback-start.png' /></form></td>
-<td align='center'><form method='post' action='$ENV{'SCRIPT_NAME'}?control'><input type='hidden' name='ACTION' value='playall' /><input type='image' alt='$Lang::tr{'play'} all' title='$Lang::tr{'play'} all' src='/images/media-playback-start-all.png' /></form></td>
-<td align='center'><form method='post' action='$ENV{'SCRIPT_NAME'}?control'><input type='hidden' name='ACTION' value='>>' /><input type='image' alt='$Lang::tr{'next'}' title='$Lang::tr{'next'}' src='/images/media-skip-forward.png' /></form></td>
-</tr>
-END
-;
-	print <<END
-<tr>
-<td align='center'><form method='post' action='$ENV{'SCRIPT_NAME'}?control'><input type='hidden' name='ACTION' value='repeat' /><input type='image' alt='$Lang::tr{'repeat'}' title='$Lang::tr{'repeat'}' src='/images/media-repeat.png' /></form></td>
-<td align='center'><form method='post' action='$ENV{'SCRIPT_NAME'}?control'><input type='hidden' name='ACTION' value='--' /><input type='image' alt='$Lang::tr{'voldown10'}' title='$Lang::tr{'voldown10'}' src='/images/audio-volume-low-red.png' /></form></td>
-<td align='center'><form method='post' action='$ENV{'SCRIPT_NAME'}?control'><input type='hidden' name='ACTION' value='-' /><input type='image' alt='$Lang::tr{'voldown5'}' title='$Lang::tr{'voldown5'}' src='/images/audio-volume-low.png' /></form></td>
-<td align='center'><form method='post' action='$ENV{'SCRIPT_NAME'}?control'><input type='hidden' name='ACTION' value='+' /><input type='image' alt='$Lang::tr{'volup5'}' title='$Lang::tr{'volup5'}' src='/images/audio-volume-high.png' /></form></td>
-<td align='center'><form method='post' action='$ENV{'SCRIPT_NAME'}?control'><input type='hidden' name='ACTION' value='++' /><input type='image' alt='$Lang::tr{'volup10'}' title='$Lang::tr{'volup10'}' src='/images/audio-volume-high-red.png' /></form></td>
-<td align='center'><form method='post' action='$ENV{'SCRIPT_NAME'}?control'><input type='hidden' name='ACTION' value='shuffle' /><input type='image' alt='$Lang::tr{'shuffle'}' title='$Lang::tr{'shuffle'}' src='/images/media-shuffle.png' /></form></td>
-</tr>
-</table>
-</body>
-END
-;
-	exit;
-}
-
-# just a little subpage to handle automatic page refresh on demand ( 1 sec )
-sub refreshpage{
-	&Header::openbox( 'Waiting', 1, "<meta http-equiv='refresh' content='1;' />" );
-	print "<center><img src='/images/clock.gif' alt='' /><br/><font color='red'>$Lang::tr{'pagerefresh'}</font></center>";
-	&Header::closebox();
-}
-
-# if the mpd is updating his database because of user interaction then the cgi
-# should display that the mpd is unavailable, and refresh the status every 5 seconds
-if ($work ne ""){
-	&Header::openpage($Lang::tr{'mpfire'}, 1,);
-	&Header::openbigbox('100%', 'left', '', $errormessage);
-	&Header::openbox( 'Waiting', 5, "<meta http-equiv='refresh' content='5;' />" );
-	print "<center><img src='/images/clock.gif' alt='' /><br/><font color='red'>Database is updating, please be patient.</font></center>";
-	&Header::closebox();
-	&Header::closebigbox();
-	&Header::closepage();
-	exit;
-}
-
-if ( $mpfiresettings{'PAGE'} eq "" ){ $mpfiresettings{'PAGE'} = "1";};
-if ( $mpfiresettings{'FRAME'} eq "" ){$mpfiresettings{'FRAME'} = "webradio";};
-
-&Header::getcgihash(\%mpfiresettings);
-&Header::openpage($Lang::tr{'mpfire'}, 1,);
-&Header::openbigbox('100%', 'left', '', $errormessage);
-
-############################################################################################################################
-######################################## Scanne Verzeichnisse nach Mp3 Dateien #############################################
-
-if ( $mpfiresettings{'ACTION'} eq "scan" ){
-
-# on keypress scan the given directory and store the path to the mpd config
-	&General::readhash("${General::swroot}/mpfire/settings", \%mpfiresettings);
-	&Header::getcgihash(\%mpfiresettings);
-	delete $mpfiresettings{'__CGI__'};delete $mpfiresettings{'x'};delete $mpfiresettings{'y'};
-	delete $mpfiresettings{'PAGE'}; delete $mpfiresettings{'FRAME'};
-	&General::writehash("${General::swroot}/mpfire/settings", \%mpfiresettings);
-
-	open(DATEI, "<${General::swroot}/mpd/mpd.conf") || die "Datei nicht gefunden";
-	my @Zeilen = <DATEI>;
-	close(DATEI);
-
-	open(DATEI, ">${General::swroot}/mpd/mpd.conf") || die "Datei nicht gefunden";
-	foreach (@Zeilen){
-		if ( $_ =~ /music_directory/){
-			print DATEI "music_directory \"".$mpfiresettings{'MUSICDIR'}."\"\n";
-		}else {
-			print DATEI $_;
-		}
-	}
-	close(DATEI);
-
-	$mpd->updatedb();
-	refreshpage();
-}elsif ( $mpfiresettings{'ACTION'} eq "playweb" ){
-	$message= &General::system_output("/usr/local/bin/mpfirectrl","playweb","\"$mpfiresettings{'FILE'}\"");
-}elsif ( $mpfiresettings{'ACTION'} eq "playlist" ){
-	$mpd->play();
-}elsif ( $mpfiresettings{'ACTION'} eq "emptyplaylist" ){
-# on keypress clear the playlist
-	$mpd->playlist->clear();
-}elsif ( $mpfiresettings{'ACTION'} eq "addtoplaylist" ){
-	$mpd->playlist->add($mpfiresettings{'FILE'});
-}elsif ( $mpfiresettings{'ACTION'} eq "playalbum" ){
-# on keypress play the selected albums
-	my @select = split(/\|/,$mpfiresettings{'album'});
-	$mpd->playlist->clear();
-	foreach (@select){
-		foreach ($mpd->collection->filenames_by_album($_)){
-			if ( $_ ne "" ){
-				$mpd->playlist->add($_);
-			}
-		}
-	}
-	$mpd->play();
-}elsif ( $mpfiresettings{'ACTION'} eq "playartist" ){
-# on keypress play the selected artist
-	my @select = split(/\|/,$mpfiresettings{'artist'});
-	$mpd->playlist->clear();
-	foreach (@select){
-		foreach ($mpd->collection->filenames_by_artist($_)){
-			if ( $_ ne "" ){
-				$mpd->playlist->add($_);
-			}
-		}
-	}
-	$mpd->play();
-}elsif ( $mpfiresettings{'ACTION'} eq "playyear" ){
-# on keypress play the selected year
-	my @select = split(/\|/,$mpfiresettings{'year'});
-	$mpd->playlist->clear();
-	foreach (@select){
-		foreach ($mpd->collection->filenames_by_year($_)){
-			if ( $_ ne "" ){
-				$mpd->playlist->add($_);
-			}
-		}
-	}
-	$mpd->play();
-}elsif ( $mpfiresettings{'ACTION'} eq "playgenre" ){
-# on keypress play the selected genre
-	my @select = split(/\|/,$mpfiresettings{'genre'});
-	$mpd->playlist->clear();
-	foreach (@select){
-		foreach ($mpd->collection->filenames_by_genre($_)){
-			if ( $_ ne "" ){
-				$mpd->playlist->add($_);
-			}
-		}
-	}
-	$mpd->play();
-}elsif ( $mpfiresettings{'ACTION'} eq ">" ){
-		$mpd->playlist->clear();
-		$mpd->playlist->add($mpfiresettings{'FILE'});
-		$mpd->play();
-}
-
-	if ( $mpfiresettings{'SEARCH'} eq "artist" && $mpfiresettings{'SEARCHITEM'} ne "" ){
-		foreach ($mpd->collection->songs_with_artist_partial_filename($mpfiresettings{'SEARCHITEM'})){
-			if ( $_ ne "" ){
-				push(@songs,$_);
-			}
-		}
-	}elsif ( $mpfiresettings{'SEARCH'} eq "title" && $mpfiresettings{'SEARCHITEM'} ne "" ){
-		foreach ($mpd->collection->songs_with_title_partial_filename($mpfiresettings{'SEARCHITEM'})){
-			if ( $_ ne "" ){
-				push(@songs,$_);
-			}
-		}
-	}elsif ( $mpfiresettings{'SEARCH'} eq "album" && $mpfiresettings{'SEARCHITEM'} ne "" ){
-		foreach ($mpd->collection->songs_with_album_partial_filename($mpfiresettings{'SEARCHITEM'})){
-			if ( $_ ne "" ){
-				push(@songs,$_);
-			}
-		}
-	}else{
-	@songs = $mpd->collection->all_items_simple();
-	shift(@songs);
-	}
-
-############################################################################################################################
-################################### Aufbau der HTML Seite fr globale Sambaeinstellungen ####################################
-
-$mpfiresettings{'MUSICDIR'} = "/var/mp3";
-&General::readhash("${General::swroot}/mpfire/settings", \%mpfiresettings);
-
-############################################################################################################################
-########################################### rekursiv nach neuen Mp3s Scannen ##############################################ä
-
-if ( $message ne '0' ){
-	print "<font color='red'>An Error occured while launching the command</font>";
-}elsif ( $message ne "" && $message ne '0' ){
-	print "<font color='red'>$message</font>";
-}
-
-&Header::openbox('100%', 'center', $Lang::tr{'mpfire scanning'});
-# box to enter the music directory and initiate the scan process
-print <<END
-<form method='post' action='$ENV{'SCRIPT_NAME'}'>
-<table width='95%' cellspacing='0'>
-<tr bgcolor='$color{'color20'}'><td colspan='2' align='left'><b>$Lang::tr{'Scan for Files'}</b></td></tr>
-<tr><td align='left' width='40%'>$Lang::tr{'Scan from Directory'}</td><td align='left'><input type='text' name='MUSICDIR' value='$mpfiresettings{'MUSICDIR'}' size="50" /></td></tr>
-<tr><td align='center' colspan='2'><input type='hidden' name='ACTION' value='scan' /><input type='image' alt='$Lang::tr{'Scan for Files'}' title='$Lang::tr{'Scan for Files'}' src='/images/edit-find.png' /></td></tr>
-</table>
-</form>
-END
-;
-&Header::closebox();
-
-&Header::openbox('100%', 'center', $Lang::tr{'mpfire controls'});
-# box for the two iframes showing the current playbar and the control buttons
-print <<END
-<iframe height='85' width='685' src='/cgi-bin/mpfire.cgi?title' scrolling='no' frameborder='no' marginheight='0'></iframe>
-<iframe height='50' width='685' src='/cgi-bin/mpfire.cgi?control' scrolling='no' frameborder='no' marginheight='0'></iframe>
-END
-;
-print "<b>Songs:".$mpd->stats()->songs()."</b><br />";
-
-&Header::closebox();
-
-&Header::openbox('100%', 'center', '');
-print <<END
-<tr><td align='center' colspan='4'>
-<form method='post' action='$ENV{'SCRIPT_NAME'}'>
-END
-;
-my @buttons=("webradio", "quick playlist","songs");
-foreach (@buttons){
-	if ( $mpfiresettings{'FRAME'} eq $_ ) {
-		print "<input type='submit' name='FRAME' value='$_' disabled />";
-	} else {
-		print "<input type='submit' name='FRAME' value='$_' />";
-	}
-}
-
-print <<END
-</form></td></tr>
-END
-;
-&Header::closebox();
-
-if ( $mpfiresettings{'FRAME'} eq "quick playlist" )
-{
-&Header::openbox('100%', 'center', $Lang::tr{'quick playlist'});
-# box to quickly select artist, album, year or genre and play the selection
-print "<table width='95%' cellspacing='0'>";
-print "<tr><td align='center' bgcolor='$color{'color20'}'><b>$Lang::tr{'artist'} - ".$mpd->stats()->artists()."</b></td><td align='center' bgcolor='$color{'color20'}'><b>$Lang::tr{'album'} - ".$mpd->stats()->albums()."</b></td></tr>";
-
-print <<END
-<tr><td align='center'>
-<form method='post' action='$ENV{'SCRIPT_NAME'}'>
-<select name='artist' size='8' multiple='multiple' style='width:300px;'>
-END
-;
-
-foreach (sort($mpd->collection->all_artists())){
-	if ( $_ ne '' ){
-		print "<option>".encode('utf-8', $_)."</option>\n";
-	}
-}
-
-print <<END
-</select><br/>
-<input type='hidden' name='ACTION' value='playartist' />
-<input type='image' alt='$Lang::tr{'play'}' title='$Lang::tr{'play'}' src='/images/media-playback-start.png' />
-<input type='hidden' name='FRAME' value='$mpfiresettings{'FRAME'}' />
-</form></td>
-<td align='center'>
-<form method='post' action='$ENV{'SCRIPT_NAME'}'>
-<select name='album' size='8' multiple='multiple' style='width:300px;'>
-END
-;
-
-foreach (sort($mpd->collection->all_albums())){
-	if ( $_ ne '' ){
-		print "<option>".encode('utf-8', $_)."</option>\n";
-	}
-}
-
-print <<END
-</select><br/>
-<input type='hidden' name='ACTION' value='playalbum' />
-<input type='image' alt='$Lang::tr{'play'}' title='$Lang::tr{'play'}' src='/images/media-playback-start.png' />
-<input type='hidden' name='FRAME' value='$mpfiresettings{'FRAME'}' />
-</form></td>
-</tr>
-<tr><td align='center' bgcolor='$color{'color20'}'><b>$Lang::tr{'year'}</b></td><td align='center' bgcolor='$color{'color20'}'><b>$Lang::tr{'genre'}</b></td></tr>
-<tr><td align='center'>
-<form method='post' action='$ENV{'SCRIPT_NAME'}'>
-<select name='year' size='8' multiple='multiple' style='width:300px;'>
-END
-;
-
-foreach (sort($mpd->collection->all_years())){
-	if ( $_ ne '' ){
-		print "<option>$_</option>\n";
-	}
-}
-
-print <<END
-</select><br/>
-<input type='hidden' name='ACTION' value='playyear' />
-<input type='image' alt='$Lang::tr{'play'}' title='$Lang::tr{'play'}' src='/images/media-playback-start.png' />
-<input type='hidden' name='FRAME' value='$mpfiresettings{'FRAME'}' />
-</form></td>
-<td align='center'>
-<form method='post' action='$ENV{'SCRIPT_NAME'}'>
-<select name='genre' size='8' multiple='multiple' style='width:300px;'>
-END
-;
-
-foreach (sort($mpd->collection->all_genre())){
-	if ( $_ ne '' ){
-		print "<option>$_</option>\n";
-	}
-}
-
-print <<END
-</select><br/>
-<input type='hidden' name='ACTION' value='playgenre' />
-<input type='image' alt='$Lang::tr{'play'}' title='$Lang::tr{'play'}' src='/images/media-playback-start.png' />
-<input type='hidden' name='FRAME' value='$mpfiresettings{'FRAME'}' />
-</form></td>
-</tr></table>
-END
-;
-
-&Header::closebox();
-}
-
-if ( $mpfiresettings{'FRAME'} eq "songs" )
-{
-&Header::openbox('100%', 'center', $Lang::tr{'mpfire search'});
-# box to quickly search artist, album or title
-print <<END
-<form method='post' action='$ENV{'SCRIPT_NAME'}#$Lang::tr{'mpfire songs'}'>
-<table width='95%' cellspacing='0'>
-<tr>
-<td align='right' width='33%'>$Lang::tr{'artist'}</td>
-<td align='center' width='33%'>$Lang::tr{'title'}</td>
-<td align='left' width='33%'>$Lang::tr{'album'}</td>
-</tr>
-<tr>
-<td align='right' width='33%'><input type='radio' name='SEARCH' value='artist' /></td>
-<td align='center' width='33%'><input type='radio' name='SEARCH' value='title' checked='checked' /></td>
-<td align='left' width='33%'><input type='radio' name='SEARCH' value='album' /></td>
-</tr>
-<tr>
-<td align='center' colspan='3'><input type='text' name='SEARCHITEM' value='$mpfiresettings{'SEARCHITEM'}' size="50" /></td>
-</tr>
-<tr>
-<td align='center' colspan='3'><input type='hidden' name='ACTION' value='search' /><input type='image' alt='$Lang::tr{'Scan for Songs'}' title='$Lang::tr{'Scan for Songs'}' src='/images/edit-find.png' /></td>
-</tr>
-</table>
-<input type='hidden' name='FRAME' value='$mpfiresettings{'FRAME'}' />
-</form>
-END
-;
-&Header::closebox();
-
-&Header::openbox('100%', 'center', $Lang::tr{'mpfire songs'});
-print <<END
-<a id='$Lang::tr{'mpfire songs'}' name='$Lang::tr{'mpfire songs'}'></a>
-<table width='95%' cellspacing='3'>
-<tr bgcolor='$color{'color20'}'><td colspan='4' align='left'><b>$Lang::tr{'Existing Files'}</b></td></tr>
-END
-;
-if ( $#songs > 100 ){
-	print "<tr><td align='center' colspan='4'><br/>$Lang::tr{'Pages'}<br/><form method='post' action='$ENV{'SCRIPT_NAME'}'><input type='submit' name='PAGE' value='all' /><br/>";
-	my $pages =(int($#songs/100)+1);
-	for(my $i = 1; $i <= $pages; $i++){
-		print "<input type='submit' name='PAGE' value='$i' />";
-		if (!($i % 205)){
-			print"<br/>";
-		}
-	}
-	print "<input type='hidden' name='FRAME' value='$mpfiresettings{'FRAME'}' />";
-	print "</form></td></tr>";
-}
-print <<END
-<tr><td align='center'></td>
-<td align='center'><b>$Lang::tr{'artist'}<br/>$Lang::tr{'title'}</b></td>
-<td align='center'><b>$Lang::tr{'number'}</b></td>
-<td align='center'><b>$Lang::tr{'album'}</b></td>
-END
-;
-
-my $lines=0;my $i=0;my $begin;my $end;
-if ( $mpfiresettings{'PAGE'} eq 'all' ){
-	$begin=0;
-	$end=$#songs;
-}else{
-	$begin=(($mpfiresettings{'PAGE'}-1) * 100);
-	$end=(($mpfiresettings{'PAGE'} * 100)-1);
-}
-	foreach (@songs){
-	if (!($i >= $begin && $i <= $end)){
-		#print $begin."->".$i."<-".$end."\n";
-		$i++;next;
-	}
-	my @song = split(/\=/,$mpd->collection->song($_));
-	@song = reverse @song;
-
-	if ($lines % 2) {
-		print "<tr bgcolor='$color{'color20'}'>";
-	}else{
-		print "<tr bgcolor='$color{'color22'}'>";
-	}
-	print <<END
-<td align='center' style="white-space:nowrap;">
-<form method='post' action='$ENV{'SCRIPT_NAME'}#$Lang::tr{'mpfire songs'}'>
-<input type='hidden' name='ACTION' value='addtoplaylist' />
-<input type='hidden' name='FILE' value="$_" />
-<input type='hidden' name='PAGE' value='$mpfiresettings{'PAGE'}' />
-<input type='hidden' name='FRAME' value='$mpfiresettings{'FRAME'}' />
-<input type='hidden' name='SEARCH' value='$mpfiresettings{'SEARCH'}' />
-<input type='hidden' name='SEARCHITEM' value='$mpfiresettings{'SEARCHITEM'}' />
-<input type='image' alt='$Lang::tr{'add'}' title='$Lang::tr{'add'}' src='/images/list-add.png' />
-</form>
-<form method='post' action='$ENV{'SCRIPT_NAME'}#$Lang::tr{'mpfire songs'}'>
-<input type='hidden' name='ACTION' value='>' />
-<input type='hidden' name='FILE' value="$_" />
-<input type='hidden' name='PAGE' value='$mpfiresettings{'PAGE'}' />
-<input type='hidden' name='FRAME' value='$mpfiresettings{'FRAME'}' />
-<input type='hidden' name='SEARCH' value='$mpfiresettings{'SEARCH'}' />
-<input type='hidden' name='SEARCHITEM' value='$mpfiresettings{'SEARCHITEM'}' />
-<input type='image' alt='$Lang::tr{'play'}' title='$Lang::tr{'play'}' src='/images/media-playback-start.png' />
-</form>
-</td>
-END
-;
-	print "<td align='center'>".encode('utf-8', $song[0])."<br/>".encode('utf-8', $song[1])."</td>";
-	print "<td align='center'>".encode('utf-8', $song[2])."</td>";
-	print "<td align='center'>".encode('utf-8', $song[3])."</td>";
-	$lines++;
-	$i++;
-}
-
-print "</table>";
-&Header::closebox();
-}
-
-if ( $mpfiresettings{'FRAME'} eq "webradio" )
-{
-&Header::openbox('100%', 'center', $Lang::tr{'mpfire webradio'});
-# box to select some webradio´s to be played by one click
-open(DATEI, "<${General::swroot}/mpfire/webradio") || die "Could not open playlist";
-my @webradio = <DATEI>;
-close(DATEI);
-
-print <<END
-<table width='95%' cellspacing='0'>
-<tr bgcolor='$color{'color20'}'><td colspan='9' align='left'><b>$Lang::tr{'webradio playlist'}</b></td></tr>
-<tr><td align='left'>Stream</td><td colspan='2'></td></tr>
-END
-;
-
-my $lines=0;
-foreach (@webradio){
-	my @stream = split(/\|/,$_);
-	$lines++;
-	chomp($stream[2]);
-	if ($lines % 2) {
-		print "<tr bgcolor='$color{'color22'}'>";
-	}else{
-		print "<tr>";
-	}
-	chomp $stream[1];chomp $stream[2];
-	print <<END
-<td align='left'><a href='$stream[2]' target='_blank'>$stream[1]</a></td>
-<td align='center'><form method='post' action='$ENV{'SCRIPT_NAME'}'><input type='hidden' name='FILE' value='$stream[0]' /><input type='hidden' name='ACTION' value='playweb' /><input type='image' alt='$Lang::tr{'play'}' title='$Lang::tr{'play'}' src='/images/media-playback-start.png' align='middle' />
-<input type='hidden' name='FRAME' value='$mpfiresettings{'FRAME'}' />
-</form></td>
-</tr>
-END
-;
-}
-
-$lines++;
-if ($lines % 2){
-	print "<tr bgcolor='$color{'color22'}'>";
-}else{
-	print "<tr>";
-}
-
-print <<END
-<td align='center' colspan='2'><form method='post' action='$ENV{'SCRIPT_NAME'}'><br />http://<input type=text name='FILE' value='www.meineradiourl:1234' size='75' />
-<input type='hidden' name='ACTION' value='playweb' /><input type='image' alt='$Lang::tr{'play'}' title='$Lang::tr{'play'}' src='/images/media-playback-start.png' align='top' />
-<input type='hidden' name='FRAME' value='$mpfiresettings{'FRAME'}' />
-</form></td>
-</tr>
-END
-;
-print "</table>";
-&Header::closebox();
-}
-
-&Header::openbox('100%', 'center', $Lang::tr{'mpfire playlist'});
-# box to show the current playlist given from mpc system command
-my @playlist = `mpc playlist 2>/dev/null`;
-
-print <<END
-<table width='95%' cellspacing='0'>
-<tr bgcolor='$color{'color20'}'><td colspan='2' align='left'><b>$Lang::tr{'current playlist'}</b></td></tr>
-<tr><td align='center' colspan='2' ><textarea cols='100' rows='10' name='playlist' style='font-size:11px;width:650px;' readonly='readonly'>
-END
-;
-
-foreach (@playlist){
-	$_=~s/&/&amp\;/g;;print $_;
-}
-
-print <<END
-</textarea></td></tr><tr>
-<td align='right'>
-<form method='post' action='$ENV{'SCRIPT_NAME'}'>
-<input type='hidden' name='ACTION' value='emptyplaylist' />
-<input type='image' alt='$Lang::tr{'clear playlist'}' title='$Lang::tr{'clear playlist'}' src='/images/user-trash.png' />
-<input type='hidden' name='FRAME' value='$mpfiresettings{'FRAME'}' />
-</form>
-</td>
-<td align='left'>
-<form method='post' action='$ENV{'SCRIPT_NAME'}'>
-<input type='hidden' name='ACTION' value='playlist' />
-<input type='image' alt='$Lang::tr{'play'}' title='$Lang::tr{'play'}' src='/images/media-playback-start.png' />
-<input type='hidden' name='FRAME' value='$mpfiresettings{'FRAME'}' />
-</form>
-</td></tr>
-</table>
-END
-;
-
-&Header::closebox();
-&Header::closebigbox();
-&Header::closepage();
diff --git a/html/html/images/mpfire/box.png b/html/html/images/mpfire/box.png
deleted file mode 100644
index fdf97b343aaa09eaf7fcdd114c3adbe88d28273b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4562
zcmYLN2|QGL8$R>RHKKzol{J$RLiQ{vBfBuNTuGt0hKL(u%p_S_tl1^X;1&~Eb1D0{
z+4lwwMKtzhXht`L={tkI@Ao@1&Wv-;|9#%~eV+IEPqej_2@kg@Hvj-UW~PQV0Pr6o
zbZ)Z`0lja(8w`a0zyfSc&I2XA;`7jl-!S@?`T$U#uz%|s2lN@~W@=*z0Jl#7K-hf%
z_yK(tHU|KK$^fw73IIA!0O0VS&uT8}LjU0U)6_8l0C?ZAU$8d6m+sJ)!dRnASX)02
zY|u6TKLG1%UcT5<Rz`M6oZ2Z>)i+6pLjZvPu$iI09p0IqwP|bjuUOkAE5uSy>%*X3
z<}{BHbZHBd^dt8KDgU*cSnXkgCW_zCu%+uYS$lM93C5wZ(pJ<kux8TOx7jYxHvPK&
z)Y39RWmTQ$h%4coQf~usHbDC)VQZZca3>L_ibAvlB1pJ<7?>Ddhe6TI65+yOuwO^`
z9W~|W*i(+Lr?L;q|GstA(Q(7GEnb3eoG_aexze!dn=@SLeORB@6+rAA$b7JUf6(&i
zMp<FuLPDCn1FIf8PYLx9q{_7fY%r%oS4Jvkt=!xuJ)N9BnVOhHhR##+?4*)R197<9
z9q!3UPGtbTcN}m-baUCJE4f%*t;4_f^YfGRx^Y8v?2X@eF_X#EBMJ6{jH2RV9#K(I
z<J#KV`rO>y@T8=q&+p$~4D#{muD-in6ENAzBjus}mav*{@PB0C9bh}x^uw8`<w|er
z?U3=66*^twhOckKch=_0c((buV>B;1B_}U$dSPN>BFuetZ9H_PA!HLr%{mj59JKP8
zUKg}-WEVCP0gg6?Hm2+ZKBDY;R~EgbidlLbb(=^HWo>PI8LJH%559a(ra54!&^~mC
zN=-1=p~v1{icJx)+zgM#>f*m5_5U9mOjy<u5rH)A)}SarorX&JaFA}6XR}>gTzqV3
zXoydyYxX{Vd8~HrcLxV*Vx@W3t@&pMdOMgMKYz;8Zgq2LW>V_jE0@H{gJb|CqfQAY
zig`W0V%g1Nv6^aXYQ*~Ves2AwFhyc!U;oj?@)nCOxmxX?H$Jmi+eRAV?=u_wtYv<p
zF`zCMY|Un1s`m4DJc#;wme!WEEb+#7Y~i&=c1YFd)f<kEBQE@mqL(l6?zPlNdW5qR
zb>t6PMwu5bLfoPYu!%@zFVBu(UR60eLjQ{A_pODYSIZ+6n8=$o+X+#4-|>d+T*d!b
zj_~5Bp#6TsB&!#KJ6(kQ2S~nHliW0{T2<|V5*xU=ksrJ~s@<5Mf8rz&2YCMZ<sXi|
z?m@Fy8KzlVdWq)FGCPZP+ncv^7ty>TLm$$-Z0TmTm-ZWQ`6p_?N1wb^Y1)kk0AGmo
z+XdH5W~dC6n7E!(BqpOH#NFQkM%+fCdyh&z1YebtYL4*euQ-IRuv6rgZr4Y^N1|k@
z)@5W=oiIwv{DPJ+x>fBkXsTOTZR)M7rbC?9AXZhICKy{tWtr~AggOmcyEngTcdZjy
z@ewhNCDCuB<E_M{B#D#JcqSsHM+~HrxqgL@I?XINYoMcOMsu{cPm?1`NJtQMh`6vj
z6b1W$)!($A9EOiRd#k+%1EmW+5EC36oR41~tyW9K^YZaU(!37K?DJPXjF7dH9fSzk
z3?%cTJ6uOa)<`1#6idSNTfA`}<Cy~SyN_kFAS3@Po9W?>B00l3!_euI!imAz!S+-<
zQ9Gb@yy~VCw(u&=3w?^Yl$6msJba0wprN05&qw6R1x%{<{EK&c1!kxw-Yh@LP%p){
zwWw80$}ueRY@%c+mhWL~B3Gz}X$h5TDdXbC&MW7LV52ckPEU1+1F^GnbDk81zz<KY
zs>YN{o(FLMqCEg_=_6mcZ%^~$v0VE$KfwA>?DX80URhZgF7b7KBr@d?x<f{vm)Qhp
zX44uslpn?&-N_-@0`#2Eud|_5|Izi>v(1*~HLLJ|=9Qpno|$)IpMRnff_b#!4m#$z
zu&fUvQRp}ag7z+Kx$TB~rb7+Ht_)hWTU$K2sy5ibz##tYXIZbuF?gx*T`ki7BaD_)
z77K5UWOPWw1<<RV87-@wY4U<JxsBuP`VGSE4w`8z7f46;bns9%tS1L8&^IUANB{JO
zvubQC1^;m%Hrb=#Mv}l3QU;v5;JncwWUOp`1w_JQmEdtOx3UA^+-C(wssm9cu(PzN
zD6WKI5j#6E;VMhS-Lkq5Cm4Oc2I(x42wDpXIb0;;Rh%JyT+oyzDk>_nW_q4Jr)_-y
z<j0BYO_pK&Z98MY*oh2fNRyL_J2T14&Tn21>aw#&?+)fknn>0SbnGmdjFKgK6hz4|
zd3H*WsD?NYPdUWfn$F1T4ij}?nys3@sjhaE=(Aw_9q_o0#k$*OmBH5nNnUIVszImt
zj!Vt@o@AFPgK@E>0Opig<6nPC=?ppB+6oS9U&zIOlv_3PPLLwD?^1&tp%Mlv#DR$z
zX59hs<t^#G_W1}w#<;k+K#<F4X1M&zUV;k0x20uYcq6%&Sz;DU`-MmUbeg55WrjrG
z!omW(WcBs+@mZ>+ku_a*&`q+S^*8HpO{hB}6Fsbv@ud!lYIz|9me1jstuukv%oRG2
zZ~49e7fqt;aJLNbZh~wq`+I;E-j*X^b2=>M(fT2=xRCir^~=*csZxs}E!O1XGxPoj
z0QDJSO_X1G({TFo@T*(W+3KZW3p8yWy^qJ(+uIK_uuJdu9{ix4d_L&f1_8@rmk&Bz
zm%$e;tLuzO)<YgK)s}%?$DJrFE(Z%S3>$VY;*NlQ{x-|XNB6dmTvyF$O=}+bn{v~~
zClzlTRO$DrO0kT-?2JaEe<jK~5fr*E^O)KU!uAA3_Zo_~Km@x(`ZGiU^rz+Jz@VTr
zxXwCav79ZWXiX|8eM9|yd$fDd6DDr+$U+ePCO5Z9Nl7UoW)|X|0b^-l!GEa?eb&h~
z-+XUMg>zuSS~(v{3d`O_94CJ0$1W}|k`AFi1q#KGB)*HpK;+zY1BdRxL?zYly5_8l
z^n*2oyv<L3jT?*9(!M3Uxo%3waauIi7P~hmATc4=2}76F`Crj}{xr7AXGCBaw`Q$N
zFY9~Zcq0PI+0seAj`dv6z#{hYIN^d&zjvxs7q@iDqpjlgYt^!=Ce9cP$qf^-kh{zk
zAue<b-g2_5&X@bF@DoXR-Irq_%GO%o+}(WR{5s~``{%5hz{S68=}>M0r=$hAB&G`@
zYaju&jsu0BE39V9F<o8nf=K#m3XW;Q^6v>-_PXKTDG#Zf&QJqkb%u<SAVBT}=d)P*
zE2V1IasJ)j`7iH<kE({f?L&`tNN#j-vIWC@tv%@&)Ubc!oolci<;5$vtMV<<kenQS
z0EYmF6xf^qYd-siW_7Lua}G+w?aR7dot;o{2M-<$r|U2epxvKFz}fA?oyG3YgJN+6
z#-nPF{vP?UcaeOXwlPpMGfz3!%?)Q<fF6A)SYRsWrLgQb%?r+w=Q($ZeBkhIzOZwN
zjX3&8NSiF5p5_qf+kg0!*2hiX$C=1>eHB$ylVQ_7IO96<lpk%2xX)WfC1<ltG-D=h
z8JZrXkJ7}d#rDOyxj!M)M{cD;x0I_|$Nd9=?!Om~!Gv8u=G=mqyed9fY@AQX3;sHx
zAKH_tagj0l_LiG#ZG7G8Y~Puxf3GHJB^N*udWy*Y?llu=`?ZN&p%V61ul8-q8UJ)X
z1cgSJAj6_D*us!^4|&2BS>JlI&dd(;9>4mOy`mb5VaQ+y33!E`_LA|NQj`Qe5m$M7
zwl~){UpbV<<8-Bor#bbG5^*ZD=sUZUN=O1OB*r*-T6pCj3BR74SGn5H@x-&iAK0~M
zz6do~-an}FAYa0E_qpAk6cU4H>T8x_L%08R2!+fWL~R0r;2Nt}|NT3zt*T*>-{ekW
zcycGIz*N1FljA7p-iIo$zqooksmtaXYE4c<bvi9DFpxb3(9t9|hG*K7!ykgO)UzQF
z1uE7yCwi0&5bfk55fr5&9qVsY;@=U*(vl`JJ8v=KaJtk|7s(j*ymWIK52VyJgdsVl
zJ5U8&8jXBLQebyCx#(dhhkF<}r4Fx=@j{F>4{T4TyKF(O+xQG|@k8-`9|mL=Keqh%
zPlR~tak!AZP@3`qJw##vx4Q5pEd(}U2&@s!gbZQD&ks(1Mr@UE+M3Tg7xEFxiH=vp
z@dxmX{3kmm0k4WG=Wo1zPsOE9g&Oj^+8nbp`|b~~+YFzZHv@eZgJp@oX-A2{_nGNF
zxPJ>Xx-+QWfbEil?T{}B-C~&h?9m+WUc!H*p;rbAY~yc+P>;nQKu?M7C}Pf(2ujOe
zUVJL$P7ExXw9{>TdRs^aGy@gn<slp-Dup5tLvk#<`~q5t1Ac39iMgrzbjM;SC;CA;
zG?SK#FS%4Mb&}{!Ey+57J`-Rj)AP#6Jn`PJGAh?7mkZ8tLyr5^-3gsKRRW1Xp>clm
z>gGyg_GR6h)FkTY=+aJUN)O3F^5yyr#;wAAk?qB0wP+51D$i_428=1OD+6tNdP654
zY5wJ{OD%E~94<MwGS!j724uF%PBfW(93k5(YkUpq3|jl7dXzW4oe8}XSUSj7z%#}8
zkI)Ux(Sqz7!m}ZfB9jFXc2WFO0Kz;4mZ_kg;fmCQnz_E9pko^v=iAd==_Y50-@zX8
z%tU=_t8p6+IZy8U4GMCC3%*awNSG}h+>a;<>cZ3qVh%kyP6h+pGf(}tAQxoRGEh~`
z`JK<%z~G+Se*M4+ng6k&`SC9q@ogLJ{c3SU@9yZx8^7$IKNd?(f-0T%tFJ?6^^hg1
zJ}p@a*AryhWHNaW?C0??{<Yo9$Dq{apaIaMv`uvmRy;{ms{clLem3~~dL*ADu2`{<
zzQVN$<)oPiJ9y2O<Gj^H1XKl}1Eqe=6^Ed#8Gm|Dv@=-kQfllL>T64o)LVORB6+oP
zwsI{a3+G5xI|`XA7-)U};(eR@ZI58wz3T@L3ME&ItbQAhUl#e$zNCYlvtA)(-_>~y
z?J`aLEsfSCjc(qg^L!#;TWW}Bt2$l|;H0FF=XexBU2}FXU9sVBJ5Dz$ad?yn_t#Ul
z$}1Wg8b0+#N#a-P*IFqhBK+v5zM<=1A|>O8%gsYf;>G8ydNCwLZp#-Ob^=g8y;VaU
zH9q>wuiC01P0FlDFDkr$vbO78?l6oxiSYzKbH<>IL#cDf+GK*>cY1YZ2q&-joc8T+
zp6Mawhazz&2e~vvq#<w?O<}Czeg2R&>k8Ajt}bQ@4cRBns2@ZblT@`rg4YGj;Km;d
zuW~apGoPm9sZkgfKksGC)A`P=yW&?q*WVN9uc^_Y77eNJ2l5`#6@J(=A_%n-@jCf&
zf!1%@yIXmPn9TEpzqH*-&lY%+KLq9%78a_$2w;bpuHYzO=iuP-hOo0!C7s)t66|Y;
zUK_z=6S6~D+H5XxBbMCvCH&f%-*Q9wdd5F_{b=D`Esic)x%%bUz~X>arQR5?<%PLe
zr3T?)(f$cYhfYA~c6NY8!uaVlhaGBkgLM!XK4<)w2hlP@meZ*NI9*chlRiCd7$k0c
tCKCDqKsgAJC~GLNBMy6}Nndzf@1S@!4r}5)2K|fzm>F3amYjEu_%C!FS*!p6

diff --git a/langs/de/cgi-bin/de.pl b/langs/de/cgi-bin/de.pl
--- a/langs/de/cgi-bin/de.pl
+++ b/langs/de/cgi-bin/de.pl
@@ -1793,13 +1793,6 @@ 
 'most preferred' => 'präferiert',
 'mount' => 'Einbinden',
 'mounted on' => 'Mounted auf',
-'mpfire' => 'Media Player für IPFire',
-'mpfire controls' => 'MPFire Steuerung',
-'mpfire playlist' => 'MPFire Playlist',
-'mpfire scanning' => 'Nach neuen Dateien suchen',
-'mpfire search' => 'MPFire Suche',
-'mpfire songs' => 'MPFire Songliste',
-'mpfire webradio' => 'MPFire Webradio',
 'mtu' => 'MTU',
 'mtu QoS' => 'Diese Einstellung ändert die MTU nicht global sondern nur für das QoS.',
 'my new share' => 'Meine neue Freigabe',
diff --git a/langs/en/cgi-bin/en.pl b/langs/en/cgi-bin/en.pl
index b9f015935..5c8da52be 100644
--- a/langs/en/cgi-bin/en.pl
+++ b/langs/en/cgi-bin/en.pl
@@ -1853,13 +1853,6 @@ 
 'most preferred' => 'most preferred',
 'mount' => 'Mount',
 'mounted on' => 'Mounted on',
-'mpfire' => 'Media Player for IPFire',
-'mpfire controls' => 'MPFire Control',
-'mpfire playlist' => 'MPFire Playlist',
-'mpfire scanning' => 'Scan for new files',
-'mpfire search' => 'MPFire Search',
-'mpfire songs' => 'MPFire songlist',
-'mpfire webradio' => 'MPFire Webradio',
 'mtu' => 'MTU',
 'mtu QoS' => 'This does not change the global MTU, it only sets MTU for QoS.',
 'my new share' => 'My new share',
diff --git a/langs/es/cgi-bin/es.pl b/langs/es/cgi-bin/es.pl
index 1e1a0d986..27b0e739e 100644
--- a/langs/es/cgi-bin/es.pl
+++ b/langs/es/cgi-bin/es.pl
@@ -1848,13 +1848,6 @@ 
 'most preferred' => 'Más preferido',
 'mount' => 'Montar',
 'mounted on' => 'Montado en',
-'mpfire' => 'Media Player para IPFire',
-'mpfire controls' => 'Control de MPFire',
-'mpfire playlist' => 'Lista de reproducción de MPFire',
-'mpfire scanning' => 'Analiza en busca de nuevos archivos',
-'mpfire search' => 'Búsqueda MPFire',
-'mpfire songs' => 'Lista de canciones de MPFire',
-'mpfire webradio' => 'Webradio de MPFire',
 'mtu' => 'MTU',
 'mtu QoS' => 'Esto no cambia el MTU global, solo establece MTU para QoS',
 'my new share' => 'Mi nuevo recurso compartido',
diff --git a/langs/fr/cgi-bin/fr.pl b/langs/fr/cgi-bin/fr.pl
index 65a0c95fc..21f7b645f 100644
--- a/langs/fr/cgi-bin/fr.pl
+++ b/langs/fr/cgi-bin/fr.pl
@@ -1849,13 +1849,6 @@ 
 'most preferred' => 'le préféré',
 'mount' => 'Monter',
 'mounted on' => 'Monté en tant que',
-'mpfire' => 'Lecteur de médias pour IPFire',
-'mpfire controls' => 'Contrôle MPFire',
-'mpfire playlist' => 'Liste de lecture MPFire',
-'mpfire scanning' => 'Chercher de nouveaux fichiers',
-'mpfire search' => 'Recherche MPFire',
-'mpfire songs' => 'Liste des chansons MPFire',
-'mpfire webradio' => 'Radio web MPFire',
 'mtu' => 'MTU',
 'mtu QoS' => 'Ceci ne change pas le MTU global, cela règle uniquement le MTU pour la QoS.',
 'my new share' => 'Mon nouveau partage',
diff --git a/langs/it/cgi-bin/it.pl b/langs/it/cgi-bin/it.pl
index 6e3508803..4654813cc 100644
--- a/langs/it/cgi-bin/it.pl
+++ b/langs/it/cgi-bin/it.pl
@@ -1516,13 +1516,6 @@ 
 'most preferred' => 'most preferred',
 'mount' => 'Mount',
 'mounted on' => 'Montato su',
-'mpfire' => 'Media Player for IPFire',
-'mpfire controls' => 'MPFire Control',
-'mpfire playlist' => 'MPFire Playlist',
-'mpfire scanning' => 'Scan for new files',
-'mpfire search' => 'MPFire Search',
-'mpfire songs' => 'MPFire songlist',
-'mpfire webradio' => 'MPFire Webradio',
 'mtu QoS' => 'This does not change the global MTU, it only sets MTU for QoS.',
 'my new share' => 'My new share',
 'name' => 'Nome',
diff --git a/langs/nl/cgi-bin/nl.pl b/langs/nl/cgi-bin/nl.pl
index a397680ce..beb1b6e36 100644
--- a/langs/nl/cgi-bin/nl.pl
+++ b/langs/nl/cgi-bin/nl.pl
@@ -1497,13 +1497,6 @@ 
 'most preferred' => 'Meeste voorkeur',
 'mount' => 'Koppelen',
 'mounted on' => 'Gekoppeld op',
-'mpfire' => 'Mediaspeler voor IPFire',
-'mpfire controls' => 'MPFire Controle',
-'mpfire playlist' => 'MPFire afspeellijst',
-'mpfire scanning' => 'Zoeken naar nieuwe bestanden',
-'mpfire search' => 'MPFire Zoeken',
-'mpfire songs' => 'MPFire lijst met nummers',
-'mpfire webradio' => 'MPFire Webradio',
 'mtu QoS' => 'Dit verandert niet de globale MTU, het zet alleen de MTU voor QoS.',
 'my new share' => 'Mijn nieuwe share',
 'name' => 'Naam',
diff --git a/langs/pl/cgi-bin/pl.pl b/langs/pl/cgi-bin/pl.pl
index 86364a0a2..4be749041 100644
--- a/langs/pl/cgi-bin/pl.pl
+++ b/langs/pl/cgi-bin/pl.pl
@@ -1193,13 +1193,6 @@ 
 'more' => 'więcej',
 'mount' => 'Montuj',
 'mounted on' => 'Zamontowany w',
-'mpfire' => 'Odtwarzać mediów dla IPFire',
-'mpfire controls' => 'Zarządzanie MPFire',
-'mpfire playlist' => 'Playlist\'a MPFire ',
-'mpfire scanning' => 'Skanuj w poszukiwaniu nowych plików',
-'mpfire search' => 'MPFire Szukaj',
-'mpfire songs' => 'MPFire lista utworów',
-'mpfire webradio' => 'MPFire Webradio',
 'mtu QoS' => 'Ta opcja nie zmienia globalnego MTU, a jedynie MTU dla QoS.',
 'my new share' => 'Mój nowy zasób',
 'name' => 'Nazwa',
diff --git a/langs/ru/cgi-bin/ru.pl b/langs/ru/cgi-bin/ru.pl
index 32f0f2425..32f6f993d 100644
--- a/langs/ru/cgi-bin/ru.pl
+++ b/langs/ru/cgi-bin/ru.pl
@@ -1185,13 +1185,6 @@ 
 'more' => 'Больше',
 'mount' => 'Монтировать',
 'mounted on' => 'Смонтирован на',
-'mpfire' => 'Media Player for IPFire',
-'mpfire controls' => 'MPFire Control',
-'mpfire playlist' => 'MPFire Playlist',
-'mpfire scanning' => 'Искать новые файлы',
-'mpfire search' => 'MPFire Search',
-'mpfire songs' => 'MPFire songlist',
-'mpfire webradio' => 'MPFire Webradio',
 'mtu QoS' => 'Это нре изменит глобальные настройки MTU, а только задаёт MTU для QoS.',
 'my new share' => 'Моя новая шара',
 'name' => 'Имя',
diff --git a/langs/tr/cgi-bin/tr.pl b/langs/tr/cgi-bin/tr.pl
index d279309af..f3a37182a 100644
--- a/langs/tr/cgi-bin/tr.pl
+++ b/langs/tr/cgi-bin/tr.pl
@@ -1652,13 +1652,6 @@ 
 'most preferred' => 'En çok tercih edilen',
 'mount' => 'Bağla',
 'mounted on' => 'Bağlı',
-'mpfire' => 'IPFire için Media Player',
-'mpfire controls' => 'MPFire Kontrol',
-'mpfire playlist' => 'MPFire Çalma Listesi',
-'mpfire scanning' => 'Yeni dosyalar için tara',
-'mpfire search' => 'MPFire Ara',
-'mpfire songs' => 'MPFire şarkı listesi',
-'mpfire webradio' => 'MPFire Webradyo',
 'mtu QoS' => 'Bu genel MTU değiştirilemez. Sadece QoS için MTU ayarı yapılır.',
 'my new share' => 'Yeni paylaşımlarım',
 'name' => 'Ad',
diff --git a/lfs/mpfire b/lfs/mpfire
deleted file mode 100644
index 54551a0b6..000000000
--- a/lfs/mpfire
+++ /dev/null
@@ -1,75 +0,0 @@ 
-###############################################################################
-#                                                                             #
-# IPFire.org - A linux based firewall                                         #
-# Copyright (C) 2007-2024  IPFire Team  <info@ipfire.org>                     #
-#                                                                             #
-# This program is free software: you can redistribute it and/or modify        #
-# it under the terms of the GNU General Public License as published by        #
-# the Free Software Foundation, either version 3 of the License, or           #
-# (at your option) any later version.                                         #
-#                                                                             #
-# This program is distributed in the hope that it will be useful,             #
-# but WITHOUT ANY WARRANTY; without even the implied warranty of              #
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               #
-# GNU General Public License for more details.                                #
-#                                                                             #
-# You should have received a copy of the GNU General Public License           #
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.       #
-#                                                                             #
-###############################################################################
-
-###############################################################################
-# Definitions
-###############################################################################
-
-include Config
-
-SUMMARY    = IPFire integration for the Music Player Daemon
-
-VER        = ipfire
-
-THISAPP    = mpfire-$(VER)
-DIR_APP    = $(DIR_SRC)/$(THISAPP)
-TARGET     = $(DIR_INFO)/$(THISAPP)
-PROG       = mpfire
-PAK_VER    = 17
-
-DEPS       = mpd mpc
-
-SERVICES   =
-
-###############################################################################
-# Top-level Rules
-###############################################################################
-
-objects =
-
-install : $(TARGET)
-
-check :
-
-download :
-
-b2 :
-
-dist:
-	@$(PAK)
-
-###############################################################################
-# Installation Details
-###############################################################################
-
-$(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
-	@$(PREBUILD)
-	-mkdir -p /var/ipfire/mpfire/bin
-	touch /var/ipfire/mpfire/settings
-	install -v -m 755 $(DIR_SRC)/config/mpfire/mpfire.pl /var/ipfire/mpfire/bin
-	install -v -m 644 $(DIR_SRC)/config/mpfire/webradio /var/ipfire/mpfire/
-	chown nobody.nobody /var/ipfire/mpfire/{settings,webradio}
-	chmod 755 /srv/web/ipfire/html/images/mpfire
-	install -v -m 644 $(DIR_SRC)/config/backup/includes/mpfire /var/ipfire/backup/addons/includes/mpfire
-	-mkdir -p /usr/lib/perl5/site_perl/5.36.0/Audio/
-	cp -vrf $(DIR_SRC)/config/mpfire/perl/Audio/MPD* /usr/lib/perl5/site_perl/5.36.0/Audio/
-	cp -vrf $(DIR_SRC)/config/mpfire/perl/Accessor* /usr/lib/perl5/5.36.0/Class/
-	cp -vrf $(DIR_SRC)/config/mpfire/perl/Readonly.pm /usr/lib/perl5/5.36.0/Readonly.pm
-	@$(POSTBUILD)
diff --git a/make.sh b/make.sh
index 8e980f392..992a6d450 100755
--- a/make.sh
+++ b/make.sh
@@ -1819,7 +1819,6 @@  build_system() {
 	lfsmake2 perl-NetAddr-IP
 	lfsmake2 dma
 	lfsmake2 alsa
-	lfsmake2 mpfire
 	lfsmake2 guardian
 	lfsmake2 libid3tag
 	lfsmake2 libmad
diff --git a/src/misc-progs/Makefile b/src/misc-progs/Makefile
index 7c3ef7529..1ae12b294 100644
--- a/src/misc-progs/Makefile
+++ b/src/misc-progs/Makefile
@@ -29,7 +29,7 @@  SUID_PROGS = squidctrl sshctrl ipfirereboot \
 	logwatch wioscan wiohelper openvpnctrl firewallctrl \
 	wirelessctrl getipstat qosctrl \
 	redctrl syslogdctrl extrahdctrl sambactrl \
-	smartctrl clamavctrl addonctrl pakfire mpfirectrl wlanapctrl \
+	smartctrl clamavctrl addonctrl pakfire wlanapctrl \
 	setaliases urlfilterctrl updxlratorctrl fireinfoctrl rebuildroutes \
 	getconntracktable wirelessclient torctrl ddnsctrl unboundctrl \
 	captivectrl
diff --git a/src/misc-progs/mpfirectrl.c b/src/misc-progs/mpfirectrl.c
deleted file mode 100644
index 4ea1fb543..000000000
--- a/src/misc-progs/mpfirectrl.c
+++ /dev/null
@@ -1,15 +0,0 @@ 
-/* This file is part of the IPFire Firewall.
- *
- * This program is distributed under the terms of the GNU General Public
- * Licence.  See the file COPYING for details.
- *
- */
-
-#include "setuid.h"
-
-int main(int argc, char** argv) {
-	if (!initsetuid())
-		exit(1);
-
-	return run("/var/ipfire/mpfire/bin/mpfire.pl", argv + 1);
-}
diff --git a/src/paks/mpfire/install.sh b/src/paks/mpfire/install.sh
deleted file mode 100644
index 541a25ca2..000000000
--- a/src/paks/mpfire/install.sh
+++ /dev/null
@@ -1,27 +0,0 @@ 
-#!/bin/bash
-############################################################################
-#                                                                          #
-# This file is part of the IPFire Firewall.                                #
-#                                                                          #
-# IPFire is free software; you can redistribute it and/or modify           #
-# it under the terms of the GNU General Public License as published by     #
-# the Free Software Foundation; either version 2 of the License, or        #
-# (at your option) any later version.                                      #
-#                                                                          #
-# IPFire is distributed in the hope that it will be useful,                #
-# but WITHOUT ANY WARRANTY; without even the implied warranty of           #
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            #
-# GNU General Public License for more details.                             #
-#                                                                          #
-# You should have received a copy of the GNU General Public License        #
-# along with IPFire; if not, write to the Free Software                    #
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA #
-#                                                                          #
-# Copyright (C) 2007-2024 IPFire-Team <info@ipfire.org>.                   #
-#                                                                          #
-############################################################################
-#
-. /opt/pakfire/lib/functions.sh
-extract_files
-chmod 755 /srv/web/ipfire/html/images/mpfire
-restore_backup ${NAME}
diff --git a/src/paks/mpfire/uninstall.sh b/src/paks/mpfire/uninstall.sh
deleted file mode 100644
index ed7e6a821..000000000
--- a/src/paks/mpfire/uninstall.sh
+++ /dev/null
@@ -1,26 +0,0 @@ 
-#!/bin/bash
-############################################################################
-#                                                                          #
-# This file is part of the IPFire Firewall.                                #
-#                                                                          #
-# IPFire is free software; you can redistribute it and/or modify           #
-# it under the terms of the GNU General Public License as published by     #
-# the Free Software Foundation; either version 2 of the License, or        #
-# (at your option) any later version.                                      #
-#                                                                          #
-# IPFire is distributed in the hope that it will be useful,                #
-# but WITHOUT ANY WARRANTY; without even the implied warranty of           #
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            #
-# GNU General Public License for more details.                             #
-#                                                                          #
-# You should have received a copy of the GNU General Public License        #
-# along with IPFire; if not, write to the Free Software                    #
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA #
-#                                                                          #
-# Copyright (C) 2007-2024 IPFire-Team <info@ipfire.org>.                   #
-#                                                                          #
-############################################################################
-#
-. /opt/pakfire/lib/functions.sh
-make_backup ${NAME}
-remove_files
diff --git a/src/paks/mpfire/update.sh b/src/paks/mpfire/update.sh
deleted file mode 100644
index 31d1d77cc..000000000
--- a/src/paks/mpfire/update.sh
+++ /dev/null
@@ -1,27 +0,0 @@ 
-#!/bin/bash
-############################################################################
-#                                                                          #
-# This file is part of the IPFire Firewall.                                #
-#                                                                          #
-# IPFire is free software; you can redistribute it and/or modify           #
-# it under the terms of the GNU General Public License as published by     #
-# the Free Software Foundation; either version 2 of the License, or        #
-# (at your option) any later version.                                      #
-#                                                                          #
-# IPFire is distributed in the hope that it will be useful,                #
-# but WITHOUT ANY WARRANTY; without even the implied warranty of           #
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            #
-# GNU General Public License for more details.                             #
-#                                                                          #
-# You should have received a copy of the GNU General Public License        #
-# along with IPFire; if not, write to the Free Software                    #
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA #
-#                                                                          #
-# Copyright (C) 2007-2024 IPFire-Team <info@ipfire.org>.                   #
-#                                                                          #
-############################################################################
-#
-. /opt/pakfire/lib/functions.sh
-extract_backup_includes
-./uninstall.sh
-./install.sh