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 execute(self, bot: TeleBot, chat_id, last_id): config._reload_maybe() if last_id is None: last_id = 0 soup = BeautifulSoup(requests.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(requests.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