Source code for comicgeeks.Comic_Geeks

from datetime import datetime

import requests
from bs4 import BeautifulSoup

from .classes import Character, Creator, Issue, Series
from .utils import get_series

_headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0"
}


[docs]class Comic_Geeks: """League of Comic Geeks client Attributes: ci_session (str): Cookie ci_session of League of Comic Geeks """ def __init__(self, ci_session: str = None) -> None: self._ci_session: str = self._check_session(ci_session) def _check_session(self, ci_session: str = None) -> bool: """Check if session is valid. Make a request to the main page and if is redirected to the dashboard, the session is valid. """ if ci_session is None: return "" s = requests.Session() s.cookies.update({"ci_session": ci_session}) r = s.get("https://leagueofcomicgeeks.com/", headers=_headers) if "dashboard" in r.url: return ci_session return ""
[docs] def search_series(self, query: str) -> list[Series]: """Search series by name Args: query (str): Series name Returns: list (Series): List of series """ query = query.strip().lower().replace(" ", "+") url = f"https://leagueofcomicgeeks.com/comic/get_comics?&list=search&list_option=series&view=thumbs&title={query}&order=alpha-asc&format[]=1&format[]=6" r = requests.get(url, headers=_headers) r.raise_for_status() r = r.json() if r["count"] == 0: return [] soup = BeautifulSoup(r["list"], features="lxml") content = soup.find(id="comic-list-block") comics = content.find_all("li") data = get_series(comics, Series, self._ci_session) return data
[docs] def search_creator(self, query: str) -> list[Creator]: """Search series by name Args: query (str): Series name Returns: list (Series): List of series """ query = query.strip().lower().replace(" ", "+") url = f"https://leagueofcomicgeeks.com/search/creators?keyword={query}" r = requests.get(url, headers=_headers) r.raise_for_status() soup = BeautifulSoup(r.content, features="lxml") content = soup.find(class_="comic-series-thumb-list") if content is None: return [] data = [] for item in content.findAll("li"): creator_id = int(item.find("a")["href"].split("/")[2]) creator = Creator(creator_id, self._ci_session) creator.name = item.find(class_="title").text.strip() creator.url = item.find("a")["href"] if item.find("img"): creator.image = item.find("img")["src"] data.append(creator) return data
[docs] def search_character(self, query: str) -> list[Character]: query = query.strip().lower().replace(" ", "+") url = f"https://leagueofcomicgeeks.com/search/characters?keyword={query}" r = requests.get(url, headers=_headers) r.raise_for_status() soup = BeautifulSoup(r.content, features="lxml") content = soup.find(class_="character-thumb-list") if content is None: return [] data = [] for item in content.findAll("li"): character_id = int(item.find("a")["href"].split("/")[2]) character = Character(character_id, self._ci_session) character.name = item.find(class_="title").text.strip() character.url = item.find("a")["href"] character.real_name = ( item.find(class_="publisher").text.strip() if item.find(class_="publisher") else "" ) if item.find(class_="series"): character.publisher, character.universe = item.find( class_="series" ).text.split("·") if item.find("img"): character.image = item.find("img")["data-src"] data.append(character) return data
[docs] def new_releases(self, date: datetime = "now") -> list[Issue]: """Get this week new releases Args: date (datetime): Date to get new releases Returns: list (Issue): List of issues """ if date == "now": date = datetime.now() date = f"{date.month}/{date.day}/{date.year}" url = f"https://leagueofcomicgeeks.com/comic/get_comics?list=releases&view=thumbs&format[]=1%2C6&date_type=week&date={date}&order=pulls" r = requests.get(url, headers=_headers).json() if r["count"] == 0: return [] soup = BeautifulSoup(r["list"], features="lxml") content = soup.find(id="comic-list-block") comics = content.find_all("li") data = [] for comic in comics: a = comic.find("a") price = ( float(comic.find(class_="price").text.split("·")[1].strip()[1::]) if comic.find(class_="price") else "Unknown" ) pulls = comic["data-pulls"] rating = comic["data-community"] name = comic.find(class_="title").text.strip() issue_id = int(a["href"].split("/")[2]) url = a["href"] store_date = comic.find(class_="date")["data-date"] publisher = comic.find(class_="publisher").text.strip() cover = comic.find("img")["data-src"] community = {"rating": rating, "pull": pulls} issue = Issue( issue_id=issue_id, ci_session=self._ci_session, ) issue.name = name issue.url = url issue.store_date = store_date issue.price = price issue.publisher = publisher issue.cover = cover issue.community = community data.append(issue) return data
[docs] def series_info(self, series_id: int) -> Series: """Get series info by id Args: series_id (int): series id Returns: Series: Series class """ return Series(series_id, self._ci_session)
[docs] def issue_info(self, issue_id: int) -> Issue: """Get issue info by id Args: issue_id (int): issue id Returns: Issue: Issue object """ return Issue(issue_id, self._ci_session)
[docs] def creator_info(self, creator_id: int) -> Creator: """Get creator info by id Args: creator_id (int): creator id Returns: Creator: Creator object """ return Creator(creator_id, self._ci_session)
[docs] def character_info(self, character_id: int) -> Character: """Get character info by id Args: character_id (int): character id Returns: Character: Character object """ return Character(character_id, self._ci_session)