File Coverage

blib/lib/Data/iRealPro/Playlist.pm
Criterion Covered Total %
statement 46 68 67.6
branch 14 28 50.0
condition 5 10 50.0
subroutine 9 11 81.8
pod 0 7 0.0
total 74 124 59.6


line stmt bran cond sub pod time code
1             #! perl
2              
3 19     19   1194 use strict;
  19         41  
  19         510  
4 19     19   95 use warnings;
  19         39  
  19         420  
5 19     19   96 use Carp;
  19         34  
  19         1120  
6              
7             package Data::iRealPro::Playlist;
8              
9 19     19   7676 use Data::iRealPro::Song;
  19         59  
  19         12352  
10              
11             sub new {
12 18     18 0 152 my ( $pkg, %args ) = @_;
13 18         131 my $self = bless { %args }, $pkg;
14 18   100     166 $self->{transpose} //= 0;
15 18 100       123 $self->parse( $args{data} ) if $args{data};
16 18 50       115 $self->{songs} = [ $args{song} ] if $args{song};
17 18 100       136 $self->{songs} = $args{songs} if $args{songs};
18 18 50       86 delete $self->{data} unless $self->{debug};
19 18         89 return $self;
20             }
21              
22             sub parse {
23 11     11 0 41 my ( $self, $data ) = @_;
24              
25 11 50 33     219 if ( $data =~ s;^irealb(ook)?://;; && !$self->{variant} ) {
26 0 0       0 $self->{variant} = $1 ? "irealbook" : "irealpro";
27             }
28              
29             # Split the playlist into songs.
30 11         113 my @a = split( '===', $data, -1 );
31              
32 11 100       101 if ( @a > 1 ) { # song===song===song===ThePlaylist
    50          
33 2         7 $self->{name} = pop(@a);
34             }
35             elsif ( $self->{variant} eq "irealbook" ) {
36 0         0 my @b = split( '=', $data, -1 );
37 0         0 @a = ();
38 0         0 while ( @b >= 6 ) {
39 0         0 push( @a, join( "=", splice( @b, 0, 6 ) ) );
40             }
41 0         0 $self->{name} = pop(@b);
42 0 0       0 if ( @b ) {
43 0         0 Carp::croak( "Incorrect ", $self->{variant}, " format 2 " . scalar(@b) );
44             }
45             }
46              
47             # Process the song(s).
48 11         41 foreach ( @a ) {
49 13         29 eval {
50 13         144 push( @{ $self->{songs} },
51             Data::iRealPro::Song->new( variant => $self->{variant},
52             data => $_,
53             debug => $self->{debug},
54             transpose => $self->{transpose},
55 13         28 ) );
56             };
57 13 50       65 warn("$@: $_\n") if $@;
58             }
59 11         41 return $self;
60             }
61              
62             sub songs {
63 1     1 0 3 my ( $self, $song ) = @_;
64 1         5 $self->{songs};
65             }
66              
67             sub add_song {
68 0     0 0 0 my ( $self, $song ) = @_;
69 0         0 push( @{ $self->{songs} }, $song );
  0         0  
70             }
71              
72             sub add_songs {
73 1     1 0 3 my ( $self, $songs ) = @_;
74 1         2 push( @{ $self->{songs} }, @$songs );
  1         16  
75             }
76              
77             sub export {
78 0     0 0 0 my ( $self, %args ) = @_;
79 0         0 carp(__PACKAGE__."::export is deprecated, please use 'as_string' instead");
80              
81 0   0     0 my $v = $args{variant} || $self->{variant} || "irealpro";
82 0 0       0 my $dashes = $v eq "irealbook" ? "=" : "===";
83              
84             my $r = join( $dashes,
85 0         0 map { $_->export( %args ) } @{ $self->{songs} } );
  0         0  
  0         0  
86              
87 0 0       0 $r .= $dashes . $self->{name} if defined $self->{name};
88              
89 0         0 return $r;
90             }
91              
92             sub as_string {
93 8     8 0 40 my ( $self ) = @_;
94              
95 8         26 my $dashes = "===";
96              
97             my $r = join( $dashes,
98 8         18 map { $_->as_string } @{ $self->{songs} } );
  10         42  
  8         30  
99              
100 8         35 my $name = $self->{name};
101 8 50 66     42 if ( !$name && @{ $self->{songs} } > 1 ) {
  6         27  
102 0         0 carp("Playlist without name in as_string");
103 0         0 $name = "NoName";
104             }
105 8 100       38 $r .= $dashes . $name if $name;
106              
107 8         30 return $r;
108             }
109              
110             1;