Skip to content

Commit 9184aa0

Browse files
committed
Fix #13
1 parent 7b48ed4 commit 9184aa0

File tree

3 files changed

+48
-25
lines changed

3 files changed

+48
-25
lines changed

kobodl/actions.py

Lines changed: 40 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,14 @@
55
import click
66

77
from kobodl.globals import Globals
8-
from kobodl.kobo import Book, Kobo, KoboException, NotAuthenticatedException
8+
from kobodl.kobo import Book, BookType, Kobo, KoboException, NotAuthenticatedException
99
from kobodl.settings import User
1010

11+
SUPPORTED_BOOK_TYPES = [
12+
BookType.EBOOK,
13+
BookType.AUDIOBOOK,
14+
]
15+
1116

1217
def __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

6572
def __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-
7881
def __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:

kobodl/kobo.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import sys
77
import urllib
88
import uuid
9+
from enum import Enum
910
from shutil import copyfile
1011
from typing import Dict, Tuple
1112

@@ -28,6 +29,12 @@ class Book:
2829
Owner: User
2930

3031

32+
class BookType(Enum):
33+
EBOOK = 1
34+
AUDIOBOOK = 2
35+
SUBSCRIPTION = 3
36+
37+
3138
class NotAuthenticatedException(Exception):
3239
pass
3340

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
setup(
1010
name='kobodl',
1111
author='Brandon Davis',
12-
version='0.3.5',
12+
version='0.3.6',
1313
author_email='kobodl@subdavis.com',
1414
url="https://github.com/subdavis/kobo-book-downloader",
1515
long_description=long_description,

0 commit comments

Comments
 (0)