UserJS для воспроизведения H.264 в «Опере»

Существует плагин «DivX web player», который отлично подменяет тег «VIDEO», в случае, если должен быть использован кодек H.264, но браузер его не поддерживает.

К сожалению, в «Опере» он почему-то не работает. Я сделал UserJS, который, пользуясь этим плагином, подменяет видеотег, если у него указан тип «video/mp4». Все атрибуты он не переносит (я просто пока не столкнулся с тем, что это нужно), буду добавлять, если столкнусь. Кроме того, я подменяю метод «canPlayType», чтобы показать, что браузер H.264 поддерживает.

Самая засада — это тег «VIDEO» без размеров. Мне для поддержки этого приходтся запускать проигрывание и когда становятся доступны медиаданные, останавливать воспроизведение и переписывать размеры видео.

// ==UserScript==
// @name        XVid patch
// @author      Evgeny Stepanischev aka Bolk
// @version     1.00
// @namespace   /files/opera-xvid-patch.js
// @modified    2012-04-14
// @include     http://*
// ==/UserScript==

!function () {
    var htmlif = function (attr, attrname) {
        return attr ? attrname + '="' + attr + '" ' : '';
    }

    var patchtag = function (o, src) {
        var html = '<embed type="video/divx" '+
        'custommode="none" ';

        if (o.preload == 'auto') html += 'bufferingMode="full" '; else
        if (o.preload == 'none') html += 'bufferingMode="null" ';

        html += htmlif(o.poster, 'previewImage')+
                htmlif(o.id, 'id')+
                htmlif(o.name, 'name')+
                htmlif(src || o.src, 'src')+
                htmlif(o.controls ? 'full' : 'null', 'mode')+
                htmlif(o.width, 'width')+
                htmlif(o.height, 'height');

        if (!o.height || !o.width) {
            html += 'onloadedmetadata="this.width=this.videoWidth;this.height=this.videoHeight" ';
            html += htmlif(!o.autoplay && 'if (!this._sized) {this.pause(); this.currentTime=0; this._sized=1}', 'onplay');

            html += 'autoPlay=true ';
        } else {
            html += htmlif(o.autoplay ? 'true' : 'false', 'autoPlay');
        }

        html += 'pluginspage="http://go.divx.com/plugin/download/"></embed>';

        o.outerHTML = html;
    };

    var patch = function () {
        window.opera.addEventListener('BeforeScript', function() {

            with (window.HTMLVideoElement)
            if (prototype._canPlayType === undefined) {
                prototype._canPlayType = prototype.canPlayType;

                prototype.canPlayType = function (type) {
                    if (type.substr(0, 9) == 'video/mp4') {
                        return 'probably';
                    }

                    return this._canPlayType(type);
                }
            }

            !function() {
                var videos = document.getElementsByTagName('VIDEO');

                for (var i = 0, vl = videos.length; i<vl; i++) {
                    if (!videos[i]) continue;

                    if (videos[i].type && videos[i].type.substr(0, 9) == 'video/mp4') {

                    } else {
                        var sources = videos[i].getElementsByTagName('source');

                        var foundSupported = false, foundMP4 = false;

                        for (var j = 0, sl = sources.length; j < sl; j++) {
                            if (videos[i]._canPlayType(sources[j].type) !== '') {
                                foundSupported = true;
                                break;
                            }

                            if (sources[j].type.substr(0, 9) == 'video/mp4') {
                                foundMP4 = sources[j].src;
                            }
                        }

                        if (!foundSupported && foundMP4) {
                            patchtag(videos[i], foundMP4);
                        }
                    }
                }
            }();
        });
    };

    for (var i = 0, l = navigator.plugins.length; i < l; i++) {
        if (navigator.plugins[i].filename == 'DivXBrowserPlugin.plugin') {
            return patch();
        }
    }
}();

Добавлено: в комментариях справдливо указали на недостаток — перехватывать надо не только BeforeScript. Исправлять не буду до первого реального случая, когда где-то этого события не будет достаточно.

13 комментариев

Nuzhno vvesti bukvy

Не те буквы (17.36КиБ)

Регистрация на сайте какой-то авиакомпании (я столько билетов покупал в последнее время, что не помню какой). Ладно я догадался, что сайт за буквы только латиницу держит. А простые пользователи могут и не догадаться.

20 комментариев

Угадай закон

Минздравсоцразвития собирается внести законопроект о защите здоровья населения от табачного дыма, сообщается на Вести.ru… С 2014 года предлагается ввести запрет курения на рабочих местах в помещении, в общественном транспорте.

Пишет портал «ПроГород» и куча других изданий. Ммм? Что? Ещё 10 июля 2001 года был принят «Об ограничении курения табака» (№87-ФЗ) в статье №6 говорится:

