our
$VERSION
= 0.04;
sub
new {
my
(
$class
,
%args
) =
@_
;
die
'USAGE: VK::MP3->new(login => ..., password => ...)'
unless
_valid_new_args(\
%args
);
my
$self
= {
ua
=> _create_ua(),
login
=>
$args
{login},
password
=>
$args
{password},
};
bless
$self
,
$class
;
die
'ERROR: login failed'
unless
(
$self
->_login());
return
$self
;
}
sub
search {
my
(
$self
,
$query
) =
@_
;
die
'LWP: '
.
$res
->status_line
unless
$res
->is_success;
my
@matches
=
$res
->decoded_content =~ m
'<input type="hidden" id="audio_info(.*?)</tbody></table>'
sgi;
my
@rslt
;
push
@rslt
,
$self
->_parse_found_item(
$_
)
for
(
@matches
);
@rslt
=
grep
{
defined
$_
}
@rslt
;
return
\
@rslt
;
}
sub
_parse_found_item {
my
(
$self
,
$str
) =
@_
;
my
(
$name
) =
$str
=~ m{<div class=
"title_wrap fl_l"
.*?>(.*?)</div>}si;
return
undef
unless
$name
;
$name
=~ s/<[^>]+>//g;
$name
=~ s/ ?\([^\(]*$//;
$name
= decode_entities(
$name
);
my
(
$duration
) =
$str
=~ m{<div class=
"duration fl_r"
.*?>(\d+:\d+)</div>}i;
my
(
$link
) =
$str
=~ m{value=
"(http://[^"
,]+\.mp3)}i;
if
(
$duration
) {
my
(
$min
,
$sec
) =
split
/:/,
$duration
, 2;
$duration
=
$min
* 60 +
$sec
;
}
else
{
$duration
= 0;
}
return
{
name
=>
$name
,
duration
=>
$duration
,
link
=>
$link
};
}
sub
_login {
my
$self
=
shift
;
email
=>
$self
->{login},
pass
=>
$self
->{password},
});
return
0
unless
$res
->is_success;
return
$res
->decoded_content =~ m
}
sub
_create_ua {
my
$ua
= LWP::UserAgent->new();
push
@{
$ua
->requests_redirectable },
'POST'
;
$ua
->ssl_opts(
verify_hostname
=> 0);
$ua
->cookie_jar( {} );
return
$ua
;
}
sub
_valid_new_args {
my
$args
=
shift
;
return
0
unless
ref
(
$args
) eq
'HASH'
;
for
(
qw/login password/
) {
return
0
unless
defined
(
$args
->{
$_
}) && (
ref
(
$args
->{
$_
}) eq
''
);
}
return
1;
}
1;