def schedule_recipe(self, recipe, schedule_type, schedule, last_downloaded=None): with self.lock: for x in list(self.iter_recipes()): if x.get('id', False) == recipe.get('id'): ld = x.get('last_downloaded', None) if ld and last_downloaded is None: try: last_downloaded = parse_iso8601(ld) except Exception: pass self.root.remove(x) break if last_downloaded is None: last_downloaded = EPOCH sr = E.scheduled_recipe( { 'id': recipe.get('id'), 'title': recipe.get('title'), 'last_downloaded': isoformat(last_downloaded), }, self.serialize_schedule(schedule_type, schedule)) self.root.append(sr) self.write_scheduler_file()
def from_json(obj): if '__class__' in obj: if obj['__class__'] == 'bytearray': return bytearray(base64.standard_b64decode(obj['__value__'])) if obj['__class__'] == 'datetime.datetime': from calibre.utils.iso8601 import parse_iso8601 return parse_iso8601(obj['__value__'], assume_utc=True) return obj
def string_to_datetime(src): from calibre.utils.iso8601 import parse_iso8601 if src != "None": try: return parse_iso8601(src) except Exception: pass return None
def annotations_as_copied_list(annots_map): for atype, annots in iteritems(annots_map): for annot in annots: ts = (parse_iso8601(annot['timestamp'], assume_utc=True) - EPOCH).total_seconds() annot = annot.copy() annot['type'] = atype yield annot, ts
def highlights_changed(self, highlights): if not self.current_book_data: return for h in highlights: h['timestamp'] = parse_iso8601(h['timestamp'], assume_utc=True) amap = self.current_book_data['annotations_map'] amap['highlight'] = highlights self.save_annotations()
def parse_date(raw, is_w3cdtf=False): raw = raw.strip() if is_w3cdtf: ans = parse_iso8601(raw, assume_utc=True) if 'T' not in raw and ' ' not in raw: ans = fix_only_date(ans) else: ans = parse_date_(raw, assume_utc=True) if ' ' not in raw and 'T' not in raw and (ans.hour, ans.minute, ans.second) == (0, 0, 0): ans = fix_only_date(ans) return ans
def from_json(obj): custom = obj.get('__class__') if custom is not None: if custom == 'bytearray': from base64 import standard_b64decode return bytearray(standard_b64decode(obj['__value__'].encode('ascii'))) if custom == 'datetime.datetime': from calibre.utils.iso8601 import parse_iso8601 return parse_iso8601(obj['__value__'], assume_utc=True) if custom == 'set': return set(obj['__value__']) return obj
def read_from_cache(full_name): rowid = etag = data = date = None database = db() with suppress(StopIteration): rowid, etag, data, date = next(database.cursor().execute( table_definition() + 'SELECT id, etag, data, date FROM modules WHERE full_name=? LIMIT 1', (full_name, ))) if rowid is not None: database.cursor().execute( 'UPDATE modules SET atime=CURRENT_TIMESTAMP WHERE id=?', (rowid, )) if date is not None: date = parse_iso8601(date, assume_utc=True) return etag, data, date
def un_serialize_schedule(self, recipe): for x in recipe.iterdescendants(): if 'schedule' in x.tag: sch, typ = x.text, x.get('type') if typ == 'interval': sch = float(sch) elif typ == 'day/time': sch = list(map(int, sch.split(':'))) elif typ in ('days_of_week', 'days_of_month'): parts = sch.split(':') days = list(map(int, [x.strip() for x in parts[0].split(',')])) sch = [days, int(parts[1]), int(parts[2])] try: ld = parse_iso8601(recipe.get('last_downloaded')) except Exception: ld = UNDEFINED_DATE return typ, sch, ld
def un_serialize_schedule(self, recipe): for x in recipe.iterdescendants(): if 'schedule' in x.tag: sch, typ = x.text, x.get('type') if typ == 'interval': sch = float(sch) elif typ == 'day/time': sch = list(map(int, sch.split(':'))) elif typ in ('days_of_week', 'days_of_month'): parts = sch.split(':') days = list( map(int, [x.strip() for x in parts[0].split(',')])) sch = [days, int(parts[1]), int(parts[2])] try: ld = parse_iso8601(recipe.get('last_downloaded')) except Exception: ld = UNDEFINED_DATE return typ, sch, ld
def schedule_recipe(self, recipe, schedule_type, schedule, last_downloaded=None): with self.lock: for x in list(self.iter_recipes()): if x.get('id', False) == recipe.get('id'): ld = x.get('last_downloaded', None) if ld and last_downloaded is None: try: last_downloaded = parse_iso8601(ld) except Exception: pass self.root.remove(x) break if last_downloaded is None: last_downloaded = fromordinal(1) sr = E.scheduled_recipe({ 'id' : recipe.get('id'), 'title': recipe.get('title'), 'last_downloaded':isoformat(last_downloaded), }, self.serialize_schedule(schedule_type, schedule)) self.root.append(sr) self.write_scheduler_file()
def field_from_string(field, raw, field_metadata): ''' Parse the string raw to return an object that is suitable for calling set() on a Metadata object. ''' dt = field_metadata['datatype'] val = object if dt in {'int', 'float'}: val = int(raw) if dt == 'int' else float(raw) elif dt == 'rating': val = float(raw) * 2 elif dt == 'datetime': from calibre.utils.iso8601 import parse_iso8601 try: val = parse_iso8601(raw, require_aware=True) except Exception: from calibre.utils.date import parse_only_date val = parse_only_date(raw) elif dt == 'bool': if raw.lower() in {'true', 'yes', 'y'}: val = True elif raw.lower() in {'false', 'no', 'n'}: val = False else: raise ValueError('Unknown value for %s: %s' % (field, raw)) elif dt == 'text': ism = field_metadata['is_multiple'] if ism: val = [x.strip() for x in raw.split(ism['ui_to_list'])] if field == 'identifiers': val = {x.partition(':')[0]: x.partition(':')[-1] for x in val} elif field == 'languages': from calibre.utils.localization import canonicalize_lang val = [canonicalize_lang(x) for x in val] val = [x for x in val if x] if val is object: val = raw return val
def parse_annotation(annot): ts = annot['timestamp'] if hasattr(ts, 'rstrip'): annot['timestamp'] = parse_iso8601(ts, assume_utc=True) return annot
obj.cover_data = obj.cover_data[0], base64.standard_b64decode( obj.cover_data[1]) return obj def decode_field_metadata(x, for_json): from calibre.library.field_metadata import fm_from_dict return fm_from_dict(x) def decode_category_tag(x, for_json): from calibre.db.categories import Tag return Tag.from_dict(x) decoders = (lambda x, fj: parse_iso8601(x, assume_utc=True), lambda x, fj: set(x), decode_metadata, decode_field_metadata, decode_category_tag) def json_decoder(obj): typ = obj.get(CANARY) if typ is None: return obj return decoders[typ](obj['v'], True) def msgpack_decoder(code, data): return decoders[code](msgpack_loads(data), False)
) return obj def decode_field_metadata(x, for_json): from calibre.library.field_metadata import fm_from_dict return fm_from_dict(x) def decode_category_tag(x, for_json): from calibre.db.categories import Tag return Tag.from_dict(x) decoders = ( lambda x, fj: parse_iso8601(x, assume_utc=True), lambda x, fj: set(x), decode_metadata, decode_field_metadata, decode_category_tag ) def json_decoder(obj): typ = obj.get(CANARY) if typ is None: return obj return decoders[typ](obj['v'], True) def msgpack_decoder(code, data): return decoders[code](msgpack_loads(data), False)
def decode_datetime(x, fj): from calibre.utils.iso8601 import parse_iso8601 return parse_iso8601(x, assume_utc=True)