OnlineLibrary

Форк
0
108 строк · 2.1 Кб
1
package localstorage
2

3
import (
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

15
type ContentItem struct {
16
	storage   *LocalStorage
17
	resources []dodp.Resource
18
	metadata  *dodp.ContentMetadata
19
	conf      config.Book
20
}
21

22
func NewContentItem(storage *LocalStorage, id string) *ContentItem {
23
	return &ContentItem{
24
		storage: storage,
25
		conf:    storage.conf.LocalBooks.Book(id, player.DEFAULT_SPEED),
26
	}
27
}
28

29
func (ci *ContentItem) path() string {
30
	return filepath.Join(ci.storage.path, ci.conf.ID)
31
}
32

33
func (ci *ContentItem) Name() (string, error) {
34
	label := ci.Label()
35
	if dir, err := config.BookDir(label); err == nil && dir == ci.path() {
36
		return label, nil
37
	}
38
	return ci.conf.ID, nil
39
}
40

41
func (ci *ContentItem) Label() string {
42
	md, err := ci.ContentMetadata()
43
	if err != nil {
44
		return ci.conf.ID
45
	}
46
	return md.Metadata.Title
47
}
48

49
func (ci *ContentItem) ID() string {
50
	return ci.conf.ID
51
}
52

53
func (ci *ContentItem) Resources() ([]dodp.Resource, error) {
54
	if ci.resources != nil {
55
		return ci.resources, nil
56
	}
57
	path := ci.path()
58
	rsrc := make([]dodp.Resource, 0)
59

60
	walker := func(targpath string, info fs.FileInfo, err error) error {
61
		if err != nil || info.IsDir() {
62
			return err
63
		}
64
		localURI, err := filepath.Rel(path, targpath)
65
		if err != nil {
66
			return err
67
		}
68
		r := dodp.Resource{
69
			LocalURI: localURI,
70
			Size:     info.Size(),
71
		}
72
		rsrc = append(rsrc, r)
73
		return nil
74
	}
75

76
	if err := filepath.Walk(path, walker); err != nil {
77
		return nil, err
78
	}
79
	ci.resources = rsrc
80
	return ci.resources, nil
81
}
82

83
func (ci *ContentItem) ContentMetadata() (*dodp.ContentMetadata, error) {
84
	if ci.metadata != nil {
85
		return ci.metadata, nil
86
	}
87
	path := filepath.Join(ci.path(), config.MetadataFileName)
88
	f, err := os.Open(path)
89
	if err != nil {
90
		return nil, err
91
	}
92
	defer f.Close()
93
	md := new(dodp.ContentMetadata)
94
	d := xml.NewDecoder(f)
95
	if err := d.Decode(md); err != nil {
96
		return nil, err
97
	}
98
	ci.metadata = md
99
	return ci.metadata, nil
100
}
101

102
func (ci *ContentItem) Config() *config.Book {
103
	return &ci.conf
104
}
105

106
func (ci *ContentItem) SaveConfig() {
107
	ci.storage.conf.LocalBooks.SetBook(ci.conf)
108
}
109

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.