browser: convert mobile statcounter stats
authorMischa POSLAWSKY <perl@shiar.org>
Thu, 9 Dec 2010 04:34:41 +0000 (05:34 +0100)
committerMischa POSLAWSKY <perl@shiar.org>
Wed, 15 Dec 2010 21:40:44 +0000 (22:40 +0100)
tools/convert-stats-gs.pl

index 8a8a43037bf82ad0ca71b307b296287f22fce30d..c28fde8d0a8bdc5028f0012c86332b1ec7bbb482 100644 (file)
@@ -13,52 +13,94 @@ my %BROWSERID = qw(
        Safari-iPad ios_saf
        Chrome      webkit_chr
        Opera       presto
+
+       Android     android
+       iPhone      ios_saf
+       iPod-Touch  ios_saf
 );
 
 my %count = (
        -source => '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{-url} = $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{presto};  # 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{presto}; # mobile distinction
+               $count{presto}  = 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);