package Rhythmbox::Playlist; use strict; use warnings; use XML::Simple; use URI::Escape qw(uri_unescape); sub new { my $class = shift; my %params = @_; my $self = \%params; bless $self, $class; $self->read_file(); return $self; } sub read_file { my $self = shift; # Get XML data: my $xml = new XML::Simple; my $data = $xml->XMLin($self->{file}); $self->{playlists} = $data->{playlist}; } sub lists { my $self = shift; my ($pattern) = @_; my @names = keys %{ $self->{playlists} }; return sort grep { m/$pattern/ } @names; } sub songs_decoded { my $self = shift; my @songs = $self->songs(@_); foreach my $song (@songs) { $song =~ s{ (?:file|smb|ssh|sftp) :// (.*) }{$1}x; $song = uri_unescape($song); } return @songs; } sub songs { my $self = shift; my ($pattern) = @_; my @names = grep { m/$pattern/ } keys %{ $self->{playlists} }; my @songs; foreach my $name (@names) { my $locations = $self->{playlists}->{$name}{'location'}; next unless defined $locations; push @songs, (ref($locations) ? @{ $locations } : $locations); } @songs = sort grep { m/$self->{song_pattern}/ } @songs; return @songs; } 1;