diff --git a/gulpfile.js b/gulpfile.js index def9898..11c9db9 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -9,6 +9,8 @@ const source = require('vinyl-source-stream'); const buffer = require('vinyl-buffer'); const merge = require('merge-stream'); const fs = require('fs'); +const factor = require('factor-bundle'); +const { debug } = require('console'); const $ = gulpLoadPlugins() @@ -25,6 +27,7 @@ const src = { styles: 'src/stylesheets', scripts: 'src/javascript', images: 'src/images', + html: 'src/html', } // Build path @@ -34,6 +37,7 @@ const tmp = { styles: '.tmp/stylesheets', scripts: '.tmp/javascript', images: '.tmp/images', + html: '.tmp/html', } // Dist path @@ -44,18 +48,21 @@ const dist = { styles: 'dist/chrome/stylesheets', scripts: 'dist/chrome/javascript', images: 'dist/chrome/images', + html: 'dist/chrome/html', }, firefox: { root: 'dist/firefox', styles: 'dist/firefox/stylesheets', scripts: 'dist/firefox/javascript', images: 'dist/firefox/images', + html: 'dist/firefox/html', }, opera: { root: 'dist/opera', styles: 'dist/opera/stylesheets', scripts: 'dist/opera/javascript', images: 'dist/opera/images', + html: 'dist/opera/html', }, zip: 'dist/zips', } @@ -108,14 +115,33 @@ gulp.task('styles', () => { }) gulp.task('scripts', () => { - let b = browserify({ - entries: `${src.scripts}/index.js`, - debug: isDev + const modules = [ + 'app', + 'settings', + ]; + + const inputs = []; + const streams = []; + + modules.forEach(module => { + inputs.push(`${src.scripts}/${module}.js`); + streams.push(source(`${module}.js`)); }); - return b.transform('babelify').bundle() + const b = browserify(inputs, { debug: isDev }); + + let outstream = b + .transform('babelify') + .plugin(factor, { outputs: streams }) + .bundle() + .pipe(source('common.js')) + + streams.forEach(stream => { + outstream = outstream.pipe($.merge(stream)); + }); + + return outstream .pipe($.plumber()) - .pipe(source('app.js')) .pipe(buffer()) .pipe($.if(isDev, $.sourcemaps.init({ loadMaps: true }))) .pipe($.terser({ compress: { drop_console: isProd, drop_debugger: isProd } })) @@ -124,7 +150,7 @@ gulp.task('scripts', () => { showFiles: true, })) .pipe($.if(isDev, $.sourcemaps.write())) - .pipe(gulp.dest(`${tmp.scripts}`)) + .pipe(gulp.dest(`${tmp.scripts}`)); }) gulp.task('images', () => { @@ -142,6 +168,16 @@ gulp.task('images', () => { .pipe(gulp.dest(tmp.images)) }) +gulp.task('html', () => { + return gulp.src(`${src.html}/**/*`) + .pipe($.plumber()) + // any steps for HTML processing? + .pipe($.size({ + showFiles: true, + })) + .pipe(gulp.dest(tmp.html)) +}) + gulp.task('manifests', () => { const templateFile = `${src.manifests}/manifest.template.json`; @@ -174,6 +210,8 @@ gulp.task('watch', (done) => { gulp.watch(`${src.images}/**/*`, gulp.series('clean:build', 'images', 'dist:copy', 'dist:zip')) + gulp.watch(`${src.html}/**/*`, gulp.series('clean:build', 'html', 'dist:copy', 'dist:zip')) + gulp.watch(`${src.manifests}/**/*.*`, gulp.series('clean:build', 'manifests', 'dist:copy', 'dist:zip')) done(); @@ -193,7 +231,7 @@ gulp.task('clean', gulp.series('clean:build', 'clean:dist')) BUILD CLEAN ALL ============================================================================ */ -gulp.task('build', gulp.series('manifests', 'images', 'scripts', 'styles')); +gulp.task('build', gulp.series('manifests', 'images', 'scripts', 'styles', 'html')); gulp.task('build:clean', gulp.series('clean:build', 'manifests', 'images', 'scripts', 'styles')); @@ -215,6 +253,10 @@ gulp.task('dist:chrome', (done) => { gulp.src(`${tmp.styles}/*.{min.css,min.css.gz}`) .pipe(gulp.dest(dist.chrome.styles)), + // copy html + gulp.src(`${tmp.html}/*.html`) + .pipe(gulp.dest(dist.chrome.html)), + gulp.src(`${tmp.manifests}/chrome*`) .pipe($.rename('manifest.json')) .pipe(gulp.dest(dist.chrome.root)) @@ -235,6 +277,10 @@ gulp.task('dist:firefox', (done) => { gulp.src(`${tmp.styles}/*.{min.css,min.css.gz}`) .pipe(gulp.dest(dist.firefox.styles)), + // copy html + gulp.src(`${tmp.html}/*.html`) + .pipe(gulp.dest(dist.firefox.html)), + gulp.src(`${tmp.manifests}/firefox*`) .pipe($.rename('manifest.json')) .pipe(gulp.dest(dist.firefox.root)) @@ -255,6 +301,10 @@ gulp.task('dist:opera', (done) => { gulp.src(`${tmp.styles}/*.{min.css,min.css.gz}`) .pipe(gulp.dest(dist.opera.styles)), + // copy html + gulp.src(`${tmp.html}/*.html`) + .pipe(gulp.dest(dist.opera.html)), + gulp.src(`${tmp.manifests}/opera*`) .pipe($.rename('manifest.json')) .pipe(gulp.dest(dist.opera.root)) diff --git a/package-lock.json b/package-lock.json index a020ecc..103da63 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4306,6 +4306,41 @@ "through2": "^2.0.0" } }, + "deps-topo-sort": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/deps-topo-sort/-/deps-topo-sort-0.2.1.tgz", + "integrity": "sha1-S+ivB0dpcWSciwxIT9fUqHuLASo=", + "dev": true, + "requires": { + "JSONStream": "~0.7.1", + "minimist": "0.0.5", + "through": "~2.3.4" + }, + "dependencies": { + "JSONStream": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.7.4.tgz", + "integrity": "sha1-c0KQ5BUR7qfCz+FR+/mlY6l7l4Y=", + "dev": true, + "requires": { + "jsonparse": "0.0.5", + "through": ">=2.2.7 <3" + } + }, + "jsonparse": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", + "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", + "dev": true + }, + "minimist": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.5.tgz", + "integrity": "sha1-16oye87PUY+RBqxrjwA/o7zqhWY=", + "dev": true + } + } + }, "des.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", @@ -5066,6 +5101,228 @@ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, + "factor-bundle": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/factor-bundle/-/factor-bundle-2.5.0.tgz", + "integrity": "sha1-jqiVfaOddYYoPMPuNTzZkRpF53k=", + "dev": true, + "requires": { + "JSONStream": "~0.8.4", + "browser-pack": "^5.0.1", + "defined": "0.0.0", + "deps-topo-sort": "~0.2.1", + "inherits": "^2.0.1", + "isarray": "0.0.1", + "labeled-stream-splicer": "^1.0.0", + "minimist": "~0.2.0", + "nub": "0.0.0", + "outpipe": "^1.1.0", + "reversepoint": "~0.2.0", + "stream-combiner": "~0.2.1", + "through2": "^0.5.1", + "xtend": "^4.0.0" + }, + "dependencies": { + "JSONStream": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", + "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=", + "dev": true, + "requires": { + "jsonparse": "0.0.5", + "through": ">=2.2.7 <3" + }, + "dependencies": { + "jsonparse": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", + "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", + "dev": true + } + } + }, + "browser-pack": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-5.0.1.tgz", + "integrity": "sha1-QZdxmyDG4KqglFHFER5T77b7wY0=", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "combine-source-map": "~0.6.1", + "defined": "^1.0.0", + "through2": "^1.0.0", + "umd": "^3.0.0" + }, + "dependencies": { + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "through2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", + "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", + "dev": true, + "requires": { + "readable-stream": ">=1.1.13-1 <1.2.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "combine-source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.6.1.tgz", + "integrity": "sha1-m0oJwxYDPXaODxHgKfonMOB5rZY=", + "dev": true, + "requires": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.5.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.4.2" + } + }, + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", + "dev": true + }, + "defined": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", + "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=", + "dev": true + }, + "inline-source-map": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.5.0.tgz", + "integrity": "sha1-Skxd2OT7Xps82mDIIt+tyu5m4K8=", + "dev": true, + "requires": { + "source-map": "~0.4.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "labeled-stream-splicer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-1.0.2.tgz", + "integrity": "sha1-RhUzFTd4SYHo/SZOHzpDTE4N3WU=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "isarray": "~0.0.1", + "stream-splicer": "^1.1.0" + } + }, + "minimist": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.1.tgz", + "integrity": "sha512-GY8fANSrTMfBVfInqJAY41QkOM+upUTytK1jZ0c8+3HdHrJxBJ3rF5i9moClXTE8uUSnUo8cAsCoxDXvSY4DHg==", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "stream-splicer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-1.3.2.tgz", + "integrity": "sha1-PARBvhW5v04iYnXm3IOWR0VUZmE=", + "dev": true, + "requires": { + "indexof": "0.0.1", + "inherits": "^2.0.1", + "isarray": "~0.0.1", + "readable-stream": "^1.1.13-1", + "readable-wrap": "^1.0.0", + "through2": "^1.0.0" + }, + "dependencies": { + "through2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", + "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", + "dev": true, + "requires": { + "readable-stream": ">=1.1.13-1 <1.2.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "dev": true, + "requires": { + "readable-stream": "~1.0.17", + "xtend": "~3.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "dev": true + } + } + } + } + }, "fancy-log": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", @@ -6074,6 +6331,51 @@ "minimatch": "^3.0.3" } }, + "gulp-merge": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/gulp-merge/-/gulp-merge-0.1.1.tgz", + "integrity": "sha1-pGLuARd6jqfEYPDqia1ULsdSujc=", + "dev": true, + "requires": { + "through2": "~1.1.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", + "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", + "dev": true, + "requires": { + "readable-stream": ">=1.1.13-1 <1.2.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, "gulp-plumber": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/gulp-plumber/-/gulp-plumber-1.2.1.tgz", @@ -6855,6 +7157,12 @@ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", "dev": true }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -8369,6 +8677,12 @@ "boolbase": "~1.0.0" } }, + "nub": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/nub/-/nub-0.0.0.tgz", + "integrity": "sha1-s2m9Mr3eZq9ZYFw7BSC8IZ3MwE8=", + "dev": true + }, "num2fraction": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", @@ -8607,6 +8921,15 @@ "os-tmpdir": "^1.0.0" } }, + "outpipe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz", + "integrity": "sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I=", + "dev": true, + "requires": { + "shell-quote": "^1.4.2" + } + }, "p-cancelable": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", @@ -10410,6 +10733,41 @@ } } }, + "readable-wrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/readable-wrap/-/readable-wrap-1.0.0.tgz", + "integrity": "sha1-O1ohHGMeEjA6VJkcgGwX564ga/8=", + "dev": true, + "requires": { + "readable-stream": "^1.1.13-1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", @@ -10819,6 +11177,12 @@ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, + "reversepoint": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/reversepoint/-/reversepoint-0.2.1.tgz", + "integrity": "sha1-0qw/9NZlzw/3Ipa3p47nI39lk/U=", + "dev": true + }, "rgb-regex": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", @@ -11546,6 +11910,16 @@ } } }, + "stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", + "dev": true, + "requires": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, "stream-combiner2": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", diff --git a/package.json b/package.json index a870380..6a1d11f 100644 --- a/package.json +++ b/package.json @@ -48,12 +48,14 @@ "cross-env": "^7.0.2", "cssnano": "^4.1.10", "del": "^6.0.0", + "factor-bundle": "^2.5.0", "gulp": "^4.0.2", "gulp-autoprefixer": "^7.0.1", "gulp-babel": "^8.0.0", "gulp-if": "^3.0.0", "gulp-imagemin": "^7.1.0", "gulp-load-plugins": "^2.0.5", + "gulp-merge": "^0.1.1", "gulp-plumber": "^1.2.1", "gulp-postcss": "^9.0.0", "gulp-rename": "^2.0.0", diff --git a/src/html/settings.html b/src/html/settings.html new file mode 100644 index 0000000..b63bf93 --- /dev/null +++ b/src/html/settings.html @@ -0,0 +1,58 @@ + + + + + Aniwatch Plus Settings + + + + +
+

