lib.itmens/catalog/sites/steam.py

110 lines
3.6 KiB
Python
Raw Permalink Normal View History

import logging
2024-07-13 00:16:47 -04:00
from django.conf import settings
2022-12-08 23:58:44 +00:00
from catalog.common import *
from catalog.models import *
from common.models.lang import SITE_PREFERRED_LANGUAGES
2024-07-13 00:16:47 -04:00
from journal.models.renderers import html_to_text
2022-12-08 23:58:44 +00:00
from .igdb import search_igdb_by_3p_url
2022-12-08 23:58:44 +00:00
_logger = logging.getLogger(__name__)
2024-07-13 00:16:47 -04:00
def _get_preferred_languages():
langs = {}
for la in SITE_PREFERRED_LANGUAGES:
if la == "zh":
2024-07-13 00:16:47 -04:00
langs.update({"zh-cn": "zh-CN", "zh-tw": "zh-TW"})
# zh-HK data is not good
else:
langs[la] = la
2024-07-13 00:16:47 -04:00
return langs
STEAM_PREFERRED_LANGS = _get_preferred_languages()
2022-12-15 17:29:35 -05:00
@SiteManager.register
2022-12-08 23:58:44 +00:00
class Steam(AbstractSite):
2022-12-16 01:08:10 -05:00
SITE_NAME = SiteName.Steam
2022-12-08 23:58:44 +00:00
ID_TYPE = IdType.Steam
URL_PATTERNS = [r"\w+://store\.steampowered\.com/app/(\d+)"]
2022-12-29 23:57:02 -05:00
WIKI_PROPERTY_ID = "?"
2022-12-08 23:58:44 +00:00
DEFAULT_MODEL = Game
@classmethod
2023-02-15 15:45:57 -05:00
def id_to_url(cls, id_value):
2022-12-08 23:58:44 +00:00
return "https://store.steampowered.com/app/" + str(id_value)
2024-07-13 00:16:47 -04:00
def download(self, lang):
api_url = (
f"https://store.steampowered.com/api/appdetails?appids={self.id_value}"
)
headers = {
"User-Agent": settings.NEODB_USER_AGENT,
"Accept": "application/json",
"Accept-Language": STEAM_PREFERRED_LANGS[lang],
}
return BasicDownloader(api_url, headers=headers).download().json()
2022-12-08 23:58:44 +00:00
def scrape(self):
i = search_igdb_by_3p_url(self.url)
pd = i.scrape() if i else ResourceContent()
2024-07-13 00:16:47 -04:00
en_data = {}
localized_title = []
localized_desc = []
for lang in STEAM_PREFERRED_LANGS.keys():
data = self.download(lang).get(self.id_value, {}).get("data", {})
if lang == "en":
en_data = data
localized_title.append({"lang": lang, "text": data["name"]})
desc = html_to_text(data["detailed_description"])
localized_desc.append({"lang": lang, "text": desc})
if not en_data:
en_data = self.download("en")
if not en_data:
raise ParseError(self, "id")
2022-12-08 23:58:44 +00:00
# merge data from IGDB, use localized Steam data if available
d = {
"developer": en_data.get("developers", []),
"publisher": en_data.get("publishers", []),
"release_date": en_data.get("release_date", {}).get("date"),
"genre": [g["description"] for g in en_data.get("genres", [])],
2024-07-13 00:16:47 -04:00
"platform": ["PC"],
2022-12-08 23:58:44 +00:00
}
2024-07-13 00:16:47 -04:00
if en_data["release_date"].get("date"):
d["release_date"] = en_data["release_date"].get("date")
2022-12-08 23:58:44 +00:00
d.update(pd.metadata)
2024-07-13 00:16:47 -04:00
d.update(
{
"localized_title": localized_title,
"localized_description": localized_desc,
}
)
2022-12-08 23:58:44 +00:00
pd.metadata = d
2024-07-13 00:16:47 -04:00
# try Steam images if no image from IGDB
header = en_data.get("header_image")
if header:
if pd.cover_image is None:
cover = header.replace("header.jpg", "library_600x900_2x.jpg")
pd.metadata["cover_image_url"] = cover
(
pd.cover_image,
pd.cover_image_extention,
) = BasicImageDownloader.download_image(
pd.metadata["cover_image_url"], self.url
)
if pd.cover_image is None:
pd.metadata["cover_image_url"] = header
(
pd.cover_image,
pd.cover_image_extention,
) = BasicImageDownloader.download_image(
pd.metadata["cover_image_url"], self.url
)
2022-12-08 23:58:44 +00:00
return pd