dataclass implementation
This commit is contained in:
parent
1f199c36f9
commit
92e9e63e53
87
src/feed.py
87
src/feed.py
@ -1,7 +1,7 @@
|
||||
|
||||
import json
|
||||
import logging
|
||||
from dataclasses import dataclass
|
||||
from dataclasses import dataclass, field
|
||||
from datetime import datetime
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
@ -22,17 +22,29 @@ log = logging.getLogger(__name__)
|
||||
dumps = lambda _dict: json.dumps(_dict, indent=8)
|
||||
|
||||
|
||||
@dataclass(slots=True)
|
||||
class RSSItem:
|
||||
def __init__(self, title, link, description, pub_date, guid, image_url):
|
||||
self.title = title
|
||||
self.link = link
|
||||
self.description = description
|
||||
self.pub_date = pub_date
|
||||
self.guid = guid
|
||||
self.image_url = image_url
|
||||
|
||||
def __str__(self):
|
||||
return self.title
|
||||
guid: str
|
||||
link: str
|
||||
title: str
|
||||
description: str
|
||||
pub_date: datetime
|
||||
image_url: str
|
||||
|
||||
@classmethod
|
||||
def from_parsed_entry(cls, entry):
|
||||
guid = entry.get('id', None) or entry.get("guid", None)
|
||||
link = entry.get('link', None)
|
||||
title = entry.get('title', None)
|
||||
description = entry.get('description', None)
|
||||
|
||||
pub_date = entry.get('published_parsed', None)
|
||||
pub_date = datetime(*pub_date[0:-2] if pub_date else None)
|
||||
|
||||
image_url = entry.get("media_content", [{}])[0].get("url")
|
||||
|
||||
return cls(guid, link, title, description, pub_date, image_url)
|
||||
|
||||
def create_mutated_copy(self, mutators):
|
||||
pass
|
||||
@ -112,17 +124,16 @@ class RSSItem:
|
||||
image_content = image_element.get("content")
|
||||
return image_content if validators.url(image_content) else None
|
||||
|
||||
import json
|
||||
@dataclass(slots=True)
|
||||
class RSSFeed:
|
||||
def __init__(self, title, link, description, language='en-gb', pub_date=None, last_build_date=None, image_href=None):
|
||||
self.title = title
|
||||
self.link = link
|
||||
self.description = description
|
||||
self.language = language
|
||||
self.pub_date = pub_date
|
||||
self.last_build_date = last_build_date
|
||||
self.image_href = image_href
|
||||
self.items = []
|
||||
|
||||
title: str
|
||||
description: str
|
||||
link: str
|
||||
lang: str
|
||||
last_build_date = datetime
|
||||
image_href: str
|
||||
items: list[RSSItem] = field(default_factory=list)
|
||||
|
||||
def add_item(self, item: RSSItem):
|
||||
if not isinstance(item, RSSItem):
|
||||
@ -130,36 +141,28 @@ class RSSFeed:
|
||||
|
||||
self.items.append(item)
|
||||
|
||||
def __str__(self):
|
||||
return self.guid
|
||||
|
||||
@classmethod
|
||||
def from_parsed_feed(cls, parsed_feed):
|
||||
title = parsed_feed.feed.get('title', 'No title')
|
||||
link = parsed_feed.feed.get('link', 'No link')
|
||||
description = parsed_feed.feed.get('description', 'No description')
|
||||
language = parsed_feed.feed.get('language', 'en-gb')
|
||||
pub_date = parsed_feed.feed.get('published', None)
|
||||
last_build_date = parsed_feed.feed.get('updated', None)
|
||||
image_href = parsed_feed.get("image", {}).get("href")
|
||||
def from_parsed_feed(cls, pf: FeedParserDict):
|
||||
title = pf.feed.get('title', None)
|
||||
description = pf.feed.get('description', None)
|
||||
link = pf.feed.get('link', None)
|
||||
language = pf.feed.get('language', None)
|
||||
|
||||
feed = cls(title, link, description, language, pub_date, last_build_date, image_href)
|
||||
last_build_date = pf.feed.get('updated_parsed', None)
|
||||
last_build_date = datetime(*last_build_date[0:-2] if last_build_date else None)
|
||||
|
||||
for entry in parsed_feed.entries:
|
||||
item_title = entry.get('title', 'No title')
|
||||
item_link = entry.get('link', 'No link')
|
||||
item_description = entry.get('description', 'No description')
|
||||
item_pub_data = entry.get('published_parsed', None)
|
||||
item_guid = entry.get('id', None) or entry.get("guid", None)
|
||||
item_image_url = entry.get("media_content", [{}])[0].get("url")
|
||||
image_href = pf.get("image", {}).get("href")
|
||||
|
||||
# item_published = datetime(*entry.published_parsed[0:-2]) if item_pub_data else None
|
||||
feed = cls(title, description, link, language, last_build_date, image_href)
|
||||
|
||||
item = RSSItem(item_title, item_link, item_description, item_pub_data, item_guid, item_image_url)
|
||||
log.debug(feed.items)
|
||||
log.debug(type(feed.items))
|
||||
|
||||
for entry in pf.entries:
|
||||
item = RSSItem.from_parsed_entry(entry)
|
||||
feed.add_item(item)
|
||||
|
||||
feed.items.reverse()
|
||||
|
||||
return feed
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user