Support for virtual locations

main
Bob Mottram 2025-12-13 13:05:56 +00:00
parent 096ad5b0b9
commit e50d691e5a
3 changed files with 95 additions and 37 deletions

View File

@ -215,11 +215,11 @@ def save_event_post(base_dir: str, handle: str, post_id: str,
def _is_happening_event(tag: {}) -> bool:
"""Is this tag an Event or Place ActivityStreams type?
"""Is this tag an Event, Place or VirtualLocation ActivityStreams type?
"""
if not tag.get('type'):
return False
if tag['type'] != 'Event' and tag['type'] != 'Place':
if tag['type'] not in ('Event', 'Place', 'VirtualLocation'):
return False
return True
@ -472,6 +472,11 @@ def _icalendar_day(base_dir: str, nickname: str, domain: str,
elif evnt['type'] == 'Place':
if evnt.get('name'):
event_place = remove_html(evnt['name'])
elif evnt['type'] == 'VirtualLocation':
if evnt.get('url'):
event_place = remove_html(evnt['url'])
if evnt.get('name'):
event_description = evnt['name'].strip()
print('icalendar: ' + str(post_id) + ' ' +
str(event_start) + ' ' + str(event_description) + ' ' +

17
maps.py
View File

@ -39,12 +39,17 @@ def get_location_dict_from_tags(tags: []) -> str:
for tag_item in tags:
if not tag_item.get('type'):
continue
if tag_item['type'] != 'Place':
if tag_item['type'] not in ('Place', 'VirtualLocation'):
continue
if not tag_item.get('name'):
continue
if not isinstance(tag_item['name'], str):
continue
if tag_item.get('url'):
if not isinstance(tag_item['url'], str):
continue
if not resembles_url(tag_item['url']):
continue
return tag_item
return None
@ -94,12 +99,10 @@ def _get_location_from_tags(tags: []) -> str:
location_str = remove_html(location_str)
if locn.get('url'):
# location name and link
if isinstance(locn['url'], str):
if resembles_url(locn['url']):
location_str = \
'<a href="' + locn['url'] + '" target="_blank" ' + \
'rel="nofollow noopener noreferrer">' + \
location_str + '</a>'
location_str = \
'<a href="' + locn['url'] + '" target="_blank" ' + \
'rel="nofollow noopener noreferrer">' + \
location_str + '</a>'
if locn.get('address'):
# location name and address
if isinstance(locn['address'], str):

106
posts.py
View File

@ -1253,7 +1253,8 @@ def _create_post_s2s(base_dir: str, nickname: str, domain: str, port: int,
media_license_url: str, media_creator: str,
buy_url: str, chat_url: str, translate: {},
searchable_by: [],
automatic_quote_approval: str) -> {}:
automatic_quote_approval: str,
session) -> {}:
"""Creates a new server-to-server post
"""
domain_full = get_full_domain(domain, port)
@ -1354,6 +1355,10 @@ def _create_post_s2s(base_dir: str, nickname: str, domain: str, port: int,
# pixelfed/friendica style location representation
location = get_location_dict_from_tags(tags)
if location:
locn_url = None
if location.get('url'):
locn_url = location['url']
if location.get('name') and \
location.get('longitude') and \
location.get('latitude'):
@ -1364,17 +1369,31 @@ def _create_post_s2s(base_dir: str, nickname: str, domain: str, port: int,
'latitude': location['latitude']
}
elif location.get('name'):
new_post['object']['location'] = {
'type': 'Place',
'name': location['name']
}
# check if the location url looks like a map url
locn_url2 = locn_url
if locn_url2:
_, latitude, longitude = \
geocoords_from_map_link(locn_url2, 'openstreetmap.org',
session)
if not latitude or not longitude:
locn_url2 = None
if not locn_url2:
new_post['object']['location'] = {
'type': 'Place',
'name': location['name']
}
else:
new_post['object']['location'] = {
'type': 'VirtualLocation',
'name': location['name'],
'url': location['url']
}
if location.get('address'):
if isinstance(location['address'], str):
new_post['object']['location']['address'] = location['address']
if location.get('url'):
if isinstance(location['url'], str):
if resembles_url(location['url']):
new_post['object']['location']['url'] = location['url']
if locn_url:
new_post['object']['location']['url'] = locn_url
if attach_image_filename:
new_post['object'] = \
attach_media(base_dir, http_prefix, nickname, domain, port,
@ -1403,7 +1422,8 @@ def _create_post_c2s(base_dir: str, nickname: str, domain: str, port: int,
content_license_url: str, media_license_url: str,
media_creator: str, buy_url: str, chat_url: str,
translate: {}, searchable_by: [],
automatic_quote_approval: str) -> {}:
automatic_quote_approval: str,
session) -> {}:
"""Creates a new client-to-server post
"""
domain_full = get_full_domain(domain, port)
@ -1492,6 +1512,10 @@ def _create_post_c2s(base_dir: str, nickname: str, domain: str, port: int,
# pixelfed/friendica style location representation
location = get_location_dict_from_tags(tags)
if location:
locn_url = None
if location.get('url'):
locn_url = location['url']
if location.get('name') and \
location.get('longitude') and \
location.get('latitude'):
@ -1502,17 +1526,31 @@ def _create_post_c2s(base_dir: str, nickname: str, domain: str, port: int,
'latitude': location['latitude']
}
elif location.get('name'):
new_post['location'] = {
'type': 'Place',
'name': location['name']
}
# check if the location url looks like a map url
locn_url2 = locn_url
if locn_url2:
_, latitude, longitude = \
geocoords_from_map_link(locn_url2, 'openstreetmap.org',
session)
if not latitude or not longitude:
locn_url2 = None
if not locn_url2:
new_post['location'] = {
'type': 'Place',
'name': location['name']
}
else:
new_post['location'] = {
'type': 'VirtualLocation',
'name': location['name'],
'url': location['url']
}
if location.get('address'):
if isinstance(location['address'], str):
new_post['object']['location']['address'] = location['address']
if location.get('url'):
if isinstance(location['url'], str):
if resembles_url(location['url']):
new_post['object']['location']['url'] = location['url']
if locn_url:
new_post['object']['location']['url'] = locn_url
if attach_image_filename:
new_post = \
@ -1617,14 +1655,24 @@ def _create_post_place_and_time(event_date: str, end_date: str,
"longitude": longitude
}
else:
location_tag_json = {
"@context": [
'https://www.w3.org/ns/activitystreams',
'https://w3id.org/security/v1'
],
"type": "Place",
"name": location
}
if not resembles_url(location.strip()):
location_tag_json = {
"@context": [
'https://www.w3.org/ns/activitystreams',
'https://w3id.org/security/v1'
],
"type": "Place",
"name": location
}
else:
location_tag_json = {
"@context": [
'https://www.w3.org/ns/activitystreams',
'https://w3id.org/security/v1'
],
"type": "VirtualLocation",
"url": location
}
# add the address if it is available
if location_address:
location_tag_json['address'] = remove_html(location_address)
@ -1957,7 +2005,8 @@ def create_post_base(base_dir: str,
content_license_url, media_license_url,
media_creator, buy_url, chat_url,
translate, searchable_by_list,
automatic_quote_approval)
automatic_quote_approval,
session)
else:
new_post = \
_create_post_c2s(base_dir, nickname, domain, port,
@ -1974,7 +2023,8 @@ def create_post_base(base_dir: str,
content_license_url, media_license_url,
media_creator, buy_url, chat_url,
translate, searchable_by_list,
automatic_quote_approval)
automatic_quote_approval,
session)
_create_post_mentions(cc_url, new_post, to_recipients, tags)