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