zemlan.in

Склепал линкблог

…из скуки и открытых стандартов

За годы своего существования, этот бложек пережил несколько инкарнаций — на Blogger’е, на WordPress’е, на nanograbbr’е1, на Tumblr’е…

Когда пришло время сползать с последнего, в центре внимания были статические генераторы вроде Jekyll, Hugo и Wintersmith. Они неплохие, но идея управлять контентом через Git/Github мне как-то не нравилась. Ещё и надо было бы что-то выдумывать с картинками и видео — не добавлять же их в Git2

В итоге напилил scroll — генератор с веб-мордой, который работает с парой sqlite баз и, кроме рендеринга markdown’а в HTML, хранит и конвертит картинки в blob’ах. Одних картинок оказалось мало и, когда понадобилось встраивать видео, научил генератор отображать ![](https://example.com/video.mp4) не как <img>, а как <video>. А где видео, там и Youtube, так что сделал под него special case, чтобы штуки вроде ![](https://www.youtube.com/watch?v=np3QLrHJmRA) заменялись на встроенный видеоплеер Ютуба

MARINA AND THE DIAMONDS - Obsessions [Official Music Video]
MARINA AND THE DIAMONDS - Obsessions [Official Music Video] • MARINA
Official Music Video | MARINA AND THE DIAMONDS - ObsessionsMy new album Love + Fear is out now - https://marina.lnk.to/loveandfearSubscribe to the MARINA You...

Затем захотелось встроить на страницу аудиоплеер Apple Music’а, но не хотелось самостоятельно писать подобные замены под каждый сайт. Хотелось…

embeds

…чтобы движок сам понимал, какую картинку показать, какой плеер загрузить. Благо, эта же хотелка была и у фейсбука с твиттером, которые убедили кучу сайтов и сервисов подобавлять на свои страницы <meta> теги с необходимой для красивых превьюшек информацией для реализации Open Graph’а. Мне же оставалось только распарсить всё это добро и сгенерировать подходящие <img>/<video>/<audio>/<iframe>

Чтобы не приходилось ждать внешних HTTP-запросов на каждую регенерацию сайта, неплохо было бы кэшировать ответы. Тут факт использования sqlite сильно упростил задачу — намного проще сохранять ответы в какую-никакую базу, а не в текстовые файлы, которые ещё надо было бы коммитить в репозиторий…

Так движок начал проверять content-type всех ![](типа картинок), сохранять og: теги (если это не картинка, а text/html), и генерировать красивые карточки на основе всех этих данных3. В результате, такой markdown:

- ![](https://open.spotify.com/track/7tyt9usWqEPPDbyL6CgBs4)
- ![](https://coub.com/view/2pc24rpb)
- ![](https://giphy.com/gifs/tiktok-dogs-puppy-cute-dog-l2uluGTvB7DAQvZyHp)

генерирует такой контент:

Может, стоит завернуть эту часть scroll’а в простенький сервис?.. 🤔

Всё в RSS

Параллельно, вне исходников scroll’а, начал собирать хоть сколько-то долгий контент в RSS. Я уже рассказывал про paperss, который генерирует фид из Instapaper’а. Кроме него, в RSS перетащил ещё и свои Youtube-подписки, подальше от заманчивых лабиринтов рекомендаций

И всё это время думал о том, как бы делиться хорошими ссылками. Не отличными, для которых не лень написать пять-десять слов описания и запостить в твиттер/слак, а именно хорошими. Feedbin, которым я синхронизирую RSS-подписки, позволяет отмечать записи звёздочками, из которых он даже генерирует отдельный RSS-фид

Это почти то, что мне нужно, но:

Ах если бы был способ красиво показать ссылки на другие сайты…

Наконец-таки линкблог

Подружив opengraph’овые “карточки” с Feedbin’овскими звёздочками, в которые входят статьи из Instapaper’а, получилась и простая в создании, и приятно выглядящая лента ссылок

Для меня, интерфейс работы с линкблогом полностью4 спрятан в RSS-ридере: читаю статьи и смотрю видео так же, как всегда, но теперь нажатие на ⭐️ менее бесполезное и создаёт немного работы для scroll’а, который:

Больше всего проблем было с тем, как же показывать линкблог на главной странице — стандартные карточки слишком большие и отвлекали бы от основных записей, а в уменьшенные версии влезает слишком мало текста. В итоге остановился на том, что на главной странице показываю только картинки

Красота


  1. Кажется, про него не осталось ничего, кроме древних переписок в Google Groups ↩︎

  2. Да, да, есть Git LFS, но 🤫
     ↩︎

  3. Неплохо бы разбить на части этот здоровенный файл и причесать его, но лень. Да и не то, чтобы кому-то, кроме меня, понадобится в нём что-то править. А если хочешь сказать, что код ужасный и мне следует его стыдиться, смотри гифку в предыдущей сноске ↩︎

  4. Ну ладно, почти полностью. Если ссылка не из подписок, а из твиттера или переписок, то для публикации в линкблог, её надо сначала добавить в Instapaper. Ну и в закулисьи блога есть кнопка для ручной проверки обновлений ↩︎