Exemplo n.º 1
0
 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()
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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
Exemplo n.º 6
0
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
Exemplo n.º 7
0
 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()
Exemplo n.º 8
0
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
Exemplo n.º 9
0
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
Exemplo n.º 10
0
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
Exemplo n.º 11
0
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
Exemplo n.º 12
0
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
Exemplo n.º 13
0
 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
Exemplo n.º 14
0
 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
Exemplo n.º 15
0
 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()
Exemplo n.º 16
0
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
Exemplo n.º 17
0
def parse_annotation(annot):
    ts = annot['timestamp']
    if hasattr(ts, 'rstrip'):
        annot['timestamp'] = parse_iso8601(ts, assume_utc=True)
    return annot
Exemplo n.º 18
0
        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)

Exemplo n.º 19
0
        )
    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)

Exemplo n.º 20
0
def decode_datetime(x, fj):
    from calibre.utils.iso8601 import parse_iso8601
    return parse_iso8601(x, assume_utc=True)
Exemplo n.º 21
0
def decode_datetime(x, fj):
    from calibre.utils.iso8601 import parse_iso8601
    return parse_iso8601(x, assume_utc=True)