forked from indymedia/epicyon
				
			
		
			
	
	
		
			225 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			Python
		
	
	
		
		
			
		
	
	
			225 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			Python
		
	
	
|  | __filename__ = "webapp_media.py" | ||
|  | __author__ = "Bob Mottram" | ||
|  | __license__ = "AGPL3+" | ||
|  | __version__ = "1.1.0" | ||
|  | __maintainer__ = "Bob Mottram" | ||
|  | __email__ = "bob@freedombone.net" | ||
|  | __status__ = "Production" | ||
|  | 
 | ||
|  | 
 | ||
|  | def addEmbeddedVideoFromSites(translate: {}, content: str, | ||
|  |                               width=400, height=300) -> str: | ||
|  |     """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', | ||
|  |                          'peertube.live', | ||
|  |                          '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', | ||
|  |                          'tube.p2p.legal', | ||
|  |                          '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 | ||
|  | 
 | ||
|  | 
 | ||
|  | def addEmbeddedAudio(translate: {}, content: str) -> str: | ||
|  |     """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 | ||
|  | 
 | ||
|  | 
 | ||
|  | def addEmbeddedVideo(translate: {}, content: str, | ||
|  |                      width=400, height=300) -> str: | ||
|  |     """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
 | ||
|  |     """
 | ||
|  |     content = addEmbeddedVideoFromSites(translate, content) | ||
|  |     content = addEmbeddedAudio(translate, content) | ||
|  |     return addEmbeddedVideo(translate, content) |