From 0149afb5f133d76dca86fc5532e78780ffa4fcc2 Mon Sep 17 00:00:00 2001
From: OndraRehounek <ondra.rehounek@seznam.cz>
Date: Thu, 21 Apr 2022 11:14:11 +0200
Subject: [PATCH] ArticleMixin: YouTubeVideoBlock

---
 shared/blocks.py | 74 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 74 insertions(+)

diff --git a/shared/blocks.py b/shared/blocks.py
index 4a3ba423..539228f6 100644
--- a/shared/blocks.py
+++ b/shared/blocks.py
@@ -138,3 +138,77 @@ class YouTubeVideoBlock(blocks.StructBlock):
             "Nepodařilo se získat video ID z YouTube URL", extra={"url": url}
         )
         return ""
+
+
+class YouTubeVideoBlock(blocks.StructBlock):
+    video_url = blocks.URLBlock(
+        label="Odkaz na video",
+        required=False,
+        help_text="Odkaz na YouTube video bude automaticky "
+        "zkonvertován na ID videa a NEBUDE uložen.",
+    )
+    video_id = blocks.CharBlock(
+        label="ID videa (automatické pole)",
+        required=False,
+        help_text="Není třeba vyplňovat, bude automaticky " "načteno z odkazu.",
+    )
+
+    class Meta:
+        label = "YouTube video"
+        icon = "media"
+        template = "styleguide/2.3.x/blocks/video_block.html"
+
+    def clean(self, value):
+        errors = {}
+
+        if not value["video_url"] and not value["video_id"]:
+            errors["video_url"] = ErrorList(["Zadejte prosím odkaz na YouTube video."])
+
+        if value["video_url"]:
+            if not value["video_url"].startswith("https://youtu.be") and not value[
+                "video_url"
+            ].startswith("https://www.youtube.com"):
+                errors["video_url"] = ErrorList(
+                    [
+                        'Odkaz na video musí začínat "https://www.youtube.com" '
+                        'nebo "https://youtu.be"'
+                    ]
+                )
+
+        if value["video_id"]:
+            if not re.match("^[A-Za-z0-9_-]{11}$", value["video_id"]):
+                errors["video_url"] = ErrorList(
+                    ["Formát ID YouTube videa není validní"]
+                )
+
+        if errors:
+            raise StructBlockValidationError(errors)
+        return super().clean(value)
+
+    def get_prep_value(self, value):
+        value = super().get_prep_value(value)
+
+        if value["video_url"]:
+            value["video_id"] = self.convert_youtube_link_to_video_id(
+                value["video_url"]
+            )
+
+        value["video_url"] = ""
+
+        return value
+
+    @staticmethod
+    def convert_youtube_link_to_video_id(url):
+        reg_str = (
+            "((?<=(v|V)/)|(?<=youtu\.be/)|(?<=youtube\.com/watch(\?|\&)v=)"
+            "|(?<=embed/))([\w-]+)"
+        )
+        search_result = re.search(reg_str, url)
+
+        if search_result:
+            return search_result.group(0)
+
+        logger.warning(
+            "Nepodařilo se získat video ID z YouTube URL", extra={"url": url}
+        )
+        return ""
-- 
GitLab