This repository has been archived on 2025-07-02. You can view files and clone it, but cannot push or open issues or pull requests.
Files
end-of-year/src/generator.py
zopiya e2162321fd 功能:细节修改
- 一言字数
 - web 模式缓存
2023-11-06 14:20:49 +08:00

120 lines
3.6 KiB
Python

from functools import lru_cache
from loguru import logger
import models
import scraper
@lru_cache(maxsize=None)
class Generator:
def __init__(self, rss):
"""
初始化Generator类
:param rss: RSS链接
"""
try:
self._my_blog = scraper.Blog(rss)
logger.debug(self._my_blog)
for i, post in enumerate(self._my_blog.post_lists, 1):
logger.info(f"Post #{i}:")
logger.info(post)
except Exception as e:
logger.error(f"Generator 无法创建 Blog 对象: {str(e)}")
def blog(self):
"""
获取博客信息
:return: Blog字典
"""
return models.Blog(
name=self._my_blog.title,
link=self._my_blog.link,
life=self._my_blog.life,
article_count=self._my_blog.article_count,
article_word_count=self._my_blog.article_word_count,
top_post_keys=self._my_blog.keys,
category=self._my_blog.category
).to_dict()
def special_post(self):
"""
获取特殊日期的文章
:return: Post字典
"""
max_item_special_date = self._get_post_with_max("special_date_score")
return models.Post(
title=max_item_special_date.title,
content=max_item_special_date.content,
keys=max_item_special_date.keys,
time=max_item_special_date.time,
date=max_item_special_date.date
).to_dict()
def sentiment_post(self):
"""
获取情感最优文章
:return: Post字典
"""
max_item_sentiment = self._get_post_with_max("sentiment_score")
return models.Post(
title=max_item_sentiment.title,
content=max_item_sentiment.content,
keys=max_item_sentiment.keys,
time=max_item_sentiment.time,
date=max_item_sentiment.date
).to_dict()
def long_post(self):
"""
获取最长文章数据
:return: Post字典
"""
max_item_long = self._get_post_with_max("word_count")
return models.Post(
title=max_item_long.title,
content=max_item_long.content,
keys=max_item_long.keys,
time=max_item_long.time,
date=max_item_long.date,
).to_dict()
def short_post(self):
"""
获取最短文章数据
:return: Post字典
"""
max_item_short = self._get_post_with_min("word_count")
return models.Post(
title=max_item_short.title,
content=max_item_short.content,
keys=max_item_short.keys,
time=max_item_short.time,
date=max_item_short.date,
).to_dict()
def _get_post_with_max(self, score_attr):
"""
获取具有最大属性值的文章
:param score_attr: 属性
:return:
"""
max_score = max(getattr(post, score_attr) for post in self._my_blog.post_lists)
max_posts = [post for post in self._my_blog.post_lists if getattr(post, score_attr) == max_score]
if max_posts:
return max_posts[0]
return None
def _get_post_with_min(self, score_attr):
"""
获取具有最小属性值的文章
:param score_attr:
:return:
"""
min_score = min(getattr(post, score_attr) for post in self._my_blog.post_lists)
min_posts = [post for post in self._my_blog.post_lists if getattr(post, score_attr) == min_score]
if min_posts:
return min_posts[0]
return None