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}', headers={'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:67.0) Gecko/20100101 Firefox/67.0'}, ).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}', headers={'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:67.0) Gecko/20100101 Firefox/67.0'}, ).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