Kraken.io это такой веб-сервис, который позволяет без потери качества уменьшить объём файлов картинок. Оптимизируются метаданные (и, возможно, стратегия сжатия в PNG, но насчёт последнего не уверен).
Сервис сделан некими поляками на Javascript (Node.js). API для работы с ним, в принципе, есть только для Node.js, но реализация работы несложна. Вот и я набросал скриптец для Groovy.
Соответственно, делюсь:
@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.5.2' )
@Grab(group='org.apache.httpcomponents', module='httpmime', version='4.2.1' )
@GrabExclude("org.codehaus.groovy:groovy")
import groovyx.net.http.*
import static groovyx.net.http.ContentType.*
import java.util.logging.*
import org.apache.http.entity.mime.content.*
import org.apache.http.entity.mime.*
import groovy.json.*
// Логи направим в консоль, но не будем сильно пакостить
def logger=Logger.getLogger('org.apache.http'); def consoleHandler=new ConsoleHandler(); logger.addHandler(consoleHandler);
logger.setLevel Level.WARNING; consoleHandler.setLevel Level.WARNING
def logger2=Logger.getLogger('groovyx.net.http'); logger2.setLevel Level.SEVERE
def krakenize = { file ->
ContentBody file1 = new ByteArrayBody(file.bytes, "application/octet-stream", file.name);
def http = new HTTPBuilder('https://api.kraken.io/file')
http.request(Method.POST) { req ->
requestContentType: "multipart/form-data"
MultipartEntity multiPartContent = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE)
multiPartContent.addPart("userFile", file1)
multiPartContent.addPart("auth", new StringBody('{"user":"username","pass":"password","apikey":"apikey"}'))
// Либо для тех, кто не любит создавать JSON своими руками
// def authMsg = new groovy.json.JsonBuilder([user: 'username', pass: 'password’, apikey: 'apikeyapikey']).toString()
req.setEntity(multiPartContent)
response.success = { resp, reader ->
if (reader.success && reader.savedBytes) {
file.bytes = reader.krakedURL.toURL().bytes
println "Success: $reader.savedBytes saved. Overwriting $file"
} else {
println "Failure: $reader"
}
}
}
}
Вызвать можно, например, так:
krakenize(new File("/path/to/file.jpg"))
Или даже так:
new File("/path/to/directory/").eachFile { x ->
if (x.isFile()) krakenize(x)
}