[READ-ONLY] Mirror of https://github.com/probablykasper/yt-email-notifier. macOS menubar app for YouTube upload notification emails
email menubar notifications tray youtube
0

Configure Feed

Select the types of activity you want to include in your feed.

Added logging and launch on startup option

Kasper (Aug 26, 2020, 6:09 PM +0200) 3b6fa47b 8e16a83c

+307 -43
+10 -6
main.js
··· 1 - const menubar = require('./src/menubar.js') 1 + const logger = require('./src/logger.js') 2 2 3 - console.log('Hello World') 3 + try { 4 + const menubar = require('./src/menubar.js') 4 5 5 - menubar.init({ 6 - openServerNow: true, 7 - openBrowserNow: false, 8 - }) 6 + menubar.init({ 7 + openServerNow: true, 8 + openBrowserNow: false, 9 + }) 10 + } catch(err) { 11 + logger.error(err) 12 + }
+212 -19
package-lock.json
··· 97 97 "regenerator-runtime": "^0.13.4" 98 98 } 99 99 }, 100 + "@dabh/diagnostics": { 101 + "version": "2.0.2", 102 + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", 103 + "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", 104 + "requires": { 105 + "colorspace": "1.1.x", 106 + "enabled": "2.0.x", 107 + "kuler": "^2.0.0" 108 + } 109 + }, 100 110 "@hapi/address": { 101 111 "version": "4.1.0", 102 112 "resolved": "https://registry.npmjs.org/@hapi/address/-/address-4.1.0.tgz", ··· 229 239 "path-exists": "^4.0.0", 230 240 "repeat-string": "^1.5.4" 231 241 } 242 + }, 243 + "applescript": { 244 + "version": "1.0.0", 245 + "resolved": "https://registry.npmjs.org/applescript/-/applescript-1.0.0.tgz", 246 + "integrity": "sha1-u4evVoytA0pOSMS9r2Bno6JwExc=" 232 247 }, 233 248 "archiver": { 234 249 "version": "5.0.0", ··· 330 345 "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 331 346 "dev": true 332 347 }, 348 + "auto-launch": { 349 + "version": "5.0.5", 350 + "resolved": "https://registry.npmjs.org/auto-launch/-/auto-launch-5.0.5.tgz", 351 + "integrity": "sha512-ppdF4mihhYzMYLuCcx9H/c5TUOCev8uM7en53zWVQhyYAJrurd2bFZx3qQVeJKF2jrc7rsPRNN5cD+i23l6PdA==", 352 + "requires": { 353 + "applescript": "^1.0.0", 354 + "mkdirp": "^0.5.1", 355 + "path-is-absolute": "^1.0.0", 356 + "untildify": "^3.0.2", 357 + "winreg": "1.2.4" 358 + } 359 + }, 333 360 "aws-sign2": { 334 361 "version": "0.7.0", 335 362 "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", ··· 539 566 "supports-color": "^7.1.0" 540 567 } 541 568 }, 569 + "color": { 570 + "version": "3.0.0", 571 + "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", 572 + "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", 573 + "requires": { 574 + "color-convert": "^1.9.1", 575 + "color-string": "^1.5.2" 576 + }, 577 + "dependencies": { 578 + "color-convert": { 579 + "version": "1.9.3", 580 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 581 + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 582 + "requires": { 583 + "color-name": "1.1.3" 584 + } 585 + }, 586 + "color-name": { 587 + "version": "1.1.3", 588 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 589 + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 590 + } 591 + } 592 + }, 542 593 "color-convert": { 543 594 "version": "2.0.1", 544 595 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", ··· 551 602 "color-name": { 552 603 "version": "1.1.4", 553 604 "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 554 - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 555 - "dev": true 605 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 606 + }, 607 + "color-string": { 608 + "version": "1.5.3", 609 + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", 610 + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", 611 + "requires": { 612 + "color-name": "^1.0.0", 613 + "simple-swizzle": "^0.2.2" 614 + } 615 + }, 616 + "colors": { 617 + "version": "1.4.0", 618 + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", 619 + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" 620 + }, 621 + "colorspace": { 622 + "version": "1.1.2", 623 + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", 624 + "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", 625 + "requires": { 626 + "color": "3.0.x", 627 + "text-hex": "1.0.x" 628 + } 556 629 }, 557 630 "combined-stream": { 558 631 "version": "1.0.8", ··· 628 701 "core-util-is": { 629 702 "version": "1.0.2", 630 703 "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 631 - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 632 - "dev": true 704 + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 633 705 }, 634 706 "crc": { 635 707 "version": "3.8.0", ··· 789 861 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 790 862 "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 791 863 "dev": true 864 + }, 865 + "enabled": { 866 + "version": "2.0.0", 867 + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", 868 + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" 792 869 }, 793 870 "encode-utf8": { 794 871 "version": "1.0.3", ··· 1160 1237 "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 1161 1238 "dev": true 1162 1239 }, 1240 + "fast-safe-stringify": { 1241 + "version": "2.0.7", 1242 + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", 1243 + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" 1244 + }, 1163 1245 "fastq": { 1164 1246 "version": "1.8.0", 1165 1247 "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", ··· 1168 1250 "requires": { 1169 1251 "reusify": "^1.0.4" 1170 1252 } 1253 + }, 1254 + "fecha": { 1255 + "version": "4.2.0", 1256 + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz", 1257 + "integrity": "sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg==" 1171 1258 }, 1172 1259 "file-entry-cache": { 1173 1260 "version": "5.0.1", ··· 1241 1328 "requires": { 1242 1329 "imul": "^1.0.0" 1243 1330 } 1331 + }, 1332 + "fn.name": { 1333 + "version": "1.1.0", 1334 + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", 1335 + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" 1244 1336 }, 1245 1337 "forever-agent": { 1246 1338 "version": "0.6.1", ··· 1523 1615 "p-is-promise": "^3.0.0" 1524 1616 } 1525 1617 }, 1618 + "is-arrayish": { 1619 + "version": "0.3.2", 1620 + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", 1621 + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" 1622 + }, 1526 1623 "is-extglob": { 1527 1624 "version": "2.1.1", 1528 1625 "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", ··· 1590 1687 "isarray": { 1591 1688 "version": "1.0.0", 1592 1689 "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1593 - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1594 - "dev": true 1690 + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1595 1691 }, 1596 1692 "isexe": { 1597 1693 "version": "2.0.0", ··· 1697 1793 "verror": "1.10.0" 1698 1794 } 1699 1795 }, 1796 + "kuler": { 1797 + "version": "2.0.0", 1798 + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", 1799 + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" 1800 + }, 1700 1801 "lazystream": { 1701 1802 "version": "1.0.0", 1702 1803 "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", ··· 1752 1853 "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=", 1753 1854 "dev": true 1754 1855 }, 1856 + "logform": { 1857 + "version": "2.2.0", 1858 + "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", 1859 + "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", 1860 + "requires": { 1861 + "colors": "^1.2.1", 1862 + "fast-safe-stringify": "^2.0.4", 1863 + "fecha": "^4.2.0", 1864 + "ms": "^2.1.1", 1865 + "triple-beam": "^1.3.0" 1866 + } 1867 + }, 1755 1868 "macos-alias": { 1756 1869 "version": "0.2.11", 1757 1870 "resolved": "https://registry.npmjs.org/macos-alias/-/macos-alias-0.2.11.tgz", ··· 1812 1925 "minimist": { 1813 1926 "version": "1.2.5", 1814 1927 "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1815 - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 1816 - "dev": true 1928 + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 1817 1929 }, 1818 1930 "mkdirp": { 1819 1931 "version": "0.5.5", 1820 1932 "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 1821 1933 "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 1822 - "dev": true, 1823 1934 "requires": { 1824 1935 "minimist": "^1.2.5" 1825 1936 } ··· 1919 2030 "wrappy": "1" 1920 2031 } 1921 2032 }, 2033 + "one-time": { 2034 + "version": "1.0.0", 2035 + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", 2036 + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", 2037 + "requires": { 2038 + "fn.name": "1.x.x" 2039 + } 2040 + }, 1922 2041 "opener": { 1923 2042 "version": "1.5.1", 1924 2043 "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", ··· 1996 2115 "path-is-absolute": { 1997 2116 "version": "1.0.1", 1998 2117 "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1999 - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 2000 - "dev": true 2118 + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 2001 2119 }, 2002 2120 "path-key": { 2003 2121 "version": "3.1.1", ··· 2095 2213 "process-nextick-args": { 2096 2214 "version": "2.0.1", 2097 2215 "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 2098 - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 2099 - "dev": true 2216 + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 2100 2217 }, 2101 2218 "progress": { 2102 2219 "version": "2.0.3", ··· 2181 2298 "version": "2.3.7", 2182 2299 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 2183 2300 "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 2184 - "dev": true, 2185 2301 "requires": { 2186 2302 "core-util-is": "~1.0.0", 2187 2303 "inherits": "~2.0.3", ··· 2295 2411 "safe-buffer": { 2296 2412 "version": "5.1.2", 2297 2413 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2298 - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 2299 - "dev": true 2414 + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 2300 2415 }, 2301 2416 "safer-buffer": { 2302 2417 "version": "2.1.2", ··· 2399 2514 "plist": "^3.0.1" 2400 2515 } 2401 2516 }, 2517 + "simple-swizzle": { 2518 + "version": "0.2.2", 2519 + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", 2520 + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", 2521 + "requires": { 2522 + "is-arrayish": "^0.3.1" 2523 + } 2524 + }, 2402 2525 "slash": { 2403 2526 "version": "3.0.0", 2404 2527 "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", ··· 2471 2594 "safer-buffer": "^2.0.2", 2472 2595 "tweetnacl": "~0.14.0" 2473 2596 } 2597 + }, 2598 + "stack-trace": { 2599 + "version": "0.0.10", 2600 + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", 2601 + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" 2474 2602 }, 2475 2603 "statuses": { 2476 2604 "version": "1.5.0", ··· 2524 2652 "version": "1.1.1", 2525 2653 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2526 2654 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2527 - "dev": true, 2528 2655 "requires": { 2529 2656 "safe-buffer": "~5.1.0" 2530 2657 } ··· 2631 2758 } 2632 2759 } 2633 2760 }, 2761 + "text-hex": { 2762 + "version": "1.0.0", 2763 + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", 2764 + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" 2765 + }, 2634 2766 "text-table": { 2635 2767 "version": "0.2.0", 2636 2768 "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", ··· 2676 2808 "punycode": "^2.1.1" 2677 2809 } 2678 2810 }, 2811 + "triple-beam": { 2812 + "version": "1.3.0", 2813 + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", 2814 + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" 2815 + }, 2679 2816 "tunnel-agent": { 2680 2817 "version": "0.6.0", 2681 2818 "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", ··· 2760 2897 "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2761 2898 "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 2762 2899 }, 2900 + "untildify": { 2901 + "version": "3.0.3", 2902 + "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", 2903 + "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==" 2904 + }, 2763 2905 "uri-js": { 2764 2906 "version": "4.2.2", 2765 2907 "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", ··· 2772 2914 "util-deprecate": { 2773 2915 "version": "1.0.2", 2774 2916 "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2775 - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 2776 - "dev": true 2917 + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 2777 2918 }, 2778 2919 "utils-merge": { 2779 2920 "version": "1.0.1", ··· 2810 2951 "dev": true, 2811 2952 "requires": { 2812 2953 "isexe": "^2.0.0" 2954 + } 2955 + }, 2956 + "winreg": { 2957 + "version": "1.2.4", 2958 + "resolved": "https://registry.npmjs.org/winreg/-/winreg-1.2.4.tgz", 2959 + "integrity": "sha1-ugZWKbepJRMOFXeRCM9UCZDpjRs=" 2960 + }, 2961 + "winston": { 2962 + "version": "3.3.3", 2963 + "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", 2964 + "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", 2965 + "requires": { 2966 + "@dabh/diagnostics": "^2.0.2", 2967 + "async": "^3.1.0", 2968 + "is-stream": "^2.0.0", 2969 + "logform": "^2.2.0", 2970 + "one-time": "^1.0.0", 2971 + "readable-stream": "^3.4.0", 2972 + "stack-trace": "0.0.x", 2973 + "triple-beam": "^1.3.0", 2974 + "winston-transport": "^4.4.0" 2975 + }, 2976 + "dependencies": { 2977 + "async": { 2978 + "version": "3.2.0", 2979 + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", 2980 + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" 2981 + }, 2982 + "is-stream": { 2983 + "version": "2.0.0", 2984 + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", 2985 + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" 2986 + }, 2987 + "readable-stream": { 2988 + "version": "3.6.0", 2989 + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 2990 + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 2991 + "requires": { 2992 + "inherits": "^2.0.3", 2993 + "string_decoder": "^1.1.1", 2994 + "util-deprecate": "^1.0.1" 2995 + } 2996 + } 2997 + } 2998 + }, 2999 + "winston-transport": { 3000 + "version": "4.4.0", 3001 + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", 3002 + "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", 3003 + "requires": { 3004 + "readable-stream": "^2.3.7", 3005 + "triple-beam": "^1.2.0" 2813 3006 } 2814 3007 }, 2815 3008 "word-wrap": {
+2
package.json
··· 28 28 } 29 29 }, 30 30 "dependencies": { 31 + "auto-launch": "^5.0.5", 31 32 "body-parser": "^1.19.0", 32 33 "connect": "^3.7.0", 33 34 "node-fetch": "^2.6.0", 34 35 "opener": "^1.5.1", 35 36 "serve-static": "^1.14.1", 36 37 "systray": "^1.0.5", 38 + "winston": "^3.3.3", 37 39 "ws": "^7.3.1" 38 40 }, 39 41 "devDependencies": {
+18
src/logger.js
··· 1 + const winston = require('winston') 2 + 3 + const paths = require('./paths') 4 + 5 + module.exports = winston.createLogger({ 6 + level: 'info', 7 + format: winston.format.json(), 8 + transports: [ 9 + new winston.transports.File({ filename: paths.logfileErr, level: 'error' }), 10 + new winston.transports.File({ filename: paths.logfile }), 11 + ], 12 + }) 13 + 14 + if (process.env.APP_ENV === 'dev') { 15 + module.exports.add(new winston.transports.Console({ 16 + format: winston.format.simple(), 17 + })) 18 + }
+42 -3
src/menubar.js
··· 1 1 const SysTrayModule = require('systray') 2 2 const SysTray = SysTrayModule.default 3 3 const opener = require('opener') 4 - 4 + const AutoLaunch = require('auto-launch') 5 5 const server = require('./server.js') 6 + const paths = require('./paths.js') 7 + const logger = require('./logger.js') 6 8 7 9 module.exports.init = async function(options = {}) { 8 10 ··· 11 13 if (options.openBrowserNow) opener('http://localhost:9199') 12 14 } 13 15 16 + const autoLauncher = process.env.APP_ENV === 'dev' 17 + ? null 18 + : new AutoLaunch({ 19 + name: 'YouTube Email Notifier', 20 + path: paths.appBundle, 21 + }) 22 + 14 23 const items = [ 15 24 { 16 25 title: 'Settings', ··· 23 32 }, 24 33 }, 25 34 { 35 + title: 'Launch on Startup', 36 + tooltip: null, 37 + checked: autoLauncher ? await autoLauncher.isEnabled() : false, 38 + enabled: autoLauncher ? true : false, 39 + handler: async (action) => { 40 + if (process.APP_ENV !== 'dev') { 41 + logger.info('appbundle: '+paths.appBundle) 42 + if (!action.item.checked) { 43 + logger.info('launch on startup: enabling') 44 + action.item.checked = true 45 + if (autoLauncher) await autoLauncher.enable() 46 + systray.sendAction({ 47 + type: 'update-item', 48 + item: action.item, 49 + seq_id: action.seq_id, 50 + }) 51 + } else { 52 + logger.info('launch on startup: disabling') 53 + action.item.checked = false 54 + if (autoLauncher) await autoLauncher.disable() 55 + systray.sendAction({ 56 + type: 'update-item', 57 + item: action.item, 58 + seq_id: action.seq_id, 59 + }) 60 + } 61 + } 62 + }, 63 + }, 64 + { 26 65 title: 'Exit', 27 66 tooltip: null, 28 67 checked: false, 29 68 enabled: true, 30 - handler: (systray) => { 69 + handler: (action, systray) => { 31 70 systray.kill() 32 71 }, 33 72 }, ··· 47 86 systray.onClick(action => { 48 87 const index = action.seq_id 49 88 const handler = items[index].handler 50 - if (handler) handler(systray) 89 + if (handler) handler(action, systray) 51 90 }) 52 91 53 92 }
+13 -5
src/paths.js
··· 1 1 const fs = require('fs') 2 2 const path = require('path') 3 + const os = require('os') 3 4 4 5 const paths = {} 5 6 module.exports = paths 6 7 7 8 if (process.env.APP_ENV === 'dev') { 8 - paths.dataDir = path.join(__dirname, '../appfiles/space.kasper.youtube-email-notifier') 9 - paths.settings = path.join(__dirname, '../appfiles/space.kasper.youtube-email-notifier/settings.json') 9 + paths.appDataDir = path.join(__dirname, '../appfiles/Application Support folder') 10 + paths.settings = path.join(paths.appDataDir, 'settings.json') 11 + paths.logfile = path.join(paths.appDataDir, 'all.log') 12 + paths.logfileErr = path.join(paths.appDataDir, 'error.log') 10 13 } else { 11 - paths.dataDir = '~/Library/Application Support/space.kasper.youtube-email-notifier' 12 - paths.settings = path.resolve(paths.dataDir, 'settings.json') 14 + paths.homedir = os.homedir() 15 + paths.appDataDir = path.join(paths.homedir, 'Library/Application Support/YouTube Email Notifier') 16 + paths.settings = path.join(paths.appDataDir, 'settings.json') 17 + paths.logfile = path.join(paths.appDataDir, 'all.log') 18 + paths.logfileErr = path.join(paths.appDataDir, 'error.log') 19 + paths.appBinary = process.execPath 20 + paths.appBundle = path.join(paths.appBinary, '../../..') 13 21 } 14 22 15 - if (!fs.existsSync(paths.dataDir)) fs.mkdirSync(paths.dataDir, { recursive: true }) 23 + if (!fs.existsSync(paths.appDataDir)) fs.mkdirSync(paths.appDataDir, { recursive: true })
+10 -10
src/server.js
··· 5 5 const WebSocket = require('ws') 6 6 const fetch = require('node-fetch') 7 7 const paths = require('./paths.js') 8 + const logger = require('./logger.js') 8 9 9 10 const app = connect() 10 11 app.use(serveStatic('src/web')) ··· 84 85 connection.close(1000, 'old connection') 85 86 } 86 87 connection = ws 87 - console.log('WS Open') 88 + logger.info('WS Open') 88 89 send('newStore', store) 89 90 90 91 ws.on('close', (code, reason) => { 91 92 if (reason === 'old connection') { 92 - console.log('WS Close old connection') 93 + logger.info('WS Close old connection') 93 94 } else { 94 - console.log('WS Close') 95 + logger.info('WS Close') 95 96 setTimeout(() => { 96 97 if (connection === null) { 97 98 module.exports.close() ··· 103 104 104 105 ws.on('message', async (msg) => { 105 106 const { type, data } = JSON.parse(msg) 106 - console.log(`WS "${type}" message received:`, data) 107 + logger.info(`WS "${type}" message received:`, data) 107 108 108 109 try { 109 110 if (type === 'setApiKey') { ··· 148 149 storeUpdate() 149 150 } 150 151 } catch(err) { 151 - console.log(':::err:::') 152 - console.log(err) 152 + logger.error(err) 153 153 send('error', err instanceof Error ? err.toString() : err) 154 154 } 155 155 }) ··· 163 163 module.exports.open = async () => { 164 164 if (isOpen) return 165 165 server = http.createServer(app).listen(port, err => { 166 - if (err) return console.log('ERROR OPENING SERVER') 167 - console.log('Server listening on http://localhost:'+port) 166 + if (err) return logger.error('ERROR OPENING SERVER') 167 + logger.info('Server listening on http://localhost:'+port) 168 168 isOpen = true 169 169 }) 170 170 server.on('upgrade', function upgrade(request, socket, head) { ··· 176 176 177 177 module.exports.close = async () => { 178 178 if (isOpen) { 179 - console.log('Closing server') 179 + logger.info('Closing server') 180 180 server.close() 181 181 isOpen = false 182 182 } else { 183 - console.log('Server close called, but is already closed') 183 + logger.warn('Server close called, but is already closed') 184 184 } 185 185 }