diff --git a/analysis.js b/analysis.js index 5f69d80..c35d917 100644 --- a/analysis.js +++ b/analysis.js @@ -54,7 +54,7 @@ function billaToCanonical(rawItems, today) { name: item.data.name, price: item.data.price.final, priceHistory: [{ date: today, price: item.data.price.final }], - unit: item.data.grammage + unit: item.data.grammagePriceFactor != 1 ? item.data.grammage : "kg" }); } return canonicalItems; @@ -133,7 +133,7 @@ function mergePriceHistory(oldItems, items) { /// Given a directory of raw data of the form `billa-$date.json` and `spar-$date.json`, constructs /// a canonical list of all products and their historical price data. -function replay(rawDataDir) { +exports.replay = function(rawDataDir) { const today = currentDate(); const files = fs.readdirSync(rawDataDir).filter( @@ -218,19 +218,3 @@ exports.updateData = async function (dataDir, done) { if (done) done(items); return items; } - -async function restore() { - console.log("Restoring data"); - writeJSON("data/latest-canonical.json", replay("data")); - await exports.updateData("data"); - - const today = currentDate(); - const items = readJSON("data/latest-canonical.json"); - for (item of items) { - if (item.priceHistory[0].date == today && item.priceHistory.length > 1) { - console.log(`${item.store} ${item.name} ${item.priceHistory[1].price} -> ${item.priceHistory[0].price}`); - } - } -} - // writeJSON("data/latest-canonical-replay.json", replay("data")); -// restore() diff --git a/restore.js b/restore.js new file mode 100644 index 0000000..f5a7474 --- /dev/null +++ b/restore.js @@ -0,0 +1,5 @@ +const fs = require("fs"); +const analysis = require("./analysis.js"); + +fs.copyFileSync("docker/data/latest-canonical.json", "docker/data/latest-canonical-old.json"); +fs.writeFileSync("docker/data/latest-canonical.json", JSON.stringify(analysis.replay("docker/data"), null, 2)); \ No newline at end of file diff --git a/site/carts.json b/site/carts.json new file mode 100644 index 0000000..3f41766 --- /dev/null +++ b/site/carts.json @@ -0,0 +1,780 @@ +[ + { + "name": "Butter", + "items": [ + { + "store": "billa", + "id": "00-425413", + "name": "Clever Österreichische Teebutter", + "price": 1.85, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 1.85 + } + ], + "unit": "250 Gramm Packung", + "search": "clever österreichische teebutter 250 gramm packung" + }, + { + "store": "hofer", + "id": 546430, + "name": "MILFINA Teebutter 250g", + "price": 1.85, + "priceHistory": [ + { + "date": "2023-05-18", + "price": 1.85 + } + ], + "unit": "252 gramm", + "search": "milfina teebutter 250g 252 gramm" + }, + { + "store": "spar", + "id": "8798786420737", + "name": "S-BUDGET Butter", + "price": 1.85, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 1.85 + } + ], + "unit": "250 G", + "search": "s-budget butter 250 g" + } + ] + }, + { + "name": "Eigenmarken Grundnahrungsmittel", + "items": [ + { + "store": "billa", + "id": "00-425413", + "name": "Clever Österreichische Teebutter", + "price": 1.85, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 1.85 + } + ], + "unit": "250 Gramm Packung", + "search": "clever österreichische teebutter 250 gramm packung" + }, + { + "store": "spar", + "id": "8798786420737", + "name": "S-BUDGET Butter", + "price": 1.85, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 1.85 + } + ], + "unit": "250 G", + "search": "s-budget butter 250 g" + }, + { + "store": "hofer", + "id": 546430, + "name": "MILFINA Teebutter 250g", + "price": 1.85, + "priceHistory": [ + { + "date": "2023-05-18", + "price": 1.85 + } + ], + "unit": "252 gramm", + "search": "milfina teebutter 250g 252 gramm" + }, + { + "store": "billa", + "id": "00-594850", + "name": "Clever Weizenmehl W700 Glatt", + "price": 0.85, + "priceHistory": [ + { + "date": "2023-05-18", + "price": 0.85 + }, + { + "date": "2023-05-15", + "price": 0.99 + } + ], + "unit": "1 Kilogramm Packung", + "search": "clever weizenmehl w700 glatt 1 kilogramm packung" + }, + { + "store": "billa", + "id": "00-760899", + "name": "Clever Mehl Universal", + "price": 0.85, + "priceHistory": [ + { + "date": "2023-05-18", + "price": 0.85 + }, + { + "date": "2023-05-15", + "price": 0.99 + } + ], + "unit": "1 Kilogramm Packung", + "search": "clever mehl universal 1 kilogramm packung" + }, + { + "store": "spar", + "id": "8800167428097", + "name": "S-BUDGET Weizenmehl Glatt, Type W 700", + "price": 0.85, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 0.85 + } + ], + "unit": "1 KG", + "search": "s-budget weizenmehl glatt, type w 700 1 kg" + }, + { + "store": "spar", + "id": "8800000999425", + "name": "S-BUDGET Weizenmehl Universal, Type W 700", + "price": 0.85, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 0.85 + } + ], + "unit": "1 KG", + "search": "s-budget weizenmehl universal, type w 700 1 kg" + }, + { + "store": "spar", + "id": "8800167460865", + "name": "S-BUDGET Weizenmehl griffig, Type W 700", + "price": 0.85, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 0.85 + } + ], + "unit": "1 KG", + "search": "s-budget weizenmehl griffig, type w 700 1 kg" + }, + { + "store": "hofer", + "id": 543651, + "name": "HAPPY HARVEST Weizenmehl Glatt Type 480 1kg", + "price": 0.85, + "priceHistory": [ + { + "date": "2023-05-18", + "price": 0.85 + } + ], + "unit": "1010 gramm", + "search": "happy harvest weizenmehl glatt type 480 1kg 1010 gramm" + }, + { + "store": "hofer", + "id": 543781, + "name": "HAPPY HARVEST Weizenmehl Griffig Type 480 1kg", + "price": 0.85, + "priceHistory": [ + { + "date": "2023-05-18", + "price": 0.85 + } + ], + "unit": "1010 gramm", + "search": "happy harvest weizenmehl griffig type 480 1kg 1010 gramm" + }, + { + "store": "hofer", + "id": 543782, + "name": "HAPPY HARVEST Weizenmehl Universal Type 480 1kg", + "price": 0.85, + "priceHistory": [ + { + "date": "2023-05-18", + "price": 0.85 + } + ], + "unit": "1000 gramm", + "search": "happy harvest weizenmehl universal type 480 1kg 1000 gramm" + }, + { + "store": "billa", + "id": "00-309662", + "name": "Clever Langkornreis", + "price": 1.19, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 1.19 + } + ], + "unit": "1 Kilogramm Beutel", + "search": "clever langkornreis 1 kilogramm beutel" + }, + { + "store": "hofer", + "id": 548180, + "name": "HAPPY HARVEST Langkorn Reis 1kg", + "price": 1.19, + "priceHistory": [ + { + "date": "2023-05-18", + "price": 1.19 + } + ], + "unit": "1004 gramm", + "search": "happy harvest langkorn reis 1kg 1004 gramm" + }, + { + "store": "spar", + "id": "8800167297025", + "name": "S-BUDGET Langkornreis", + "price": 1.29, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 1.29 + } + ], + "unit": "1 KG", + "search": "s-budget langkornreis 1 kg" + }, + { + "store": "billa", + "id": "00-746506", + "name": "Clever Haltbar-Vollmilch 3.5%", + "price": 1.09, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 1.09 + } + ], + "unit": "1 Liter Packung", + "search": "clever haltbar-vollmilch 3.5% 1 liter packung" + }, + { + "store": "billa", + "id": "00-504029", + "name": "Clever Vollmilch länger frisch 3.5%", + "price": 1.29, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 1.29 + } + ], + "unit": "1 Liter Packung (Einweg)", + "search": "clever vollmilch länger frisch 3.5% 1 liter packung (einweg)" + }, + { + "store": "billa", + "id": "00-425337", + "name": "Clever Vollmilch 3.5%", + "price": 1.29, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 1.29 + } + ], + "unit": "1 Liter Packung (Einweg)", + "search": "clever vollmilch 3.5% 1 liter packung (einweg)" + }, + { + "store": "spar", + "id": "8799203852289", + "name": "S-BUDGET Haltbare Vollmilch 3,5% Fett", + "price": 1.09, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 1.09 + } + ], + "unit": "1 L EINWEG", + "search": "s-budget haltbare vollmilch 3,5% fett 1 l einweg" + }, + { + "store": "spar", + "id": "8798840356865", + "name": "S-BUDGET Vollmilch 3,5% Fett länger frisch", + "price": 1.29, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 1.29 + } + ], + "unit": "1 L EINWEG", + "search": "s-budget vollmilch 3,5% fett länger frisch 1 l einweg" + }, + { + "store": "hofer", + "id": 546463, + "name": "MILFINA Vollmilch 3,5% Fett 1l", + "price": 1.29, + "priceHistory": [ + { + "date": "2023-05-18", + "price": 1.29 + } + ], + "unit": "1066 gramm", + "search": "milfina vollmilch 3,5% fett 1l 1066 gramm" + }, + { + "store": "hofer", + "id": 546464, + "name": "MILFINA Längerfrische Vollmilch 3,5% Fett 1l", + "price": 1.29, + "priceHistory": [ + { + "date": "2023-05-18", + "price": 1.29 + } + ], + "unit": "1088 gramm", + "search": "milfina längerfrische vollmilch 3,5% fett 1l 1088 gramm" + }, + { + "store": "billa", + "id": "00-480884", + "name": "Clever Knopfsemmel", + "price": 0.23, + "priceHistory": [ + { + "date": "2023-05-19", + "price": 0.23 + } + ], + "unit": "65 Gramm Stück", + "search": "clever knopfsemmel 65 gramm stück" + }, + { + "store": "spar", + "id": "8799882412033", + "name": "S-BUDGET Semmel", + "price": 0.23, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 0.23 + } + ], + "unit": "1 STK", + "search": "s-budget semmel 1 stk" + }, + { + "store": "hofer", + "id": 546074, + "name": "BACKBOX Kaisersemmel 65g", + "price": 0.23, + "priceHistory": [ + { + "date": "2023-05-18", + "price": 0.23 + } + ], + "unit": "65 gramm", + "search": "backbox kaisersemmel 65g 65 gramm" + }, + { + "store": "billa", + "id": "00-829484", + "name": "Clever Roggenvollkornbrot", + "price": 0.99, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 0.99 + } + ], + "unit": "500 Gramm Stück", + "search": "clever roggenvollkornbrot 500 gramm stück" + }, + { + "store": "spar", + "id": "8798918541313", + "name": "S-BUDGET Roggen-Vollkornbrot mit Sonnenblumenkernen", + "price": 0.99, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 0.99 + } + ], + "unit": "500 G", + "search": "s-budget roggen-vollkornbrot mit sonnenblumenkernen 500 g" + }, + { + "store": "hofer", + "id": 543790, + "name": "BIO NATURA Roggen Vollkornbrot mit Sonnenblumenkernen 500g", + "price": 1.39, + "priceHistory": [ + { + "date": "2023-05-18", + "price": 1.39 + } + ], + "unit": "520 gramm", + "search": "bio natura roggen vollkornbrot mit sonnenblumenkernen 500g 520 gramm" + }, + { + "store": "spar", + "id": "8802286469121", + "name": "S-BUDGET Faschiertes gemischt per Packung", + "price": 5.58, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 5.58 + } + ], + "unit": "700 G", + "search": "s-budget faschiertes gemischt per packung 700 g" + }, + { + "store": "billa", + "id": "00-317050", + "name": "Clever Faschiertes gemischt", + "price": 4.89, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 4.89 + } + ], + "unit": "700 g Tasse", + "search": "clever faschiertes gemischt 700 g tasse" + }, + { + "store": "spar", + "id": "8799981240321", + "name": "S-BUDGET Tomaten", + "price": 2.49, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 2.49 + } + ], + "unit": "1 KG", + "search": "s-budget tomaten 1 kg" + }, + { + "store": "billa", + "id": "00-402113", + "name": "Clever Tomaten aus Spanien / Marokko / Österreich", + "price": 2.49, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 2.49 + } + ], + "unit": "1 kg Becher", + "search": "clever tomaten aus spanien / marokko / österreich 1 kg becher" + }, + { + "store": "hofer", + "id": 547855, + "name": "HOFER MARKTPLATZ Tomaten 1kg", + "price": 2.49, + "priceHistory": [ + { + "date": "2023-05-18", + "price": 2.49 + } + ], + "unit": "1000 gramm", + "search": "hofer marktplatz tomaten 1kg 1000 gramm" + }, + { + "store": "billa", + "id": "00-486890", + "name": "Clever Gouda 45%", + "price": 3.49, + "priceHistory": [ + { + "date": "2023-05-18", + "price": 3.49 + }, + { + "date": "2023-05-15", + "price": 3.79 + } + ], + "unit": "450 g Stk", + "search": "clever gouda 45% 450 g stk" + }, + { + "store": "spar", + "id": "8799996084225", + "name": "S-BUDGET Österreichischer Gouda 45% F.i.T.", + "price": 3.49, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 3.49 + } + ], + "unit": "450 G", + "search": "s-budget österreichischer gouda 45% f.i.t. 450 g" + }, + { + "store": "hofer", + "id": 549722, + "name": "HOFBURGER Gouda in Scheiben 400g", + "price": 3.49, + "priceHistory": [ + { + "date": "2023-05-18", + "price": 3.49 + } + ], + "unit": "410 gramm", + "search": "hofburger gouda in scheiben 400g 410 gramm" + }, + { + "store": "hofer", + "id": 547383, + "name": "HOFER MARKTPLATZ Kartoffeln, vorwiegend festkochend 5kg", + "price": 4.49, + "priceHistory": [ + { + "date": "2023-05-18", + "price": 4.49 + } + ], + "unit": "5000 gramm", + "search": "hofer marktplatz kartoffeln, vorwiegend festkochend 5kg 5000 gramm" + }, + { + "store": "spar", + "id": "8799317032961", + "name": "S-BUDGET Kartoffeln", + "price": 4.49, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 4.49 + } + ], + "unit": "5 KG", + "search": "s-budget kartoffeln 5 kg" + }, + { + "store": "billa", + "id": "00-89517", + "name": "Clever Erdäpfel vorwiegend festkochend aus Österreich", + "price": 4.49, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 4.49 + } + ], + "unit": "5 kg Sack", + "search": "clever erdäpfel vorwiegend festkochend aus österreich 5 kg sack" + } + ] + }, + { + "name": "Bier", + "items": [ + { + "store": "hofer", + "id": 545090, + "name": "PUNTIGAMER Vollbier 0,5l", + "price": 1.19, + "priceHistory": [ + { + "date": "2023-05-18", + "price": 1.19 + } + ], + "unit": "520 gramm", + "search": "puntigamer vollbier 0,5l 520 gramm" + }, + { + "store": "billa", + "id": "00-407579", + "name": "Puntigamer \"Das bierige Bier\"", + "price": 1.25, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 1.25 + } + ], + "unit": "0.5 l Dose (Einweg)", + "search": "puntigamer \"das bierige bier\" 0.5 l dose (einweg)" + }, + { + "store": "spar", + "id": "8799342624769", + "name": "Puntigamer Das \"bierige\" Bier", + "price": 1.25, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 1.25 + } + ], + "unit": "500 ML EINWEG", + "search": "puntigamer das \"bierige\" bier 500 ml einweg" + }, + { + "store": "hofer", + "id": 545103, + "name": "STIEGL Goldbräu 0,5l", + "price": 1.15, + "priceHistory": [ + { + "date": "2023-05-18", + "price": 1.15 + } + ], + "unit": "515 gramm", + "search": "stiegl goldbräu 0,5l 515 gramm" + }, + { + "store": "billa", + "id": "00-424638", + "name": "Stiegl Goldbräu", + "price": 1.45, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 1.45 + } + ], + "unit": "0.5 l Dose (Einweg)", + "search": "stiegl goldbräu 0.5 l dose (einweg)" + }, + { + "store": "spar", + "id": "8799696617473", + "name": "Stiegl Goldbräu", + "price": 1.44, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 1.44 + } + ], + "unit": "500 ML EINWEG", + "search": "stiegl goldbräu 500 ml einweg" + }, + { + "store": "spar", + "id": "8800422756353", + "name": "Gösser Märzen", + "price": 1.34, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 1.34 + } + ], + "unit": "500 ML MEHRWEG", + "search": "gösser märzen 500 ml mehrweg" + }, + { + "store": "billa", + "id": "00-12297", + "name": "Gösser Märzen", + "price": 1.49, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 1.49 + } + ], + "unit": "0.5 l Dose (Einweg)", + "search": "gösser märzen 0.5 l dose (einweg)" + }, + { + "store": "hofer", + "id": 545109, + "name": "GÖSSER Märzen 0,5l", + "price": 1.39, + "priceHistory": [ + { + "date": "2023-05-18", + "price": 1.39 + } + ], + "unit": "561 gramm", + "search": "gösser märzen 0,5l 561 gramm" + } + ] + }, + { + "name": "Milch", + "items": [ + { + "store": "billa", + "id": "00-425337", + "name": "Clever Vollmilch 3.5%", + "price": 1.29, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 1.29 + } + ], + "unit": "1 Liter Packung (Einweg)", + "search": "clever vollmilch 3.5% 1 liter packung (einweg)" + }, + { + "store": "hofer", + "id": 546463, + "name": "MILFINA Vollmilch 3,5% Fett 1l", + "price": 1.29, + "priceHistory": [ + { + "date": "2023-05-18", + "price": 1.29 + } + ], + "unit": "1066 gramm", + "search": "milfina vollmilch 3,5% fett 1l 1066 gramm" + }, + { + "store": "spar", + "id": "8798840356865", + "name": "S-BUDGET Vollmilch 3,5% Fett länger frisch", + "price": 1.29, + "priceHistory": [ + { + "date": "2023-05-15", + "price": 1.29 + } + ], + "unit": "1 L EINWEG", + "search": "s-budget vollmilch 3,5% fett länger frisch 1 l einweg" + } + ] + }, + { + "name": "Schokolade", + "items": [] + } + ] \ No newline at end of file diff --git a/stats.sh b/stats.sh new file mode 100755 index 0000000..37630a3 --- /dev/null +++ b/stats.sh @@ -0,0 +1,5 @@ +#!/bin/bash +set -e +scp marioslab.io:/home/badlogic/heissepreise/docker/data/logs/access.log . +goaccess access.log -o report.html --log-format=COMBINED +open report.html \ No newline at end of file diff --git a/stuff.js b/stuff.js new file mode 100644 index 0000000..3d77d24 --- /dev/null +++ b/stuff.js @@ -0,0 +1,47 @@ +const fs = require("fs"); + +const items = JSON.parse(fs.readFileSync("docker/data/latest-canonical.json")); +items.sort(item => item.priceHistory.length); + +for (item of items) { + if (item.priceHistory.length > 2) + console.log(JSON.stringify(item, null, 2)); +} + +const units = {}; +const unitsSmall = {} + +for (item of items) { + const tokens = item.unit ? item.unit.split(/\s+/) : []; + if (tokens.length == 0) continue; + if (tokens[0].charAt(0) >= '0' && tokens[0].charAt(0) <= '9') { + tokens.splice(0, 1); + } + units[tokens.join(" ")] = item; + unitsSmall[tokens[0]] = item; +} +console.log(JSON.stringify(Object.keys(units), null, 2)); +console.log(Object.keys(units).length); +console.log(JSON.stringify(Object.keys(unitsSmall), null, 2)); +console.log(Object.keys(unitsSmall).length); + +const hofer = JSON.parse(fs.readFileSync("docker/data/hofer-2023-05-19.json")); +const unitTypes = {} +for (item of hofer) { + unitTypes[item.UnitType] = true; +} +console.log(JSON.stringify(unitTypes, null, 2)); + +const billa = JSON.parse(fs.readFileSync("docker/data/billa-2023-05-19.json")); +for (item of billa) { + if (item.data.grammagePriceFactor != 1) { + console.log(JSON.stringify(item.data.name + " " + item.data.grammage, null, 2)); + } +} + +const spar = JSON.parse(fs.readFileSync("docker/data/spar-2023-05-19.json")); +for (item of spar) { + if (item.masterValues["quantity-selector"]) { + console.log(JSON.stringify(item.masterValues["short-description"] + " " + item.masterValues["price-per-unit"], null, 2)); + } +} \ No newline at end of file