From 9e598870dd66f818c394bf08a57f2a8a497b83a6 Mon Sep 17 00:00:00 2001 From: pukkandan Date: Tue, 17 Aug 2021 19:02:06 +0530 Subject: [PATCH] Fix `playlist_index` not obeying `playlist_start` and add tests Closes #720 --- test/test_YoutubeDL.py | 65 ++++++++++++++---------------------------- yt_dlp/YoutubeDL.py | 4 +-- 2 files changed, 23 insertions(+), 46 deletions(-) diff --git a/test/test_YoutubeDL.py b/test/test_YoutubeDL.py index 7e0133027..e689978fd 100644 --- a/test/test_YoutubeDL.py +++ b/test/test_YoutubeDL.py @@ -978,54 +978,31 @@ class TestYoutubeDL(unittest.TestCase): ydl.process_ie_result(copy.deepcopy(playlist)) return ydl.downloaded_info_dicts - def get_ids(params): - return [int(v['id']) for v in get_downloaded_info_dicts(params)] + def test_selection(params, expected_ids): + results = [ + (v['playlist_autonumber'] - 1, (int(v['id']), v['playlist_index'])) + for v in get_downloaded_info_dicts(params)] + self.assertEqual(results, list(enumerate(zip(expected_ids, expected_ids)))) - result = get_ids({}) - self.assertEqual(result, [1, 2, 3, 4]) - - result = get_ids({'playlistend': 10}) - self.assertEqual(result, [1, 2, 3, 4]) - - result = get_ids({'playlistend': 2}) - self.assertEqual(result, [1, 2]) - - result = get_ids({'playliststart': 10}) - self.assertEqual(result, []) - - result = get_ids({'playliststart': 2}) - self.assertEqual(result, [2, 3, 4]) - - result = get_ids({'playlist_items': '2-4'}) - self.assertEqual(result, [2, 3, 4]) - - result = get_ids({'playlist_items': '2,4'}) - self.assertEqual(result, [2, 4]) - - result = get_ids({'playlist_items': '10'}) - self.assertEqual(result, []) - - result = get_ids({'playlist_items': '3-10'}) - self.assertEqual(result, [3, 4]) - - result = get_ids({'playlist_items': '2-4,3-4,3'}) - self.assertEqual(result, [2, 3, 4]) + test_selection({}, [1, 2, 3, 4]) + test_selection({'playlistend': 10}, [1, 2, 3, 4]) + test_selection({'playlistend': 2}, [1, 2]) + test_selection({'playliststart': 10}, []) + test_selection({'playliststart': 2}, [2, 3, 4]) + test_selection({'playlist_items': '2-4'}, [2, 3, 4]) + test_selection({'playlist_items': '2,4'}, [2, 4]) + test_selection({'playlist_items': '10'}, []) # Tests for https://github.com/ytdl-org/youtube-dl/issues/10591 - # @{ - result = get_downloaded_info_dicts({'playlist_items': '2-4,3-4,3'}) - self.assertEqual(result[0]['playlist_index'], 2) - self.assertEqual(result[1]['playlist_index'], 3) + test_selection({'playlist_items': '2-4,3-4,3'}, [2, 3, 4]) + test_selection({'playlist_items': '4,2'}, [4, 2]) - result = get_downloaded_info_dicts({'playlist_items': '2-4,3-4,3'}) - self.assertEqual(result[0]['playlist_index'], 2) - self.assertEqual(result[1]['playlist_index'], 3) - self.assertEqual(result[2]['playlist_index'], 4) - - result = get_downloaded_info_dicts({'playlist_items': '4,2'}) - self.assertEqual(result[0]['playlist_index'], 4) - self.assertEqual(result[1]['playlist_index'], 2) - # @} + # Tests for https://github.com/yt-dlp/yt-dlp/issues/720 + # https://github.com/yt-dlp/yt-dlp/issues/302 + test_selection({'playlistreverse': True}, [4, 3, 2, 1]) + test_selection({'playliststart': 2, 'playlistreverse': True}, [4, 3, 2]) + test_selection({'playlist_items': '2,4', 'playlistreverse': True}, [4, 2]) + test_selection({'playlist_items': '4,2'}, [4, 2]) def test_urlopen_no_file_protocol(self): # see https://github.com/ytdl-org/youtube-dl/issues/8227 diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index eef3f8b4c..62525cfb5 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -1452,7 +1452,7 @@ class YoutubeDL(object): # Save playlist_index before re-ordering entries = [ - ((playlistitems[i - 1] if playlistitems else i), entry) + ((playlistitems[i - 1] if playlistitems else i + playliststart - 1), entry) for i, entry in enumerate(entries, 1) if entry is not None] n_entries = len(entries) @@ -1517,7 +1517,7 @@ class YoutubeDL(object): max_failures = self.params.get('skip_playlist_after_errors') or float('inf') for i, entry_tuple in enumerate(entries, 1): playlist_index, entry = entry_tuple - if 'playlist_index' in self.params.get('compat_options', []): + if 'playlist-index' in self.params.get('compat_options', []): playlist_index = playlistitems[i - 1] if playlistitems else i self.to_screen('[download] Downloading video %s of %s' % (i, n_entries)) # This __x_forwarded_for_ip thing is a bit ugly but requires