lib.itmens/catalog/sites/steam.py

65 lines
2.6 KiB
Python
Raw Normal View History

2022-12-08 23:58:44 +00:00
from catalog.common import *
from catalog.models import *
from .igdb import search_igdb_by_3p_url
import dateparser
import logging
_logger = logging.getLogger(__name__)
@SiteList.register
class Steam(AbstractSite):
ID_TYPE = IdType.Steam
URL_PATTERNS = [r"\w+://store\.steampowered\.com/app/(\d+)"]
WIKI_PROPERTY_ID = '?'
DEFAULT_MODEL = Game
@classmethod
def id_to_url(self, id_value):
return "https://store.steampowered.com/app/" + str(id_value)
def scrape(self):
i = search_igdb_by_3p_url(self.url)
pd = i.scrape() if i else ResourceContent()
headers = BasicDownloader.headers.copy()
headers['Host'] = 'store.steampowered.com'
headers['Cookie'] = "wants_mature_content=1; birthtime=754700401;"
content = BasicDownloader(self.url, headers=headers).download().html()
title = content.xpath("//div[@class='apphub_AppName']/text()")[0]
developer = content.xpath("//div[@id='developers_list']/a/text()")
publisher = content.xpath("//div[@class='glance_ctn']//div[@class='dev_row'][2]//a/text()")
release_date = dateparser.parse(
content.xpath(
"//div[@class='release_date']/div[@class='date']/text()")[0]
).strftime('%Y-%m-%d')
genre = content.xpath(
"//div[@class='details_block']/b[2]/following-sibling::a/text()")
platform = ['PC']
brief = content.xpath(
"//div[@class='game_description_snippet']/text()")[0].strip()
# try Steam images if no image from IGDB
if pd.cover_image is None:
pd.metadata['cover_image_url'] = content.xpath("//img[@class='game_header_image_full']/@src")[0].replace("header.jpg", "library_600x900.jpg")
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'] = content.xpath("//img[@class='game_header_image_full']/@src")[0]
pd.cover_image, pd.cover_image_extention = BasicImageDownloader.download_image(pd.metadata['cover_image_url'], self.url)
# merge data from IGDB, use localized Steam data if available
d = {
'developer': developer,
'publisher': publisher,
'release_date': release_date,
'genre': genre,
'platform': platform,
}
d.update(pd.metadata)
pd.metadata = d
if title:
pd.metadata['title'] = title
if brief:
pd.metadata['brief'] = brief
return pd