rfc1345convert: defer source download to makefile
[sheet.git] / tools / convert-stats-gs.pl
index 52ecd4f5df298074a53d76bbac31f3281047064d..c01691d8a541aed8b5d1a8dabddc97d80c47bc13 100644 (file)
@@ -7,36 +7,100 @@ use Data::Dump 'pp';
 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 $csv = Text::CSV->new or die Text::CSV->error_diag;
-while (my $row = $csv->getline(\*STDIN)) {
-       my ($browser, $pct) = @$row;
-       $browser and $pct or next;
+if (@ARGV) {
+       my %param = (
+               bar             => 1,
+               region_hidden   => 'ww', # Worldwide
+               granularity     => 'monthly',
+               fromMonthYear   => $ARGV[0],
+               toMonthYear     => $ARGV[1] // $ARGV[0],
+               csv             => 1,
+       );
+       my $site = $count{-site};
+       $site .= 'chart.php?'.join('&', map "$_=$param{$_}", keys %param);
+       $site .= '&statType_hidden=';
+       $count{-source} = $site;
+
+       require LWP::Simple;
+       {
+               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);
 
-       my $version = $browser =~ s/ (\d\S*)$// ? $1 : 0;
-       given ($browser) {
-               when ('Browser Version') {
-                       $pct =~ s/^Market Share % // and $count{-date} = $pct;
+               # apply mobile multiplier to everything (undoing it for desktop)
+               for (values %count) {
+                       ref $_ eq 'HASH' or next;
+                       $_ *= $mult{Mobile} for values %$_;
                }
-               $browser =~ tr/ /-/;
-               $browser = $_ for $BROWSERID{$browser} // ();
-               $version =~ s/\.0$//;
-               $count{$browser}->{$version} += $pct;
+               $count{op_mini} = delete $count{opera};  # mobile distinction
+               $count{opera}   = delete $count{Opera};  # restore desktop
        }
 }
-$csv->eof or $csv->error_diag;
+else {
+       parsecsv(\*STDIN);
+}
+
+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', '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;
+               }
+       }
+       $csv->eof or $csv->error_diag;
+}
 
 print pp(\%count);
 
@@ -46,3 +110,5 @@ __END__
 
 cat <csv data> | F<convert-stats-gs> > browser-usage-gs.inc.pl
 
+F<convert-stats-gs> <year-month>
+