Created
October 10, 2012 08:05
-
-
Save 1999/3863943 to your computer and use it in GitHub Desktop.
Re-uploading photos from any site to Yandex.Fotki service
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var Request = { | |
init: function (token) { | |
this._uploadToken = token; | |
}, | |
load: function (url, params, onSuccess, onError, onProgress, onUploadProgress) { | |
if (typeof params === "function") { | |
onUploadProgress = onProgress; | |
onProgress = onError; | |
onError = onSuccess; | |
onSuccess = params; | |
params = {}; | |
} | |
var xhr = new XMLHttpRequest(); | |
if (params.responseType && params.responseType !== "json") | |
xhr.responseType = params.responseType; | |
params.method = params.method || "GET"; | |
xhr.open(params.method, url, true); | |
if (params.headers) { | |
for (var headerName in params.headers) { | |
xhr.setRequestHeader(headerName, params.headers[headerName]); | |
} | |
} | |
if (typeof onProgress === "function") { | |
xhr.addEventListener("progress", function (e) { | |
if (e.lengthComputable) { | |
var percents = Math.floor((e.loaded / e.total) * 100); | |
onProgress(percents); | |
} | |
}, false); | |
} | |
xhr.addEventListener("load", function() { | |
if (params.responseType) { | |
if (params.responseType !== "json") { | |
onSuccess(xhr.response, xhr.status); | |
} else { | |
try { | |
var json = JSON.parse(xhr.responseText); | |
} catch (e) { | |
console.log(e.message); | |
console.dir(e.stack); | |
console.log(xhr.responseText) | |
onError("Not JSON: " + xhr.responseText); | |
return; | |
} | |
onSuccess(json, xhr.status); | |
} | |
} else { | |
onSuccess(xhr.responseText, xhr.status); | |
} | |
}, false); | |
xhr.addEventListener("error", function () { | |
onError("XHR load error (status code " + xhr.status); | |
}, false); | |
var data = null; | |
if (params.data) { | |
if (params.data instanceof Object) { | |
if (params.multipart) { | |
data = new FormData; | |
for (var key in params.data) { | |
data.append(key, params.data[key]); | |
if (params.data[key] instanceof Blob) { | |
isUploadRequest = true; | |
} | |
} | |
} else { | |
data = []; | |
for (var key in params.data) { | |
data.push(encodeURIComponent(key) + "=" + encodeURIComponent(params.data[key])); | |
} | |
data = data.join("&"); | |
} | |
} else { | |
data = params.data; | |
} | |
} | |
if (params.data instanceof Object && params.multipart && typeof onUploadProgress === "function") { | |
xhr.upload.addEventListener("progress", function (e) { | |
if (e.lengthComputable) { | |
var percents = Math.floor((e.loaded / e.total) * 100); | |
onUploadProgress(percents); | |
} | |
}, false); | |
} | |
xhr.send(data); | |
}, | |
/** | |
* @param {String|Array} urls список URL фотографии | |
* @param {Function} onSuccess принимает: | |
* @param {Object} JSON-ответ Яндекс.Фоток | |
* | |
* @param {Function} onError принимает: | |
* @param {Number} код ошибки: | |
* 1 - ошибка загрузки фотографии ИЗ интернета НА локальным компьютер | |
* 2 - ошибка загрузки фотографии ИЗ интернета НА локальным компьютер (это не фотография) | |
* 3 - ошибка загрузки фотографии С локального компьютера НА Я.Фотки | |
* 4 - ошибка загрузки фотографии С локального компьютера НА Я.Фотки (неверный код ответа) | |
* | |
* @param {String} текст ошибки | |
*/ | |
upload: function (urls, onSuccess, onError) { | |
if ((urls instanceof Array) === false) { | |
urls = [urls]; | |
} | |
var self = this; | |
var picURL = urls.shift(); | |
var id = picURL.replace(/[^a-zA-Z0-9]+/g, ""); | |
this.load(picURL, { | |
responseType: "blob" | |
}, function (blob) { | |
if (/^image\//.test(blob.type) === false) { | |
if (urls.length) { | |
self.upload(urls, onSuccess, onError); | |
} else { | |
onError(2, picURL + " is not an image: " + blob.type); | |
} | |
} else { | |
self.load("https://api-fotki.yandex.ru/api/users/dmitry-sorin/photos/", { | |
method: "POST", | |
responseType: "json", | |
multipart: true, | |
headers: { | |
"Accept" : "application/json", | |
"Authorization" : "OAuth " + self._uploadToken | |
}, | |
data: { | |
image: blob, | |
disable_comments: "true", | |
pub_channel: "DayStory YaFotki Uploader", | |
app_platform: "Chrome App", | |
app_version: "1.0" | |
} | |
}, function (json, statusCode) { | |
if (statusCode !== 201) { | |
onError(4, "Wrong upload response code: " + statusCode); | |
} else { | |
onSuccess(json); | |
} | |
}, onError.bind(null, 3), null, function (prc) { | |
var elem = document.find("fieldset." + id); | |
if (elem !== null) { | |
elem.find("progress.upload").val(prc); | |
} | |
}); | |
} | |
}, onError.bind(null, 1), function (prc) { | |
var elem = document.find("fieldset." + id); | |
if (elem !== null) { | |
elem.find("progress.download").val(prc); | |
} | |
}); | |
}, | |
_uploadToken: null | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment