Merge pull request 'bugfix/youtube-embed' (#37) from BordedDev/snek:bugfix/youtube-embed into main
Reviewed-on: retoor/snek#37 Reviewed-by: retoor <retoor@noreply@molodetz.nl>
This commit is contained in:
		
						commit
						c322d6147a
					
				| @ -1,4 +1,5 @@ | ||||
| import re | ||||
| from urllib.parse import urlparse, parse_qs | ||||
| from types import SimpleNamespace | ||||
| 
 | ||||
| import mimetypes | ||||
| @ -90,16 +91,59 @@ def set_link_target_blank(text): | ||||
| def embed_youtube(text): | ||||
|     soup = BeautifulSoup(text, "html.parser") | ||||
|     for element in soup.find_all("a"): | ||||
|         if element.attrs["href"].startswith("https://www.you"): | ||||
|             video_name = element.attrs["href"].split("/")[-1] | ||||
|             if "v=" in element.attrs["href"]: | ||||
|                 video_name = element.attrs["href"].split("?v=")[1].split("&")[0] | ||||
|             # if "si=" in element.attrs["href"]: | ||||
|             #    video_name = "?v=" + element.attrs["href"].split("/")[-1] | ||||
|             # if "t=" in element.attrs["href"]: | ||||
|             #    video_name += "&t=" + element.attrs["href"].split("&t=")[1].split("&")[0] | ||||
|             embed_template = f'<iframe width="560" height="315" style="display:block" src="https://www.youtube.com/embed/{video_name}" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>' | ||||
|         # Check if the link is a YouTube link | ||||
|         url = urlparse(element["href"]) | ||||
|         if ( | ||||
|             url.hostname in ["www.youtu.be", "youtu.be"] | ||||
|             or url.hostname | ||||
|             in [ | ||||
|                 "www.youtube.com", | ||||
|                 "youtube.com", | ||||
|                 "www.youtube-nocookie.com", | ||||
|                 "youtube-nocookie.com", | ||||
|             ] | ||||
|             and any(url.path.startswith(p) for p in ["/watch", "/embed"]) | ||||
|         ): | ||||
|             queries = parse_qs(url.query) | ||||
|             if "v" in queries: | ||||
|                 video_name = queries["v"][0] | ||||
|             else: | ||||
|                 video_name = url.path.split("/")[-1] | ||||
| 
 | ||||
|             queries.pop("v", None) | ||||
| 
 | ||||
|             start_time = queries.get("t", None) | ||||
|             if start_time: | ||||
|                 queries.pop("t", None) | ||||
|                 queries["start"] = [] | ||||
|                 for t in start_time: | ||||
|                     if t.endswith("s"): | ||||
|                         t = start_time[:-1] | ||||
|                     if t.isdigit(): | ||||
|                         queries["start"].append(t) | ||||
|                     else: | ||||
|                         queries["start"].append( | ||||
|                             str( | ||||
|                                 sum( | ||||
|                                     int(x) * 60**i | ||||
|                                     for i, x in enumerate(reversed(t.split(":"))) | ||||
|                                 ) | ||||
|                             ) | ||||
|                         ) | ||||
| 
 | ||||
|             new_queries = "&".join( | ||||
|                 [f"{key}={v}" for key, value in queries.items() for v in value] | ||||
|             ) | ||||
| 
 | ||||
|             base_url = ( | ||||
|                 "youtube-nocookie.com" | ||||
|                 if "youtube-nocookie" in url.hostname | ||||
|                 else "youtube.com" | ||||
|             ) | ||||
| 
 | ||||
|             embed_template = f'<iframe width="560" height="315" style="display:block" src="https://www.{base_url}/embed/{video_name}?{new_queries}" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>' | ||||
|             element.replace_with(BeautifulSoup(embed_template, "html.parser")) | ||||
| 
 | ||||
|     return str(soup) | ||||
| 
 | ||||
| 
 | ||||
| @ -108,35 +152,41 @@ def embed_image(text): | ||||
|     for element in soup.find_all("a"): | ||||
|         file_mime = mimetypes.guess_type(element.attrs["href"])[0] | ||||
| 
 | ||||
|         if file_mime and file_mime.startswith("image/") or any( | ||||
|             ext in element.attrs["href"].lower() for ext in [ | ||||
|                 ".png", | ||||
|                 ".jpg", | ||||
|                 ".jpeg", | ||||
|                 ".gif", | ||||
|                 ".webp", | ||||
|                 ".svg", | ||||
|                 ".bmp", | ||||
|                 ".tiff", | ||||
|                 ".ico", | ||||
|                 ".heif", | ||||
|                 ".heic", | ||||
|             ] | ||||
|         if ( | ||||
|             file_mime | ||||
|             and file_mime.startswith("image/") | ||||
|             or any( | ||||
|                 ext in element.attrs["href"].lower() | ||||
|                 for ext in [ | ||||
|                     ".png", | ||||
|                     ".jpg", | ||||
|                     ".jpeg", | ||||
|                     ".gif", | ||||
|                     ".webp", | ||||
|                     ".svg", | ||||
|                     ".bmp", | ||||
|                     ".tiff", | ||||
|                     ".ico", | ||||
|                     ".heif", | ||||
|                     ".heic", | ||||
|                 ] | ||||
|             ) | ||||
|         ): | ||||
|             embed_template = f'<img src="{element.attrs["href"]}" title="{element.attrs["href"]}?width=420" alt="{element.attrs["href"]}" />' | ||||
|             element.replace_with(BeautifulSoup(embed_template, "html.parser")) | ||||
|     return str(soup) | ||||
| 
 | ||||
| 
 | ||||
| def enrich_image_rendering(text): | ||||
|     soup = BeautifulSoup(text, "html.parser") | ||||
|     for element in soup.find_all("img"): | ||||
|         if element.attrs["src"].startswith("/"   ): | ||||
|         if element.attrs["src"].startswith("/"): | ||||
|             element.attrs["src"] += "?width=240&height=240" | ||||
|             picture_template = f''' | ||||
|                                 <picture> | ||||
|                                     <source srcset="{element.attrs["src"]}" type="{mimetypes.guess_type(element.attrs["src"])[0]}" /> | ||||
|                                     <source srcset="{element.attrs["src"]}" type="image/webp" /> | ||||
|                                     <img src="{element.attrs["src"]}" title="{element.attrs["src"]}" alt="{element.attrs["src"]}" /> | ||||
|                                     <source srcset="{element.attrs["src"]}&format=webp" type="image/webp" /> | ||||
|                                     <img src="{element.attrs["src"]}&format=png" title="{element.attrs["src"]}" alt="{element.attrs["src"]}" /> | ||||
|                                 </picture>''' | ||||
|             element.replace_with(BeautifulSoup(picture_template, "html.parser")) | ||||
|     return str(soup) | ||||
| @ -245,7 +295,6 @@ class PythonExtension(Extension): | ||||
|         ).set_lineno(line_number) | ||||
| 
 | ||||
|     def _to_html(self, md_file, caller): | ||||
| 
 | ||||
|         def fn(source): | ||||
|             import subprocess | ||||
| 
 | ||||
|  | ||||
| @ -1,5 +1,6 @@ | ||||
| import asyncio | ||||
| import mimetypes | ||||
| from os.path import isfile | ||||
| 
 | ||||
| from PIL import Image | ||||
| import pillow_heif.HeifImagePlugin | ||||
| @ -17,6 +18,9 @@ class ChannelAttachmentView(BaseView): | ||||
|             relative_url=relative_path | ||||
|         ) | ||||
| 
 | ||||
|         if not channel_attachment or not isfile(channel_attachment["path"]): | ||||
|             return web.HTTPNotFound() | ||||
| 
 | ||||
|         original_format = mimetypes.guess_type(channel_attachment["path"])[0] | ||||
|         format_ = self.request.query.get("format") | ||||
|         width = self.request.query.get("width") | ||||
| @ -75,7 +79,7 @@ class ChannelAttachmentView(BaseView): | ||||
|                  | ||||
|                 setattr(response, "write", sync_writer) | ||||
| 
 | ||||
|                 image.save(response, format=format_) | ||||
|                 image.save(response, format=format_, quality=100, optimize=True, save_all=True) | ||||
| 
 | ||||
|                 setattr(response, "write", naughty_steal) | ||||
|                  | ||||
| @ -88,6 +92,7 @@ class ChannelAttachmentView(BaseView): | ||||
|             response.headers["Content-Disposition"] = ( | ||||
|                 f'attachment; filename="{channel_attachment["name"]}"' | ||||
|             ) | ||||
|             response.headers["Content-Type"] = original_format | ||||
|             return response | ||||
| 
 | ||||
|     async def post(self): | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user