Source code for moddb.pages.ware

from __future__ import annotations

import logging
from typing import TYPE_CHECKING

from ..boxes import Thumbnail
from ..enums import SearchCategory, ThumbnailType
from ..utils import LOGGER, concat_docs
from .base import HardwareSoftwareMetaClass
from .mixins import GetGamesMixin, GetWaresMixin

if TYPE_CHECKING:
    from bs4 import BeautifulSoup


[docs] @concat_docs class Hardware(HardwareSoftwareMetaClass, GetGamesMixin, GetWaresMixin): """Represents a moddb Hardware page Parameters ----------- html : BeautifulSoup The html file to parse, allows for finer control Filtering ---------- released : :class:`.Status` Release status of the hardware (released, unreleased, early access) category : :class:`.HardwareCategory` Category of the hardware timeframe : :class:`.TimeFrame` How long ago the hardware was released 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 * **ranktoday** - order by daily ranking, asc is highest ranked, desc is lowest rank * **visitstotal** - order by most views, asc is highest views, desc is lowest views * **rating** - order by rating, asc is highest rating, desc is lowest rating * **category** - sort alphebatically by hardwarecategory * **name** - order alphabetically, asc is a-z, desc is z-a * **dateup** - order by latest update, asc is most recent update first, desc is oldest update first Attributes ----------- hardware : List[Thumbnail] A list of hardware suggested on the hardware main page. software : List[Thumbnail] A list of software suggested on the hardware main page. games : List[Thumbnail] A list of games suggested on the hardware main page. history : List[Thumbnail] A list of previous iterations of the hardware recommended : List[Thumbnail] A list of recommended hardwares. """ def __init__(self, html: BeautifulSoup): super().__init__(html) self._type = SearchCategory.hardwares try: 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 ] except AttributeError: LOGGER.info( "Hardware '%s' has no hardware", self.name, exc_info=LOGGER.level >= logging.DEBUG ) self.hardware = [] try: 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 ] except AttributeError: LOGGER.info( "Hardware '%s' has no software", self.name, exc_info=LOGGER.level >= logging.DEBUG ) self.software = [] try: 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 ] except AttributeError: LOGGER.info( "Hardware '%s' has no games", self.name, exc_info=LOGGER.level >= logging.DEBUG ) self.games = [] try: history = html.find("span", string="History").parent.parent.parent.find_all( "a", class_="image" ) self.history = [ Thumbnail( url=x["href"], name=x["title"], type=ThumbnailType.hardware, image=x.img["src"], ) for x in history ] except AttributeError: LOGGER.info( "Harware '%s' has no history", self.name, exc_info=LOGGER.level >= logging.DEBUG ) self.history = [] try: recommended = html.find("span", string="Recommended").parent.parent.parent.find_all( "a", class_="image" ) self.recommended = [ Thumbnail( url=x["href"], name=x["title"], type=ThumbnailType.hardware, image=x.img["src"], ) for x in recommended ] except AttributeError: LOGGER.info( "Hardware '%s' has no recommended", self.name, exc_info=LOGGER.level >= logging.DEBUG, ) self.recommended = []
[docs] @concat_docs class Software(HardwareSoftwareMetaClass): """Represents a moddb Software page Parameters ----------- html : BeautifulSoup The html file to parse, allows for finer control Filtering ---------- released : :class:`.Status` Release status of the software (released, unreleased, early access) category : :class:`.SoftwareCategory` Category of the software timeframe : :class:`.TimeFrame` How long ago the software was released 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 * **ranktoday** - order by daily ranking, asc is highest ranked, desc is lowest rank * **visitstotal** - order by most views, asc is highest views, desc is lowest views * **rating** - order by rating, asc is highest rating, desc is lowest rating * **category** - sort alphebatically by softwarecategory * **name** - order alphabetically, asc is a-z, desc is z-a * **dateup** - order by latest update, asc is most recent update first, desc is oldest update first """ def __init__(self, html: BeautifulSoup): super().__init__(html) self._type = SearchCategory.softwares