[bbc] Generalize unit table lookup and add parse_count
This commit is contained in:
parent
450b233cc2
commit
fb47597b09
2 changed files with 40 additions and 7 deletions
|
@ -41,6 +41,7 @@ from youtube_dl.utils import (
|
||||||
orderedSet,
|
orderedSet,
|
||||||
parse_duration,
|
parse_duration,
|
||||||
parse_filesize,
|
parse_filesize,
|
||||||
|
parse_count,
|
||||||
parse_iso8601,
|
parse_iso8601,
|
||||||
read_batch_urls,
|
read_batch_urls,
|
||||||
sanitize_filename,
|
sanitize_filename,
|
||||||
|
@ -653,6 +654,15 @@ class TestUtil(unittest.TestCase):
|
||||||
self.assertEqual(parse_filesize('1.2Tb'), 1200000000000)
|
self.assertEqual(parse_filesize('1.2Tb'), 1200000000000)
|
||||||
self.assertEqual(parse_filesize('1,24 KB'), 1240)
|
self.assertEqual(parse_filesize('1,24 KB'), 1240)
|
||||||
|
|
||||||
|
def test_parse_count(self):
|
||||||
|
self.assertEqual(parse_count(None), None)
|
||||||
|
self.assertEqual(parse_count(''), None)
|
||||||
|
self.assertEqual(parse_count('0'), 0)
|
||||||
|
self.assertEqual(parse_count('1000'), 1000)
|
||||||
|
self.assertEqual(parse_count('1.000'), 1000)
|
||||||
|
self.assertEqual(parse_count('1.1k'), 1100)
|
||||||
|
self.assertEqual(parse_count('1.1kk'), 1100000)
|
||||||
|
|
||||||
def test_version_tuple(self):
|
def test_version_tuple(self):
|
||||||
self.assertEqual(version_tuple('1'), (1,))
|
self.assertEqual(version_tuple('1'), (1,))
|
||||||
self.assertEqual(version_tuple('10.23.344'), (10, 23, 344))
|
self.assertEqual(version_tuple('10.23.344'), (10, 23, 344))
|
||||||
|
|
|
@ -1316,6 +1316,17 @@ def format_bytes(bytes):
|
||||||
return '%.2f%s' % (converted, suffix)
|
return '%.2f%s' % (converted, suffix)
|
||||||
|
|
||||||
|
|
||||||
|
def lookup_unit_table(unit_table, s):
|
||||||
|
units_re = '|'.join(re.escape(u) for u in unit_table)
|
||||||
|
m = re.match(
|
||||||
|
r'(?P<num>[0-9]+(?:[,.][0-9]*)?)\s*(?P<unit>%s)' % units_re, s)
|
||||||
|
if not m:
|
||||||
|
return None
|
||||||
|
num_str = m.group('num').replace(',', '.')
|
||||||
|
mult = unit_table[m.group('unit')]
|
||||||
|
return int(float(num_str) * mult)
|
||||||
|
|
||||||
|
|
||||||
def parse_filesize(s):
|
def parse_filesize(s):
|
||||||
if s is None:
|
if s is None:
|
||||||
return None
|
return None
|
||||||
|
@ -1359,16 +1370,28 @@ def parse_filesize(s):
|
||||||
'Yb': 1000 ** 8,
|
'Yb': 1000 ** 8,
|
||||||
}
|
}
|
||||||
|
|
||||||
units_re = '|'.join(re.escape(u) for u in _UNIT_TABLE)
|
return lookup_unit_table(_UNIT_TABLE, s)
|
||||||
m = re.match(
|
|
||||||
r'(?P<num>[0-9]+(?:[,.][0-9]*)?)\s*(?P<unit>%s)' % units_re, s)
|
|
||||||
if not m:
|
def parse_count(s):
|
||||||
|
if s is None:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
num_str = m.group('num').replace(',', '.')
|
s = s.strip()
|
||||||
mult = _UNIT_TABLE[m.group('unit')]
|
|
||||||
return int(float(num_str) * mult)
|
|
||||||
|
|
||||||
|
if re.match(r'^[\d,.]+$', s):
|
||||||
|
return str_to_int(s)
|
||||||
|
|
||||||
|
_UNIT_TABLE = {
|
||||||
|
'k': 1000,
|
||||||
|
'K': 1000,
|
||||||
|
'm': 1000 ** 2,
|
||||||
|
'M': 1000 ** 2,
|
||||||
|
'kk': 1000 ** 2,
|
||||||
|
'KK': 1000 ** 2,
|
||||||
|
}
|
||||||
|
|
||||||
|
return lookup_unit_table(_UNIT_TABLE, s)
|
||||||
|
|
||||||
def month_by_name(name):
|
def month_by_name(name):
|
||||||
""" Return the number of a month by (locale-independently) English name """
|
""" Return the number of a month by (locale-independently) English name """
|
||||||
|
|
Loading…
Reference in a new issue