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 в интерфейсе вашего продукта, где за кулисами будет производиться конвертирование. Не стоит забывать, что не все флешки получится конвертировать и это объективный риск.

Спасибо за внимание.

© Habrahabr.ru