173fbe6f56216ccf9f4f6bea39edd4fe33955db0
[sheet.git] / tools / mkusage-statcounter
1 #!/usr/bin/env perl
2 use 5.014;
3 use warnings;
4
5 use Data::Dump 'pp';
6 use Text::CSV;
7
8 our $VERSION = '1.01';
9
10 my %BROWSERID = qw(
11         IE          ie
12         Firefox     firefox
13         Safari      safari
14         Safari-iPad ios_saf
15         Chrome      chrome
16         Chromium    chrome
17         Opera       opera
18         BlackBerry  bb
19
20         IEMobile    ie_mob
21         Android     android
22         Chrome-for-Android and_chr
23         UC-Browser  and_uc
24         iPhone      ios_saf
25         iPod-Touch  ios_saf
26 );
27
28 my %count = (
29         -title  => 'StatCounter',
30         -site   => 'http://gs.statcounter.com/',
31 );
32
33 if (@ARGV) {
34         my %param = (
35                 bar             => 1,
36                 region_hidden   => 'ww', # Worldwide
37                 device_hidden   => 'desktop%2Bmobile%2Btablet%2Bconsole',
38                 'multi-device'  => 'true',
39                 granularity     => 'monthly',
40                 fromMonthYear   => $ARGV[0],
41                 toMonthYear     => $ARGV[1] // $ARGV[0],
42                 csv             => 1,
43         );
44         my $site = $count{-site};
45         $site .= 'chart.php?'.join('&', map "$_=$param{$_}", keys %param);
46         $site .= '&statType_hidden=';
47         $count{-source} = $site;
48
49         require LWP::Simple;
50         {
51                 my $url = $site.'browser_version';
52                 my $download = LWP::Simple::get($url) or die "No data from $url\n";
53                 open my $input, '<', \$download or die $!;
54                 parsecsv($input);
55         }
56 }
57 else {
58         parsecsv(\*STDIN);
59 }
60
61 sub parsecsv {
62         my ($input) = @_;
63         my $csv = Text::CSV->new or die Text::CSV->error_diag;
64         while (my $row = $csv->getline($input)) {
65                 my ($browser, $pct) = @$row;
66                 $browser and $pct or next;
67
68                 my $version = $browser =~ s/ (\d\S*)$// ? $1 : 0;
69                 given ($browser) {
70                         when ('Browser Version') {
71                                 $pct =~ s/^Market Share (?:%|Perc\.) // or break;
72                                 $pct =~ s/\A\((.*)\)\z/$1/;
73                                 $count{-date} = $pct;
74                         }
75                         $browser =~ tr/ /-/;
76                         $browser = $_ for $BROWSERID{$browser} // ();
77                         $version =~ s/\.0$//;
78
79                         # desktop variant has version, mobile doesn't
80                         if ($version eq '0') {
81                                 $browser = 'op_mini' if $browser eq 'opera';
82                                 $browser = 'and_ff'  if $browser eq 'firefox';
83                         }
84
85                         $count{$browser}->{$version} += $pct;
86                 }
87         }
88         $csv->eof or $csv->error_diag;
89 }
90
91 print pp(\%count);
92
93 __END__
94
95 =head1 USAGE
96
97 cat <csv data> | F<mkusage-statcounter> > browser-usage-gs.inc.pl
98
99 F<mkusage-statcounter> <year-month>
100