From 19b664e55fb059ca24b97960f65d33994976d16c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Rajnoha?= Date: Mon, 19 Oct 2020 19:24:15 +0200 Subject: [PATCH] Commit --- MMM-idos.css | 32 +++ MMM-idos.js | 198 +++++++++++++++++ README.md | 52 +++++ img/screenshot.png | Bin 0 -> 19535 bytes node-idos.js | 123 +++++++++++ node_helper.js | 40 ++++ package-lock.json | 504 +++++++++++++++++++++++++++++++++++++++++++ package.json | 27 +++ translations/cz.json | 4 + translations/en.json | 4 + translations/sk.json | 4 + 11 files changed, 988 insertions(+) create mode 100644 MMM-idos.css create mode 100644 MMM-idos.js create mode 100644 README.md create mode 100644 img/screenshot.png create mode 100644 node-idos.js create mode 100644 node_helper.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 translations/cz.json create mode 100644 translations/en.json create mode 100644 translations/sk.json diff --git a/MMM-idos.css b/MMM-idos.css new file mode 100644 index 0000000..4063252 --- /dev/null +++ b/MMM-idos.css @@ -0,0 +1,32 @@ +/* Magic Mirror + * Module: MMM-idos + * Description: Display estimations for public transport stops in Bratislava, Slovakia + * + * By Adrian Matejov https://github.com/Adman + * MIT Licensed. + */ + +.MMM-idos { + width : 300px; +} + +.MMM-idos tr { + padding-top: 5px; +} + +.blinking .blink { + animation: blink 1s ease-in-out infinite alternate; +} + +@-webkit-keyframes blink { + from { opacity: 0.2; } + to { opacity: 1; } +} + +.idos-padding-left { + padding-left: 5px; +} + +.MMM-idos table { + font-size: 1rem; +} \ No newline at end of file diff --git a/MMM-idos.js b/MMM-idos.js new file mode 100644 index 0000000..c8028c8 --- /dev/null +++ b/MMM-idos.js @@ -0,0 +1,198 @@ +/* Magic Mirror Module + * Module: MMM-idos + * Description: Display estimations for public transport stops in the Czech Republic + * + * By elrubio https://github.com/soyrubio + * MIT Licensed. + */ + +Module.register('MMM-idos', { + defaults: { + maximumEntries: 5, + refreshInterval: 60000, // in milliseconds + displaySymbol: true, + displayLineNumber: true, + displayDestination: true, + + fadePoint: 0.25, // Start on the 1/4th of the list + fade: true, + blink: true, + torPorts: ['9050', '9052', '9053', '9054'] + }, + + getStyles: function () { + return ['font-awesome.css', this.file('MMM-idos.css')]; + }, + + getTranslations: function () { + return { + en: "translations/en.json", + sk: "translations/sk.json", + cz: "translations/sk.json", + } + }, + + start: function () { + Log.log('Starting module: ' + this.name); + + this.livetable = {}; + + this.idos_loaded = false; + this.idos_fetch_error = false; + + this.scheduleUpdate(); + this.updateDom(); + }, + + getDom: function () { + var wrapper = document.createElement('div'); + + if (this.idos_fetch_error) { + wrapper.innerHTML = this.translate('IDOS_FETCH_ERROR'); + wrapper.className = 'dimmed light small'; + return wrapper; + } + + if (!(this.idos_loaded)) { + wrapper.innerHTML = this.translate('LOADING'); + wrapper.className = 'dimmed light small'; + return wrapper; + } + + /* process data */ + var all_lines = this.livetable; + all_lines = all_lines.slice(0, this.config.maximumEntries); + + if (this.config.fade && this.config.fadePoint < 1) { + if (this.config.fadePoint < 0) { + this.config.fadePoint = 0; + } + var start_fade = all_lines.length * this.config.fadePoint; + var fade_steps = all_lines.length - start_fade; + } + + var table = document.createElement('table'); + table.className = 'small'; + + if (all_lines.length > 0) { + for (var i = 0; i < all_lines.length; i++) { + var line = all_lines[i]; + + var row = document.createElement('tr'); + + /* row fading */ + if (i + 1 >= start_fade) { + var curr_fade_step = i - start_fade; + row.style.opacity = 1 - (1 / fade_steps * curr_fade_step); + } + + /* display symbol */ + if (this.config.displaySymbol) { + var w_symbol_td = document.createElement('td'); + var w_symbol = document.createElement('span'); + w_symbol.className = 'fa fa-fw fa-' + line.type; + w_symbol_td.appendChild(w_symbol); + row.appendChild(w_symbol_td); + } + + /* display line number */ + if (this.config.displayLineNumber) { + var w_line_num_td = document.createElement('td'); + w_line_num_td.className = 'idos-padding-left align-right'; + w_line_num_td.innerHTML = line.number; + row.appendChild(w_line_num_td); + } + + /* display destination */ + if (this.config.displayDestination) { + var w_dest_td = document.createElement('td'); + w_dest_td.className = 'idos-padding-left align-left idos-destination'; + w_dest_td.innerHTML = line.destination; + row.appendChild(w_dest_td); + } + + /* display time left */ + var w_time_td = document.createElement('td'); + w_time_td.className = 'align-right idos-departure'; + if (this.config.blink) { + w_time_td.className += 'blink'; + } + var departure_time = this.getDepartureTime(line); + w_time_td.innerHTML = departure_time; + row.appendChild(w_time_td); + + /* display delay dot */ + var dot_td = document.createElement('td'); + dot_td.className = 'idos-delay-dot' + if (this.config.blink) { + w_time_td.className += 'blink'; + } + if (line.delay !== "0") { + dot_td.innerHTML = "•"; + } + row.appendChild(dot_td); + + /* departuring now should blink */ + row.className = 'bright' + if (this.config.blink && departure_time === "<1 min") + row.className += ' blinking'; + + table.appendChild(row); + } + } else { + var row = document.createElement('tr'); + table.appendChild(row); + + var no_line_cell = document.createElement('td'); + no_line_cell.className = 'dimmed light small'; + no_line_cell.innerHTML = this.translate('IDOS_NO_LINES'); + row.appendChild(no_line_cell); + } + + wrapper.appendChild(table); + return wrapper; + }, + + socketNotificationReceived: function (notification, payload) { + if (payload.module_id == this.identifier) { + if (notification === 'IDOS_UPDATE') { + this.idos_loaded = true; + this.idos_fetch_error = false; + this.livetable = payload.result; + this.updateDom(); + } else if (notification === 'IDOS_FETCH_ERROR') { + this.idos_fetch_error = true; + this.updateDom(); + } + } + }, + + scheduleUpdate: function () { + this.sendSocketNotification('IDOS_STOP_INFO', { + module_id: this.identifier, + stop_id: this.config.stopId, + ports: this.config.torPorts + }); + + var self = this; + setTimeout(function () { + self.scheduleUpdate(); + }, this.config.refreshInterval); + }, + + getDepartureTime: function (line) { + var now = new Date(); + var time = line.departure.split(":"); + var departure = new Date(now.getFullYear(), now.getMonth(), now.getDate(), time[0], time[1], 0); + var diff = (departure - now) / 60000; + departure.setMinutes(departure.getMinutes() + parseInt(line.delay)); + diff = (departure - now) / 60000; + if (diff < 1) { + diff = "<1" + } else { + diff = Math.round(diff); + } + diff += " min" + return diff; + } +}); diff --git a/README.md b/README.md new file mode 100644 index 0000000..9978922 --- /dev/null +++ b/README.md @@ -0,0 +1,52 @@ +# MMM-idos + +This is a Magic Mirror Module (https://github.com/MichMich/MagicMirror/), which displays +real time estimated departures for public transport in the Czech Republic. + + +![screenshoot](img/screenshoot.png) + +## Installation + +Clone this module into your Magic Mirror modules folder. +1. Go into Magic Mirror's `modules` folder +2. Execute `git clone https://github.com/soyrubio/MMM-idos.git`. + +## Using the module + +In order to use this module, add the following configuration into Magic Mirror's config file (located in 'config/config.js'): + +```js +var config = { + modules: [ + { + module: 'MMM-idos', + header: '
', // no header will be displayed if ommited + position: 'top_right', // position of the module + config: { + stopId: string, // "https://idos.idnes.cz/vlakyautobusymhdvse/odjezdy/vysledky/?f=the_stop + /* other configurations */ + } + } + ] +} +``` + +## Configuration options + +| Option | Description +|--------------------- |------------ +| `stopId` | *Required* Id of the stop (parameter "z" in stop's livetable url).

**Type:** `int`
**Default value:** `none` +| `maximumEntries` | *Optional* The maximum entries shown.

**Type:** `int`
**Default value:** `10` +| `refreshInterval` | *Optional* How often to check for the next lines.

**Type:** `int`
**Default value:** `30000` milliseconds (60 seconds) +| `fade` | *Optional* Fade the future lines to black. (Gradient)

**Type:** `boolean`
**Default value:** `true` +| `fadePoint` | *Optional* Where to start fade?

**Type:** `float`
**Default value:** `0.25` (start on the 1/4 th of the list) +| `blink` | *Optional* Whether departures should blink when departure time is <1 min. >

**Type:** `boolean`
**Default value:** `true` +| `displaySymbol` | *Optional* Whether to display bus/tram symbols.

**Type:** `boolean`
**Default value:** `true` +| `displayLineNumber` | *Optional* Whether to display line number.

**Type:** `boolean`
**Default value:** `true` +| `displayDestination` | *Optional* Whether to display destination stop.

**Type:** `boolean`
**Default value:** `true` + +## Credits +The module is based on the [MMM-imhdsk By Adman](https://github.com/Adman/MMM-imhdsk), his module is far better than my own would be so this is basically the MMM-imhdsk module remade to fetch departures data from the idos.cz website. Thanks Adman! + +*Beware that by using this you might be violating idos.cz ToS* diff --git a/img/screenshot.png b/img/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..8932c2e68a18608b76bb5e133f9a734f9f8f2dd5 GIT binary patch literal 19535 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 HJ}~Wnqi#d# literal 0 HcmV?d00001 diff --git a/node-idos.js b/node-idos.js new file mode 100644 index 0000000..7271779 --- /dev/null +++ b/node-idos.js @@ -0,0 +1,123 @@ +/* Magic Mirror Module + * Module: MMM-idos + * Description: Display estimations for public transport stops in the Czech Republic + * + * By elrubio https://github.com/soyrubio + * MIT Licensed. + * + * This is a web scraper for the MMM-idos module + * The data is scraped from https://idos.idnes.cz/vlakyautobusymhdvse/odjezdy/ + */ + +const puppeteer = require('puppeteer'); +const cheerio = require('cheerio'); + +function parse_body(body) { + const $ = cheerio.load(body) + + var stops = [] + $(".dep-row-first").each(function () { + var stop = $(this).find("h3").map(function () { + return $(this).text().trim() + }).toArray(); + stops.push(stop); + }); + var vehicles = $(".departures-table__cell img").map(function () { + return $(this).attr("alt") + }); + var delays = $(".cell-delay").map(function () { + return $(this).find(".delay-bubble").text().replace(/[^0-9]/g, "").replace(/^$/, "0") + }); + + var output = []; + for (let i = 0; i < stops.length; i++) { + stop = stops[i]; + + output.push({ + "destination": stop[0], + "number": stop[1].replace("Bus", "").replace("Tram", "").trim(), + "departure": stop[2].replace(/\n.*/g, ""), + "delay": delays[i], + "departurewdelay": getDepartureWDelay(stop[2], delays[i]), + "type": vehicles[i].replace("tramvaj", "train").replace("autobus", "bus").replace("trolejbus", "bus") + }); + } + + output.sort(getSortOrder("departurewdelay")); + + return output; +} + +function getSortOrder(prop) { + return function (a, b) { + if (a[prop] > b[prop]) { + return 1; + } else if (a[prop] < b[prop]) { + return -1; + } + return 0; + } +} + +function getDepartureWDelay(dep, delay) { + var now = new Date(); + var time = dep.split(":"); + var departure = new Date(now.getFullYear(), now.getMonth(), now.getDate(), time[0], time[1], 0); + var diff = (departure - now) / 60000; + departure.setMinutes(departure.getMinutes() + parseInt(delay)); + diff = (departure - now) / 60000; + diff = Math.round(diff); + return diff; +} + +async function scrape(options, callback) { + try { + var port_arg; + if (options.ports.length > 0) { + const randomPort = options.ports[Math.floor(Math.random() * options.ports.length)]; + port_arg = '--proxy-server=socks5://127.0.0.1:' + randomPort; + } + const browser = await puppeteer.launch({ + args: [port_arg], + executablePath: '/usr/bin/chromium-browser' + }); + const page = await browser.newPage(); + + await page.setRequestInterception(true); + page.on('request', (request) => { + if (['image', 'stylesheet', 'font', 'script'].indexOf(request.resourceType()) !== -1) { + request.abort(); + } else { + request.continue(); + } + }); + + await page.goto(options.url); + const content = await page.content(); + setTimeout(() => { + browser.close(); + }, 3000); + callback(null, content); + } catch (err) { + callback(err, null); + } +} + +exports.get_livetable = function (stop, ports) { + var url = 'https://idos.idnes.cz/vlakyautobusymhdvse/odjezdy/vysledky/?f=' + stop; + + //var stops = scrape(url, props.ports); + return new Promise(function (resolve, reject) { + scrape({ + url: url, + ports: ports + }, function (err, body) { + if (err) + return reject(err); + else + return resolve(parse_body(body)); + }) + }); + + return stops; +} diff --git a/node_helper.js b/node_helper.js new file mode 100644 index 0000000..ac2deb2 --- /dev/null +++ b/node_helper.js @@ -0,0 +1,40 @@ +/* Magic Mirror Module + * Module: MMM-idos + * Description: Display estimations for public transport stops in the Czech Republic + * + * By elrubio https://github.com/soyrubio + * MIT Licensed. + */ + +const NodeHelper = require('node_helper'); +const idos = require('./node-idos.js'); + +module.exports = NodeHelper.create({ + start: function() { + console.log('Starting node helper for: ' + this.name); + }, + + socketNotificationReceived: function(notification, payload) { + if (notification === 'IDOS_STOP_INFO') { + this.getDataForStop(payload.module_id, + payload.stop_id, + payload.ports); + } + }, + + getDataForStop: function(module_id, stop_id, ports) { + + var self = this; + idos.get_livetable(stop_id, ports).then(function(res) { + self.sendSocketNotification('IDOS_UPDATE', { + module_id: module_id, + result: res + }); + }).catch(function(err) { + console.log("MMM-idos fetch error: " + err); + self.sendSocketNotification('IDOS_FETCH_ERROR', { + module_id: module_id + }); + }); + } +}); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..80952b9 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,504 @@ +{ + "name": "MMM-idos", + "version": "0.0.2", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/node": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.4.tgz", + "integrity": "sha512-k3NqigXWRzQZVBDS5D1U70A5E8Qk4Kh+Ha/x4M8Bt9pF0X05eggfnC9+63Usc9Q928hRUIpIhTQaXsZwZBl4Ew==" + }, + "@types/yauzl": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", + "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "bl": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", + "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "cheerio": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", + "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.1", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" + }, + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "requires": { + "ms": "2.1.2" + } + }, + "devtools-protocol": { + "version": "0.0.799653", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.799653.tgz", + "integrity": "sha512-t1CcaZbvm8pOlikqrsIM9GOa7Ipp07+4h/q9u0JXBWjPCjHdBl9KkddX87Vv9vBHoBGtwV79sYQNGnQM6iS5gg==" + }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + } + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "requires": { + "pend": "~1.2.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "requires": { + "agent-base": "5", + "debug": "4" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "parse5": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "requires": { + "@types/node": "*" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "puppeteer": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-5.3.1.tgz", + "integrity": "sha512-YTM1RaBeYrj6n7IlRXRYLqJHF+GM7tasbvrNFx6w1S16G76NrPq7oYFKLDO+BQsXNtS8kW2GxWCXjIMPvfDyaQ==", + "requires": { + "debug": "^4.1.0", + "devtools-protocol": "0.0.799653", + "extract-zip": "^2.0.0", + "https-proxy-agent": "^4.0.0", + "pkg-dir": "^4.2.0", + "progress": "^2.0.1", + "proxy-from-env": "^1.0.0", + "rimraf": "^3.0.2", + "tar-fs": "^2.0.0", + "unbzip2-stream": "^1.3.3", + "ws": "^7.2.3" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "tar-fs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz", + "integrity": "sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==", + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + } + }, + "tar-stream": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.4.tgz", + "integrity": "sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "tor": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tor/-/tor-0.0.1.tgz", + "integrity": "sha1-26Z5bX+JDZOZ4W3W5YfKTl9fvwE=" + }, + "unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==" + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..45ea985 --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "MMM-idos", + "version": "1.0.0", + "description": "Display estimations for public transport stops in the Czech republic.", + "repository": { + "type": "git", + "url": "git+https://github.com/soyrubio/MMM-idos.git" + }, + "keywords": [ + "MagicMirror", + "bus stop", + "tram stop", + "czech republic", + "public transport" + ], + "author": "elrubio", + "license": "MIT", + "bugs": { + "url": "https://github.com/soyrubio/MMM-idos/issues" + }, + "homepage": "https://github.com/soyrubio/MMM-idos", + "dependencies": { + "cheerio": "^1.0.0-rc.3", + "puppeteer": "^5.3.1", + "tor": "0.0.1" + } +} diff --git a/translations/cz.json b/translations/cz.json new file mode 100644 index 0000000..db98426 --- /dev/null +++ b/translations/cz.json @@ -0,0 +1,4 @@ +{ + "IDOS_NO_LINES": "Žádné odchody", + "IDOS_FETCH_ERROR": "Nepodařilo se stáhnout data" +} diff --git a/translations/en.json b/translations/en.json new file mode 100644 index 0000000..42581de --- /dev/null +++ b/translations/en.json @@ -0,0 +1,4 @@ +{ + "IDOS_NO_LINES": "No lines at the moment", + "IDOS_FETCH_ERROR": "Failed to fetch data" +} diff --git a/translations/sk.json b/translations/sk.json new file mode 100644 index 0000000..4d22b8c --- /dev/null +++ b/translations/sk.json @@ -0,0 +1,4 @@ +{ + "IDOS_NO_LINES": "Aktuálne žiadne spoje", + "IDOS_FETCH_ERROR": "Nepodarilo sa stiahnuť dáta" +}