Skip to content

Commit

Permalink
smugup enhanced to create the Album if necessary,
Browse files Browse the repository at this point in the history
in which case it will require a Category and optional
specify Quick Settings.
  • Loading branch information
troy committed Aug 4, 2008
1 parent a7ff791 commit de91a7d
Show file tree
Hide file tree
Showing 9 changed files with 345 additions and 8 deletions.
3 changes: 3 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ SMUG_OBJS = \
smugdown.o \
md5.o

HEADERS = \
smug.h \

GEN_HEADERS = \
smugbatch_version.h

Expand Down
8 changes: 8 additions & 0 deletions smug.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,10 +111,18 @@ extern int upload_file(struct session *session, struct filename *filename,
struct album *album, int position, int total);
extern int upload_files(struct session *session, struct album *album);
extern struct album *select_album(const char *album_title,
const char *category_title,
const char *quicksettings_name,
struct session *session);
extern int smug_login(struct session *session);
extern int smug_logout(struct session *session);
extern int generate_md5s(struct list_head *files);
extern char *smug_get_category_id(const char *category_title,
struct session *session);
extern struct album *smug_create_album(const char *album_title,
const char *category_title,
const char *quicksettings_name,
struct session *session);
extern int smug_get_albums(struct session *session);
extern int smug_read_images(struct session *session, struct album *album);
extern void smug_parse_configfile(struct session *session);
Expand Down
276 changes: 274 additions & 2 deletions smug_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,18 @@ static char *smugmug_album_list_url =
"https://api.smugmug.com/hack/rest/1.2.0/?"
"method=smugmug.albums.get"
"&SessionID=%s&APIKey=%s";
static char *smugmug_album_create_url =
"https://api.smugmug.com/hack/rest/1.2.0/?"
"method=smugmug.albums.create"
"&SessionID=%s&Title=%s&CategoryID=%s&AlbumTemplateID=%s";
static char *smugmug_category_list_url =
"https://api.smugmug.com/hack/rest/1.2.0/?"
"method=smugmug.categories.get"
"&SessionID=%s";
static char *smugmug_quicksettings_list_url =
"https://api.smugmug.com/hack/rest/1.2.0/?"
"method=smugmug.albumtemplates.get"
"&SessionID=%s";
static char *smugmug_login_url =
"https://api.smugmug.com/hack/rest/1.2.0/?"
"method=smugmug.login.withPassword"
Expand Down Expand Up @@ -578,7 +590,8 @@ int upload_files(struct session *session, struct album *album)
return 0;
}

struct album *select_album(const char *album_title, struct session *session)
struct album *select_album(const char *album_title, const char *category_title,
const char *qs_name, struct session *session)
{
struct album *album;
int found_album;
Expand Down Expand Up @@ -618,10 +631,16 @@ struct album *select_album(const char *album_title, struct session *session)
break;
}
}
if (!found_album && category_title) {
album = smug_create_album(album_title, category_title,
qs_name, session);
if (album)
found_album = 1;
}
if (!found_album) {
fprintf(stdout, "Album %s is not found\n", album_title);
return NULL;
}
}
}
return album;
}
Expand Down Expand Up @@ -758,6 +777,259 @@ int smug_get_albums(struct session *session)
return 0;
}

/**
* returns a pointer to a buffer that must be later freed by the caller
* with a call to free().
*/
char *smug_get_quicksettings_id(const char *qs_name, struct session *session)
{
char url[1000];
struct smug_curl_buffer *curl_buf;
CURL *curl = NULL;
CURLcode res;

if (!session)
return NULL;

curl_buf = smug_curl_buffer_alloc();
if (!curl_buf)
return NULL;

curl = curl_init();
if (!curl) {
smug_curl_buffer_free(curl_buf);
return NULL;
}

sprintf(url, smugmug_quicksettings_list_url, session->session_id);
dbg("url = %s\n", url);
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, curl_buf);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);

if (res) {
fprintf(stderr, "error(%d) trying to get quicksettings\n", res);
smug_curl_buffer_free(curl_buf);
return NULL;
}

char *rsp_stat = find_value(curl_buf->data, "rsp stat", NULL);
if (!rsp_stat) {
smug_curl_buffer_free(curl_buf);
return NULL;
}
if (strcmp(rsp_stat, "fail") == 0) {
char *msg = find_value(curl_buf->data, "msg", NULL);
printf("error to get quicksettings: %s\n", msg);
free(msg);
smug_curl_buffer_free(curl_buf);
return NULL;
}
free(rsp_stat);


char *temp = curl_buf->data;
char *id = NULL;
char *name = NULL;
while (1) {
id = find_value(temp, "AlbumTemplate id", &temp);
name = find_value(temp, "AlbumTemplateName", &temp);
if (!id || !name)
break;
dbg("%s: %s\n", id, name);
if (strcmp(name, qs_name) == 0) {
free(name);
smug_curl_buffer_free(curl_buf);
return id;
}
}

if (id)
free(id);
if (name)
free(name);
smug_curl_buffer_free(curl_buf);
return NULL;
}

