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