mirror of
				https://gitlab.com/ytdl-org/youtube-dl.git
				synced 2025-11-03 22:17:06 -05:00 
			
		
		
		
	[bbc] Generalize unit table lookup and add parse_count
This commit is contained in:
		@@ -41,6 +41,7 @@ from youtube_dl.utils import (
 | 
			
		||||
    orderedSet,
 | 
			
		||||
    parse_duration,
 | 
			
		||||
    parse_filesize,
 | 
			
		||||
    parse_count,
 | 
			
		||||
    parse_iso8601,
 | 
			
		||||
    read_batch_urls,
 | 
			
		||||
    sanitize_filename,
 | 
			
		||||
@@ -653,6 +654,15 @@ class TestUtil(unittest.TestCase):
 | 
			
		||||
        self.assertEqual(parse_filesize('1.2Tb'), 1200000000000)
 | 
			
		||||
        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):
 | 
			
		||||
        self.assertEqual(version_tuple('1'), (1,))
 | 
			
		||||
        self.assertEqual(version_tuple('10.23.344'), (10, 23, 344))
 | 
			
		||||
 
 | 
			
		||||
@@ -1316,6 +1316,17 @@ def format_bytes(bytes):
 | 
			
		||||
    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):
 | 
			
		||||
    if s is None:
 | 
			
		||||
        return None
 | 
			
		||||
@@ -1359,16 +1370,28 @@ def parse_filesize(s):
 | 
			
		||||
        'Yb': 1000 ** 8,
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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 lookup_unit_table(_UNIT_TABLE, s)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def parse_count(s):
 | 
			
		||||
    if s is None:
 | 
			
		||||
        return None
 | 
			
		||||
 | 
			
		||||
    num_str = m.group('num').replace(',', '.')
 | 
			
		||||
    mult = _UNIT_TABLE[m.group('unit')]
 | 
			
		||||
    return int(float(num_str) * mult)
 | 
			
		||||
    s = s.strip()
 | 
			
		||||
 | 
			
		||||
    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):
 | 
			
		||||
    """ Return the number of a month by (locale-independently) English name """
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user