]> jfr.im git - yt-dlp.git/blobdiff - test/test_postprocessors.py
[ie/mlbtv] Fix extraction (#10296)
[yt-dlp.git] / test / test_postprocessors.py
index bbe998993f4f816cf9090c1579580ac123b33940..603f85c654c6451c341c8cce6e745965d0610df7 100644 (file)
@@ -1,7 +1,5 @@
 #!/usr/bin/env python3
 
-from __future__ import unicode_literals
-
 # Allow direct execution
 import os
 import sys
@@ -9,14 +7,16 @@
 
 sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 
+
 from yt_dlp import YoutubeDL
-from yt_dlp.compat import compat_shlex_quote
+from yt_dlp.utils import shell_quote
 from yt_dlp.postprocessor import (
     ExecPP,
     FFmpegThumbnailsConvertorPP,
     MetadataFromFieldPP,
     MetadataParserPP,
-    ModifyChaptersPP
+    ModifyChaptersPP,
+    SponsorBlockPP,
 )
 
 
@@ -65,7 +65,7 @@ class TestExec(unittest.TestCase):
     def test_parse_cmd(self):
         pp = ExecPP(YoutubeDL(), '')
         info = {'filepath': 'file name'}
-        cmd = 'echo %s' % compat_shlex_quote(info['filepath'])
+        cmd = 'echo {}'.format(shell_quote(info['filepath']))
 
         self.assertEqual(pp.parse_cmd('echo', info), cmd)
         self.assertEqual(pp.parse_cmd('echo {}', info), cmd)
@@ -77,11 +77,15 @@ def setUp(self):
         self._pp = ModifyChaptersPP(YoutubeDL())
 
     @staticmethod
-    def _sponsor_chapter(start, end, cat, remove=False):
-        c = {'start_time': start, 'end_time': end, '_categories': [(cat, start, end)]}
-        if remove:
-            c['remove'] = True
-        return c
+    def _sponsor_chapter(start, end, cat, remove=False, title=None):
+        if title is None:
+            title = SponsorBlockPP.CATEGORIES[cat]
+        return {
+            'start_time': start,
+            'end_time': end,
+            '_categories': [(cat, start, end, title)],
+            **({'remove': True} if remove else {}),
+        }
 
     @staticmethod
     def _chapter(start, end, title=None, remove=False):
@@ -121,7 +125,8 @@ def test_remove_marked_arrange_sponsors_CanGetThroughUnaltered(self):
         self._remove_marked_arrange_sponsors_test_impl(chapters, chapters, [])
 
     def test_remove_marked_arrange_sponsors_ChapterWithSponsors(self):
-        chapters = self._chapters([70], ['c']) + [
+        chapters = [
+            *self._chapters([70], ['c']),
             self._sponsor_chapter(10, 20, 'sponsor'),
             self._sponsor_chapter(30, 40, 'preview'),
             self._sponsor_chapter(50, 60, 'filler')]
@@ -131,11 +136,29 @@ def test_remove_marked_arrange_sponsors_ChapterWithSponsors(self):
              'c', '[SponsorBlock]: Filler Tangent', 'c'])
         self._remove_marked_arrange_sponsors_test_impl(chapters, expected, [])
 
+    def test_remove_marked_arrange_sponsors_SponsorBlockChapters(self):
+        chapters = [
+            *self._chapters([70], ['c']),
+            self._sponsor_chapter(10, 20, 'chapter', title='sb c1'),
+            self._sponsor_chapter(15, 16, 'chapter', title='sb c2'),
+            self._sponsor_chapter(30, 40, 'preview'),
+            self._sponsor_chapter(50, 60, 'filler')]
+        expected = self._chapters(
+            [10, 15, 16, 20, 30, 40, 50, 60, 70],
+            ['c', '[SponsorBlock]: sb c1', '[SponsorBlock]: sb c1, sb c2', '[SponsorBlock]: sb c1',
+             'c', '[SponsorBlock]: Preview/Recap',
+             'c', '[SponsorBlock]: Filler Tangent', 'c'])
+        self._remove_marked_arrange_sponsors_test_impl(chapters, expected, [])
+
     def test_remove_marked_arrange_sponsors_UniqueNamesForOverlappingSponsors(self):
