scdl/scdl/utils.py

75 lines
1.7 KiB
Python

# -*- encoding: utf-8 -*-
"""
Copied from
https://github.com/davidfischer-ch/pytoolbox/blob/master/pytoolbox/logging.py
"""
import logging
import re
from termcolor import colored
__all__ = ('ColorizeFilter', )
class ColorizeFilter(logging.Filter):
color_by_level = {
logging.DEBUG: 'blue',
logging.WARNING: 'yellow',
logging.ERROR: 'red',
logging.INFO: 'white'
}
def filter(self, record):
record.raw_msg = record.msg
color = self.color_by_level.get(record.levelno)
if color:
record.msg = colored(record.msg, color)
return True
def size_in_bytes(insize):
"""
Returns the size in bytes from strings such as '5 mb' into 5242880.
>>> size_in_bytes('1m')
1048576
>>> size_in_bytes('1.5m')
1572864
>>> size_in_bytes('2g')
2147483648
>>> size_in_bytes(None)
Traceback (most recent call last):
raise ValueError('no string specified')
ValueError: no string specified
>>> size_in_bytes('')
Traceback (most recent call last):
raise ValueError('no string specified')
ValueError: no string specified
"""
if insize is None or insize.strip() == '':
raise ValueError('no string specified')
units = {
'k': 1024,
'm': 1024 ** 2,
'g': 1024 ** 3,
't': 1024 ** 4,
'p': 1024 ** 5,
}
match = re.search('^\s*([0-9\.]+)\s*([kmgtp])?', insize, re.I)
if match is None:
raise ValueError('match not found')
size, unit = match.groups()
if size:
size = float(size)
if unit:
size = size * units[unit.lower().strip()]
return int(size)