diff --git a/epicyon.py b/epicyon.py index 477d81ac7..d90b14fb5 100644 --- a/epicyon.py +++ b/epicyon.py @@ -514,6 +514,11 @@ def _command_options() -> None: type=str2bool, nargs='?', const=True, default=True, help="Enable replies to a post") + parser.add_argument("--ditherImage", "--dither", + dest='ditherImage', + type=str2bool, nargs='?', + const=True, default=False, + help="Whether to dither the attached image") parser.add_argument("--dav", dest='dav', type=str2bool, nargs='?', @@ -2093,7 +2098,9 @@ def _command_options() -> None: domain, port, to_nickname, to_domain, to_port, cc_url, http_prefix, send_message, - argb.commentsEnabled, attach, media_type, + argb.commentsEnabled, + argb.ditherImage, + attach, media_type, attached_image_description, video_transcript, city, cached_webfingers, person_cache, is_article, @@ -3949,9 +3956,10 @@ def _command_options() -> None: delete_all_posts(base_dir, nickname, domain, 'inbox') delete_all_posts(base_dir, nickname, domain, 'outbox') - test_save_to_file = True + test_save_to_file: bool = True test_c2s: bool = False - test_comments_enabled = True + test_comments_enabled: bool = True + test_apply_dithering: bool = False test_attach_image_filename = None test_media_type = None test_image_description = None @@ -3983,6 +3991,7 @@ def _command_options() -> None: test_save_to_file, test_c2s, test_comments_enabled, + test_apply_dithering, test_attach_image_filename, test_media_type, test_image_description, test_video_transcript, test_city, @@ -4002,6 +4011,7 @@ def _command_options() -> None: test_save_to_file, test_c2s, test_comments_enabled, + test_apply_dithering, test_attach_image_filename, test_media_type, test_image_description, test_video_transcript, test_city, @@ -4021,6 +4031,7 @@ def _command_options() -> None: test_save_to_file, test_c2s, test_comments_enabled, + test_apply_dithering, test_attach_image_filename, test_media_type, test_image_description, test_video_transcript, test_city, @@ -4040,6 +4051,7 @@ def _command_options() -> None: test_save_to_file, test_c2s, test_comments_enabled, + test_apply_dithering, test_attach_image_filename, test_media_type, test_image_description, test_video_transcript, test_city, @@ -4060,6 +4072,7 @@ def _command_options() -> None: test_save_to_file, test_c2s, test_comments_enabled, + test_apply_dithering, 'img/logo.png', 'image/png', 'Description of image', test_video_transcript, test_city, @@ -4079,6 +4092,7 @@ def _command_options() -> None: test_save_to_file, test_c2s, test_comments_enabled, + test_apply_dithering, test_attach_image_filename, test_media_type, test_image_description, test_video_transcript, test_city, @@ -4098,6 +4112,7 @@ def _command_options() -> None: test_save_to_file, test_c2s, test_comments_enabled, + test_apply_dithering, test_attach_image_filename, test_media_type, test_image_description, test_video_transcript, test_city, @@ -4117,6 +4132,7 @@ def _command_options() -> None: test_save_to_file, test_c2s, test_comments_enabled, + test_apply_dithering, test_attach_image_filename, test_media_type, test_image_description, test_video_transcript, test_city, diff --git a/src/daemon_post_question.py b/src/daemon_post_question.py index 660cad8e9..ecff8dce5 100644 --- a/src/daemon_post_question.py +++ b/src/daemon_post_question.py @@ -214,7 +214,8 @@ def _send_reply_to_question(self, base_dir: str, print('Voting on message ' + message_id) print('Vote for: ' + answer) - comments_enabled = True + comments_enabled: bool = True + apply_dithering: bool = False attach_image_filename = None media_type = None image_description = None @@ -251,6 +252,7 @@ def _send_reply_to_question(self, base_dir: str, mentions_str + ' ' + answer, False, False, comments_enabled, + apply_dithering, attach_image_filename, media_type, image_description, video_transcript, city, diff --git a/src/daemon_post_receive.py b/src/daemon_post_receive.py index 05d79a5bd..b7a26786a 100644 --- a/src/daemon_post_receive.py +++ b/src/daemon_post_receive.py @@ -84,6 +84,7 @@ def _receive_new_post_process_newpost(self, fields: {}, content_license_url: str, mentions_str: str, comments_enabled: bool, + apply_dithering: bool, filename: str, attachment_media_type: str, low_bandwidth: bool, @@ -182,6 +183,7 @@ def _receive_new_post_process_newpost(self, fields: {}, http_prefix, mentions_str + fields['message'], False, False, comments_enabled, + apply_dithering, filename, attachment_media_type, fields['imageDescription'], video_transcript, @@ -287,6 +289,7 @@ def _receive_new_post_process_newblog(self, fields: {}, http_prefix: str, person_cache: {}, content_license_url: str, comments_enabled: bool, + apply_dithering: bool, filename: str, attachment_media_type: str, low_bandwidth: bool, @@ -364,6 +367,7 @@ def _receive_new_post_process_newblog(self, fields: {}, domain, port, http_prefix, fields['message'], save_to_file, client_to_server, comments_enabled, + apply_dithering, filename, attachment_media_type, fields['imageDescription'], video_transcript, city, @@ -414,7 +418,8 @@ def _receive_new_post_process_editblog(self, fields: {}, attachment_media_type: str, low_bandwidth: bool, yt_replace_domain: str, - twitter_replacement_domain: str) -> int: + twitter_replacement_domain: str, + apply_dithering: bool) -> int: """Edited blog post has been received and is then sent to the outbox """ print('Edited blog post received') @@ -498,7 +503,7 @@ def _receive_new_post_process_editblog(self, fields: {}, city, low_bandwidth, license_url, creator, fields['languagesDropdown'], - debug) + debug, apply_dithering) replace_you_tube(post_json_object, yt_replace_domain, @@ -533,6 +538,7 @@ def _receive_new_post_process_newunlisted(self, fields: {}, content_license_url: str, port: int, mentions_str: str, comments_enabled: bool, + apply_dithering: bool, filename: str, attachment_media_type: str, low_bandwidth: bool, @@ -615,6 +621,7 @@ def _receive_new_post_process_newunlisted(self, fields: {}, mentions_str + fields['message'], save_to_file, client_to_server, comments_enabled, + apply_dithering, filename, attachment_media_type, fields['imageDescription'], video_transcript, @@ -707,6 +714,7 @@ def _receive_new_post_process_newfollowers(self, fields: {}, person_cache: {}, content_license_url: str, port: int, comments_enabled: bool, + apply_dithering: bool, filename: str, attachment_media_type: str, low_bandwidth: bool, @@ -795,6 +803,7 @@ def _receive_new_post_process_newfollowers(self, fields: {}, save_to_file, client_to_server, comments_enabled, + apply_dithering, filename, attachment_media_type, fields['imageDescription'], video_transcript, @@ -891,6 +900,7 @@ def _receive_new_post_process_newdm(self, fields: {}, person_cache: {}, content_license_url: str, port: int, comments_enabled: str, + apply_dithering: bool, filename: str, attachment_media_type: str, low_bandwidth: bool, @@ -986,6 +996,7 @@ def _receive_new_post_process_newdm(self, fields: {}, save_to_file, client_to_server, comments_enabled, + apply_dithering, filename, attachment_media_type, fields['imageDescription'], @@ -1135,6 +1146,7 @@ def _receive_new_post_process_newreminder(self, fields: {}, nickname: str, save_to_file: bool = False client_to_server: bool = False comments_enabled: bool = False + apply_dithering: bool = False conversation_id = None convthread_id = None mentions_message = mentions_str + fields['message'] @@ -1164,6 +1176,7 @@ def _receive_new_post_process_newreminder(self, fields: {}, nickname: str, save_to_file, client_to_server, comments_enabled, + apply_dithering, filename, attachment_media_type, fields['imageDescription'], video_transcript, @@ -1287,11 +1300,14 @@ def _receive_new_post_process_newreport(self, fields: {}, video_transcript: str = '' if fields.get('videoTranscript'): video_transcript = fields['videoTranscript'] + comments_enabled: bool = True + apply_dithering: bool = False message_json = \ create_report_post(base_dir, nickname, domain, port, http_prefix, mentions_str + fields['message'], - False, False, True, + False, False, comments_enabled, + apply_dithering, filename, attachment_media_type, fields['imageDescription'], video_transcript, @@ -1321,6 +1337,7 @@ def _receive_new_post_process_newquestion(self, fields: {}, content_license_url: str, port: int, comments_enabled: bool, + apply_dithering: bool, filename: str, attachment_media_type: str, low_bandwidth: bool, @@ -1394,6 +1411,7 @@ def _receive_new_post_process_newquestion(self, fields: {}, fields['message'], q_options, False, False, comments_enabled, + apply_dithering, filename, attachment_media_type, fields['imageDescription'], video_transcript, @@ -1428,6 +1446,7 @@ def _receive_new_post_process_newreading(self, fields: {}, domain: str, port: int, mentions_str: str, comments_enabled: bool, + apply_dithering: bool, filename: str, attachment_media_type: str, low_bandwidth: bool, @@ -1531,6 +1550,7 @@ def _receive_new_post_process_newreading(self, fields: {}, fields['bookurl'], book_rating, False, False, comments_enabled, + apply_dithering, filename, attachment_media_type, fields['imageDescription'], video_transcript, @@ -2117,6 +2137,10 @@ def _receive_new_post_process(self, post_type: str, path: str, headers: {}, comments_enabled: bool = False else: comments_enabled: bool = True + if not fields.get('ditherImage'): + apply_dithering: bool = False + else: + apply_dithering: bool = True buy_url: str = '' if fields.get('buyUrl'): @@ -2136,6 +2160,7 @@ def _receive_new_post_process(self, post_type: str, path: str, headers: {}, content_license_url, mentions_str, comments_enabled, + apply_dithering, filename, attachment_media_type, low_bandwidth, @@ -2187,7 +2212,9 @@ def _receive_new_post_process(self, post_type: str, path: str, headers: {}, cookie, calling_domain, http_prefix, person_cache, content_license_url, - comments_enabled, filename, + comments_enabled, + apply_dithering, + filename, attachment_media_type, low_bandwidth, buy_url, chat_url, @@ -2205,7 +2232,8 @@ def _receive_new_post_process(self, post_type: str, path: str, headers: {}, attachment_media_type, low_bandwidth, yt_replace_domain, - twitter_replacement_domain) + twitter_replacement_domain, + apply_dithering) if post_type == 'newunlisted': return _receive_new_post_process_newunlisted( self, fields, @@ -2217,6 +2245,7 @@ def _receive_new_post_process(self, post_type: str, path: str, headers: {}, content_license_url, port, mentions_str, comments_enabled, + apply_dithering, filename, attachment_media_type, low_bandwidth, @@ -2267,6 +2296,7 @@ def _receive_new_post_process(self, post_type: str, path: str, headers: {}, person_cache, content_license_url, port, comments_enabled, + apply_dithering, filename, attachment_media_type, low_bandwidth, @@ -2315,6 +2345,7 @@ def _receive_new_post_process(self, post_type: str, path: str, headers: {}, person_cache, content_license_url, port, comments_enabled, + apply_dithering, filename, attachment_media_type, low_bandwidth, @@ -2424,7 +2455,9 @@ def _receive_new_post_process(self, post_type: str, path: str, headers: {}, self, fields, city, base_dir, nickname, domain, domain_full, http_prefix, person_cache, content_license_url, - port, comments_enabled, filename, + port, comments_enabled, + apply_dithering, + filename, attachment_media_type, low_bandwidth, translate, auto_cw_cache, debug, project_version, curr_session, @@ -2441,6 +2474,7 @@ def _receive_new_post_process(self, post_type: str, path: str, headers: {}, domain, port, mentions_str, comments_enabled, + apply_dithering, filename, attachment_media_type, low_bandwidth, diff --git a/src/desktop_client.py b/src/desktop_client.py index 8477c7a24..202a3610a 100644 --- a/src/desktop_client.py +++ b/src/desktop_client.py @@ -557,7 +557,8 @@ def _desktop_reply_to_post(session, post_id: str, attached_image_description = None is_article: bool = False subject = None - comments_enabled = True + comments_enabled: bool = True + apply_dithering: bool = False city = 'London, England' say_str = 'Sending reply' event_date = None @@ -577,7 +578,8 @@ def _desktop_reply_to_post(session, post_id: str, domain, port, to_nickname, to_domain, to_port, cc_url, http_prefix, reply_message, - comments_enabled, attach, media_type, + comments_enabled, apply_dithering, + attach, media_type, attached_image_description, video_transcript, city, cached_webfingers, person_cache, is_article, @@ -646,7 +648,8 @@ def _desktop_new_post(session, city = 'London, England' is_article: bool = False subject = None - comments_enabled = True + comments_enabled: bool = True + apply_dithering: bool = False subject = None say_str = 'Sending' event_date = None @@ -666,7 +669,8 @@ def _desktop_new_post(session, domain, port, None, '#Public', port, cc_url, http_prefix, new_message, - comments_enabled, attach, media_type, + comments_enabled, apply_dithering, + attach, media_type, attached_image_description, video_transcript, city, cached_webfingers, person_cache, is_article, system_language, languages_understood, @@ -1450,7 +1454,8 @@ def _desktop_new_dm_base(session, to_handle: str, city: str = 'London, England' is_article: bool = False subject = None - comments_enabled = True + comments_enabled: bool = True + apply_dithering: bool = False subject = None # if there is a local PGP key then attempt to encrypt the DM @@ -1510,7 +1515,8 @@ def _desktop_new_dm_base(session, to_handle: str, domain, port, to_nickname, to_domain, to_port, cc_url, http_prefix, new_message, - comments_enabled, attach, media_type, + comments_enabled, apply_dithering, + attach, media_type, attached_image_description, video_transcript, city, cached_webfingers, person_cache, is_article, system_language, languages_understood, diff --git a/src/inbox.py b/src/inbox.py index 05dddcded..037b34832 100644 --- a/src/inbox.py +++ b/src/inbox.py @@ -1444,6 +1444,7 @@ def _bounce_dm(sender_post_id: str, session, http_prefix: str, save_to_file: bool = False client_to_server: bool = False comments_enabled: bool = False + apply_dithering: bool = False attach_image_filename = None media_type = None image_description: str = '' @@ -1468,6 +1469,7 @@ def _bounce_dm(sender_post_id: str, session, http_prefix: str, http_prefix, content, save_to_file, client_to_server, comments_enabled, + apply_dithering, attach_image_filename, media_type, image_description, video_transcript, city, in_reply_to, in_reply_to_atom_uri, diff --git a/src/media.py b/src/media.py index 62852b2e1..551b347f7 100644 --- a/src/media.py +++ b/src/media.py @@ -686,7 +686,8 @@ def attach_media(base_dir: str, http_prefix: str, content_license_url: str, creator: str, system_language: str, - debug: bool) -> {}: + debug: bool, + apply_dithering: bool) -> {}: """Attaches media to a json object post The description can be None """ @@ -766,7 +767,7 @@ def attach_media(base_dir: str, http_prefix: str, if base_dir: if media_type.startswith('image/'): - if low_bandwidth: + if low_bandwidth or apply_dithering: convert_image_to_low_bandwidth(image_filename) exif_json: list[dict] = [] file_size_original: int = os.path.getsize(image_filename) diff --git a/src/newsdaemon.py b/src/newsdaemon.py index 675bfb337..2494f67b4 100644 --- a/src/newsdaemon.py +++ b/src/newsdaemon.py @@ -637,6 +637,7 @@ def _convert_rss_to_activitypub(base_dir: str, http_prefix: str, # consistent (it's based on the current time, not the # published time), so we change that later save_to_file: bool = False + apply_dithering: bool = False attach_image_filename = None media_type = None image_description = None @@ -650,7 +651,7 @@ def _convert_rss_to_activitypub(base_dir: str, http_prefix: str, blog = create_news_post(base_dir, domain, port, http_prefix, rss_description, - save_to_file, + save_to_file, apply_dithering, attach_image_filename, media_type, image_description, video_transcript, city, rss_title, system_language, diff --git a/src/posts.py b/src/posts.py index 927707f18..69bcbde36 100644 --- a/src/posts.py +++ b/src/posts.py @@ -1240,6 +1240,7 @@ def _create_post_s2s(base_dir: str, nickname: str, domain: str, port: int, published: str, new_post_id: str, post_context: {}, to_recipients: [], to_cc: [], in_reply_to: str, sensitive: bool, comments_enabled: bool, + apply_dithering: bool, tags: [], attach_image_filename: str, media_type: str, image_description: str, video_transcript: str, city: str, @@ -1410,7 +1411,7 @@ def _create_post_s2s(base_dir: str, nickname: str, domain: str, port: int, media_type, image_description, video_transcript, city, low_bandwidth, media_license_url, media_creator, system_language, - debug) + debug, apply_dithering) else: if debug: print('DEBUG: creating s2s post with no attached media') @@ -1425,6 +1426,7 @@ def _create_post_c2s(base_dir: str, nickname: str, domain: str, port: int, published: str, new_post_id: str, post_context: {}, to_recipients: [], to_cc: [], in_reply_to: str, sensitive: bool, comments_enabled: bool, + apply_dithering: bool, tags: [], attach_image_filename: str, media_type: str, image_description: str, video_transcript: str, city: str, @@ -1584,7 +1586,7 @@ def _create_post_c2s(base_dir: str, nickname: str, domain: str, port: int, media_type, image_description, video_transcript, city, low_bandwidth, media_license_url, media_creator, - system_language, debug) + system_language, debug, apply_dithering) else: if debug: print('DEBUG: creating c2s post with no attached media') @@ -1823,6 +1825,7 @@ def create_post_base(base_dir: str, to_url: str, cc_url: str, http_prefix: str, content: str, save_to_file: bool, client_to_server: bool, comments_enabled: bool, + apply_dithering: bool, attach_image_filename: str, media_type: str, image_description: str, video_transcript: str, city: str, @@ -2022,6 +2025,7 @@ def create_post_base(base_dir: str, published, new_post_id, post_context, to_recipients, to_cc, in_reply_to, sensitive, comments_enabled, + apply_dithering, tags, attach_image_filename, media_type, image_description, video_transcript, city, @@ -2040,6 +2044,7 @@ def create_post_base(base_dir: str, published, new_post_id, post_context, to_recipients, to_cc, in_reply_to, sensitive, comments_enabled, + apply_dithering, tags, attach_image_filename, media_type, image_description, video_transcript, city, @@ -2052,6 +2057,19 @@ def create_post_base(base_dir: str, automatic_quote_approval, session, debug) + # update the image dithering flag + dither_filename = \ + acct_dir(base_dir, nickname, domain) + '/.ditherImage' + if apply_dithering: + if not is_a_file(dither_filename): + save_string('.', dither_filename, + 'EX: unable to save ditherImage flag ' + + dither_filename) + else: + if is_a_file(dither_filename): + erase_file(dither_filename, + 'EX: unable to delete ' + dither_filename) + _create_post_mentions(cc_url, new_post, to_recipients, tags) _create_post_mod_report(base_dir, is_moderation_report, @@ -2290,6 +2308,7 @@ def create_public_post(base_dir: str, nickname: str, domain: str, port: int, http_prefix: str, content: str, save_to_file: bool, client_to_server: bool, comments_enabled: bool, + apply_dithering: bool, attach_image_filename: str, media_type: str, image_description: str, video_transcript: str, city: str, in_reply_to: str, @@ -2328,6 +2347,7 @@ def create_public_post(base_dir: str, local_actor + '/followers', http_prefix, content, save_to_file, client_to_server, comments_enabled, + apply_dithering, attach_image_filename, media_type, image_description, video_transcript, city, is_moderation_report, is_article, @@ -2354,6 +2374,7 @@ def create_reading_post(base_dir: str, book_title: str, book_url: str, book_rating: float, save_to_file: bool, client_to_server: bool, comments_enabled: bool, + apply_dithering: bool, attach_image_filename: str, media_type: str, image_description: str, video_transcript: str, city: str, in_reply_to: str, @@ -2397,6 +2418,7 @@ def create_reading_post(base_dir: str, nickname, domain, port, http_prefix, content, save_to_file, client_to_server, comments_enabled, + apply_dithering, attach_image_filename, media_type, image_description, video_transcript, city, in_reply_to, @@ -2458,6 +2480,7 @@ def create_blog_post(base_dir: str, nickname: str, domain: str, port: int, http_prefix: str, content: str, save_to_file: bool, client_to_server: bool, comments_enabled: bool, + apply_dithering: bool, attach_image_filename: str, media_type: str, image_description: str, video_transcript: str, city: str, in_reply_to: str, in_reply_to_atom_uri: str, @@ -2477,6 +2500,7 @@ def create_blog_post(base_dir: str, nickname, domain, port, http_prefix, content, save_to_file, client_to_server, comments_enabled, + apply_dithering, attach_image_filename, media_type, image_description, video_transcript, city, in_reply_to, in_reply_to_atom_uri, subject, @@ -2501,6 +2525,7 @@ def create_blog_post(base_dir: str, def create_news_post(base_dir: str, domain: str, port: int, http_prefix: str, content: str, save_to_file: bool, + apply_dithering: bool, attach_image_filename: str, media_type: str, image_description: str, video_transcript: str, city: str, subject: str, system_language: str, @@ -2525,7 +2550,7 @@ def create_news_post(base_dir: str, create_public_post(base_dir, 'news', domain, port, http_prefix, content, save_to_file, - client_to_server, False, + client_to_server, False, apply_dithering, attach_image_filename, media_type, image_description, video_transcript, city, in_reply_to, in_reply_to_atom_uri, subject, @@ -2548,6 +2573,7 @@ def create_question_post(base_dir: str, content: str, q_options: [], save_to_file: bool, client_to_server: bool, comments_enabled: bool, + apply_dithering: bool, attach_image_filename: str, media_type: str, image_description: str, video_transcript: str, city: str, subject: str, duration_days: int, @@ -2581,6 +2607,7 @@ def create_question_post(base_dir: str, local_actor + '/followers', http_prefix, content, save_to_file, client_to_server, comments_enabled, + apply_dithering, attach_image_filename, media_type, image_description, video_transcript, city, is_moderation_report, is_article, @@ -2624,6 +2651,7 @@ def create_unlisted_post(base_dir: str, http_prefix: str, content: str, save_to_file: bool, client_to_server: bool, comments_enabled: bool, + apply_dithering: bool, attach_image_filename: str, media_type: str, image_description: str, video_transcript: str, city: str, in_reply_to: str, @@ -2657,6 +2685,7 @@ def create_unlisted_post(base_dir: str, 'https://www.w3.org/ns/activitystreams#Public', http_prefix, content, save_to_file, client_to_server, comments_enabled, + apply_dithering, attach_image_filename, media_type, image_description, video_transcript, city, is_moderation_report, is_article, @@ -2685,6 +2714,7 @@ def create_followers_only_post(base_dir: str, http_prefix: str, content: str, save_to_file: bool, client_to_server: bool, comments_enabled: bool, + apply_dithering: bool, attach_image_filename: str, media_type: str, image_description: str, video_transcript: str, city: str, in_reply_to: str, @@ -2720,6 +2750,7 @@ def create_followers_only_post(base_dir: str, local_actor + '/followers', None, http_prefix, content, save_to_file, client_to_server, comments_enabled, + apply_dithering, attach_image_filename, media_type, image_description, video_transcript, city, is_moderation_report, is_article, @@ -2783,6 +2814,7 @@ def create_direct_message_post(base_dir: str, http_prefix: str, content: str, save_to_file: bool, client_to_server: bool, comments_enabled: bool, + apply_dithering: bool, attach_image_filename: str, media_type: str, image_description: str, video_transcript: str, city: str, in_reply_to: str, @@ -2827,6 +2859,7 @@ def create_direct_message_post(base_dir: str, post_to, post_cc, http_prefix, content, save_to_file, client_to_server, comments_enabled, + apply_dithering, attach_image_filename, media_type, image_description, video_transcript, city, is_moderation_report, is_article, @@ -2864,6 +2897,7 @@ def create_report_post(base_dir: str, nickname: str, domain: str, port: int, http_prefix: str, content: str, save_to_file: bool, client_to_server: bool, comments_enabled: bool, + apply_dithering: bool, attach_image_filename: str, media_type: str, image_description: str, video_transcript: str, city: str, debug: bool, subject: str, @@ -2969,6 +3003,7 @@ def create_report_post(base_dir: str, to_url, post_cc, http_prefix, content, save_to_file, client_to_server, comments_enabled, + apply_dithering, attach_image_filename, media_type, image_description, video_transcript, city, is_moderation_report, is_article, @@ -3177,6 +3212,7 @@ def send_post(signing_priv_key_pem: str, project_version: str, http_prefix: str, content: str, save_to_file: bool, client_to_server: bool, comments_enabled: bool, + apply_dithering: bool, attach_image_filename: str, media_type: str, image_description: str, video_transcript: str, city: str, federation_list: [], send_threads: [], post_log: [], @@ -3266,6 +3302,7 @@ def send_post(signing_priv_key_pem: str, project_version: str, to_person_id, cc_str, http_prefix, content, save_to_file, client_to_server, comments_enabled, + apply_dithering, attach_image_filename, media_type, image_description, video_transcript, city, is_moderation_report, is_article, in_reply_to, diff --git a/src/sendC2S.py b/src/sendC2S.py index 048f6ecf2..dedcfe9b0 100644 --- a/src/sendC2S.py +++ b/src/sendC2S.py @@ -28,6 +28,7 @@ def send_post_via_server(signing_priv_key_pem: str, project_version: str, cc_str: str, http_prefix: str, content: str, comments_enabled: bool, + apply_dithering: bool, attach_image_filename: str, media_type: str, image_description: str, video_transcript: str, city: str, cached_webfingers: {}, person_cache: {}, @@ -133,7 +134,7 @@ def send_post_via_server(signing_priv_key_pem: str, project_version: str, from_nickname, from_domain, from_port, to_person_id, cc_str, http_prefix, content, save_to_file, client_to_server, - comments_enabled, + comments_enabled, apply_dithering, attach_image_filename, media_type, image_description, video_transcript, city, is_moderation_report, is_article, in_reply_to, diff --git a/src/tests.py b/src/tests.py index fd4418265..c24c2559b 100644 --- a/src/tests.py +++ b/src/tests.py @@ -832,9 +832,10 @@ def create_server_alice(path: str, domain: str, port: int, add_follower_of_person(path, nickname, domain, 'bob', bob_address, federation_list, False, False) if has_posts: - test_save_to_file = True + test_save_to_file: bool = True client_to_server: bool = False - test_comments_enabled = True + test_comments_enabled: bool = True + test_apply_dithering: bool = False test_attach_image_filename = None test_media_type = None test_image_description = None @@ -869,6 +870,7 @@ def create_server_alice(path: str, domain: str, port: int, test_save_to_file, client_to_server, test_comments_enabled, + test_apply_dithering, test_attach_image_filename, test_media_type, test_image_description, test_video_transcript, @@ -889,6 +891,7 @@ def create_server_alice(path: str, domain: str, port: int, test_save_to_file, client_to_server, test_comments_enabled, + test_apply_dithering, test_attach_image_filename, test_media_type, test_image_description, test_video_transcript, @@ -910,6 +913,7 @@ def create_server_alice(path: str, domain: str, port: int, test_save_to_file, client_to_server, test_comments_enabled, + test_apply_dithering, test_attach_image_filename, test_media_type, test_image_description, test_video_transcript, @@ -1041,6 +1045,7 @@ def create_server_bob(path: str, domain: str, port: int, if has_posts: test_save_to_file: bool = True test_comments_enabled: bool = True + test_apply_dithering: bool = False test_attach_image_filename = None test_image_description = None test_media_type = None @@ -1075,6 +1080,7 @@ def create_server_bob(path: str, domain: str, port: int, test_save_to_file, client_to_server, test_comments_enabled, + test_apply_dithering, test_attach_image_filename, test_media_type, test_image_description, test_video_transcript, @@ -1096,6 +1102,7 @@ def create_server_bob(path: str, domain: str, port: int, test_save_to_file, client_to_server, test_comments_enabled, + test_apply_dithering, test_attach_image_filename, test_media_type, test_image_description, test_video_transcript, @@ -1116,6 +1123,7 @@ def create_server_bob(path: str, domain: str, port: int, test_save_to_file, client_to_server, test_comments_enabled, + test_apply_dithering, test_attach_image_filename, test_media_type, test_image_description, test_video_transcript, @@ -1550,13 +1558,16 @@ def test_post_message_between_servers(base_dir: str) -> None: auto_cw_cache: dict = {} searchable_by: list[str] = [] mitm_servers: list[str] = [] + comments_enabled: bool = True + apply_dithering: bool = False send_result = \ send_post(signing_priv_key_pem, __version__, session_alice, alice_dir, 'alice', alice_domain, alice_port, 'bob', bob_domain, bob_port, cc_url, http_prefix, 'Why is a mouse when it spins? ' + 'यह एक परीक्षण है #sillyquestion', - save_to_file, client_to_server, True, + save_to_file, client_to_server, comments_enabled, + apply_dithering, attached_image_filename, media_type, attached_image_description, video_transcript, city, federation_list, @@ -1955,13 +1966,20 @@ def test_follow_between_servers(base_dir: str) -> None: auto_cw_cache: dict = {} searchable_by: list[str] = [] mitm_servers: list[str] = [] + comments_enabled: bool = True + apply_dithering: bool = False + attached_image_filename: str = None + media_type: str = None + attached_image_description: str = None send_result = \ send_post(signing_priv_key_pem, __version__, session_alice, alice_dir, 'alice', alice_domain, alice_port, 'bob', bob_domain, bob_port, cc_url, http_prefix, 'Alice message', save_to_file, - client_to_server, True, - None, None, None, video_transcript, city, federation_list, + client_to_server, comments_enabled, apply_dithering, + attached_image_filename, media_type, + attached_image_description, video_transcript, + city, federation_list, alice_send_threads, alice_post_log, alice_cached_webfingers, alice_person_cache, is_article, system_language, languages_understood, @@ -2375,13 +2393,20 @@ def test_shared_items_federation(base_dir: str) -> None: auto_cw_cache: dict = {} searchable_by: list[str] = [] mitm_servers: list[str] = [] + comments_enabled: bool = True + apply_dithering: bool = False + attached_image_filename: str = None + media_type: str = None + attached_image_description: str = None send_result = \ send_post(signing_priv_key_pem, __version__, session_alice, alice_dir, 'alice', alice_domain, alice_port, 'bob', bob_domain, bob_port, cc_url, http_prefix, 'Alice message', save_to_file, - client_to_server, True, - None, None, None, video_transcript, city, federation_list, + client_to_server, comments_enabled, apply_dithering, + attached_image_filename, media_type, + attached_image_description, + video_transcript, city, federation_list, alice_send_threads, alice_post_log, alice_cached_webfingers, alice_person_cache, is_article, system_language, languages_understood, @@ -2829,13 +2854,20 @@ def test_group_follow(base_dir: str) -> None: auto_cw_cache = {} searchable_by: list[str] = [] mitm_servers: list[str] = [] + comments_enabled: bool = True + apply_dithering: bool = False + attached_image_filename: str = None + media_type: str = None + attached_image_description: str = None send_result = \ send_post(signing_priv_key_pem, __version__, session_alice, alice_dir, 'alice', alice_domain, alice_port, 'testgroup', testgroup_domain, testgroupPort, cc_url, http_prefix, "Alice group message", - save_to_file, client_to_server, True, - None, None, None, video_transcript, city, federation_list, + save_to_file, client_to_server, comments_enabled, + apply_dithering, attached_image_filename, + media_type, attached_image_description, + video_transcript, city, federation_list, alice_send_threads, alice_post_log, alice_cached_webfingers, alice_person_cache, is_article, system_language, languages_understood, @@ -3217,9 +3249,10 @@ def _test_create_person_account(base_dir: str): test_event_end_time = None test_event_category: str = '' test_location = None - test_is_article = False - save_to_file = True - comments_enabled = True + test_is_article: bool = False + save_to_file: bool = True + comments_enabled: bool = True + test_apply_dithering: bool = True attach_image_filename = None media_type = None conversation_id = None @@ -3246,7 +3279,8 @@ def _test_create_person_account(base_dir: str): create_public_post(base_dir, nickname, domain, port, http_prefix, content, save_to_file, client_to_server, - comments_enabled, attach_image_filename, media_type, + comments_enabled, test_apply_dithering, + attach_image_filename, media_type, 'Not suitable for Vogons', '', 'London, England', test_in_reply_to, test_in_reply_to_atom_uri, test_subject, test_schedule_post, @@ -3276,7 +3310,8 @@ def _test_create_person_account(base_dir: str): create_public_post(base_dir, nickname, domain, port, http_prefix, content, save_to_file, client_to_server, - comments_enabled, attach_image_filename, media_type, + comments_enabled, test_apply_dithering, + attach_image_filename, media_type, 'Not suitable for Vogons', '', 'London, England', test_in_reply_to, test_in_reply_to_atom_uri, test_subject, test_schedule_post, @@ -3498,6 +3533,8 @@ def test_client_to_server(base_dir: str): buy_url = '' chat_url = '' video_transcript = None + comments_enabled: bool = True + apply_dithering: bool = False auto_cw_cache = {} searchable_by: list[str] = [] mitm_servers: list[str] = [] @@ -3507,7 +3544,8 @@ def test_client_to_server(base_dir: str): alice_domain, alice_port, 'bob', bob_domain, bob_port, None, http_prefix, 'Sent from my ActivityPub client', - True, attached_image_filename, media_type, + comments_enabled, apply_dithering, + attached_image_filename, media_type, attached_image_description, video_transcript, city, cached_webfingers, person_cache, is_article, @@ -5345,6 +5383,7 @@ def _test_reply_to_public_post(base_dir: str) -> None: save_to_file: bool = False client_to_server: bool = False comments_enabled: bool = True + test_apply_dithering: bool = False attach_image_filename = None media_type = None image_description: str = 'Some description' @@ -5352,13 +5391,13 @@ def _test_reply_to_public_post(base_dir: str) -> None: test_in_reply_to = post_id test_in_reply_to_atom_uri = None test_subject = None - test_schedule_post = False + test_schedule_post: bool = False test_event_date = None test_event_time = None test_event_end_time = None test_event_category = '' test_location = None - test_is_article = False + test_is_article: bool = False conversation_id = None convthread_id = None low_bandwidth: bool = True @@ -5379,6 +5418,7 @@ def _test_reply_to_public_post(base_dir: str) -> None: create_public_post(base_dir, nickname, domain, port, http_prefix, content, save_to_file, client_to_server, comments_enabled, + test_apply_dithering, attach_image_filename, media_type, image_description, video_transcript, city, test_in_reply_to, @@ -6458,6 +6498,7 @@ def _test_links_within_post(base_dir: str) -> None: save_to_file: bool = False client_to_server: bool = False comments_enabled: bool = True + test_apply_dithering: bool = False attach_image_filename = None media_type = None image_description = None @@ -6493,6 +6534,7 @@ def _test_links_within_post(base_dir: str) -> None: create_public_post(base_dir, nickname, domain, port, http_prefix, content, save_to_file, client_to_server, comments_enabled, + test_apply_dithering, attach_image_filename, media_type, image_description, video_transcript, city, test_in_reply_to, test_in_reply_to_atom_uri, @@ -6536,13 +6578,23 @@ def _test_links_within_post(base_dir: str) -> None: "
" + save_to_file: bool = False + client_to_server: bool = False + comments_enabled: bool = True + apply_dithering: bool = False + attach_image_filename: str = None + media_type: str = None + image_description: str = '' + video_transcript: str = '' + city: str = '' post_json_object = \ create_public_post(base_dir, nickname, domain, port, http_prefix, - content, - False, - False, True, - None, None, - '', '', None, + content, save_to_file, + client_to_server, comments_enabled, + apply_dithering, + attach_image_filename, media_type, + image_description, + video_transcript, city, test_in_reply_to, test_in_reply_to_atom_uri, test_subject, test_schedule_post, test_event_date, test_event_time, @@ -6564,11 +6616,12 @@ def _test_links_within_post(base_dir: str) -> None: "gerbils and that is all she wrote."
post_json_object = \
create_public_post(base_dir, nickname, domain, port, http_prefix,
- content,
- False,
- False, True,
- None, None,
- '', '', None,
+ content, save_to_file,
+ client_to_server, comments_enabled,
+ apply_dithering,
+ attach_image_filename, media_type,
+ image_description,
+ video_transcript, city,
test_in_reply_to, test_in_reply_to_atom_uri,
test_subject, test_schedule_post,
test_event_date, test_event_time,
@@ -7657,6 +7710,7 @@ def _test_can_replyto(base_dir: str) -> None:
save_to_file: bool = False
client_to_server: bool = False
comments_enabled: bool = True
+ test_apply_dithering: bool = False
attach_image_filename = None
media_type = None
image_description = None
@@ -7692,6 +7746,7 @@ def _test_can_replyto(base_dir: str) -> None:
create_public_post(base_dir, nickname, domain, port, http_prefix,
content, save_to_file,
client_to_server, comments_enabled,
+ test_apply_dithering,
attach_image_filename, media_type,
image_description, video_transcript, city,
test_in_reply_to, test_in_reply_to_atom_uri,
diff --git a/src/webapp_create_post.py b/src/webapp_create_post.py
index 442fe0da0..12e5f1681 100644
--- a/src/webapp_create_post.py
+++ b/src/webapp_create_post.py
@@ -647,6 +647,12 @@ def html_new_post(edit_post_params: {},
' \n'
+ # dithering
+ dither_filename = acct_dir(base_dir, nickname, domain) + '/.ditherImage'
+ apply_dithering = is_a_file(dither_filename)
+ new_post_image_section += \
+ edit_check_box(translate['Apply dithering to images.'],
+ 'ditherImage', apply_dithering)
media_creator_str = translate['Media creator']
new_post_image_section += \
edit_text_field(media_creator_str, 'mediaCreator', '', '')
diff --git a/translations/ar.json b/translations/ar.json
index f444fad05..7760c8da1 100644
--- a/translations/ar.json
+++ b/translations/ar.json
@@ -772,5 +772,6 @@
"Availability": "التوافر",
"Loops Instances": "حلقات التكرار",
"Disinformation Instances": "أمثلة على التضليل الإعلامي",
- "Allow this account to be added to lists": "السماح بإضافة هذا الحساب إلى القوائم"
+ "Allow this account to be added to lists": "السماح بإضافة هذا الحساب إلى القوائم",
+ "Apply dithering to images.": "طبّق تقنية التدرج النقطي (dithering) على الصور."
}
diff --git a/translations/bn.json b/translations/bn.json
index 7888fde48..d60dcb3f9 100644
--- a/translations/bn.json
+++ b/translations/bn.json
@@ -772,5 +772,6 @@
"Availability": "প্রাপ্যতা",
"Loops Instances": "লুপ ইনস্ট্যান্স",
"Disinformation Instances": "ভুল তথ্যের উদাহরণ",
- "Allow this account to be added to lists": "এই অ্যাকাউন্টটিকে তালিকায় যুক্ত করার অনুমতি দিন"
+ "Allow this account to be added to lists": "এই অ্যাকাউন্টটিকে তালিকায় যুক্ত করার অনুমতি দিন",
+ "Apply dithering to images.": "ছবিতে ডিদারিং প্রয়োগ করুন।"
}
diff --git a/translations/ca.json b/translations/ca.json
index 17f8272e3..52d64bcb2 100644
--- a/translations/ca.json
+++ b/translations/ca.json
@@ -772,5 +772,6 @@
"Availability": "Disponibilitat",
"Loops Instances": "Instàncies de bucles",
"Disinformation Instances": "Instàncies de desinformació",
- "Allow this account to be added to lists": "Permet que aquest compte s'afegeixi a les llistes"
+ "Allow this account to be added to lists": "Permet que aquest compte s'afegeixi a les llistes",
+ "Apply dithering to images.": "Aplica el dithering a les imatges."
}
diff --git a/translations/cy.json b/translations/cy.json
index 86390cfe0..fb8350ad8 100644
--- a/translations/cy.json
+++ b/translations/cy.json
@@ -772,5 +772,6 @@
"Availability": "Argaeledd",
"Loops Instances": "Achosion Dolenni",
"Disinformation Instances": "Achosion o Ddadwybodaeth",
- "Allow this account to be added to lists": "Caniatáu i'r cyfrif hwn gael ei ychwanegu at restrau"
+ "Allow this account to be added to lists": "Caniatáu i'r cyfrif hwn gael ei ychwanegu at restrau",
+ "Apply dithering to images.": "Cymhwyso dithering i ddelweddau."
}
diff --git a/translations/de.json b/translations/de.json
index b1e6e48c9..3f41b91de 100644
--- a/translations/de.json
+++ b/translations/de.json
@@ -772,5 +772,6 @@
"Availability": "Verfügbarkeit",
"Loops Instances": "Schleifeninstanzen",
"Disinformation Instances": "Fälle von Desinformation",
- "Allow this account to be added to lists": "Erlauben, dass dieses Konto zu Listen hinzugefügt wird"
+ "Allow this account to be added to lists": "Erlauben, dass dieses Konto zu Listen hinzugefügt wird",
+ "Apply dithering to images.": "Wenden Sie Dithering auf Bilder an."
}
diff --git a/translations/el.json b/translations/el.json
index 15fee87cc..4a470217a 100644
--- a/translations/el.json
+++ b/translations/el.json
@@ -772,5 +772,6 @@
"Availability": "Διαθεσιμότητα",
"Loops Instances": "Παρουσίες βρόχων",
"Disinformation Instances": "Περιπτώσεις παραπληροφόρησης",
- "Allow this account to be added to lists": "Να επιτρέπεται η προσθήκη αυτού του λογαριασμού σε λίστες"
+ "Allow this account to be added to lists": "Να επιτρέπεται η προσθήκη αυτού του λογαριασμού σε λίστες",
+ "Apply dithering to images.": "Εφαρμογή πρόσμειξης σε εικόνες."
}
diff --git a/translations/en.json b/translations/en.json
index 52d2fd512..33380071f 100644
--- a/translations/en.json
+++ b/translations/en.json
@@ -772,5 +772,6 @@
"Availability": "Availability",
"Loops Instances": "Loops Instances",
"Disinformation Instances": "Disinformation Instances",
- "Allow this account to be added to lists": "Allow this account to be added to lists"
+ "Allow this account to be added to lists": "Allow this account to be added to lists",
+ "Apply dithering to images.": "Apply dithering to images."
}
diff --git a/translations/es.json b/translations/es.json
index 4b15a992d..3262c0277 100644
--- a/translations/es.json
+++ b/translations/es.json
@@ -772,5 +772,6 @@
"Availability": "Disponibilidad",
"Loops Instances": "Instancias de bucles",
"Disinformation Instances": "Casos de desinformación",
- "Allow this account to be added to lists": "Permitir que esta cuenta se añada a listas"
+ "Allow this account to be added to lists": "Permitir que esta cuenta se añada a listas",
+ "Apply dithering to images.": "Aplica tramado a las imágenes."
}
diff --git a/translations/fa.json b/translations/fa.json
index 1d778deec..45d7b8f5b 100644
--- a/translations/fa.json
+++ b/translations/fa.json
@@ -772,5 +772,6 @@
"Availability": "در دسترس بودن",
"Loops Instances": "نمونههای حلقهها",
"Disinformation Instances": "موارد انتشار اطلاعات نادرست",
- "Allow this account to be added to lists": "اجازه دهید این حساب به لیستها اضافه شود"
+ "Allow this account to be added to lists": "اجازه دهید این حساب به لیستها اضافه شود",
+ "Apply dithering to images.": "اعمال لرزش (dithering) روی تصاویر"
}
diff --git a/translations/fi.json b/translations/fi.json
index 7598dbdfc..f601d7ebb 100644
--- a/translations/fi.json
+++ b/translations/fi.json
@@ -772,5 +772,6 @@
"Availability": "Saatavuus",
"Loops Instances": "Silmukat-instanssit",
"Disinformation Instances": "Disinformaatiotapaukset",
- "Allow this account to be added to lists": "Salli tämän tilin lisääminen listoihin"
+ "Allow this account to be added to lists": "Salli tämän tilin lisääminen listoihin",
+ "Apply dithering to images.": "Käytä kuviin rasterointia."
}
diff --git a/translations/fr.json b/translations/fr.json
index 45de77352..5b377627c 100644
--- a/translations/fr.json
+++ b/translations/fr.json
@@ -772,5 +772,6 @@
"Availability": "Disponibilité",
"Loops Instances": "Instances de boucles",
"Disinformation Instances": "Cas de désinformation",
- "Allow this account to be added to lists": "Autoriser l'ajout de ce compte à des listes"
+ "Allow this account to be added to lists": "Autoriser l'ajout de ce compte à des listes",
+ "Apply dithering to images.": "Appliquez le tramage aux images."
}
diff --git a/translations/ga.json b/translations/ga.json
index 91011c7d8..e445d413c 100644
--- a/translations/ga.json
+++ b/translations/ga.json
@@ -772,5 +772,6 @@
"Availability": "Infhaighteacht",
"Loops Instances": "Cásanna Lúb",
"Disinformation Instances": "Cásanna Mífhaisnéise",
- "Allow this account to be added to lists": "Ceadaigh an cuntas seo a chur le liostaí"
+ "Allow this account to be added to lists": "Ceadaigh an cuntas seo a chur le liostaí",
+ "Apply dithering to images.": "Cuir díodrú i bhfeidhm ar íomhánna."
}
diff --git a/translations/he.json b/translations/he.json
index 6e1c6fd42..351b32084 100644
--- a/translations/he.json
+++ b/translations/he.json
@@ -772,5 +772,6 @@
"Availability": "זְמִינוּת",
"Loops Instances": "מופעי לולאות",
"Disinformation Instances": "מקרים של דיסאינפורמציה",
- "Allow this account to be added to lists": "אפשר הוספת חשבון זה לרשימות"
+ "Allow this account to be added to lists": "אפשר הוספת חשבון זה לרשימות",
+ "Apply dithering to images.": "החלת דיטרינג על תמונות."
}
diff --git a/translations/hi.json b/translations/hi.json
index 782f393e0..a2e0fbdba 100644
--- a/translations/hi.json
+++ b/translations/hi.json
@@ -772,5 +772,6 @@
"Availability": "उपलब्धता",
"Loops Instances": "लूप इंस्टेंस",
"Disinformation Instances": "गलत सूचना के उदाहरण",
- "Allow this account to be added to lists": "इस अकाउंट को लिस्ट में जोड़ने की अनुमति दें"
+ "Allow this account to be added to lists": "इस अकाउंट को लिस्ट में जोड़ने की अनुमति दें",
+ "Apply dithering to images.": "इमेज पर डिथरिंग लागू करें।"
}
diff --git a/translations/it.json b/translations/it.json
index 97bad5b99..07af8ec7f 100644
--- a/translations/it.json
+++ b/translations/it.json
@@ -772,5 +772,6 @@
"Availability": "Disponibilità",
"Loops Instances": "Istanze di cicli",
"Disinformation Instances": "Esempi di disinformazione",
- "Allow this account to be added to lists": "Consenti l'aggiunta di questo account agli elenchi"
+ "Allow this account to be added to lists": "Consenti l'aggiunta di questo account agli elenchi",
+ "Apply dithering to images.": "Applica il dithering alle immagini."
}
diff --git a/translations/ja.json b/translations/ja.json
index bd360fc06..89b365ef8 100644
--- a/translations/ja.json
+++ b/translations/ja.json
@@ -772,5 +772,6 @@
"Availability": "可用性",
"Loops Instances": "ループインスタンス",
"Disinformation Instances": "偽情報事例",
- "Allow this account to be added to lists": "このアカウントをリストに追加できるようにする"
+ "Allow this account to be added to lists": "このアカウントをリストに追加できるようにする",
+ "Apply dithering to images.": "画像にディザリングを適用します。"
}
diff --git a/translations/ko.json b/translations/ko.json
index 5cb2102a2..f3de4fa16 100644
--- a/translations/ko.json
+++ b/translations/ko.json
@@ -772,5 +772,6 @@
"Availability": "유효성",
"Loops Instances": "루프 인스턴스",
"Disinformation Instances": "허위 정보 사례",
- "Allow this account to be added to lists": "이 계정을 목록에 추가할 수 있도록 허용"
+ "Allow this account to be added to lists": "이 계정을 목록에 추가할 수 있도록 허용",
+ "Apply dithering to images.": "이미지에 디더링을 적용합니다."
}
diff --git a/translations/ku.json b/translations/ku.json
index 5de9c2122..d49847329 100644
--- a/translations/ku.json
+++ b/translations/ku.json
@@ -772,5 +772,6 @@
"Availability": "Berdestbûnî",
"Loops Instances": "Nimûneyên Loopan",
"Disinformation Instances": "Nimûneyên Dezînformasyonê",
- "Allow this account to be added to lists": "Destûrê bide ku ev hesab li navnîşan were zêdekirin"
+ "Allow this account to be added to lists": "Destûrê bide ku ev hesab li navnîşan were zêdekirin",
+ "Apply dithering to images.": "Ditheringê li ser wêneyan bicîh bîne."
}
diff --git a/translations/nl.json b/translations/nl.json
index cc6604c61..23e914934 100644
--- a/translations/nl.json
+++ b/translations/nl.json
@@ -772,5 +772,6 @@
"Availability": "Beschikbaarheid",
"Loops Instances": "Lusinstanties",
"Disinformation Instances": "Voorbeelden van desinformatie",
- "Allow this account to be added to lists": "Toestaan dat dit account aan lijsten wordt toegevoegd"
+ "Allow this account to be added to lists": "Toestaan dat dit account aan lijsten wordt toegevoegd",
+ "Apply dithering to images.": "Pas dithering toe op afbeeldingen."
}
diff --git a/translations/oc.json b/translations/oc.json
index 491f5337a..a4ccee324 100644
--- a/translations/oc.json
+++ b/translations/oc.json
@@ -768,5 +768,6 @@
"Availability": "Disponibilitat",
"Loops Instances": "Instàncias de bucles",
"Disinformation Instances": "Instàncias de desinformacion",
- "Allow this account to be added to lists": "Autorizar aqueste compte a èsser apondut a las listas"
+ "Allow this account to be added to lists": "Autorizar aqueste compte a èsser apondut a las listas",
+ "Apply dithering to images.": "Aplicar lo tremolament a d'imatges."
}
diff --git a/translations/pl.json b/translations/pl.json
index e6afad162..692105dd2 100644
--- a/translations/pl.json
+++ b/translations/pl.json
@@ -772,5 +772,6 @@
"Availability": "Dostępność",
"Loops Instances": "Instancje pętli",
"Disinformation Instances": "Przypadki dezinformacji",
- "Allow this account to be added to lists": "Zezwól na dodawanie tego konta do list"
+ "Allow this account to be added to lists": "Zezwól na dodawanie tego konta do list",
+ "Apply dithering to images.": "Zastosuj dithering do obrazów."
}
diff --git a/translations/pt.json b/translations/pt.json
index 138ef0333..1735eced2 100644
--- a/translations/pt.json
+++ b/translations/pt.json
@@ -772,5 +772,6 @@
"Availability": "Disponibilidade",
"Loops Instances": "Instâncias de Loops",
"Disinformation Instances": "Casos de desinformação",
- "Allow this account to be added to lists": "Permitir que esta conta seja adicionada às listas"
+ "Allow this account to be added to lists": "Permitir que esta conta seja adicionada às listas",
+ "Apply dithering to images.": "Aplicar dithering às imagens."
}
diff --git a/translations/ru.json b/translations/ru.json
index 84cef6094..d6a3c3243 100644
--- a/translations/ru.json
+++ b/translations/ru.json
@@ -772,5 +772,6 @@
"Availability": "Доступность",
"Loops Instances": "Экземпляры циклов",
"Disinformation Instances": "Случаи дезинформации",
- "Allow this account to be added to lists": "Разрешить добавление этого аккаунта в списки"
+ "Allow this account to be added to lists": "Разрешить добавление этого аккаунта в списки",
+ "Apply dithering to images.": "Примените дизеринг к изображениям."
}
diff --git a/translations/sw.json b/translations/sw.json
index 6d9431c57..9928f77dc 100644
--- a/translations/sw.json
+++ b/translations/sw.json
@@ -772,5 +772,6 @@
"Availability": "Upatikanaji",
"Loops Instances": "Matukio ya Mizunguko",
"Disinformation Instances": "Matukio ya Taarifa Potofu",
- "Allow this account to be added to lists": "Ruhusu akaunti hii iongezwe kwenye orodha"
+ "Allow this account to be added to lists": "Ruhusu akaunti hii iongezwe kwenye orodha",
+ "Apply dithering to images.": "Weka upau wa kuchorea kwenye picha."
}
diff --git a/translations/tr.json b/translations/tr.json
index bb5342f9c..b66f0c9b9 100644
--- a/translations/tr.json
+++ b/translations/tr.json
@@ -772,5 +772,6 @@
"Availability": "Müsaitlik",
"Loops Instances": "Döngü Örnekleri",
"Disinformation Instances": "Dezenformasyon Vakaları",
- "Allow this account to be added to lists": "Bu hesabın listelere eklenmesine izin ver"
+ "Allow this account to be added to lists": "Bu hesabın listelere eklenmesine izin ver",
+ "Apply dithering to images.": "Görüntülere dithering uygulayın."
}
diff --git a/translations/uk.json b/translations/uk.json
index 08de33c37..b547aad3c 100644
--- a/translations/uk.json
+++ b/translations/uk.json
@@ -772,5 +772,6 @@
"Availability": "Наявність",
"Loops Instances": "Екземпляри циклів",
"Disinformation Instances": "Випадки дезінформації",
- "Allow this account to be added to lists": "Дозволити додавання цього облікового запису до списків"
+ "Allow this account to be added to lists": "Дозволити додавання цього облікового запису до списків",
+ "Apply dithering to images.": "Застосуйте дизеринг до зображень."
}
diff --git a/translations/yi.json b/translations/yi.json
index 0838f7143..c8da171ad 100644
--- a/translations/yi.json
+++ b/translations/yi.json
@@ -772,5 +772,6 @@
"Availability": "פאַראַנען",
"Loops Instances": "לופּס אינסטאַנסן",
"Disinformation Instances": "דיסאינפארמאציע אינסטאַנצן",
- "Allow this account to be added to lists": "ערלויבן דעם חשבון צו ווערן צוגעגעבן צו ליסטעס"
+ "Allow this account to be added to lists": "ערלויבן דעם חשבון צו ווערן צוגעגעבן צו ליסטעס",
+ "Apply dithering to images.": "צולייגן דיטערינג צו בילדער."
}
diff --git a/translations/zh.json b/translations/zh.json
index ab4e0ad41..a351c8b94 100644
--- a/translations/zh.json
+++ b/translations/zh.json
@@ -772,5 +772,6 @@
"Availability": "可用性",
"Loops Instances": "循环实例",
"Disinformation Instances": "虚假信息实例",
- "Allow this account to be added to lists": "允许将此帐户添加到列表中"
+ "Allow this account to be added to lists": "允许将此帐户添加到列表中",
+ "Apply dithering to images.": "对图像应用抖动处理。"
}