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