OnlineLibrary
79 строк · 1.5 Кб
1package config
2
3import (
4"errors"
5"time"
6
7"OnlineLibrary/internal/util"
8)
9
10var (
11BookNotFound = errors.New("book not found")
12ListeningPosition = "listening_position"
13)
14
15type Bookmark struct {
16// Name of the bookmark. Reserved for future use
17Name string `yaml:"name,omitempty"`
18// Fragment of a book with the bookmark
19Fragment int `yaml:"fragment"`
20// Offset from the beginning of the fragment
21Position time.Duration `yaml:"position"`
22}
23
24type Book struct {
25// Unique ID of the book
26ID string `yaml:"id"`
27// Values for speed when playing the book
28Speed float64 `yaml:"speed,omitempty"`
29// Set of bookmarks in the book
30Bookmarks map[string]Bookmark `yaml:"bookmarks,omitempty"`
31}
32
33type BookSet []Book
34
35func (setP *BookSet) Book(id string, defaultSpeed float64) Book {
36for _, b := range *setP {
37if b.ID == id {
38return b
39}
40}
41return Book{
42ID: id,
43Speed: defaultSpeed,
44Bookmarks: make(map[string]Bookmark),
45}
46}
47
48func (setP *BookSet) SetBook(book Book) {
49set := *setP
50defer func() { *setP = set }()
51
52for i, b := range set {
53if b.ID == book.ID {
54set[i] = book
55set[0], set[i] = set[i], set[0]
56return
57}
58}
59set = append(set, book)
60i := len(set) - 1
61set[0], set[i] = set[i], set[0]
62}
63
64func (setP *BookSet) LastBook() (Book, error) {
65if len(*setP) == 0 {
66return Book{}, BookNotFound
67}
68return (*setP)[0], nil
69}
70
71func (setP *BookSet) Tidy(ids []string) {
72books := make([]Book, 0, len(ids))
73for _, b := range *setP {
74if util.StringInSlice(b.ID, ids) {
75books = append(books, b)
76}
77}
78*setP = books
79}
80