From cace83e27a1acafe57f32cc5eee4bb1078f20e74 Mon Sep 17 00:00:00 2001
From: Sergey Matveev <stargrave@stargrave.org>
Date: Tue, 19 Oct 2021 14:54:56 +0300
Subject: [PATCH] =?utf8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD=D0=B8?=
 =?utf8?q?=D1=8F=20WARC-=D0=B0=20=D0=B2=20tofuproxy?=
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit

https://iipc.github.io/warc-specifications/specifications/warc-zstd/
Прежде сжатые WARC-и в tofuproxy поддерживались, но никакого
оптимального индексирования и перемещения по ним (по сегментам gzip или
frame-ам zstd) не было. Теперь во время парсинга WARC-а все эти смещения
учитываются и кладутся в индекс.

С gzip-ом проблем не возникало, а вот с Zstandard все Go-шные библиотеки
меня не устраивают: никто не предоставляет возможности остановится после
чтения frame-а (кто-то предоставлял, но не работал по факту, падал).
Залез в исходный код, но узнать при этом точное смещение начало/конца
кадров как-то геморройно. В итоге написал на Си утилиту: zstd идёт в
stdin, декомпрессия в stdout, в 3-ий файловый дескриптор TSV таблица
смещений кадров и декомпрессированных данных.

Взялся писать zstd компрессор который бы делал multi-frame компрессию
WARC-ов, как это описано в черновике .warc.zst "стандарта", но он упорно
не хотел заполнять размер кадров корректно (это опциональное поле), чего
требовал стандарт. В итоге написал другую Си утилиту для этого, в
которой без проблем всё формирую.

.warc.zst оказывается вовсю уже делаются не первый год в Internet
Archive. Более того, они делают сжатие с встроенным словарём, который
тоже у меня поддерживается. Например:
https://archive.org/details/archiveteam_yahooanswers_20210422220546_c4fac540
-- 
2.51.0