diff options
author | Jaime Marquínez Ferrándiz <jaime.marquinez.ferrandiz@gmail.com> | 2013-04-28 11:39:37 +0200 |
---|---|---|
committer | Jaime Marquínez Ferrándiz <jaime.marquinez.ferrandiz@gmail.com> | 2013-04-28 11:39:37 +0200 |
commit | 37254abc36695692649348099fae0ed8f73fd3d1 (patch) | |
tree | 8e47732831058225e8f76cd96851865bac405d6d | |
parent | a11ea50319c5dc5d01098e28122617391c97d555 (diff) |
Allow to use relative dates in the format (now|today)[+-][0-9](day|week|month|year)(s)? (Closes #137)
Also fix DateRange not accepting ranges of one day.
-rw-r--r-- | test/test_utils.py | 2 | ||||
-rw-r--r-- | youtube_dl/utils.py | 31 |
2 files changed, 28 insertions, 5 deletions
diff --git a/test/test_utils.py b/test/test_utils.py index 343409a7a..c4b71362e 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -105,7 +105,7 @@ class TestUtil(unittest.TestCase): self.assertTrue("19690721" in _ac) _firstmilenium = DateRange(end="10000101") self.assertTrue("07110427" in _firstmilenium) - + def test_unified_dates(self): self.assertEqual(unified_strdate('December 21, 2010'), '20101221') self.assertEqual(unified_strdate('8/7/2009'), '20090708') diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index 3a2f0022f..6c5b5df4c 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -586,7 +586,29 @@ def unified_strdate(date_str): return upload_date def date_from_str(date_str): - """Return a datetime object from a string in the format YYYYMMDD""" + """ + Return a datetime object from a string in the format YYYYMMDD or + (now|today)[+-][0-9](day|week|month|year)(s)?""" + today = datetime.date.today() + if date_str == 'now'or date_str == 'today': + return today + match = re.match('(now|today)(?P<sign>[+-])(?P<time>\d+)(?P<unit>day|week|month|year)(s)?', date_str) + if match is not None: + sign = match.group('sign') + time = int(match.group('time')) + if sign == '-': + time = -time + unit = match.group('unit') + #A bad aproximation? + if unit == 'month': + unit = 'day' + time *= 30 + elif unit == 'year': + unit = 'day' + time *= 365 + unit += 's' + delta = datetime.timedelta(**{unit: time}) + return today + delta return datetime.datetime.strptime(date_str, "%Y%m%d").date() class DateRange(object): @@ -601,7 +623,7 @@ class DateRange(object): self.end = date_from_str(end) else: self.end = datetime.datetime.max.date() - if self.start >= self.end: + if self.start > self.end: raise ValueError('Date range: "%s" , the start date must be before the end date' % self) @classmethod def day(cls, day): @@ -609,7 +631,8 @@ class DateRange(object): return cls(day,day) def __contains__(self, date): """Check if the date is in the range""" - date = date_from_str(date) - return self.start <= date and date <= self.end + if not isinstance(date, datetime.date): + date = date_from_str(date) + return self.start <= date <= self.end def __str__(self): return '%s - %s' % ( self.start.isoformat(), self.end.isoformat()) |