From 03066853de6ad596310fbb1402d70d2b33a75e9e Mon Sep 17 00:00:00 2001 From: YoursFunny Date: Tue, 13 Aug 2024 19:17:58 +0800 Subject: [PATCH] refactor --- utils/pixiv.py | 84 ++-------------------- utils/telegram.py | 177 +++++++++++++++++++++++++++++++++++++++++++++- utils/tweet.py | 102 +------------------------- 3 files changed, 183 insertions(+), 180 deletions(-) diff --git a/utils/pixiv.py b/utils/pixiv.py index cc76ba7..bd18a35 100644 --- a/utils/pixiv.py +++ b/utils/pixiv.py @@ -1,24 +1,12 @@ from __future__ import annotations -import html -from typing import Generator, Literal, TYPE_CHECKING -from uuid import uuid4 +from typing import Literal, TYPE_CHECKING from async_pixiv import PixivClient from async_pixiv.error import ApiError -from telegram import InlineQueryResultPhoto, InputMediaPhoto - -from utils.logger import get_logger if TYPE_CHECKING: from async_pixiv.model.illust import Illust - from utils.types import TypeInlineQueryResult, TypeMessageMediaResult - -logger = get_logger(__name__) - -message_raw_text = """{text} / {author} -{tags} -""" class PixivMedia: @@ -110,11 +98,9 @@ class Pixiv: ] -class ProcessPixiv: +class _ProcessPixiv: _client: PixivClient - __slots__ = ('_url', '_illust') - @classmethod async def init_client(cls, token: str) -> None: cls._client = PixivClient() @@ -129,6 +115,10 @@ class ProcessPixiv: async def refresh_token(cls): await cls._client.login_with_token(cls._token) + +class ProcessPixiv(_ProcessPixiv): + __slots__ = ('_url', '_illust') + def __init__(self, url: str): self._url: str = url @@ -149,65 +139,3 @@ class ProcessPixiv: def _parse_illust_id(self) -> int: return int(self._url.split("/")[-1]) - - -class TelegramPixiv: - __slots__ = ('_url', '_pixiv') - - def __init__(self, url: str): - self._url = url - - async def __aenter__(self): - async with ProcessPixiv(self._url) as pixiv: - self._pixiv = pixiv - return self - - async def __aexit__(self, exc_type, exc_val, exc_tb): - pass - - @property - def url(self) -> str: - return self._pixiv.url - - @property - def message_text(self) -> str: - pixiv = self._pixiv - return message_raw_text.format( - url=pixiv.url, - author_url=pixiv.author_url, - author=html.escape(pixiv.author), - text=html.escape(pixiv.title), - tags=html.escape(" ".join(f"#{name}" for name in pixiv.tags)) - ) - - def inline_query_result(self) -> tuple[TypeInlineQueryResult, ...]: - return tuple(self.inline_query_generator()) - - def message_media_result(self) -> tuple[TypeMessageMediaResult, ...]: - return tuple(self.message_media_generator()) - - def inline_query_generator(self) -> Generator[TypeInlineQueryResult, None, None]: - pixiv = self._pixiv - for media in pixiv.images: - logger.info(str(media)) - if pixiv.type in ("illust", "manga"): - yield InlineQueryResultPhoto( - id=str(uuid4()), - photo_url=media.large, - thumbnail_url=media.thumb, - caption=self.message_text - ) - else: - yield - - def message_media_generator(self) -> Generator[TypeMessageMediaResult, None, None]: - pixiv = self._pixiv - for media in pixiv.images: - logger.info(str(media)) - if pixiv.type in ("illust", "manga"): - yield InputMediaPhoto( - media=media.large, - has_spoiler=pixiv.is_nsfw - ) - else: - yield diff --git a/utils/telegram.py b/utils/telegram.py index b53b5a2..08fac28 100644 --- a/utils/telegram.py +++ b/utils/telegram.py @@ -1,9 +1,31 @@ from __future__ import annotations +import html +from functools import cached_property +from typing import Generator, TYPE_CHECKING +from uuid import uuid4 + +from telegram import InlineQueryResultMpeg4Gif, InlineQueryResultPhoto, InlineQueryResultVideo, InputMediaPhoto, \ + InputMediaVideo + from common import PIXIV_REFRESH_TOKEN -from .pixiv import TelegramPixiv +from .logger import get_logger +from .pixiv import ProcessPixiv from .regex import pixiv_url, x_url -from .tweet import TelegramTweet +from .tweet import ProcessTweet + +if TYPE_CHECKING: + from .types import TypeInlineQueryResult, TypeMessageMediaResult + +logger = get_logger(__name__) + +message_raw_text_tweet = """{url} +{author}: {text} +""" + +message_raw_text_pixiv = """{text} / {author} +{tags} +""" class Telegram: @@ -22,3 +44,154 @@ class Telegram: async def __aexit__(self, exc_type, exc_val, exc_tb): pass + + +class TelegramTweet: + message_raw_text = message_raw_text_tweet + __slots__ = ('_url', '_tweet', '__dict__') + + def __init__(self, url: str): + self._url: str = url + + async def __aenter__(self): + async with ProcessTweet(self._url) as tweet: + self._tweet = tweet + return self + + async def __aexit__(self, exc_type, exc_val, exc_tb): + pass + + @cached_property + def url(self) -> str: + return self._tweet.url + + @cached_property + def message_text(self) -> str: + tweet = self._tweet + return self.message_raw_text.format( + url=tweet.url, + author_url=tweet.author_url, + author=html.escape(tweet.author), + text=html.escape(tweet.text) + ) + + def inline_query_result(self) -> tuple[TypeInlineQueryResult, ...]: + return tuple(self.inline_query_generator()) + + def message_media_result(self) -> tuple[TypeMessageMediaResult, ...]: + return tuple(self.message_media_generator()) + + def inline_query_generator(self) -> Generator[TypeInlineQueryResult, None, None]: + tweet = self._tweet + for tweet_media in tweet.media: + logger.info(str(tweet_media)) + if tweet_media.type == "image": + yield InlineQueryResultPhoto( + id=str(uuid4()), + photo_url=tweet_media.url, + thumbnail_url=tweet_media.thumb, + caption=self.message_text + ) + elif tweet_media.type == "video": + yield InlineQueryResultVideo( + id=str(uuid4()), + video_url=tweet_media.url, + mime_type="video/mp4", + thumbnail_url=tweet_media.thumb, + title=tweet.text, + caption=self.message_text + ) + elif tweet_media.type == "gif": + yield InlineQueryResultMpeg4Gif( + id=str(uuid4()), + mpeg4_url=tweet_media.url, + thumbnail_url=tweet_media.thumb, + caption=self.message_text + ) + + def message_media_generator(self) -> Generator[TypeMessageMediaResult, None, None]: + tweet = self._tweet + for tweet_media in tweet.media: + logger.info(str(tweet_media)) + if tweet_media.type == "image": + yield InputMediaPhoto( + media=tweet_media.url, + has_spoiler=tweet.sensitive + ) + elif tweet_media.type == "video": + yield InputMediaVideo( + media=tweet_media.url, + has_spoiler=tweet.sensitive, + thumbnail=tweet_media.thumb + ) + elif tweet_media.type == "gif": + if len(tweet.media) == 1: + yield tweet_media.url, tweet.sensitive + yield InputMediaVideo( + media=tweet_media.url, + has_spoiler=tweet.sensitive, + thumbnail=tweet_media.thumb + ) + + +class TelegramPixiv: + message_raw_text = message_raw_text_pixiv + __slots__ = ('_url', '_pixiv') + + def __init__(self, url: str): + self._url = url + + async def __aenter__(self): + async with ProcessPixiv(self._url) as pixiv: + self._pixiv = pixiv + return self + + async def __aexit__(self, exc_type, exc_val, exc_tb): + pass + + @property + def url(self) -> str: + return self._pixiv.url + + @property + def message_text(self) -> str: + pixiv = self._pixiv + return self.message_raw_text.format( + url=pixiv.url, + author_url=pixiv.author_url, + author=html.escape(pixiv.author), + text=html.escape(pixiv.title), + tags=html.escape(" ".join(f"#{name}" for name in pixiv.tags)) + ) + + def inline_query_result(self) -> tuple[TypeInlineQueryResult, ...]: + return tuple(self.inline_query_generator()) + + def message_media_result(self) -> tuple[TypeMessageMediaResult, ...]: + return tuple(self.message_media_generator()) + + def inline_query_generator(self) -> Generator[TypeInlineQueryResult, None, None]: + pixiv = self._pixiv + for media in pixiv.images: + logger.info(str(media)) + if pixiv.type in ("illust", "manga"): + yield InlineQueryResultPhoto( + id=str(uuid4()), + photo_url=media.large, + thumbnail_url=media.thumb, + caption=self.message_text + ) + else: + yield + + def message_media_generator(self) -> Generator[TypeMessageMediaResult, None, None]: + pixiv = self._pixiv + for media in pixiv.images: + logger.info(str(media)) + if pixiv.type in ("illust", "manga"): + yield InputMediaPhoto( + media=media.large, + has_spoiler=pixiv.is_nsfw + ) + else: + yield diff --git a/utils/tweet.py b/utils/tweet.py index c41551e..905edda 100644 --- a/utils/tweet.py +++ b/utils/tweet.py @@ -1,30 +1,17 @@ from __future__ import annotations -import html from functools import cached_property -from typing import Generator, TYPE_CHECKING -from uuid import uuid4 +from typing import TYPE_CHECKING -from telegram import (InlineQueryResultMpeg4Gif, InlineQueryResultPhoto, InlineQueryResultVideo, InputMediaPhoto, - InputMediaVideo) - -from .logger import get_logger from .net import NetClient from .regex import x_media_url, x_tco_url, x_url if TYPE_CHECKING: - from .types import TweetInfo, TypeInlineQueryResult, TypeMessageMediaResult - -logger = get_logger(__name__) - + from .types import TweetInfo twimg_url = 'https://pbs.twimg.com/' vx_api_url = 'https://api.vxtwitter.com/{0}/status/{1}' -message_raw_text = """{url} -{author}: {text} -""" - class TweetMedia: __slots__ = ('_url', '_thumb', '_type', '__dict__') @@ -163,88 +150,3 @@ class ProcessTweet: ] -class TelegramTweet: - __slots__ = ('_url', '_tweet', '__dict__') - - def __init__(self, url: str): - self._url: str = url - - async def __aenter__(self): - async with ProcessTweet(self._url) as tweet: - self._tweet = tweet - return self - - async def __aexit__(self, exc_type, exc_val, exc_tb): - pass - - @cached_property - def url(self) -> str: - return self._tweet.url - - @cached_property - def message_text(self) -> str: - tweet = self._tweet - return message_raw_text.format( - url=tweet.url, - author_url=tweet.author_url, - author=html.escape(tweet.author), - text=html.escape(tweet.text) - ) - - def inline_query_result(self) -> tuple[TypeInlineQueryResult, ...]: - return tuple(self.inline_query_generator()) - - def message_media_result(self) -> tuple[TypeMessageMediaResult, ...]: - return tuple(self.message_media_generator()) - - def inline_query_generator(self) -> Generator[TypeInlineQueryResult, None, None]: - tweet = self._tweet - for tweet_media in tweet.media: - logger.info(str(tweet_media)) - if tweet_media.type == "image": - yield InlineQueryResultPhoto( - id=str(uuid4()), - photo_url=tweet_media.url, - thumbnail_url=tweet_media.thumb, - caption=self.message_text - ) - elif tweet_media.type == "video": - yield InlineQueryResultVideo( - id=str(uuid4()), - video_url=tweet_media.url, - mime_type="video/mp4", - thumbnail_url=tweet_media.thumb, - title=tweet.text, - caption=self.message_text - ) - elif tweet_media.type == "gif": - yield InlineQueryResultMpeg4Gif( - id=str(uuid4()), - mpeg4_url=tweet_media.url, - thumbnail_url=tweet_media.thumb, - caption=self.message_text - ) - - def message_media_generator(self) -> Generator[TypeMessageMediaResult, None, None]: - tweet = self._tweet - for tweet_media in tweet.media: - logger.info(str(tweet_media)) - if tweet_media.type == "image": - yield InputMediaPhoto( - media=tweet_media.url, - has_spoiler=tweet.sensitive - ) - elif tweet_media.type == "video": - yield InputMediaVideo( - media=tweet_media.url, - has_spoiler=tweet.sensitive, - thumbnail=tweet_media.thumb - ) - elif tweet_media.type == "gif": - if len(tweet.media) == 1: - yield tweet_media.url, tweet.sensitive - yield InputMediaVideo( - media=tweet_media.url, - has_spoiler=tweet.sensitive, - thumbnail=tweet_media.thumb - )