--!parent
--!encoding=utf-8
--****************************************************************************
-- @file lib "flickr"
-- @author Valentin Schmidt
-- @version 0.12
-- @requires lib "curl" (+xtra "Curl")
-- @requires lib "json"
-- @requires lib "oauth"
-- @requires lib "xmlparser" (+xtra "XmlParser") - only needed for photo_upload() which doesn't support JSON
--****************************************************************************
global $
property _user_id
property _err
property _verbose
----------------------------------------
-- @constructor
----------------------------------------
on new (me, consumer_data)
-- libs
$.import("curl")
$.import("json")
$.import("oauth")
$.import("xmlparser")
$.oauth.set_consumer_key(consumer_data[1], consumer_data[2])
me._err = []
me._verbose = FALSE
return me
end
----------------------------------------
-- Toggles if curl prints connection details to stdout.
-- @param {bool} flag
----------------------------------------
on set_verbose (me, flag)
me._verbose = flag
$.oauth.set_verbose(flag)
end
----------------------------------------
--
----------------------------------------
on get_user_id (me)
return me._user_id
end
----------------------------------------
-- Starts oauth by requesting a new oauth_token/oauth_token_secret pair.
-- @return {propList}
----------------------------------------
on get_request_token (me, callback_url)
u = "https://www.flickr.com/services/oauth/request_token"
ok = $.oauth.query_request_token(u, callback_url, me._err)
if ok then
-- authorize
request_token = $.oauth.get_request_token()[1]
perms = "delete"
u = "https://www.flickr.com/services/oauth/authorize?oauth_token="&request_token&"&perms="&perms
gotoNetPage(u) -- open in default browser
return ["stat": "ok"]
else
return ["stat": "fail", "code":me._err[1]]
end if
end
----------------------------------------
-- Finishes oauth by passing verifier, saves access_token/access_token_secret.
-- @param {string} verifier
-- @return {propList}
----------------------------------------
on get_access_token (me, verifier)
$.oauth.set_verifier(verifier)
u = "https://www.flickr.com/services/oauth/access_token"
ok = $.oauth.query_access_token(u, me._err)
if ok then
res = $.oauth.get_access_token()
return ["stat": "ok", "access_token": res[1], "access_token_secret": res[2]]
else
return ["stat": "fail", "code":me._err[1]]
end if
end
----------------------------------------
-- Checks if specified access_token/access_token_secret are valid, saves current user's id.
-- @param {string} access_token
-- @param {string} access_token_secret
-- @return {propList}
----------------------------------------
on login (me, access_token, access_token_secret)
$.oauth.set_access_token(access_token, access_token_secret)
param_obj = [:]
param_obj["format"] = "json"
param_obj["nojsoncallback"] = "1"
param_obj["method"] = "flickr.test.login"
res = $.oauth.call_api("https://api.flickr.com/services/rest", param_obj, me._err)
if integerP(res) then
return ["stat": "fail", "curl_error":curl_error(res)]
else if me._err[1]<200 or me._err[1]>=300 then
return ["stat": "fail", "code":me._err[1]]
else
json = res.readRawString(res.length)
res = $.json.decode(json)
me._user_id = res["user"]["id"]
return res
end if
end
----------------------------------------
-- Returns the photosets belonging to the current user.
-- @param {integer} [page=1]
-- @param {integer} [per_page=500]
-- @return {propList}
----------------------------------------
on account_get_photosets (me, page, per_page)
param_obj = [:]
param_obj["format"] = "json"
param_obj["nojsoncallback"] = "1"
param_obj["method"] = "flickr.photosets.getList"
if not voidP(page) then
param_obj["page"] = page
end if
if not voidP(per_page) then
param_obj["per_page"] = per_page
end if
res = $.oauth.call_api("https://api.flickr.com/services/rest", param_obj, me._err)
if integerP(res) then
return ["stat": "fail", "curl_error":curl_error(res)]
else if me._err[1]<200 or me._err[1]>=300 then
return ["stat": "fail", "code":me._err[1]]
else
json = res.readRawString(res.length)
return $.json.decode(json)
end if
end
----------------------------------------
-- Sets the order of photosets for the calling user.
-- @param {list} photoset_ids
-- @return {propList}
----------------------------------------
on account_order_photosets (me, photoset_ids)
param_obj = [:]
param_obj["format"] = "json"
param_obj["nojsoncallback"] = "1"
param_obj["method"] = "flickr.photosets.orderSets"
str = photoset_ids[1]
repeat with i = 2 to photoset_ids.count
put ","&photoset_ids[i] after str
end repeat
param_obj["photoset_ids"] = str
res = $.oauth.call_api("https://api.flickr.com/services/rest", param_obj, me._err, "post")
if integerP(res) then
return ["stat": "fail", "curl_error":curl_error(res)]
else if me._err[1]<200 or me._err[1]>=300 then
return ["stat": "fail", "code":me._err[1]]
else
json = res.readRawString(res.length)
return $.json.decode(json)
end if
end
----------------------------------------
-- Gets the list of photos in a set, or photos that are not in any set for photoset_id=EMPTY.
-- @param {string} photoset_id
-- @param {integer} [page=1]
-- @param {integer} [per_page=500]
-- @return {propList}
----------------------------------------
on photoset_get_photos (me, photoset_id, page, per_page)
param_obj = [:]
param_obj["format"] = "json"
param_obj["nojsoncallback"] = "1"
if photoset_id=EMPTY then
param_obj["method"] = "flickr.photos.getNotInSet"
else
param_obj["method"] = "flickr.photosets.getPhotos"
param_obj["photoset_id"] = photoset_id
param_obj["user_id"] = me._user_id
end if
if not voidP(page) then
param_obj["page"] = page
end if
if not voidP(per_page) then
param_obj["per_page"] = per_page
end if
res = $.oauth.call_api("https://api.flickr.com/services/rest", param_obj, me._err)
if integerP(res) then
return ["stat": "fail", "curl_error":curl_error(res)]
else if me._err[1]<200 or me._err[1]>=300 then
return ["stat": "fail", "code":me._err[1]]
else
json = res.readRawString(res.length)
return $.json.decode(json)
end if
end
----------------------------------------
-- Adds a photo to the end of an existing photoset.
-- @param {string} photoset_id
-- @param {string} photo_id
-- @return {propList}
----------------------------------------
on photoset_add_photo (me, photoset_id, photo_id)
param_obj = [:]
param_obj["format"] = "json"
param_obj["nojsoncallback"] = "1"
param_obj["method"] = "flickr.photosets.addPhoto"
param_obj["photoset_id"] = photoset_id
param_obj["photo_id"] = photo_id
res = $.oauth.call_api("https://api.flickr.com/services/rest", param_obj, me._err)
if integerP(res) then
return ["stat": "fail", "curl_error":curl_error(res)]
else if me._err[1]<200 or me._err[1]>=300 then
return ["stat": "fail", "code":me._err[1]]
else
json = res.readRawString(res.length)
return $.json.decode(json)
end if
end
----------------------------------------
-- Removes a photo from a photoset.
-- @param {string} photoset_id
-- @param {string} photo_id
-- @return {propList}
----------------------------------------
on photoset_remove_photo (me, photoset_id, photo_id)
param_obj = [:]
param_obj["format"] = "json"
param_obj["nojsoncallback"] = "1"
param_obj["method"] = "flickr.photosets.removePhoto"
param_obj["photoset_id"] = photoset_id
param_obj["photo_id"] = photo_id
res = $.oauth.call_api("https://api.flickr.com/services/rest", param_obj, me._err)
if integerP(res) then
return ["stat": "fail", "curl_error":curl_error(res)]
else if me._err[1]<200 or me._err[1]>=300 then
return ["stat": "fail", "code":me._err[1]]
else
json = res.readRawString(res.length)
return $.json.decode(json)
end if
end
----------------------------------------
-- Removes multiple photos from a photoset.
-- @param {string} photoset_id
-- @param {list} photo_ids
-- @return {propList}
----------------------------------------
on photoset_remove_photos (me, photoset_id, photo_ids)
param_obj = [:]
param_obj["format"] = "json"
param_obj["nojsoncallback"] = "1"
param_obj["method"] = "flickr.photosets.removePhotos"
param_obj["photoset_id"] = photoset_id
str = photo_ids[1]
repeat with i = 2 to photo_ids.count
put ","&photo_ids[i] after str
end repeat
param_obj["photo_ids"] = str
res = $.oauth.call_api("https://api.flickr.com/services/rest", param_obj, me._err, "post")
if integerP(res) then
return ["stat": "fail", "curl_error":curl_error(res)]
else if me._err[1]<200 or me._err[1]>=300 then
return ["stat": "fail", "code":me._err[1]]
else
json = res.readRawString(res.length)
return $.json.decode(json)
end if
end
----------------------------------------
-- Modifies the photos in a photoset. Use this method to add, remove and re-order photos.
-- @param {string} photoset_id
-- @param {string} primary_photo_id
-- @param {list} photo_ids
-- @return {propList}
----------------------------------------
on photoset_edit_photos (me, photoset_id, primary_photo_id, photo_ids)
param_obj = [:]
param_obj["format"] = "json"
param_obj["nojsoncallback"] = "1"
param_obj["method"] = "flickr.photosets.editPhotos"
param_obj["photoset_id"] = photoset_id
param_obj["primary_photo_id"] = primary_photo_id
str = photo_ids[1]
repeat with i = 2 to photo_ids.count
put ","&photo_ids[i] after str
end repeat
param_obj["photo_ids"] = str
res = $.oauth.call_api("https://api.flickr.com/services/rest", param_obj, me._err, "post")
if integerP(res) then
return ["stat": "fail", "curl_error":curl_error(res)]
else if me._err[1]<200 or me._err[1]>=300 then
return ["stat": "fail", "code":me._err[1]]
else
json = res.readRawString(res.length)
return $.json.decode(json)
end if
end
----------------------------------------
-- Creates a new photoset for the calling user.
-- @param {string} primary_photo_id
-- @param {string} photoset_title
-- @param {string} [photoset_description]
-- @return {propList}
----------------------------------------
on photoset_create (me, primary_photo_id, photoset_title, photoset_description)
param_obj = [:]
param_obj["format"] = "json"
param_obj["nojsoncallback"] = "1"
param_obj["method"] = "flickr.photosets.create"
param_obj["primary_photo_id"] = primary_photo_id
param_obj["title"] = photoset_title
if not voidP(photoset_description) then
param_obj["description"] = photoset_description
end if
res = $.oauth.call_api("https://api.flickr.com/services/rest", param_obj, me._err)
if integerP(res) then
return ["stat": "fail", "curl_error":curl_error(res)]
else if me._err[1]<200 or me._err[1]>=300 then
return ["stat": "fail", "code":me._err[1]]
else
json = res.readRawString(res.length)
return $.json.decode(json)
end if
end
----------------------------------------
-- Deletes a photoset.
-- @param {string} photoset_id
-- @return {propList}
----------------------------------------
on photoset_delete (me, photoset_id)
param_obj = [:]
param_obj["format"] = "json"
param_obj["nojsoncallback"] = "1"
param_obj["method"] = "flickr.photosets.delete"
param_obj["photoset_id"] = photoset_id
res = $.oauth.call_api("https://api.flickr.com/services/rest", param_obj, me._err)
if integerP(res) then
return ["stat": "fail", "curl_error":curl_error(res)]
else if me._err[1]<200 or me._err[1]>=300 then
return ["stat": "fail", "code":me._err[1]]
else
json = res.readRawString(res.length)
return $.json.decode(json)
end if
end
----------------------------------------
-- Set photoset primary photo.
-- @param {string} photoset_id
-- @param {string} photo_id
-- @return {propList}
----------------------------------------
on photoset_set_primary_photo (me, photoset_id, photo_id)
param_obj = [:]
param_obj["format"] = "json"
param_obj["nojsoncallback"] = "1"
param_obj["method"] = "flickr.photosets.setPrimaryPhoto"
param_obj["photoset_id"] = photoset_id
param_obj["photo_id"] = photo_id
res = $.oauth.call_api("https://api.flickr.com/services/rest", param_obj, me._err)
if integerP(res) then
return ["stat": "fail", "curl_error":curl_error(res)]
else if me._err[1]<200 or me._err[1]>=300 then
return ["stat": "fail", "code":me._err[1]]
else
json = res.readRawString(res.length)
return $.json.decode(json)
end if
end
----------------------------------------
-- Sets the order of photos for the specified set.
-- @param {string} photoset_id
-- @param {list} photo_ids
-- @return {propList}
----------------------------------------
on photoset_reorder_photos (me, photoset_id, photo_ids)
param_obj = [:]
param_obj["format"] = "json"
param_obj["nojsoncallback"] = "1"
param_obj["method"] = "flickr.photosets.reorderPhotos"
param_obj["photoset_id"] = photoset_id
str = photo_ids[1]
repeat with i = 2 to photo_ids.count
put ","&photo_ids[i] after str
end repeat
param_obj["photo_ids"] = str
res = $.oauth.call_api("https://api.flickr.com/services/rest", param_obj, me._err, "post")
if integerP(res) then
return ["stat": "fail", "curl_error":curl_error(res)]
else if me._err[1]<200 or me._err[1]>=300 then
return ["stat": "fail", "code":me._err[1]]
else
json = res.readRawString(res.length)
return $.json.decode(json)
end if
end
----------------------------------------
-- Sets the meta information for a photoset.
-- @param {string} photoset_id
-- @param {string} photoset_title
-- @return {propList}
----------------------------------------
on photoset_set_title (me, photoset_id, photoset_title)
param_obj = [:]
param_obj["format"] = "json"
param_obj["nojsoncallback"] = "1"
param_obj["method"] = "flickr.photosets.editMeta"
param_obj["photoset_id"] = photoset_id
param_obj["title"] = photoset_title
res = $.oauth.call_api("https://api.flickr.com/services/rest", param_obj, me._err)
if integerP(res) then
return ["stat": "fail", "curl_error":curl_error(res)]
else if me._err[1]<200 or me._err[1]>=300 then
return ["stat": "fail", "code":me._err[1]]
else
json = res.readRawString(res.length)
return $.json.decode(json)
end if
end
----------------------------------------
-- Sets the meta information for a photoset.
-- @param {string} photoset_id
-- @param {string} photoset_description
-- @return {propList}
----------------------------------------
on photoset_set_description (me, photoset_id, photoset_description)
param_obj = [:]
param_obj["format"] = "json"
param_obj["nojsoncallback"] = "1"
param_obj["method"] = "flickr.photosets.editMeta"
param_obj["photoset_id"] = photoset_id
param_obj["description"] = photoset_description
res = $.oauth.call_api("https://api.flickr.com/services/rest", param_obj, me._err)
if integerP(res) then
return ["stat": "fail", "curl_error":curl_error(res)]
else if me._err[1]<200 or me._err[1]>=300 then
return ["stat": "fail", "code":me._err[1]]
else
json = res.readRawString(res.length)
return $.json.decode(json)
end if
end
----------------------------------------
-- Gets information about a photo. The calling user must have permission to view the photo.
-- @param {string} photo_id
-- @return {propList}
----------------------------------------
on photo_get_info (me, photo_id)
param_obj = [:]
param_obj["format"] = "json"
param_obj["nojsoncallback"] = "1"
param_obj["method"] = "flickr.photos.getInfo"
param_obj["photo_id"] = photo_id
res = $.oauth.call_api("https://api.flickr.com/services/rest", param_obj, me._err)
if integerP(res) then
return ["stat": "fail", "curl_error":curl_error(res)]
else if me._err[1]<200 or me._err[1]>=300 then
return ["stat": "fail", "code":me._err[1]]
else
json = res.readRawString(res.length)
return $.json.decode(json)
end if
end
----------------------------------------
-- Retrieves a list of EXIF/TIFF/GPS tags for a given photo. The calling user must have permission to view the photo.
-- @param {string} photo_id
-- @return {propList}
----------------------------------------
on photo_get_exif (me, photo_id)
param_obj = [:]
param_obj["format"] = "json"
param_obj["nojsoncallback"] = "1"
param_obj["method"] = "flickr.photos.getExif"
param_obj["photo_id"] = photo_id
res = $.oauth.call_api("https://api.flickr.com/services/rest", param_obj, me._err)
if integerP(res) then
return ["stat": "fail", "curl_error":curl_error(res)]
else if me._err[1]<200 or me._err[1]>=300 then
return ["stat": "fail", "code":me._err[1]]
else
json = res.readRawString(res.length)
return $.json.decode(json)
end if
end
----------------------------------------
-- Returns the available sizes for a photo. The calling user must have permission to view the photo.
-- @param {string} photo_id
-- @return {propList}
----------------------------------------
on photo_get_sizes (me, photo_id)
param_obj = [:]
param_obj["format"] = "json"
param_obj["nojsoncallback"] = "1"
param_obj["method"] = "flickr.photos.getSizes"
param_obj["photo_id"] = photo_id
res = $.oauth.call_api("https://api.flickr.com/services/rest", param_obj, me._err)
if integerP(res) then
return ["stat": "fail", "curl_error":curl_error(res)]
else if me._err[1]<200 or me._err[1]>=300 then
return ["stat": "fail", "code":me._err[1]]
else
json = res.readRawString(res.length)
return $.json.decode(json)
end if
end
----------------------------------------
-- Returns URL of photo with specified size (photo label) available sizes for a photo.
-- @param {string} photo_id
-- @param {string} photo_label
-- @return {propList}
----------------------------------------
on photo_get_url (me, photo_id, photo_label)
res = me.photo_get_sizes(photo_id)
if res["stat"]<>"ok" then
return res
end if
repeat with s in res["sizes"]["size"]
if s["label"] = photo_label then
res["url"] = s["source"]
return res
end if
end repeat
return ["stat": "fail"]
end
----------------------------------------
-- Sets the meta information for a photo.
-- @param {string} photo_id
-- @param {string} photo_title
-- @return {propList}
----------------------------------------
on photo_set_title (me, photo_id, photo_title)
param_obj = [:]
param_obj["format"] = "json"
param_obj["nojsoncallback"] = "1"
param_obj["method"] = "flickr.photos.setMeta"
param_obj["photo_id"] = photo_id
param_obj["title"] = photo_title
res = $.oauth.call_api("https://api.flickr.com/services/rest", param_obj, me._err)
if integerP(res) then
return ["stat": "fail", "curl_error":curl_error(res)]
else if me._err[1]<200 or me._err[1]>=300 then
return ["stat": "fail", "code":me._err[1]]
else
json = res.readRawString(res.length)
return $.json.decode(json)
end if
end
----------------------------------------
-- Sets the meta information for a photo.
-- @param {string} photo_id
-- @param {string} photo_description
-- @return {propList}
----------------------------------------
on photo_set_description (me, photo_id, photo_description)
param_obj = [:]
param_obj["format"] = "json"
param_obj["nojsoncallback"] = "1"
param_obj["method"] = "flickr.photos.setMeta"
param_obj["photo_id"] = photo_id
param_obj["description"] = photo_description
res = $.oauth.call_api("https://api.flickr.com/services/rest", param_obj, me._err)
if integerP(res) then
return ["stat": "fail", "curl_error":curl_error(res)]
else if me._err[1]<200 or me._err[1]>=300 then
return ["stat": "fail", "code":me._err[1]]
else
json = res.readRawString(res.length)
return $.json.decode(json)
end if
end
----------------------------------------
-- Adds tags to a photo.
-- @param {string} photo_id
-- @param {string} tags
-- @return {propList}
----------------------------------------
on photo_add_tags (me, photo_id, tags)
param_obj = [:]
param_obj["format"] = "json"
param_obj["nojsoncallback"] = "1"
param_obj["method"] = "flickr.photos.addTags"
param_obj["photo_id"] = photo_id
param_obj["tags"] = tags
res = $.oauth.call_api("https://api.flickr.com/services/rest", param_obj, me._err)
if integerP(res) then
return ["stat": "fail", "curl_error":curl_error(res)]
else if me._err[1]<200 or me._err[1]>=300 then
return ["stat": "fail", "code":me._err[1]]
else
json = res.readRawString(res.length)
return $.json.decode(json)
end if
end
----------------------------------------
-- Removes a tag from a photo.
-- @param {string} photo_id
-- @param {string} tag_id
-- @return {propList}
----------------------------------------
on photo_remove_tag (me, photo_id, tag_id)
param_obj = [:]
param_obj["format"] = "json"
param_obj["nojsoncallback"] = "1"
param_obj["method"] = "flickr.photos.removeTag"
param_obj["photo_id"] = photo_id
param_obj["tag_id"] = tag_id
res = $.oauth.call_api("https://api.flickr.com/services/rest", param_obj, me._err)
if integerP(res) then
return ["stat": "fail", "curl_error":curl_error(res)]
else if me._err[1]<200 or me._err[1]>=300 then
return ["stat": "fail", "code":me._err[1]]
else
json = res.readRawString(res.length)
return $.json.decode(json)
end if
end
----------------------------------------
-- Deletes a photo from flickr.
-- @param {string} photo_id
-- @return {propList}
----------------------------------------
on photo_delete (me, photo_id)
param_obj = [:]
param_obj["format"] = "json"
param_obj["nojsoncallback"] = "1"
param_obj["method"] = "flickr.photos.delete"
param_obj["photo_id"] = photo_id
res = $.oauth.call_api("https://api.flickr.com/services/rest", param_obj, me._err)
if integerP(res) then
return ["stat": "fail", "curl_error":curl_error(res)]
else if me._err[1]<200 or me._err[1]>=300 then
return ["stat": "fail", "code":me._err[1]]
else
json = res.readRawString(res.length)
return $.json.decode(json)
end if
end
----------------------------------------
-- Returns photo of specified flavor (size label) as byteArray.
-- @param {string} photo_id
-- @param {string} photo_label
-- @param {symbol} [progress_callback]
-- @param {object} [progress_target]
-- ASYNC MODE (OPTIONAL):
-- @param {symbol} [result_callback]
-- @param {object} [result_target]
-- @param {propList} [custom_data]
-- @return {bytearray|VOID}
----------------------------------------
on photo_get_bytes (me, photo_id, photo_label, progress_callback, progress_target, result_callback, result_target, custom_data)
u = me.photo_get_url(photo_id, photo_label)
if u["stat"]<>"ok" then
if symbolP(result_callback) then
if voidP(result_target) then
result_target = _movie
end if
call(result_callback, result_target, u)
else
return u
end if
end if
ch = $.curl.init()
if me._verbose then
ch.setOption($.curl.CURLOPT.VERBOSE, 1)
end if
ch.setOption($.curl.CURLOPT.URL, u["url"])
if symbolP(progress_callback) then
ch.setOption($.curl.CURLOPT.NOPROGRESS, 0)
if voidP(progress_target) then
progress_target = _movie
end if
ch.setProgressCallback(progress_callback, progress_target)
end if
if symbolP(result_callback) then
-- ASYNC
if voidP(custom_data) then
custom_data = [:]
end if
custom_data[#result_callback] = result_callback
if voidP(result_target) then
result_target = _movie
end if
custom_data[#result_target] = result_target
custom_data[#url] = u["url"]
$.curl.execAsyncDetached(ch, #_photo_get_bytes_received, me, 1, custom_data)
else
-- SYNC
res = ch.exec(1)
if integerP(res) then
return ["stat": "fail", "curl_error":curl_error(res)]
end if
response_code = integer(ch.getInfo($.curl.CURLINFO.RESPONSE_CODE))
if response_code<200 or response_code>=300 then
return ["stat": "fail", "code":response_code]
end if
return ["stat":"ok", "url":u["url"], "data":res]
end if
end
----------------------------------------
-- @callback
----------------------------------------
on _photo_get_bytes_received (me, res, ch, custom_data)
if integerP(res) then
return call(custom_data.result_callback, custom_data.result_target, ["stat": "fail", "curl_error":curl_error(res)])
end if
response_code = integer(ch.getInfo($.curl.CURLINFO.RESPONSE_CODE))
if response_code<200 or response_code>=300 then
return call(custom_data.result_callback, custom_data.result_target, ["stat": "fail", "code":response_code])
end if
call(custom_data.result_callback, custom_data.result_target, ["stat":"ok", "url":custom_data.url, "data":res])
end
----------------------------------------
-- Downloads a photo of specified flavor (size label).
-- @param {string} photo_id
-- @param {string} photo_label
-- @param {string} target_file
-- @param {symbol} [progress_callback]
-- @param {object} [progress_target]
-- ASYNC MODE (OPTIONAL):
-- @param {symbol} [result_callback]
-- @param {object} [result_target]
-- @param {propList} [custom_data]
-- @return {bytearray|VOID}
----------------------------------------
on photo_download (me, photo_id, photo_label, target_file, progress_callback, progress_target, result_callback, result_target, custom_data)
u = me.photo_get_url(photo_id, photo_label)
if u["stat"]<>"ok" then
if symbolP(result_callback) then
if voidP(result_target) then
result_target = _movie
end if
call(result_callback, result_target, u)
else
return u
end if
end if
ch = $.curl.init()
if me._verbose then
ch.setOption($.curl.CURLOPT.VERBOSE, 1)
end if
ch.setOption($.curl.CURLOPT.URL, u["url"])
ch.setDestinationFile(target_file)
if symbolP(progress_callback) then
ch.setOption($.curl.CURLOPT.NOPROGRESS, 0)
if voidP(progress_target) then
progress_target = _movie
end if
ch.setProgressCallback(progress_callback, progress_target)
end if
if symbolP(result_callback) then
-- ASYNC
if voidP(custom_data) then
custom_data = [:]
end if
custom_data[#result_callback] = result_callback
if voidP(result_target) then
result_target = _movie
end if
custom_data[#result_target] = result_target
custom_data[#target_file] = target_file
custom_data[#url] = u["url"]
$.curl.execAsyncDetached(ch, #_photo_download_received, me, 0, custom_data)
else
-- SYNC
res = ch.exec(0)
if res<>0 then
$.file.delete(target_file)
return ["stat": "fail", "curl_error":curl_error(res)]
end if
response_code = integer(ch.getInfo($.curl.CURLINFO.RESPONSE_CODE))
if response_code<200 or response_code>=300 then
$.file.delete(target_file)
return ["stat": "fail", "code":response_code]
end if
return ["stat":"ok", "url":u["url"]]
end if
end
----------------------------------------
-- @callback
----------------------------------------
on _photo_download_received (me, res, ch, custom_data)
if res<>0 then
$.file.delete(custom_data.target_file)
return call(custom_data.result_callback, custom_data.result_target, ["stat": "fail", "curl_error":curl_error(res)])
end if
response_code = integer(ch.getInfo($.curl.CURLINFO.RESPONSE_CODE))
if response_code<200 or response_code>=300 then
$.file.delete(custom_data.target_file)
return call(custom_data.result_callback, custom_data.result_target, ["stat": "fail", "code":response_code])
end if
call(custom_data.result_callback, custom_data.result_target, ["stat":"ok", "url":custom_data.url, "file":custom_data.target_file], ch, custom_data)
end
----------------------------------------
-- Downloads original photo - which can be either JPG, PNG or GIF - to target folder.
-- @param {string} photo_id
-- @param {string} photo_label
-- @param {string} target_folder
-- @param {symbol} [progress_callback]
-- @param {object} [progress_target]
-- ASYNC MODE (OPTIONAL):
-- @param {symbol} [result_callback]
-- @param {object} [result_target]
-- @param {propList} [custom_data]
-- @return {bytearray|VOID}
----------------------------------------
on photo_download_original (me, photo_id, target_folder, progress_callback, progress_target, result_callback, result_target, custom_data)
u = me.photo_get_url(photo_id, "Original")
if u["stat"]<>"ok" then
if symbolP(result_callback) then
if voidP(result_target) then
result_target = _movie
end if
call(result_callback, result_target, u)
else
return u
end if
end if
od = _player.itemDelimiter
_player.itemDelimiter = "."
file_type = the last item of u["url"]
_player.itemDelimiter = od
target_file = target_folder & "\" & photo_id & "." & file_type
ch = $.curl.init()
if me._verbose then
ch.setOption($.curl.CURLOPT.VERBOSE, 1)
end if
ch.setOption($.curl.CURLOPT.URL, u["url"])
ch.setDestinationFile(target_file)
if symbolP(progress_callback) then
ch.setOption($.curl.CURLOPT.NOPROGRESS, 0)
if voidP(progress_target) then
progress_target = _movie
end if
ch.setProgressCallback(progress_callback, progress_target)
end if
if symbolP(result_callback) then
-- ASYNC
if voidP(custom_data) then
custom_data = [:]
end if
custom_data[#result_callback] = result_callback
if voidP(result_target) then
result_target = _movie
end if
custom_data[#result_target] = result_target
custom_data[#target_file] = target_file
custom_data[#url] = u["url"]
$.curl.execAsyncDetached(ch, #_photo_download_received, me, 0, custom_data)
else
-- SYNC
res = ch.exec(0)
if res<>0 then
$.file.delete(target_file)
return ["stat": "fail", "curl_error":curl_error(res)]
end if
response_code = integer(ch.getInfo($.curl.CURLINFO.RESPONSE_CODE))
if response_code<200 or response_code>=300 then
$.file.delete(target_file)
return ["stat": "fail", "code":response_code]
end if
return ["stat":"ok", "url":u["url"], "file":target_file]
end if
end
----------------------------------------
-- Uploads a photo to specified photo set.
-- @param {string} photoset_id - EMPTY for no set
-- @param {string} photo_file
-- @param {symbol} [progress_callback]
-- @param {object} [progress_target]
-- ASYNC MODE (OPTIONAL):
-- @param {symbol} [result_callback]
-- @param {object} [result_target]
-- @param {propList} [custom_data]
-- @return {propList|VOID}
----------------------------------------
on photo_upload (me, photoset_id, photo_file, progress_callback, progress_target, result_callback, result_target, custom_data)
param_obj = [:]
param_obj["format"] = "json"
param_obj["nojsoncallback"] = "1"
base_url = "https://up.flickr.com/services/upload/"
sig = $.oauth.get_signature(base_url, $.oauth.build_query(param_obj), "post")
ch = $.curl.init()
if me._verbose then
ch.setOption($.curl.CURLOPT.VERBOSE, 1)
end if
ch.setOption($.curl.CURLOPT.URL, base_url)
ch.setOption($.curl.CURLOPT.SSL_VERIFYPEER, 0)
-- create a form list
form = []
cnt = param_obj.count
repeat with i = 1 to cnt
section = [:]
section.addProp($.curl.CURLFORM.COPYNAME, param_obj.getPropAt(i))
section.addProp($.curl.CURLFORM.COPYCONTENTS, string(param_obj[i]))
form.add(section)
end repeat
section = [:]
section.addProp($.curl.CURLFORM.COPYNAME, "oauth_signature")
section.addProp($.curl.CURLFORM.COPYCONTENTS, sig)
form.add(section)
section = [:]
section.addProp($.curl.CURLFORM.COPYNAME, "photo")
section.addProp($.curl.CURLFORM.FILE, photo_file)
form.add(section)
ch.setOption($.curl.CURLOPT.POST, 1)
ch.setForm(form)
if symbolP(progress_callback) then
ch.setOption($.curl.CURLOPT.NOPROGRESS, 0)
if voidP(progress_target) then
progress_target = _movie
end if
ch.setProgressCallback(progress_callback, progress_target)
end if
if symbolP(result_callback) then
-- ASYNC
if voidP(custom_data) then
custom_data = [:]
end if
custom_data[#photoset_id] = photoset_id
custom_data[#result_callback] = result_callback
if voidP(result_target) then
result_target = _movie
end if
custom_data[#result_target] = result_target
$.curl.execAsyncDetached(ch, #_photo_upload_received, me, 1, custom_data)
else
-- SYNC
res = ch.exec(1)
if integerP(res) then
return ["stat": "fail", "curl_error":curl_error(res)]
end if
response_code = integer(ch.getInfo($.curl.CURLINFO.RESPONSE_CODE))
if response_code<200 or response_code>=300 then
return ["stat": "fail", "code":response_code]
end if
res = res.readRawString(res.length)
$.xmlparser.parseString(res)
err = $.xmlparser.getError()
if not voidP(err) then
return ["stat": "fail", "xml_error":err]
end if
res = $.xmlparser.makeSimplePropList($.xmlparser.makePropList(), TRUE)
stat = res[#rsp][#__attributes][#stat]
if stat<>"ok" then
return ["stat": "fail"]
end if
if photoset_id<>EMPTY then
return me.photoset_add_photo(photoset_id, res[#rsp][#photoid])
else
return ["stat": "ok"]
end if
end if
end
----------------------------------------
-- @callback
----------------------------------------
on _photo_upload_received (me, res, ch, custom_data)
if integerP(res) then
return call(custom_data.result_callback, custom_data.result_target, ["stat": "fail", "curl_error":curl_error(res)])
end if
response_code = integer(ch.getInfo($.curl.CURLINFO.RESPONSE_CODE))
if response_code<200 or response_code>=300 then
return call(custom_data.result_callback, custom_data.result_target, ["stat": "fail", "code":response_code])
end if
res = res.readRawString(res.length)
$.xmlparser.parseString(res)
err = $.xmlparser.getError()
if not voidP(err) then
call(custom_data.result_callback, custom_data.result_target, ["stat": "fail", "xml_error":err])
end if
res = $.xmlparser.makeSimplePropList($.xmlparser.makePropList(), TRUE)
stat = res[#rsp][#__attributes][#stat]
if stat<>"ok" then
return call(custom_data.result_callback, custom_data.result_target, ["stat": "fail"])
end if
if custom_data.photoset_id<>EMPTY then
res = me.photoset_add_photo(custom_data.photoset_id, res[#rsp][#photoid])
call(custom_data.result_callback, custom_data.result_target, res)
else
call(custom_data.result_callback, custom_data.result_target, ["stat": "ok"])
end if
end