use Text::CSV;
my %BROWSERID = qw(
- IE trident
- Firefox gecko
- Safari webkit_saf
+ IE ie
+ Firefox firefox
+ Safari safari
Safari-iPad ios_saf
- Chrome webkit_chr
- Opera presto
+ Chrome chrome
+ Opera opera
+
+ Android android
+ iPhone ios_saf
+ iPod-Touch ios_saf
);
my %count = (
- -source => 'StatCounter',
+ -title => 'StatCounter',
-site => 'http://gs.statcounter.com/',
);
-my $input = \*STDIN;
if (@ARGV) {
my %param = (
bar => 1,
- statType_hidden => 'browser_version',
- region_hidden => 'ww', # NL
+ region_hidden => 'ww', # Worldwide
granularity => 'monthly',
- statType => 'Browser%20Version',
- region => 'Worldwide', # Netherlands
fromMonthYear => $ARGV[0],
toMonthYear => $ARGV[1] // $ARGV[0],
csv => 1,
);
- my $url = $count{-site};
- $url .= 'chart.php?'.join('&', map "$_=$param{$_}", keys %param);
- $count{-url} = $url;
+ my $site = $count{-site};
+ $site .= 'chart.php?'.join('&', map "$_=$param{$_}", keys %param);
+ $site .= '&statType_hidden=';
+ $count{-source} = $site;
+
require LWP::Simple;
- my $download = LWP::Simple::get($url) or die "No data from $url\n";
- undef $input;
- open $input, '<', \$download or die $!;
+ {
+ my $url = $site.'browser_version';
+ my $download = LWP::Simple::get($url) or die "No data from $url\n";
+ open my $input, '<', \$download or die $!;
+ parsecsv($input);
+ }
+
+ {
+ my $url = $site.'mobile_vs_desktop';
+ my $download = LWP::Simple::get($url) or warn "No data from $url\n";
+ open my $input, '<', \$download or die $!;
+ parsecsv($input);
+
+ my %mult = map {
+ $_ => ( delete $count{$_} )->{0} / 100,
+ } qw(Desktop Mobile);
+
+ # apply desktop multiplier with inverse of mobile (reverted below)
+ for (values %count) {
+ ref $_ eq 'HASH' or next;
+ $_ *= $mult{Desktop} / $mult{Mobile} for values %$_;
+ }
+ $count{Opera} = delete $count{opera}; # preserve
+
+ $url = $site.'mobile_browser';
+ $download = LWP::Simple::get($url) or warn "No data from $url\n";
+ open $input, '<', \$download or die $!;
+ parsecsv($input);
+
+ # apply mobile multiplier to everything (undoing it for desktop)
+ for (values %count) {
+ ref $_ eq 'HASH' or next;
+ $_ *= $mult{Mobile} for values %$_;
+ }
+ $count{op_mini} = delete $count{opera}; # mobile distinction
+ $count{opera} = delete $count{Opera}; # restore desktop
+ }
+}
+else {
+ parsecsv(\*STDIN);
}
-my $csv = Text::CSV->new or die Text::CSV->error_diag;
-while (my $row = $csv->getline($input)) {
- my ($browser, $pct) = @$row;
- $browser and $pct or next;
+sub parsecsv {
+ my ($input) = @_;
+ my $csv = Text::CSV->new or die Text::CSV->error_diag;
+ while (my $row = $csv->getline($input)) {
+ my ($browser, $pct) = @$row;
+ $browser and $pct or next;
- my $version = $browser =~ s/ (\d\S*)$// ? $1 : 0;
- given ($browser) {
- when ('Browser Version') {
- $pct =~ s/^Market Share % // and $count{-date} = $pct;
+ my $version = $browser =~ s/ (\d\S*)$// ? $1 : 0;
+ given ($browser) {
+ when (['Browser Version', 'Mobile Browser', 'Mobile vs. Desktop']) {
+ $pct =~ s/^Market Share % // and $count{-date} = $pct;
+ }
+ $browser =~ tr/ /-/;
+ $browser = $_ for $BROWSERID{$browser} // ();
+ $version =~ s/\.0$//;
+ $count{$browser}->{$version} += $pct;
}
- $browser =~ tr/ /-/;
- $browser = $_ for $BROWSERID{$browser} // ();
- $version =~ s/\.0$//;
- $count{$browser}->{$version} += $pct;
}
+ $csv->eof or $csv->error_diag;
}
-$csv->eof or $csv->error_diag;
print pp(\%count);