Aniwatch Plus Settings

+ +

General Settings

+
+

Website

+ +
+ + +
+ + +
+ + +
+ +

Anime

+ +
+ +

Requests page

+ +
+

Player Settings

+
+

General

+ +
+ +

Watch2gether

+ +
+ +

+ + +
+ Please reload aniwatch website after you changed the settings. +
+ - Changelogs +
+ + + + + + \ No newline at end of file diff --git a/src/javascript/index.js b/src/javascript/app.js similarity index 86% rename from src/javascript/index.js rename to src/javascript/app.js index 8b14f9c..d34e051 100644 --- a/src/javascript/index.js +++ b/src/javascript/app.js @@ -9,6 +9,8 @@ import { init as languageDisplay } from './enhancements/languageDisplay'; import { init as notifications } from './enhancements/notifications'; import { init as quickSearch } from './enhancements/quickSearch'; import { init as watch2getherChat } from './enhancements/watch2getherChat'; +// css +import { init as cssEnhancements } from './enhancements/cssEnhancements'; // core initCore(); @@ -23,3 +25,6 @@ languageDisplay(); notifications(); quickSearch(); watch2getherChat(); + +// css +cssEnhancements(); \ No newline at end of file diff --git a/src/javascript/browserApi/storageProvider.js b/src/javascript/browserApi/storageProvider.js new file mode 100644 index 0000000..0f84b1d --- /dev/null +++ b/src/javascript/browserApi/storageProvider.js @@ -0,0 +1,84 @@ +const { assigned } = require("../utils/helpers") + +class StorageProviderChromium { + + setData(key, value) { + let obj = {}; + obj[key] = value; + + this.getStorage().set(obj); + } + + getData(key, defaultValue, callback) { + this.getStorage().get(key, items => { + if (assigned(items) && assigned(items[key])) { + callback(items[key]); + } + else { + callback(defaultValue); + } + }) + } + + getStorage() { + if (assigned(chrome.storage.sync)) { + return chrome.storage.sync; + } + + return chrome.storage.local; + } +} + + +class StorageProviderFirefox { + + setData(key, value) { + let obj = {}; + obj[key] = value; + + this.getStorage().set(obj); + } + + getData(key, defaultValue, callback) { + let promise = this.getStorage().get(key); + + promise.then(items => { + if (assigned(items) && assigned(items[key])) { + callback(items[key]); + } + else { + callback(defaultValue); + } + }); + } + + getStorage() { + if (assigned(browser.storage.sync)) { + return browser.storage.sync; + } + + return browser.storage.local; + } +} + +let __storageProvieder; + +function createStorageProvider() { + // chrome based browser + if (assigned(chrome?.app)) { + __storageProvieder = new StorageProviderChromium(); + } + // firefox + else { + __storageProvieder = new StorageProviderFirefox(); + } + +} + +export function getGlobalStorageProvider() { + if (!assigned(__storageProvieder)) { + createStorageProvider(); + } + + return __storageProvieder; +} \ No newline at end of file diff --git a/src/javascript/configuration/configuration.js b/src/javascript/configuration/configuration.js new file mode 100644 index 0000000..23ad4fd --- /dev/null +++ b/src/javascript/configuration/configuration.js @@ -0,0 +1,44 @@ +import { getGlobalStorageProvider } from "../browserApi/storageProvider"; +import { assigned } from "../utils/helpers"; + +// website +export const SETTINGS_websiteDisplayQuickSearch = 'websiteDisplayQuickSearch'; +export const SETTINGS_websiteShowNotificationsCountInTab = 'websiteShowNotificationsCountInTab'; +export const SETTINGS_websiteHideUnusedTabs = 'websiteHideUnusedTabs'; +export const SETTINGS_websiteOptimizeListAppearance = 'websiteOptimizeListAppearance'; +// anime +export const SETTINGS_animeLanguageDisplay = 'animeLanguageDisplay'; +// requests +export const SETTINGS_requestBeautifyPage = 'requestBeautifyPage'; +// player +export const SETTINGS_playerAutoplayAfterScreenshot = 'playerAutoplayAfterScreenshot'; +// w2g +export const SETTINGS_w2gDisplayCharacterCounter = 'w2gDisplayCharacterCounter'; +class Configuration { + constructor() { + this.settingsCache = new Map(); + } + + getProperty(key, callback) { + if (this.settingsCache.has(key)) { + callback(this.settingsCache.get(key)); + } + else { + // OOOPS // currently all settings are default true. This isnĀ“t a problem but there should be much better soloutions after migration to typescript.... + getGlobalStorageProvider().getData(key, true, value => { + this.settingsCache.set(key, value); + callback(value); + }); + } + } +} + +let __globalConfig; + +export function getGlobalConfiguration() { + if (!assigned(__globalConfig)) { + __globalConfig = new Configuration(); + } + + return __globalConfig; +} \ No newline at end of file diff --git a/src/javascript/enhancements/anilyr.js b/src/javascript/enhancements/anilyr.js index f80ebd8..b8036f2 100644 --- a/src/javascript/enhancements/anilyr.js +++ b/src/javascript/enhancements/anilyr.js @@ -1,3 +1,4 @@ +import { getGlobalConfiguration, SETTINGS_playerAutoplayAfterScreenshot } from '../configuration/configuration'; import * as core from '../utils/aniwatchCore'; import * as helper from '../utils/helpers'; @@ -5,11 +6,15 @@ const SCREENSHOT_TOOLTIP_ID = 'anilyr-screenshots-tooltip'; const PLAYER_ID = 'player'; export function init() { - core.registerScript(node => { - if (helper.isHtmlElement(node) && node.id === SCREENSHOT_TOOLTIP_ID) { - observeScreenshotTooltip(node); + getGlobalConfiguration().getProperty(SETTINGS_playerAutoplayAfterScreenshot, value => { + if (value) { + core.registerScript(node => { + if (helper.isHtmlElement(node) && node.id === SCREENSHOT_TOOLTIP_ID) { + observeScreenshotTooltip(node); + } + }, "^/anime/[0-9]*/[0-9]*$"); } - }, "^/anime/[0-9]*/[0-9]*$"); + }); } function observeScreenshotTooltip(tooltip) { @@ -18,7 +23,7 @@ function observeScreenshotTooltip(tooltip) { // Switched to invisible if (!mutation.oldValue.includes('display: none') && mutation.target.style.display == 'none') { let player = findPlayer(); - if(typeof player !== 'undefined'){ + if (typeof player !== 'undefined') { resumePlayer(player); } } diff --git a/src/javascript/enhancements/animeRequests.js b/src/javascript/enhancements/animeRequests.js index 171f191..ce86be0 100644 --- a/src/javascript/enhancements/animeRequests.js +++ b/src/javascript/enhancements/animeRequests.js @@ -1,16 +1,21 @@ +import { getGlobalConfiguration, SETTINGS_requestBeautifyPage } from '../configuration/configuration'; import * as core from '../utils/aniwatchCore'; import * as color from '../utils/colors'; import * as helper from '../utils/helpers'; export function init() { - core.registerScript(node => { - // run the scripts - if (helper.isHtmlElement(node)) { - changeFollowedStarColor(node); - changeBorderColorOwnRequests(node); - removeUnknownUsers(node); + getGlobalConfiguration().getProperty(SETTINGS_requestBeautifyPage, value => { + if (value) { + core.registerScript(node => { + // run the scripts + if (helper.isHtmlElement(node)) { + changeFollowedStarColor(node); + changeBorderColorOwnRequests(node); + removeUnknownUsers(node); + } + }, "/requests"); } - }, "/requests"); + }); } function changeFollowedStarColor(node) { @@ -71,7 +76,7 @@ function removeUnknownUsers(node) { let parsedDocument = parser.parseFromString(profileData, 'text/html'); lowerDiv.innerHTML = ''; - while(parsedDocument.body.hasChildNodes()){ + while (parsedDocument.body.hasChildNodes()) { lowerDiv.appendChild(parsedDocument.body.removeChild(parsedDocument.body.firstChild)); } } diff --git a/src/javascript/enhancements/cssEnhancements.js b/src/javascript/enhancements/cssEnhancements.js new file mode 100644 index 0000000..ce62948 --- /dev/null +++ b/src/javascript/enhancements/cssEnhancements.js @@ -0,0 +1,61 @@ +import { getGlobalConfiguration, SETTINGS_websiteHideUnusedTabs, SETTINGS_websiteOptimizeListAppearance } from '../configuration/configuration'; +import * as core from '../utils/aniwatchCore'; +import * as helper from '../utils/helpers'; + +export function init() { + getGlobalConfiguration().getProperty(SETTINGS_websiteHideUnusedTabs, value => { + // if disabled, add class to avoid our css optimizations + if (!value) { + let disableFunc = node => { + if (helper.isHtmlElement(node)) { + let disableNode = node => { + node.classList.add('awp-hide-unused-disabled') + } + + if (node.tagName === 'MD-TAB-ITEM') { + disableNode(node); + } + else { + node.querySelectorAll('md-tab-item').forEach(node => disableNode(node)); + } + } + }; + + core.registerScript(node => { + disableFunc(node); + }, ".*"); + + core.runAfterLoad(() => { + disableFunc(document.body); + }, ".*"); + } + }); + + getGlobalConfiguration().getProperty(SETTINGS_websiteOptimizeListAppearance, value => { + // if disabled, add class to avoid our css optimizations + if (!value) { + let disableFunc = node => { + if (helper.isHtmlElement(node)) { + let disableNode = node => { + node.classList.add('awp-list-disabled') + } + + if (node.tagName === 'MD-LIST-ITEM') { + disableNode(node); + } + else { + node.querySelectorAll('md-list-item').forEach(node => disableNode(node)); + } + } + } + + core.registerScript(node => { + disableFunc(node); + }, ".*"); + + core.runAfterLoad(() => { + disableFunc(document.body); + }, ".*"); + } + }); +} \ No newline at end of file diff --git a/src/javascript/enhancements/languageDisplay.js b/src/javascript/enhancements/languageDisplay.js index 124431e..e96eef3 100644 --- a/src/javascript/enhancements/languageDisplay.js +++ b/src/javascript/enhancements/languageDisplay.js @@ -1,13 +1,18 @@ +import { getGlobalConfiguration, SETTINGS_animeLanguageDisplay } from '../configuration/configuration'; import * as core from '../utils/aniwatchCore'; import * as helper from '../utils/helpers'; export function init() { - core.registerScript(node => { - // run the scripts - if (helper.isHtmlElement(node)) { - updateLanguageDisplay(node) + getGlobalConfiguration().getProperty(SETTINGS_animeLanguageDisplay, value => { + if (value) { + core.registerScript(node => { + // run the scripts + if (helper.isHtmlElement(node)) { + updateLanguageDisplay(node) + } + }, "^/anime/[0-9]*$"); } - }, "^/anime/[0-9]*$"); + }); } function updateLanguageDisplay(node) { diff --git a/src/javascript/enhancements/notifications.js b/src/javascript/enhancements/notifications.js index e97e530..10df5ff 100644 --- a/src/javascript/enhancements/notifications.js +++ b/src/javascript/enhancements/notifications.js @@ -1,14 +1,19 @@ +import { getGlobalConfiguration, SETTINGS_websiteShowNotificationsCountInTab } from '../configuration/configuration'; import * as core from '../utils/aniwatchCore'; import * as helper from '../utils/helpers'; export function init() { - core.runAfterLoad(() => { - updateNotificationsInTitle(); - }, ".*"); + getGlobalConfiguration().getProperty(SETTINGS_websiteShowNotificationsCountInTab, value => { + if (value) { + core.runAfterLoad(() => { + updateNotificationsInTitle(); + }, ".*"); - core.runAfterLocationChange(() => { - updateNotificationsInTitle(); - }, ".*"); + core.runAfterLocationChange(() => { + updateNotificationsInTitle(); + }, ".*"); + } + }); } function getNotificationCount() { diff --git a/src/javascript/enhancements/quickSearch.js b/src/javascript/enhancements/quickSearch.js index 95b31d5..dddf15d 100644 --- a/src/javascript/enhancements/quickSearch.js +++ b/src/javascript/enhancements/quickSearch.js @@ -1,3 +1,4 @@ +import { getGlobalConfiguration, SETTINGS_websiteDisplayQuickSearch } from '../configuration/configuration'; import * as core from '../utils/aniwatchCore'; import * as helper from '../utils/helpers'; @@ -5,9 +6,13 @@ const quickSearchID = 'ea-quickSearch'; const quickSearchLink = 'ea-quickSearchLink'; export function init() { - core.runAfterLoad(() => { - initSearch(); - }, ".*"); + getGlobalConfiguration().getProperty(SETTINGS_websiteDisplayQuickSearch, value => { + if (value) { + core.runAfterLoad(() => { + initSearch(); + }, ".*"); + } + }); } function initSearch() { @@ -68,7 +73,7 @@ function handleSearchForShiftF(event) { if (document.activeElement instanceof HTMLInputElement || document.activeElement.isContentEditable) { return; } - + if (event.code === 'KeyF') { event.preventDefault(); document.getElementById(quickSearchID).focus(); diff --git a/src/javascript/enhancements/watch2getherChat.js b/src/javascript/enhancements/watch2getherChat.js index c173f87..a3e5dc6 100644 --- a/src/javascript/enhancements/watch2getherChat.js +++ b/src/javascript/enhancements/watch2getherChat.js @@ -1,12 +1,15 @@ import * as core from '../utils/aniwatchCore'; -import * as helper from '../utils/helpers'; import { v4 as uuidv4 } from 'uuid'; +import { getGlobalConfiguration, SETTINGS_w2gDisplayCharacterCounter } from '../configuration/configuration'; export function init() { - // UPS // runAfterLoad is not what we want...wait for runAfterLocationChange.... - core.runAfterLocationChange(() => { - manipulateChatInput(); - }, "^/watch2gether/.*$"); + getGlobalConfiguration().getProperty(SETTINGS_w2gDisplayCharacterCounter, value => { + if (value) { + core.runAfterLocationChange(() => { + manipulateChatInput(); + }, "^/watch2gether/.*$"); + } + }); } function manipulateChatInput() { diff --git a/src/javascript/settings.js b/src/javascript/settings.js new file mode 100644 index 0000000..86e4208 --- /dev/null +++ b/src/javascript/settings.js @@ -0,0 +1,48 @@ +import { getGlobalStorageProvider } from "./browserApi/storageProvider"; +import { onReady } from "./utils/helpers"; + +const OPTION_SELECTOR = 'input[type="checkbox"'; + +function storeOptions() { + document.querySelectorAll(OPTION_SELECTOR).forEach(optionElement => { + getGlobalStorageProvider().setData(optionElement.id, optionElement.checked); + }); +} + +function restoreOptions() { + document.querySelectorAll(OPTION_SELECTOR).forEach(optionElement => { + let defaultValue = optionElement.dataset.defaultValue === 'true' ? true : false; + + getGlobalStorageProvider().getData(optionElement.id, defaultValue, value => { + optionElement.checked = value; + }); + }); +} + +function resetOptions() { + document.querySelectorAll(OPTION_SELECTOR).forEach(optionElement => { + let defaultValue = optionElement.dataset.defaultValue === 'true' ? true : false; + + optionElement.checked = defaultValue; + }); +} + +onReady(() => { + // register Store Button + document.getElementById('btnSave').addEventListener('click', event => { + event.preventDefault(); + storeOptions(); + }); + + document.getElementById('btnReset').addEventListener('click', event => { + event.preventDefault(); + resetOptions(); + storeOptions(); + }) + + // try restore options + restoreOptions(); + + // update version label + document.getElementById('version').innerText = `v${chrome.runtime.getManifest().version}` +}); \ No newline at end of file diff --git a/src/manifests/chrome.manifest.json b/src/manifests/chrome.manifest.json index 0f4c6ac..8345845 100644 --- a/src/manifests/chrome.manifest.json +++ b/src/manifests/chrome.manifest.json @@ -5,6 +5,7 @@ "version_name": "$semanticVersion", "description": "$description", "permissions": [ + "storage", "*://aniwatch.me/*" ], "manifest_version": 2, @@ -14,16 +15,23 @@ "48": "images/icon/icon_48.png", "96": "images/icon/icon_96.png" }, - "content_scripts": [{ - "matches": [ - "*://aniwatch.me/*" - ], - "js": [ - "javascript/app.min.js" - ], - "css": [ - "stylesheets/aniwatchplus.min.css" - ], - "run_at": "document_end" - }] + "options_ui": { + "page": "html/settings.html", + "open_in_tab": false + }, + "content_scripts": [ + { + "matches": [ + "*://aniwatch.me/*" + ], + "js": [ + "javascript/common.min.js", + "javascript/app.min.js" + ], + "css": [ + "stylesheets/aniwatchplus.min.css" + ], + "run_at": "document_end" + } + ] } \ No newline at end of file diff --git a/src/manifests/firefox.manifest.json b/src/manifests/firefox.manifest.json index 3cc2904..a75dd90 100644 --- a/src/manifests/firefox.manifest.json +++ b/src/manifests/firefox.manifest.json @@ -4,6 +4,7 @@ "version": "$version", "description": "$description", "permissions": [ + "storage", "*://aniwatch.me/*" ], "manifest_version": 2, @@ -14,16 +15,23 @@ "48": "images/icon/icon_48.png", "96": "images/icon/icon_96.png" }, - "content_scripts": [{ - "matches": [ - "*://aniwatch.me/*" - ], - "js": [ - "javascript/app.min.js" - ], - "css": [ - "stylesheets/aniwatchplus.min.css" - ], - "run_at": "document_end" - }] + "options_ui": { + "page": "html/settings.html", + "open_in_tab": false + }, + "content_scripts": [ + { + "matches": [ + "*://aniwatch.me/*" + ], + "js": [ + "javascript/common.min.js", + "javascript/app.min.js" + ], + "css": [ + "stylesheets/aniwatchplus.min.css" + ], + "run_at": "document_end" + } + ] } \ No newline at end of file diff --git a/src/manifests/manifest.template.json b/src/manifests/manifest.template.json index 3011896..dd42d6a 100644 --- a/src/manifests/manifest.template.json +++ b/src/manifests/manifest.template.json @@ -5,6 +5,7 @@ "version_name": "0.3.1 Beta", "description": "Aniwatch Plus is an unofficial extension which provides several UI improvments for https://aniwatch.me.", "permissions": [ + "storage", "*://aniwatch.me/*" ], "manifest_version": 2, @@ -18,16 +19,23 @@ "48": "images/icon/icon_48.png", "96": "images/icon/icon_96.png" }, - "content_scripts": [{ - "matches": [ - "*://aniwatch.me/*" - ], - "js": [ - "javascript/app.min.js" - ], - "css": [ - "stylesheets/aniwatchplus.min.css" - ], - "run_at": "document_end" - }] + "options_ui": { + "page": "html/settings.html", + "open_in_tab": false + }, + "content_scripts": [ + { + "matches": [ + "*://aniwatch.me/*" + ], + "js": [ + "javascript/common.min.js", + "javascript/app.min.js" + ], + "css": [ + "stylesheets/aniwatchplus.min.css" + ], + "run_at": "document_end" + } + ] } \ No newline at end of file diff --git a/src/manifests/opera.manifest.json b/src/manifests/opera.manifest.json index 0ad7f9e..66477ee 100644 --- a/src/manifests/opera.manifest.json +++ b/src/manifests/opera.manifest.json @@ -5,6 +5,7 @@ "version_name": "$semanticVersion", "description": "$description", "permissions": [ + "storage", "*://aniwatch.me/*" ], "manifest_version": 2, @@ -15,16 +16,23 @@ "48": "images/icon/icon_48.png", "96": "images/icon/icon_96.png" }, - "content_scripts": [{ - "matches": [ - "*://aniwatch.me/*" - ], - "js": [ - "javascript/app.min.js" - ], - "css": [ - "stylesheets/aniwatchplus.min.css" - ], - "run_at": "document_end" - }] + "options_ui": { + "page": "html/settings.html", + "open_in_tab": false + }, + "content_scripts": [ + { + "matches": [ + "*://aniwatch.me/*" + ], + "js": [ + "javascript/common.min.js", + "javascript/app.min.js" + ], + "css": [ + "stylesheets/aniwatchplus.min.css" + ], + "run_at": "document_end" + } + ] } \ No newline at end of file diff --git a/src/stylesheets/enhancements/_lists.scss b/src/stylesheets/enhancements/_lists.scss index acfbd08..369d212 100644 --- a/src/stylesheets/enhancements/_lists.scss +++ b/src/stylesheets/enhancements/_lists.scss @@ -1,5 +1,5 @@ md-list-item { - &:not(:last-child) { + &:not(:last-child):not(.awp-list-disabled) { // added important to override aniwatch new introduced border which has a different, more "aggressive" color // https://canary.discord.com/channels/541683465599451136/543812424541798421/773621830161268756 border-bottom: 1px solid $gray !important; diff --git a/src/stylesheets/enhancements/_tabs.scss b/src/stylesheets/enhancements/_tabs.scss index 899947a..3965c1f 100644 --- a/src/stylesheets/enhancements/_tabs.scss +++ b/src/stylesheets/enhancements/_tabs.scss @@ -1,6 +1,6 @@ md-tab-item { // hide disabled tabs - &.md-disabled { + &.md-disabled:not(.awp-hide-unused-disabled) { display: none; } }