Source code for moddb.pages.platform

from __future__ import annotations

import logging
from typing import TYPE_CHECKING

from ..boxes import PlatformStatistics, Thumbnail
from ..enums import ThumbnailType
from ..utils import LOGGER, concat_docs, get_date, join
from .base import BaseMetaClass
from .mixins import GetEnginesMixin, GetGamesMixin, GetModsMixin, GetWaresMixin

if TYPE_CHECKING:
    from bs4 import BeautifulSoup


[docs] @concat_docs class Platform( BaseMetaClass, GetModsMixin, GetGamesMixin, GetEnginesMixin, GetWaresMixin, ): """Represents the platform supporting the game/engines. Game and engines may have mutiple platforms. Parameters ----------- html : bs4.BeautifulSoup The html to parse. Allows for finer control. Filtering ---------- released : :class:`.Status` Current status of release (unreleased, early access, ect...) Sorting -------- * **released** - when the object was released, asc is oldest, desc is most recent * **id** - when it was added to moddb, asc is oldest, desc is most recent * **porder** - what plaform it's on??? * **company** - company that made it in alphabetical order Attributes ----------- name : str The name of the platform name_id : str The name_id of the member, cannot be changed, it's a mix of the original username lowercased with spaces removed and shortened. id : int The moddb id of the platform url : str The url of the platform page description : str Description of the platform company : Thumbnail A team like thumbnail of the company. homepage : str Link to the homepage of the engine date : datetime.datetime Date the engine was published stats : PlatformStatistics Stat data on the platform share : dict{str : str} Share link of the platform with the name of the share as key and link of the share as url. comments : CommentList[Comment] Comments on this page games : List[Thumbnail] A list of games suggested on the platform main page. hardware : List[Thumbnail] A list of hardware suggested on the platform main page. software : List[Thumbnail] A list of software suggested on the platform main page. engines : List[Thumbnail] A list of engines suggested on the platform main page. mods : List[Thumbnail] A list of mods suggested on the platform main page. """ def __init__(self, html: BeautifulSoup): self.name = html.find("a", itemprop="mainEntityOfPage").string self.id = None self.url = join(html.find("a", itemprop="mainEntityOfPage")["href"]) self.name_id = self.url.split("/")[0] try: self.description = html.find("div", id="profiledescription").p.string except AttributeError: self.description = html.find("p", itemprop="description").string try: company = html.find("h5", string="Company").parent.span.a self.company = Thumbnail( name=company.string, url=company["href"], type=ThumbnailType.team ) except AttributeError: LOGGER.info( "Platform '%s' has no company", self.name, exc_info=LOGGER.level >= logging.DEBUG ) self.company = None self.homepage = html.find("h5", string="Homepage").parent.span.a["href"] self.date = get_date(html.find("time", itemprop="releaseDate")["datetime"]) self.stats = PlatformStatistics(html) try: share = html.find("h5", string="Share").parent.span.find_all("a") self.share = { "reddit": share[0]["href"], "mail": share[1]["href"], "twitter": share[2]["href"], "facebook": share[3]["href"], } except (AttributeError, IndexError): LOGGER.info( "Something funky about share box of platform '%s'", self.name, exc_info=LOGGER.level >= logging.DEBUG, ) self.share = None self.comments = self._get_comments(html) hardware = ( html.find("span", string=" Hardware") .parent.parent.parent.find("div", class_="table") .find_all("div", recursive=False)[:-1] ) self.hardware = [ Thumbnail( name=x.a["title"], url=x.a["href"], type=ThumbnailType.hardware, image=x.a.img["src"], ) for x in hardware ] software = ( html.find("span", string=" Software") .parent.parent.parent.find("div", class_="table") .find_all("div", recursive=False)[:-1] ) self.software = [ Thumbnail( name=x.a["title"], url=x.a["href"], type=ThumbnailType.software, image=x.a.img["src"], ) for x in software ] engines = ( html.find("span", string=" Engines") .parent.parent.parent.find("div", class_="table") .find_all("div", recursive=False)[:-1] ) self.engines = [ Thumbnail( name=x.a["title"], url=x.a["href"], type=ThumbnailType.engine, image=x.a.img["src"], ) for x in engines ] mods = ( html.find("span", string=" Mods") .parent.parent.parent.find("div", class_="table") .find_all("div", recursive=False)[:-1] ) self.mods = [ Thumbnail( name=x.a["title"], url=x.a["href"], type=ThumbnailType.mod, image=x.a.img["src"], ) for x in mods ] games = ( html.find("span", string=" Games") .parent.parent.parent.find("div", class_="table") .find_all("div", recursive=False)[:-1] ) self.games = [ Thumbnail( name=x.a["title"], url=x.a["href"], type=ThumbnailType.game, image=x.a.img["src"], ) for x in games ] def __repr__(self): return f"<Platform name={self.name}>"