mutator and embed fix

This commit is contained in:
Corban-Lee Jones 2024-07-09 22:39:57 +01:00
parent 92e9e63e53
commit d6e6043194
2 changed files with 32 additions and 27 deletions

View File

@ -132,7 +132,7 @@ class TaskCog(commands.Cog):
successful_track = await self.mark_tracked_item(api, sub, item, channel.id, blocked) successful_track = await self.mark_tracked_item(api, sub, item, channel.id, blocked)
if successful_track and not blocked: if successful_track and not blocked:
await channel.send(embed=await item.to_embed(sub, feed, api.session)) await channel.send(embed=await mutated_item.to_embed(sub, feed, api.session))
def filter_item(self, _filter: dict, item: RSSItem) -> bool: def filter_item(self, _filter: dict, item: RSSItem) -> bool:
""" """

View File

@ -1,7 +1,8 @@
import json import json
import copy
import logging import logging
from dataclasses import dataclass, field from dataclasses import dataclass
from datetime import datetime from datetime import datetime
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
@ -47,25 +48,29 @@ class RSSItem:
return cls(guid, link, title, description, pub_date, image_url) return cls(guid, link, title, description, pub_date, image_url)
def create_mutated_copy(self, mutators): def create_mutated_copy(self, mutators):
pass item_copy = copy.copy(self)
def apply_mutation(item, attr: str, mutator: dict[str, str]):
val = mutator["value"]
try:
mutator = mutator_registry.get_mutator(val)
except ValueError as err:
log.error(err)
setattr(item, attr, mutator.mutate(getattr(item, attr)))
for field in ("title", "description"):
for mutator in mutators[field]:
apply_mutation(item_copy, field, mutator)
return item_copy
async def to_embed(self, sub, feed, session): async def to_embed(self, sub, feed, session):
# Replace HTML with Markdown, and shorten text.
title = shorten(markdownify(self.title, strip=["img", "a"]), 256) title = shorten(markdownify(self.title, strip=["img", "a"]), 256)
desc = shorten(markdownify(self.description, strip=["img"]), 4096) desc = shorten(markdownify(self.description, strip=["img"]), 4096)
author = shorten(feed.title, 256)
author = ""
author_url = ""
icon_url = ""
thumb_url = ""
# Replace HTML with Markdown, and shorten text.
# author = shorten(self.source.name, 256)
# validate urls
# author_url = self.source.url if validators.url(self.source.url) else None
# icon_url = self.source.icon_url if validators.url(self.source.icon_url) else None
# Combined length validation # Combined length validation
# Can't exceed combined 6000 characters, [400 Bad Request] if failed. # Can't exceed combined 6000 characters, [400 Bad Request] if failed.
@ -76,20 +81,17 @@ class RSSItem:
embed = Embed( embed = Embed(
title=title, title=title,
description=desc, description=desc,
# timestamp=self.published, timestamp=self.pub_date,
url=self.link if validators.url(self.link) else None, url=self.link if validators.url(self.link) else None,
colour=Colour.from_str("#" + sub.embed_colour) colour=Colour.from_str("#" + sub.embed_colour)
) )
log.debug("has image url without search: '%s'", self.image_url)
if sub.article_fetch_image: if sub.article_fetch_image:
embed.set_image(url=self.image_url or await self.get_thumbnail_url(session)) embed.set_image(url=self.image_url or await self.get_thumbnail_url(session))
embed.set_thumbnail(url=feed.image_href if validators.url(feed.image_href) else None) embed.set_thumbnail(url=feed.image_href if validators.url(feed.image_href) else None)
# embed.set_image(url=thumb_url) embed.set_author(name=author, url=feed.link)
# embed.set_author(url=author_url, name=author) embed.set_footer(text=sub.name)
# embed.set_footer(text=self.author)
return embed return embed
@ -107,7 +109,7 @@ class RSSItem:
The thumbnail URL, or None if not found. The thumbnail URL, or None if not found.
""" """
# log.debug("Fetching thumbnail for article: %s", self) log.debug("Fetching thumbnail for article: %s", self.guid)
try: try:
async with session.get(self.link, timeout=15) as response: async with session.get(self.link, timeout=15) as response:
@ -131,9 +133,12 @@ class RSSFeed:
description: str description: str
link: str link: str
lang: str lang: str
last_build_date = datetime last_build_date: datetime
image_href: str image_href: str
items: list[RSSItem] = field(default_factory=list) items: list[RSSItem] = None
def __post_init__(self):
self.items = []
def add_item(self, item: RSSItem): def add_item(self, item: RSSItem):
if not isinstance(item, RSSItem): if not isinstance(item, RSSItem):
@ -151,7 +156,7 @@ class RSSFeed:
last_build_date = pf.feed.get('updated_parsed', None) last_build_date = pf.feed.get('updated_parsed', None)
last_build_date = datetime(*last_build_date[0:-2] if last_build_date else None) last_build_date = datetime(*last_build_date[0:-2] if last_build_date else None)
image_href = pf.get("image", {}).get("href") image_href = pf.feed.get("image", {}).get("href")
feed = cls(title, description, link, language, last_build_date, image_href) feed = cls(title, description, link, language, last_build_date, image_href)
@ -209,7 +214,7 @@ class Subscription(DjangoDataModel):
item["creation_datetime"] = datetime.strptime(item["creation_datetime"], "%Y-%m-%dT%H:%M:%S.%f%z") item["creation_datetime"] = datetime.strptime(item["creation_datetime"], "%Y-%m-%dT%H:%M:%S.%f%z")
item["mutators"] = { item["mutators"] = {
"title": item.pop("article_title_mutators"), "title": item.pop("article_title_mutators"),
"desc": item.pop("article_desc_mutators") "description": item.pop("article_desc_mutators")
} }
return item return item