diff options
| author | pukkandan <pukkandan.ytdlp@gmail.com> | 2021-11-20 08:05:57 +0530 | 
|---|---|---|
| committer | pukkandan <pukkandan.ytdlp@gmail.com> | 2021-11-20 08:33:55 +0530 | 
| commit | 282f570918f936a3aa9f57d4c85de4693da882c9 (patch) | |
| tree | 2b8dd78cd1a04bd3ff7efb64156052dbac16db6c | |
| parent | c07a39ae8e3e3b71ec8c7c0fa3e91b6908584316 (diff) | |
| download | hypervideo-pre-282f570918f936a3aa9f57d4c85de4693da882c9.tar.lz hypervideo-pre-282f570918f936a3aa9f57d4c85de4693da882c9.tar.xz hypervideo-pre-282f570918f936a3aa9f57d4c85de4693da882c9.zip | |
[utils] Fix error when copying `LazyList`
| -rw-r--r-- | test/test_utils.py | 10 | ||||
| -rw-r--r-- | yt_dlp/YoutubeDL.py | 4 | ||||
| -rw-r--r-- | yt_dlp/utils.py | 20 | 
3 files changed, 21 insertions, 13 deletions
| diff --git a/test/test_utils.py b/test/test_utils.py index b918ae2b6..22dda4f37 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -1657,9 +1657,9 @@ Line 1          self.assertEqual(repr(LazyList(it)), repr(it))          self.assertEqual(str(LazyList(it)), str(it)) -        self.assertEqual(list(LazyList(it).reverse()), it[::-1]) -        self.assertEqual(list(LazyList(it).reverse()[1:3:7]), it[::-1][1:3:7]) -        self.assertEqual(list(LazyList(it).reverse()[::-1]), it) +        self.assertEqual(list(LazyList(it, reverse=True)), it[::-1]) +        self.assertEqual(list(reversed(LazyList(it))[::-1]), it) +        self.assertEqual(list(reversed(LazyList(it))[1:3:7]), it[::-1][1:3:7])      def test_LazyList_laziness(self): @@ -1672,13 +1672,13 @@ Line 1          test(ll, 5, 5, range(6))          test(ll, -3, 7, range(10)) -        ll = LazyList(range(10)).reverse() +        ll = LazyList(range(10), reverse=True)          test(ll, -1, 0, range(1))          test(ll, 3, 6, range(10))          ll = LazyList(itertools.count())          test(ll, 10, 10, range(11)) -        ll.reverse() +        ll = reversed(ll)          test(ll, -15, 14, range(15)) diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index 62ec087b8..fb7e12624 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -2166,7 +2166,7 @@ class YoutubeDL(object):              t['url'] = sanitize_url(t['url'])          if self.params.get('check_formats') is True: -            info_dict['thumbnails'] = LazyList(check_thumbnails(thumbnails[::-1])).reverse() +            info_dict['thumbnails'] = LazyList(check_thumbnails(thumbnails[::-1]), reverse=True)          else:              info_dict['thumbnails'] = thumbnails @@ -2361,7 +2361,7 @@ class YoutubeDL(object):          # TODO Central sorting goes here          if self.params.get('check_formats') is True: -            formats = LazyList(self._check_formats(formats[::-1])).reverse() +            formats = LazyList(self._check_formats(formats[::-1]), reverse=True)          if not formats or formats[0] is not info_dict:              # only set the 'formats' fields if the original info_dict list them diff --git a/yt_dlp/utils.py b/yt_dlp/utils.py index 2d5b9892d..ade2bbff1 100644 --- a/yt_dlp/utils.py +++ b/yt_dlp/utils.py @@ -4086,10 +4086,10 @@ class LazyList(collections.abc.Sequence):      class IndexError(IndexError):          pass -    def __init__(self, iterable): +    def __init__(self, iterable, *, reverse=False, _cache=None):          self.__iterable = iter(iterable) -        self.__cache = [] -        self.__reversed = False +        self.__cache = [] if _cache is None else _cache +        self.__reversed = reverse      def __iter__(self):          if self.__reversed: @@ -4155,9 +4155,17 @@ class LazyList(collections.abc.Sequence):          self.__exhaust()          return len(self.__cache) -    def reverse(self): -        self.__reversed = not self.__reversed -        return self +    def __reversed__(self): +        return type(self)(self.__iterable, reverse=not self.__reversed, _cache=self.__cache) + +    def __copy__(self): +        return type(self)(self.__iterable, reverse=self.__reversed, _cache=self.__cache) + +    def __deepcopy__(self, memo): +        # FIXME: This is actually just a shallow copy +        id_ = id(self) +        memo[id_] = self.__copy__() +        return memo[id_]      def __repr__(self):          # repr and str should mimic a list. So we exhaust the iterable | 
