Merge pull request #1212 from Materialious/update/1.11.9

Update/1.11.9
This commit is contained in:
Ward
2025-11-28 02:36:36 +00:00
committed by GitHub
23 changed files with 731 additions and 452 deletions
+1 -1
View File
@@ -25,7 +25,7 @@
- Watch sync parties.
- Sponsorblock built-in.
- Return YouTube dislikes built-in.
- DeArrow built-in (With local processing fallback).
- [DeArrow](https://github.com/ajayyy/DeArrow) built-in (With local processing fallback).
- No ads.
- No tracking.
- Light/Dark themes.
+1 -1
View File
@@ -7,7 +7,7 @@ android {
applicationId "us.materialio.app"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 169
versionCode 170
versionName "1.11.9"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
aaptOptions {
@@ -13,7 +13,9 @@ dependencies {
implementation project(':capacitor-app')
implementation project(':capacitor-browser')
implementation project(':capacitor-clipboard')
implementation project(':capacitor-preferences')
implementation project(':capacitor-screen-orientation')
implementation project(':capacitor-share')
implementation project(':capacitor-nodejs')
}
@@ -14,8 +14,14 @@ project(':capacitor-browser').projectDir = new File('../node_modules/@capacitor/
include ':capacitor-clipboard'
project(':capacitor-clipboard').projectDir = new File('../node_modules/@capacitor/clipboard/android')
include ':capacitor-preferences'
project(':capacitor-preferences').projectDir = new File('../node_modules/@capacitor/preferences/android')
include ':capacitor-screen-orientation'
project(':capacitor-screen-orientation').projectDir = new File('../node_modules/@capacitor/screen-orientation/android')
include ':capacitor-share'
project(':capacitor-share').projectDir = new File('../node_modules/@capacitor/share/android')
include ':capacitor-nodejs'
project(':capacitor-nodejs').projectDir = new File('../node_modules/capacitor-nodejs/android')
+26 -26
View File
@@ -1,12 +1,12 @@
{
"name": "Materialious",
"version": "1.11.8",
"version": "1.11.9",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "Materialious",
"version": "1.11.7",
"version": "1.11.9",
"license": "MIT",
"dependencies": {
"@capacitor-community/electron": "^5.0.0",
@@ -17,33 +17,33 @@
"electron-unhandled": "^4.0.1",
"electron-updater": "^6.3.4",
"electron-window-state": "^5.0.3",
"jsdom": "^27.1.0",
"jsdom": "^27.2.0",
"jsonfile": "^6.2.0"
},
"devDependencies": {
"electron": "^39.1.1",
"electron": "^39.2.3",
"electron-builder": "^26.0.12",
"electron-rebuild": "^3.2.9",
"typescript": "^5.9.3"
}
},
"node_modules/@acemir/cssom": {
"version": "0.9.19",
"resolved": "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.19.tgz",
"integrity": "sha512-Pp2gAQXPZ2o7lt4j0IMwNRXqQ3pagxtDj5wctL5U2Lz4oV0ocDNlkgx4DpxfyKav4S/bePuI+SMqcBSUHLy9kg==",
"version": "0.9.24",
"resolved": "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.24.tgz",
"integrity": "sha512-5YjgMmAiT2rjJZU7XK1SNI7iqTy92DpaYVgG6x63FxkJ11UpYfLndHJATtinWJClAXiOlW9XWaUyAQf8pMrQPg==",
"license": "MIT"
},
"node_modules/@asamuzakjp/css-color": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.0.5.tgz",
"integrity": "sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==",
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.1.0.tgz",
"integrity": "sha512-9xiBAtLn4aNsa4mDnpovJvBn72tNEIACyvlqaNJ+ADemR+yeMJWnBudOi2qGDviJa7SwcDOU/TRh5dnET7qk0w==",
"license": "MIT",
"dependencies": {
"@csstools/css-calc": "^2.1.4",
"@csstools/css-color-parser": "^3.1.0",
"@csstools/css-parser-algorithms": "^3.0.5",
"@csstools/css-tokenizer": "^3.0.4",
"lru-cache": "^11.2.1"
"lru-cache": "^11.2.2"
}
},
"node_modules/@asamuzakjp/css-color/node_modules/lru-cache": {
@@ -248,9 +248,9 @@
}
},
"node_modules/@csstools/css-syntax-patches-for-csstree": {
"version": "1.0.15",
"resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.15.tgz",
"integrity": "sha512-q0p6zkVq2lJnmzZVPR33doA51G7YOja+FBvRdp5ISIthL0MtFCgYHHhR563z9WFGxcOn0WfjSkPDJ5Qig3H3Sw==",
"version": "1.0.17",
"resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.17.tgz",
"integrity": "sha512-LCC++2h8pLUSPY+EsZmrrJ1EOUu+5iClpEiDhhdw3zRJpPbABML/N5lmRuBHjxtKm9VnRcsUzioyD0sekFMF0A==",
"funding": [
{
"type": "github",
@@ -2240,9 +2240,9 @@
}
},
"node_modules/cssstyle": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-5.3.2.tgz",
"integrity": "sha512-zDMqXh8Vs1CdRYZQ2M633m/SFgcjlu8RB8b/1h82i+6vpArF507NSYIWJHGlJaTWoS+imcnctmEz43txhbVkOw==",
"version": "5.3.3",
"resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-5.3.3.tgz",
"integrity": "sha512-OytmFH+13/QXONJcC75QNdMtKpceNk3u8ThBjyyYjkEcy/ekBwR1mMAuNvi3gdBPW3N5TlCzQ0WZw8H0lN/bDw==",
"license": "MIT",
"dependencies": {
"@asamuzakjp/css-color": "^4.0.3",
@@ -2584,9 +2584,9 @@
}
},
"node_modules/electron": {
"version": "39.1.1",
"resolved": "https://registry.npmjs.org/electron/-/electron-39.1.1.tgz",
"integrity": "sha512-VuFEI1yQ7BH3RYI5VZtwFlzGp4rpPRd5oEc26ZQIItVLcLTbXt4/O7o4hs+1fyg9Q3NvGAifgX5Vp5EBOIFpAg==",
"version": "39.2.3",
"resolved": "https://registry.npmjs.org/electron/-/electron-39.2.3.tgz",
"integrity": "sha512-j7k7/bj3cNA29ty54FzEMRUoqirE+RBQPhPFP+XDuM93a1l2WcDPiYumxKWz+iKcXxBJLFdMIAlvtLTB/RfCkg==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@@ -3945,14 +3945,14 @@
"license": "MIT"
},
"node_modules/jsdom": {
"version": "27.1.0",
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-27.1.0.tgz",
"integrity": "sha512-Pcfm3eZ+eO4JdZCXthW9tCDT3nF4K+9dmeZ+5X39n+Kqz0DDIABRP5CAEOHRFZk8RGuC2efksTJxrjp8EXCunQ==",
"version": "27.2.0",
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-27.2.0.tgz",
"integrity": "sha512-454TI39PeRDW1LgpyLPyURtB4Zx1tklSr6+OFOipsxGUH1WMTvk6C65JQdrj455+DP2uJ1+veBEHTGFKWVLFoA==",
"license": "MIT",
"dependencies": {
"@acemir/cssom": "^0.9.19",
"@asamuzakjp/dom-selector": "^6.7.3",
"cssstyle": "^5.3.2",
"@acemir/cssom": "^0.9.23",
"@asamuzakjp/dom-selector": "^6.7.4",
"cssstyle": "^5.3.3",
"data-urls": "^6.0.0",
"decimal.js": "^10.6.0",
"html-encoding-sniffer": "^4.0.0",
+3 -3
View File
@@ -30,11 +30,11 @@
"electron-unhandled": "^4.0.1",
"electron-updater": "^6.3.4",
"electron-window-state": "^5.0.3",
"jsdom": "^27.1.0",
"jsdom": "^27.2.0",
"jsonfile": "^6.2.0"
},
"devDependencies": {
"electron": "^39.1.1",
"electron": "^39.2.3",
"electron-builder": "^26.0.12",
"electron-rebuild": "^3.2.9",
"typescript": "^5.9.3"
@@ -43,4 +43,4 @@
"capacitor",
"electron"
]
}
}
+62 -61
View File
@@ -6,65 +6,66 @@ import ts from 'typescript-eslint';
import svelteConfig from './svelte.config.js';
export default ts.config(
js.configs.recommended,
...ts.configs.recommended,
...svelte.configs.recommended,
{
languageOptions: {
globals: {
...globals.browser,
...globals.node
}
}
},
{
files: ['**/*.svelte'],
// See more details at: https://typescript-eslint.io/packages/parser/
languageOptions: {
parserOptions: {
projectService: true,
extraFileExtensions: ['.svelte'], // Add support for additional file extensions, such as .svelte
parser: ts.parser,
sourceType: 'module',
ecmaVersion: 2020,
// Specify a parser for each language, if needed:
// parser: {
// ts: ts.parser,
// js: espree, // Use espree for .js files (add: import espree from 'espree')
// typescript: ts.parser
// },
js.configs.recommended,
...ts.configs.recommended,
...svelte.configs.recommended,
{
languageOptions: {
globals: {
...globals.browser,
...globals.node
}
}
},
{
files: ['**/*.svelte'],
// See more details at: https://typescript-eslint.io/packages/parser/
languageOptions: {
parserOptions: {
projectService: true,
extraFileExtensions: ['.svelte'], // Add support for additional file extensions, such as .svelte
parser: ts.parser,
sourceType: 'module',
ecmaVersion: 2020,
// Specify a parser for each language, if needed:
// parser: {
// ts: ts.parser,
// js: espree, // Use espree for .js files (add: import espree from 'espree')
// typescript: ts.parser
// },
// We recommend importing and specifying svelte.config.js.
// By doing so, some rules in eslint-plugin-svelte will automatically read the configuration and adjust their behavior accordingly.
// While certain Svelte settings may be statically loaded from svelte.config.js even if you don’t specify it,
// explicitly specifying it ensures better compatibility and functionality.
//
// If non-serializable properties are included, running ESLint with the --cache flag will fail.
// In that case, please remove the non-serializable properties. (e.g. `svelteConfig: { ...svelteConfig, kit: { ...svelteConfig.kit, typescript: undefined }}`)
svelteConfig
}
}
},
{
rules: {
// Override or add rule settings here, such as:
// 'svelte/rule-name': 'error'
}
},
{
ignores: [
'.DS_Store',
'node_modules',
'/build',
'/.svelte-kit',
'/package',
'.env',
'.env.*',
'!.env.example',
// Ignore files for PNPM, NPM and YARN
'pnpm-lock.yaml',
'package-lock.json',
'yarn.lock'
],
}
);
// We recommend importing and specifying svelte.config.js.
// By doing so, some rules in eslint-plugin-svelte will automatically read the configuration and adjust their behavior accordingly.
// While certain Svelte settings may be statically loaded from svelte.config.js even if you don’t specify it,
// explicitly specifying it ensures better compatibility and functionality.
//
// If non-serializable properties are included, running ESLint with the --cache flag will fail.
// In that case, please remove the non-serializable properties. (e.g. `svelteConfig: { ...svelteConfig, kit: { ...svelteConfig.kit, typescript: undefined }}`)
svelteConfig
}
}
},
{
rules: {
// Override or add rule settings here, such as:
// 'svelte/rule-name': 'error'
'@typescript-eslint/no-explicit-any': ['off']
}
},
{
ignores: [
'.DS_Store',
'node_modules',
'/build',
'/.svelte-kit',
'/package',
'.env',
'.env.*',
'!.env.example',
// Ignore files for PNPM, NPM and YARN
'pnpm-lock.yaml',
'package-lock.json',
'yarn.lock'
]
}
);
+185 -119
View File
@@ -1,12 +1,12 @@
{
"name": "materialious",
"version": "1.11.8",
"version": "1.11.9",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "materialious",
"version": "1.11.7",
"version": "1.11.9",
"hasInstallScript": true,
"dependencies": {
"@capacitor-community/electron": "^5.0.1",
@@ -16,7 +16,11 @@
"@capacitor/browser": "^7.0.0",
"@capacitor/clipboard": "^7.0.0",
"@capacitor/core": "^7.4.3",
"@capacitor/preferences": "^7.0.2",
"@capacitor/screen-orientation": "^7.0.0",
"@capacitor/share": "^7.0.2",
"@macfja/serializer": "^1.1.4",
"@macfja/svelte-persistent-store": "^2.4.2",
"beercss": "^3.12.13",
"bgutils-js": "^3.2.0",
"capacitor-nodejs": "https://github.com/hampoelz/capacitor-nodejs/releases/download/v1.0.0-beta.9/capacitor-nodejs.tgz",
@@ -25,17 +29,16 @@
"googlevideo": "^4.0.4",
"he": "^1.2.0",
"human-number": "^2.0.7",
"i18next": "^25.6.0",
"i18next": "^25.6.3",
"iso-3166": "^4.4.0",
"iso-639-1": "^3.1.5",
"material-dynamic-colors": "^1.1.1",
"media-captions": "^1.0.4",
"mousetrap": "^1.6.5",
"peerjs": "^1.5.5",
"shaka-player": "^4.16.2",
"shaka-player": "^4.16.9",
"sponsorblock-api": "^0.2.4",
"svelte-infinite-loading": "^1.4.0",
"svelte-persisted-store": "^0.12.0",
"youtubei.js": "^16.0.1"
},
"devDependencies": {
@@ -43,7 +46,7 @@
"@capacitor/cli": "^7.4.4",
"@sveltejs/adapter-auto": "^6.0.1",
"@sveltejs/adapter-static": "^3.0.10",
"@sveltejs/kit": "^2.46.5",
"@sveltejs/kit": "^2.49.0",
"@sveltejs/vite-plugin-svelte": "^6.2.1",
"@types/event-source-polyfill": "^1.0.5",
"@types/he": "^1.2.3",
@@ -60,8 +63,8 @@
"svelte-check": "^4.3.3",
"tslib": "^2.7.0",
"typescript": "^5.9.3",
"typescript-eslint": "^8.46.3",
"vite": "^7.1.12"
"typescript-eslint": "^8.47.0",
"vite": "^7.2.4"
}
},
"node_modules/@babel/code-frame": {
@@ -1623,9 +1626,9 @@
}
},
"node_modules/@babel/runtime": {
"version": "7.28.3",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz",
"integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==",
"version": "7.28.4",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz",
"integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -2072,6 +2075,15 @@
"tslib": "^2.1.0"
}
},
"node_modules/@capacitor/preferences": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/@capacitor/preferences/-/preferences-7.0.2.tgz",
"integrity": "sha512-JVCy0/oc6RsRencLOZ8rMqjNxAlHs7awPJU/MXqangsJ48oO2PnYGHfCvci6WgIJlqyC0QhvWZaO1BR1lVkHWQ==",
"license": "MIT",
"peerDependencies": {
"@capacitor/core": ">=7.0.0"
}
},
"node_modules/@capacitor/screen-orientation": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/@capacitor/screen-orientation/-/screen-orientation-7.0.2.tgz",
@@ -2081,6 +2093,15 @@
"@capacitor/core": ">=7.0.0"
}
},
"node_modules/@capacitor/share": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/@capacitor/share/-/share-7.0.2.tgz",
"integrity": "sha512-VyNPo/9831xnL17IMDeft5yNdBjoKNb451P95sRcr69hulRDqHc+kndqOVaMXnaA6IyBdWnnFv/n1HUf4cXpGw==",
"license": "MIT",
"peerDependencies": {
"@capacitor/core": ">=7.0.0"
}
},
"node_modules/@cspotcode/source-map-support": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
@@ -2793,6 +2814,28 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@macfja/serializer": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@macfja/serializer/-/serializer-1.1.4.tgz",
"integrity": "sha512-bUKIyLdSTyPfTgOvRqH8MkSDQhSaEGjUSvQlvnjA6tbeZDuY9u0WKieZNyqYwq3mPxytNd6Z5Lq2n4A3dA9HMA==",
"license": "MIT"
},
"node_modules/@macfja/svelte-persistent-store": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/@macfja/svelte-persistent-store/-/svelte-persistent-store-2.4.2.tgz",
"integrity": "sha512-ZAcWJcCnfZDIiy77Aoj9KQ6qDt6UmRZgUM3UHjmOY1IRf0SirDl1WgBFlVUMynRLERy4/EgZtWPqAMnh3cbCRA==",
"license": "MIT",
"dependencies": {
"@macfja/serializer": "^1.1.2",
"browser-cookies": "^1.2.0",
"idb-keyval": "^5.1.3 || ^6.2.1",
"sjcl-codec-hex": "^1.0.0",
"sjcl-es": "^2.0.0"
},
"peerDependencies": {
"svelte": "^3.0 || ^4.0 || ^5.0"
}
},
"node_modules/@material/material-color-utilities": {
"version": "0.2.7",
"resolved": "https://registry.npmjs.org/@material/material-color-utilities/-/material-color-utilities-0.2.7.tgz",
@@ -3339,9 +3382,9 @@
}
},
"node_modules/@sveltejs/kit": {
"version": "2.48.5",
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.48.5.tgz",
"integrity": "sha512-/rnwfSWS3qwUSzvHynUTORF9xSJi7PCR9yXkxUOnRrNqyKmCmh3FPHH+E9BbgqxXfTevGXBqgnlh9kMb+9T5XA==",
"version": "2.49.0",
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.49.0.tgz",
"integrity": "sha512-oH8tXw7EZnie8FdOWYrF7Yn4IKrqTFHhXvl8YxXxbKwTMcD/5NNCryUSEXRk2ZR4ojnub0P8rNrsVGHXWqIDtA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3665,17 +3708,17 @@
"license": "MIT"
},
"node_modules/@typescript-eslint/eslint-plugin": {
"version": "8.46.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.3.tgz",
"integrity": "sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw==",
"version": "8.48.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.48.0.tgz",
"integrity": "sha512-XxXP5tL1txl13YFtrECECQYeZjBZad4fyd3cFV4a19LkAY/bIp9fev3US4S5fDVV2JaYFiKAZ/GRTOLer+mbyQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/regexpp": "^4.10.0",
"@typescript-eslint/scope-manager": "8.46.3",
"@typescript-eslint/type-utils": "8.46.3",
"@typescript-eslint/utils": "8.46.3",
"@typescript-eslint/visitor-keys": "8.46.3",
"@typescript-eslint/scope-manager": "8.48.0",
"@typescript-eslint/type-utils": "8.48.0",
"@typescript-eslint/utils": "8.48.0",
"@typescript-eslint/visitor-keys": "8.48.0",
"graphemer": "^1.4.0",
"ignore": "^7.0.0",
"natural-compare": "^1.4.0",
@@ -3689,7 +3732,7 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
"@typescript-eslint/parser": "^8.46.3",
"@typescript-eslint/parser": "^8.48.0",
"eslint": "^8.57.0 || ^9.0.0",
"typescript": ">=4.8.4 <6.0.0"
}
@@ -3705,16 +3748,16 @@
}
},
"node_modules/@typescript-eslint/parser": {
"version": "8.46.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.3.tgz",
"integrity": "sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==",
"version": "8.48.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.48.0.tgz",
"integrity": "sha512-jCzKdm/QK0Kg4V4IK/oMlRZlY+QOcdjv89U2NgKHZk1CYTj82/RVSx1mV/0gqCVMJ/DA+Zf/S4NBWNF8GQ+eqQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/scope-manager": "8.46.3",
"@typescript-eslint/types": "8.46.3",
"@typescript-eslint/typescript-estree": "8.46.3",
"@typescript-eslint/visitor-keys": "8.46.3",
"@typescript-eslint/scope-manager": "8.48.0",
"@typescript-eslint/types": "8.48.0",
"@typescript-eslint/typescript-estree": "8.48.0",
"@typescript-eslint/visitor-keys": "8.48.0",
"debug": "^4.3.4"
},
"engines": {
@@ -3730,14 +3773,14 @@
}
},
"node_modules/@typescript-eslint/project-service": {
"version": "8.46.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.3.tgz",
"integrity": "sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ==",
"version": "8.48.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.48.0.tgz",
"integrity": "sha512-Ne4CTZyRh1BecBf84siv42wv5vQvVmgtk8AuiEffKTUo3DrBaGYZueJSxxBZ8fjk/N3DrgChH4TOdIOwOwiqqw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/tsconfig-utils": "^8.46.3",
"@typescript-eslint/types": "^8.46.3",
"@typescript-eslint/tsconfig-utils": "^8.48.0",
"@typescript-eslint/types": "^8.48.0",
"debug": "^4.3.4"
},
"engines": {
@@ -3752,14 +3795,14 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
"version": "8.46.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.3.tgz",
"integrity": "sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==",
"version": "8.48.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.48.0.tgz",
"integrity": "sha512-uGSSsbrtJrLduti0Q1Q9+BF1/iFKaxGoQwjWOIVNJv0o6omrdyR8ct37m4xIl5Zzpkp69Kkmvom7QFTtue89YQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/types": "8.46.3",
"@typescript-eslint/visitor-keys": "8.46.3"
"@typescript-eslint/types": "8.48.0",
"@typescript-eslint/visitor-keys": "8.48.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3770,9 +3813,9 @@
}
},
"node_modules/@typescript-eslint/tsconfig-utils": {
"version": "8.46.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.3.tgz",
"integrity": "sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==",
"version": "8.48.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.48.0.tgz",
"integrity": "sha512-WNebjBdFdyu10sR1M4OXTt2OkMd5KWIL+LLfeH9KhgP+jzfDV/LI3eXzwJ1s9+Yc0Kzo2fQCdY/OpdusCMmh6w==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3787,15 +3830,15 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
"version": "8.46.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.3.tgz",
"integrity": "sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw==",
"version": "8.48.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.48.0.tgz",
"integrity": "sha512-zbeVaVqeXhhab6QNEKfK96Xyc7UQuoFWERhEnj3mLVnUWrQnv15cJNseUni7f3g557gm0e46LZ6IJ4NJVOgOpw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/types": "8.46.3",
"@typescript-eslint/typescript-estree": "8.46.3",
"@typescript-eslint/utils": "8.46.3",
"@typescript-eslint/types": "8.48.0",
"@typescript-eslint/typescript-estree": "8.48.0",
"@typescript-eslint/utils": "8.48.0",
"debug": "^4.3.4",
"ts-api-utils": "^2.1.0"
},
@@ -3812,9 +3855,9 @@
}
},
"node_modules/@typescript-eslint/types": {
"version": "8.46.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.3.tgz",
"integrity": "sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==",
"version": "8.48.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.48.0.tgz",
"integrity": "sha512-cQMcGQQH7kwKoVswD1xdOytxQR60MWKM1di26xSUtxehaDs/32Zpqsu5WJlXTtTTqyAVK8R7hvsUnIXRS+bjvA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3826,21 +3869,20 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
"version": "8.46.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.3.tgz",
"integrity": "sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==",
"version": "8.48.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.48.0.tgz",
"integrity": "sha512-ljHab1CSO4rGrQIAyizUS6UGHHCiAYhbfcIZ1zVJr5nMryxlXMVWS3duFPSKvSUbFPwkXMFk1k0EMIjub4sRRQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/project-service": "8.46.3",
"@typescript-eslint/tsconfig-utils": "8.46.3",
"@typescript-eslint/types": "8.46.3",
"@typescript-eslint/visitor-keys": "8.46.3",
"@typescript-eslint/project-service": "8.48.0",
"@typescript-eslint/tsconfig-utils": "8.48.0",
"@typescript-eslint/types": "8.48.0",
"@typescript-eslint/visitor-keys": "8.48.0",
"debug": "^4.3.4",
"fast-glob": "^3.3.2",
"is-glob": "^4.0.3",
"minimatch": "^9.0.4",
"semver": "^7.6.0",
"tinyglobby": "^0.2.15",
"ts-api-utils": "^2.1.0"
},
"engines": {
@@ -3855,16 +3897,16 @@
}
},
"node_modules/@typescript-eslint/utils": {
"version": "8.46.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.3.tgz",
"integrity": "sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==",
"version": "8.48.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.48.0.tgz",
"integrity": "sha512-yTJO1XuGxCsSfIVt1+1UrLHtue8xz16V8apzPYI06W0HbEbEWHxHXgZaAgavIkoh+GeV6hKKd5jm0sS6OYxWXQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.7.0",
"@typescript-eslint/scope-manager": "8.46.3",
"@typescript-eslint/types": "8.46.3",
"@typescript-eslint/typescript-estree": "8.46.3"
"@typescript-eslint/scope-manager": "8.48.0",
"@typescript-eslint/types": "8.48.0",
"@typescript-eslint/typescript-estree": "8.48.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3879,13 +3921,13 @@
}
},
"node_modules/@typescript-eslint/visitor-keys": {
"version": "8.46.3",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.3.tgz",
"integrity": "sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==",
"version": "8.48.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.48.0.tgz",
"integrity": "sha512-T0XJMaRPOH3+LBbAfzR2jalckP1MSG/L9eUtY0DEzUyVaXJ/t6zN0nR7co5kz0Jko/nkSYCBRkz1djvjajVTTg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/types": "8.46.3",
"@typescript-eslint/types": "8.48.0",
"eslint-visitor-keys": "^4.2.1"
},
"engines": {
@@ -3910,15 +3952,15 @@
}
},
"node_modules/@vite-pwa/sveltekit": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@vite-pwa/sveltekit/-/sveltekit-1.0.1.tgz",
"integrity": "sha512-usweKTR0/Cj1rBGLNs+LCvBbGcCDuwtFCKxhPEijU0SCnbVOZEXuzX+8JulURYFnIsYzSX9L+FfHbtGRgl+5rw==",
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@vite-pwa/sveltekit/-/sveltekit-1.1.0.tgz",
"integrity": "sha512-mMIf2tY+7Hg8jecpu/WY+Ki2ikoXy3hVmt3tOxi0K+lYYnKQrDYthuHireI0S+26Mg9BXzL7qQF1xeB5VYlYlg==",
"dev": true,
"license": "MIT",
"dependencies": {
"kolorist": "^1.8.0",
"tinyglobby": "^0.2.9",
"vite-plugin-pwa": "^1.1.0"
"vite-plugin-pwa": "^1.2.0"
},
"engines": {
"node": ">=18.13"
@@ -4398,9 +4440,9 @@
"license": "MIT"
},
"node_modules/baseline-browser-mapping": {
"version": "2.8.29",
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.29.tgz",
"integrity": "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA==",
"version": "2.8.31",
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.31.tgz",
"integrity": "sha512-a28v2eWrrRWPpJSzxc+mKwm0ZtVx/G8SepdQZDArnXYU/XS+IF6mp8aB/4E+hH1tyGCoDo3KlUCdlSxGDsRkAw==",
"dev": true,
"license": "Apache-2.0",
"bin": {
@@ -4521,6 +4563,12 @@
"node": ">=8"
}
},
"node_modules/browser-cookies": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/browser-cookies/-/browser-cookies-1.2.0.tgz",
"integrity": "sha512-cg2WuoOJo+F+g2XjEaP8nmeRp1vDHjt7sqpKJMsTNXKrpyIBNVslYJeehvs6FEddj8usV2+qyRSBEX244yN5/g==",
"license": "Unlicence"
},
"node_modules/browserslist": {
"version": "4.28.0",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz",
@@ -4659,9 +4707,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001756",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001756.tgz",
"integrity": "sha512-4HnCNKbMLkLdhJz3TToeVWHSnfJvPaq6vu/eRP0Ahub/07n484XHhBF5AJoSGHdVrS8tKFauUQz8Bp9P7LVx7A==",
"version": "1.0.30001757",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001757.tgz",
"integrity": "sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==",
"dev": true,
"funding": [
{
@@ -5774,9 +5822,9 @@
}
},
"node_modules/electron-to-chromium": {
"version": "1.5.258",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.258.tgz",
"integrity": "sha512-rHUggNV5jKQ0sSdWwlaRDkFc3/rRJIVnOSe9yR4zrR07m3ZxhP4N27Hlg8VeJGGYgFTxK5NqDmWI4DSH72vIJg==",
"version": "1.5.262",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.262.tgz",
"integrity": "sha512-NlAsMteRHek05jRUxUR0a5jpjYq9ykk6+kO0yRaMi5moe7u0fVIOeQ3Y30A8dIiWFBNUoQGi1ljb1i5VtS9WQQ==",
"dev": true,
"license": "ISC"
},
@@ -7295,9 +7343,9 @@
}
},
"node_modules/i18next": {
"version": "25.6.0",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-25.6.0.tgz",
"integrity": "sha512-tTn8fLrwBYtnclpL5aPXK/tAYBLWVvoHM1zdfXoRNLcI+RvtMsoZRV98ePlaW3khHYKuNh/Q65W/+NVFUeIwVw==",
"version": "25.6.3",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-25.6.3.tgz",
"integrity": "sha512-AEQvoPDljhp67a1+NsnG/Wb1Nh6YoSvtrmeEd24sfGn3uujCtXCF3cXpr7ulhMywKNFF7p3TX1u2j7y+caLOJg==",
"funding": [
{
"type": "individual",
@@ -7314,7 +7362,7 @@
],
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.27.6"
"@babel/runtime": "^7.28.4"
},
"peerDependencies": {
"typescript": "^5"
@@ -7332,6 +7380,12 @@
"dev": true,
"license": "ISC"
},
"node_modules/idb-keyval": {
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.2.tgz",
"integrity": "sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg==",
"license": "Apache-2.0"
},
"node_modules/ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
@@ -10943,9 +10997,9 @@
}
},
"node_modules/shaka-player": {
"version": "4.16.2",
"resolved": "https://registry.npmjs.org/shaka-player/-/shaka-player-4.16.2.tgz",
"integrity": "sha512-AFswL7ZXT37UceDAsovQXQ3BRGLmPcmdgXgLVJdmHN2mnrYCvTrl7CGg2jeIPxUOHipAeeq33LrDM9uGBlQRVA==",
"version": "4.16.10",
"resolved": "https://registry.npmjs.org/shaka-player/-/shaka-player-4.16.10.tgz",
"integrity": "sha512-FJJk3rbV6IQ/gmdB6EZ4q4VuCKXdWG1pf7dPuqfZi6lNWIvymT4YWE+Hv5qkBwJRtT0L/8p/EFJKMhwE4AMTMQ==",
"license": "Apache-2.0",
"engines": {
"node": ">=18"
@@ -11188,6 +11242,30 @@
"integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
"license": "MIT"
},
"node_modules/sjcl-bit-array": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/sjcl-bit-array/-/sjcl-bit-array-1.0.0.tgz",
"integrity": "sha512-xoR134YJa7AHToLqCWuLYGpAdcBuLbSgwXe9c5HTIN4vr5TILXO/jVF8pLeXDhC7JTOvpmXUkiOupawVNTZVdQ==",
"license": "BSD or GPL 2.0"
},
"node_modules/sjcl-codec-hex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/sjcl-codec-hex/-/sjcl-codec-hex-1.0.0.tgz",
"integrity": "sha512-lBBjqky1BEH+WZdABR/iSl2Pu3HO8n8r2D7nkzYLZfcR9ke4kUGMvO0ztRkla5oi4Esbc9pOlBtyGeMjYOU0ng==",
"license": "BSD or GPL 2.0",
"dependencies": {
"sjcl-bit-array": "~1.0.0"
}
},
"node_modules/sjcl-es": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/sjcl-es/-/sjcl-es-2.0.0.tgz",
"integrity": "sha512-P8O+4pAt95XqmTlvvPdbmBggjAgSE0LQnhSEYUKYKepN176b/8K9zcVrrqhuLu5EUQyeCYy/56J9FzxvzvMavg==",
"license": "(BSD-2-Clause OR GPL-2.0-only)",
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
}
},
"node_modules/slash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
@@ -11741,18 +11819,6 @@
"integrity": "sha512-Jo+f/yr/HmZQuIiiKKzAHVFXdAUWHW2RBbrcQTil8JVk1sCm/riy7KTJVzjBgQvHasrFQYKF84zvtc9/Y4lFYg==",
"license": "MIT"
},
"node_modules/svelte-persisted-store": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/svelte-persisted-store/-/svelte-persisted-store-0.12.0.tgz",
"integrity": "sha512-BdBQr2SGSJ+rDWH8/aEV5GthBJDapVP0GP3fuUCA7TjYG5ctcB+O9Mj9ZC0+Jo1oJMfZUd1y9H68NFRR5MyIJA==",
"license": "MIT",
"engines": {
"node": ">=0.14"
},
"peerDependencies": {
"svelte": "^3.48.0 || ^4 || ^5"
}
},
"node_modules/tar": {
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
@@ -12210,16 +12276,16 @@
}
},
"node_modules/typescript-eslint": {
"version": "8.46.3",
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.3.tgz",
"integrity": "sha512-bAfgMavTuGo+8n6/QQDVQz4tZ4f7Soqg53RbrlZQEoAltYop/XR4RAts/I0BrO3TTClTSTFJ0wYbla+P8cEWJA==",
"version": "8.48.0",
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.48.0.tgz",
"integrity": "sha512-fcKOvQD9GUn3Xw63EgiDqhvWJ5jsyZUaekl3KVpGsDJnN46WJTe3jWxtQP9lMZm1LJNkFLlTaWAxK2vUQR+cqw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/eslint-plugin": "8.46.3",
"@typescript-eslint/parser": "8.46.3",
"@typescript-eslint/typescript-estree": "8.46.3",
"@typescript-eslint/utils": "8.46.3"
"@typescript-eslint/eslint-plugin": "8.48.0",
"@typescript-eslint/parser": "8.48.0",
"@typescript-eslint/typescript-estree": "8.48.0",
"@typescript-eslint/utils": "8.48.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -12434,9 +12500,9 @@
}
},
"node_modules/vite": {
"version": "7.1.12",
"resolved": "https://registry.npmjs.org/vite/-/vite-7.1.12.tgz",
"integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==",
"version": "7.2.4",
"resolved": "https://registry.npmjs.org/vite/-/vite-7.2.4.tgz",
"integrity": "sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -12509,17 +12575,17 @@
}
},
"node_modules/vite-plugin-pwa": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-1.1.0.tgz",
"integrity": "sha512-VsSpdubPzXhHWVINcSx6uHRMpOHVHQcHsef1QgkOlEoaIDAlssFEW88LBq1a59BuokAhsh2kUDJbaX1bZv4Bjw==",
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-1.2.0.tgz",
"integrity": "sha512-a2xld+SJshT9Lgcv8Ji4+srFJL4k/1bVbd1x06JIkvecpQkwkvCncD1+gSzcdm3s+owWLpMJerG3aN5jupJEVw==",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "^4.3.6",
"pretty-bytes": "^6.1.1",
"tinyglobby": "^0.2.10",
"workbox-build": "^7.3.0",
"workbox-window": "^7.3.0"
"workbox-build": "^7.4.0",
"workbox-window": "^7.4.0"
},
"engines": {
"node": ">=16.0.0"
@@ -12530,8 +12596,8 @@
"peerDependencies": {
"@vite-pwa/assets-generator": "^1.0.0",
"vite": "^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0",
"workbox-build": "^7.3.0",
"workbox-window": "^7.3.0"
"workbox-build": "^7.4.0",
"workbox-window": "^7.4.0"
},
"peerDependenciesMeta": {
"@vite-pwa/assets-generator": {
+9 -6
View File
@@ -19,7 +19,7 @@
"@capacitor/cli": "^7.4.4",
"@sveltejs/adapter-auto": "^6.0.1",
"@sveltejs/adapter-static": "^3.0.10",
"@sveltejs/kit": "^2.46.5",
"@sveltejs/kit": "^2.49.0",
"@sveltejs/vite-plugin-svelte": "^6.2.1",
"@types/event-source-polyfill": "^1.0.5",
"@types/he": "^1.2.3",
@@ -36,8 +36,8 @@
"svelte-check": "^4.3.3",
"tslib": "^2.7.0",
"typescript": "^5.9.3",
"typescript-eslint": "^8.46.3",
"vite": "^7.1.12"
"typescript-eslint": "^8.47.0",
"vite": "^7.2.4"
},
"type": "module",
"dependencies": {
@@ -48,7 +48,11 @@
"@capacitor/browser": "^7.0.0",
"@capacitor/clipboard": "^7.0.0",
"@capacitor/core": "^7.4.3",
"@capacitor/preferences": "^7.0.2",
"@capacitor/screen-orientation": "^7.0.0",
"@capacitor/share": "^7.0.2",
"@macfja/serializer": "^1.1.4",
"@macfja/svelte-persistent-store": "^2.4.2",
"beercss": "^3.12.13",
"bgutils-js": "^3.2.0",
"capacitor-nodejs": "https://github.com/hampoelz/capacitor-nodejs/releases/download/v1.0.0-beta.9/capacitor-nodejs.tgz",
@@ -57,17 +61,16 @@
"googlevideo": "^4.0.4",
"he": "^1.2.0",
"human-number": "^2.0.7",
"i18next": "^25.6.0",
"i18next": "^25.6.3",
"iso-3166": "^4.4.0",
"iso-639-1": "^3.1.5",
"material-dynamic-colors": "^1.1.1",
"media-captions": "^1.0.4",
"mousetrap": "^1.6.5",
"peerjs": "^1.5.5",
"shaka-player": "^4.16.2",
"shaka-player": "^4.16.9",
"sponsorblock-api": "^0.2.4",
"svelte-infinite-loading": "^1.4.0",
"svelte-persisted-store": "^0.12.0",
"youtubei.js": "^16.0.1"
}
}
@@ -1,11 +1,8 @@
import { timeout } from '$lib/misc';
import { Capacitor } from '@capacitor/core';
const originalFetch = window.fetch;
const corsProxyUrl: string = 'http://localhost:3000/';
let nodejsStarted = false;
function needsProxying(target: string): boolean {
if (!target.startsWith('http')) return false;
return true;
@@ -15,19 +12,6 @@ export const androidFetch = async (
requestInput: string | URL | Request,
requestOptions?: RequestInit
): Promise<Response> => {
// On initial request pause until OPTIONS request passes on local proxy, only reliable way
// to ensure proxy is working on android.
if (!nodejsStarted) {
let testResp: Response | undefined = undefined;
while (typeof testResp === 'undefined' || !testResp.ok) {
try {
testResp = await originalFetch(corsProxyUrl, { method: 'OPTIONS' });
} catch (error) {}
await timeout(100);
}
nodejsStarted = true;
}
const uri = requestInput instanceof Request ? requestInput.url : requestInput.toString();
if (needsProxying(uri)) {
+45 -42
View File
@@ -53,7 +53,6 @@
interface Props {
data: { video: VideoPlay; content: PhasedDescription; playlistId: string | null };
isSyncing?: boolean;
isEmbed?: boolean;
playerElement?: HTMLMediaElement | undefined;
}
@@ -155,6 +154,47 @@
}
}
async function onAndroidFullscreenChange() {
const videoFormats = data.video.adaptiveFormats.filter((format) =>
format.type.startsWith('video/')
);
const isFullScreen = !!document.fullscreenElement;
if (isFullScreen) {
// Ensure bar color is black while in fullscreen
await SafeArea.enable({
config: {
customColorsForSystemBars: true,
statusBarColor: '#00000000',
statusBarContent: 'light',
navigationBarColor: '#00000000',
navigationBarContent: 'light'
}
});
} else {
await setStatusBarColor();
}
if (!$playerAndroidLockOrientation) return;
if (isFullScreen && videoFormats[0].resolution) {
const widthHeight = videoFormats[0].resolution.split('x');
if (widthHeight.length !== 2) return;
if (Number(widthHeight[0]) > Number(widthHeight[1])) {
await ScreenOrientation.lock({ orientation: 'landscape' });
} else {
await ScreenOrientation.lock({ orientation: 'portrait' });
}
} else {
await ScreenOrientation.lock({
orientation: (originalOrigination as ScreenOrientationResult).type
});
}
}
async function androidHandleRotate() {
if (
Capacitor.getPlatform() !== 'android' ||
@@ -163,48 +203,9 @@
)
return;
const videoFormats = data.video.adaptiveFormats.filter((format) =>
format.type.startsWith('video/')
);
originalOrigination = await ScreenOrientation.orientation();
document.addEventListener('fullscreenchange', async () => {
const isFullScreen = !!document.fullscreenElement;
if (isFullScreen) {
// Ensure bar color is black while in fullscreen
await SafeArea.enable({
config: {
customColorsForSystemBars: true,
statusBarColor: '#00000000',
statusBarContent: 'light',
navigationBarColor: '#00000000',
navigationBarContent: 'light'
}
});
} else {
await setStatusBarColor();
}
if (!$playerAndroidLockOrientation) return;
if (isFullScreen && videoFormats[0].resolution) {
const widthHeight = videoFormats[0].resolution.split('x');
if (widthHeight.length !== 2) return;
if (Number(widthHeight[0]) > Number(widthHeight[1])) {
await ScreenOrientation.lock({ orientation: 'landscape' });
} else {
await ScreenOrientation.lock({ orientation: 'portrait' });
}
} else {
await ScreenOrientation.lock({
orientation: (originalOrigination as ScreenOrientationResult).type
});
}
});
document.addEventListener('fullscreenchange', onAndroidFullscreenChange);
}
async function setupSponsorSkip() {
@@ -787,6 +788,8 @@
onDestroy(async () => {
if (Capacitor.getPlatform() === 'android' && !$isAndroidTvStore) {
document.removeEventListener('fullscreenchange', onAndroidFullscreenChange);
if (originalOrigination) {
await ScreenOrientation.lock({
orientation: originalOrigination.type
@@ -833,7 +836,7 @@
id="player"
poster={getBestThumbnail(data.video.videoThumbnails, 9999, 9999)}
></video>
{#if isEmbed && !isAndroidTvStore}
{#if isEmbed && !$isAndroidTvStore}
<div class="chip blur embed" style="position: absolute;top: 10px;left: 10px;font-size: 18px;">
{data.video.title}
</div>
@@ -1,6 +1,8 @@
<script lang="ts">
import { resolve } from '$app/paths';
import { instanceStore } from '$lib/store';
import { instanceStore, interfaceAndroidUseNativeShare } from '$lib/store';
import { Share } from '@capacitor/share';
import ui from 'beercss';
import { Clipboard } from '@capacitor/clipboard';
import { Capacitor } from '@capacitor/core';
import { _ } from '$lib/i18n';
@@ -14,62 +16,71 @@
let { video, currentTime = $bindable() }: Props = $props();
let includeTimestamp: boolean = $state(false);
async function shareUrl(url: string, param: string = 't') {
if (includeTimestamp) url += `?${param}=${Math.floor(currentTime ?? 0)}`;
if (
(await Share.canShare()) &&
Capacitor.getPlatform() !== 'electron' &&
$interfaceAndroidUseNativeShare
) {
await Share.share({ url: url, dialogTitle: video.title });
} else {
await Clipboard.write({ string: url });
ui('#share-success');
}
}
</script>
{#if currentTime !== undefined}
<li class="row">
<label class="switch">
<input type="checkbox" bind:checked={includeTimestamp} />
<span></span>
</label>
<div class="min">{$_('player.share.includeTimestamp')}</div>
<menu class="no-wrap mobile" data-ui="#share-menu" id="share-menu">
{#if currentTime !== undefined}
<li class="row">
<label class="switch">
<input type="checkbox" bind:checked={includeTimestamp} />
<span></span>
</label>
<div class="min">{$_('player.share.includeTimestamp')}</div>
</li>
<div class="divider"></div>
{/if}
<li
data-ui="#share-menu"
class="row"
role="presentation"
onclick={async () => {
if (Capacitor.isNativePlatform()) {
shareUrl(`${get(instanceStore)}/watch/${video.videoId}`);
} else {
shareUrl(
`${location.origin}${resolve('/watch/[videoId]', { videoId: video.videoId })}`,
'time'
);
}
}}
>
<div class="min">{$_('player.share.materialiousLink')}</div>
</li>
<div class="divider"></div>
{/if}
<li
class="row"
role="presentation"
onclick={async () => {
let url = '';
if (Capacitor.isNativePlatform()) {
url = `${get(instanceStore)}/watch/${video.videoId}`;
} else {
url = `${location.origin}${resolve('/watch/[videoId]', { videoId: video.videoId })}`;
}
if (includeTimestamp && currentTime !== undefined) {
url += `?time=${Math.floor(currentTime)}`;
}
await Clipboard.write({ string: url });
(document.activeElement as HTMLElement)?.blur();
}}
>
<div class="min">{$_('player.share.materialiousLink')}</div>
</li>
<li
class="row"
role="presentation"
onclick={async () => {
let url = `https://redirect.invidious.io/watch?v=${video.videoId}`;
if (includeTimestamp && currentTime !== undefined) {
url += `&t=${Math.floor(currentTime)}`;
}
await Clipboard.write({ string: url });
(document.activeElement as HTMLElement)?.blur();
}}
>
<div class="min">{$_('player.share.invidiousRedirect')}</div>
</li>
<li
class="row"
role="presentation"
onclick={async () => {
let url = `https://www.youtube.com/watch?v=${video.videoId}`;
if (includeTimestamp && currentTime !== undefined) {
url += `&t=${Math.floor(currentTime)}`;
}
await Clipboard.write({ string: url });
(document.activeElement as HTMLElement)?.blur();
}}
>
<div class="min">{$_('player.share.youtubeLink')}</div>
</li>
<li
data-ui="#share-menu"
class="row"
role="presentation"
onclick={async () => {
shareUrl(`https://redirect.invidious.io/watch?v=${video.videoId}`);
}}
>
<div class="min">{$_('player.share.invidiousRedirect')}</div>
</li>
<li
data-ui="#share-menu"
class="row"
role="presentation"
onclick={async () => {
shareUrl(`https://www.youtube.com/watch?v=${video.videoId}`);
}}
>
<div class="min">{$_('player.share.youtubeLink')}</div>
</li>
</menu>
<div class="snackbar" id="share-success">{$_('player.share.copiedSuccess')}</div>
@@ -18,6 +18,7 @@
instanceStore,
interfaceAllowInsecureRequests,
interfaceAmoledTheme,
interfaceAndroidUseNativeShare,
interfaceAutoExpandChapters,
interfaceAutoExpandComments,
interfaceAutoExpandDesc,
@@ -304,6 +305,25 @@
</nav>
</div>
{#if Capacitor.getPlatform() == 'android'}
<div class="field no-margin">
<nav class="no-padding">
<div class="max">
<div>{$_('layout.androidNativeShare')}</div>
</div>
<label class="switch" tabindex="0">
<input
type="checkbox"
bind:checked={$interfaceAndroidUseNativeShare}
onclick={() => interfaceAndroidUseNativeShare.set(!$interfaceAndroidUseNativeShare)}
role="switch"
/>
<span></span>
</label>
</nav>
</div>
{/if}
{#if Capacitor.getPlatform() == 'electron'}
<div class="field no-margin">
<nav class="no-padding">
@@ -330,7 +350,7 @@
bind:value={region}
onchange={() => interfaceRegionStore.set(region)}
>
{#each iso31661 as region}
{#each iso31661 as region (region)}
<option selected={$interfaceRegionStore === region.alpha2} value={region.alpha2}
>{region.alpha2} - {region.name}</option
>
@@ -348,7 +368,7 @@
onchange={() => interfaceForceCase.set(forceCase)}
>
<option selected={$interfaceForceCase === null} value={null}>Default</option>
{#each titleCases as caseType}
{#each titleCases as caseType (caseType)}
<option selected={$interfaceForceCase === caseType} value={caseType}
>{letterCase(`${caseType}`, caseType)}</option
>
@@ -365,7 +385,7 @@
bind:value={defaultPage}
onchange={() => interfaceDefaultPage.set(defaultPage)}
>
{#each pages as page}
{#each pages as page (page)}
{#if !page.requiresAuth || get(authStore)}
<option selected={$interfaceDefaultPage === page.href} value={page.href}>{page.name}</option
>
@@ -95,7 +95,7 @@
<i>{tabs[tabIds.indexOf(activeTab)].icon}</i>
<span>{tabs[tabIds.indexOf(activeTab)].label}</span>
<menu style="width: 100%;" data-ui="#tab-menu" id="tab-menu">
{#each tabs as tab, _}
{#each tabs as tab (tab)}
<li
onclick={() => {
activeTab = tab.id;
@@ -112,7 +112,7 @@
</nav>
<nav class="tabbed small m l" style="outline: none" role="tablist" tabindex="0">
{#each tabs as tab, index}
{#each tabs as tab, index (tab)}
<a
role="tab"
class:active={isActive(tab.id)}
@@ -153,7 +153,7 @@
</nav>
<div class="space"></div>
<div class="divider"></div>
{#each tabs as tab, _}
{#each tabs as tab (tab)}
<div
class="page padding"
id={`panel-${tab.id}`}
@@ -12,7 +12,9 @@
} from '../../store';
let sponsorCategoriesList: string[] = $state([]);
sponsorBlockCategoriesStore.subscribe((value) => (sponsorCategoriesList = value));
sponsorBlockCategoriesStore.subscribe((value) => {
sponsorCategoriesList = value;
});
let sponsorBlockInstance = $state(get(sponsorBlockUrlStore));
@@ -105,7 +107,7 @@
<p class="bold">{$_('layout.sponsors.Catagories')}</p>
{#each sponsorCategories as sponsor}
{#each sponsorCategories as sponsor (sponsor)}
<div class="field middle-align no-margin">
<nav class="no-padding">
<div class="max">
+3 -1
View File
@@ -102,7 +102,8 @@
"materialiousLink": "Copy Materialious link",
"invidiousRedirect": "Copy Invidious redirect link",
"youtubeLink": "Copy Youtube link",
"includeTimestamp": "Timestamped"
"includeTimestamp": "Timestamped",
"copiedSuccess": "Copied to clipboard"
},
"download": "Download",
"downloadSteps": {
@@ -157,6 +158,7 @@
"expandComments": "Expand comments by default",
"allowInsecureRequests": "Allow insecure requests",
"disableAutoUpdate": "Disable automatic updates",
"androidNativeShare": "Use native share",
"player": {
"title": "Player",
"autoPlay": "Autoplay video",
+260 -84
View File
@@ -1,9 +1,16 @@
import { Capacitor } from '@capacitor/core';
import type Peer from 'peerjs';
import type { DataConnection } from 'peerjs';
import { persisted } from 'svelte-persisted-store';
import { writable, type Writable } from 'svelte/store';
import { Preferences } from '@capacitor/preferences';
import {
persist,
createLocalStorage,
type StorageInterface,
type SelfUpdateStorageInterface
} from '@macfja/svelte-persistent-store';
import type { TitleCase } from './letterCasing';
import { serialize, deserialize } from '@macfja/serializer';
import type {
Channel,
HashTag,
@@ -17,6 +24,59 @@ import type {
import { ensureNoTrailingSlash } from './misc';
import type { PhasedDescription } from './timestamps';
function createListenerFunctions(): {
callListeners: (eventKey: string, newValue: any) => void;
addListener: (key: string, listener: (newValue: any) => void) => void;
removeListener: (key: string, listener: (newValue: any) => void) => void;
} {
const listeners: Array<{ key: string; listener: (newValue: any) => void }> = [];
return {
callListeners(eventKey: string, newValue: any) {
if (newValue === undefined) {
return;
}
listeners.filter(({ key }) => key === eventKey).forEach(({ listener }) => listener(newValue));
},
addListener(key: string, listener: (newValue: any) => void) {
listeners.push({ key, listener });
},
removeListener(key: string, listener: (newValue: any) => void) {
const index = listeners.indexOf({ key, listener });
if (index !== -1) {
listeners.splice(index, 1);
}
}
};
}
function createStorage(): StorageInterface<any> | SelfUpdateStorageInterface<any> {
if (Capacitor.getPlatform() === 'android') {
// https://github.com/MacFJA/svelte-persistent-store/blob/main/.docs/How-To/02-New-Async-Storage.md
const { removeListener, callListeners, addListener } = createListenerFunctions();
return {
getValue(key: string): any | null {
Preferences.get({ key: key }).then((value) => {
if (value.value !== null) {
callListeners(key, deserialize(value.value));
}
});
return null;
},
deleteValue(key: string) {
Preferences.remove({ key: key });
},
setValue(key: string, value: any) {
Preferences.set({ key: key, value: serialize(value) });
},
addListener,
removeListener
};
} else {
return createLocalStorage(true);
}
}
function platformDependentDefault(givenValue: any, defaultValue: any): any {
if (typeof givenValue !== 'undefined' && givenValue !== null) {
return givenValue;
@@ -25,115 +85,227 @@ function platformDependentDefault(givenValue: any, defaultValue: any): any {
}
}
export const instanceStore: Writable<string> = persisted(
'invidiousInstance',
platformDependentDefault(
!import.meta.env.VITE_DEFAULT_INVIDIOUS_INSTANCE
? undefined
: ensureNoTrailingSlash(import.meta.env.VITE_DEFAULT_INVIDIOUS_INSTANCE),
'https://invidious.materialio.us'
)
export const instanceStore: Writable<string> = persist(
writable(
platformDependentDefault(
!import.meta.env.VITE_DEFAULT_INVIDIOUS_INSTANCE
? undefined
: ensureNoTrailingSlash(import.meta.env.VITE_DEFAULT_INVIDIOUS_INSTANCE),
'https://invidious.materialio.us'
)
),
createStorage(),
'invidiousInstance'
);
export const authStore: Writable<null | { username: string; token: string }> = persisted(
'authToken',
null
export const authStore: Writable<null | { username: string; token: string }> = persist(
writable(null),
createStorage(),
'authToken'
);
export const darkModeStore: Writable<null | boolean> = persisted('darkMode', null);
export const themeColorStore: Writable<null | string> = persisted('themeColor', null);
export const darkModeStore: Writable<null | boolean> = persist(
writable(null),
createStorage(),
'darkMode'
);
export const themeColorStore: Writable<null | string> = persist(
writable(null),
createStorage(),
'themeColor'
);
export const showWarningStore = persisted('showWarning', true);
export const showWarningStore = persist(writable(true), createStorage(), 'showWarning');
export const playerAutoPlayStore = persisted('autoPlay', true);
export const playerAlwaysLoopStore = persisted('alwaysLoop', false);
export const playerProxyVideosStore = persisted('proxyVideos', true);
export const playerSavePlaybackPositionStore = persisted('savePlaybackPosition', true);
export const playerTheatreModeByDefaultStore = persisted('theatreModeByDefault', false);
export const playerDefaultQualityStore = persisted('defaultQuality', 'auto');
export const playerAutoplayNextByDefaultStore = persisted('autoplayNextByDefault', false);
export const playerYouTubeJsFallback = persisted('youTubeJsFallback', true);
export const playerYouTubeJsAlways = persisted('youTubeJsAlways', false);
export const playerAndroidLockOrientation = persisted('androidLockOrientation', true);
export const playerDefaultLanguage = persisted('defaultLanguage', 'original');
export const playerCCByDefault = persisted('CCByDefault', false);
export const playerDefaultPlaybackSpeed: Writable<number> = persisted('defaultPlaybackSpeed', 1);
export const playerStatisticsByDefault = persisted('playerStatistics', false);
export const playerMiniplayerEnabled = persisted('miniplayerEnabled', true);
export const playerAutoPlayStore = persist(writable(true), createStorage(), 'autoPlay');
export const playerAlwaysLoopStore = persist(writable(false), createStorage(), 'alwaysLoop');
export const playerProxyVideosStore = persist(writable(true), createStorage(), 'proxyVideos');
export const playerSavePlaybackPositionStore = persist(
writable(true),
createStorage(),
'savePlaybackPosition'
);
export const playerTheatreModeByDefaultStore = persist(
writable(false),
createStorage(),
'theatreModeByDefault'
);
export const playerDefaultQualityStore = persist(
writable('auto'),
createStorage(),
'defaultQuality'
);
export const playerAutoplayNextByDefaultStore = persist(
writable(false),
createStorage(),
'autoplayNextByDefault'
);
export const playerYouTubeJsFallback = persist(
writable(true),
createStorage(),
'youTubeJsFallback'
);
export const playerYouTubeJsAlways = persist(writable(false), createStorage(), 'youTubeJsAlways');
export const playerAndroidLockOrientation = persist(
writable(true),
createStorage(),
'androidLockOrientation'
);
export const playerDefaultLanguage = persist(
writable('original'),
createStorage(),
'defaultLanguage'
);
export const playerCCByDefault = persist(writable(false), createStorage(), 'CCByDefault');
export const playerDefaultPlaybackSpeed: Writable<number> = persist(
writable(1),
createStorage(),
'defaultPlaybackSpeed'
);
export const playerStatisticsByDefault = persist(
writable(false),
createStorage(),
'playerStatistics'
);
export const playerMiniplayerEnabled = persist(
writable(true),
createStorage(),
'miniplayerEnabled'
);
export const playerPlaylistHistory: Writable<string[]> = writable([]);
export interface PlayerState {
data: { video: VideoPlay; content: PhasedDescription; playlistId: string | null };
isSyncing?: boolean;
playerElement?: HTMLMediaElement | undefined;
}
export const playerState: Writable<PlayerState | undefined> = writable(undefined);
export const playertheatreModeIsActive = writable(false);
export const returnYtDislikesStore = persisted('returnYtDislikes', false);
export const returnYTDislikesInstanceStore: Writable<string | null | undefined> = persisted(
'returnYTDislikesInstance',
platformDependentDefault(
import.meta.env.VITE_DEFAULT_RETURNYTDISLIKES_INSTANCE,
'https://ryd-proxy.materialio.us'
)
export const returnYtDislikesStore = persist(writable(false), createStorage(), 'returnYtDislikes');
export const returnYTDislikesInstanceStore: Writable<string | null | undefined> = persist(
writable(
platformDependentDefault(
import.meta.env.VITE_DEFAULT_RETURNYTDISLIKES_INSTANCE,
'https://ryd-proxy.materialio.us'
)
),
createStorage(),
'returnYTDislikesInstance'
);
export const synciousStore = persisted('syncious', false);
export const synciousInstanceStore: Writable<string | null | undefined> = persisted(
'synciousInstance',
platformDependentDefault(
import.meta.env.VITE_DEFAULT_SYNCIOUS_INSTANCE ||
import.meta.env.VITE_DEFAULT_API_EXTENDED_INSTANCE,
'https://extended-api.materialio.us'
)
export const synciousStore = persist(writable(false), createStorage(), 'syncious');
export const synciousInstanceStore: Writable<string | null | undefined> = persist(
writable(
platformDependentDefault(
import.meta.env.VITE_DEFAULT_SYNCIOUS_INSTANCE ||
import.meta.env.VITE_DEFAULT_API_EXTENDED_INSTANCE,
'https://extended-api.materialio.us'
)
),
createStorage(),
'synciousInstance'
);
export const interfaceRegionStore: Writable<string> = persisted('interfaceRegion', 'US');
export const interfaceSearchSuggestionsStore = persisted('searchSuggestions', true);
export const interfaceForceCase: Writable<TitleCase> = persisted('forceCase', null);
export const interfaceAutoExpandComments: Writable<boolean> = persisted('autoExpandComments', true);
export const interfaceAutoExpandDesc: Writable<boolean> = persisted('autoExpandDesc', false);
export const interfaceAutoExpandChapters: Writable<boolean> = persisted(
'autoExpandChapters',
false
export const interfaceRegionStore: Writable<string> = persist(
writable('US'),
createStorage(),
'interfaceRegion'
);
export const interfaceAmoledTheme = persisted('amoledTheme', false);
export const interfaceLowBandwidthMode = persisted('lowBandwidthMode', false);
export const interfaceDisplayThumbnailAvatars = persisted('disableThumbnailAvatars', false);
export const interfaceDefaultPage = persisted('defaultPage', '/');
export const interfaceSearchHistoryEnabled = persisted('searchHistoryEnabled', false);
export const interfaceAllowInsecureRequests = persisted('allowInsecureRequests', false);
export const interfaceDisableAutoUpdate = persisted('disableAutoUpdate', false);
export const sponsorBlockStore = persisted('sponsorBlock', true);
export const sponsorBlockUrlStore: Writable<string | null | undefined> = persisted(
'sponsorBlockUrl',
import.meta.env.VITE_DEFAULT_SPONSERBLOCK_INSTANCE || 'https://sponsor.ajay.app'
export const interfaceSearchSuggestionsStore = persist(
writable(true),
createStorage(),
'searchSuggestions'
);
export const sponsorBlockCategoriesStore: Writable<string[]> = persisted(
'sponsorBlockCategories',
[]
export const interfaceForceCase: Writable<TitleCase> = persist(
writable(null),
createStorage(),
'forceCase'
);
export const sponsorBlockDisplayToastStore: Writable<boolean> = persisted(
'sponsorBlockDisplayToast',
false
export const interfaceAutoExpandComments: Writable<boolean> = persist(
writable(true),
createStorage(),
'autoExpandComments'
);
export const sponsorBlockTimelineStore: Writable<boolean> = persisted(
'sponsorBlockTimeline',
false
export const interfaceAutoExpandDesc: Writable<boolean> = persist(
writable(false),
createStorage(),
'autoExpandDesc'
);
export const interfaceAutoExpandChapters: Writable<boolean> = persist(
writable(false),
createStorage(),
'autoExpandChapters'
);
export const interfaceAmoledTheme = persist(writable(false), createStorage(), 'amoledTheme');
export const interfaceLowBandwidthMode = persist(
writable(false),
createStorage(),
'lowBandwidthMode'
);
export const interfaceDisplayThumbnailAvatars = persist(
writable(false),
createStorage(),
'disableThumbnailAvatars'
);
export const interfaceDefaultPage = persist(writable('/'), createStorage(), 'defaultPage');
export const interfaceSearchHistoryEnabled = persist(
writable(false),
createStorage(),
'searchHistoryEnabled'
);
export const interfaceAllowInsecureRequests = persist(
writable(false),
createStorage(),
'allowInsecureRequests'
);
export const interfaceDisableAutoUpdate = persist(
writable(false),
createStorage(),
'disableAutoUpdate'
);
export const interfaceAndroidUseNativeShare = persist(
writable(true),
createStorage(),
'androidUseNativeShare'
);
export const deArrowInstanceStore = persisted(
'deArrowInstance',
import.meta.env.VITE_DEFAULT_DEARROW_INSTANCE || 'https://sponsor.ajay.app'
export const sponsorBlockStore = persist(writable(true), createStorage(), 'sponsorBlock');
export const sponsorBlockUrlStore: Writable<string | null | undefined> = persist(
writable(import.meta.env.VITE_DEFAULT_SPONSERBLOCK_INSTANCE || 'https://sponsor.ajay.app'),
createStorage(),
'sponsorBlockUrl'
);
export const deArrowEnabledStore = persisted('deArrowEnabled', false);
export const deArrowTitlesOnly = persisted('deArrowTitlesOnly', true);
export const deArrowThumbnailInstanceStore = persisted(
'deArrowThumbnailInstance',
import.meta.env.VITE_DEFAULT_DEARROW_THUMBNAIL_INSTANCE || 'https://dearrow-thumb.ajay.app'
export const sponsorBlockCategoriesStore: Writable<string[]> = persist(
writable([]),
createStorage(),
'sponsorBlockCategories'
);
export const sponsorBlockDisplayToastStore: Writable<boolean> = persist(
writable(false),
createStorage(),
'sponsorBlockDisplayToast'
);
export const sponsorBlockTimelineStore: Writable<boolean> = persist(
writable(false),
createStorage(),
'sponsorBlockTimeline'
);
export const deArrowInstanceStore = persist(
writable(import.meta.env.VITE_DEFAULT_DEARROW_INSTANCE || 'https://sponsor.ajay.app'),
createStorage(),
'deArrowInstance'
);
export const deArrowEnabledStore = persist(writable(false), createStorage(), 'deArrowEnabled');
export const deArrowTitlesOnly = persist(writable(true), createStorage(), 'deArrowTitlesOnly');
export const deArrowThumbnailInstanceStore = persist(
writable(
import.meta.env.VITE_DEFAULT_DEARROW_THUMBNAIL_INSTANCE || 'https://dearrow-thumb.ajay.app'
),
createStorage(),
'deArrowThumbnailInstance'
);
export const syncPartyPeerStore: Writable<Peer | null> = writable(null);
@@ -144,7 +316,11 @@ export const playlistSettingsStore: Writable<Record<string, { shuffle: boolean;
export const poTokenCacheStore: Writable<string | undefined> = writable();
export const searchHistoryStore: Writable<string[]> = persisted('searchHistory', []);
export const searchHistoryStore: Writable<string[]> = persist(
writable([]),
createStorage(),
'searchHistory'
);
export const feedCacheStore: Writable<{
[key: string]: (VideoBase | Video | PlaylistPageVideo)[];
+18 -18
View File
@@ -10,34 +10,34 @@ export async function getDynamicTheme(mode?: string): Promise<Record<string, str
// @ts-ignore
const themes: string = givenSettings[mode ? mode : (ui('mode') as string)];
let themeVars: Record<string, string> = {};
const themeVars: Record<string, string> = {};
themes.split(';').forEach((keyVar) => {
let [key, value] = keyVar.split(':');
const [key, value] = keyVar.split(':');
themeVars[key] = value;
});
return themeVars;
}
export async function setStatusBarColor() {
if (Capacitor.getPlatform() === 'android') {
await tick();
if (Capacitor.getPlatform() !== 'android') return;
const surfaceColor = get(interfaceAmoledTheme)
? '#000000'
: (await getDynamicTheme())['--surface-container'];
await tick();
const contentColor = !get(darkModeStore) ? 'dark' : 'light';
const surfaceColor = get(interfaceAmoledTheme)
? '#000000'
: (await getDynamicTheme())['--surface-container'];
await SafeArea.enable({
config: {
customColorsForSystemBars: true,
statusBarColor: surfaceColor,
statusBarContent: contentColor,
navigationBarColor: surfaceColor,
navigationBarContent: contentColor
}
});
}
const contentColor = !get(darkModeStore) ? 'dark' : 'light';
await SafeArea.enable({
config: {
customColorsForSystemBars: true,
statusBarColor: surfaceColor,
statusBarContent: contentColor,
navigationBarColor: surfaceColor,
navigationBarContent: contentColor
}
});
}
export function setAmoledTheme() {
+1 -2
View File
@@ -3,7 +3,6 @@
import { goto } from '$app/navigation';
import { navigating, page } from '$app/stores';
import '$lib/android/http/androidRequests';
import colorTheme, { convertToHexColorCode } from '$lib/android/plugins/colorTheme';
import { getFeed } from '$lib/api/index';
import type { Notification } from '$lib/api/model';
@@ -416,7 +415,7 @@
{/if}
<div class="player">
{#key $playerState.data.video.videoId}
<Player data={$playerState.data} isSyncing={$playerState.isSyncing} />
<Player data={$playerState.data} />
{/key}
</div>
</div>
@@ -0,0 +1,6 @@
import { goto } from '$app/navigation';
import { resolve } from '$app/paths';
export async function load({ params }) {
goto(resolve('/watch/[videoId]', { videoId: params.slug }));
}
@@ -78,8 +78,7 @@
(!$playerState || $playerState.data.video.videoId !== data.video.videoId)
) {
playerState.set({
data: data,
isSyncing: $syncPartyPeerStore !== null
data: data
});
}
@@ -445,10 +444,8 @@
<div class="tooltip">
{$_('player.share.title')}
</div>
<menu class="no-wrap mobile">
<ShareVideo bind:currentTime={playerCurrentTime} video={data.video} />
</menu></button
>
<ShareVideo bind:currentTime={playerCurrentTime} video={data.video} />
</button>
{#if personalPlaylists}
<button class="border">
<i>add</i>
+1
View File
@@ -8,6 +8,7 @@ import { initI18n } from '$lib/i18n';
import { getPages } from '$lib/navPages';
import { authStore, interfaceDefaultPage, isAndroidTvStore } from '$lib/store';
import { get } from 'svelte/store';
import '$lib/android/http/androidRequests';
export const ssr = false;
+1 -1
View File
@@ -3,7 +3,7 @@ import os
import re
from datetime import datetime
LATEST_VERSION = "1.11.8"
LATEST_VERSION = "1.11.9"
RELEASE_DATE = datetime.now().strftime("%Y-%-m-%d") # Format: YYYY-M-D
WORKING_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "materialious")