Merge pull request #1331 from Materialious/update/1.13.6

Update/1.13.6
This commit is contained in:
Ward
2026-01-20 04:13:13 +00:00
committed by GitHub
16 changed files with 255 additions and 207 deletions
+2 -2
View File
@@ -7,8 +7,8 @@ android {
applicationId "us.materialio.app"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 189
versionName "1.13.5"
versionCode 190
versionName "1.13.6"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
aaptOptions {
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
+25 -19
View File
@@ -37,6 +37,8 @@
<url type="homepage">https://materialio.us</url>
<url type="bugtracker">https://github.com/Materialious/Materialious/issues</url>
<url type="donation">https://github.com/sponsors/WardPearce</url>
<url type="contribute">https://github.com/Materialious/Materialious</url>
<url type="vcs-browser">https://github.com/Materialious/Materialious</url>
<project_license>AGPL-3.0</project_license>
<developer_name>WardPearce</developer_name>
<screenshots>
@@ -68,25 +70,29 @@
</content_rating>
<releases>
<release version="1.13.5" date="2026-1-20">
<release version="1.13.6" date="2026-1-20">
<url>https://github.com/Materialious/Materialious/releases/tag/1.13.6</url>
</release>
<release version="1.13.5" date="2026-1-20">
<url>https://github.com/Materialious/Materialious/releases/tag/1.13.5</url>
</release>
<release version="1.13.4" date="2026-1-20">
+14 -14
View File
@@ -1,12 +1,12 @@
{
"name": "Materialious",
"version": "1.13.5",
"version": "1.13.6",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "Materialious",
"version": "1.13.5",
"version": "1.13.6",
"license": "MIT",
"dependencies": {
"@capacitor-community/electron": "^5.0.0",
@@ -22,7 +22,7 @@
"jsonfile": "^6.2.0"
},
"devDependencies": {
"electron": "^39.2.7",
"electron": "^40.0.0",
"electron-builder": "^26.0.12",
"electron-rebuild": "^3.2.9",
"typescript": "^5.9.3"
@@ -1561,12 +1561,12 @@
"license": "MIT"
},
"node_modules/@types/node": {
"version": "22.13.17",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.17.tgz",
"integrity": "sha512-nAJuQXoyPj04uLgu+obZcSmsfOenUg6DxPKogeUy6yNCFwWaj5sBF8/G/pNo8EtBJjAfSVgfIlugR/BCOleO+g==",
"version": "24.10.9",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.9.tgz",
"integrity": "sha512-ne4A0IpG3+2ETuREInjPNhUGis1SFjv1d5asp8MzEAGtOZeTeHVDOYqOgqfhvseqg/iXty2hjBf1zAOb7RNiNw==",
"license": "MIT",
"dependencies": {
"undici-types": "~6.20.0"
"undici-types": "~7.16.0"
}
},
"node_modules/@types/plist": {
@@ -2946,15 +2946,15 @@
}
},
"node_modules/electron": {
"version": "39.2.7",
"resolved": "https://registry.npmjs.org/electron/-/electron-39.2.7.tgz",
"integrity": "sha512-KU0uFS6LSTh4aOIC3miolcbizOFP7N1M46VTYVfqIgFiuA2ilfNaOHLDS9tCMvwwHRowAsvqBrh9NgMXcTOHCQ==",
"version": "40.0.0",
"resolved": "https://registry.npmjs.org/electron/-/electron-40.0.0.tgz",
"integrity": "sha512-UyBy5yJ0/wm4gNugCtNPjvddjAknMTuXR2aCHioXicH7aKRKGDBPp4xqTEi/doVcB3R+MN3wfU9o8d/9pwgK2A==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
"@electron/get": "^2.0.0",
"@types/node": "^22.7.7",
"@types/node": "^24.9.0",
"extract-zip": "^2.0.1"
},
"bin": {
@@ -6248,9 +6248,9 @@
}
},
"node_modules/undici-types": {
"version": "6.20.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
"integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
"version": "7.16.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
"integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
"license": "MIT"
},
"node_modules/unique-filename": {
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "Materialious",
"version": "1.13.5",
"version": "1.13.6",
"description": "Modern material design for Invidious.",
"author": {
"name": "Ward Pearce",
@@ -35,7 +35,7 @@
"jsonfile": "^6.2.0"
},
"devDependencies": {
"electron": "^39.2.7",
"electron": "^40.0.0",
"electron-builder": "^26.0.12",
"electron-rebuild": "^3.2.9",
"typescript": "^5.9.3"
@@ -44,4 +44,4 @@
"capacitor",
"electron"
]
}
}
+80 -80
View File
@@ -1,12 +1,12 @@
{
"name": "materialious",
"version": "1.13.3",
"version": "1.13.6",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "materialious",
"version": "1.13.3",
"version": "1.13.6",
"hasInstallScript": true,
"dependencies": {
"@capacitor-community/electron": "^5.0.1",
@@ -41,7 +41,7 @@
"melt": "^0.44.0",
"mousetrap": "^1.6.5",
"peerjs": "^1.5.5",
"shaka-player": "^4.16.11",
"shaka-player": "^4.16.14",
"sponsorblock-api": "^0.2.4",
"svelte-infinite-loading": "^1.4.0",
"youtubei.js": "^16.0.1",
@@ -52,7 +52,7 @@
"@capacitor/cli": "^8.0.0",
"@sveltejs/adapter-auto": "^7.0.0",
"@sveltejs/adapter-static": "^3.0.10",
"@sveltejs/kit": "^2.49.1",
"@sveltejs/kit": "^2.50.0",
"@sveltejs/vite-plugin-svelte": "^6.2.1",
"@types/event-source-polyfill": "^1.0.5",
"@types/he": "^1.2.3",
@@ -65,12 +65,12 @@
"patch-package": "^8.0.1",
"prettier": "^3.6.2",
"prettier-plugin-svelte": "^3.4.0",
"svelte": "^5.45.6",
"svelte": "^5.47.0",
"svelte-check": "^4.3.3",
"tslib": "^2.7.0",
"typescript": "^5.9.3",
"typescript-eslint": "^8.47.0",
"vite": "^7.2.6"
"typescript-eslint": "^8.53.1",
"vite": "^7.3.1"
}
},
"node_modules/@babel/code-frame": {
@@ -3779,9 +3779,9 @@
}
},
"node_modules/@sveltejs/kit": {
"version": "2.49.5",
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.49.5.tgz",
"integrity": "sha512-dCYqelr2RVnWUuxc+Dk/dB/SjV/8JBndp1UovCyCZdIQezd8TRwFLNZctYkzgHxRJtaNvseCSRsuuHPeUgIN/A==",
"version": "2.50.0",
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.50.0.tgz",
"integrity": "sha512-Hj8sR8O27p2zshFEIJzsvfhLzxga/hWw6tRLnBjMYw70m1aS9BSYCqAUtzDBjRREtX1EvLMYgaC0mYE3Hz4KWA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4157,17 +4157,17 @@
"license": "MIT"
},
"node_modules/@typescript-eslint/eslint-plugin": {
"version": "8.53.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.53.0.tgz",
"integrity": "sha512-eEXsVvLPu8Z4PkFibtuFJLJOTAV/nPdgtSjkGoPpddpFk3/ym2oy97jynY6ic2m6+nc5M8SE1e9v/mHKsulcJg==",
"version": "8.53.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.53.1.tgz",
"integrity": "sha512-cFYYFZ+oQFi6hUnBTbLRXfTJiaQtYE3t4O692agbBl+2Zy+eqSKWtPjhPXJu1G7j4RLjKgeJPDdq3EqOwmX5Ag==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/regexpp": "^4.12.2",
"@typescript-eslint/scope-manager": "8.53.0",
"@typescript-eslint/type-utils": "8.53.0",
"@typescript-eslint/utils": "8.53.0",
"@typescript-eslint/visitor-keys": "8.53.0",
"@typescript-eslint/scope-manager": "8.53.1",
"@typescript-eslint/type-utils": "8.53.1",
"@typescript-eslint/utils": "8.53.1",
"@typescript-eslint/visitor-keys": "8.53.1",
"ignore": "^7.0.5",
"natural-compare": "^1.4.0",
"ts-api-utils": "^2.4.0"
@@ -4180,7 +4180,7 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
"@typescript-eslint/parser": "^8.53.0",
"@typescript-eslint/parser": "^8.53.1",
"eslint": "^8.57.0 || ^9.0.0",
"typescript": ">=4.8.4 <6.0.0"
}
@@ -4196,16 +4196,16 @@
}
},
"node_modules/@typescript-eslint/parser": {
"version": "8.53.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.53.0.tgz",
"integrity": "sha512-npiaib8XzbjtzS2N4HlqPvlpxpmZ14FjSJrteZpPxGUaYPlvhzlzUZ4mZyABo0EFrOWnvyd0Xxroq//hKhtAWg==",
"version": "8.53.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.53.1.tgz",
"integrity": "sha512-nm3cvFN9SqZGXjmw5bZ6cGmvJSyJPn0wU9gHAZZHDnZl2wF9PhHv78Xf06E0MaNk4zLVHL8hb2/c32XvyJOLQg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/scope-manager": "8.53.0",
"@typescript-eslint/types": "8.53.0",
"@typescript-eslint/typescript-estree": "8.53.0",
"@typescript-eslint/visitor-keys": "8.53.0",
"@typescript-eslint/scope-manager": "8.53.1",
"@typescript-eslint/types": "8.53.1",
"@typescript-eslint/typescript-estree": "8.53.1",
"@typescript-eslint/visitor-keys": "8.53.1",
"debug": "^4.4.3"
},
"engines": {
@@ -4246,14 +4246,14 @@
"license": "MIT"
},
"node_modules/@typescript-eslint/project-service": {
"version": "8.53.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.53.0.tgz",
"integrity": "sha512-Bl6Gdr7NqkqIP5yP9z1JU///Nmes4Eose6L1HwpuVHwScgDPPuEWbUVhvlZmb8hy0vX9syLk5EGNL700WcBlbg==",
"version": "8.53.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.53.1.tgz",
"integrity": "sha512-WYC4FB5Ra0xidsmlPb+1SsnaSKPmS3gsjIARwbEkHkoWloQmuzcfypljaJcR78uyLA1h8sHdWWPHSLDI+MtNog==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/tsconfig-utils": "^8.53.0",
"@typescript-eslint/types": "^8.53.0",
"@typescript-eslint/tsconfig-utils": "^8.53.1",
"@typescript-eslint/types": "^8.53.1",
"debug": "^4.4.3"
},
"engines": {
@@ -4293,14 +4293,14 @@
"license": "MIT"
},
"node_modules/@typescript-eslint/scope-manager": {
"version": "8.53.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.53.0.tgz",
"integrity": "sha512-kWNj3l01eOGSdVBnfAF2K1BTh06WS0Yet6JUgb9Cmkqaz3Jlu0fdVUjj9UI8gPidBWSMqDIglmEXifSgDT/D0g==",
"version": "8.53.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.53.1.tgz",
"integrity": "sha512-Lu23yw1uJMFY8cUeq7JlrizAgeQvWugNQzJp8C3x8Eo5Jw5Q2ykMdiiTB9vBVOOUBysMzmRRmUfwFrZuI2C4SQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/types": "8.53.0",
"@typescript-eslint/visitor-keys": "8.53.0"
"@typescript-eslint/types": "8.53.1",
"@typescript-eslint/visitor-keys": "8.53.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -4311,9 +4311,9 @@
}
},
"node_modules/@typescript-eslint/tsconfig-utils": {
"version": "8.53.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.53.0.tgz",
"integrity": "sha512-K6Sc0R5GIG6dNoPdOooQ+KtvT5KCKAvTcY8h2rIuul19vxH5OTQk7ArKkd4yTzkw66WnNY0kPPzzcmWA+XRmiA==",
"version": "8.53.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.53.1.tgz",
"integrity": "sha512-qfvLXS6F6b1y43pnf0pPbXJ+YoXIC7HKg0UGZ27uMIemKMKA6XH2DTxsEDdpdN29D+vHV07x/pnlPNVLhdhWiA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -4328,15 +4328,15 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
"version": "8.53.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.53.0.tgz",
"integrity": "sha512-BBAUhlx7g4SmcLhn8cnbxoxtmS7hcq39xKCgiutL3oNx1TaIp+cny51s8ewnKMpVUKQUGb41RAUWZ9kxYdovuw==",
"version": "8.53.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.53.1.tgz",
"integrity": "sha512-MOrdtNvyhy0rHyv0ENzub1d4wQYKb2NmIqG7qEqPWFW7Mpy2jzFC3pQ2yKDvirZB7jypm5uGjF2Qqs6OIqu47w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/types": "8.53.0",
"@typescript-eslint/typescript-estree": "8.53.0",
"@typescript-eslint/utils": "8.53.0",
"@typescript-eslint/types": "8.53.1",
"@typescript-eslint/typescript-estree": "8.53.1",
"@typescript-eslint/utils": "8.53.1",
"debug": "^4.4.3",
"ts-api-utils": "^2.4.0"
},
@@ -4378,9 +4378,9 @@
"license": "MIT"
},
"node_modules/@typescript-eslint/types": {
"version": "8.53.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.53.0.tgz",
"integrity": "sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ==",
"version": "8.53.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.53.1.tgz",
"integrity": "sha512-jr/swrr2aRmUAUjW5/zQHbMaui//vQlsZcJKijZf3M26bnmLj8LyZUpj8/Rd6uzaek06OWsqdofN/Thenm5O8A==",
"dev": true,
"license": "MIT",
"engines": {
@@ -4392,16 +4392,16 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
"version": "8.53.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.53.0.tgz",
"integrity": "sha512-pw0c0Gdo7Z4xOG987u3nJ8akL9093yEEKv8QTJ+Bhkghj1xyj8cgPaavlr9rq8h7+s6plUJ4QJYw2gCZodqmGw==",
"version": "8.53.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.53.1.tgz",
"integrity": "sha512-RGlVipGhQAG4GxV1s34O91cxQ/vWiHJTDHbXRr0li2q/BGg3RR/7NM8QDWgkEgrwQYCvmJV9ichIwyoKCQ+DTg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/project-service": "8.53.0",
"@typescript-eslint/tsconfig-utils": "8.53.0",
"@typescript-eslint/types": "8.53.0",
"@typescript-eslint/visitor-keys": "8.53.0",
"@typescript-eslint/project-service": "8.53.1",
"@typescript-eslint/tsconfig-utils": "8.53.1",
"@typescript-eslint/types": "8.53.1",
"@typescript-eslint/visitor-keys": "8.53.1",
"debug": "^4.4.3",
"minimatch": "^9.0.5",
"semver": "^7.7.3",
@@ -4471,16 +4471,16 @@
"license": "MIT"
},
"node_modules/@typescript-eslint/utils": {
"version": "8.53.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.53.0.tgz",
"integrity": "sha512-XDY4mXTez3Z1iRDI5mbRhH4DFSt46oaIFsLg+Zn97+sYrXACziXSQcSelMybnVZ5pa1P6xYkPr5cMJyunM1ZDA==",
"version": "8.53.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.53.1.tgz",
"integrity": "sha512-c4bMvGVWW4hv6JmDUEG7fSYlWOl3II2I4ylt0NM+seinYQlZMQIaKaXIIVJWt9Ofh6whrpM+EdDQXKXjNovvrg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.9.1",
"@typescript-eslint/scope-manager": "8.53.0",
"@typescript-eslint/types": "8.53.0",
"@typescript-eslint/typescript-estree": "8.53.0"
"@typescript-eslint/scope-manager": "8.53.1",
"@typescript-eslint/types": "8.53.1",
"@typescript-eslint/typescript-estree": "8.53.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -4495,13 +4495,13 @@
}
},
"node_modules/@typescript-eslint/visitor-keys": {
"version": "8.53.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.53.0.tgz",
"integrity": "sha512-LZ2NqIHFhvFwxG0qZeLL9DvdNAHPGCY5dIRwBhyYeU+LfLhcStE1ImjsuTG/WaVh3XysGaeLW8Rqq7cGkPCFvw==",
"version": "8.53.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.53.1.tgz",
"integrity": "sha512-oy+wV7xDKFPRyNggmXuZQSBzvoLnpmJs+GhzRhPjrxl2b/jIlyjVokzm47CZCDUdXKr2zd7ZLodPfOBpOPyPlg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/types": "8.53.0",
"@typescript-eslint/types": "8.53.1",
"eslint-visitor-keys": "^4.2.1"
},
"engines": {
@@ -11753,9 +11753,9 @@
}
},
"node_modules/shaka-player": {
"version": "4.16.13",
"resolved": "https://registry.npmjs.org/shaka-player/-/shaka-player-4.16.13.tgz",
"integrity": "sha512-2K6g1EBGXht3QnUqF/LKiGuVrvr+nx2AF2Y7DGicSOTUoTXY7YQW8CFXT1ha+ldQfkTuihQkju5NCEzY/KKuIw==",
"version": "4.16.14",
"resolved": "https://registry.npmjs.org/shaka-player/-/shaka-player-4.16.14.tgz",
"integrity": "sha512-RDxHFlsibqtcjbMflx7upcioJEr66deRyDOb2GQCMEic2NFv6qKdbeyguV+ZDSO6Bcg5/cFZsoDdim5jDnNpSw==",
"license": "Apache-2.0",
"engines": {
"node": ">=18"
@@ -12448,9 +12448,9 @@
}
},
"node_modules/svelte": {
"version": "5.46.4",
"resolved": "https://registry.npmjs.org/svelte/-/svelte-5.46.4.tgz",
"integrity": "sha512-VJwdXrmv9L8L7ZasJeWcCjoIuMRVbhuxbss0fpVnR8yorMmjNDwcjIH08vS6wmSzzzgAG5CADQ1JuXPS2nwt9w==",
"version": "5.47.1",
"resolved": "https://registry.npmjs.org/svelte/-/svelte-5.47.1.tgz",
"integrity": "sha512-MhSWfWEpG5T57z0Oyfk9D1GhAz/KTZKZZlWtGEsy9zNk2fafpuU7sJQlXNSA8HtvwKxVC9XlDyl5YovXUXjjHA==",
"license": "MIT",
"dependencies": {
"@jridgewell/remapping": "^2.3.4",
@@ -13042,16 +13042,16 @@
}
},
"node_modules/typescript-eslint": {
"version": "8.53.0",
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.53.0.tgz",
"integrity": "sha512-xHURCQNxZ1dsWn0sdOaOfCSQG0HKeqSj9OexIxrz6ypU6wHYOdX2I3D2b8s8wFSsSOYJb+6q283cLiLlkEsBYw==",
"version": "8.53.1",
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.53.1.tgz",
"integrity": "sha512-gB+EVQfP5RDElh9ittfXlhZJdjSU4jUSTyE2+ia8CYyNvet4ElfaLlAIqDvQV9JPknKx0jQH1racTYe/4LaLSg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/eslint-plugin": "8.53.0",
"@typescript-eslint/parser": "8.53.0",
"@typescript-eslint/typescript-estree": "8.53.0",
"@typescript-eslint/utils": "8.53.0"
"@typescript-eslint/eslint-plugin": "8.53.1",
"@typescript-eslint/parser": "8.53.1",
"@typescript-eslint/typescript-estree": "8.53.1",
"@typescript-eslint/utils": "8.53.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -13266,9 +13266,9 @@
}
},
"node_modules/vite": {
"version": "7.3.0",
"resolved": "https://registry.npmjs.org/vite/-/vite-7.3.0.tgz",
"integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==",
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz",
"integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==",
"dev": true,
"license": "MIT",
"dependencies": {
+7 -7
View File
@@ -1,6 +1,6 @@
{
"name": "materialious",
"version": "1.13.5",
"version": "1.13.6",
"private": true,
"scripts": {
"dev": "npm run patch:github && vite dev",
@@ -20,7 +20,7 @@
"@capacitor/cli": "^8.0.0",
"@sveltejs/adapter-auto": "^7.0.0",
"@sveltejs/adapter-static": "^3.0.10",
"@sveltejs/kit": "^2.49.1",
"@sveltejs/kit": "^2.50.0",
"@sveltejs/vite-plugin-svelte": "^6.2.1",
"@types/event-source-polyfill": "^1.0.5",
"@types/he": "^1.2.3",
@@ -33,12 +33,12 @@
"patch-package": "^8.0.1",
"prettier": "^3.6.2",
"prettier-plugin-svelte": "^3.4.0",
"svelte": "^5.45.6",
"svelte": "^5.47.0",
"svelte-check": "^4.3.3",
"tslib": "^2.7.0",
"typescript": "^5.9.3",
"typescript-eslint": "^8.47.0",
"vite": "^7.2.6"
"vite": "^7.3.1",
"typescript-eslint": "^8.53.1"
},
"type": "module",
"dependencies": {
@@ -74,10 +74,10 @@
"melt": "^0.44.0",
"mousetrap": "^1.6.5",
"peerjs": "^1.5.5",
"shaka-player": "^4.16.11",
"shaka-player": "^4.16.14",
"sponsorblock-api": "^0.2.4",
"svelte-infinite-loading": "^1.4.0",
"youtubei.js": "^16.0.1",
"zod": "^4.3.5"
}
}
}
+78 -62
View File
@@ -75,6 +75,16 @@
let segments: Segment[] = $state([]);
let segmentManualSkip: Segment | undefined = $state();
const sponsorSegments = {
sponsor: $_('layout.sponsors.sponsor'),
selfpromo: $_('layout.sponsors.unpaidSelfPromotion'),
interaction: $_('layout.sponsors.interactionReminder'),
intro: $_('layout.sponsors.intermissionIntroAnimation'),
outro: $_('layout.sponsors.credits'),
preview: $_('layout.sponsors.preViewRecapHook'),
filler: $_('layout.sponsors.tangentJokes'),
music_offtopic: $_('layout.sponsors.musicOffTopic')
};
let originalOrigination: ScreenOrientationResult | undefined;
// eslint-disable-next-line no-undef
@@ -98,12 +108,11 @@
let playerCurrentVideoTrack: shaka.extern.VideoTrack | undefined = $state(undefined);
let playerCurrentAudioTrack: shaka.extern.AudioTrack | undefined = $state(undefined);
let playerLoop = $state($playerAlwaysLoopStore);
let playerTimelineTooltipVisible: boolean = $state(false);
let playerTimelineTimeHover: number = $state(0);
let playerTimelineMouseX: number = $state(0);
let playerVideoEndTimePretty: string = $state('');
let playerBufferedTo: number = $state(0);
let playerCloestTimestamp: Timestamp | undefined = $state();
let playerCloestSponsor: Segment | undefined = $state();
let playerSliderElement: HTMLElement | undefined = $state();
// eslint-disable-next-line no-undef
let playerSliderDebounce: NodeJS.Timeout;
@@ -330,39 +339,41 @@
data.video.videoId,
Object.keys($sponsorBlockCategoriesStore) as Category[]
);
playerElement?.addEventListener('timeupdate', () => {
segments.forEach((segment) => {
if (!playerElement) return;
if (
playerElement.currentTime >= segment.startTime &&
playerElement.currentTime <= segment.endTime
) {
const segmentTrigger = $sponsorBlockCategoriesStore[segment.category];
if (segmentTrigger === 'automatic') {
skipSegment(segment);
} else if (segmentTrigger === 'manual') {
if (!segmentManualSkip) {
addToast({
data: {
text: `${$_('upcomingSegment')} ${segment.category}`,
action: {
action: () => skipSegment(segment),
text: $_('skip')
}
}
});
}
segmentManualSkip = segment;
}
}
});
});
} catch (error) {
console.error('Sponsorskip errored with:', error);
}
if (segments.length === 0) return;
playerElement?.addEventListener('timeupdate', () => {
segments.forEach((segment) => {
if (!playerElement) return;
if (
playerElement.currentTime >= segment.startTime &&
playerElement.currentTime <= segment.endTime
) {
const segmentTrigger = $sponsorBlockCategoriesStore[segment.category];
if (segmentTrigger === 'automatic') {
skipSegment(segment);
} else if (segmentTrigger === 'manual') {
if (!segmentManualSkip) {
addToast({
data: {
text: `${$_('upcomingSegment')} ${segment.category}`,
action: {
action: () => skipSegment(segment),
text: $_('skip')
}
}
});
}
segmentManualSkip = segment;
}
}
});
});
}
}
@@ -438,6 +449,12 @@
sabrAdapter = await injectSabr(data.video, player);
if (data.video.fallbackPatch === 'youtubejs') {
addToast({ data: { text: $_('player.youtubeJsFallBack') } });
}
setupSponsorSkip();
player.addEventListener('loaded', () => {
restoreQualityPreference();
restoreDefaultLanguage();
@@ -456,7 +473,6 @@
}
// Auto save watch progress every minute.
watchProgressInterval = setInterval(() => savePlayerPos(), 60000);
setupSponsorSkip();
let dashUrl: string;
@@ -544,10 +560,6 @@
}
}
if (data.video.fallbackPatch === 'youtubejs') {
addToast({ data: { text: $_('player.youtubeJsFallBack') } });
}
if ($playerDefaultPlaybackSpeed && playerElement) {
playerElement.playbackRate = $playerDefaultPlaybackSpeed;
}
@@ -1004,20 +1016,22 @@
}
let requestAnimationTooltip: number | undefined;
function handleMouseMove(event: MouseEvent) {
function timelineMouseMove(event: MouseEvent) {
if (requestAnimationTooltip) return;
requestAnimationTooltip = requestAnimationFrame(() => {
if (!playerSliderElement) return;
const rect = playerSliderElement.getBoundingClientRect();
playerTimelineMouseX = event.clientX - rect.left;
const percent = Math.min(
Math.max(playerTimelineMouseX / playerSliderElement.clientWidth, 0),
Math.max((event.clientX - rect.left) / playerSliderElement.clientWidth, 0),
1
);
playerTimelineTimeHover = percent * (data.video.lengthSeconds ?? 0);
document.documentElement.style.setProperty('--timeline-tooltip-left', `${percent * 100}%`);
playerCloestTimestamp = data.content.timestamps.find((chapter, chapterIndex) => {
let endTime: number;
if (chapterIndex === data.content.timestamps.length - 1) {
@@ -1027,15 +1041,20 @@
}
return playerTimelineTimeHover >= chapter.time && playerTimelineTimeHover < endTime;
});
playerTimelineTooltipVisible = true;
if (segments.length > 0) {
playerCloestSponsor = segments.find((segment) => {
return (
playerTimelineTimeHover >= segment.startTime &&
playerTimelineTimeHover < segment.endTime
);
});
}
requestAnimationTooltip = undefined;
});
}
function handleMouseLeave() {
playerTimelineTooltipVisible = false;
}
function onVideoClick(
event: MouseEvent & {
currentTarget: EventTarget & HTMLDivElement;
@@ -1215,11 +1234,23 @@
<div
class="player-slider full-width"
{...playerTimelineSlider.root}
onmousemove={handleMouseMove}
onmouseleave={handleMouseLeave}
onmousemove={timelineMouseMove}
bind:this={playerSliderElement}
>
<div class="track">
{#if !playerUserManualSeeking}
<div class="tooltip" style="position: absolute;left: var(--timeline-tooltip-left);">
{#if playerCloestSponsor}
{sponsorSegments[playerCloestSponsor.category]}
<br />
{:else if playerCloestTimestamp}
{playerCloestTimestamp.title}
<br />
{/if}
{videoLength(playerTimelineTimeHover)}
</div>
{/if}
<div class="range"></div>
<div {...playerTimelineSlider.thumb}>
<div class="tooltip thumb-tooltip">
@@ -1253,17 +1284,6 @@
{/if}
</div>
{#if playerTimelineTooltipVisible && !playerUserManualSeeking}
<div class="tooltip" style="position: absolute; left: {playerTimelineMouseX}px;">
{#if playerCloestTimestamp}
{playerCloestTimestamp.title}
<br />
{/if}
{videoLength(playerTimelineTimeHover)}
</div>
{/if}
<nav>
{#if !$isAndroidTvStore}
<nav class="no-wrap">
@@ -1694,10 +1714,6 @@
background-color: black;
}
.hide {
display: none;
}
.chip {
background-color: var(--inverse-primary);
color: var(--primary);
@@ -1,11 +1,12 @@
<script lang="ts">
import { resolve } from '$app/paths';
import { cleanNumber } from '$lib/numbers';
import { cleanNumber, numberWithCommas } from '$lib/numbers';
import { _ } from '$lib/i18n';
import type { VideoPlay } from '$lib/api/model';
import { onMount } from 'svelte';
import { expandSummery } from '$lib/misc';
import { interfaceAutoExpandDesc } from '$lib/store';
import { humanizeTimestamp } from '$lib/time';
let { video, description }: { video: VideoPlay; description: string } = $props();
@@ -20,8 +21,18 @@
<summary id="description" class="bold none">
<nav>
<div class="max">
{cleanNumber(video.viewCount)}
{$_('views')}{video.publishedText}
<span>
{cleanNumber(video.viewCount)}
{$_('views')}
<div class="tooltip no-space">{numberWithCommas(video.viewCount)} {$_('views')}</div>
</span>
<span>
{video.publishedText}
{#if !video.fallbackPatch}
<div class="tooltip no-space">{humanizeTimestamp(video.published)}</div>
{/if}
</span>
</div>
</nav>
</summary>
+5
View File
@@ -11,6 +11,10 @@
src: url('/static/inter.ttf');
}
.hide {
display: none;
}
article {
box-shadow: none !important;
}
@@ -47,6 +51,7 @@ nav.top {
main.root {
max-height: 100vh;
overflow-y: auto;
overflow-x: hidden;
}
.row {
@@ -208,6 +208,7 @@
"credits": "Endcards/Credits",
"preViewRecapHook": "Preview/Recap/Hook",
"tangentJokes": "Filler Tangent/Jokes",
"musicOffTopic": "Non-musical segment",
"automatic": "Auto skip",
"manual": "Manual skip",
"timeline": "Timeline only"
+6 -2
View File
@@ -9,9 +9,13 @@ dayjs.extend(duration);
dayjs.extend(relativeTime);
dayjs.extend(advancedFormat);
export function humanFriendlyTimestamp(utcTimestamp: number): string {
export function humanizeTimestamp(epochTime: number): string {
return dayjs.utc(epochTime).local().format('hh:mm A DD/MM/YYYY');
}
export function relativeTimestamp(epochTime: number): string {
const now = dayjs();
const timestamp = dayjs.utc(utcTimestamp).local();
const timestamp = dayjs.utc(epochTime).local();
const isSameDay = now.isSame(timestamp, 'day');
const isSameMonth = now.isSame(timestamp, 'month');
+9 -9
View File
@@ -244,15 +244,15 @@
</svelte:head>
<div>
<nav class="left m l surface-container" class:tv-nav={$isAndroidTvStore}>
<header
role="presentation"
onclick={() => goto(resolve($interfaceDefaultPage, {}))}
style="cursor: pointer;"
tabindex="-1"
class="small-padding"
>
<Logo />
<nav
class="left m l surface-container"
class:tv-nav={$isAndroidTvStore}
class:hide={$playertheatreModeIsActive}
>
<header role="presentation" style="cursor: pointer;" tabindex="-1" class="small-padding">
<a href={resolve($interfaceDefaultPage, {})}>
<Logo />
</a>
</header>
{#if $isAndroidTvStore}
<a href={resolve('/search', {})} class:active={$page.url.href.endsWith('/search')}>
@@ -93,7 +93,10 @@
subCountText: cleanNumber($channelCacheStore[page.params.slug].channel.subCount)
}}
/>
<p style="width: 60vw;">{$channelCacheStore[page.params.slug].channel.description}</p>
<p style="width: 60vw;max-height: 150px;overflow: scroll;">
<!-- eslint-disable-next-line svelte/no-at-html-tags -->
{@html $channelCacheStore[page.params.slug].channel.description}
</p>
</div>
{#if !$isAndroidTvStore}
<button class="border">
@@ -39,7 +39,7 @@
import LikesDislikes from '$lib/components/watch/LikesDislikes.svelte';
import Comment from '$lib/components/watch/Comment.svelte';
import { expandSummery } from '$lib/misc';
import { humanFriendlyTimestamp } from '$lib/time.js';
import { relativeTimestamp } from '$lib/time.js';
import { getWatchDetails } from '$lib/watch.js';
import { page } from '$app/state';
@@ -252,12 +252,12 @@
onMount(async () => {
if (data.video.premiereTimestamp) {
premiereTime = humanFriendlyTimestamp(data.video.premiereTimestamp);
premiereTime = relativeTimestamp(data.video.premiereTimestamp);
premiereUpdateInterval = setInterval(async () => {
data = await getWatchDetails(data.video.videoId, page.url);
if (data.video.premiereTimestamp) {
premiereTime = humanFriendlyTimestamp(data.video.premiereTimestamp);
premiereTime = relativeTimestamp(data.video.premiereTimestamp);
} else {
clearInterval(premiereUpdateInterval);
playerState.set({ ...$playerState, data: { ...data } });
@@ -303,6 +303,8 @@
) {
playerState.set(undefined);
}
playertheatreModeIsActive.set(false);
});
async function goToCurrentPlaylistItem() {
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -3,7 +3,7 @@ import os
import re
from datetime import datetime
LATEST_VERSION = "1.13.5"
LATEST_VERSION = "1.13.6"
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")