Сжимаем файлы посредством Kraken.IO (Groovy)

· На чтение уйдёт 1 минута · (208 слов)

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)
}
Полезное