prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  Баг: В посте ссылке, если ссылка на ютуб плейлист то он ресолвиться в первое видео, и теряеться информация о том что это плейлист 
  Пример https://vas3k.club/link/11936/ линк и эмбедд ведет на https://www.youtube.com/watch?v=CC71WyVLnnk вместо ожидаемого https://www.youtube.com/watch?v=CC71WyVLnnk&list=PLXOrZPAO2Ui021R3sKD5z0n9Qzeix9Kbj&index=2 
  
  Аналогично при вставке ссылки на плейлист в тело поста, она ресолвится  в первое видео
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `common/regexp.py`
  Content:
  ```
  1 import re
  2 
  3 USERNAME_RE = re.compile(r"(?:\s|\n|^)@([A-Za-z0-9_-]{3,})")
  4 IMAGE_RE = re.compile(r"(http(s?):)([/|.|\w|\s|-])*\.(?:jpg|jpeg|gif|png)")
  5 VIDEO_RE = re.compile(r"(http(s?):)([/|.|\w|\s|-])*\.(?:mov|mp4)")
  6 YOUTUBE_RE = re.compile(
  7     r"http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?‌​[\w\?‌​=]*)?"
  8 )
  9 TWITTER_RE = re.compile(r"(https?:\/\/twitter.com\/[a-zA-Z0-9_]+\/status\/[\d]+)")
  10 FAVICON_RE = re.compile(r"(http(s?):)([/|.|\w|\s|-])*\.(?:jpg|jpeg|gif|png|ico)")
  11
  ```
  
  Path: `common/markdown/club_renderer.py`
  Content:
  ```
  1 import html
  2 import mistune
  3 from urllib.parse import unquote
  4 from mistune import escape_html
  5 from slugify import slugify
  6 
  7 from common.regexp import IMAGE_RE, VIDEO_RE, YOUTUBE_RE, TWITTER_RE, USERNAME_RE
  8 
  9 IMAGE_CSS_CLASSES = {
  10     "-": "text-body-image-full"
  11 }
  12 
  13 
  14 class ClubRenderer(mistune.HTMLRenderer):
  15     def text(self, text):
  16         text = escape_html(text)
  17         text = USERNAME_RE.sub(r' <a href="/user/\1/">@\1</a>', text)
  18         return text
  19 
  20     def paragraph(self, text):
  21         text = text.replace("\n", "<br>\n")  # Mistune 2.0 broke newlines, let's hack it =/
  22         return f"<p>{text}</p>\n"
  23 
  24     def heading(self, text, level):
  25         tag = f"h{level}"
  26         anchor = slugify(text[:24])
  27         return f"<{tag} id=\"{anchor}\"><a href=\"#{anchor}\">{text}</a></{tag}>\n"
  28 
  29     def link(self, link, text=None, title=None):
  30         if not text and not title:
  31             # it's a pure link (without link tag) and we can try to parse it
  32             embed = self.embed(link, text or "", title or "")
  33             if embed:
  34                 return embed
  35 
  36         if text is None:
  37             text = link
  38 
  39         # here's some magic of unescape->unquote->escape
  40         # to fix cyrillic (and other non-latin) wikipedia URLs
  41         return f'<a href="{self._safe_url(link)}">{html.escape(unquote(html.unescape(text or link)))}</a>'
  42 
  43     def image(self, src, alt="", title=None):
  44         embed = self.embed(src, alt, title)
  45         if embed:
  46             return embed
  47 
  48         # users can try to "hack" our parser by using non-image urls
  49         # so, if its not an image or video, display it as a link to avoid auto-loading
  50         return f'<a href="{escape_html(src)}">{escape_html(src)}</a>'
  51 
  52     def embed(self, src, alt="", title=None):
  53         if IMAGE_RE.match(src):
  54             return self.simple_image(src, alt, title)
  55 
  56         if YOUTUBE_RE.match(src):
  57             return self.youtube(src, alt, title)
  58 
  59         if VIDEO_RE.match(src):
  60             return self.video(src, alt, title)
  61 
  62         if TWITTER_RE.match(src):
  63             return self.tweet(src, alt, title)
  64 
  65         return None
  66 
  67     def simple_image(self, src, alt="", title=None):
  68         css_classes = ""
  69         title = title or alt
  70         if title in IMAGE_CSS_CLASSES:
  71             css_classes = IMAGE_CSS_CLASSES[title]
  72 
  73         image_tag = f'<img loading="lazy" src="{escape_html(src)}" alt="{escape_html(title)}">'
  74         caption = f"<figcaption>{escape_html(title)}</figcaption>" if title else ""
  75         return f'<figure class="{css_classes}">{image_tag}{caption}</figure>'
  76 
  77     def youtube(self, src, alt="", title=None):
  78         youtube_match = YOUTUBE_RE.match(src)
  79         video_tag = (
  80             f'<span class="ratio-16-9">'
  81             f'<iframe loading="lazy" src="https://www.youtube.com/embed/{escape_html(youtube_match.group(1))}'
  82             f'?autoplay=0&amp;controls=1&amp;showinfo=1&amp;vq=hd1080"'
  83             f'allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; fullscreen"'
  84             f'allowfullscreen></iframe>'
  85             f"</span>"
  86         )
  87         caption = f"<figcaption>{escape_html(title)}</figcaption>" if title else ""
  88         return f"<figure>{video_tag}{caption}</figure>"
  89 
  90     def video(self, src, alt="", title=None):
  91         video_tag = (
  92             f'<video src="{escape_html(src)}" controls autoplay loop muted playsinline>{escape_html(alt)}</video>'
  93         )
  94         caption = f"<figcaption>{escape_html(title)}</figcaption>" if title else ""
  95         return f"<figure>{video_tag}{caption}</figure>"
  96 
  97     def tweet(self, src, alt="", title=None):
  98         tweet_match = TWITTER_RE.match(src)
  99         twitter_tag = f'<blockquote class="twitter-tweet" tw-align-center>' \
  100                       f'<a href="{tweet_match.group(1)}"></a></blockquote><br>' \
  101                       f'<a href="{src}" target="_blank">{src}</a>'
  102         return twitter_tag
  103
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/common/markdown/club_renderer.py b/common/markdown/club_renderer.py
  --- a/common/markdown/club_renderer.py
  +++ b/common/markdown/club_renderer.py
  @@ -76,10 +76,13 @@
   
       def youtube(self, src, alt="", title=None):
           youtube_match = YOUTUBE_RE.match(src)
  +        playlist = ""
  +        if youtube_match.group(2):
  +            playlist = f"list={escape_html(youtube_match.group(2))}&listType=playlist&"
           video_tag = (
               f'<span class="ratio-16-9">'
               f'<iframe loading="lazy" src="https://www.youtube.com/embed/{escape_html(youtube_match.group(1))}'
  -            f'?autoplay=0&amp;controls=1&amp;showinfo=1&amp;vq=hd1080"'
  +            f'?{playlist}autoplay=0&amp;controls=1&amp;showinfo=1&amp;vq=hd1080"'
               f'allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; fullscreen"'
               f'allowfullscreen></iframe>'
               f"</span>"
  diff --git a/common/regexp.py b/common/regexp.py
  --- a/common/regexp.py
  +++ b/common/regexp.py
  @@ -4,7 +4,7 @@
   IMAGE_RE = re.compile(r"(http(s?):)([/|.|\w|\s|-])*\.(?:jpg|jpeg|gif|png)")
   VIDEO_RE = re.compile(r"(http(s?):)([/|.|\w|\s|-])*\.(?:mov|mp4)")
   YOUTUBE_RE = re.compile(
  -    r"http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?‌​[\w\?‌​=]*)?"
  +    r"http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(?:.*list=(PL[\w\-\_]*))?"
   )
   TWITTER_RE = re.compile(r"(https?:\/\/twitter.com\/[a-zA-Z0-9_]+\/status\/[\d]+)")
   FAVICON_RE = re.compile(r"(http(s?):)([/|.|\w|\s|-])*\.(?:jpg|jpeg|gif|png|ico)")
  
verification_info: {"golden_diff": "diff --git a/common/markdown/club_renderer.py b/common/markdown/club_renderer.py\n--- a/common/markdown/club_renderer.py\n+++ b/common/markdown/club_renderer.py\n@@ -76,10 +76,13 @@\n \n     def youtube(self, src, alt=\"\", title=None):\n         youtube_match = YOUTUBE_RE.match(src)\n+        playlist = \"\"\n+        if youtube_match.group(2):\n+            playlist = f\"list={escape_html(youtube_match.group(2))}&listType=playlist&\"\n         video_tag = (\n             f'<span class=\"ratio-16-9\">'\n             f'<iframe loading=\"lazy\" src=\"https://www.youtube.com/embed/{escape_html(youtube_match.group(1))}'\n-            f'?autoplay=0&amp;controls=1&amp;showinfo=1&amp;vq=hd1080\"'\n+            f'?{playlist}autoplay=0&amp;controls=1&amp;showinfo=1&amp;vq=hd1080\"'\n             f'allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; fullscreen\"'\n             f'allowfullscreen></iframe>'\n             f\"</span>\"\ndiff --git a/common/regexp.py b/common/regexp.py\n--- a/common/regexp.py\n+++ b/common/regexp.py\n@@ -4,7 +4,7 @@\n IMAGE_RE = re.compile(r\"(http(s?):)([/|.|\\w|\\s|-])*\\.(?:jpg|jpeg|gif|png)\")\n VIDEO_RE = re.compile(r\"(http(s?):)([/|.|\\w|\\s|-])*\\.(?:mov|mp4)\")\n YOUTUBE_RE = re.compile(\n-    r\"http(?:s?):\\/\\/(?:www\\.)?youtu(?:be\\.com\\/watch\\?v=|\\.be\\/)([\\w\\-\\_]*)(&(amp;)?\u200c\u200b[\\w\\?\u200c\u200b=]*)?\"\n+    r\"http(?:s?):\\/\\/(?:www\\.)?youtu(?:be\\.com\\/watch\\?v=|\\.be\\/)([\\w\\-\\_]*)(?:.*list=(PL[\\w\\-\\_]*))?\"\n )\n TWITTER_RE = re.compile(r\"(https?:\\/\\/twitter.com\\/[a-zA-Z0-9_]+\\/status\\/[\\d]+)\")\n FAVICON_RE = re.compile(r\"(http(s?):)([/|.|\\w|\\s|-])*\\.(?:jpg|jpeg|gif|png|ico)\")\n", "issue": "\u0411\u0430\u0433: \u0412 \u043f\u043e\u0441\u0442\u0435 \u0441\u0441\u044b\u043b\u043a\u0435, \u0435\u0441\u043b\u0438 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u044e\u0442\u0443\u0431 \u043f\u043b\u0435\u0439\u043b\u0438\u0441\u0442 \u0442\u043e \u043e\u043d \u0440\u0435\u0441\u043e\u043b\u0432\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u0435\u0440\u0432\u043e\u0435 \u0432\u0438\u0434\u0435\u043e, \u0438 \u0442\u0435\u0440\u044f\u0435\u0442\u044c\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0442\u043e\u043c \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u043b\u0435\u0439\u043b\u0438\u0441\u0442 \n\u041f\u0440\u0438\u043c\u0435\u0440 https://vas3k.club/link/11936/ \u043b\u0438\u043d\u043a \u0438 \u044d\u043c\u0431\u0435\u0434\u0434 \u0432\u0435\u0434\u0435\u0442 \u043d\u0430 https://www.youtube.com/watch?v=CC71WyVLnnk \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e https://www.youtube.com/watch?v=CC71WyVLnnk&list=PLXOrZPAO2Ui021R3sKD5z0n9Qzeix9Kbj&index=2 \r\n\r\n\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u0440\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043f\u043b\u0435\u0439\u043b\u0438\u0441\u0442 \u0432 \u0442\u0435\u043b\u043e \u043f\u043e\u0441\u0442\u0430, \u043e\u043d\u0430 \u0440\u0435\u0441\u043e\u043b\u0432\u0438\u0442\u0441\u044f  \u0432 \u043f\u0435\u0440\u0432\u043e\u0435 \u0432\u0438\u0434\u0435\u043e\n", "before_files": [{"content": "import re\n\nUSERNAME_RE = re.compile(r\"(?:\\s|\\n|^)@([A-Za-z0-9_-]{3,})\")\nIMAGE_RE = re.compile(r\"(http(s?):)([/|.|\\w|\\s|-])*\\.(?:jpg|jpeg|gif|png)\")\nVIDEO_RE = re.compile(r\"(http(s?):)([/|.|\\w|\\s|-])*\\.(?:mov|mp4)\")\nYOUTUBE_RE = re.compile(\n    r\"http(?:s?):\\/\\/(?:www\\.)?youtu(?:be\\.com\\/watch\\?v=|\\.be\\/)([\\w\\-\\_]*)(&(amp;)?\u200c\u200b[\\w\\?\u200c\u200b=]*)?\"\n)\nTWITTER_RE = re.compile(r\"(https?:\\/\\/twitter.com\\/[a-zA-Z0-9_]+\\/status\\/[\\d]+)\")\nFAVICON_RE = re.compile(r\"(http(s?):)([/|.|\\w|\\s|-])*\\.(?:jpg|jpeg|gif|png|ico)\")\n", "path": "common/regexp.py"}, {"content": "import html\nimport mistune\nfrom urllib.parse import unquote\nfrom mistune import escape_html\nfrom slugify import slugify\n\nfrom common.regexp import IMAGE_RE, VIDEO_RE, YOUTUBE_RE, TWITTER_RE, USERNAME_RE\n\nIMAGE_CSS_CLASSES = {\n    \"-\": \"text-body-image-full\"\n}\n\n\nclass ClubRenderer(mistune.HTMLRenderer):\n    def text(self, text):\n        text = escape_html(text)\n        text = USERNAME_RE.sub(r' <a href=\"/user/\\1/\">@\\1</a>', text)\n        return text\n\n    def paragraph(self, text):\n        text = text.replace(\"\\n\", \"<br>\\n\")  # Mistune 2.0 broke newlines, let's hack it =/\n        return f\"<p>{text}</p>\\n\"\n\n    def heading(self, text, level):\n        tag = f\"h{level}\"\n        anchor = slugify(text[:24])\n        return f\"<{tag} id=\\\"{anchor}\\\"><a href=\\\"#{anchor}\\\">{text}</a></{tag}>\\n\"\n\n    def link(self, link, text=None, title=None):\n        if not text and not title:\n            # it's a pure link (without link tag) and we can try to parse it\n            embed = self.embed(link, text or \"\", title or \"\")\n            if embed:\n                return embed\n\n        if text is None:\n            text = link\n\n        # here's some magic of unescape->unquote->escape\n        # to fix cyrillic (and other non-latin) wikipedia URLs\n        return f'<a href=\"{self._safe_url(link)}\">{html.escape(unquote(html.unescape(text or link)))}</a>'\n\n    def image(self, src, alt=\"\", title=None):\n        embed = self.embed(src, alt, title)\n        if embed:\n            return embed\n\n        # users can try to \"hack\" our parser by using non-image urls\n        # so, if its not an image or video, display it as a link to avoid auto-loading\n        return f'<a href=\"{escape_html(src)}\">{escape_html(src)}</a>'\n\n    def embed(self, src, alt=\"\", title=None):\n        if IMAGE_RE.match(src):\n            return self.simple_image(src, alt, title)\n\n        if YOUTUBE_RE.match(src):\n            return self.youtube(src, alt, title)\n\n        if VIDEO_RE.match(src):\n            return self.video(src, alt, title)\n\n        if TWITTER_RE.match(src):\n            return self.tweet(src, alt, title)\n\n        return None\n\n    def simple_image(self, src, alt=\"\", title=None):\n        css_classes = \"\"\n        title = title or alt\n        if title in IMAGE_CSS_CLASSES:\n            css_classes = IMAGE_CSS_CLASSES[title]\n\n        image_tag = f'<img loading=\"lazy\" src=\"{escape_html(src)}\" alt=\"{escape_html(title)}\">'\n        caption = f\"<figcaption>{escape_html(title)}</figcaption>\" if title else \"\"\n        return f'<figure class=\"{css_classes}\">{image_tag}{caption}</figure>'\n\n    def youtube(self, src, alt=\"\", title=None):\n        youtube_match = YOUTUBE_RE.match(src)\n        video_tag = (\n            f'<span class=\"ratio-16-9\">'\n            f'<iframe loading=\"lazy\" src=\"https://www.youtube.com/embed/{escape_html(youtube_match.group(1))}'\n            f'?autoplay=0&amp;controls=1&amp;showinfo=1&amp;vq=hd1080\"'\n            f'allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; fullscreen\"'\n            f'allowfullscreen></iframe>'\n            f\"</span>\"\n        )\n        caption = f\"<figcaption>{escape_html(title)}</figcaption>\" if title else \"\"\n        return f\"<figure>{video_tag}{caption}</figure>\"\n\n    def video(self, src, alt=\"\", title=None):\n        video_tag = (\n            f'<video src=\"{escape_html(src)}\" controls autoplay loop muted playsinline>{escape_html(alt)}</video>'\n        )\n        caption = f\"<figcaption>{escape_html(title)}</figcaption>\" if title else \"\"\n        return f\"<figure>{video_tag}{caption}</figure>\"\n\n    def tweet(self, src, alt=\"\", title=None):\n        tweet_match = TWITTER_RE.match(src)\n        twitter_tag = f'<blockquote class=\"twitter-tweet\" tw-align-center>' \\\n                      f'<a href=\"{tweet_match.group(1)}\"></a></blockquote><br>' \\\n                      f'<a href=\"{src}\" target=\"_blank\">{src}</a>'\n        return twitter_tag\n", "path": "common/markdown/club_renderer.py"}], "after_files": [{"content": "import re\n\nUSERNAME_RE = re.compile(r\"(?:\\s|\\n|^)@([A-Za-z0-9_-]{3,})\")\nIMAGE_RE = re.compile(r\"(http(s?):)([/|.|\\w|\\s|-])*\\.(?:jpg|jpeg|gif|png)\")\nVIDEO_RE = re.compile(r\"(http(s?):)([/|.|\\w|\\s|-])*\\.(?:mov|mp4)\")\nYOUTUBE_RE = re.compile(\n    r\"http(?:s?):\\/\\/(?:www\\.)?youtu(?:be\\.com\\/watch\\?v=|\\.be\\/)([\\w\\-\\_]*)(?:.*list=(PL[\\w\\-\\_]*))?\"\n)\nTWITTER_RE = re.compile(r\"(https?:\\/\\/twitter.com\\/[a-zA-Z0-9_]+\\/status\\/[\\d]+)\")\nFAVICON_RE = re.compile(r\"(http(s?):)([/|.|\\w|\\s|-])*\\.(?:jpg|jpeg|gif|png|ico)\")\n", "path": "common/regexp.py"}, {"content": "import html\nimport mistune\nfrom urllib.parse import unquote\nfrom mistune import escape_html\nfrom slugify import slugify\n\nfrom common.regexp import IMAGE_RE, VIDEO_RE, YOUTUBE_RE, TWITTER_RE, USERNAME_RE\n\nIMAGE_CSS_CLASSES = {\n    \"-\": \"text-body-image-full\"\n}\n\n\nclass ClubRenderer(mistune.HTMLRenderer):\n    def text(self, text):\n        text = escape_html(text)\n        text = USERNAME_RE.sub(r' <a href=\"/user/\\1/\">@\\1</a>', text)\n        return text\n\n    def paragraph(self, text):\n        text = text.replace(\"\\n\", \"<br>\\n\")  # Mistune 2.0 broke newlines, let's hack it =/\n        return f\"<p>{text}</p>\\n\"\n\n    def heading(self, text, level):\n        tag = f\"h{level}\"\n        anchor = slugify(text[:24])\n        return f\"<{tag} id=\\\"{anchor}\\\"><a href=\\\"#{anchor}\\\">{text}</a></{tag}>\\n\"\n\n    def link(self, link, text=None, title=None):\n        if not text and not title:\n            # it's a pure link (without link tag) and we can try to parse it\n            embed = self.embed(link, text or \"\", title or \"\")\n            if embed:\n                return embed\n\n        if text is None:\n            text = link\n\n        # here's some magic of unescape->unquote->escape\n        # to fix cyrillic (and other non-latin) wikipedia URLs\n        return f'<a href=\"{self._safe_url(link)}\">{html.escape(unquote(html.unescape(text or link)))}</a>'\n\n    def image(self, src, alt=\"\", title=None):\n        embed = self.embed(src, alt, title)\n        if embed:\n            return embed\n\n        # users can try to \"hack\" our parser by using non-image urls\n        # so, if its not an image or video, display it as a link to avoid auto-loading\n        return f'<a href=\"{escape_html(src)}\">{escape_html(src)}</a>'\n\n    def embed(self, src, alt=\"\", title=None):\n        if IMAGE_RE.match(src):\n            return self.simple_image(src, alt, title)\n\n        if YOUTUBE_RE.match(src):\n            return self.youtube(src, alt, title)\n\n        if VIDEO_RE.match(src):\n            return self.video(src, alt, title)\n\n        if TWITTER_RE.match(src):\n            return self.tweet(src, alt, title)\n\n        return None\n\n    def simple_image(self, src, alt=\"\", title=None):\n        css_classes = \"\"\n        title = title or alt\n        if title in IMAGE_CSS_CLASSES:\n            css_classes = IMAGE_CSS_CLASSES[title]\n\n        image_tag = f'<img loading=\"lazy\" src=\"{escape_html(src)}\" alt=\"{escape_html(title)}\">'\n        caption = f\"<figcaption>{escape_html(title)}</figcaption>\" if title else \"\"\n        return f'<figure class=\"{css_classes}\">{image_tag}{caption}</figure>'\n\n    def youtube(self, src, alt=\"\", title=None):\n        youtube_match = YOUTUBE_RE.match(src)\n        playlist = \"\"\n        if youtube_match.group(2):\n            playlist = f\"list={escape_html(youtube_match.group(2))}&listType=playlist&\"\n        video_tag = (\n            f'<span class=\"ratio-16-9\">'\n            f'<iframe loading=\"lazy\" src=\"https://www.youtube.com/embed/{escape_html(youtube_match.group(1))}'\n            f'?{playlist}autoplay=0&amp;controls=1&amp;showinfo=1&amp;vq=hd1080\"'\n            f'allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; fullscreen\"'\n            f'allowfullscreen></iframe>'\n            f\"</span>\"\n        )\n        caption = f\"<figcaption>{escape_html(title)}</figcaption>\" if title else \"\"\n        return f\"<figure>{video_tag}{caption}</figure>\"\n\n    def video(self, src, alt=\"\", title=None):\n        video_tag = (\n            f'<video src=\"{escape_html(src)}\" controls autoplay loop muted playsinline>{escape_html(alt)}</video>'\n        )\n        caption = f\"<figcaption>{escape_html(title)}</figcaption>\" if title else \"\"\n        return f\"<figure>{video_tag}{caption}</figure>\"\n\n    def tweet(self, src, alt=\"\", title=None):\n        tweet_match = TWITTER_RE.match(src)\n        twitter_tag = f'<blockquote class=\"twitter-tweet\" tw-align-center>' \\\n                      f'<a href=\"{tweet_match.group(1)}\"></a></blockquote><br>' \\\n                      f'<a href=\"{src}\" target=\"_blank\">{src}</a>'\n        return twitter_tag\n", "path": "common/markdown/club_renderer.py"}]}