The following CSV (on-demand generated from raw data with simple Perl script) file contains outdoor temperature registred every hour starting from 2010 (with DS18B20 sensor):
dayhr;No;y2010;y2011;y2012;y2013;y2014;y2015;day30 d070100;001;14.6;17.5;14.9;10.1;12.9;12.2;0 d070101;002;13.4;16.7;14.1;10.1;12.8;12.5;3600 d070102;003;12.8;16.3;14.3;10.2;12.7;12.1;7200
dayhr
is a label and day30
denotes number
of seconds from
the beginning od the period (for the first observation day30
equals 0, for the second 3600 etc.) The chart was produced
with the following custom R script:
require(ggplot2) library(scales) number_ticks <- function(n) {function(limits) pretty(limits, n)} d <- read.csv("july-by-day.csv", sep = ';', header=T, na.string="NA"); datestart <- ISOdate(2015, 7, 1, tz = ""); d30 <- datestart + d$day30; d[,"d30"] <- d30; ggplot(d, aes(x = d30)) + geom_line(aes(y = y2015, colour = 'y2015'), size=.3) + geom_line(aes(y = y2014, colour = 'y2014'), size=.3) + geom_smooth(aes(y = y2015, colour = 'y2015'), size=1) + geom_smooth(aes(y = y2014, colour = "y2014"), size=1) + ylab(label="Temp [C]") + xlab(label="Observation") + scale_y_continuous(breaks=number_ticks(15)) + scale_x_datetime(breaks = date_breaks("5 days")) + theme(legend.title=element_blank()) + ggtitle("Temperature in July in Sopot") + theme(legend.position=c(.6, .9)) + theme(legend.text=element_text(size=12)); ggsave(file="Temp-M7-2015.pdf", width=15, height=8)
Previously described bash script allows for uploading a file to PicasaWeb only. With the following (simplified) Perl script one can upload pictures as well as upload with metadata (title description and tags) or create/list albums:
#!/usr/bin/perl use strict; use LWP::UserAgent; use Getopt::Long; use File::MimeInfo; use XML::LibXML; my $AlbumId ="6170354040646469009"; my $profileID="default"; my $Action = 'u'; ## x| u | c | l (default action is Upload) my $entryTitle = ''; my $entryDescription = ''; my $entryKeywords = ''; my $ActionUpload =''; my $ActionList = ''; my $ActionCreate = ''; my $ActionXload = ''; my $ImageFile = ''; my $dummyReq=''; GetOptions("xload" => \$ActionXload, "upload" => \$ActionUpload, "list" => \$ActionList, "create" => \$ActionCreate, "title=s" => \$entryTitle, "description=s" => \$entryDescription, "keywords=s" => \$entryKeywords, "file=s" => \$ImageFile, "album=s" => \$AlbumId, ## UploadFile to Album ) ; ## Determine action: if ( $ActionUpload ) {$Action = 'u'} elsif ( $ActionList ) { $Action = 'l'} elsif ( $ActionCreate ) { $Action = 'c'} elsif ( $ActionXload ) { $Action = 'x'}
OAuth 2.0 authorization is handled with Python script
oauth2picasa.py
. The script is an adapted/copy-pasted fragment
of code borrowd from
picasawebsync
:
### Authenticate with external script (oauth2picasa.py): my $ACCESS_TOKEN=`oauth2picasa.py`; chomp($ACCESS_TOKEN); print STDERR "*** AccessToken: $ACCESS_TOKEN [AlbumId: $AlbumId]\n"; my $req ; my $blog_entry ; my $picasawebURL = "https://picasaweb.google.com/data/feed/api/user/$profileID"; if ( $Action eq 'c' ) {## Action: create album $req = HTTP::Request->new(POST => $picasawebURL ); $req->header( 'Content-Type' => 'application/atom+xml' ); $blog_entry = "<entry xmlns='http://www.w3.org/2005/Atom' xmlns:media='http://search.yahoo.com/mrss/' xmlns:gphoto='http://schemas.google.com/photos/2007'>" . "<title type='text'>$entryTitle</title>" . "<summary type='text'>$entryDescription</summary>" . "<media:group><media:keywords>$entryKeywords</media:keywords></media:group>" . "<category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/photos/2007#album'></category></entry>"; $req->content($blog_entry); } elsif ( $Action eq 'l' ) {## Action: list albums $req = HTTP::Request->new(GET => $picasawebURL ); } elsif ( $Action eq 'u' ) {## Action: Upload 1 photo w/o metadata my $mimeType = mimetype($ImageFile); ## https://developers.google.com/picasa-web/docs/2.0/developers_guide_protocol $req = HTTP::Request->new(POST => "$picasawebURL/albumid/$AlbumId" ); $req->header( 'Content-Type' => "$mimeType" ); $req->header( 'Slug' => "$ImageFile" ); ## http://www.perlmonks.org/?node_id=131584 open(FILE, $ImageFile); $req->content(join('',<FILE>)); close(FILE); }
To upload the binary image data along with its metadata, use MIME content
type "multipart/related"; send photo metadata in one part of the POST
body (Content-Type: application/atom+xml
),
and binary-encoded image data in another part.
This is the preferred approach according to
Picasa Web Albums Data API
Picasa Web Albums Data API
elsif ( $Action eq 'x' ) {## Action: Upload 1 photo with metadata # https://groups.google.com/forum/#!topic/google-picasa-data-api/2qRfP0EIFhk my $mimeType = mimetype($ImageFile); $req = HTTP::Request->new(POST => "$picasawebURL/albumid/$AlbumId" ); $req->header( 'Content-Type' => "multipart/related" ); open(FILE, $ImageFile); my $add_photo_metadata = "<entry xmlns='http://www.w3.org/2005/Atom' xmlns:media='http://search.yahoo.com/mrss/'>" . "<title type='text'>$entryTitle</title>" . "<summary type='text'>$entryDescription</summary>" . "<media:group><media:keywords>$entryKeywords</media:keywords></media:group>" . "<category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/photos/2007#photo'></category></entry>"; my $add_photo_data = join('',<FILE>); close(FILE); ## http://www.perlmonks.org/?node_id=131584 $req->add_part(HTTP::Message->new(['Content-Type' => 'application/atom+xml'], $add_photo_metadata)); $req->add_part(HTTP::Message->new(['Content-Type' => "$mimeType"], $add_photo_data)); } $req->header( 'Authorization' => "Bearer $ACCESS_TOKEN" ); $req->header( 'GData-Version' => '2' ); ## ### ### my $res ; my $ua = LWP::UserAgent->new; $res = $ua->request($req); if ($res->is_success) { my $decoded_response = $res->decoded_content; print "*** OK *** $decoded_response\n"; }
Usage:
Upload with metadata
picasaweb.pl -xload -title PICTURE-TITLE -descr DESCRIPTION \ -keywords 'TAG1,TAG2' -file FILE.jpg -album ALBUMID
Upload w/o metadata:
picasaweb.pl -upload -file FILE.jpg -album 12345
Create album:
picasaweb.pl -create -title ALBUM-TITLE -descr DESCRIPTION \ -keywords 'TAG1,TAG2'
List album:
picasaweb.pl -list
Source code:
picasaweb.pl