diff --git a/CHANGELOG.md b/CHANGELOG.md index 92cd15bc..082c8c9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Changed 'compliments.js' - update DOM if remote compliments are loaded instead of waiting one updateInterval to show custom compliments - Automated unit tests utils, deprecated, translator, cloneObject(lockstrings) - Automated integration tests translations +- Add advanced filtering to the excludedEvents configuration of the default calendar module - New currentweather module config option: `showFeelsLike`: Shows how it actually feels like. (wind chill or heat index) - New currentweather module config option: `useKMPHwind`: adds an option to see wind speed in Kmph instead of just m/s or Beaufort. @@ -21,9 +22,11 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Add link to GitHub repository which contains the respective Dockerfile. - Optimized automated unit tests cloneObject, cmpVersions - Update notifications use now translation templates instead of normal strings. +- Yarn can be used now as an installation tool ### Fixed - News article in fullscreen (iframe) is now shown in front of modules. +- Add dc:date to parsing in newsfeed module, which allows parsing of more rss feeds. *This release is scheduled to be released on 2018-04-01.* diff --git a/README.md b/README.md index 4c47c972..b795ab97 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ bash -c "$(curl -sL https://raw.githubusercontent.com/MichMich/MagicMirror/maste 1. Download and install the latest *Node.js* version. 2. Clone the repository and check out the master branch: `git clone https://github.com/MichMich/MagicMirror` -3. Enter the repository: `cd ~/MagicMirror` +3. Enter the repository: `cd MagicMirror/` 4. Install and run the app with: `npm install && npm start` \ For **Server Only** use: `npm install && node serveronly` . @@ -179,10 +179,6 @@ git pull && npm install If you changed nothing more than the config or the modules, this should work without any problems. Type `git status` to see your changes, if there are any, you can reset them with `git reset --hard`. After that, git pull should be possible. -## Known issues - -- Electron seems to have some issues on certain Raspberry Pi 2's. See [#145](https://github.com/MichMich/MagicMirror/issues/145). -- MagicMirror² (Electron) sometimes quits without an error after an extended period of use. See [#150](https://github.com/MichMich/MagicMirror/issues/150). ## Community diff --git a/installers/raspberry.sh b/installers/raspberry.sh index ecdcc842..4e9c20d8 100644 --- a/installers/raspberry.sh +++ b/installers/raspberry.sh @@ -42,7 +42,7 @@ sudo apt-get update || echo -e "\e[91mUpdate failed, carrying on installation .. # Installing helper tools echo -e "\e[96mInstalling helper tools ...\e[90m" -sudo apt-get install curl wget git build-essential unzip || exit +sudo apt-get --assume-yes install curl wget git build-essential unzip || exit # Check if we need to install or upgrade Node.js. echo -e "\e[96mCheck current Node installation ...\e[0m" @@ -82,7 +82,7 @@ if $NODE_INSTALL; then # The NODE_STABLE_BRANCH variable will need to be manually adjusted when a new branch is released. (e.g. 7.x) # Only tested (stable) versions are recommended as newer versions could break MagicMirror. - NODE_STABLE_BRANCH="6.x" + NODE_STABLE_BRANCH="9.x" curl -sL https://deb.nodesource.com/setup_$NODE_STABLE_BRANCH | sudo -E bash - sudo apt-get install -y nodejs echo -e "\e[92mNode.js installation Done!\e[0m" @@ -101,7 +101,7 @@ if [ -d "$HOME/MagicMirror" ] ; then fi echo -e "\e[96mCloning MagicMirror ...\e[90m" -if git clone https://github.com/MichMich/MagicMirror.git; then +if git clone --depth=1 https://github.com/MichMich/MagicMirror.git; then echo -e "\e[92mCloning MagicMirror Done!\e[0m" else echo -e "\e[91mUnable to clone MagicMirror." @@ -149,7 +149,7 @@ else fi # Use pm2 control like a service MagicMirror -read -p "Do you want use pm2 for auto starting of your MagicMirror (y/n)?" choice +read -p "Do you want use pm2 for auto starting of your MagicMirror (y/N)?" choice if [[ $choice =~ ^[Yy]$ ]]; then sudo npm install -g pm2 sudo su -c "env PATH=$PATH:/usr/bin pm2 startup linux -u pi --hp /home/pi" diff --git a/modules/default/calendar/README.md b/modules/default/calendar/README.md index 8ce9608b..2481b77b 100644 --- a/modules/default/calendar/README.md +++ b/modules/default/calendar/README.md @@ -46,7 +46,7 @@ The following properties can be configured: | `urgency` | When using a timeFormat of `absolute`, the `urgency` setting allows you to display events within a specific time frame as `relative`. This allows events within a certain time frame to be displayed as relative (in xx days) while others are displayed as absolute dates

**Possible values:** a positive integer representing the number of days for which you want a relative date, for example `7` (for 7 days)

**Default value:** `7` | `broadcastEvents` | If this property is set to true, the calendar will broadcast all the events to all other modules with the notification message: `CALENDAR_EVENTS`. The event objects are stored in an array and contain the following fields: `title`, `startDate`, `endDate`, `fullDayEvent`, `location` and `geo`.

**Possible values:** `true`, `false`

**Default value:** `true` | `hidePrivate` | Hides private calendar events.

