82 lines
1.9 KiB
Go
82 lines
1.9 KiB
Go
|
package zim
|
||
|
|
||
|
import (
|
||
|
"io"
|
||
|
|
||
|
"github.com/pkg/errors"
|
||
|
)
|
||
|
|
||
|
type MetadataKey string
|
||
|
|
||
|
// See https://wiki.openzim.org/wiki/Metadata
|
||
|
const (
|
||
|
MetadataName MetadataKey = "Name"
|
||
|
MetadataTitle MetadataKey = "Title"
|
||
|
MetadataDescription MetadataKey = "Description"
|
||
|
MetadataLongDescription MetadataKey = "LongDescription"
|
||
|
MetadataCreator MetadataKey = "Creator"
|
||
|
MetadataTags MetadataKey = "Tags"
|
||
|
MetadataDate MetadataKey = "Date"
|
||
|
MetadataPublisher MetadataKey = "Publisher"
|
||
|
MetadataFlavour MetadataKey = "Flavour"
|
||
|
MetadataSource MetadataKey = "Source"
|
||
|
MetadataLanguage MetadataKey = "Language"
|
||
|
MetadataIllustration48x48at1 MetadataKey = "Illustration_48x48@1"
|
||
|
MetadataIllustration96x96at2 MetadataKey = "Illustration_96x96@2"
|
||
|
)
|
||
|
|
||
|
var knownKeys = []MetadataKey{
|
||
|
MetadataName,
|
||
|
MetadataTitle,
|
||
|
MetadataDescription,
|
||
|
MetadataLongDescription,
|
||
|
MetadataCreator,
|
||
|
MetadataPublisher,
|
||
|
MetadataLanguage,
|
||
|
MetadataTags,
|
||
|
MetadataDate,
|
||
|
MetadataFlavour,
|
||
|
MetadataSource,
|
||
|
MetadataIllustration48x48at1,
|
||
|
MetadataIllustration96x96at2,
|
||
|
}
|
||
|
|
||
|
// Metadata returns a copy of the internal metadata map of the ZIM file.
|
||
|
func (r *Reader) Metadata(keys ...MetadataKey) (map[MetadataKey]string, error) {
|
||
|
if len(keys) == 0 {
|
||
|
keys = knownKeys
|
||
|
}
|
||
|
|
||
|
metadata := make(map[MetadataKey]string)
|
||
|
|
||
|
for _, key := range keys {
|
||
|
entry, err := r.EntryWithURL(V5NamespaceMetadata, string(key))
|
||
|
if err != nil {
|
||
|
if errors.Is(err, ErrNotFound) {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
return nil, errors.WithStack(err)
|
||
|
}
|
||
|
|
||
|
content, err := entry.Redirect()
|
||
|
if err != nil {
|
||
|
return nil, errors.WithStack(err)
|
||
|
}
|
||
|
|
||
|
reader, err := content.Reader()
|
||
|
if err != nil {
|
||
|
return nil, errors.WithStack(err)
|
||
|
}
|
||
|
|
||
|
data, err := io.ReadAll(reader)
|
||
|
if err != nil {
|
||
|
return nil, errors.WithStack(err)
|
||
|
}
|
||
|
|
||
|
metadata[key] = string(data)
|
||
|
}
|
||
|
|
||
|
return metadata, nil
|
||
|
}
|