OnlineLibrary
108 строк · 2.1 Кб
1package localstorage
2
3import (
4"encoding/xml"
5"io/fs"
6"os"
7"path/filepath"
8
9"OnlineLibrary/internal/config"
10"OnlineLibrary/internal/player"
11
12"gitverse.ru/kvark128/dodp"
13)
14
15type ContentItem struct {
16storage *LocalStorage
17resources []dodp.Resource
18metadata *dodp.ContentMetadata
19conf config.Book
20}
21
22func NewContentItem(storage *LocalStorage, id string) *ContentItem {
23return &ContentItem{
24storage: storage,
25conf: storage.conf.LocalBooks.Book(id, player.DEFAULT_SPEED),
26}
27}
28
29func (ci *ContentItem) path() string {
30return filepath.Join(ci.storage.path, ci.conf.ID)
31}
32
33func (ci *ContentItem) Name() (string, error) {
34label := ci.Label()
35if dir, err := config.BookDir(label); err == nil && dir == ci.path() {
36return label, nil
37}
38return ci.conf.ID, nil
39}
40
41func (ci *ContentItem) Label() string {
42md, err := ci.ContentMetadata()
43if err != nil {
44return ci.conf.ID
45}
46return md.Metadata.Title
47}
48
49func (ci *ContentItem) ID() string {
50return ci.conf.ID
51}
52
53func (ci *ContentItem) Resources() ([]dodp.Resource, error) {
54if ci.resources != nil {
55return ci.resources, nil
56}
57path := ci.path()
58rsrc := make([]dodp.Resource, 0)
59
60walker := func(targpath string, info fs.FileInfo, err error) error {
61if err != nil || info.IsDir() {
62return err
63}
64localURI, err := filepath.Rel(path, targpath)
65if err != nil {
66return err
67}
68r := dodp.Resource{
69LocalURI: localURI,
70Size: info.Size(),
71}
72rsrc = append(rsrc, r)
73return nil
74}
75
76if err := filepath.Walk(path, walker); err != nil {
77return nil, err
78}
79ci.resources = rsrc
80return ci.resources, nil
81}
82
83func (ci *ContentItem) ContentMetadata() (*dodp.ContentMetadata, error) {
84if ci.metadata != nil {
85return ci.metadata, nil
86}
87path := filepath.Join(ci.path(), config.MetadataFileName)
88f, err := os.Open(path)
89if err != nil {
90return nil, err
91}
92defer f.Close()
93md := new(dodp.ContentMetadata)
94d := xml.NewDecoder(f)
95if err := d.Decode(md); err != nil {
96return nil, err
97}
98ci.metadata = md
99return ci.metadata, nil
100}
101
102func (ci *ContentItem) Config() *config.Book {
103return &ci.conf
104}
105
106func (ci *ContentItem) SaveConfig() {
107ci.storage.conf.LocalBooks.SetBook(ci.conf)
108}
109