Запрещается курение табака на рабочих местах, в городском и пригородном транспорте… за исключением курения табака в специально отведенных местах для курения табака

Из той же статьи:

— Мы надеемся, что Минздрав запретит еще и курение в подъездах, — сказал Дмитрий Янин, председатель правления Международной конфедерации обществ потребителей. — Пока закон не защищает нас от курящих соседей, из-за которых всем остальным приходится дышать дымом.

Как же не защищает? Курение в подъезде является нарушением п. 9.1 СанПин 2.1.2.1002-00 «Санитарно-эпидемиологические требования к жилым зданиям и помещениям». Наказание — штраф.

47 комментариев

ФлешБэк

Все уже знают о существовании ботнета из полумиллиона «Маков»?

Проверить не заражён ли ваш «Мак» можно на специальном сайте. Я написал небольшой скрипт, который надо запускать из консоли, если лень шариться по менюшкам в поисках UUID вашей машины:

#!/bin/bash

UUID=$(/usr/sbin/system_profiler SPHardwareDataType | /usr/bin/awk '/UUID/ {print $3}')
result=$(/usr/bin/curl "http://flashbackcheck.com/check/?uuid=$UUID" 2>&-)

echo -n "Your system status is "

case "$result" in
    "")    echo NA.;;
    clean) echo -e "\033[1;32mclean.\033[0m";;
    *)     echo -e "\033[1;31minfected.\033[0m";;
esac

Либо можно сразу скачать его на запуск с «Гитхаба»:

curl -s https://raw.github.com/bolknote/shellgames/master/checkflashback.sh | /bin/bash

У меня компьютер чистый.

15 комментариев

Работа с камерой и распознавание чисел в «Опере»

Распозновалка (43.68КиБ)

Я вчера заморочился на отличненько. Мне показалось скучным и грустным вводить цифры счёта за квартиру в окошко «Госуслуг» и решил сделать автоматическую распознавалку чисел, попутно изучив работу с камерой из браузера.

Доступ к камере — эксперментальный стандарт, поэтому мало кто из браузеров может им похвастаться, я использовал специальный билд «Opera-Labs-Camera», который можно взять с сайта снапшотов «Оперы». Работать мой пример, соответственно, будет только там.

АПИ оказалось несложным. Всё, что нужно сделать — соединить специальным образом тег VIDEO с источником стримового видео; потом я 10 раз в секунд забираю кадр с видео и кладу в CANVAS (на скриншоте он цветной), оттуда вырезаю небольшую область, перевожу в градации серого, беру за порог 75% от усреднённого цвета и перевожу всё в ч/б.

Больше всего из трёх часов, которые у меня ушли на это, я делал распознование цифр. Алгоритмы, которые я нашёл в интернете, были очень монструозными, да и переписывать готовое было скучно, поэтом я перепробовал несколько вариантов, которые пришли мне в голову.

В итоге, лучше всех распознаёт следующий алгоритм.

Сначала я очевидным образом разбиваю изображение на цифры, потом условно разделяю каждую цифру вертикальной линией по середине. Слева и справа от линий считаю количество переходов между чёрным и белым, двигаясь сверху вниз. Получаются комбинации из пар чисел. Я их прореживаю — одинаковые последовательно идущие заменяю на одно значение.

Получаются цепочки, которые уже достаточно хорошо характеризуют цифру, правда некоторые цифры этот паттерн не в состоянии распознать. Поэтому я считаю количетсво ч/б переходов ещё и по моей умозрительной вертикальной линии.

На скриншоте в большом текстовом поле записаны получившиеся комбинации. Первое — номер по порядку, далее (через двоеточие) — количество переходов по вертикали и потом описанная последовательность. Например, «ноль» записывается как «2:11» (два перехода по вертикали, потом одинаковые переходы по разу слева и справа разделительной линии).

Алгоритм «шумит», из-за того, что дрожит рука с бумагой, из-за освещения. Поэтому я накапливаю статистику и указываю ту цифру, которая в этом позиции распозначалась больше других. Статистику сбрасываю, если количество объектов на экране изменилось.

9 комментариев

Переход на «Гоу 1»

С выходом первой версии языка программирования «Гоу» посмотрел как компилируются мои программы. Не компилируются никак. Весь набор утилит поменяли, теперь всё делается через утилиту «go». С одной стороны хорошо — раньше, чтобы просто запутсить код нужно было много танцев проделать, а сейчас «go run code.go», и всё, он работает.

С другой стороны, мне все make-файлы придётся переписать, надо ещё разобраться как всё теперь работает, но самое плохое вот что:

Finally, the Go tool chain (compilers, linkers, build tools, and so on) are under active development and may change behavior. This means, for instance, that scripts that depend on the location and properties of the tools may be broken by a point release.

