diff --git a/CHANGELOG.md b/CHANGELOG.md
index 07d1f2f3..fd4d7ed9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -23,13 +23,13 @@ This project adheres to [Semantic Versioning](http://semver.org/).
- Restructured Test Suite
### Added
-- Added Docker support (Pull Request [#673](https://github.com/MichMich/MagicMirror/pull/673))
-- Calendar-specific support for `maximumEntries`, and ` maximumNumberOfDays`
+- Added Docker support (Pull Request [#673](https://github.com/MichMich/MagicMirror/pull/673)).
+- Calendar-specific support for `maximumEntries`, and ` maximumNumberOfDays`.
- Add loaded function to modules, providing an async callback.
- Made default newsfeed module aware of gesture events from [MMM-Gestures](https://github.com/thobach/MMM-Gestures)
-- Add use pm2 for manager process into Installer RaspberryPi script
-- Russian Translation
-- Afrikaans Translation
+- Add use pm2 for manager process into Installer RaspberryPi script.
+- Russian Translation.
+- Afrikaans Translation.
- Add postinstall script to notify user that MagicMirror installed successfully despite warnings from NPM.
- Init tests using mocha.
- Option to use RegExp in Calendar's titleReplace.
@@ -37,28 +37,30 @@ This project adheres to [Semantic Versioning](http://semver.org/).
- Icelandic Translation.
- Add use a script to prevent when is run by SSH session set DISPLAY enviroment.
- Enable ability to set configuration file by the enviroment variable called MM_CONFIG_FILE.
-- Option to give each calendar a different color
-- Option for colored min-temp and max-temp
-- Add test e2e helloworld
-- Add test e2e enviroment
-- Add `chai-as-promised` npm module to devDependencies
-- Basic set of tests for clock module
-- Run e2e test in Travis
+- Option to give each calendar a different color.
+- Option for colored min-temp and max-temp.
+- Add test e2e helloworld.
+- Add test e2e enviroment.
+- Add `chai-as-promised` npm module to devDependencies.
+- Basic set of tests for clock module.
+- Run e2e test in Travis.
- Estonian Translation.
-- Add test for compliments module for parts of day
+- Add test for compliments module for parts of day.
- Korean Translation.
-- Added console warning on startup when deprecated config options are used
-- Add option to display temperature unit label to the current weather module
-- Added ability to disable wrapping of news items
+- Added console warning on startup when deprecated config options are used.
+- Add option to display temperature unit label to the current weather module.
+- Added ability to disable wrapping of news items.
- Added in the ability to hide events in the calendar module based on simple string filters.
- Updated Norwegian translation.
-- Added hideLoading option for News Feed module
+- Added hideLoading option for News Feed module.
- Added configurable dateFormat to clock module.
- Added multiple calendar icon support.
- Added tests for Translations, dev argument, version, dev console.
- Added test anytime feature compliments module.
- Added test ipwhitelist configuration directive.
- Added test for calendar module: default, basic-auth, backward compability, fail-basic-auth.
+- Added meta tags to support fullscreen mode on iOS (for server mode)
+- Added `ignoreOldItems` and `ignoreOlderThan` options to the News Feed module
### Fixed
- Update .gitignore to not ignore default modules folder.
@@ -67,7 +69,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
- Fix an issue where the analog clock looked scrambled. ([#611](https://github.com/MichMich/MagicMirror/issues/611))
- If units is set to imperial, the showRainAmount option of weatherforecast will show the correct unit.
- Module currentWeather: check if temperature received from api is defined.
-- Fix an issue with module hidden status changing to `true` although lock string prevented showing it
+- Fix an issue with module hidden status changing to `true` although lock string prevented showing it.
- Fix newsfeed module bug (removeStartTags)
- Fixed missing animation on `this.show(speed)` when module is alone in a region.
diff --git a/css/main.css b/css/main.css
index 01d40aec..49bfe611 100644
--- a/css/main.css
+++ b/css/main.css
@@ -1,6 +1,7 @@
html {
cursor: none;
overflow: hidden;
+ background: #000;
}
::-webkit-scrollbar {
diff --git a/index.html b/index.html
index 606f5aac..85951a85 100644
--- a/index.html
+++ b/index.html
@@ -4,6 +4,12 @@
Magic Mirror
+
+
+
+
+
+
diff --git a/modules/default/newsfeed/README.md b/modules/default/newsfeed/README.md
index 9f7b2e7d..7c4ad48d 100644
--- a/modules/default/newsfeed/README.md
+++ b/modules/default/newsfeed/README.md
@@ -70,6 +70,8 @@ The following properties can be configured:
| `updateInterval` | How often do you want to display a new headline? (Milliseconds)
**Possible values:**`1000` - `60000` **Default value:** `10000` (10 seconds)
| `animationSpeed` | Speed of the update animation. (Milliseconds)
**Possible values:**`0` - `5000` **Default value:** `2500` (2.5 seconds)
| `maxNewsItems` | Total amount of news items to cycle through. (0 for unlimited)
**Possible values:**`0` - `...` **Default value:** `0`
+| `ignoreOldItems` | Ignore news items that are outdated.
**Possible values:**`true` or `false **Default value:** `false`
+| `ignoreOlderThan` | How old should news items be before they are considered outdated? (Milliseconds)
**Possible values:**`1` - `...` **Default value:** `86400000` (1 day)
| `removeStartTags` | Some newsfeeds feature tags at the **beginning** of their titles or descriptions, such as _[VIDEO]_. This setting allows for the removal of specified tags from the beginning of an item's description and/or title.
**Possible values:**`'title'`, `'description'`, `'both'`
| `startTags` | List the tags you would like to have removed at the beginning of the feed item
**Possible values:** `['TAG']` or `['TAG1','TAG2',...]`
| `removeEndTags` | Remove specified tags from the **end** of an item's description and/or title.
**Possible values:**`'title'`, `'description'`, `'both'`
diff --git a/modules/default/newsfeed/newsfeed.js b/modules/default/newsfeed/newsfeed.js
index 5094355e..b7ec2f58 100644
--- a/modules/default/newsfeed/newsfeed.js
+++ b/modules/default/newsfeed/newsfeed.js
@@ -28,6 +28,8 @@ Module.register("newsfeed",{
updateInterval: 10 * 1000,
animationSpeed: 2.5 * 1000,
maxNewsItems: 0, // 0 for unlimited
+ ignoreOldItems: false,
+ ignoreOlderThan: 24 * 60 * 60 * 1000, // 1 day
removeStartTags: "",
removeEndTags: "",
startTags: [],
@@ -226,7 +228,9 @@ Module.register("newsfeed",{
for (var i in feedItems) {
var item = feedItems[i];
item.sourceTitle = this.titleForFeed(feed);
- newsItems.push(item);
+ if (!(this.config.ignoreOldItems && ((Date.now() - new Date(item.pubdate)) > this.config.ignoreOlderThan))) {
+ newsItems.push(item);
+ }
}
}
}
diff --git a/package.json b/package.json
index 7a1e7641..a190f12d 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "magicmirror",
"version": "2.1.1",
- "description": "A modular interface for smart mirrors.",
+ "description": "The open source modular smart mirror platform.",
"main": "js/electron.js",
"scripts": {
"start": "sh run-start.sh",
diff --git a/tests/configs/modules/positions.js b/tests/configs/modules/positions.js
new file mode 100644
index 00000000..7d0188c2
--- /dev/null
+++ b/tests/configs/modules/positions.js
@@ -0,0 +1,43 @@
+/* Magic Mirror Test config for position setters module
+ *
+ * For this case is using helloworld module
+ *
+ * By Rodrigo Ramírez Norambuena https://rodrigoramirez.com
+ * MIT Licensed.
+ */
+
+
+var config = {
+ port: 8080,
+ ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"],
+ ipWhitelist: [],
+
+ language: "en",
+ timeFormat: 24,
+ units: "metric",
+ electronOptions: {
+ webPreferences: {
+ nodeIntegration: true,
+ },
+ },
+ modules:
+ // Using exotic content. This is why dont accept go to JSON configuration file
+ (function() {
+ var positions = ["top_bar", "top_left", "top_center", "top_right", "upper_third",
+ "middle_center", "lower_third", "bottom_left", "bottom_center", "bottom_right",
+ "bottom_bar", "fullscreen_above", "fullscreen_below"];
+ var modules = Array();
+ for (idx in positions) {
+ modules.push({
+ module: "helloworld",
+ position: positions[idx],
+ config: {
+ text: "Text in " + positions[idx]
+ }
+ });
+ }
+ return modules;
+ })(),
+};
+/*************** DO NOT EDIT THE LINE BELOW ***************/
+if (typeof module !== "undefined") {module.exports = config;}
diff --git a/tests/configs/port_8090.js b/tests/configs/port_8090.js
new file mode 100644
index 00000000..6646dff7
--- /dev/null
+++ b/tests/configs/port_8090.js
@@ -0,0 +1,25 @@
+/* Magic Mirror Test config sample enviroment set por 8090
+ *
+ * By Rodrigo Ramírez Norambuena https://rodrigoramirez.com
+ * MIT Licensed.
+ */
+
+var config = {
+ port: 8090,
+ ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"],
+
+ language: "en",
+ timeFormat: 24,
+ units: "metric",
+ electronOptions: {
+ webPreferences: {
+ nodeIntegration: true,
+ },
+ },
+
+ modules: [
+ ]
+};
+
+/*************** DO NOT EDIT THE LINE BELOW ***************/
+if (typeof module !== "undefined") {module.exports = config;}
diff --git a/tests/e2e/env_spec.js b/tests/e2e/env_spec.js
index 99a7f657..202bd5e4 100644
--- a/tests/e2e/env_spec.js
+++ b/tests/e2e/env_spec.js
@@ -1,5 +1,8 @@
const globalSetup = require("./global-setup");
const app = globalSetup.app;
+const request = require("request");
+const chai = require("chai");
+const expect = chai.expect;
describe("Electron app environment", function () {
this.timeout(20000);
@@ -17,7 +20,6 @@ describe("Electron app environment", function () {
app.stop().then(function() { done(); });
});
-
it("is set to open new app window", function () {
return app.client.waitUntilWindowLoaded()
.getWindowCount().should.eventually.equal(1);
@@ -28,4 +30,18 @@ describe("Electron app environment", function () {
.getTitle().should.eventually.equal("Magic Mirror");
});
+ it("get request from http://localhost:8080 should return 200", function (done) {
+ request.get("http://localhost:8080", function (err, res, body) {
+ expect(res.statusCode).to.equal(200);
+ done();
+ });
+ });
+
+ it("get request from http://localhost:8080/nothing should return 404", function (done) {
+ request.get("http://localhost:8080/nothing", function (err, res, body) {
+ expect(res.statusCode).to.equal(404);
+ done();
+ });
+ });
+
});
diff --git a/tests/e2e/modules_position_spec.js b/tests/e2e/modules_position_spec.js
new file mode 100644
index 00000000..a781388a
--- /dev/null
+++ b/tests/e2e/modules_position_spec.js
@@ -0,0 +1,42 @@
+const globalSetup = require("./global-setup");
+const app = globalSetup.app;
+const chai = require("chai");
+const expect = chai.expect;
+
+describe("Position of modules", function () {
+ this.timeout(20000);
+
+
+ beforeEach(function (done) {
+ app.start().then(function() { done(); } );
+ });
+
+ afterEach(function (done) {
+ app.stop().then(function() { done(); });
+ });
+
+
+ describe("Using helloworld", function() {
+
+ before(function() {
+ // Set config sample for use in test
+ process.env.MM_CONFIG_FILE = "tests/configs/modules/positions.js";
+ });
+
+ var positions = ["top_bar", "top_left", "top_center", "top_right", "upper_third",
+ "middle_center", "lower_third", "bottom_left", "bottom_center", "bottom_right",
+ "bottom_bar", "fullscreen_above", "fullscreen_below"];
+
+ var position;
+ var className;
+ for (idx in positions) {
+ position = positions[idx];
+ className = position.replace("_", ".");
+ it("show text in " + position , function () {
+ return app.client.waitUntilWindowLoaded()
+ .getText("." + className).should.eventually.equal("Text in " + position);
+ });
+ }
+ });
+
+});
diff --git a/tests/e2e/port_config.js b/tests/e2e/port_config.js
new file mode 100644
index 00000000..c0806e85
--- /dev/null
+++ b/tests/e2e/port_config.js
@@ -0,0 +1,32 @@
+const globalSetup = require("./global-setup");
+const app = globalSetup.app;
+const request = require("request");
+const chai = require("chai");
+const expect = chai.expect;
+
+
+describe("port directive configuration", function () {
+
+ this.timeout(20000);
+
+ beforeEach(function (done) {
+ app.start().then(function() { done(); } );
+ });
+
+ afterEach(function (done) {
+ app.stop().then(function() { done(); });
+ });
+
+ describe("Set port 8090", function () {
+ before(function() {
+ // Set config sample for use in this test
+ process.env.MM_CONFIG_FILE = "tests/configs/port_8090.js";
+ });
+ it("should return 200", function (done) {
+ request.get("http://localhost:8090", function (err, res, body) {
+ expect(res.statusCode).to.equal(200);
+ done();
+ });
+ });
+ });
+});