OnlineLibrary
118 строк · 2.7 Кб
1package books
2
3import (
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
14type Book struct {
15content.Item
16*player.Player
17Title string
18conf *config.Book
19}
20
21func NewBook(outputDevice string, contentItem content.Item, logger *log.Logger, statusBar *gui.StatusBar) (*Book, error) {
22name, err := contentItem.Name()
23if err != nil {
24return nil, err
25}
26
27dir, err := config.BookDir(name)
28if err != nil {
29return nil, err
30}
31
32rsrc, err := contentItem.Resources()
33if err != nil {
34return nil, err
35}
36
37book := &Book{
38Item: contentItem,
39Player: player.NewPlayer(dir, rsrc, outputDevice, logger, statusBar),
40Title: name,
41conf: contentItem.Config(),
42}
43
44book.SetSpeed(book.conf.Speed)
45if bookmark, err := book.Bookmark(config.ListeningPosition); err == nil {
46book.SetFragment(bookmark.Fragment)
47book.SetPosition(bookmark.Position)
48}
49return book, nil
50}
51
52func (book *Book) SetBookmarkWithName(name string) error {
53if name == "" {
54return fmt.Errorf("bookmark name is missing")
55}
56for id := 10; id <= 255; id++ {
57bookmarkID := fmt.Sprintf("bookmark%d", id)
58if _, err := book.Bookmark(bookmarkID); err != nil {
59book.setBookmark(bookmarkID, name)
60return nil
61}
62}
63return fmt.Errorf("all bookmark ids already used")
64}
65
66func (book *Book) SetBookmarkWithID(id string) {
67book.setBookmark(id, "")
68}
69
70func (book *Book) setBookmark(id, name string) {
71var bookmark config.Bookmark
72bookmark.Name = name
73bookmark.Fragment = book.Fragment()
74// For convenience, we truncate the time to the nearest tenth of a second
75bookmark.Position = book.Position().Truncate(time.Millisecond * 100)
76book.conf.Bookmarks[id] = bookmark
77}
78
79func (book *Book) RemoveBookmark(id string) {
80delete(book.conf.Bookmarks, id)
81}
82
83func (book *Book) Bookmark(id string) (config.Bookmark, error) {
84if bookmark, ok := book.conf.Bookmarks[id]; ok {
85return bookmark, nil
86}
87return config.Bookmark{}, fmt.Errorf("bookmark not found")
88}
89
90func (book *Book) ToBookmark(id string) error {
91bookmark, err := book.Bookmark(id)
92if err != nil {
93return err
94}
95if book.Fragment() == bookmark.Fragment {
96book.SetPosition(bookmark.Position)
97return nil
98}
99book.Stop()
100book.SetFragment(bookmark.Fragment)
101book.SetPosition(bookmark.Position)
102book.PlayPause()
103return nil
104}
105
106func (book *Book) Bookmarks() map[string]string {
107bookmarks := make(map[string]string)
108for id, bookmark := range book.conf.Bookmarks {
109bookmarks[id] = bookmark.Name
110}
111return bookmarks
112}
113
114func (book *Book) Save() {
115book.SetBookmarkWithID(config.ListeningPosition)
116book.conf.Speed = book.Speed()
117book.SaveConfig()
118}
119