import json import os import re 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 series_page = 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 episode_list = json.loads(re.search(r'episodeList : (\[.*\]),', series_page).group(1)) for episode in episode_list: eid = episode['id'] title = episode['title'] if eid <= last_id: continue if not episode['free']: continue caption = f'{title}\nhttps://tapas.io/episode/{eid}' 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') imgs = [] for img in esoup.select(f'#episode-{eid} .art-image'): imgs.append(img['src']) if len(imgs) == 1: bot.send_photo(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 = sum(heights) new_im = Image.new('RGB', (max_width, total_height)) offset = 0 for im in ims: new_im.paste(im, (0, offset)) offset += im.size[1] new_im_path = os.path.join(d, 'combined.jpg') new_im.save(new_im_path) with open(new_im_path, 'rb') as f: bot.send_document(chat_id, f, caption=caption) yield eid