43 lines
1.2 KiB
Python
43 lines
1.2 KiB
Python
from asyncio import gather, run
|
|
from collections.abc import Iterable
|
|
|
|
from aiohttp import ClientResponse, ClientSession
|
|
from inject import autoparams
|
|
|
|
from ytrssil.config import get_feed_urls
|
|
from ytrssil.datatypes import Channel, Video
|
|
from ytrssil.parser import Parser
|
|
from ytrssil.repository import ChannelRepository
|
|
|
|
|
|
async def request(session: ClientSession, url: str) -> ClientResponse:
|
|
return await session.request(method='GET', url=url)
|
|
|
|
|
|
async def fetch_feeds(urls: Iterable[str]) -> Iterable[str]:
|
|
async with ClientSession() as session:
|
|
responses: list[ClientResponse] = await gather(*[
|
|
request(session, url) for url in urls
|
|
])
|
|
return [
|
|
await response.text(encoding='UTF-8')
|
|
for response in responses
|
|
]
|
|
|
|
|
|
@autoparams('parser', 'repository')
|
|
def fetch_new_videos(
|
|
*,
|
|
parser: Parser,
|
|
repository: ChannelRepository,
|
|
) -> tuple[dict[str, Channel], dict[str, Video]]:
|
|
feed_urls = get_feed_urls()
|
|
channels: dict[str, Channel] = {}
|
|
new_videos: dict[str, Video] = {}
|
|
for feed in run(fetch_feeds(feed_urls)):
|
|
channel = parser(feed)
|
|
channels[channel.channel_id] = channel
|
|
new_videos.update(channel.new_videos)
|
|
|
|
return channels, new_videos
|