|
|
|
@ -4,76 +4,102 @@ import htmlparser
|
|
|
|
|
import xmltree
|
|
|
|
|
import strutils
|
|
|
|
|
import re
|
|
|
|
|
import typetraits
|
|
|
|
|
|
|
|
|
|
var client = newHttpClient()
|
|
|
|
|
let steamURL = os.paramStr(1)
|
|
|
|
|
let response = client.getContent(steamURL)
|
|
|
|
|
let save = os.paramStr(1)
|
|
|
|
|
if save == "csv":
|
|
|
|
|
writeFile("games.csv", "link,price,yearOfRelease,multiplier,reviewCount,estimatedSales,estimatedRevenue\n")
|
|
|
|
|
let commandLine = os.commandLineParams()
|
|
|
|
|
let steamURLS = commandLine[1..paramCount()-1]
|
|
|
|
|
for steamURL in steamURLS:
|
|
|
|
|
let response = client.getContent(steamURL)
|
|
|
|
|
|
|
|
|
|
var html = htmlparser.parseHtml(response)
|
|
|
|
|
|
|
|
|
|
var reviewCount: int
|
|
|
|
|
var price: float
|
|
|
|
|
var onSale: bool
|
|
|
|
|
var yearOfRelease: string
|
|
|
|
|
var multiplier: int
|
|
|
|
|
|
|
|
|
|
for meta in html.findall("meta"):
|
|
|
|
|
case meta.attr("itemprop"):
|
|
|
|
|
of "reviewCount":
|
|
|
|
|
reviewCount = parseInt(meta.attr("content"))
|
|
|
|
|
of "price":
|
|
|
|
|
price = parseFloat(meta.attr("content"))
|
|
|
|
|
case meta.attr("property"):
|
|
|
|
|
of "og:title":
|
|
|
|
|
if re.find(meta.attr("content"), re"Save .[0-100]% on.*") == -1:
|
|
|
|
|
onSale = false
|
|
|
|
|
else:
|
|
|
|
|
onSale = true
|
|
|
|
|
|
|
|
|
|
for date in html.findall("div"):
|
|
|
|
|
if date.attr("class") == "date":
|
|
|
|
|
yearOfRelease = date.innerText.split(" ")[2]
|
|
|
|
|
|
|
|
|
|
## https://vginsights.com/insights/article/how-to-estimate-steam-video-game-sales
|
|
|
|
|
case yearOfRelease:
|
|
|
|
|
of "2013":
|
|
|
|
|
multiplier = 79
|
|
|
|
|
of "2014":
|
|
|
|
|
multiplier = 72
|
|
|
|
|
of "2015":
|
|
|
|
|
multiplier = 62
|
|
|
|
|
of "2016":
|
|
|
|
|
multiplier = 52
|
|
|
|
|
of "2017":
|
|
|
|
|
multiplier = 43
|
|
|
|
|
of "2018":
|
|
|
|
|
multiplier = 38
|
|
|
|
|
of "2019":
|
|
|
|
|
multiplier = 36
|
|
|
|
|
of "2020":
|
|
|
|
|
multiplier = 31
|
|
|
|
|
of "2021":
|
|
|
|
|
multiplier = 31
|
|
|
|
|
of "2022": ## From here onward, multiplier are made up based off instinct alone
|
|
|
|
|
multiplier = 31
|
|
|
|
|
of "2023":
|
|
|
|
|
multiplier = 31
|
|
|
|
|
|
|
|
|
|
if onSale:
|
|
|
|
|
let steamID = steamURL.split("/")[4]
|
|
|
|
|
let response = client.getContent("https://store.steampowered.com/widget/" & steamID)
|
|
|
|
|
let widget = htmlparser.parseHTML(response)
|
|
|
|
|
for element in widget.findall("div"):
|
|
|
|
|
if element.attr("class") == "discount_original_price":
|
|
|
|
|
price = element.innerText.replace("$").parseFloat
|
|
|
|
|
break
|
|
|
|
|
|
|
|
|
|
let estimatedSales = multiplier*reviewCount
|
|
|
|
|
let estimatedRevenue = (toFloat(estimatedSales)*price)*0.70
|
|
|
|
|
|
|
|
|
|
var html = htmlparser.parseHtml(response)
|
|
|
|
|
|
|
|
|
|
var reviewCount: int
|
|
|
|
|
var price: float
|
|
|
|
|
var onSale: bool
|
|
|
|
|
var yearOfRelease: string
|
|
|
|
|
var multiplier: int
|
|
|
|
|
|
|
|
|
|
for meta in html.findall("meta"):
|
|
|
|
|
case meta.attr("itemprop"):
|
|
|
|
|
of "reviewCount":
|
|
|
|
|
reviewCount = parseInt(meta.attr("content"))
|
|
|
|
|
of "price":
|
|
|
|
|
price = parseFloat(meta.attr("content"))
|
|
|
|
|
case meta.attr("property"):
|
|
|
|
|
of "og:title":
|
|
|
|
|
if re.find(meta.attr("content"), re"Save .[0-100]% on.*") == -1:
|
|
|
|
|
onSale = false
|
|
|
|
|
else:
|
|
|
|
|
onSale = true
|
|
|
|
|
|
|
|
|
|
for date in html.findall("div"):
|
|
|
|
|
if date.attr("class") == "date":
|
|
|
|
|
yearOfRelease = date.innerText.split(" ")[2]
|
|
|
|
|
|
|
|
|
|
## https://vginsights.com/insights/article/how-to-estimate-steam-video-game-sales
|
|
|
|
|
case yearOfRelease:
|
|
|
|
|
of "2013":
|
|
|
|
|
multiplier = 79
|
|
|
|
|
of "2014":
|
|
|
|
|
multiplier = 72
|
|
|
|
|
of "2015":
|
|
|
|
|
multiplier = 62
|
|
|
|
|
of "2016":
|
|
|
|
|
multiplier = 52
|
|
|
|
|
of "2017":
|
|
|
|
|
multiplier = 43
|
|
|
|
|
of "2018":
|
|
|
|
|
multiplier = 38
|
|
|
|
|
of "2019":
|
|
|
|
|
multiplier = 36
|
|
|
|
|
of "2020":
|
|
|
|
|
multiplier = 31
|
|
|
|
|
of "2021":
|
|
|
|
|
multiplier = 31
|
|
|
|
|
of "2022": ## From here onward, multiplier are made up based off instinct alone
|
|
|
|
|
multiplier = 31
|
|
|
|
|
of "2023":
|
|
|
|
|
multiplier = 31
|
|
|
|
|
|
|
|
|
|
if onSale:
|
|
|
|
|
let steamID = steamURL.split("/")[4]
|
|
|
|
|
let response = client.getContent("https://store.steampowered.com/widget/" & steamID)
|
|
|
|
|
let widget = htmlparser.parseHTML(response)
|
|
|
|
|
for element in widget.findall("div"):
|
|
|
|
|
if element.attr("class") == "discount_original_price":
|
|
|
|
|
price = element.innerText.replace("$").parseFloat
|
|
|
|
|
break
|
|
|
|
|
echo "Link: " & os.paramStr(1)
|
|
|
|
|
echo "Price: " & $price
|
|
|
|
|
echo "Year of Release: " & yearOfRelease
|
|
|
|
|
echo "Year Multiplier (from VG Insights): " & $multiplier
|
|
|
|
|
echo "Reviews: " & $reviewCount
|
|
|
|
|
let estimatedSales = multiplier*reviewCount
|
|
|
|
|
echo "Estimated Sales: " & $estimatedSales
|
|
|
|
|
let estimatedRevenue = (toFloat(estimatedSales)*price)*0.70
|
|
|
|
|
echo "Estimated revenue (including steam cut): " & $estimatedRevenue
|
|
|
|
|
case save:
|
|
|
|
|
of "plain":
|
|
|
|
|
for name in html.findall("span"):
|
|
|
|
|
if name.attr("itemprop") == "name":
|
|
|
|
|
var output = """
|
|
|
|
|
Link: $1
|
|
|
|
|
Price: $2
|
|
|
|
|
Year of Release: $3
|
|
|
|
|
Year Multiplier (from VG Insights): $4
|
|
|
|
|
Reviews: : $5
|
|
|
|
|
Estimated Sales: $6
|
|
|
|
|
Estimated revenue (including steam cut): $7""" % [steamURL, $price, yearOfRelease, $multiplier, $reviewCount, $estimatedSales, $estimatedRevenue]
|
|
|
|
|
|
|
|
|
|
writeFile(name.innerText.replace("/"), output)
|
|
|
|
|
of "csv":
|
|
|
|
|
let f = open("games.csv", fmAppend)
|
|
|
|
|
var output = """$1,$2,$3,$4,$5,$6,$7""" % [steamURL, $price, yearOfRelease, $multiplier, $reviewCount, $estimatedSales, $estimatedRevenue]
|
|
|
|
|
f.writeLine(output)
|
|
|
|
|
f.close()
|
|
|
|
|
of "stdout":
|
|
|
|
|
echo "Link: " & steamURL
|
|
|
|
|
echo "Price: $" & ((price.formatFloat(ffDecimal, 2)).insertSep(',')).replace(",.", ".") & " (USD)"
|
|
|
|
|
echo "Year of Release: " & yearOfRelease
|
|
|
|
|
echo "Year Multiplier (from VG Insights): " & $multiplier
|
|
|
|
|
echo "Reviews: " & $reviewCount
|
|
|
|
|
echo "Estimated Sales: " & $estimatedSales
|
|
|
|
|
echo "Estimated revenue (including steam cut): " & $estimatedRevenue
|
|
|
|
|