From 9bf9f0d2e8f6a55883ee98ef46cb4d18dc0f3c2f Mon Sep 17 00:00:00 2001 From: Michael Yick Date: Thu, 10 Aug 2023 02:46:38 -0500 Subject: [PATCH] add CSV support --- README.md | 13 ++- src/SteamMoneyEstimator.nim | 180 +++++++++++++++++++----------------- 2 files changed, 105 insertions(+), 88 deletions(-) diff --git a/README.md b/README.md index 781b3ec..aea0508 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,13 @@ Estimates how much money a piece of software makes on steam using information ab ## Usage -This will save a file locally along with printing the results: -`SteamMoneyEstimator true "https://store.steampowered.com/app/1895350/I_Wani_Hug_that_Gator/"` +`SteamMoneyEstimator {FORMAT} [URLS]` -This will simply output the results without saving a file locally -`SteamMoneyEstimator true "https://store.steampowered.com/app/1895350/I_Wani_Hug_that_Gator/"` +This will save a file locally +`SteamMoneyEstimator plain "https://store.steampowered.com/app/1895350/I_Wani_Hug_that_Gator/"` + +This will simply output the results to stdout +`SteamMoneyEstimator stdout "https://store.steampowered.com/app/1895350/I_Wani_Hug_that_Gator/"` + +Will output all urls data in a csv format +`SteamMoneyEstimator csv "https://store.steampowered.com/app/1895350/I_Wani_Hug_that_Gator/"` diff --git a/src/SteamMoneyEstimator.nim b/src/SteamMoneyEstimator.nim index 9445494..be24739 100644 --- a/src/SteamMoneyEstimator.nim +++ b/src/SteamMoneyEstimator.nim @@ -6,88 +6,100 @@ import strutils import re var client = newHttpClient() -let save = parseBool(os.paramStr(1)) -let steamURL = os.paramStr(2) -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(2) -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 - -if save: - 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""" % [os.paramStr(2), $price, yearOfRelease, $multiplier, $reviewCount, $estimatedSales, $estimatedRevenue] - - writeFile(name.innerText.replace("/"), output) + 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 + 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