mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
GwR revisions
This commit is contained in:
parent
9f55353a50
commit
23ea58279e
@ -57,6 +57,9 @@ class ITUNES(DevicePlugin):
|
|||||||
log = Log()
|
log = Log()
|
||||||
path_template = 'iTunes/%s - %s.epub'
|
path_template = 'iTunes/%s - %s.epub'
|
||||||
presync = False
|
presync = False
|
||||||
|
problem_titles = []
|
||||||
|
problem_msg = None
|
||||||
|
report_progress = None
|
||||||
update_list = []
|
update_list = []
|
||||||
sources = None
|
sources = None
|
||||||
update_msg = None
|
update_msg = None
|
||||||
@ -93,8 +96,11 @@ class ITUNES(DevicePlugin):
|
|||||||
else:
|
else:
|
||||||
self.log.error("ITUNES.add_books_to_metadata(): update_list item '%s' not found in booklists[0]" % p_book['title'])
|
self.log.error("ITUNES.add_books_to_metadata(): update_list item '%s' not found in booklists[0]" % p_book['title'])
|
||||||
|
|
||||||
self.report_progress(j+1/task_count, _('Updating device metadata listing...'))
|
if self.report_progress is not None:
|
||||||
self.report_progress(1.0, _('Updating device metadata listing...'))
|
self.report_progress(j+1/task_count, _('Updating device metadata listing...'))
|
||||||
|
|
||||||
|
if self.report_progress is not None:
|
||||||
|
self.report_progress(1.0, _('Updating device metadata listing...'))
|
||||||
|
|
||||||
# Add new books to booklists[0]
|
# Add new books to booklists[0]
|
||||||
for new_book in locations[0]:
|
for new_book in locations[0]:
|
||||||
@ -140,8 +146,11 @@ class ITUNES(DevicePlugin):
|
|||||||
this_book.device_collections = []
|
this_book.device_collections = []
|
||||||
this_book.library_id = library_books[this_book.path] if this_book.path in library_books else None
|
this_book.library_id = library_books[this_book.path] if this_book.path in library_books else None
|
||||||
this_book.size = book.size()
|
this_book.size = book.size()
|
||||||
this_book.thumbnail = self._generate_thumbnail(this_book.path, book)
|
# Hack to discover if we're running in GUI environment
|
||||||
|
if self.report_progress is not None:
|
||||||
|
this_book.thumbnail = self._generate_thumbnail(this_book.path, book)
|
||||||
|
else:
|
||||||
|
this_book.thumbnail = None
|
||||||
booklist.add_book(this_book, False)
|
booklist.add_book(this_book, False)
|
||||||
|
|
||||||
cached_books[this_book.path] = {
|
cached_books[this_book.path] = {
|
||||||
@ -150,9 +159,11 @@ class ITUNES(DevicePlugin):
|
|||||||
'lib_book':library_books[this_book.path] if this_book.path in library_books else None
|
'lib_book':library_books[this_book.path] if this_book.path in library_books else None
|
||||||
}
|
}
|
||||||
|
|
||||||
self.report_progress(i+1/book_count, _('%d of %d' % (i+1, book_count)))
|
if self.report_progress is not None:
|
||||||
|
self.report_progress(i+1/book_count, _('%d of %d' % (i+1, book_count)))
|
||||||
|
|
||||||
self.report_progress(1.0, _('finished'))
|
if self.report_progress is not None:
|
||||||
|
self.report_progress(1.0, _('finished'))
|
||||||
self.cached_books = cached_books
|
self.cached_books = cached_books
|
||||||
if DEBUG:
|
if DEBUG:
|
||||||
self._dump_cached_books()
|
self._dump_cached_books()
|
||||||
@ -242,7 +253,9 @@ class ITUNES(DevicePlugin):
|
|||||||
delete the paths from the library, then update iPad
|
delete the paths from the library, then update iPad
|
||||||
|
|
||||||
'''
|
'''
|
||||||
undeletable_titles = []
|
self.problem_titles = []
|
||||||
|
self.problem_msg = _("Certain books may only be deleted from within the iBooks app.\n"
|
||||||
|
"Click 'Show Details' for a list.")
|
||||||
for path in paths:
|
for path in paths:
|
||||||
if self.cached_books[path]['lib_book']:
|
if self.cached_books[path]['lib_book']:
|
||||||
if DEBUG:
|
if DEBUG:
|
||||||
@ -252,14 +265,9 @@ class ITUNES(DevicePlugin):
|
|||||||
self.update_needed = True
|
self.update_needed = True
|
||||||
self.update_msg = "Deleted books from device"
|
self.update_msg = "Deleted books from device"
|
||||||
else:
|
else:
|
||||||
undeletable_titles.append("'%s' by %s" %
|
self.problem_titles.append("'%s' by %s" %
|
||||||
(self.cached_books[path]['title'],self.cached_books[path]['author']))
|
(self.cached_books[path]['title'],self.cached_books[path]['author']))
|
||||||
|
|
||||||
if undeletable_titles:
|
|
||||||
raise UserFeedback(_("Certain books may only be deleted using iBooks.\n"
|
|
||||||
"Click 'Show Details' for a list."),
|
|
||||||
details='\n'.join(undeletable_titles), level=UserFeedback.WARN)
|
|
||||||
|
|
||||||
def eject(self):
|
def eject(self):
|
||||||
'''
|
'''
|
||||||
Un-mount / eject the device from the OS. This does not check if there
|
Un-mount / eject the device from the OS. This does not check if there
|
||||||
@ -335,14 +343,14 @@ class ITUNES(DevicePlugin):
|
|||||||
self.log.info( "ITUNES:open(): Launching iTunes" )
|
self.log.info( "ITUNES:open(): Launching iTunes" )
|
||||||
self.iTunes = iTunes= appscript.app('iTunes', hide=True)
|
self.iTunes = iTunes= appscript.app('iTunes', hide=True)
|
||||||
iTunes.run()
|
iTunes.run()
|
||||||
if DEBUG:
|
initial_status = 'launched'
|
||||||
self.log.info( "%s - %s (launched), driver version %s" % \
|
|
||||||
(self.iTunes.name(), self.iTunes.version(), self.driver_version))
|
|
||||||
else:
|
else:
|
||||||
self.iTunes = appscript.app('iTunes')
|
self.iTunes = appscript.app('iTunes')
|
||||||
if DEBUG:
|
initial_status = 'already running'
|
||||||
self.log.info( " %s - %s (already running), driver version %s" % \
|
|
||||||
(self.iTunes.name(), self.iTunes.version(), self.driver_version))
|
if DEBUG:
|
||||||
|
self.log.info( " %s - %s (%s), driver version %s" %
|
||||||
|
(self.iTunes.name(), self.iTunes.version(), self.driver_version, initial_status))
|
||||||
|
|
||||||
# Init the iTunes source list
|
# Init the iTunes source list
|
||||||
names = [s.name() for s in self.iTunes.sources()]
|
names = [s.name() for s in self.iTunes.sources()]
|
||||||
@ -350,7 +358,7 @@ class ITUNES(DevicePlugin):
|
|||||||
self.sources = dict(zip(kinds,names))
|
self.sources = dict(zip(kinds,names))
|
||||||
|
|
||||||
# Check to see if Library|Books out of sync with Device|Books
|
# Check to see if Library|Books out of sync with Device|Books
|
||||||
if 'iPod' in self.sources and self.presync:
|
if self.presync and 'iPod' in self.sources :
|
||||||
lb_count = len(self._get_library_books())
|
lb_count = len(self._get_library_books())
|
||||||
db_count = len(self._get_device_books())
|
db_count = len(self._get_device_books())
|
||||||
pb_count = len(self._get_purchased_book_ids())
|
pb_count = len(self._get_purchased_book_ids())
|
||||||
@ -361,11 +369,8 @@ class ITUNES(DevicePlugin):
|
|||||||
self.log.info( " Devices|iPad|Books : %d" % db_count)
|
self.log.info( " Devices|iPad|Books : %d" % db_count)
|
||||||
self.log.info( " Devices|iPad|Purchased: %d" % pb_count)
|
self.log.info( " Devices|iPad|Purchased: %d" % pb_count)
|
||||||
self._update_device(msg="Presyncing iTunes with device, mismatched book count")
|
self._update_device(msg="Presyncing iTunes with device, mismatched book count")
|
||||||
else:
|
|
||||||
if DEBUG:
|
|
||||||
self.log.info( "Skipping pre-sync check")
|
|
||||||
|
|
||||||
# Create thumbs archive
|
# Confirm/create thumbs archive
|
||||||
archive_path = os.path.join(self.cache_dir, "thumbs.zip")
|
archive_path = os.path.join(self.cache_dir, "thumbs.zip")
|
||||||
|
|
||||||
if not os.path.exists(self.cache_dir):
|
if not os.path.exists(self.cache_dir):
|
||||||
@ -387,6 +392,15 @@ class ITUNES(DevicePlugin):
|
|||||||
if DEBUG:
|
if DEBUG:
|
||||||
self.log.info("ITUNES:open(): Instantiating iTunes")
|
self.log.info("ITUNES:open(): Instantiating iTunes")
|
||||||
|
|
||||||
|
# Instantiate iTunes
|
||||||
|
|
||||||
|
# Init the iTunes source list
|
||||||
|
|
||||||
|
# Check to see if Library|Books out of sync with Device|Books
|
||||||
|
|
||||||
|
# Confirm/create thumbs archive
|
||||||
|
|
||||||
|
|
||||||
def remove_books_from_metadata(self, paths, booklists):
|
def remove_books_from_metadata(self, paths, booklists):
|
||||||
'''
|
'''
|
||||||
Remove books from the metadata list. This function must not communicate
|
Remove books from the metadata list. This function must not communicate
|
||||||
@ -490,6 +504,13 @@ class ITUNES(DevicePlugin):
|
|||||||
self.log.error("ITUNES:sync_booklists(): could not find '%s' on device" % updated_book['title'])
|
self.log.error("ITUNES:sync_booklists(): could not find '%s' on device" % updated_book['title'])
|
||||||
self.update_list = []
|
self.update_list = []
|
||||||
|
|
||||||
|
# Inform user of any problem books
|
||||||
|
if self.problem_titles:
|
||||||
|
raise UserFeedback(self.problem_msg,
|
||||||
|
details='\n'.join(self.problem_titles), level=UserFeedback.WARN)
|
||||||
|
self.problem_titles = []
|
||||||
|
self.problem_msg = None
|
||||||
|
|
||||||
def total_space(self, end_session=True):
|
def total_space(self, end_session=True):
|
||||||
"""
|
"""
|
||||||
Get total space available on the mountpoints:
|
Get total space available on the mountpoints:
|
||||||
@ -533,10 +554,14 @@ class ITUNES(DevicePlugin):
|
|||||||
|
|
||||||
new_booklist = []
|
new_booklist = []
|
||||||
self.update_list = []
|
self.update_list = []
|
||||||
|
strip_tags = re.compile(r'<[^<]*?/?>')
|
||||||
|
|
||||||
if isosx:
|
if isosx:
|
||||||
|
|
||||||
file_count = float(len(files))
|
file_count = float(len(files))
|
||||||
|
self.problem_titles = []
|
||||||
|
self.problem_msg = _("Some cover art could not be converted.\n"
|
||||||
|
"Click 'Show Details' for a list.")
|
||||||
for (i,file) in enumerate(files):
|
for (i,file) in enumerate(files):
|
||||||
|
|
||||||
path = self.path_template % (metadata[i].title, metadata[i].author[0])
|
path = self.path_template % (metadata[i].title, metadata[i].author[0])
|
||||||
@ -578,7 +603,7 @@ class ITUNES(DevicePlugin):
|
|||||||
im.convert('RGB').save(of, 'JPEG')
|
im.convert('RGB').save(of, 'JPEG')
|
||||||
thumb = of.getvalue()
|
thumb = of.getvalue()
|
||||||
|
|
||||||
# Cache the thumbnail always, could be updated
|
# Refresh the thumbnail cache
|
||||||
if DEBUG:
|
if DEBUG:
|
||||||
self.log.info( " refreshing cached thumb for '%s'" % metadata[i].title)
|
self.log.info( " refreshing cached thumb for '%s'" % metadata[i].title)
|
||||||
archive_path = os.path.join(self.cache_dir, "thumbs.zip")
|
archive_path = os.path.join(self.cache_dir, "thumbs.zip")
|
||||||
@ -587,6 +612,7 @@ class ITUNES(DevicePlugin):
|
|||||||
zfw.writestr(thumb_path, thumb)
|
zfw.writestr(thumb_path, thumb)
|
||||||
zfw.close()
|
zfw.close()
|
||||||
except:
|
except:
|
||||||
|
self.problem_titles.append("'%s' by %s" % (metadata[i].title, metadata[i].author[0]))
|
||||||
self.log.error("ITUNES.upload_books(): error converting '%s' to thumb for '%s'" % (metadata[i].cover,metadata[i].title))
|
self.log.error("ITUNES.upload_books(): error converting '%s' to thumb for '%s'" % (metadata[i].cover,metadata[i].title))
|
||||||
|
|
||||||
# Create a new Book
|
# Create a new Book
|
||||||
@ -603,7 +629,8 @@ class ITUNES(DevicePlugin):
|
|||||||
new_booklist.append(this_book)
|
new_booklist.append(this_book)
|
||||||
|
|
||||||
# Flesh out the iTunes metadata
|
# Flesh out the iTunes metadata
|
||||||
added.comment.set("added by calibre %s" % strftime('%Y-%m-%d %H:%M:%S'))
|
added.description.set("added by calibre %s" % strftime('%Y-%m-%d %H:%M:%S'))
|
||||||
|
added.comment.set(strip_tags.sub('',metadata[i].comments))
|
||||||
if metadata[i].rating:
|
if metadata[i].rating:
|
||||||
added.rating.set(metadata[i].rating*10)
|
added.rating.set(metadata[i].rating*10)
|
||||||
added.sort_artist.set(metadata[i].author_sort.title())
|
added.sort_artist.set(metadata[i].author_sort.title())
|
||||||
@ -625,9 +652,11 @@ class ITUNES(DevicePlugin):
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Report progress
|
# Report progress
|
||||||
self.report_progress(i+1/file_count, _('%d of %d' % (i+1, file_count)))
|
if self.report_progress is not None:
|
||||||
|
self.report_progress(i+1/file_count, _('%d of %d' % (i+1, file_count)))
|
||||||
|
|
||||||
self.report_progress(1.0, _('finished'))
|
if self.report_progress is not None:
|
||||||
|
self.report_progress(1.0, _('finished'))
|
||||||
|
|
||||||
# Tell sync_booklists we need a re-sync
|
# Tell sync_booklists we need a re-sync
|
||||||
self.update_needed = True
|
self.update_needed = True
|
||||||
@ -711,6 +740,7 @@ class ITUNES(DevicePlugin):
|
|||||||
Cache generated thumbnails
|
Cache generated thumbnails
|
||||||
cache_dir = os.path.join(config_dir, 'caches', 'itunes')
|
cache_dir = os.path.join(config_dir, 'caches', 'itunes')
|
||||||
'''
|
'''
|
||||||
|
|
||||||
archive_path = os.path.join(self.cache_dir, "thumbs.zip")
|
archive_path = os.path.join(self.cache_dir, "thumbs.zip")
|
||||||
thumb_path = book_path.rpartition('.')[0] + '.jpg'
|
thumb_path = book_path.rpartition('.')[0] + '.jpg'
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user