/**
* returns a pointer to a buffer that must be later freed by the caller
* with a call to free().
*/
char *smug_get_category_id(const char *category_title, struct session *session)
{
char url[1000];
struct smug_curl_buffer *curl_buf;
CURL *curl = NULL;
CURLcode res;

if (!session)
return NULL;

curl_buf = smug_curl_buffer_alloc();
if (!curl_buf)
return NULL;

curl = curl_init();
if (!curl) {
smug_curl_buffer_free(curl_buf);
return NULL;
}

sprintf(url, smugmug_category_list_url, session->session_id);
dbg("url = %s\n", url);
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, curl_buf);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);

if (res) {
fprintf(stderr, "error(%d) trying to get category\n", res);
smug_curl_buffer_free(curl_buf);
return NULL;
}

char *rsp_stat = find_value(curl_buf->data, "rsp stat", NULL);
if (!rsp_stat) {
smug_curl_buffer_free(curl_buf);
return NULL;
}
if (strcmp(rsp_stat, "fail") == 0) {
char *msg = find_value(curl_buf->data, "msg", NULL);
printf("error to get category: %s\n", msg);
free(msg);
smug_curl_buffer_free(curl_buf);
return NULL;
}
free(rsp_stat);


char *temp = curl_buf->data;
char *id = NULL;
char *title = NULL;
while (1) {
id = find_value(temp, "Category id", &temp);
/* NOTE: In 1.2.1 "Title" will change to "Name" */
title = find_value(temp, "Title", &temp);
if (!id || !title)
break;
dbg("%s: %s\n", id, title);
if (strcmp(title, category_title) == 0) {
free(title);
smug_curl_buffer_free(curl_buf);
return id;
}
}

if (id)
free(id);
if (title)
free(title);
smug_curl_buffer_free(curl_buf);
return NULL;
}

struct album *smug_create_album(const char *album_title,
const char *category_title, const char *qs_name,
struct session *session)
{
char url[1000];
struct smug_curl_buffer *curl_buf;
CURL *curl = NULL;
CURLcode res;

if (!session)
return NULL;

char *category_id = smug_get_category_id(category_title, session);
if (!category_id)
return NULL;

char *qs_id = smug_get_quicksettings_id(qs_name, session);
if (!category_id) {
free(category_id);
return NULL;
}

curl_buf = smug_curl_buffer_alloc();
if (!curl_buf) {
free(category_id);
free(qs_id);
return NULL;
}

curl = curl_init();
if (!curl) {
free(category_id);
free(qs_id);
smug_curl_buffer_free(curl_buf);
return NULL;
}

sprintf(url, smugmug_album_create_url, session->session_id, album_title,
category_id, qs_id);
dbg("url = %s\n", url);
free(category_id);
free(qs_id);

curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, curl_buf);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);

if (res) {
fprintf(stderr, "error(%d) trying to create album\n",
res);
smug_curl_buffer_free(curl_buf);
return NULL;
}

char *rsp_stat = find_value(curl_buf->data, "rsp stat", NULL);
if (!rsp_stat) {
smug_curl_buffer_free(curl_buf);
return NULL;
}
if (strcmp(rsp_stat, "fail") == 0) {
char *msg = find_value(curl_buf->data, "msg", NULL);
printf("error to create login: %s\n", msg);
free(msg);
smug_curl_buffer_free(curl_buf);
return NULL;
}
free(rsp_stat);


char *temp = curl_buf->data;
char *id = find_value(temp, "Album id", &temp);
char *key = find_value(temp, "Key", &temp);
if (!id || !key) {
printf("incomplete return from create album\n");
smug_curl_buffer_free(curl_buf);
return NULL;
}
dbg("%s: %s: %s\n", id, key, album_title);
struct album *album = zalloc(sizeof(*album));
INIT_LIST_HEAD(&album->files);
album->id = id;
album->key = key;
album->title = strdup(album_title);
if (session->albums.prev)
album->number = list_entry(session->albums.prev, struct album,
entry)->number + 1;
else
album->number = 1;
/* add to session->albums to unify cleanup */
list_add_tail(&album->entry, &session->albums);

smug_curl_buffer_free(curl_buf);

return album;
}

int smug_read_images(struct session *session, struct album *album)
{
char url[1000];
Expand Down
2 changes: 2 additions & 0 deletions smugbatch_version.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/* Generated by make. */
#define SMUGBATCH_VERSION "004"
2 changes: 1 addition & 1 deletion smugdown.c
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ int main(int argc, char *argv[], char *envp[])
fprintf(stderr, "Can not read albums\n");
return -1;
}
album = select_album(album_title, session);
album = select_album(album_title, NULL, NULL, session);
if (!album)
return -1;

Expand Down
2 changes: 1 addition & 1 deletion smugls.c
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ int main(int argc, char *argv[], char *envp[])
return -1;
}

album = select_album(album_title, session);
album = select_album(album_title, NULL, NULL, session);
if (!album)
return -1;

Expand Down
Loading

0 comments on commit de91a7d

Please sign in to comment.