From 045f5be79cf0e0ebda2d911d29edaeb40ab31984 Mon Sep 17 00:00:00 2001 From: octospacc Date: Thu, 30 Jun 2022 23:29:44 +0200 Subject: [PATCH] Support for sharing new posts on Mastodon --- Locale/en.json | 3 +- Locale/it.json | 3 +- Source/Build.py | 25 ++++++++------- Source/Modules/ActivityPub.py | 60 +++++++++++++++++++++++++++++++++-- Source/Modules/Feed.py | 4 +-- 5 files changed, 77 insertions(+), 18 deletions(-) diff --git a/Locale/en.json b/Locale/en.json index 7eddec7..e1bd395 100644 --- a/Locale/en.json +++ b/Locale/en.json @@ -1,5 +1,6 @@ { "CreatedOn": "Created on", "EditedOn": "Edited on", - "Categories": "Categories" + "Categories": "Categories", + "ReadFullPost": "Read the full post" } diff --git a/Locale/it.json b/Locale/it.json index 51388ce..5225153 100644 --- a/Locale/it.json +++ b/Locale/it.json @@ -1,5 +1,6 @@ { "CreatedOn": "Creato in data", "EditedOn": "Modificato in data", - "Categories": "Categorie" + "Categories": "Categorie", + "ReadFullPost": "Leggi il post intero" } diff --git a/Source/Build.py b/Source/Build.py index 850ec21..4601cef 100755 --- a/Source/Build.py +++ b/Source/Build.py @@ -441,8 +441,11 @@ def SetSorting(Sorting): def Main(Args, FeedEntries): SiteName = Args.SiteName if Args.SiteName else '' SiteTagline = Args.SiteTagline if Args.SiteTagline else '' - SiteDomain = Args.SiteDomain if Args.SiteDomain else '' + SiteDomain = Args.SiteDomain.rstrip('/') if Args.SiteDomain else '' SiteLang = Args.SiteLang if Args.SiteLang else 'en' + Locale = LoadLocale(SiteLang) + MastodonURL = Args.MastodonURL if Args.MastodonURL else '' + MastodonToken = Args.MastodonToken if Args.MastodonToken else '' ResetPublic() if os.path.isdir('Pages'): @@ -465,7 +468,7 @@ def Main(Args, FeedEntries): SiteRoot=Args.SiteRoot if Args.SiteRoot else '/', FolderRoots=literal_eval(Args.FolderRoots) if Args.FolderRoots else {}, Reserved=SetReserved(literal_eval(Args.ReservedPaths) if Args.ReservedPaths else {}), - Locale=LoadLocale(SiteLang), + Locale=Locale, Minify=Args.Minify if Args.Minify else 'None', Sorting=SetSorting(literal_eval(Args.ContextParts) if Args.ContextParts else {}), MarkdownExts=literal_eval(Args.MarkdownExts) if Args.MarkdownExts else ['attr_list']) @@ -483,16 +486,14 @@ def Main(Args, FeedEntries): if Args.GemtextOut: GemtextCompileList(Pages) - """ - MastodonSession = MastodonGetSession( - Args.MastodonURL if Args.MastodonURL else '', - Args.MastodonToken if Args.MastodonToken else '') - MastodonPosts = MastodonGetPostsFromUserID( - MastodonSession, - MastodonGetMyID(MastodonSession)) - for i in MastodonPosts: - print(i['uri'], i['content']) - """ + if MastodonURL and MastodonToken and SiteDomain: + MastodonShare( + MastodonURL, + MastodonToken, + Pages, + SiteDomain, + SiteLang, + Locale) DelTmp() os.system("cp -R Assets/* public/") diff --git a/Source/Modules/ActivityPub.py b/Source/Modules/ActivityPub.py index d0a9709..a663428 100644 --- a/Source/Modules/ActivityPub.py +++ b/Source/Modules/ActivityPub.py @@ -7,6 +7,7 @@ | Copyright (C) 2022, OctoSpacc | | ================================= """ +from Libs.bs4 import BeautifulSoup from Libs.mastodon import Mastodon from Modules.Utils import * @@ -23,5 +24,60 @@ def MastodonGetPostsFromUserID(Session, UserID): UserID, exclude_replies=True) -def MastodonDoPost(Session): - pass # mastodon.toot('Tooting from python using #mastodonpy !') +def MastodonDoPost(Session, Text, Lang=None, Visibility='public'): + if Text: + Session.status_post( + Text, + language=Lang, + visibility=Visibility) + +# TODO: Set a limit/cooldown on how many new posts at a time can be posted, or ignore posts older than date X.. otherwise if someone starts using this after having written 100 blog posts, bad things will happen +def MastodonShare(MastodonURL, MastodonToken, Pages, SiteDomain, SiteLang, Locale): + #return None + Session = MastodonGetSession(MastodonURL, MastodonToken) + Posts = MastodonGetPostsFromUserID( + Session, + MastodonGetMyID(Session)) + for i,e in enumerate(Posts): + Parse = BeautifulSoup(e['content'], 'html.parser') + Posts[i] = { + 'URL': e['uri'], + #e['content'], + 'LastLink': Parse.find_all('a')[-1]['href'] if Parse.a else None} + #print(i['uri'], i['content']) + #print(Posts) + Pages.sort() + for File, Content, Titles, Meta, HTMLContent, Description, Image in Pages: + if Meta['Type'] == 'Post': + Desc = '' + Parse = BeautifulSoup(HTMLContent, 'html.parser') + Paragraphs = Parse.p.get_text().split('\n') + Read = '...' + Locale['ReadFullPost'] + ':\n' + URL = '{}/{}.html'.format(SiteDomain, StripExt(File)) + #Desc = '...' + Read + ':\n' + URL + #DescLen = len(Read) + 30 + #if not Paragraphs[0]: + # Paragraphs.pop(0) + for p in Paragraphs: + #while len(Description) <= 450: + #if p and len(Description+p)+2 <= 450: + if p and len(Read+Desc+p)+25 < 500: + Desc += p + '\n\n' + else: + if Desc: + break + else: + Desc = p[:500-25-5-len(Read)] + '...' + #if len(Description) > 450: + # Description = Description[:450] + '...' + DoPost = True + for p in Posts: + if p['LastLink'] == URL: + DoPost = False + break + if DoPost: + MastodonDoPost( + Session, + Desc + Read + URL, + SiteLang) + #BodyDescription = Parse.p.get_text()[:150].replace('\n', ' ').replace('"', "'") + '...' diff --git a/Source/Modules/Feed.py b/Source/Modules/Feed.py index 6391415..989a3b1 100644 --- a/Source/Modules/Feed.py +++ b/Source/Modules/Feed.py @@ -20,7 +20,7 @@ def MakeFeed(Pages, SiteName, SiteTagline, SiteDomain, MaxEntries, Lang, Minify= Feed.link(href=Link, rel='alternate') Feed.description(SiteTagline if SiteTagline else ' ') if SiteDomain: - Feed.logo(SiteDomain.rstrip('/') + '/favicon.png') + Feed.logo(SiteDomain + '/favicon.png') Feed.language(Lang) DoPages = [] @@ -35,7 +35,7 @@ def MakeFeed(Pages, SiteName, SiteTagline, SiteDomain, MaxEntries, Lang, Minify= Entry = Feed.add_entry() File = '{}.html'.format(StripExt(File)) Content = ReadFile('public/'+File) - Link = SiteDomain+'/'+File if SiteDomain else ' ' + Link = SiteDomain + '/' + File if SiteDomain else ' ' CreatedOn = GetFullDate(Meta['CreatedOn']) EditedOn = GetFullDate(Meta['EditedOn'])