@@ -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.
|
||||
|
||||
@@ -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')
|
||||
|
||||
Generated
+26
-26
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -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'
|
||||
]
|
||||
}
|
||||
);
|
||||
|
||||
Generated
+185
-119
@@ -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": {
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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
@@ -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)[];
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user