Для тех, кто не понимает английский — набор утилит «Гоу» находится в стадии разработки и ещё может измениться. Это плохо очень. Я не хотел бы с выходом каждой новой версии смотреть не сломалось ли у меня что-то.

4 комментария

Казань ✈ Москва ✈ Бангкок → Паттайя → Бангкок ✈ Москва ✈ Казань

Ура, удалось вырваться в короткий отпуск (загруженность высокая, поэтому и пишу «вырваться»). С 7 по 15 мая будем в Паттайе (Таиланд) в отеле «Шератон» 5★. Это относительно новый отель с собственными пляжем, номер будет с видом на море.

Шератон Паттайя (113.62КиБ)

Снимок взят с сайта отеля.

15 комментариев

ДОСбокс и «Гопник»

Когда-то мне нравилась незамысловатая ДОС-игра «Гопник» (там аж две части было), решил показать ребятам с работы что это такое. Было бы просто это сделать, будь у меня компьютер в «Виндоуз», но у меня «Мак».

Вспомнил, что есть такая штука как DOSBox («ДОСбокс»), позволяет запускать ДОС-игры под другими операционками.

«Гопник» под «Мак» (16.50КиБ)

Чтобы её поставить под «Мак», сначала надо установить «хоумбрю» (если у вас его ещё нет), потом в консоли последовательно набрать:

brew tap homebrew/games
brew install dosbox
# долго скачиваются разные штуки, ставятся библиотеки
sed -ie 's/keyboardlayout=auto/keyboardlayout=RU/' "$(dosbox -printconf)"
# заменяем кодировку на русскую, иначе будут проблемы со шрифтами
dosbox
# запускаем ДОСБокс, там пишем:
mount c /каталог на диске где у вас игры
# переходим на диск C:
C:
# запускаем игру
gopnik.exe

Готово, теперь у вас в окне искомая игра.

12 комментариев

strrev для UTF-8

В ходе обсуждения одной книге на «Хабре» придумал как развернуть строку UTF-8. Просто так её не перевернёшь — строка многобайтная, порядок байт важен.

Вот что я придумал: перевожу в двухбайтную кодировку UTF-16 с одним порядком байт, потом «strrev» переворачивает байты, а потом я конвертирую из кодировки с обратным порядков байт:

$test = 'А роза упала на лапу Азора ウィキ';

$test = iconv('utf-8', 'utf-16le', $test);
$test = strrev($test);
// キィウ арозА упал ан алапу азор А
echo iconv('utf-16be', 'utf-8', $test);

56 комментариев

0,(9) апреля

Каждый год, первого апреля, увеличивается количество мусора. Потом десятилетиями в интернете болтаются статьи, выпущенные в этот день, но читатели уже не обращают внимание на дату. Так становится больше слухов, искажений, непроверенных фактов и просто вранья, которое рождалось как шутка.

Особенно грустно, когда этим занимаются новостные издания, которым остальные 360 с гаком дней в году читатель привыкает верить.

Просто замечательно, когда авторы проекта продумывают шутку так, чтобы встретив её в любой другой день в году, посетитель догадаться бы, что это шутка, например, «Яндекс.Карты» сделали панораму Марианской впадины, это здорово (в специальном посте на «Хабре» собираются шутки со всего интернета).

Но моё сердце отдано картам «Гугла», эти ребята сделали карты в стиле старых «восьмибитных» игр, волшебно.

Восьмибитные карты (186.85КиБ)

Ну а я первого апреля традиционно серьёзен, как стадо бизонов.

8 комментариев

Мой прапрадед

У меня есть пока единственная фотография моего прапрадеда — Никанора Ивановича Литвинова. Судя по дате рождения его дочери, моей прабабушки, он родился где-то в 1870-80 гг.

Фотография подписана им собственноручно (если я правильно понимаю) и я знаю, что где-то, по родственникам есть минимум ещё одна его фотография, собираюсь её найти.

На обратной стороне открытки рукописная надпись: «На память в честь Евдокии Никоновой. От Никитора Иванова».
Литвинов Н. И.

Согласно «Статистическому ежегоднику Россіи» за 1913 год, показатель грамотности для мужчин в России на 1897 год был 29,3. Это те, кто умели читать. Писать должно было уметь меньшее количество. Правда в крупных городах этот показатель был сильно выше, например в Питере аж 65,2%, но мой предок жил, судя по тому что я знаю, в каком-то селе.

Тем более вызывает уважение, что мой прапрадед умел писать, причём не каракулями, а нормальным почерком, то есть имел к этому привычку.

7 комментариев

Что это было вообще?

