OnlineLibrary

Форк
0
118 строк · 2.7 Кб
1
package books
2

3
import (
4
	"fmt"
5
	"time"
6

7
	"OnlineLibrary/internal/config"
8
	"OnlineLibrary/internal/content"
9
	"OnlineLibrary/internal/gui"
10
	"OnlineLibrary/internal/log"
11
	"OnlineLibrary/internal/player"
12
)
13

14
type Book struct {
15
	content.Item
16
	*player.Player
17
	Title string
18
	conf  *config.Book
19
}
20

21
func NewBook(outputDevice string, contentItem content.Item, logger *log.Logger, statusBar *gui.StatusBar) (*Book, error) {
22
	name, err := contentItem.Name()
23
	if err != nil {
24
		return nil, err
25
	}
26

27
	dir, err := config.BookDir(name)
28
	if err != nil {
29
		return nil, err
30
	}
31

32
	rsrc, err := contentItem.Resources()
33
	if err != nil {
34
		return nil, err
35
	}
36

37
	book := &Book{
38
		Item:   contentItem,
39
		Player: player.NewPlayer(dir, rsrc, outputDevice, logger, statusBar),
40
		Title:  name,
41
		conf:   contentItem.Config(),
42
	}
43

44
	book.SetSpeed(book.conf.Speed)
45
	if bookmark, err := book.Bookmark(config.ListeningPosition); err == nil {
46
		book.SetFragment(bookmark.Fragment)
47
		book.SetPosition(bookmark.Position)
48
	}
49
	return book, nil
50
}
51

52
func (book *Book) SetBookmarkWithName(name string) error {
53
	if name == "" {
54
		return fmt.Errorf("bookmark name is missing")
55
	}
56
	for id := 10; id <= 255; id++ {
57
		bookmarkID := fmt.Sprintf("bookmark%d", id)
58
		if _, err := book.Bookmark(bookmarkID); err != nil {
59
			book.setBookmark(bookmarkID, name)
60
			return nil
61
		}
62
	}
63
	return fmt.Errorf("all bookmark ids already used")
64
}
65

66
func (book *Book) SetBookmarkWithID(id string) {
67
	book.setBookmark(id, "")
68
}
69

70
func (book *Book) setBookmark(id, name string) {
71
	var bookmark config.Bookmark
72
	bookmark.Name = name
73
	bookmark.Fragment = book.Fragment()
74
	// For convenience, we truncate the time to the nearest tenth of a second
75
	bookmark.Position = book.Position().Truncate(time.Millisecond * 100)
76
	book.conf.Bookmarks[id] = bookmark
77
}
78

79
func (book *Book) RemoveBookmark(id string) {
80
	delete(book.conf.Bookmarks, id)
81
}
82

83
func (book *Book) Bookmark(id string) (config.Bookmark, error) {
84
	if bookmark, ok := book.conf.Bookmarks[id]; ok {
85
		return bookmark, nil
86
	}
87
	return config.Bookmark{}, fmt.Errorf("bookmark not found")
88
}
89

90
func (book *Book) ToBookmark(id string) error {
91
	bookmark, err := book.Bookmark(id)
92
	if err != nil {
93
		return err
94
	}
95
	if book.Fragment() == bookmark.Fragment {
96
		book.SetPosition(bookmark.Position)
97
		return nil
98
	}
99
	book.Stop()
100
	book.SetFragment(bookmark.Fragment)
101
	book.SetPosition(bookmark.Position)
102
	book.PlayPause()
103
	return nil
104
}
105

106
func (book *Book) Bookmarks() map[string]string {
107
	bookmarks := make(map[string]string)
108
	for id, bookmark := range book.conf.Bookmarks {
109
		bookmarks[id] = bookmark.Name
110
	}
111
	return bookmarks
112
}
113

114
func (book *Book) Save() {
115
	book.SetBookmarkWithID(config.ListeningPosition)
116
	book.conf.Speed = book.Speed()
117
	book.SaveConfig()
118
}
119

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

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

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

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