epicyon/video.py

183 lines
6.3 KiB
Python
Raw Normal View History

__filename__ = "video.py"
__author__ = "Bob Mottram"
__license__ = "AGPL3+"
2022-02-03 13:58:20 +00:00
__version__ = "1.3.0"
__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-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: {}) -> {}:
"""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 = (
'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):
return None
2021-12-25 22:09:19 +00:00
if post_json_object['type'] != 'Video':
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']:
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']
break
2022-01-03 19:14:30 +00:00
if not attributed_to:
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']
# 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:
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:
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):
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']):
return None
2021-12-29 21:55:09 +00:00
if is_filtered(base_dir, nickname, domain, post_json_object['content']):
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']):
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
2022-01-03 19:14:30 +00:00
conversation_id = remove_id_ending(post_json_object['id'])
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):
continue
2022-01-03 19:14:30 +00:00
if not media_link.get('mediaType'):
continue
2022-01-03 19:14:30 +00:00
if not media_link.get('href'):
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':
continue
2022-01-03 19:14:30 +00:00
if not media_url:
media_type = media_link['mediaType']
media_url = media_link['href']
2022-01-03 19:14:30 +00:00
if not media_url:
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'],
'type': 'Document',
2022-01-03 19:14:30 +00:00
'url': media_url
}]
2022-01-03 19:14:30 +00:00
if media_torrent or media_magnet:
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>'
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',
'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'],
'object': {
2022-01-03 19:14:30 +00:00
'id': new_post_id,
'conversation': conversation_id,
'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,
'inReplyToAtomUri': None,
2021-12-25 22:09:19 +00:00
'commentsEnabled': post_json_object['commentsEnabled'],
'rejectReplies': not post_json_object['commentsEnabled'],
'mediaType': 'text/html',
'content': content,
'contentMap': {
2022-01-03 19:14:30 +00:00
post_language: content
},
'attachment': attachment,
'tag': [],
'replies': {
2022-01-03 19:14:30 +00:00
'id': new_post_id + '/replies',
'type': 'Collection',
'first': {
'type': 'CollectionPage',
2022-01-03 19:14:30 +00:00
'partOf': new_post_id + '/replies',
'items': []
}
}
}
}
2022-01-03 19:14:30 +00:00
return new_post