55import click
66
77from kobodl .globals import Globals
8- from kobodl .kobo import Book , Kobo , KoboException , NotAuthenticatedException
8+ from kobodl .kobo import Book , BookType , Kobo , KoboException , NotAuthenticatedException
99from kobodl .settings import User
1010
11+ SUPPORTED_BOOK_TYPES = [
12+ BookType .EBOOK ,
13+ BookType .AUDIOBOOK ,
14+ ]
15+
1116
1217def __GetBookAuthor (book : dict ) -> str :
1318 contributors = book .get ('ContributorRoles' )
@@ -51,15 +56,17 @@ def __MakeFileNameForBook(bookMetadata: dict) -> str:
5156 return fileName
5257
5358
54- def __GetBookMetadata (entitlement : dict ) -> dict :
59+ def __GetBookMetadata (entitlement : dict ) -> ( dict , BookType ) :
5560 keys = entitlement .keys ()
5661 if 'BookMetadata' in keys :
57- return entitlement ['BookMetadata' ]
62+ return entitlement ['BookMetadata' ], BookType . EBOOK
5863 if 'AudiobookMetadata' in keys :
59- return entitlement ['AudiobookMetadata' ]
60- raise ValueError (
61- f'Unknown Book Metadata Type. Wanted "BookMetadata" or "AudiobookMetadata", found object: { entitlement } '
62- )
64+ return entitlement ['AudiobookMetadata' ], BookType .AUDIOBOOK
65+ if 'BookSubscriptionEntitlement' in keys :
66+ return entitlement ['BookSubscriptionEntitlement' ], BookType .SUBSCRIPTION
67+ print (f'WARNING: unsupported object detected with contents { entitlement } ' )
68+ print ('Please open an issue at https://github.com/subdavis/kobo-book-downloader/issues' )
69+ return None , None
6370
6471
6572def __IsBookArchived (newEntitlement : dict ) -> bool :
@@ -71,10 +78,6 @@ def __IsBookArchived(newEntitlement: dict) -> bool:
7178 return bookEntitlement .get ('IsRemoved' , False )
7279
7380
74- def __IsAudioBook (bookMetadata : dict ) -> bool :
75- return 'Duration' in bookMetadata .keys ()
76-
77-
7881def __IsBookRead (newEntitlement : dict ) -> bool :
7982 readingState = newEntitlement .get ('ReadingState' )
8083 if readingState is None :
@@ -113,15 +116,21 @@ def __GetBookList(kobo: Kobo, listAll: bool, exportFile: Union[TextIO, None]) ->
113116 if (not listAll ) and __IsBookRead (newEntitlement ):
114117 continue
115118
116- bookMetadata = __GetBookMetadata (newEntitlement )
117- book = [
118- bookMetadata ['RevisionId' ],
119- bookMetadata ['Title' ],
120- __GetBookAuthor (bookMetadata ),
121- __IsBookArchived (newEntitlement ),
122- __IsAudioBook (bookMetadata ),
123- ]
124- rows .append (book )
119+ bookMetadata , book_type = __GetBookMetadata (newEntitlement )
120+
121+ if book_type is None :
122+ click .echo ('Skipping book of unknown type' )
123+ continue
124+
125+ elif book_type in SUPPORTED_BOOK_TYPES :
126+ book = [
127+ bookMetadata ['RevisionId' ],
128+ bookMetadata ['Title' ],
129+ __GetBookAuthor (bookMetadata ),
130+ __IsBookArchived (newEntitlement ),
131+ book_type == BookType .AUDIOBOOK ,
132+ ]
133+ rows .append (book )
125134
126135 rows = sorted (rows , key = lambda columns : columns [1 ].lower ())
127136 return rows
@@ -172,10 +181,17 @@ def GetBookOrBooks(user: User, outputPath: str, productId: str = '') -> Union[No
172181 if newEntitlement is None :
173182 continue
174183
175- bookMetadata = __GetBookMetadata (newEntitlement )
176- isAudiobook = __IsAudioBook (bookMetadata )
184+ bookMetadata , book_type = __GetBookMetadata (newEntitlement )
185+ if bookMetadata is None :
186+ click .echo ('Skipping book of unknown type' )
187+ continue
188+
189+ elif bookMetadata == BookType .SUBSCRIPTION :
190+ click .echo ('Skipping subscribtion entity' )
191+ continue
192+
177193 fileName = __MakeFileNameForBook (bookMetadata )
178- if not isAudiobook :
194+ if book_type == BookType . EBOOK :
179195 # Audiobooks go in sub-directories
180196 # but epub files go directly in outputPath
181197 fileName += '.epub'
@@ -196,7 +212,7 @@ def GetBookOrBooks(user: User, outputPath: str, productId: str = '') -> Union[No
196212 click .echo (f'Skipping archived book { fileName } ' )
197213 continue
198214
199- kobo .Download (bookMetadata , isAudiobook , outputFilePath )
215+ kobo .Download (bookMetadata , book_type == BookType . AUDIOBOOK , outputFilePath )
200216 click .echo (f'Downloaded { productId } to { outputFilePath } ' , err = True )
201217
202218 if productId :
0 commit comments