ZIM file format
The ZIM file format is based on the Zeno File Format. It starts with a header, which is described here:
Header
A ZIM file starts with a header. This starts always at offset 0.
Length in byte, all types are littlendian
Field Name | Type | Offset | Length | Description |
---|---|---|---|---|
magicNumber | integer | 0 | 4 | Magic number to recognise the file format, must be 72173914 |
version | integer | 4 | 4 | ZIM=4, version of the file format |
uuid | integer | 8 | 16 | unique id of this zim file |
articleCount | integer | 24 | 4 | total number of articles |
titlePtrPos | integer | 28 | 8 | position of the directory pointerlist ordered by Title |
urlPtrPos | integer | 36 | 8 | position of the directory pointerlist orderes by URL |
clusterCount | integer | 44 | 4 | number of data clusters |
clusterPtrPos | integer | 48 | 8 | position of the cluster pointer list |
mimeListPos | integer | 56 | 8 | position of the MIME type list |
mainPage | integer | 64 | 4 | title index of main page or 0xffffffff if no main page |
layoutPage | integer | 64 | 4 | title index of layout page or 0xffffffffff if no layout page |
Each article in the ZIM file has a directory entry. Since the directory entry has a variable size we have an index pointerlist which is a list of 4-byte offsets. The pointers points to the directory entries.
Index pointer list
The index pointer list is a list of 8 byte offsets to the directory entries. Since directory entries have variable sizes this is needed for random access.
The directory entries are always sorted by title. The title is encoded as QUnicode, which is a custom utf-variant, which supports fast ordering.
Cluster pointer list
The cluster pointer list is a list of 8 byte offsets which point to the data clusters.
Directory entries
length in byte, all types are littlendian
article entry
Field Name | Type | Offset | Length | Description |
---|---|---|---|---|
redirectFlag | boolean | 0 | 1 | 0 for article |
mime | integer | 1 | 1 | mime type code |
empty | 2 | 1 | was compression flag, this is now in the cluster header | |
namespace | char | 3 | 1 | |
cluster number | integer | 4 | 4 | |
blob number | integer | 8 | 4 | |
extraLen | integer | 12 | 2 | length of extra bytes (title and parameter) |
title + parameter separated by 0-byte | QUnicode (title) + custom (parameter, not used in articles) | 14 | specified by extraLen | actual title of article; when parameter is empty, the 0-byte is omitted |
redirect entry
Field Name | Type | Offset | Length | Description |
---|---|---|---|---|
redirectFlag | boolean | 0 | 1 | 1 for redirect |
mime | integer | 1 | 1 | unused for redirects |
empty | 2 | 1 | was compression flag, this is now in the cluster header | |
namespace | char | 3 | 1 | |
redirect index | integer | 4 | 4 | |
extraLen | integer | 8 | 2 | length of extra bytes (title and parameter) |
title + parameter separated by 0-byte | QUnicode (title) + custom (parameter, not used in articles) | 10 | specified by extraLen | actual title of article; when parameter is empty, the 0-byte is omitted |
Clusters
The clusters contain the actual article data. This file section contain a list of clusters, which contain a list of blobs each. The blob is the data of one specific article. So this blob is adressed by the cluster number and the blob number in this cluster. The cluster number is used to look up the file offset in the cluster pointer list.
The cluster has a starting byte, which indicated, which compresion is used. After this byte, all other data is compressed. Possible values are:
- 0 default (no compression)
- 1 none also no compression (inherited from zeno)
- 2 zip (zlib)
- 3 bzip2 (currently used in writer)
- 4 lzma (not implemented in reader or writer due to lack of compression library)
The data area has a list of 4 byte offsets to the blobs counting from the first offset. The offset addresses uncompressed data. The last pointer points to the end of the data area. So there is always one more offset than blobs. Since the first offset points to the start of the first data, the number of offsets can be determined by dividing this offset by 4. The size of one blob is calculated by the difference of two consecutive offsets.
Mime types
Currently these mime types are assigned:
number | mime-type |
---|---|
0 | text/html |
1 | text/plain |
2 | image/jpeg |
3 | image/png |
4 | image/tiff |
5 | text/css |
6 | image/gif |
7 | index page |
8 | application/x-javascript |
9 | image/x-icon |
10 | text/xml |
Namespaces
Namespaces seperate different types of data stored in the ZIM File Format.
They can be distinguished by prepending the article namespace before the article name in the URL path, eg. http://localhost/A/Articlename.
Namespace | Description |
---|---|
- | template data |
A | articles |
I | images, files - see Image Handling |
J | images, text - see Image Handling |
M | metadata - see Metadata |
U | categories, text - see Category Handling |
V | categories, article list - see Category Handling |
W | deprecated - see Zeno File Format |
X | fulltext index - see Zim Index Format |
Y | deprecated - see Zeno File Format |
Z | deprecated - see Zeno File Format |
Urls
ZIM content have their own urls: <namespace>/<article_url>.