-        chapters = self._chapters([120], ['c']) + [
-            self._sponsor_chapter(10, 45, 'sponsor'), self._sponsor_chapter(20, 40, 'selfpromo'),
-            self._sponsor_chapter(50, 70, 'sponsor'), self._sponsor_chapter(60, 85, 'selfpromo'),
-            self._sponsor_chapter(90, 120, 'selfpromo'), self._sponsor_chapter(100, 110, 'sponsor')]
+        chapters = [
+            *self._chapters([120], ['c']),
+            self._sponsor_chapter(10, 45, 'sponsor'),
+            self._sponsor_chapter(20, 40, 'selfpromo'),
+            self._sponsor_chapter(50, 70, 'sponsor'),
+            self._sponsor_chapter(60, 85, 'selfpromo'),
+            self._sponsor_chapter(90, 120, 'selfpromo'),
+            self._sponsor_chapter(100, 110, 'sponsor')]
         expected = self._chapters(
             [10, 20, 40, 45, 50, 60, 70, 85, 90, 100, 110, 120],
             ['c', '[SponsorBlock]: Sponsor', '[SponsorBlock]: Sponsor, Unpaid/Self Promotion',
@@ -155,7 +178,8 @@ def test_remove_marked_arrange_sponsors_ChapterWithCuts(self):
             chapters, self._chapters([40], ['c']), cuts)
 
     def test_remove_marked_arrange_sponsors_ChapterWithSponsorsAndCuts(self):
-        chapters = self._chapters([70], ['c']) + [
+        chapters = [
+            *self._chapters([70], ['c']),
             self._sponsor_chapter(10, 20, 'sponsor'),
             self._sponsor_chapter(30, 40, 'selfpromo', remove=True),
             self._sponsor_chapter(50, 60, 'interaction')]
@@ -168,24 +192,29 @@ def test_remove_marked_arrange_sponsors_ChapterWithSponsorsAndCuts(self):
     def test_remove_marked_arrange_sponsors_ChapterWithSponsorCutInTheMiddle(self):
         cuts = [self._sponsor_chapter(20, 30, 'selfpromo', remove=True),
                 self._chapter(40, 50, remove=True)]
-        chapters = self._chapters([70], ['c']) + [self._sponsor_chapter(10, 60, 'sponsor')] + cuts
+        chapters = [
+            *self._chapters([70], ['c']),
+            self._sponsor_chapter(10, 60, 'sponsor'),
+            *cuts]
         expected = self._chapters(
             [10, 40, 50], ['c', '[SponsorBlock]: Sponsor', 'c'])
         self._remove_marked_arrange_sponsors_test_impl(chapters, expected, cuts)
 
     def test_remove_marked_arrange_sponsors_ChapterWithCutHidingSponsor(self):
-        cuts = [self._sponsor_chapter(20, 50, 'selpromo', remove=True)]
-        chapters = self._chapters([60], ['c']) + [
+        cuts = [self._sponsor_chapter(20, 50, 'selfpromo', remove=True)]
+        chapters = [
+            *self._chapters([60], ['c']),
             self._sponsor_chapter(10, 20, 'intro'),
             self._sponsor_chapter(30, 40, 'sponsor'),
             self._sponsor_chapter(50, 60, 'outro'),
-        ] + cuts
+            *cuts]
         expected = self._chapters(
             [10, 20, 30], ['c', '[SponsorBlock]: Intermission/Intro Animation', '[SponsorBlock]: Endcards/Credits'])
         self._remove_marked_arrange_sponsors_test_impl(chapters, expected, cuts)
 
     def test_remove_marked_arrange_sponsors_ChapterWithAdjacentSponsors(self):
-        chapters = self._chapters([70], ['c']) + [
+        chapters = [
+            *self._chapters([70], ['c']),
             self._sponsor_chapter(10, 20, 'sponsor'),
             self._sponsor_chapter(20, 30, 'selfpromo'),
             self._sponsor_chapter(30, 40, 'interaction')]
@@ -196,11 +225,12 @@ def test_remove_marked_arrange_sponsors_ChapterWithAdjacentSponsors(self):
         self._remove_marked_arrange_sponsors_test_impl(chapters, expected, [])
 
     def test_remove_marked_arrange_sponsors_ChapterWithAdjacentCuts(self):
-        chapters = self._chapters([70], ['c']) + [
+        chapters = [
+            *self._chapters([70], ['c']),
             self._sponsor_chapter(10, 20, 'sponsor'),
             self._sponsor_chapter(20, 30, 'interaction', remove=True),
             self._chapter(30, 40, remove=True),
-            self._sponsor_chapter(40, 50, 'selpromo', remove=True),
+            self._sponsor_chapter(40, 50, 'selfpromo', remove=True),
             self._sponsor_chapter(50, 60, 'interaction')]
         expected = self._chapters([10, 20, 30, 40],
                                   ['c', '[SponsorBlock]: Sponsor',
@@ -209,7 +239,8 @@ def test_remove_marked_arrange_sponsors_ChapterWithAdjacentCuts(self):
             chapters, expected, [self._chapter(20, 50, remove=True)])
 
     def test_remove_marked_arrange_sponsors_ChapterWithOverlappingSponsors(self):
-        chapters = self._chapters([70], ['c']) + [
+        chapters = [
+            *self._chapters([70], ['c']),
             self._sponsor_chapter(10, 30, 'sponsor'),
             self._sponsor_chapter(20, 50, 'selfpromo'),
             self._sponsor_chapter(40, 60, 'interaction')]
@@ -221,7 +252,8 @@ def test_remove_marked_arrange_sponsors_ChapterWithOverlappingSponsors(self):
         self._remove_marked_arrange_sponsors_test_impl(chapters, expected, [])
 
     def test_remove_marked_arrange_sponsors_ChapterWithOverlappingCuts(self):
-        chapters = self._chapters([70], ['c']) + [
+        chapters = [
+            *self._chapters([70], ['c']),
             self._sponsor_chapter(10, 30, 'sponsor', remove=True),
             self._sponsor_chapter(20, 50, 'selfpromo', remove=True),
             self._sponsor_chapter(40, 60, 'interaction', remove=True)]
@@ -229,7 +261,8 @@ def test_remove_marked_arrange_sponsors_ChapterWithOverlappingCuts(self):
             chapters, self._chapters([20], ['c']), [self._chapter(10, 60, remove=True)])
 
     def test_remove_marked_arrange_sponsors_ChapterWithRunsOfOverlappingSponsors(self):
-        chapters = self._chapters([170], ['c']) + [
+        chapters = [
+            *self._chapters([170], ['c']),
             self._sponsor_chapter(0, 30, 'intro'),
             self._sponsor_chapter(20, 50, 'sponsor'),
             self._sponsor_chapter(40, 60, 'selfpromo'),
@@ -250,7 +283,8 @@ def test_remove_marked_arrange_sponsors_ChapterWithRunsOfOverlappingSponsors(sel
         self._remove_marked_arrange_sponsors_test_impl(chapters, expected, [])
 
     def test_remove_marked_arrange_sponsors_ChapterWithRunsOfOverlappingCuts(self):
-        chapters = self._chapters([170], ['c']) + [
+        chapters = [
+            *self._chapters([170], ['c']),
             self._chapter(0, 30, remove=True),
             self._sponsor_chapter(20, 50, 'sponsor', remove=True),
             self._chapter(40, 60, remove=True),
@@ -267,7 +301,8 @@ def test_remove_marked_arrange_sponsors_ChapterWithRunsOfOverlappingCuts(self):
             chapters, self._chapters([20], ['c']), expected_cuts)
 
     def test_remove_marked_arrange_sponsors_OverlappingSponsorsDifferentTitlesAfterCut(self):
-        chapters = self._chapters([60], ['c']) + [
+        chapters = [
+            *self._chapters([60], ['c']),
             self._sponsor_chapter(10, 60, 'sponsor'),
             self._sponsor_chapter(10, 40, 'intro'),
             self._sponsor_chapter(30, 50, 'interaction'),
@@ -280,10 +315,11 @@ def test_remove_marked_arrange_sponsors_OverlappingSponsorsDifferentTitlesAfterC
             chapters, expected, [self._chapter(30, 50, remove=True)])
 
     def test_remove_marked_arrange_sponsors_SponsorsNoLongerOverlapAfterCut(self):
-        chapters = self._chapters([70], ['c']) + [
+        chapters = [
+            *self._chapters([70], ['c']),
             self._sponsor_chapter(10, 30, 'sponsor'),
             self._sponsor_chapter(20, 50, 'interaction'),
-            self._sponsor_chapter(30, 50, 'selpromo', remove=True),
+            self._sponsor_chapter(30, 50, 'selfpromo', remove=True),
             self._sponsor_chapter(40, 60, 'sponsor'),
             self._sponsor_chapter(50, 60, 'interaction')]
         expected = self._chapters(
@@ -293,7 +329,8 @@ def test_remove_marked_arrange_sponsors_SponsorsNoLongerOverlapAfterCut(self):
             chapters, expected, [self._chapter(30, 50, remove=True)])
 
     def test_remove_marked_arrange_sponsors_SponsorsStillOverlapAfterCut(self):
-        chapters = self._chapters([70], ['c']) + [
+        chapters = [
+            *self._chapters([70], ['c']),
             self._sponsor_chapter(10, 60, 'sponsor'),
             self._sponsor_chapter(20, 60, 'interaction'),
             self._sponsor_chapter(30, 50, 'selfpromo', remove=True)]
@@ -304,7 +341,8 @@ def test_remove_marked_arrange_sponsors_SponsorsStillOverlapAfterCut(self):
             chapters, expected, [self._chapter(30, 50, remove=True)])
 
     def test_remove_marked_arrange_sponsors_ChapterWithRunsOfOverlappingSponsorsAndCuts(self):
-        chapters = self._chapters([200], ['c']) + [
+        chapters = [
+            *self._chapters([200], ['c']),
             self._sponsor_chapter(10, 40, 'sponsor'),
             self._sponsor_chapter(10, 30, 'intro'),
             self._chapter(20, 30, remove=True),
@@ -330,8 +368,9 @@ def test_remove_marked_arrange_sponsors_ChapterWithRunsOfOverlappingSponsorsAndC
         self._remove_marked_arrange_sponsors_test_impl(chapters, expected, expected_cuts)
 
     def test_remove_marked_arrange_sponsors_SponsorOverlapsMultipleChapters(self):
-        chapters = (self._chapters([20, 40, 60, 80, 100], ['c1', 'c2', 'c3', 'c4', 'c5'])
-                    + [self._sponsor_chapter(10, 90, 'sponsor')])
+        chapters = [
+            *self._chapters([20, 40, 60, 80, 100], ['c1', 'c2', 'c3', 'c4', 'c5']),
+            self._sponsor_chapter(10, 90, 'sponsor')]
         expected = self._chapters([10, 90, 100], ['c1', '[SponsorBlock]: Sponsor', 'c5'])
         self._remove_marked_arrange_sponsors_test_impl(chapters, expected, [])
 
@@ -342,9 +381,10 @@ def test_remove_marked_arrange_sponsors_CutOverlapsMultipleChapters(self):
         self._remove_marked_arrange_sponsors_test_impl(chapters, expected, cuts)
 
     def test_remove_marked_arrange_sponsors_SponsorsWithinSomeChaptersAndOverlappingOthers(self):
-        chapters = (self._chapters([10, 40, 60, 80], ['c1', 'c2', 'c3', 'c4'])
-                    + [self._sponsor_chapter(20, 30, 'sponsor'),
-                       self._sponsor_chapter(50, 70, 'selfpromo')])
+        chapters = [
+            *self._chapters([10, 40, 60, 80], ['c1', 'c2', 'c3', 'c4']),
+            self._sponsor_chapter(20, 30, 'sponsor'),
+            self._sponsor_chapter(50, 70, 'selfpromo')]
         expected = self._chapters([10, 20, 30, 40, 50, 70, 80],
                                   ['c1', 'c2', '[SponsorBlock]: Sponsor', 'c2', 'c3',
                                    '[SponsorBlock]: Unpaid/Self Promotion', 'c4'])
@@ -357,8 +397,9 @@ def test_remove_marked_arrange_sponsors_CutsWithinSomeChaptersAndOverlappingOthe
         self._remove_marked_arrange_sponsors_test_impl(chapters, expected, cuts)
 
     def test_remove_marked_arrange_sponsors_ChaptersAfterLastSponsor(self):
-        chapters = (self._chapters([20, 40, 50, 60], ['c1', 'c2', 'c3', 'c4'])
-                    + [self._sponsor_chapter(10, 30, 'music_offtopic')])
+        chapters = [
+            *self._chapters([20, 40, 50, 60], ['c1', 'c2', 'c3', 'c4']),
+            self._sponsor_chapter(10, 30, 'music_offtopic')]
         expected = self._chapters(
             [10, 30, 40, 50, 60],
             ['c1', '[SponsorBlock]: Non-Music Section', 'c2', 'c3', 'c4'])
@@ -371,8 +412,9 @@ def test_remove_marked_arrange_sponsors_ChaptersAfterLastCut(self):
         self._remove_marked_arrange_sponsors_test_impl(chapters, expected, cuts)
 
     def test_remove_marked_arrange_sponsors_SponsorStartsAtChapterStart(self):
-        chapters = (self._chapters([10, 20, 40], ['c1', 'c2', 'c3'])
-                    + [self._sponsor_chapter(20, 30, 'sponsor')])
+        chapters = [
+            *self._chapters([10, 20, 40], ['c1', 'c2', 'c3']),
+            self._sponsor_chapter(20, 30, 'sponsor')]
         expected = self._chapters([10, 20, 30, 40], ['c1', 'c2', '[SponsorBlock]: Sponsor', 'c3'])
         self._remove_marked_arrange_sponsors_test_impl(chapters, expected, [])
 
@@ -383,8 +425,9 @@ def test_remove_marked_arrange_sponsors_CutStartsAtChapterStart(self):
         self._remove_marked_arrange_sponsors_test_impl(chapters, expected, cuts)
 
     def test_remove_marked_arrange_sponsors_SponsorEndsAtChapterEnd(self):
-        chapters = (self._chapters([10, 30, 40], ['c1', 'c2', 'c3'])
-                    + [self._sponsor_chapter(20, 30, 'sponsor')])
+        chapters = [
+            *self._chapters([10, 30, 40], ['c1', 'c2', 'c3']),
+            self._sponsor_chapter(20, 30, 'sponsor')]
         expected = self._chapters([10, 20, 30, 40], ['c1', 'c2', '[SponsorBlock]: Sponsor', 'c3'])
         self._remove_marked_arrange_sponsors_test_impl(chapters, expected, [])
 
@@ -395,8 +438,9 @@ def test_remove_marked_arrange_sponsors_CutEndsAtChapterEnd(self):
         self._remove_marked_arrange_sponsors_test_impl(chapters, expected, cuts)
 
     def test_remove_marked_arrange_sponsors_SponsorCoincidesWithChapters(self):
-        chapters = (self._chapters([10, 20, 30, 40], ['c1', 'c2', 'c3', 'c4'])
-                    + [self._sponsor_chapter(10, 30, 'sponsor')])
+        chapters = [
+            *self._chapters([10, 20, 30, 40], ['c1', 'c2', 'c3', 'c4']),
+            self._sponsor_chapter(10, 30, 'sponsor')]
         expected = self._chapters([10, 30, 40], ['c1', '[SponsorBlock]: Sponsor', 'c4'])
         self._remove_marked_arrange_sponsors_test_impl(chapters, expected, [])
 
@@ -407,8 +451,9 @@ def test_remove_marked_arrange_sponsors_CutCoincidesWithChapters(self):
         self._remove_marked_arrange_sponsors_test_impl(chapters, expected, cuts)
 
     def test_remove_marked_arrange_sponsors_SponsorsAtVideoBoundaries(self):
-        chapters = (self._chapters([20, 40, 60], ['c1', 'c2', 'c3'])
-                    + [self._sponsor_chapter(0, 10, 'intro'), self._sponsor_chapter(50, 60, 'outro')])
+        chapters = [
+            *self._chapters([20, 40, 60], ['c1', 'c2', 'c3']),
+            self._sponsor_chapter(0, 10, 'intro'), self._sponsor_chapter(50, 60, 'outro')]
         expected = self._chapters(
             [10, 20, 40, 50, 60], ['[SponsorBlock]: Intermission/Intro Animation', 'c1', 'c2', 'c3', '[SponsorBlock]: Endcards/Credits'])
         self._remove_marked_arrange_sponsors_test_impl(chapters, expected, [])
@@ -420,8 +465,10 @@ def test_remove_marked_arrange_sponsors_CutsAtVideoBoundaries(self):
         self._remove_marked_arrange_sponsors_test_impl(chapters, expected, cuts)
 
     def test_remove_marked_arrange_sponsors_SponsorsOverlapChaptersAtVideoBoundaries(self):
-        chapters = (self._chapters([10, 40, 50], ['c1', 'c2', 'c3'])
-                    + [self._sponsor_chapter(0, 20, 'intro'), self._sponsor_chapter(30, 50, 'outro')])
+        chapters = [
+            *self._chapters([10, 40, 50], ['c1', 'c2', 'c3']),
+            self._sponsor_chapter(0, 20, 'intro'),
+            self._sponsor_chapter(30, 50, 'outro')]
         expected = self._chapters(
             [20, 30, 50], ['[SponsorBlock]: Intermission/Intro Animation', 'c2', '[SponsorBlock]: Endcards/Credits'])
         self._remove_marked_arrange_sponsors_test_impl(chapters, expected, [])
@@ -433,8 +480,10 @@ def test_remove_marked_arrange_sponsors_CutsOverlapChaptersAtVideoBoundaries(sel
         self._remove_marked_arrange_sponsors_test_impl(chapters, expected, cuts)
 
     def test_remove_marked_arrange_sponsors_EverythingSponsored(self):
-        chapters = (self._chapters([10, 20, 30, 40], ['c1', 'c2', 'c3', 'c4'])
-                    + [self._sponsor_chapter(0, 20, 'intro'), self._sponsor_chapter(20, 40, 'outro')])
+        chapters = [
+            *self._chapters([10, 20, 30, 40], ['c1', 'c2', 'c3', 'c4']),
+            self._sponsor_chapter(0, 20, 'intro'),
+            self._sponsor_chapter(20, 40, 'outro')]
         expected = self._chapters([20, 40], ['[SponsorBlock]: Intermission/Intro Animation', '[SponsorBlock]: Endcards/Credits'])
         self._remove_marked_arrange_sponsors_test_impl(chapters, expected, [])
 
@@ -474,38 +523,39 @@ def test_remove_marked_arrange_sponsors_TinyChapterAtTheStartPrependedToTheNext(
             chapters, self._chapters([2.5], ['c2']), cuts)
 
     def test_remove_marked_arrange_sponsors_TinyChaptersResultingFromSponsorOverlapAreIgnored(self):
-        chapters = self._chapters([1, 3, 4], ['c1', 'c2', 'c3']) + [
+        chapters = [
+            *self._chapters([1, 3, 4], ['c1', 'c2', 'c3']),
             self._sponsor_chapter(1.5, 2.5, 'sponsor')]
         self._remove_marked_arrange_sponsors_test_impl(
             chapters, self._chapters([1.5, 2.5, 4], ['c1', '[SponsorBlock]: Sponsor', 'c3']), [])
 
     def test_remove_marked_arrange_sponsors_TinySponsorsOverlapsAreIgnored(self):
-        chapters = self._chapters([2, 3, 5], ['c1', 'c2', 'c3']) + [
+        chapters = [
+            *self._chapters([2, 3, 5], ['c1', 'c2', 'c3']),
             self._sponsor_chapter(1, 3, 'sponsor'),
-            self._sponsor_chapter(2.5, 4, 'selfpromo')
-        ]
+            self._sponsor_chapter(2.5, 4, 'selfpromo')]
         self._remove_marked_arrange_sponsors_test_impl(
             chapters, self._chapters([1, 3, 4, 5], [
                 'c1', '[SponsorBlock]: Sponsor', '[SponsorBlock]: Unpaid/Self Promotion', 'c3']), [])
 
     def test_remove_marked_arrange_sponsors_TinySponsorsPrependedToTheNextSponsor(self):
-        chapters = self._chapters([4], ['c']) + [
+        chapters = [
+            *self._chapters([4], ['c']),
             self._sponsor_chapter(1.5, 2, 'sponsor'),
-            self._sponsor_chapter(2, 4, 'selfpromo')
-        ]
+            self._sponsor_chapter(2, 4, 'selfpromo')]
         self._remove_marked_arrange_sponsors_test_impl(
             chapters, self._chapters([1.5, 4], ['c', '[SponsorBlock]: Unpaid/Self Promotion']), [])
 
     def test_remove_marked_arrange_sponsors_SmallestSponsorInTheOverlapGetsNamed(self):
         self._pp._sponsorblock_chapter_title = '[SponsorBlock]: %(name)s'
-        chapters = self._chapters([10], ['c']) + [
+        chapters = [
+            *self._chapters([10], ['c']),
             self._sponsor_chapter(2, 8, 'sponsor'),
-            self._sponsor_chapter(4, 6, 'selfpromo')
-        ]
+            self._sponsor_chapter(4, 6, 'selfpromo')]
         self._remove_marked_arrange_sponsors_test_impl(
             chapters, self._chapters([2, 4, 6, 8, 10], [
                 'c', '[SponsorBlock]: Sponsor', '[SponsorBlock]: Unpaid/Self Promotion',
-                '[SponsorBlock]: Sponsor', 'c'
+                '[SponsorBlock]: Sponsor', 'c',
             ]), [])
 
     def test_make_concat_opts_CommonCase(self):