browser: changed title identifiers in statcounter exports
[sheet.git] / tools / mkusage-statcounter
1 #!/usr/bin/env perl
2 use 5.010;
3 use strict;
4 use warnings;
5
6 use Data::Dump 'pp';
7 use Text::CSV;
8
9 our $VERSION = '1.00';
10
11 my %BROWSERID = qw(
12         IE          ie
13         Firefox     firefox
14         Safari      safari
15         Safari-iPad ios_saf
16         Chrome      chrome
17         Opera       opera
18
19         Android     android
20         iPhone      ios_saf
21         iPod-Touch  ios_saf
22 );
23
24 my %count = (
25         -title  => 'StatCounter',
26         -site   => 'http://gs.statcounter.com/',
27 );
28
29 if (@ARGV) {
30         my %param = (
31                 bar             => 1,
32                 region_hidden   => 'ww', # Worldwide
33                 granularity     => 'monthly',
34                 fromMonthYear   => $ARGV[0],
35                 toMonthYear     => $ARGV[1] // $ARGV[0],
36                 csv             => 1,
37         );
38         my $site = $count{-site};
39         $site .= 'chart.php?'.join('&', map "$_=$param{$_}", keys %param);
40         $site .= '&statType_hidden=';
41         $count{-source} = $site;
42
43         require LWP::Simple;
44         {
45                 my $url = $site.'browser_version';
46                 my $download = LWP::Simple::get($url) or die "No data from $url\n";
47                 open my $input, '<', \$download or die $!;
48                 parsecsv($input);
49         }
50
51         {
52                 my $url = $site.'mobile_vs_desktop';
53                 my $download = LWP::Simple::get($url) or warn "No data from $url\n";
54                 open my $input, '<', \$download or die $!;
55                 parsecsv($input);
56
57                 my %mult = map {
58                         $_ => ( delete $count{$_} )->{0} / 100,
59                 } qw(Desktop Mobile);
60
61                 # apply desktop multiplier with inverse of mobile (reverted below)
62                 for (values %count) {
63                         ref $_ eq 'HASH' or next;
64                         $_ *= $mult{Desktop} / $mult{Mobile} for values %$_;
65                 }
66                 $count{Opera} = delete $count{opera};  # preserve
67
68                 $url = $site.'mobile_browser';
69                 $download = LWP::Simple::get($url) or warn "No data from $url\n";
70                 open $input, '<', \$download or die $!;
71                 parsecsv($input);
72
73                 # apply mobile multiplier to everything (undoing it for desktop)
74                 for (values %count) {
75                         ref $_ eq 'HASH' or next;
76                         $_ *= $mult{Mobile} for values %$_;
77                 }
78                 $count{op_mini} = delete $count{opera};  # mobile distinction
79                 $count{opera}   = delete $count{Opera};  # restore desktop
80         }
81 }
82 else {
83         parsecsv(\*STDIN);
84 }
85
86 sub parsecsv {
87         my ($input) = @_;
88         my $csv = Text::CSV->new or die Text::CSV->error_diag;
89         while (my $row = $csv->getline($input)) {
90                 my ($browser, $pct) = @$row;
91                 $browser and $pct or next;
92
93                 my $version = $browser =~ s/ (\d\S*)$// ? $1 : 0;
94                 given ($browser) {
95                         when (['Browser', 'Browser Version', 'Mobile Browser', 'Mobile vs. Desktop', 'Comparison']) {
96                                 $pct =~ s/^Market Share (?:%|Perc\.) // or break;
97                                 $pct =~ s/\A\((.*)\)\z/$1/;
98                                 $count{-date} = $pct;
99                         }
100                         $browser =~ tr/ /-/;
101                         $browser = $_ for $BROWSERID{$browser} // ();
102                         $version =~ s/\.0$//;
103                         $count{$browser}->{$version} += $pct;
104                 }
105         }
106         $csv->eof or $csv->error_diag;
107 }
108
109 print pp(\%count);
110
111 __END__
112
113 =head1 USAGE
114
115 cat <csv data> | F<mkusage-statcounter> > browser-usage-gs.inc.pl
116
117 F<mkusage-statcounter> <year-month>
118