| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  | __filename__ = "video.py" | 
					
						
							|  |  |  | __author__ = "Bob Mottram" | 
					
						
							|  |  |  | __license__ = "AGPL3+" | 
					
						
							| 
									
										
										
										
											2022-02-03 13:58:20 +00:00
										 |  |  | __version__ = "1.3.0" | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  | __maintainer__ = "Bob Mottram" | 
					
						
							|  |  |  | __email__ = "bob@libreserver.org" | 
					
						
							|  |  |  | __status__ = "Production" | 
					
						
							|  |  |  | __module_group__ = "Timeline" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-26 12:45:03 +00:00
										 |  |  | from utils import get_full_domain | 
					
						
							| 
									
										
										
										
											2021-12-27 22:19:18 +00:00
										 |  |  | from utils import get_nickname_from_actor | 
					
						
							| 
									
										
										
										
											2021-12-27 19:05:25 +00:00
										 |  |  | from utils import get_domain_from_actor | 
					
						
							| 
									
										
										
										
											2021-12-27 11:20:57 +00:00
										 |  |  | from utils import remove_id_ending | 
					
						
							| 
									
										
										
										
											2021-12-29 21:55:09 +00:00
										 |  |  | from blocking import is_blocked | 
					
						
							|  |  |  | from filters import is_filtered | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-29 21:55:09 +00:00
										 |  |  | def convert_video_to_note(base_dir: str, nickname: str, domain: str, | 
					
						
							|  |  |  |                           system_language: str, | 
					
						
							| 
									
										
										
										
											2021-12-31 23:07:23 +00:00
										 |  |  |                           post_json_object: {}, blocked_cache: {}) -> {}: | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |     """Converts a PeerTube Video ActivityPub(ish) object into
 | 
					
						
							|  |  |  |     a Note, so that it can then be displayed in a timeline | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     # check that the required fields are present | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |     required_fields = ( | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |         'type', '@context', 'id', 'published', 'to', 'cc', | 
					
						
							|  |  |  |         'attributedTo', 'commentsEnabled', 'content', 'sensitive', | 
					
						
							|  |  |  |         'name', 'url' | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |     for field_name in required_fields: | 
					
						
							|  |  |  |         if not post_json_object.get(field_name): | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |             return None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-25 22:09:19 +00:00
										 |  |  |     if post_json_object['type'] != 'Video': | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |         return None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # who is this attributed to ? | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |     attributed_to = None | 
					
						
							| 
									
										
										
										
											2021-12-25 22:09:19 +00:00
										 |  |  |     if isinstance(post_json_object['attributedTo'], str): | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |         attributed_to = post_json_object['attributedTo'] | 
					
						
							| 
									
										
										
										
											2021-12-25 22:09:19 +00:00
										 |  |  |     elif isinstance(post_json_object['attributedTo'], list): | 
					
						
							|  |  |  |         for entity in post_json_object['attributedTo']: | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |             if not isinstance(entity, dict): | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             if not entity.get('type'): | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             if entity['type'] != 'Person': | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             if not entity.get('id'): | 
					
						
							|  |  |  |                 continue | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |             attributed_to = entity['id'] | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |             break | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |     if not attributed_to: | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |         return None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # get the language of the video | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |     post_language = system_language | 
					
						
							| 
									
										
										
										
											2021-12-25 22:09:19 +00:00
										 |  |  |     if post_json_object.get('language'): | 
					
						
							|  |  |  |         if isinstance(post_json_object['language'], dict): | 
					
						
							|  |  |  |             if post_json_object['language'].get('identifier'): | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |                 post_language = post_json_object['language']['identifier'] | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # check that the attributed actor is not blocked | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |     post_nickname = get_nickname_from_actor(attributed_to) | 
					
						
							|  |  |  |     if not post_nickname: | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |         return None | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |     post_domain, post_domain_port = get_domain_from_actor(attributed_to) | 
					
						
							|  |  |  |     if not post_domain: | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |         return None | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |     post_domain_full = get_full_domain(post_domain, post_domain_port) | 
					
						
							| 
									
										
										
										
											2021-12-29 21:55:09 +00:00
										 |  |  |     if is_blocked(base_dir, nickname, domain, | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |                   post_nickname, post_domain_full, blocked_cache): | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |         return None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # check that the content is valid | 
					
						
							| 
									
										
										
										
											2021-12-29 21:55:09 +00:00
										 |  |  |     if is_filtered(base_dir, nickname, domain, post_json_object['name']): | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |         return None | 
					
						
							| 
									
										
										
										
											2021-12-29 21:55:09 +00:00
										 |  |  |     if is_filtered(base_dir, nickname, domain, post_json_object['content']): | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |         return None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # get the content | 
					
						
							| 
									
										
										
										
											2021-12-25 22:09:19 +00:00
										 |  |  |     content = '<p><b>' + post_json_object['name'] + '</b></p>' | 
					
						
							|  |  |  |     if post_json_object.get('license'): | 
					
						
							|  |  |  |         if isinstance(post_json_object['license'], dict): | 
					
						
							|  |  |  |             if post_json_object['license'].get('name'): | 
					
						
							| 
									
										
										
										
											2021-12-29 21:55:09 +00:00
										 |  |  |                 if is_filtered(base_dir, nickname, domain, | 
					
						
							|  |  |  |                                post_json_object['license']['name']): | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |                     return None | 
					
						
							| 
									
										
										
										
											2021-12-25 22:09:19 +00:00
										 |  |  |                 content += '<p>' + post_json_object['license']['name'] + '</p>' | 
					
						
							| 
									
										
										
										
											2022-04-13 16:32:17 +00:00
										 |  |  |     post_content = post_json_object['content'] | 
					
						
							|  |  |  |     if post_json_object.get('contentMap'): | 
					
						
							|  |  |  |         if post_json_object['contentMap'].get(system_language): | 
					
						
							|  |  |  |             post_content = post_json_object['contentMap'][system_language] | 
					
						
							|  |  |  |     content += post_content | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |     conversation_id = remove_id_ending(post_json_object['id']) | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |     media_type = None | 
					
						
							|  |  |  |     media_url = None | 
					
						
							|  |  |  |     media_torrent = None | 
					
						
							|  |  |  |     media_magnet = None | 
					
						
							|  |  |  |     for media_link in post_json_object['url']: | 
					
						
							|  |  |  |         if not isinstance(media_link, dict): | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |             continue | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |         if not media_link.get('mediaType'): | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |             continue | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |         if not media_link.get('href'): | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |             continue | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |         if media_link['mediaType'] == 'application/x-bittorrent': | 
					
						
							|  |  |  |             media_torrent = media_link['href'] | 
					
						
							|  |  |  |         if media_link['href'].startswith('magnet:'): | 
					
						
							|  |  |  |             media_magnet = media_link['href'] | 
					
						
							|  |  |  |         if media_link['mediaType'] != 'video/mp4' and \ | 
					
						
							|  |  |  |            media_link['mediaType'] != 'video/ogv': | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |             continue | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |         if not media_url: | 
					
						
							|  |  |  |             media_type = media_link['mediaType'] | 
					
						
							|  |  |  |             media_url = media_link['href'] | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |     if not media_url: | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |         return None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     attachment = [{ | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |             'mediaType': media_type, | 
					
						
							| 
									
										
										
										
											2021-12-25 22:09:19 +00:00
										 |  |  |             'name': post_json_object['content'], | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |             'type': 'Document', | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |             'url': media_url | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |     }] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |     if media_torrent or media_magnet: | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |         content += '<p>' | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |         if media_torrent: | 
					
						
							|  |  |  |             content += '<a href="' + media_torrent + '">⇓</a> ' | 
					
						
							|  |  |  |         if media_magnet: | 
					
						
							|  |  |  |             content += '<a href="' + media_magnet + '">🧲</a>' | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |         content += '</p>' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |     new_post_id = remove_id_ending(post_json_object['id']) | 
					
						
							|  |  |  |     new_post = { | 
					
						
							| 
									
										
										
										
											2021-12-25 22:09:19 +00:00
										 |  |  |         '@context': post_json_object['@context'], | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |         'id': new_post_id + '/activity', | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |         'type': 'Create', | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |         'actor': attributed_to, | 
					
						
							| 
									
										
										
										
											2021-12-25 22:09:19 +00:00
										 |  |  |         'published': post_json_object['published'], | 
					
						
							|  |  |  |         'to': post_json_object['to'], | 
					
						
							|  |  |  |         'cc': post_json_object['cc'], | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |         'object': { | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |             'id': new_post_id, | 
					
						
							|  |  |  |             'conversation': conversation_id, | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |             'type': 'Note', | 
					
						
							|  |  |  |             'summary': None, | 
					
						
							|  |  |  |             'inReplyTo': None, | 
					
						
							| 
									
										
										
										
											2021-12-25 22:09:19 +00:00
										 |  |  |             'published': post_json_object['published'], | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |             'url': new_post_id, | 
					
						
							|  |  |  |             'attributedTo': attributed_to, | 
					
						
							| 
									
										
										
										
											2021-12-25 22:09:19 +00:00
										 |  |  |             'to': post_json_object['to'], | 
					
						
							|  |  |  |             'cc': post_json_object['cc'], | 
					
						
							|  |  |  |             'sensitive': post_json_object['sensitive'], | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |             'atomUri': new_post_id, | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |             'inReplyToAtomUri': None, | 
					
						
							| 
									
										
										
										
											2021-12-25 22:09:19 +00:00
										 |  |  |             'commentsEnabled': post_json_object['commentsEnabled'], | 
					
						
							|  |  |  |             'rejectReplies': not post_json_object['commentsEnabled'], | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |             'mediaType': 'text/html', | 
					
						
							|  |  |  |             'content': content, | 
					
						
							|  |  |  |             'contentMap': { | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |                 post_language: content | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |             }, | 
					
						
							|  |  |  |             'attachment': attachment, | 
					
						
							|  |  |  |             'tag': [], | 
					
						
							|  |  |  |             'replies': { | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |                 'id': new_post_id + '/replies', | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |                 'type': 'Collection', | 
					
						
							|  |  |  |                 'first': { | 
					
						
							|  |  |  |                     'type': 'CollectionPage', | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |                     'partOf': new_post_id + '/replies', | 
					
						
							| 
									
										
										
										
											2021-09-13 11:34:56 +00:00
										 |  |  |                     'items': [] | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-03 19:14:30 +00:00
										 |  |  |     return new_post |