blob: e6343a875d71b1b98ecf4450a11f25b3a61d7c82 [file] [log] [blame]
(function() {
const ALBUM_NAME = 'Screen Capture';
const CLIENT_ID = '368358534491.apps.googleusercontent.com';
const AUTH_URL = 'https://accounts.google.com/o/oauth2/auth';
const REDIRECT_URI = 'https://picasaweb.google.com';
const SCOPE = 'https://picasaweb.google.com/data/';
const RESPONSE_TYPE = 'token';
const ALBUM_URL = 'https://picasaweb.google.com/data/feed/api/user/' +
'default';
const CREATE_ALBUM_URL = 'https://picasaweb.google.com/data/feed/api/user/' +
'default';
const UPLOAD_BASE_URL = 'https://picasaweb.google.com/data/feed/api/user/' +
'default/albumid/';
const LOGOUT_URL = 'https://picasaweb.google.com/bye?continue=' +
'https://www.google.com/accounts/Logout?continue=' +
'https://picasaweb.google.com';
// var picasa = window.Picasa = new Site('picasa');
var picasa = window.Picasa = {
siteId: 'picasa',
currentUserId: null,
redirectUrl: REDIRECT_URI,
accessTokenCallback: null,
getAccessToken: function(callback) {
picasa.accessTokenCallback = callback;
var url = AUTH_URL + '?client_id=' + CLIENT_ID + '&redirect_uri=' +
REDIRECT_URI + '&scope=' + SCOPE + '&response_type=' + RESPONSE_TYPE;
chrome.tabs.create({ url: url});
},
parseRedirectUrl: function(url) {
var result = false;
if (url.indexOf(REDIRECT_URI) == 0) {
var hash = url.split('#')[1];
if (hash) {
var params = hash.split('&');
var paramMap = {};
params.forEach(function(param) {
paramMap[param.split('=')[0]] = param.split('=')[1];
});
var accessToken = paramMap['access_token'];
var expires = paramMap['expires_in'];
if (accessToken && expires) {
result = {
accessToken: accessToken,
expires: expires
};
} else {
result = 'bad_redirect_url'; // Should never happened.
}
} else {
var search = url.split('?')[1];
if (search == 'error=access_denied')
result = 'access_denied';
}
}
return result;
},
isRedirectUrl: function(url) {
return picasa.parseRedirectUrl(url) != false;
},
parseAccessToken: function(redirectUrl) {
var parsedResult = picasa.parseRedirectUrl(redirectUrl);
if (parsedResult && typeof parsedResult == 'object') {
var user = new User({
accessToken: parsedResult.accessToken,
expires: new Date().getTime() + parsedResult.expires * 1000
});
picasa.accessTokenCallback('success', user);
} else {
picasa.accessTokenCallback('failure', 'user_denied');
}
picasa.accessTokenCallback = null;
},
getUserInfo: function(user, callback) {
ajax({
url: ALBUM_URL,
parameters: {
fields: 'title,gphoto:nickname,entry/title,entry/gphoto:id',
alt: 'json',
access_token: user.accessToken
},
success: function(res) {
var userId = res.feed.title.$t;
var userName = res.feed.gphoto$nickname.$t;
user.id = userId;
user.name = userName;
var albums = res.feed.entry;
if (albums) {
var length = albums.length;
// Check if user has created album "Screen Capture".
for (var i = 0; i < length; i++) {
var albumName = albums[i].title.$t;
if (albumName == ALBUM_NAME) {
user.albumId = albums[i].gphoto$id.$t;
break;
}
}
}
// Create album "Screen Capture" and retrieve album id.
if (!user.albumId) {
picasa.createAlbum(user.accessToken, function(result,
albumIdOrMessage) {
if (result == 'success') {
user.albumId = albumIdOrMessage;
callback('success', user);
} else {
callback('failure', albumIdOrMessage);
}
});
} else {
callback('success', user);
}
},
status: {
404: function() {
callback('failure', 'failed_to_get_user_info');
}
}
});
},
createAlbum: function(accessToken, callback) {
var data = '<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">' + ALBUM_NAME +
'</title><category scheme="http://schemas.google.com/g/2005#kind" ' +
'term="http://schemas.google.com/photos/2007#album"></category>' +
'</entry>';
ajax({
method: 'POST',
url: CREATE_ALBUM_URL,
parameters: {
alt: 'json'
},
data: data,
headers: {
'GData-Version': 2,
'Content-Type': 'application/atom+xml',
'Authorization': 'OAuth ' + accessToken
},
complete: function(statusCode, album) {
if (statusCode == 201) {
var albumId = album.entry.gphoto$id.$t;
callback('success', albumId);
} else {
callback('failure', 'failure_to_create_album')
}
}
});
},
upload: function(user, caption, imageData, callback) {
caption = ajax.convertEntityString(caption);
caption = ajax.encodeForBinary(caption);
var imageFile = new Date().getTime() + '.png';
var headers = {
'GData-Version': 2,
'Content-Type': 'multipart/related; boundary=' +
MULTIPART_FORMDATA_BOUNDARY,
'Authorization': 'OAuth ' + user.accessToken
};
var captionData = '<entry xmlns="http://www.w3.org/2005/Atom">' +
'<title>' + imageFile + '</title>' +
'<summary>' + caption + '</summary>' +
'<category scheme="http://schemas.google.com/g/2005#kind" ' +
'term="http://schemas.google.com/photos/2007#photo"/></entry>';
var dataPart1 = {
contentType: 'application/atom+xml',
data: captionData
};
var dataPart2 = {
contentType: 'image/png',
data: imageData
};
var multipartData = {
boundary: MULTIPART_FORMDATA_BOUNDARY,
dataList: [dataPart1, dataPart2]
};
ajax({
url: UPLOAD_BASE_URL + user.albumId + '?alt=json',
headers: headers,
multipartData: multipartData,
complete: function(statusCode, res) {
if (statusCode == 201) {
var link = res.entry.link;
callback('success', link);
} else {
var message = 'failed_to_upload_image';
if (statusCode == 403) {
// bad access token
message = 'bad_access_token';
} else if (statusCode == 404 && res == 'No album found.') {
// Invalid album id.
message = 'invalid_album_id'
}
callback('failure', message);
}
}
});
},
getPhotoLink: function(user, photolinks, callback) {
for (var i = 0; i < photolinks.length; i++) {
var link = photolinks[i];
if (link.type == 'text/html' &&
link.rel == 'http://schemas.google.com/photos/2007#canonical') {
callback('success', link.href);
break;
}
}
},
logout: function(callback) {
ajax({
url: LOGOUT_URL,
success: function() {
callback();
}
});
}
};
})();