@@ -8,6 +8,7 @@ import org.gotson.komga.domain.model.BookWithMedia
8
8
import org.gotson.komga.domain.model.DomainEvent
9
9
import org.gotson.komga.domain.model.ImageConversionException
10
10
import org.gotson.komga.domain.model.KomgaUser
11
+ import org.gotson.komga.domain.model.MarkSelectedPreference
11
12
import org.gotson.komga.domain.model.Media
12
13
import org.gotson.komga.domain.model.MediaNotReadyException
13
14
import org.gotson.komga.domain.model.ReadProgress
@@ -82,18 +83,18 @@ class BookLifecycle(
82
83
fun generateThumbnailAndPersist (book : Book ) {
83
84
logger.info { " Generate thumbnail and persist for book: $book " }
84
85
try {
85
- addThumbnailForBook(bookAnalyzer.generateThumbnail(BookWithMedia (book, mediaRepository.findById(book.id))))
86
+ addThumbnailForBook(bookAnalyzer.generateThumbnail(BookWithMedia (book, mediaRepository.findById(book.id))), MarkSelectedPreference . IF_NONE_OR_GENERATED )
86
87
} catch (ex: Exception ) {
87
88
logger.error(ex) { " Error while creating thumbnail" }
88
89
}
89
90
}
90
91
91
- fun addThumbnailForBook (thumbnail : ThumbnailBook ) {
92
+ fun addThumbnailForBook (thumbnail : ThumbnailBook , markSelected : MarkSelectedPreference ) {
92
93
when (thumbnail.type) {
93
94
ThumbnailBook .Type .GENERATED -> {
94
95
// only one generated thumbnail is allowed
95
96
thumbnailBookRepository.deleteByBookIdAndType(thumbnail.bookId, ThumbnailBook .Type .GENERATED )
96
- thumbnailBookRepository.insert(thumbnail)
97
+ thumbnailBookRepository.insert(thumbnail.copy(selected = false ) )
97
98
}
98
99
ThumbnailBook .Type .SIDECAR -> {
99
100
// delete existing thumbnail with the same url
@@ -102,16 +103,37 @@ class BookLifecycle(
102
103
.forEach {
103
104
thumbnailBookRepository.delete(it.id)
104
105
}
105
- thumbnailBookRepository.insert(thumbnail)
106
+ thumbnailBookRepository.insert(thumbnail.copy(selected = false ))
107
+ }
108
+ ThumbnailBook .Type .USER_UPLOADED -> {
109
+ thumbnailBookRepository.insert(thumbnail.copy(selected = false ))
110
+ }
111
+ }
112
+
113
+ when (markSelected) {
114
+ MarkSelectedPreference .YES -> {
115
+ thumbnailBookRepository.markSelected(thumbnail)
116
+ }
117
+ MarkSelectedPreference .IF_NONE_OR_GENERATED -> {
118
+ val selectedThumbnail = thumbnailBookRepository.findSelectedByBookIdOrNull(thumbnail.bookId)
119
+
120
+ if (selectedThumbnail == null || selectedThumbnail.type == ThumbnailBook .Type .GENERATED )
121
+ thumbnailBookRepository.markSelected(thumbnail)
122
+ else thumbnailsHouseKeeping(thumbnail.bookId)
123
+ }
124
+ MarkSelectedPreference .NO -> {
125
+ thumbnailsHouseKeeping(thumbnail.bookId)
106
126
}
107
127
}
108
128
109
129
eventPublisher.publishEvent(DomainEvent .ThumbnailBookAdded (thumbnail))
130
+ }
110
131
111
- if (thumbnail.selected)
112
- thumbnailBookRepository.markSelected(thumbnail)
113
- else
114
- thumbnailsHouseKeeping(thumbnail.bookId)
132
+ fun deleteThumbnailForBook (thumbnail : ThumbnailBook ) {
133
+ require(thumbnail.type == ThumbnailBook .Type .USER_UPLOADED ) { " Only uploaded thumbnails can be deleted" }
134
+ thumbnailBookRepository.delete(thumbnail.id)
135
+ thumbnailsHouseKeeping(thumbnail.bookId)
136
+ eventPublisher.publishEvent(DomainEvent .ThumbnailBookDeleted (thumbnail))
115
137
}
116
138
117
139
fun getThumbnail (bookId : String ): ThumbnailBook ? {
@@ -136,6 +158,18 @@ class BookLifecycle(
136
158
return null
137
159
}
138
160
161
+ fun getThumbnailBytesByThumbnailId (thumbnailId : String ): ByteArray? =
162
+ thumbnailBookRepository.findByIdOrNull(thumbnailId)?.let {
163
+ getBytesFromThumbnailBook(it)
164
+ }
165
+
166
+ private fun getBytesFromThumbnailBook (thumbnail : ThumbnailBook ): ByteArray? =
167
+ when {
168
+ thumbnail.thumbnail != null -> thumbnail.thumbnail
169
+ thumbnail.url != null -> File (thumbnail.url.toURI()).readBytes()
170
+ else -> null
171
+ }
172
+
139
173
private fun thumbnailsHouseKeeping (bookId : String ) {
140
174
logger.info { " House keeping thumbnails for book: $bookId " }
141
175
val all = thumbnailBookRepository.findAllByBookId(bookId)
0 commit comments