diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py index eb68780a86..d34c21d825 100644 --- a/src/calibre/customize/builtins.py +++ b/src/calibre/customize/builtins.py @@ -1761,7 +1761,8 @@ if __name__ == '__main__': for x in ('lxml', 'calibre.ebooks.BeautifulSoup', 'uuid', 'calibre.utils.terminal', 'calibre.utils.magick', 'PIL', 'Image', - 'sqlite3', 'mechanize', 'httplib', 'xml', 'inspect', 'urllib'): + 'sqlite3', 'mechanize', 'httplib', 'xml', 'inspect', 'urllib', + 'calibre.utils.date'): if x in sys.modules: ret = 1 print (x, 'has been loaded by a plugin') diff --git a/src/calibre/devices/apple/driver.py b/src/calibre/devices/apple/driver.py index 4ff1eef714..1bedd298a9 100644 --- a/src/calibre/devices/apple/driver.py +++ b/src/calibre/devices/apple/driver.py @@ -18,12 +18,12 @@ from calibre.ebooks.metadata import (author_to_author_sort, authors_to_string, MetaInformation, title_sort) from calibre.ebooks.metadata.book.base import Metadata from calibre.utils.config import config_dir, dynamic, prefs -from calibre.utils.date import now, parse_date from calibre.utils.zipfile import ZipFile DEBUG = CALIBRE_DEBUG def strftime(fmt='%Y/%m/%d %H:%M:%S', dt=None): + from calibre.utils.date import now if not hasattr(dt, 'timetuple'): dt = now() @@ -413,6 +413,7 @@ class ITUNES(DriverBase): list of device books. """ + from calibre.utils.date import parse_date if not oncard: if DEBUG: logger().info("%s.books():" % self.__class__.__name__) @@ -1557,6 +1558,7 @@ class ITUNES(DriverBase): def _create_new_book(self, fpath, metadata, path, db_added, lb_added, thumb, format): ''' ''' + from calibre.utils.date import parse_date if DEBUG: logger().info(" %s._create_new_book()" % self.__class__.__name__) @@ -2776,6 +2778,7 @@ class ITUNES(DriverBase): def _update_epub_metadata(self, fpath, metadata): ''' ''' + from calibre.utils.date import parse_date, now from calibre.ebooks.metadata.epub import set_metadata from lxml import etree @@ -3248,6 +3251,7 @@ class ITUNES_ASYNC(ITUNES): list of device books. """ + from calibre.utils.date import parse_date if not oncard: if DEBUG: logger().info("%s.books()" % self.__class__.__name__) diff --git a/src/calibre/devices/kobo/books.py b/src/calibre/devices/kobo/books.py index c9bfe8d622..7e552e8de1 100644 --- a/src/calibre/devices/kobo/books.py +++ b/src/calibre/devices/kobo/books.py @@ -11,7 +11,6 @@ from calibre.utils.icu import sort_key from calibre.devices.usbms.books import Book as Book_ from calibre.devices.usbms.books import CollectionsBookList from calibre.utils.config import prefs -from calibre.utils.date import parse_date from calibre.devices.usbms.driver import debug_print from calibre.ebooks.metadata import author_to_author_sort @@ -19,6 +18,7 @@ class Book(Book_): def __init__(self, prefix, lpath, title=None, authors=None, mime=None, date=None, ContentType=None, thumbnail_name=None, size=None, other=None): + from calibre.utils.date import parse_date # debug_print('Book::__init__ - title=', title) show_debug = title is not None and title.lower().find("xxxxx") >= 0 if show_debug: diff --git a/src/calibre/devices/mtp/driver.py b/src/calibre/devices/mtp/driver.py index b1850c9e49..20a637a317 100644 --- a/src/calibre/devices/mtp/driver.py +++ b/src/calibre/devices/mtp/driver.py @@ -18,7 +18,6 @@ from calibre.devices.mtp.base import debug from calibre.devices.mtp.defaults import DeviceDefaults from calibre.ptempfile import SpooledTemporaryFile, PersistentTemporaryDirectory from calibre.utils.config import from_json, to_json, JSONConfig -from calibre.utils.date import now, isoformat, utcnow from calibre.utils.filenames import shorten_components_to BASE = importlib.import_module('calibre.devices.mtp.%s.driver'%( @@ -103,6 +102,7 @@ class MTP_DEVICE(BASE): del self.prefs[x] def open(self, device, library_uuid): + from calibre.utils.date import isoformat, utcnow self.current_library_uuid = library_uuid self.location_paths = None self.driveinfo = {} @@ -128,6 +128,7 @@ class MTP_DEVICE(BASE): # Device information {{{ def _update_drive_info(self, storage, location_code, name=None): + from calibre.utils.date import isoformat, now import uuid f = storage.find_path((self.DRIVEINFO,)) dinfo = {} diff --git a/src/calibre/devices/smart_device_app/driver.py b/src/calibre/devices/smart_device_app/driver.py index 844932f5e3..1c41e2c585 100644 --- a/src/calibre/devices/smart_device_app/driver.py +++ b/src/calibre/devices/smart_device_app/driver.py @@ -35,7 +35,6 @@ from calibre.library.server import server_config as content_server_config from calibre.ptempfile import PersistentTemporaryFile from calibre.utils.ipc import eintr_retry_call from calibre.utils.config import from_json, tweaks -from calibre.utils.date import isoformat, now from calibre.utils.filenames import ascii_filename as sanitize, shorten_components_to from calibre.utils.mdns import (publish as publish_zeroconf, unpublish as unpublish_zeroconf, get_all_ips) @@ -374,6 +373,7 @@ class SMART_DEVICE_APP(DeviceConfig, DevicePlugin): # copied from USBMS. Perhaps this could be a classmethod in usbms? def _update_driveinfo_record(self, dinfo, prefix, location_code, name=None): + from calibre.utils.date import isoformat, now import uuid if not isinstance(dinfo, dict): dinfo = {} @@ -817,6 +817,7 @@ class SMART_DEVICE_APP(DeviceConfig, DevicePlugin): @synchronous('sync_lock') def open(self, connected_device, library_uuid): + from calibre.utils.date import isoformat, now self._debug() if not self.is_connected: # We have been called to retry the connection. Give up immediately diff --git a/src/calibre/devices/usbms/driver.py b/src/calibre/devices/usbms/driver.py index 5ade700b7f..3b4fe434e5 100644 --- a/src/calibre/devices/usbms/driver.py +++ b/src/calibre/devices/usbms/driver.py @@ -21,7 +21,6 @@ from calibre.devices.usbms.device import Device from calibre.devices.usbms.books import BookList, Book from calibre.ebooks.metadata.book.json_codec import JsonCodec from calibre.utils.config import from_json, to_json -from calibre.utils.date import now, isoformat BASE_TIME = None def debug_print(*args): @@ -58,6 +57,7 @@ class USBMS(CLI, Device): SCAN_FROM_ROOT = False def _update_driveinfo_record(self, dinfo, prefix, location_code, name=None): + from calibre.utils.date import now, isoformat import uuid if not isinstance(dinfo, dict): dinfo = {} diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 256751223b..2f11ca9326 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -13,7 +13,6 @@ from calibre.ebooks.metadata.book import (SC_COPYABLE_FIELDS, SC_FIELDS_COPY_NOT_NULL, STANDARD_METADATA_FIELDS, TOP_LEVEL_IDENTIFIERS, ALL_METADATA_FIELDS) from calibre.library.field_metadata import FieldMetadata -from calibre.utils.date import isoformat, format_date, parse_only_date from calibre.utils.icu import sort_key # Special sets used to optimize the performance of getting and setting @@ -602,6 +601,7 @@ class Metadata(object): returns the tuple (display_name, formatted_value, original_value, field_metadata) ''' + from calibre.utils.date import format_date # Handle custom series index if key.startswith('#') and key.endswith('_index'): @@ -686,6 +686,7 @@ class Metadata(object): A string representation of this object, suitable for printing to console ''' + from calibre.utils.date import isoformat from calibre.ebooks.metadata import authors_to_string ans = [] def fmt(x, y): @@ -778,6 +779,7 @@ def field_from_string(field, raw, field_metadata): elif dt == 'rating': val = float(raw) * 2 elif dt == 'datetime': + from calibre.utils.date import parse_only_date val = parse_only_date(raw) elif dt == 'bool': if raw.lower() in {'true', 'yes', 'y'}: diff --git a/src/calibre/ebooks/metadata/book/json_codec.py b/src/calibre/ebooks/metadata/book/json_codec.py index e9cec8acc7..fc95749f12 100644 --- a/src/calibre/ebooks/metadata/book/json_codec.py +++ b/src/calibre/ebooks/metadata/book/json_codec.py @@ -11,17 +11,18 @@ from datetime import datetime, time from calibre.ebooks.metadata.book import SERIALIZABLE_FIELDS from calibre.constants import filesystem_encoding, preferred_encoding from calibre.library.field_metadata import FieldMetadata -from calibre.utils.date import parse_date, isoformat, UNDEFINED_DATE, local_tz from calibre import isbytestring # Translate datetimes to and from strings. The string form is the datetime in # UTC. The returned date is also UTC def string_to_datetime(src): + from calibre.utils.date import parse_date if src == "None": return None return parse_date(src) def datetime_to_string(dateval): + from calibre.utils.date import isoformat, UNDEFINED_DATE, local_tz if dateval is None: return "None" if not isinstance(dateval, datetime): diff --git a/src/calibre/ebooks/metadata/sources/amazon.py b/src/calibre/ebooks/metadata/sources/amazon.py index c9df67c999..eb9e5a18cc 100644 --- a/src/calibre/ebooks/metadata/sources/amazon.py +++ b/src/calibre/ebooks/metadata/sources/amazon.py @@ -17,7 +17,6 @@ from calibre.ebooks.metadata import check_isbn from calibre.ebooks.metadata.sources.base import (Source, Option, fixcase, fixauthors) from calibre.ebooks.metadata.book.base import Metadata -from calibre.utils.date import parse_only_date from calibre.utils.localization import canonicalize_lang class Worker(Thread): # Get details {{{ @@ -494,6 +493,7 @@ class Worker(Thread): # Get details {{{ def parse_pubdate(self, pd): for x in reversed(pd.xpath(self.publisher_xpath)): if x.tail: + from calibre.utils.date import parse_only_date ans = x.tail date = ans.rpartition('(')[-1].replace(')', '').strip() date = self.delocalize_datestr(date) diff --git a/src/calibre/ebooks/metadata/sources/base.py b/src/calibre/ebooks/metadata/sources/base.py index 13069eb86f..cb2729fe1c 100644 --- a/src/calibre/ebooks/metadata/sources/base.py +++ b/src/calibre/ebooks/metadata/sources/base.py @@ -13,7 +13,6 @@ from future_builtins import map from calibre import browser, random_user_agent from calibre.customize import Plugin from calibre.utils.config import JSONConfig -from calibre.utils.titlecase import titlecase from calibre.utils.icu import capitalize, lower, upper from calibre.ebooks.metadata import check_isbn @@ -162,6 +161,7 @@ def fixauthors(authors): def fixcase(x): if x: + from calibre.utils.titlecase import titlecase x = titlecase(x) return x diff --git a/src/calibre/ebooks/metadata/sources/google.py b/src/calibre/ebooks/metadata/sources/google.py index 4df5c84c02..e2a89c272e 100644 --- a/src/calibre/ebooks/metadata/sources/google.py +++ b/src/calibre/ebooks/metadata/sources/google.py @@ -15,7 +15,6 @@ from calibre.ebooks.metadata import check_isbn from calibre.ebooks.metadata.sources.base import Source from calibre.ebooks.metadata.book.base import Metadata from calibre.ebooks.chardet import xml_to_unicode -from calibre.utils.date import parse_date, utcnow from calibre.utils.cleantext import clean_ascii_chars from calibre.utils.localization import canonicalize_lang from calibre import as_unicode @@ -130,6 +129,7 @@ def to_metadata(browser, log, entry_, timeout): # {{{ # pubdate pubdate = get_text(extra, date) if pubdate: + from calibre.utils.date import parse_date, utcnow try: default = utcnow().replace(day=15) mi.pubdate = parse_date(pubdate, assume_utc=True, default=default) diff --git a/src/calibre/ebooks/metadata/sources/ozon.py b/src/calibre/ebooks/metadata/sources/ozon.py index a3c5421214..b630910e15 100644 --- a/src/calibre/ebooks/metadata/sources/ozon.py +++ b/src/calibre/ebooks/metadata/sources/ozon.py @@ -12,7 +12,6 @@ from calibre import as_unicode from calibre.ebooks.metadata import check_isbn from calibre.ebooks.metadata.sources.base import Source from calibre.ebooks.metadata.book.base import Metadata -from calibre.utils.date import parse_only_date class Ozon(Source): name = 'OZON.ru' @@ -460,6 +459,7 @@ def _normalizeAuthorNameWithInitials(name): # {{{ # }}} def toPubdate(log, yearAsString): # {{{ + from calibre.utils.date import parse_only_date res = None if yearAsString: try: