Flash to Html5 или тайное api Swiffy
Всем привет. Думаю, ни для кого не секрет, что 1 сентября (то есть завтра) гугл останавливает в хроме воспроизведение периферийного flash-контента. Иными словами, flash-баннеры перестают запускаться без прямого указания пользователя (каковое вряд ли последует). Поэтому имеет смысл начинать переходить на так называемые html5-баннеры. А чтобы смягчить переход, надо конвертировать flash в html5.
Многие знают, что у гугла есть сервис для такой конвертации — Swiffy. Однако он существует либо как веб-приложение, либо как расширение к Flash Professional. Никакого публичного api (а тем более его документации) вроде как нет. Однако это не так.
Если внимательно присмотреться к расширению swiffy для flash, то можно заметить, что оно работает с с веб-сервисом google. А раз оно работает, то и мы попробуем. Достаточно послать на определённый url post-запрос с json-объектом:
{
apiVersion : "v1",
method : "swiffy.convertToHtml",
params : {
client = "Swiffy Flash Extension",
input = "base64Data"
}
}
где в поле input пишем закодированный base64 flash-контент. И надо не забыть в base64-кодировке заменить '+' на '-' и '/' на '_' для url safe формата.
Если всё хорошо то в ответ мы получим такой объект:
{
result : {
response : {
version : "api version",
status: "SUCESS",
output: "base64response"
}
}
}
Если произошла ошибка, ответ будет таким:
{
error : {
message: "Сообщение об ошибке"
}
}
где version — номер версии api swiffy, a output — закодированный base64 ответ. На нём остановимся.
Во-первых, для декодирования надо не забыть произвести обратную замену '-' на '+' и '_' на '/'. Далее необходимо по надобности (чтобы размер был кратен 4) добавить 1 или 2 символа '='(как указание на лишний нулевой байт). Теперь можно и раскодировать. Однако это ещё не всё. Раскодировав, мы не получим html-код, а получим gzip-архив с html-кодом. После распаковки, у нас наконец-то будет html — эквивалент (хотелось бы так думать) загруженной флешки.
Есть реализация для всего этого в npm-пакете: swiffy-convert от Rafael Belvederese.
Для .net я написал небольшую библиотечку: jdart.swiffy, которая доступна через nuget-пакет.
Использовать её очень просто:
var swf = File.ReadAllBytes("sample.swf");
var swiffyClient = new SwiffyClient();
string html5page = await swiffyClient.ConvertToHtml5Async(swf);
File.WriteAllBytes("sample.html", Encoding.UTF8.GetBytes(html5page));
Используя данный подход можно быстро преобразовать большое число флешек, либо оставить поддержку flash в интерфейсе вашего продукта, где за кулисами будет производиться конвертирование. Не стоит забывать, что не все флешки получится конвертировать и это объективный риск.
Спасибо за внимание.