import os from tempfile import TemporaryDirectory import sentry_sdk from django.db import models from djconfig import config from telebot import TeleBot from telebot.types import InputMediaPhoto, InputMediaVideo from bs4 import BeautifulSoup import requests from PIL import Image from feeds.models import FeedModuleConfig class TapasFeedModuleConfig(FeedModuleConfig): display_name = models.CharField(max_length=256) MODULE_NAME = 'Tapas.io comic' def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.session = requests.Session() self.session.headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:67.0) Gecko/20100101 Firefox/67.0'} def execute(self, bot: TeleBot, chat_id, last_id): config._reload_maybe() if last_id is None: last_id = 0 soup = BeautifulSoup(self.session.get(f'https://tapas.io/series/{self.display_name}').text, 'html.parser') for episode in soup.select('#episode-nav .episode'): eid = int(episode['data-eid']) if eid <= last_id: continue esoup = BeautifulSoup(self.session.get(f'https://tapas.io/episode/{eid}').text, 'html.parser') # series_title = esoup.select_one('#series-info-wrap a.series-header-title').text title = esoup.select_one(f'#episodes [data-eid={eid}] h1').text caption = f'{title}\nhttps://tapas.io/episode/{eid}' imgs = [] for img in esoup.select(f'#episodes [data-eid={eid}] .art-image'): imgs.append(img['src']) if len(imgs) == 1: bot.send_document(chat_id, imgs[0], caption=caption) if len(imgs) > 1: with TemporaryDirectory() as d: ims = [] for i, img in enumerate(imgs): img_path = os.path.join(d, f'{i}.jpg') with open(img_path, 'wb') as f: f.write(requests.get(img).content) ims.append(Image.open(img_path)) widths, heights = zip(*(i.size for i in ims)) max_width = max(widths) total_height = max(heights) new_im = Image.new('RGB', (max_width, total_height)) offset = 0 for im in ims: new_im.paste(im, (offset, 0)) offset += im.size[0] new_im_path = os.path.join(d, 'combined.jpg') new_im.save(new_im_path) bot.send_document(chat_id, new_im_path, caption=caption) yield eid