3 # $Id: engine-di.fm,v 1.7 2008/05/08 09:08:23 lace Exp $
10 require HTTP::Request;
11 require LWP::UserAgent;
12 require HTTP::Cookies;
15 my $PASSWORD=&_priv_postget("di.fm.pwd");
17 delete $ENV{"http_proxy"};
23 my $full=$ENV{"HOME"}."/priv/postget.".$base;
25 open F,$full or die "$full: $!";
26 my $r=do { local $/; <F>; } or die "read \"$full\": $!";
27 close F or die "close \"$full\": $!";
36 my $ua=LWP::UserAgent->new() or die "UA: $!";
37 my $jar=HTTP::Cookies->new() or die "jar: $!";
38 $ua->cookie_jar($jar);
39 push @{$ua->requests_redirectable()},"POST";
40 my $req=HTTP::Request->new(
42 q{http://}.$site.q{/pro/login.php},
45 "Content-Type"=>"application/x-www-form-urlencoded",
48 q{amember_login=}.$USERNAME,
49 q{amember_pass=}.$PASSWORD,
50 q{refer_back_url=http://}.$site.q{/},
51 q{login_attempt_id=}.(0+time()),
55 my $resp=$ua->request($req) or die "resp(0): $!";
56 die "!success(0)" if !$resp->is_success();
57 die "!content(0)" if !(my $content=$resp->content());
58 $content=~m{You will be redirected to protected area} or die $content;
59 $req=HTTP::Request->new(
63 $resp=$ua->request($req) or die "resp(1): $!";
64 die "!success(1)" if !$resp->is_success();
65 die "!content(1)" if !($content=$resp->content());
69 if ("build" eq ($ARGV[0]||"")) {
74 next if !/^(?:\Qdi.fm\E|\Qsky.fm\E)-/;
78 @symlink or die "No existing symlinks found";
79 my $TARGET="engine-di.fm";
80 -x $TARGET or die "Target $TARGET not found";
87 while ($page=~m{"(?:http://listen.$site)?([^":]*(?<!_low)[.](?:pls|asx)(?:[?]\w+)?)"}g) {
89 next if m{^/aacplus/};
90 next if m{/(?:32|56|64|128)k[.]};
95 @newdashed or die $page."\nNo URLs found";
97 unlink or die "unlink \"$_\": $!";
103 symlink $TARGET,$dest or die "symlink \"$dest\": $!";
107 for my $site (qw(di.fm)) { # FIXME: sky.fm
108 my $freepageurl="http://$site/";
109 my $freepage=LWP::Simple::get($freepageurl) or die $freepageurl;
110 sitedump $site,$freepage;
111 my $paidpage=paidget $freepageurl,$site;
112 sitedump $site,$paidpage;
119 $pathslashed=~s{^.*/}{};
120 $pathslashed=~tr{-}{/};
121 $pathslashed=~tr{%}{?};
122 my $streamlisturl="http://$pathslashed";
125 sub streamlist_get($)
130 while ($streamlist=~m{^File\d*\s*=\s*"?(\S+?)"?\s*$}gm) {
133 while ($streamlist=~m{<ref\s+href\s*=\s*"(mms://[\S^"]+?)"\s*/>}g) {
136 push @streamlist,$url;
141 my $streamlist=LWP::Simple::get($streamlisturl) or die $streamlisturl;
142 my @streamlist=streamlist_get $streamlist;
144 $streamlist=~m{Digitally Imported :: Login} or die "No streams found (free): $streamlisturl";
145 $streamlist=paidget $streamlisturl,"di.fm"; # FIXME: sky.fm
146 @streamlist=streamlist_get $streamlist;
147 @streamlist or die "No streams found (paid): $streamlisturl: $streamlist";
149 warn Dumper(\@streamlist);
150 for my $stream (@streamlist) {
151 if (my($host,$port)=($stream=~m{^http://(?:[^@]+@)?([^:/@]+)(?::(\d+))?})) {
152 # blacklisted: too slow
153 next if $host eq "81.92.172.3";
156 warn "Connecting {$host}:{$port}...\n";
157 my $tcp=IO::Socket::INET->new(
163 close $tcp or die "Close TCP: $!";
165 my $mplayer="mplayer";
167 push @list,qw(-volume 40);
168 push @list,"-cache",30*192/8,"-cache-min",45;
172 #system $mplayer @list;
173 do { die "[$&] <$_>" if m{[^-a-zA-Z 0-9/:.@=_?]}; } for @list;
174 system {"bash"} "bash","-c",join(" ",@list);