aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpukkandan <pukkandan.ytdlp@gmail.com>2021-11-20 08:05:57 +0530
committerpukkandan <pukkandan.ytdlp@gmail.com>2021-11-20 08:33:55 +0530
commit282f570918f936a3aa9f57d4c85de4693da882c9 (patch)
tree2b8dd78cd1a04bd3ff7efb64156052dbac16db6c
parentc07a39ae8e3e3b71ec8c7c0fa3e91b6908584316 (diff)
downloadhypervideo-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.py10
-rw-r--r--yt_dlp/YoutubeDL.py4
-rw-r--r--yt_dlp/utils.py20
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