После представления в самом большом , концертном зале Цюриха — «Корсо» о нем говорил весь город. Ассистент втыкал ему в грудь и спину кинжалы и рапиры, а он абсолютно не реагировал на это…

Вот как описал его выступление перед студентами-медиками один из очевидцев: «Мирин Дажо, голый по пояс, молча стоит в центре комнаты. Ассистент очень быстро подходит сзади и вонзает в него 80-сантиметровую рапиру куда-то в область почек. Гробовая тишина. Студенты и преподаватели сидят с раскрытыми ртами, не в силах поверить своим глазам.Сомнений нет: клинок прошел через тело, кончик торчит спереди. Самое удивительное — даже не невозмутимость Дажо, а то, что на его теле нет ни капли крови…»

Это цитата из описания другого ролика на «Ютубе» про него же.

28 комментариев

Лингвистические открытия

Вчера услышал в аэропорту «договариваться надо на берегу, а на середине реки веслами махать». Не подозревал, что у этой фразы есть продолжение.

— Так же и пропащая душа, Саша Антипов, — сказала Сусанна. — Надеюсь, вы не имеете ничего против друг друга? Или, как теперь говорят, вы монтируетесь?

Из книги «Время и место» Юрия Трифонова, книга 1981 года. Не уверен, кто когда-либо слышал, чтобы слово «монтироваться» употребляли в этом ключе.

Открытие старое, но запишу сюда тоже. Оказывается «байховый» не означает «взятый с бахчи», как думают многие (и как я думал):

Слово pekoe происходит от тайваньского слова 白毫, пѐк-хо (бай хао), — «белый пух». Отсюда и русское слово «байховый». Таким образом, «пекой» — это чай из почек и листьев, на которых есть эти ворсинки.

11 комментариев

Гоу вышел

Today marks a major milestone in the development of the Go programming language. We’re announcing Go version 1, or Go 1 for short, which defines a language and a set of core libraries to provide a stable foundation for creating reliable products, projects, and publications.

Появился релиз языка «Гоу». Это означает, что язык стабилизировался и обратную совместимость ломать больше не будут.

Оставить комментарий

Ребус

Ребус (1.76КиБ)

Вот, ребус придумался. Поймёт кто-нибудь?

6 комментариев

«Не держите его так»

В фирме, которая выпускает программный продукт «ВИПнет» (сертифицированный, защищённый VPN, с алгоритмами ГОСТ) рассказали, что пытались договориться с «Эпл», чтобы встроить свой продукт в «Айпад» или распространять его для корпоративного сектора каким-то ещё образом. В «Эпстор» «ВИПнет» не пускают — приложению нужен слишком широкий доступ к устройству.

Думаю, никому не надо рассказывать о важности защищённых каналов связи, о том, что корпоративному сектору нужно защищать свою информацию (а «ВИПнет» очень хорош как продукт с любой точки зрения).

Но в «Эпле» решили, что у клиентов необходимости в этой реализации VPN для «Айпада» нет.

Из штаб-квартиры пришло письмо. В нём три фото — Медведев с «Айпадом», с «Айфоном» и «Макбуком», и подпись: «если руководитель вашей страны может работать с нашими продуктами, то почему остальные не могут?».

29 комментариев

Шутки про технологии

abeshkov: Знаю отличную шутку про UDP, но не факт что она до вас дойдет. :)  n1313: про технологии шутим, да? Ну вот я знаю того, кто знает отличную шутку про DNS.  bolk: n1313, но ты не уверен, правильно ли помнишь?  n1313: чем дальше, тем сильнее, да. Но если что, я переспрошу.

16 комментариев

Кабинетный портрет

Я как-то писал о старой фотографии, которую нашёл у родственников в Сергиевске.

На фотографии никаких надписей, но на картонке, на которую она наклеена, написано «Cabinet Portrait». Я надеялся, что это название ателье, оказалось всё проще.

«Cabinet Portrait» («кабинетный портрет») — распространённый когда-то формат фотопродукции 16,5×11,5 см (4½×6½ дюйма). Картонка, на которую наклеено фото называлась паспарту (Passe-partout), само фото имело размер примерно 10×14 см (4×5½ дюйма).

Кабинетные портреты впервые появились в Англии, в 1866 году, затем в США и постепенно распространились по всему миру.

Лого на картонке, как правило, относилось к её производителю. Впрочем иногда там бывали и реквизиты ателье, а некоторые известные фотографы клеили фотографии на именные паспарту.

Лого фабрики (34.75КиБ)

Мне повезло меньше — у меня стандартное паспарту какой-то фабрики. Причём фабрики печатали их в таком объёме и так широко продавали, что по логотипу в общем случае невозможно сказать год выпуска и даже страну, где могла быть произведена фотография.

5 комментариев