| 
									
										
										
										
											2020-11-09 19:41:01 +00:00
										 |  |  | __filename__ = "webapp_media.py" | 
					
						
							|  |  |  | __author__ = "Bob Mottram" | 
					
						
							|  |  |  | __license__ = "AGPL3+" | 
					
						
							|  |  |  | __version__ = "1.1.0" | 
					
						
							|  |  |  | __maintainer__ = "Bob Mottram" | 
					
						
							|  |  |  | __email__ = "bob@freedombone.net" | 
					
						
							|  |  |  | __status__ = "Production" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-22 18:06:23 +00:00
										 |  |  | def _addEmbeddedVideoFromSites(translate: {}, content: str, | 
					
						
							|  |  |  |                                width=400, height=300) -> str: | 
					
						
							| 
									
										
										
										
											2020-11-09 19:41:01 +00:00
										 |  |  |     """Adds embedded videos
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if '>vimeo.com/' in content: | 
					
						
							|  |  |  |         url = content.split('>vimeo.com/')[1] | 
					
						
							|  |  |  |         if '<' in url: | 
					
						
							|  |  |  |             url = url.split('<')[0] | 
					
						
							|  |  |  |             content = \ | 
					
						
							|  |  |  |                 content + "<center>\n<iframe loading=\"lazy\" " + \ | 
					
						
							|  |  |  |                 "src=\"https://player.vimeo.com/video/" + \ | 
					
						
							|  |  |  |                 url + "\" width=\"" + str(width) + \ | 
					
						
							|  |  |  |                 "\" height=\"" + str(height) + \ | 
					
						
							|  |  |  |                 "\" frameborder=\"0\" allow=\"autoplay; " + \ | 
					
						
							|  |  |  |                 "fullscreen\" allowfullscreen></iframe>\n</center>\n" | 
					
						
							|  |  |  |             return content | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     videoSite = 'https://www.youtube.com' | 
					
						
							|  |  |  |     if '"' + videoSite in content: | 
					
						
							|  |  |  |         url = content.split('"' + videoSite)[1] | 
					
						
							|  |  |  |         if '"' in url: | 
					
						
							|  |  |  |             url = url.split('"')[0].replace('/watch?v=', '/embed/') | 
					
						
							|  |  |  |             if '&' in url: | 
					
						
							|  |  |  |                 url = url.split('&')[0] | 
					
						
							|  |  |  |             content = \ | 
					
						
							|  |  |  |                 content + "<center>\n<iframe loading=\"lazy\" src=\"" + \ | 
					
						
							|  |  |  |                 videoSite + url + "\" width=\"" + str(width) + \ | 
					
						
							|  |  |  |                 "\" height=\"" + str(height) + \ | 
					
						
							|  |  |  |                 "\" frameborder=\"0\" allow=\"autoplay; fullscreen\" " + \ | 
					
						
							|  |  |  |                 "allowfullscreen></iframe>\n</center>\n" | 
					
						
							|  |  |  |             return content | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     invidiousSites = ('https://invidio.us', | 
					
						
							|  |  |  |                       'https://invidious.snopyta.org', | 
					
						
							|  |  |  |                       'http://c7hqkpkpemu6e7emz5b4vy' + | 
					
						
							|  |  |  |                       'z7idjgdvgaaa3dyimmeojqbgpea3xqjoid.onion', | 
					
						
							|  |  |  |                       'http://axqzx4s6s54s32yentfqojs3x5i7faxza6xo3ehd4' + | 
					
						
							|  |  |  |                       'bzzsg2ii4fv2iid.onion') | 
					
						
							|  |  |  |     for videoSite in invidiousSites: | 
					
						
							|  |  |  |         if '"' + videoSite in content: | 
					
						
							|  |  |  |             url = content.split('"' + videoSite)[1] | 
					
						
							|  |  |  |             if '"' in url: | 
					
						
							|  |  |  |                 url = url.split('"')[0].replace('/watch?v=', '/embed/') | 
					
						
							|  |  |  |                 if '&' in url: | 
					
						
							|  |  |  |                     url = url.split('&')[0] | 
					
						
							|  |  |  |                 content = \ | 
					
						
							|  |  |  |                     content + "<center>\n<iframe loading=\"lazy\" src=\"" + \ | 
					
						
							|  |  |  |                     videoSite + url + "\" width=\"" + \ | 
					
						
							|  |  |  |                     str(width) + "\" height=\"" + str(height) + \ | 
					
						
							|  |  |  |                     "\" frameborder=\"0\" allow=\"autoplay; fullscreen\" " + \ | 
					
						
							|  |  |  |                     "allowfullscreen></iframe>\n</center>\n" | 
					
						
							|  |  |  |                 return content | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     videoSite = 'https://media.ccc.de' | 
					
						
							|  |  |  |     if '"' + videoSite in content: | 
					
						
							|  |  |  |         url = content.split('"' + videoSite)[1] | 
					
						
							|  |  |  |         if '"' in url: | 
					
						
							|  |  |  |             url = url.split('"')[0] | 
					
						
							|  |  |  |             if not url.endswith('/oembed'): | 
					
						
							|  |  |  |                 url = url + '/oembed' | 
					
						
							|  |  |  |             content = \ | 
					
						
							|  |  |  |                 content + "<center>\n<iframe loading=\"lazy\" src=\"" + \ | 
					
						
							|  |  |  |                 videoSite + url + "\" width=\"" + \ | 
					
						
							|  |  |  |                 str(width) + "\" height=\"" + str(height) + \ | 
					
						
							|  |  |  |                 "\" frameborder=\"0\" allow=\"fullscreen\" " + \ | 
					
						
							|  |  |  |                 "allowfullscreen></iframe>\n</center>\n" | 
					
						
							|  |  |  |             return content | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if '"https://' in content: | 
					
						
							|  |  |  |         # A selection of the current larger peertube sites, mostly | 
					
						
							|  |  |  |         # French and German language | 
					
						
							|  |  |  |         # These have been chosen based on reported numbers of users | 
					
						
							|  |  |  |         # and the content of each has not been reviewed, so mileage could vary | 
					
						
							|  |  |  |         peerTubeSites = ('peertube.mastodon.host', 'open.tube', 'share.tube', | 
					
						
							|  |  |  |                          'tube.tr4sk.me', 'videos.elbinario.net', | 
					
						
							|  |  |  |                          'hkvideo.live', | 
					
						
							|  |  |  |                          'peertube.snargol.com', 'tube.22decembre.eu', | 
					
						
							|  |  |  |                          'tube.fabrigli.fr', 'libretube.net', 'libre.video', | 
					
						
							|  |  |  |                          'peertube.linuxrocks.online', 'spacepub.space', | 
					
						
							|  |  |  |                          'video.ploud.jp', 'video.omniatv.com', | 
					
						
							|  |  |  |                          'peertube.servebeer.com', | 
					
						
							|  |  |  |                          'tube.tchncs.de', 'tubee.fr', 'video.alternanet.fr', | 
					
						
							|  |  |  |                          'devtube.dev-wiki.de', 'video.samedi.pm', | 
					
						
							|  |  |  |                          'video.irem.univ-paris-diderot.fr', | 
					
						
							|  |  |  |                          'peertube.openstreetmap.fr', 'video.antopie.org', | 
					
						
							|  |  |  |                          'scitech.video', 'tube.4aem.com', 'video.ploud.fr', | 
					
						
							|  |  |  |                          'peervideo.net', 'video.valme.io', | 
					
						
							|  |  |  |                          'videos.pair2jeux.tube', | 
					
						
							|  |  |  |                          'vault.mle.party', 'hostyour.tv', | 
					
						
							|  |  |  |                          'diode.zone', 'visionon.tv', | 
					
						
							|  |  |  |                          'artitube.artifaille.fr', 'peertube.fr', | 
					
						
							| 
									
										
										
										
											2020-11-27 18:57:17 +00:00
										 |  |  |                          'peertube.live', 'kolektiva.media', | 
					
						
							| 
									
										
										
										
											2020-11-09 19:41:01 +00:00
										 |  |  |                          'tube.ac-lyon.fr', 'www.yiny.org', 'betamax.video', | 
					
						
							|  |  |  |                          'tube.piweb.be', 'pe.ertu.be', 'peertube.social', | 
					
						
							|  |  |  |                          'videos.lescommuns.org', 'peertube.nogafa.org', | 
					
						
							|  |  |  |                          'skeptikon.fr', 'video.tedomum.net', | 
					
						
							| 
									
										
										
										
											2020-11-24 18:32:06 +00:00
										 |  |  |                          'tube.p2p.legal', 'tilvids.com', | 
					
						
							| 
									
										
										
										
											2020-11-09 19:41:01 +00:00
										 |  |  |                          'sikke.fi', 'exode.me', 'peertube.video') | 
					
						
							|  |  |  |         for site in peerTubeSites: | 
					
						
							|  |  |  |             if '"https://' + site in content: | 
					
						
							|  |  |  |                 url = content.split('"https://' + site)[1] | 
					
						
							|  |  |  |                 if '"' in url: | 
					
						
							|  |  |  |                     url = url.split('"')[0].replace('/watch/', '/embed/') | 
					
						
							|  |  |  |                     content = \ | 
					
						
							|  |  |  |                         content + "<center>\n<iframe loading=\"lazy\" " + \ | 
					
						
							|  |  |  |                         "sandbox=\"allow-same-origin " + \ | 
					
						
							|  |  |  |                         "allow-scripts\" src=\"https://" + \ | 
					
						
							|  |  |  |                         site + url + "\" width=\"" + str(width) + \ | 
					
						
							|  |  |  |                         "\" height=\"" + str(height) + \ | 
					
						
							|  |  |  |                         "\" frameborder=\"0\" allow=\"autoplay; " + \ | 
					
						
							|  |  |  |                         "fullscreen\" allowfullscreen></iframe>\n</center>\n" | 
					
						
							|  |  |  |                     return content | 
					
						
							|  |  |  |     return content | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-22 18:06:23 +00:00
										 |  |  | def _addEmbeddedAudio(translate: {}, content: str) -> str: | 
					
						
							| 
									
										
										
										
											2020-11-09 19:41:01 +00:00
										 |  |  |     """Adds embedded audio for mp3/ogg
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if not ('.mp3' in content or '.ogg' in content): | 
					
						
							|  |  |  |         return content | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if '<audio ' in content: | 
					
						
							|  |  |  |         return content | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     extension = '.mp3' | 
					
						
							|  |  |  |     if '.ogg' in content: | 
					
						
							|  |  |  |         extension = '.ogg' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     words = content.strip('\n').split(' ') | 
					
						
							|  |  |  |     for w in words: | 
					
						
							|  |  |  |         if extension not in w: | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         w = w.replace('href="', '').replace('">', '') | 
					
						
							|  |  |  |         if w.endswith('.'): | 
					
						
							|  |  |  |             w = w[:-1] | 
					
						
							|  |  |  |         if w.endswith('"'): | 
					
						
							|  |  |  |             w = w[:-1] | 
					
						
							|  |  |  |         if w.endswith(';'): | 
					
						
							|  |  |  |             w = w[:-1] | 
					
						
							|  |  |  |         if w.endswith(':'): | 
					
						
							|  |  |  |             w = w[:-1] | 
					
						
							|  |  |  |         if not w.endswith(extension): | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if not (w.startswith('http') or w.startswith('dat:') or | 
					
						
							|  |  |  |                 w.startswith('hyper:') or w.startswith('i2p:') or | 
					
						
							|  |  |  |                 w.startswith('gnunet:') or | 
					
						
							|  |  |  |                 '/' in w): | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         url = w | 
					
						
							|  |  |  |         content += '<center>\n<audio controls>\n' | 
					
						
							|  |  |  |         content += \ | 
					
						
							|  |  |  |             '<source src="' + url + '" type="audio/' + \ | 
					
						
							|  |  |  |             extension.replace('.', '') + '">' | 
					
						
							|  |  |  |         content += \ | 
					
						
							|  |  |  |             translate['Your browser does not support the audio element.'] | 
					
						
							|  |  |  |         content += '</audio>\n</center>\n' | 
					
						
							|  |  |  |     return content | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-22 18:06:23 +00:00
										 |  |  | def _addEmbeddedVideo(translate: {}, content: str, | 
					
						
							|  |  |  |                       width=400, height=300) -> str: | 
					
						
							| 
									
										
										
										
											2020-11-09 19:41:01 +00:00
										 |  |  |     """Adds embedded video for mp4/webm/ogv
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if not ('.mp4' in content or '.webm' in content or '.ogv' in content): | 
					
						
							|  |  |  |         return content | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if '<video ' in content: | 
					
						
							|  |  |  |         return content | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     extension = '.mp4' | 
					
						
							|  |  |  |     if '.webm' in content: | 
					
						
							|  |  |  |         extension = '.webm' | 
					
						
							|  |  |  |     elif '.ogv' in content: | 
					
						
							|  |  |  |         extension = '.ogv' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     words = content.strip('\n').split(' ') | 
					
						
							|  |  |  |     for w in words: | 
					
						
							|  |  |  |         if extension not in w: | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         w = w.replace('href="', '').replace('">', '') | 
					
						
							|  |  |  |         if w.endswith('.'): | 
					
						
							|  |  |  |             w = w[:-1] | 
					
						
							|  |  |  |         if w.endswith('"'): | 
					
						
							|  |  |  |             w = w[:-1] | 
					
						
							|  |  |  |         if w.endswith(';'): | 
					
						
							|  |  |  |             w = w[:-1] | 
					
						
							|  |  |  |         if w.endswith(':'): | 
					
						
							|  |  |  |             w = w[:-1] | 
					
						
							|  |  |  |         if not w.endswith(extension): | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         if not (w.startswith('http') or w.startswith('dat:') or | 
					
						
							|  |  |  |                 w.startswith('hyper:') or w.startswith('i2p:') or | 
					
						
							|  |  |  |                 w.startswith('gnunet:') or | 
					
						
							|  |  |  |                 '/' in w): | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         url = w | 
					
						
							|  |  |  |         content += \ | 
					
						
							|  |  |  |             '<center>\n<video width="' + str(width) + '" height="' + \ | 
					
						
							|  |  |  |             str(height) + '" controls>\n' | 
					
						
							|  |  |  |         content += \ | 
					
						
							|  |  |  |             '<source src="' + url + '" type="video/' + \ | 
					
						
							|  |  |  |             extension.replace('.', '') + '">\n' | 
					
						
							|  |  |  |         content += \ | 
					
						
							|  |  |  |             translate['Your browser does not support the video element.'] | 
					
						
							|  |  |  |         content += '</video>\n</center>\n' | 
					
						
							|  |  |  |     return content | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def addEmbeddedElements(translate: {}, content: str) -> str: | 
					
						
							|  |  |  |     """Adds embedded elements for various media types
 | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2020-12-22 18:06:23 +00:00
										 |  |  |     content = _addEmbeddedVideoFromSites(translate, content) | 
					
						
							|  |  |  |     content = _addEmbeddedAudio(translate, content) | 
					
						
							|  |  |  |     return _addEmbeddedVideo(translate, content) |