+2
-2
@@ -4,10 +4,10 @@
|
||||
<selectionStates>
|
||||
<SelectionState runConfigName="app">
|
||||
<option name="selectionMode" value="DROPDOWN" />
|
||||
<DropdownSelection timestamp="2025-07-08T06:06:15.619274581Z">
|
||||
<DropdownSelection timestamp="2025-07-21T02:41:45.413890396Z">
|
||||
<Target type="DEFAULT_BOOT">
|
||||
<handle>
|
||||
<DeviceId pluginId="LocalEmulator" identifier="path=/home/ward/.android/avd/Television_4K.avd" />
|
||||
<DeviceId pluginId="LocalEmulator" identifier="path=/home/ward/.android/avd/Pixel_7_Pro.avd" />
|
||||
</handle>
|
||||
</Target>
|
||||
</DropdownSelection>
|
||||
|
||||
@@ -7,8 +7,8 @@ android {
|
||||
applicationId "us.materialio.app"
|
||||
minSdkVersion rootProject.ext.minSdkVersion
|
||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||
versionCode 137
|
||||
versionName "1.9.20"
|
||||
versionCode 138
|
||||
versionName "1.9.21"
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
aaptOptions {
|
||||
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
|
||||
|
||||
@@ -55,24 +55,10 @@
|
||||
<content_attribute id="social-contacts">intense</content_attribute>
|
||||
</content_rating>
|
||||
<releases>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<release version="1.9.20" date="2025-7-09">
|
||||
<release version="1.9.21" date="2025-7-21">
|
||||
<url>https://github.com/Materialious/Materialious/releases/tag/1.9.21</url>
|
||||
</release>
|
||||
<release version="1.9.20" date="2025-7-09">
|
||||
<url>https://github.com/Materialious/Materialious/releases/tag/1.9.20</url>
|
||||
</release>
|
||||
<release version="1.9.19" date="2025-7-08">
|
||||
@@ -125,7 +111,7 @@
|
||||
</release>
|
||||
<release version="1.9.3" date="2025-6-05">
|
||||
<url>https://github.com/Materialious/Materialious/releases/tag/1.9.3</url>
|
||||
</release>
|
||||
</release>
|
||||
<release version="1.9.2" date="2025-6-05">
|
||||
<url>https://github.com/Materialious/Materialious/releases/tag/1.9.2</url>
|
||||
</release>
|
||||
|
||||
Generated
+6
-6
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "Materialious",
|
||||
"version": "1.9.19",
|
||||
"version": "1.9.21",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "Materialious",
|
||||
"version": "1.9.19",
|
||||
"version": "1.9.21",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@capacitor-community/electron": "^5.0.0",
|
||||
@@ -22,7 +22,7 @@
|
||||
"jsonfile": "^6.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"electron": "^37.2.0",
|
||||
"electron": "^37.2.1",
|
||||
"electron-builder": "^26.0.12",
|
||||
"electron-rebuild": "^3.2.9",
|
||||
"typescript": "^5.7.3"
|
||||
@@ -2495,9 +2495,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/electron": {
|
||||
"version": "37.2.0",
|
||||
"resolved": "https://registry.npmjs.org/electron/-/electron-37.2.0.tgz",
|
||||
"integrity": "sha512-dE6+qeg6SBUVd5d8CD2+GH82kh+gF1v40+hs+U+UOno681NMSGmBtgqwldQRpbvtnQDD7V2M9Cpfr3+Abw7aBg==",
|
||||
"version": "37.2.1",
|
||||
"resolved": "https://registry.npmjs.org/electron/-/electron-37.2.1.tgz",
|
||||
"integrity": "sha512-ae2EbzRNqIAHlftfCHtbbt6EgJUW8+zxWLONqNnn2iSrLF0O/pbxbff3xcpZYPpmFBs4uqjoi+s4QS7DQ+zZ/w==",
|
||||
"dev": true,
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Materialious",
|
||||
"version": "1.9.20",
|
||||
"version": "1.9.21",
|
||||
"description": "Modern material design for Invidious.",
|
||||
"author": {
|
||||
"name": "Ward Pearce",
|
||||
@@ -35,7 +35,7 @@
|
||||
"jsonfile": "^6.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"electron": "^37.2.0",
|
||||
"electron": "^37.2.1",
|
||||
"electron-builder": "^26.0.12",
|
||||
"electron-rebuild": "^3.2.9",
|
||||
"typescript": "^5.7.3"
|
||||
@@ -44,4 +44,4 @@
|
||||
"capacitor",
|
||||
"electron"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ import {
|
||||
setupElectronDeepLinking
|
||||
} from '@capacitor-community/electron';
|
||||
import type { MenuItemConstructorOptions } from 'electron';
|
||||
import { app, ipcMain, MenuItem, session, webContents } from 'electron';
|
||||
import { app, ipcMain, MenuItem, session } from 'electron';
|
||||
import electronIsDev from 'electron-is-dev';
|
||||
import unhandled from 'electron-unhandled';
|
||||
import { autoUpdater } from 'electron-updater';
|
||||
@@ -58,8 +58,6 @@ let allowInsecureSSL = false;
|
||||
setupContentSecurityPolicy(myCapacitorApp.getCustomURLScheme());
|
||||
// Initialize our app, build windows, and load content.
|
||||
await myCapacitorApp.init();
|
||||
// Check for updates if we are in a packaged app.
|
||||
autoUpdater.checkForUpdatesAndNotify();
|
||||
})();
|
||||
|
||||
app.on('certificate-error', (event, webContents, url, error, certificate, callback) => {
|
||||
@@ -167,3 +165,17 @@ ipcMain.handle('setAllowInsecureSSL', async (_, allow) => {
|
||||
|
||||
return allowInsecureSSL;
|
||||
});
|
||||
|
||||
ipcMain.handle('doUpdateCheck', async (_, disableAutoUpdate) => {
|
||||
// Check for updates if we are in a packaged app.
|
||||
autoUpdater.autoInstallOnAppQuit = !disableAutoUpdate;
|
||||
|
||||
if (disableAutoUpdate) {
|
||||
await autoUpdater.checkForUpdatesAndNotify({
|
||||
title: 'Update Available',
|
||||
body: 'A new version is available.'
|
||||
});
|
||||
} else {
|
||||
await autoUpdater.checkForUpdatesAndNotify();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -8,5 +8,7 @@ contextBridge.exposeInMainWorld('electronAPI', {
|
||||
ipcRenderer.invoke('generatePoToken', bgChallenge, requestKey, visitorData),
|
||||
setAllowInsecureSSL: async (allow: boolean) => {
|
||||
return await ipcRenderer.invoke('setAllowInsecureSSL', allow);
|
||||
}
|
||||
},
|
||||
doUpdateCheck: (disableAutoUpdate: boolean) =>
|
||||
ipcRenderer.invoke('doUpdateCheck', disableAutoUpdate)
|
||||
});
|
||||
|
||||
Generated
+11
-23
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "materialious",
|
||||
"version": "1.9.19",
|
||||
"version": "1.9.21",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "materialious",
|
||||
"version": "1.9.19",
|
||||
"version": "1.9.21",
|
||||
"hasInstallScript": true,
|
||||
"dependencies": {
|
||||
"@capacitor-community/electron": "^5.0.1",
|
||||
@@ -37,7 +37,7 @@
|
||||
"sponsorblock-api": "^0.2.4",
|
||||
"svelte-infinite-loading": "^1.4.0",
|
||||
"svelte-persisted-store": "^0.12.0",
|
||||
"youtubei.js": "^14.0.0"
|
||||
"youtubei.js": "^15.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@capacitor/assets": "^3.0.5",
|
||||
@@ -2119,15 +2119,6 @@
|
||||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@fastify/busboy": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
|
||||
"integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
}
|
||||
},
|
||||
"node_modules/@hugotomazi/capacitor-navigation-bar": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@hugotomazi/capacitor-navigation-bar/-/capacitor-navigation-bar-4.0.1.tgz",
|
||||
@@ -12037,15 +12028,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/undici": {
|
||||
"version": "5.29.0",
|
||||
"resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz",
|
||||
"integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==",
|
||||
"version": "6.21.3",
|
||||
"resolved": "https://registry.npmjs.org/undici/-/undici-6.21.3.tgz",
|
||||
"integrity": "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@fastify/busboy": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.0"
|
||||
"node": ">=18.17"
|
||||
}
|
||||
},
|
||||
"node_modules/undici-types": {
|
||||
@@ -13748,9 +13736,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/youtubei.js": {
|
||||
"version": "14.0.0",
|
||||
"resolved": "https://registry.npmjs.org/youtubei.js/-/youtubei.js-14.0.0.tgz",
|
||||
"integrity": "sha512-KAFttOw+9fwwBUvBc1T7KzMNBLczDOuN/dfote8BA9CABxgx8MPgV+vZWlowdDB6DnHjSUYppv+xvJ4VNBLK9A==",
|
||||
"version": "15.0.0",
|
||||
"resolved": "https://registry.npmjs.org/youtubei.js/-/youtubei.js-15.0.0.tgz",
|
||||
"integrity": "sha512-giPZREn+q0z8Jr45NUcJUXE7QA2+UD2jx5FR+ULdnexvtHg5uQZr9Am8aYcECPKzbBNe6ksBD1yT4SKNbhpRqA==",
|
||||
"funding": [
|
||||
"https://github.com/sponsors/LuanRT"
|
||||
],
|
||||
@@ -13759,7 +13747,7 @@
|
||||
"@bufbuild/protobuf": "^2.0.0",
|
||||
"jintr": "^3.3.1",
|
||||
"tslib": "^2.5.0",
|
||||
"undici": "^5.19.1"
|
||||
"undici": "^6.21.3"
|
||||
}
|
||||
},
|
||||
"node_modules/zimmerframe": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "materialious",
|
||||
"version": "1.9.20",
|
||||
"version": "1.9.21",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "vite dev",
|
||||
@@ -68,6 +68,6 @@
|
||||
"sponsorblock-api": "^0.2.4",
|
||||
"svelte-infinite-loading": "^1.4.0",
|
||||
"svelte-persisted-store": "^0.12.0",
|
||||
"youtubei.js": "^14.0.0"
|
||||
"youtubei.js": "^15.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Vendored
+1
@@ -19,6 +19,7 @@ declare global {
|
||||
visitorData: string
|
||||
) => Promise<string>;
|
||||
setAllowInsecureSSL: (allowInsecureSSL: boolean) => Promoise<boolean>;
|
||||
doUpdateCheck: (disableAutoUpdate: boolean) => Promise<void>;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -590,6 +590,22 @@
|
||||
playerElement.playbackRate = playerElement.playbackRate + 0.25;
|
||||
return false;
|
||||
});
|
||||
|
||||
Mousetrap.bind(',', () => {
|
||||
if (!playerElement) return
|
||||
|
||||
const currentTrack = player.getVariantTracks().find(track => track.active)
|
||||
const frameTime = 1/(currentTrack?.frameRate || 30)
|
||||
playerElement.currentTime -= frameTime
|
||||
})
|
||||
|
||||
Mousetrap.bind('.', () => {
|
||||
if (!playerElement) return
|
||||
|
||||
const currentTrack = player.getVariantTracks().find(track => track.active)
|
||||
const frameTime = 1/(currentTrack?.frameRate || 30)
|
||||
playerElement.currentTime += frameTime
|
||||
})
|
||||
|
||||
playerElement.addEventListener('pause', async () => {
|
||||
savePlayerPos();
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
interfaceAutoExpandComments,
|
||||
interfaceAutoExpandDesc,
|
||||
interfaceDefaultPage,
|
||||
interfaceDisableAutoUpdate,
|
||||
interfaceForceCase,
|
||||
interfaceLowBandwidthMode,
|
||||
interfaceRegionStore,
|
||||
@@ -110,6 +111,12 @@
|
||||
}
|
||||
});
|
||||
|
||||
if (Capacitor.getPlatform() === 'electron') {
|
||||
interfaceDisableAutoUpdate.subscribe((isDisabled) => {
|
||||
window.electronAPI.doUpdateCheck(isDisabled);
|
||||
});
|
||||
}
|
||||
|
||||
let pages: Pages = $state([]);
|
||||
authStore.subscribe(() => {
|
||||
pages = getPages();
|
||||
@@ -288,6 +295,24 @@
|
||||
</nav>
|
||||
</div>
|
||||
|
||||
{#if Capacitor.getPlatform() == 'electron'}
|
||||
<div class="field no-margin">
|
||||
<nav class="no-padding">
|
||||
<div class="max">
|
||||
<div>{$_('layout.disableAutoUpdate')}</div>
|
||||
</div>
|
||||
<label class="switch" tabindex="0" role="switch">
|
||||
<input
|
||||
type="checkbox"
|
||||
bind:checked={$interfaceDisableAutoUpdate}
|
||||
onclick={() => interfaceDisableAutoUpdate.set(!$interfaceDisableAutoUpdate)}
|
||||
/>
|
||||
<span></span>
|
||||
</label>
|
||||
</nav>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<div class="field label suffix border">
|
||||
<select
|
||||
tabindex="0"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"enabled": "Aktiviert",
|
||||
"copyUrl": "URL kopieren",
|
||||
"loadMore": "Mehr laden",
|
||||
"views": "Ansichten",
|
||||
"views": "Aufrufe",
|
||||
"invidiousBlockWarning": "Invidious wird derzeit von Google blockiert. Wenn Videos für diese Instanz nicht geladen werden, verwende diese Instanz bitte auf Materialious auf {android} oder {desktop}, um dies mit lokalem Video-Fallback zu umgehen.",
|
||||
"videos": "Videos",
|
||||
"cancel": "Abbrechen",
|
||||
@@ -34,7 +34,7 @@
|
||||
"videoTabs": {
|
||||
"all": "Alle",
|
||||
"videos": "Videos",
|
||||
"playlists": "Wiedergabeliste",
|
||||
"playlists": "Wiedergabelisten",
|
||||
"channels": "Kanäle",
|
||||
"shorts": "Shorts",
|
||||
"streams": "Streams"
|
||||
@@ -63,7 +63,7 @@
|
||||
"playlists": "Wiedergabelisten"
|
||||
},
|
||||
"subscribers": "Abonnenten",
|
||||
"unsubscribe": "Deabonnieren",
|
||||
"unsubscribe": "Abo beenden",
|
||||
"loginRequired": "Anmeldung erforderlich",
|
||||
"player": {
|
||||
"audioOnly": "Nur Ton",
|
||||
@@ -80,7 +80,7 @@
|
||||
"downloadSteps": {
|
||||
"merging": "Video und Audio zusammenführen",
|
||||
"video": "Herunterladen des Videos",
|
||||
"audio": "Herunterladen der Audio",
|
||||
"audio": "Herunterladen des Tons",
|
||||
"ffmpeg": "Herunterladen der ffmpeg-Bibliothek und -Komponenten",
|
||||
"classWorker": "Herunterladen des ffmpeg-Klassenarbeiters",
|
||||
"core": "Herunterladen der ffmpeg-Kern",
|
||||
@@ -91,10 +91,10 @@
|
||||
"unableToLoadComments": "Laden der Kommentare fehlgeschlagen",
|
||||
"addToPlaylist": "Zur Wiedergabeliste hinzufügen",
|
||||
"youtubeJsFallBack": "Lokaler Video-Fallback wird verwendet",
|
||||
"enableYoutubejsPerm": "Lokales Video-Fallback immer erlauben",
|
||||
"enableYoutubejsPerm": "Lokalen Video-Fallback immer erlauben",
|
||||
"defaultLanguage": "Standardsprache",
|
||||
"preferredQuality": "Bevorzugte Qualität",
|
||||
"enableYoutubejsTemp": "Nutze einmalig lokales Video-Fallback",
|
||||
"enableYoutubejsTemp": "Nutze einmalig den lokalen Video-Fallback",
|
||||
"chapters": "Kapitel",
|
||||
"retryText": "Das Video konnte nicht geladen werden, wie möchtest du weiterfahren?",
|
||||
"youtubeJsLoading": "Das Video konnte nicht geladen werden, es wird mit lokalem Video-Fallback erneut versucht."
|
||||
@@ -114,7 +114,7 @@
|
||||
"customize": "Anpassen",
|
||||
"lowBandwidthMode": "Modus für geringe Bandbreite",
|
||||
"theme": {
|
||||
"theme": "Thema",
|
||||
"theme": "Erscheinungsbild",
|
||||
"darkMode": "Dunkler Modus",
|
||||
"lightMode": "Heller Modus",
|
||||
"AmoledTheme": "Amoled-Thema",
|
||||
@@ -124,6 +124,7 @@
|
||||
"previewVideoOnHover": "Video-Vorschau beim Hovern",
|
||||
"expandDescription": "Beschreibung standardmäßig erweitern",
|
||||
"expandComments": "Kommentare standardmäßig erweitern",
|
||||
"disableAutoUpdate": "Automatische Installation von Updates deaktivieren",
|
||||
"dataPreferences": {
|
||||
"content": "Du möchtest Abonnements importieren/exportieren, dein Passwort ändern oder dein Konto löschen? Klicke hier und scrolle bis zum Ende der Seite.",
|
||||
"dataPreferences": "Dateneinstellungen"
|
||||
|
||||
@@ -136,6 +136,7 @@
|
||||
"expandChapters": "Expand chapters by default",
|
||||
"expandComments": "Expand comments by default",
|
||||
"allowInsecureRequests": "Allow insecure requests",
|
||||
"disableAutoUpdate": "Disable automatic updates",
|
||||
"dataPreferences": {
|
||||
"content": "Looking to import/export subscriptions, change password or delete account? Click here and scroll to the bottom of the page.",
|
||||
"dataPreferences": "Data preferences"
|
||||
|
||||
@@ -0,0 +1,185 @@
|
||||
{
|
||||
"enabled": "Aktiviert",
|
||||
"disabled": "Deaktiviert",
|
||||
"copyUrl": "URL kopiere",
|
||||
"loadMore": "Meh lade",
|
||||
"views": "Uufrüef",
|
||||
"login": "Aameldig",
|
||||
"recommendedVideos": "Vorgschlagni Videos",
|
||||
"invidiousBlockWarning": "Invidious wird grad vo Google blockiert. Wenn Videos für die Instanz nöd glade werded, nutz die Instanz bitte uf Materialious uf {android} oder {Desktop}, zum das mit em lokale Video-Fallback z umgah.",
|
||||
"playlistVideos": "Widergabelischte Videos",
|
||||
"thumbnail": {
|
||||
"failedToLoadImage": "Lade vom Bild fehlgschlage",
|
||||
"live": "LIVE"
|
||||
},
|
||||
"layout": {
|
||||
"companionUrl": "Companion URL",
|
||||
"player": {
|
||||
"silenceSkipper": "Schwiigeüberspringer (Experimentell)",
|
||||
"title": "Player",
|
||||
"autoPlay": "Video automatisch abspiele",
|
||||
"alwaysLoopVideo": "Video immer inere Schleife abspiele",
|
||||
"savePlaybackPosition": "Widergabeposition speichere",
|
||||
"listenByDefault": "Standardmässig zuelose",
|
||||
"ccByDefault": "Untertitel standardmässig aa",
|
||||
"theatreModeByDefault": "Standardmässige Theatermodus",
|
||||
"autoPlayNextByDefault": "Standardmässigi Widergab vom nächste Video",
|
||||
"miniPlayer": "Mini-Player",
|
||||
"proxyVideos": "Videos dur de Proxy leite",
|
||||
"backgroundPlay": "Ton im Hintergrund abspiele",
|
||||
"dash": "Dash",
|
||||
"localVideoFallback": "Lokale Video-Fallback",
|
||||
"youtubeJsFallback": "Fallback für lokali Videoverarbeitig",
|
||||
"youtubeJsAlways": "Immer nutze",
|
||||
"lockOrientation": "Uusrichtig as Siiteverhältnis bunde",
|
||||
"defaultPlaybackSpeed": "Standardmässigi Widergabegschwindigkeit",
|
||||
"playerStatistics": "Player-Statistike standardmässig aazeige"
|
||||
},
|
||||
"sponsors": {
|
||||
"intermissionIntroAnimation": "Unterbrechig/Iistigsanimation",
|
||||
"sponsor": "Sponsor",
|
||||
"disableToast": "Toast deaktiviere",
|
||||
"disableTimeline": "Segment uf de Ziitleischte deaktiviere",
|
||||
"Catagories": "Kategorie",
|
||||
"unpaidSelfPromotion": "Unbezahlti Werbig/Eigewerbig",
|
||||
"interactionReminder": "Interaktionsufforderig (Abonniere)",
|
||||
"credits": "Abspann",
|
||||
"preViewRecapHook": "Vorschau/Rückblick/Hook",
|
||||
"tangentJokes": "Füllendi Abwiichler/Witz"
|
||||
},
|
||||
"interface": "Benutzeroberflächi",
|
||||
"star": "Sternli uf GitHub vergeh!",
|
||||
"syncParty": "Synchronisationsgruppe",
|
||||
"startSyncParty": "Synchronisationsgruppe starte",
|
||||
"endSyncParty": "Synchronisationsgruppe stoppe",
|
||||
"notifications": "Benachrichtigunge",
|
||||
"noNewNotifications": "Kei neui Benachrichtigunge",
|
||||
"settings": "Iistellige",
|
||||
"login": "Aamelde",
|
||||
"logout": "Abmelde",
|
||||
"customize": "Aapasse",
|
||||
"lowBandwidthMode": "Modus für gringi Bandbreiti",
|
||||
"searchHistory": "Suechverlauf",
|
||||
"theme": {
|
||||
"theme": "Erschiinigsbild",
|
||||
"darkMode": "Dunkle Modus",
|
||||
"lightMode": "Helle Modus",
|
||||
"AmoledTheme": "Amoled-Thema",
|
||||
"color": "Farb"
|
||||
},
|
||||
"searchSuggestions": "Suechvorschläg",
|
||||
"previewVideoOnHover": "Video-Vorschau bim Hovere",
|
||||
"expandChapters": "Kapitel standardmässig uusklappe",
|
||||
"expandComments": "Kommentär standardmässig erwiitere",
|
||||
"allowInsecureRequests": "Unsicheri Aafrage zuelaa",
|
||||
"dataPreferences": {
|
||||
"dataPreferences": "Dateiistellige",
|
||||
"content": "Du möchtsch Abonnements importiere/exportiere, dis Password ändere oder dis Konto lösche? Klick da und scroll bis as Endi vo de Siite."
|
||||
},
|
||||
"bookmarklet": "Lesezeiche",
|
||||
"instanceUrl": "URL vo de Instanz",
|
||||
"deArrow": {
|
||||
"title": "DeArrow",
|
||||
"thumbnailInstanceUrl": "URL vo de Vorschaubilder-Instanz",
|
||||
"titleOnly": "Nur Titel"
|
||||
},
|
||||
"syncPartyWarning": "Bitte denk dra, dass dini IP für die vo dir iigladne Benutzer sichtbar isch.",
|
||||
"displayThumbnailAvatars": "Vorschaubild-Avatar (Langsam)",
|
||||
"expandDescription": "Beschriibig standardmässig erwiitere"
|
||||
},
|
||||
"videos": "Videos",
|
||||
"cancel": "Abbreche",
|
||||
"create": "Erstelle",
|
||||
"title": "Titel",
|
||||
"searchPlaceholder": "Sueche",
|
||||
"delete": "Lösche",
|
||||
"donate": "Spände",
|
||||
"deleteAllHistory": "Gsamte Verlauf lösche",
|
||||
"skipping": "Überspringe",
|
||||
"comments": "Kommentär",
|
||||
"reply": "Antwort",
|
||||
"replies": "Antworte",
|
||||
"region": "Region",
|
||||
"noResult": "Kei Ergebnis",
|
||||
"language": "Spraach",
|
||||
"channels": "Kanäl",
|
||||
"transcript": "Transkript",
|
||||
"noCaptionData": "Untertitel enthalted kei Date.",
|
||||
"selectLang": "Spraach uuswähle",
|
||||
"letterCase": "Gross-/Chliischriibig für Titel",
|
||||
"hideReplies": "Antworte verstecke",
|
||||
"hideVideo": "Video verstecke",
|
||||
"defaultPage": "Standardsiite",
|
||||
"syncParty": {
|
||||
"userJoined": "En Benutzer isch dinere Widergabegruppe biiträte.",
|
||||
"userLeft": "En Benutzer het dini Widergabegruppe verlah.",
|
||||
"userOnPrivatePage": "De Benutzer luegt sich grad e privati Siite a, d Synchronisierig wird grad wieder fortgsetzt."
|
||||
},
|
||||
"videoTabs": {
|
||||
"all": "Alli",
|
||||
"videos": "Videos",
|
||||
"playlists": "Widergabelischte",
|
||||
"channels": "Kanäl",
|
||||
"shorts": "Shorts",
|
||||
"streams": "Streams"
|
||||
},
|
||||
"subscriptions": {
|
||||
"manageSubscriptions": "Abonnements verwalte"
|
||||
},
|
||||
"playlist": {
|
||||
"createPlaylist": "Widergabelischte erstelle",
|
||||
"public": "Öffentlich",
|
||||
"unlisted": "Unglischtet",
|
||||
"private": "Privat",
|
||||
"playVideos": "Videos abspiele",
|
||||
"loopPlaylist": "Widergabelischte inere Schleife abspiele",
|
||||
"shuffleVideos": "Videos in zuefälliger Reihefolg abspiele"
|
||||
},
|
||||
"pages": {
|
||||
"home": "Startsiite",
|
||||
"trending": "Beliebt",
|
||||
"subscriptions": "Abonnements",
|
||||
"history": "Verlauf",
|
||||
"playlists": "Widergabelischte"
|
||||
},
|
||||
"subscribers": "Abonnente",
|
||||
"unsubscribe": "Abo beende",
|
||||
"player": {
|
||||
"audioOnly": "Nur Ton",
|
||||
"theatreMode": "Theatermodus",
|
||||
"pauseTimer": "Timer pausiere",
|
||||
"pauseVideoIn": "Video pausiere i ",
|
||||
"preferredQuality": "Bevorzugti Qualität",
|
||||
"chapters": "Kapitel",
|
||||
"share": {
|
||||
"title": "Teile",
|
||||
"materialiousLink": "Materialious-Link kopiere",
|
||||
"youtubeLink": "YouTube-Link kopiere",
|
||||
"invidiousRedirect": "Invidious-Wiiterleitigslink kopiere"
|
||||
},
|
||||
"download": "Abelade",
|
||||
"downloadSteps": {
|
||||
"merging": "Video und Audio zemmefüehre",
|
||||
"video": "Abelade vom Video",
|
||||
"audio": "Abelade vom Ton",
|
||||
"ffmpeg": "Abelade vo de ffmpeg-Bibliothek und -Komponente",
|
||||
"core": "Abelade vom ffmpeg-Chern",
|
||||
"wasm": "Abelade vom ffmpeg wasm",
|
||||
"worker": "Abelade vom ffmpeg worker",
|
||||
"classWorker": "Abelade vom ffmpeg-Klassearbeiter"
|
||||
},
|
||||
"noPlaylists": "Kei Widergabelischtene",
|
||||
"unableToLoadComments": "Lade vo de Kommentär fehlgschlage",
|
||||
"addToPlaylist": "Zu de Widergabelischte hinzuefüege",
|
||||
"defaultLanguage": "Standardspraach",
|
||||
"youtubeJsLoading": "S Video het nöd chönne glade werde, es wird mit lokalem Video-Fallback nomal versuecht.",
|
||||
"retryText": "S Video het nöd chönne glade werde, wie willsch wiitermache?",
|
||||
"enableYoutubejsPerm": "Lokale Video-Fallback immer erlaube",
|
||||
"enableYoutubejsTemp": "Nutz eimalig de lokali Video-Fallback",
|
||||
"youtubeJsFallBack": "Lokale Video-Fallback wird gnutzt"
|
||||
},
|
||||
"subscribe": "Abonniere",
|
||||
"invidiousLogin": "Bitte meld dich mit dim Invidious-Konto aa",
|
||||
"invalidInstance": "Bitte prüef d URL. Wenn si korrekt isch, isch d Instanz möglicherwiis usser Betriib oder unterstützt kei Clients vo Drittaabüüter.",
|
||||
"loginRequired": "Aameldig erforderlich"
|
||||
}
|
||||
@@ -98,10 +98,10 @@
|
||||
"addToPlaylist": "再生リストに追加",
|
||||
"defaultLanguage": "既定の言語",
|
||||
"retryText": "動画の読み込みに失敗。どう続けますか?",
|
||||
"enableYoutubejsTemp": "一度だけ動画への代替接続で直接接続",
|
||||
"enableYoutubejsPerm": "常に動画への代替接続で直接接続",
|
||||
"youtubeJsFallBack": "動画への代替接続で直接接続を使用",
|
||||
"youtubeJsLoading": "動画の読み込みに失敗。動画への代替接続で直接接続を試みます。"
|
||||
"enableYoutubejsTemp": "一度だけ動画への直接接続に切り替え",
|
||||
"enableYoutubejsPerm": "常に動画への接続エラーで直接接続を許可",
|
||||
"youtubeJsFallBack": "動画接続エラー 直接接続に切替",
|
||||
"youtubeJsLoading": "動画の読み込みに失敗。動画への直接接続に切り替えます。"
|
||||
},
|
||||
"layout": {
|
||||
"interface": "外観",
|
||||
@@ -132,7 +132,7 @@
|
||||
"expandComments": "最初からコメント展開",
|
||||
"allowInsecureRequests": "安全でないリクエストの許可",
|
||||
"dataPreferences": {
|
||||
"content": "登録チャンネルのインポート/エクスポート、パスワード変更、アカウント削除ですか?ここをクリックし、ページの一番下までスクロール。",
|
||||
"content": "登録チャンネルのインポートやエクスポート、パスワード変更、アカウント削除ですか?ここをクリックし、ページの一番下までスクロールしてください。",
|
||||
"dataPreferences": "データ設定"
|
||||
},
|
||||
"player": {
|
||||
@@ -142,19 +142,19 @@
|
||||
"savePlaybackPosition": "再生位置を記憶",
|
||||
"ccByDefault": "最初から字幕表示",
|
||||
"theatreModeByDefault": "最初からシアターモード",
|
||||
"autoPlayNextByDefault": "最初から自動で次の動画",
|
||||
"autoPlayNextByDefault": "最初から「次の動画を自動再生」を有効化",
|
||||
"miniPlayer": "ミニプレイヤー",
|
||||
"proxyVideos": "動画のプロキシ",
|
||||
"backgroundPlay": "バックグラウンドで音声を再生",
|
||||
"dash": "DASH",
|
||||
"listenByDefault": "最初から音声モード",
|
||||
"silenceSkipper": "無音部分を飛ばす (実験的)",
|
||||
"localVideoFallback": "動画への代替接続で直接接続",
|
||||
"localVideoFallback": "動画の接続エラーで直接接続に切替",
|
||||
"youtubeJsFallback": "失敗時に動画の代替処理を使用",
|
||||
"youtubeJsAlways": "常に使用",
|
||||
"lockOrientation": "アスペクト比と向きを固定",
|
||||
"defaultPlaybackSpeed": "既定の再生速度",
|
||||
"playerStatistics": "最初かプレイヤー統計情報を表示"
|
||||
"playerStatistics": "最初からプレイヤー統計情報を表示"
|
||||
},
|
||||
"bookmarklet": "ブックマーク",
|
||||
"instanceUrl": "インスタンスのURL",
|
||||
@@ -175,9 +175,11 @@
|
||||
"thumbnailInstanceUrl": "サムネイル用のインスタンスのURL",
|
||||
"titleOnly": "題名のみ"
|
||||
},
|
||||
"noNewNotifications": "新規の通知なし",
|
||||
"noNewNotifications": "新着通知なし",
|
||||
"customize": "カスタマイズ"
|
||||
},
|
||||
"subscribe": "登録",
|
||||
"invidiousBlockWarning": "Invidious は、現在Googleにブロックされています。このインスタンスで動画が読み込めない場合、{android} 版または {desktop} 版の Materialious でこのインスタンスを使用し、動画取得を直接行う代替接続を使ってください。"
|
||||
"invidiousBlockWarning": "Invidious は、現在Googleにブロックされています。このインスタンスで動画が読み込めない場合、{android} 版または {desktop} 版の Materialious でこのインスタンスを使用し、動画取得を直接行う代替接続を使ってください。",
|
||||
"reply": "返信",
|
||||
"comments": "コメント"
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { androidPoTokenMinter } from '$lib/android/youtube/minter';
|
||||
import type {
|
||||
AdaptiveFormats,
|
||||
Captions,
|
||||
Image,
|
||||
StoryBoard,
|
||||
Thumbnail,
|
||||
@@ -78,6 +77,8 @@ export async function patchYoutubeJs(videoId: string): Promise<VideoPlay> {
|
||||
throw new Error('Unable to pull video info from youtube.js');
|
||||
}
|
||||
|
||||
console.log(video);
|
||||
|
||||
let dashUri: string | undefined;
|
||||
|
||||
if (video.streaming_data) {
|
||||
@@ -98,7 +99,7 @@ export async function patchYoutubeJs(videoId: string): Promise<VideoPlay> {
|
||||
? video.streaming_data.hls_manifest_url // HLS is preferred for DVR streams.
|
||||
: `${video.streaming_data.dash_manifest_url}/mpd_version/7`;
|
||||
} else {
|
||||
dashUri = `data:application/dash+xml;base64,${btoa(await video.toDash({ captions_format: 'vtt' }))}`;
|
||||
dashUri = `data:application/dash+xml;base64,${btoa(await video.toDash({ manifest_options: { captions_format: 'vtt' } }))}`;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -116,20 +117,30 @@ export async function patchYoutubeJs(videoId: string): Promise<VideoPlay> {
|
||||
|
||||
const recommendedVideos: VideoBase[] = [];
|
||||
video.watch_next_feed?.forEach((recommended: Record<string, any>) => {
|
||||
if (!recommended.title) {
|
||||
if (
|
||||
!recommended.metadata.title.text ||
|
||||
recommended.content_type !== 'VIDEO' ||
|
||||
!recommended.metadata.metadata.metadata_rows ||
|
||||
recommended.metadata.metadata.metadata_rows.length < 2
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
recommendedVideos.push({
|
||||
videoThumbnails: (recommended?.thumbnails as Thumbnail[]) || [],
|
||||
videoId: recommended?.id || '',
|
||||
title: recommended?.title?.toString() || '',
|
||||
viewCountText: recommended.view_count
|
||||
? numberWithCommas(Number(recommended?.view_count.toString().replace(/\D/g, ''))) || ''
|
||||
videoThumbnails: (recommended?.content_image?.image as Thumbnail[]) || [],
|
||||
videoId: recommended?.content_id || '',
|
||||
title: recommended.metadata.title?.text || '',
|
||||
viewCountText: recommended.metadata.metadata.metadata_rows[1]?.metadata_parts[0]
|
||||
? recommended.metadata.metadata.metadata_rows[1]?.metadata_parts[0]?.text.text?.replace(
|
||||
'views',
|
||||
''
|
||||
)
|
||||
: '',
|
||||
lengthSeconds: recommended?.duration?.seconds || 0,
|
||||
author: recommended?.author?.name || '',
|
||||
authorId: recommended?.author?.id || ''
|
||||
author: recommended.metadata.metadata.metadata_rows[0]?.metadata_parts[0]?.text.text || '',
|
||||
authorId:
|
||||
recommended.metadata?.image?.renderer_context?.command_context?.on_tap.payload?.browseId ||
|
||||
''
|
||||
});
|
||||
});
|
||||
|
||||
@@ -202,7 +213,7 @@ export async function patchYoutubeJs(videoId: string): Promise<VideoPlay> {
|
||||
videoThumbnails: video.basic_info.thumbnail as Thumbnail[],
|
||||
author: video.basic_info.author || 'Unknown',
|
||||
lengthSeconds: video.basic_info.duration || 0,
|
||||
subCountText: '',
|
||||
subCountText: video.secondary_info.owner?.subscriber_count.text || '',
|
||||
keywords: video.basic_info.keywords || [],
|
||||
allowedRegions: [],
|
||||
ytjs: {
|
||||
|
||||
@@ -92,6 +92,7 @@ export const interfaceDisplayThumbnailAvatars = persisted('disableThumbnailAvata
|
||||
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(
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@ import os
|
||||
import re
|
||||
from datetime import datetime
|
||||
|
||||
LATEST_VERSION = "1.9.20"
|
||||
LATEST_VERSION = "1.9.21"
|
||||
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