Files

100 lines
3.3 KiB
Python

import json
import re
import iso639
import requests
from bs4 import BeautifulSoup as bs
from .provider import Provider
CDN_URL = "https://cdn.flamecomics.xyz"
IMAGE_URL = CDN_URL + "/uploads/images/series/{id}/{token}/{file}"
INFO_URL = "https://flamecomics.xyz/series/{id}"
CHAPTER_URL = "https://flamecomics.xyz/series/{id}/{token}"
class FlameComics(Provider):
domain = "flamecomics.xyz"
headers = {
"User-Agent": (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/120.0.0.0 Safari/537.36"
)
}
def __init__(self, session: requests.Session, url) -> None:
self.s = session
self.id = self.parse_url(url)
def parse_url(self, url):
parse = re.search(r"series\/(?P<id>\d+)", url)
return parse.group("id") # type: ignore
@staticmethod
def parse_info(payload: dict) -> dict:
return {
"series": payload["series"].get("title"),
"writer": payload["series"].get("author"),
"penciller": payload["series"].get("artist"),
"genre": payload["series"].get("tags"),
"summary": bs(
payload["series"].get("description"), "html.parser"
).get_text(),
"languageISO": iso639.Language.from_name(
payload["series"].get("language")
).part1,
"scanInformation": "Reaper_Scans & Flame Comics",
}
def generate_image_urls(self, raw_images: dict[str, dict], token: str) -> list[str]:
images = list()
for raw in raw_images.values():
images.append(
IMAGE_URL.format(id=self.id, token=token, file=raw.get("name"))
)
return images[1:]
def parse_chapters(self, payload: list[dict]) -> list[dict]:
chapters = list()
for c in payload:
nbr = float(c.get("chapter", 0.0))
title = c.get("title")
if not title:
title = f"Chapter {nbr}"
r = self.s.get(CHAPTER_URL.format(id=self.id, token=c.get("token")))
chapter_page = bs(r.content, "html.parser")
chapter_payload = self.get_page_props(chapter_page).get("chapter")
images = self.generate_image_urls(chapter_payload.get("images"), chapter_payload.get("token")) # type: ignore
data = {"nr": nbr, "title": title, "images": images}
chapters.append(data)
return chapters
@staticmethod
def get_page_props(page: bs) -> dict:
return (
json.loads(
page.find("script", attrs={"id": "__NEXT_DATA__"}).text # type: ignore
)
.get("props")
.get("pageProps")
)
def get_info(self) -> tuple[dict, list]:
r = self.s.get(INFO_URL.format(id=self.id))
series_page = bs(r.content, "html.parser")
payload = self.get_page_props(series_page)
info = self.parse_info(payload)
chapters = self.parse_chapters(payload["chapters"])
return info, chapters
def get_mediainfo(self) -> tuple[dict, list]:
return self.get_info()
def get_url(self) -> str:
return INFO_URL.format(id=self.id)