subscribe now detect embeded RSS feeds

This commit is contained in:
Lionel Dricot 2022-02-18 14:11:09 +01:00
parent f0623c1b93
commit cd5bba7b7b
1 changed files with 58 additions and 6 deletions

View File

@ -285,7 +285,9 @@ class AbstractRenderer():
self.links = None self.links = None
self.title = None self.title = None
self.validity = True self.validity = True
def get_subscribe_links(self):
return [[self.url,self.get_mime(),self.get_title()]]
def is_valid(self): def is_valid(self):
return self.validity return self.validity
def get_links(self): def get_links(self):
@ -318,6 +320,8 @@ class AbstractRenderer():
# Gemtext Rendering Engine # Gemtext Rendering Engine
class GemtextRenderer(AbstractRenderer): class GemtextRenderer(AbstractRenderer):
def get_mime(self):
return "text/gemini"
def get_title(self): def get_title(self):
if self.title: if self.title:
return self.title return self.title
@ -413,6 +417,8 @@ class GemtextRenderer(AbstractRenderer):
return rendered_text, links return rendered_text, links
class GopherRenderer(AbstractRenderer): class GopherRenderer(AbstractRenderer):
def get_mime(self):
return "text/gopher"
def get_title(self): def get_title(self):
return "Gopher - No Title" return "Gopher - No Title"
@ -473,6 +479,8 @@ class GopherRenderer(AbstractRenderer):
class FolderRenderer(GemtextRenderer): class FolderRenderer(GemtextRenderer):
def get_mime(self):
return "Directory"
def prepare(self,body,mode=None): def prepare(self,body,mode=None):
def get_first_line(l): def get_first_line(l):
path = os.path.join(listdir,l+".gmi") path = os.path.join(listdir,l+".gmi")
@ -536,6 +544,8 @@ class FolderRenderer(GemtextRenderer):
return body return body
class FeedRenderer(GemtextRenderer): class FeedRenderer(GemtextRenderer):
def get_mime(self):
return "application/rss+xml"
def is_valid(self): def is_valid(self):
if _DO_FEED: if _DO_FEED:
parsed = feedparser.parse(self.body) parsed = feedparser.parse(self.body)
@ -602,6 +612,8 @@ class FeedRenderer(GemtextRenderer):
return page return page
class ImageRenderer(AbstractRenderer): class ImageRenderer(AbstractRenderer):
def get_mime(self):
return "image/*"
def is_valid(self): def is_valid(self):
if _RENDER_IMAGE: if _RENDER_IMAGE:
return True return True
@ -629,6 +641,18 @@ class ImageRenderer(AbstractRenderer):
return ansi_img, [] return ansi_img, []
class HtmlRenderer(AbstractRenderer): class HtmlRenderer(AbstractRenderer):
def get_mime(self):
return "text/html"
def get_subscribe_links(self):
subs = [[self.url,self.get_mime(),self.get_title()]]
soup = BeautifulSoup(self.body, 'html.parser')
links = soup.find_all("link",rel="alternate",recursive=True)
for l in links:
ty = l.get("type")
if "rss" in ty or "atom" in ty or "feed" in ty:
subs.append([l.get("href"),ty,l.get("title")])
return subs
def get_title(self): def get_title(self):
if self.title: if self.title:
return self.title return self.title
@ -1074,6 +1098,14 @@ class GeminiItem():
else: else:
return self.links[nb-1] return self.links[nb-1]
def get_subscribe_links(self):
if not self.renderer:
self._set_renderer()
if self.renderer:
return self.renderer.get_subscribe_links()
else:
return []
# Red title above rendered content # Red title above rendered content
def _make_terminal_title(self): def _make_terminal_title(self):
title = self.get_capsule_title() title = self.get_capsule_title()
@ -1264,6 +1296,8 @@ class GeminiItem():
def full_title(self): def full_title(self):
if self.renderer: if self.renderer:
title = self.renderer.get_title() title = self.renderer.get_title()
elif self.name:
title = self.name
else: else:
# we take the last component of url as title # we take the last component of url as title
if self.local: if self.local:
@ -2796,12 +2830,30 @@ If no argument given, URL is added to Bookmarks."""
If a new link is found in the page during a --sync, the new link is automatically If a new link is found in the page during a --sync, the new link is automatically
fetched and added to your next tour. fetched and added to your next tour.
To unsubscribe, remove the page from the "subscribed" list.""" To unsubscribe, remove the page from the "subscribed" list."""
list_path = self.get_list("subscribed") subs = self.gi.get_subscribe_links()
added = self.list_add_line("subscribed",verbose=False) if len(subs) > 1:
if added : stri = "Multiple feeds have been found :\n\n"
print("Subscribed to %s" %self.gi.url) counter = 0
for l in subs:
stri += "[%s] %s [%s]\n"%(counter+1,l[0],l[1])
counter += 1
stri += "\n\n"
stri += "Which feed do you want to subsribe ? > "
ans = input(stri)
if ans.isdigit() and 0 < int(ans) <= len(subs):
sublink,mime,title = subs[int(ans)-1]
else:
sublink,title = None,None
else: else:
print("You are already subscribed to %s"%self.gi.url) sublink,mime,title = subs[0]
if sublink:
gi = GeminiItem(sublink,name=title)
list_path = self.get_list("subscribed")
added = self.list_add_line("subscribed",gi=gi,verbose=False)
if added :
print("Subscribed to %s" %sublink)
else:
print("You are already subscribed to %s"%sublink)
def do_bookmarks(self, line): def do_bookmarks(self, line):
"""Show or access the bookmarks menu. """Show or access the bookmarks menu.