69 lines
2.7 KiB
Python
69 lines
2.7 KiB
Python
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
|