**Possible values:** `true` or `false`
**Default value:** `false` -| `excludedEvents` | An array of words / phrases from event titles that will be excluded from being shown.

**Example:** `['Birthday', 'Hide This Event']`
**Default value:** `[]` +| `excludedEvents` | An array of words / phrases from event titles that will be excluded from being shown.

Additionally advanced filter objects can be passed in. Below is the configuration for the advance filtering object.
**Required**
`filterBy` - string used to determine if filter is applied.
**Optional**
`until` - Time before an event to display it Ex: [`'3 days'`, `'2 months'`, `'1 week'`]
`caseSensitive` - By default, excludedEvents are case insensitive, set this to true to enforce case sensitivity

**Example:** `['Birthday', 'Hide This Event', {filterBy: 'Payment', until: '6 days', caseSensitive: true}]`
**Default value:** `[]` ### Calendar configuration diff --git a/modules/default/calendar/calendarfetcher.js b/modules/default/calendar/calendarfetcher.js index 12495f78..911eaba4 100644 --- a/modules/default/calendar/calendarfetcher.js +++ b/modules/default/calendar/calendarfetcher.js @@ -113,11 +113,38 @@ var CalendarFetcher = function(url, reloadInterval, excludedEvents, maximumEntri title = event.description; } - var excluded = false; + var excluded = false, + dateFilter = null; + for (var f in excludedEvents) { - var filter = excludedEvents[f]; - if (title.toLowerCase().includes(filter.toLowerCase())) { - excluded = true; + var filter = excludedEvents[f], + testTitle = title.toLowerCase(), + until = null; + + if (filter instanceof Object) { + if (typeof filter.until !== "undefined") { + until = filter.until; + } + + // If additional advanced filtering is added in, this section + // must remain last as we overwrite the filter object with the + // filterBy string + if (filter.caseSensitive) { + filter = filter.filterBy; + testTitle = title; + } else { + filter = filter.filterBy.toLowerCase(); + } + } else { + filter = filter.toLowerCase(); + } + + if (testTitle.includes(filter)) { + if (until) { + dateFilter = until; + } else { + excluded = true; + } break; } } @@ -137,6 +164,11 @@ var CalendarFetcher = function(url, reloadInterval, excludedEvents, maximumEntri for (var d in dates) { startDate = moment(new Date(dates[d])); endDate = moment(parseInt(startDate.format("x")) + duration, "x"); + + if (timeFilterApplies(now, endDate, dateFilter)) { + continue; + } + if (endDate.format("x") > now) { newEvents.push({ title: title, @@ -171,6 +203,10 @@ var CalendarFetcher = function(url, reloadInterval, excludedEvents, maximumEntri continue; } + if (timeFilterApplies(now, endDate, dateFilter)) { + continue; + } + // Every thing is good. Add it to the list. newEvents.push({ @@ -236,6 +272,28 @@ var CalendarFetcher = function(url, reloadInterval, excludedEvents, maximumEntri return false; }; + /* timeFilterApplies() + * Determines if the user defined time filter should apply + * + * argument now Date - Date object using previously created object for consistency + * argument endDate Moment - Moment object representing the event end date + * argument filter string - The time to subtract from the end date to determine if an event should be shown + * + * return bool - The event should be filtered out + */ + var timeFilterApplies = function(now, endDate, filter) { + if (filter) { + var until = filter.split(" "), + value = parseInt(until[0]), + increment = until[1].slice("-1") === "s" ? until[1] : until[1] + "s", // Massage the data for moment js + filterUntil = moment(endDate.format()).subtract(value, increment); + + return now < filterUntil.format("x"); + } + + return false; + }; + /* public methods */ /* startFetch() diff --git a/modules/default/newsfeed/fetcher.js b/modules/default/newsfeed/fetcher.js index 0cc73e36..a3bf1fa0 100644 --- a/modules/default/newsfeed/fetcher.js +++ b/modules/default/newsfeed/fetcher.js @@ -45,7 +45,7 @@ var Fetcher = function(url, reloadInterval, encoding) { var title = item.title; var description = item.description || item.summary || item.content || ""; - var pubdate = item.pubdate || item.published || item.updated; + var pubdate = item.pubdate || item.published || item.updated || item["dc:date"]; var url = item.url || item.link || ""; if (title && pubdate) { diff --git a/package.json b/package.json index 9830360e..9da28d23 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,9 @@ "main": "js/electron.js", "scripts": { "start": "sh run-start.sh", - "install": "cd vendor && npm install", - "install-fonts": "cd fonts && npm install", - "postinstall": "sh installers/postinstall/postinstall.sh && npm run install-fonts", + "install": "cd vendor && yon install", + "install-fonts": "cd fonts && yon install", + "postinstall": "sh installers/postinstall/postinstall.sh && yon run install-fonts", "test": "NODE_ENV=test ./node_modules/mocha/bin/mocha tests --recursive", "test:unit": "NODE_ENV=test ./node_modules/mocha/bin/mocha tests/unit --recursive", "test:e2e": "NODE_ENV=test ./node_modules/mocha/bin/mocha tests/e2e --recursive", @@ -52,7 +52,8 @@ "spectron": "3.7.x", "stylelint": "^8.4.0", "stylelint-config-standard": "latest", - "time-grunt": "latest" + "time-grunt": "latest", + "yarn-or-npm": "^2.0.4" }, "dependencies": { "body-parser": "^1.18.2",